From c944a802a5a5eb565f2e168d5e844ed66cc54580 Mon Sep 17 00:00:00 2001 From: Franck Royer Date: Fri, 2 Jul 2021 14:30:44 +1000 Subject: [PATCH 1/4] Upgrade nim-waku submodule to v0.5 --- nim-waku | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nim-waku b/nim-waku index 5c58a19f4f..e2c0141edc 160000 --- a/nim-waku +++ b/nim-waku @@ -1 +1 @@ -Subproject commit 5c58a19f4f50e207dcfbf34f4514cc7e88c709e5 +Subproject commit e2c0141edc40002960303d95af79b30e6fdbffa4 From 6817a2f6b2b91c77d9c5bab111ccea00a1033967 Mon Sep 17 00:00:00 2001 From: Franck Royer Date: Tue, 20 Jul 2021 13:55:01 +1000 Subject: [PATCH 2/4] Pass timestamp to RPC call --- src/test_utils/nim_waku.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test_utils/nim_waku.ts b/src/test_utils/nim_waku.ts index 8a9acc0745..c6b78c2997 100644 --- a/src/test_utils/nim_waku.ts +++ b/src/test_utils/nim_waku.ts @@ -63,6 +63,7 @@ export interface KeyPair { export interface WakuRelayMessage { payload: string; contentTopic?: string; + timestamp?: number; // Float in seconds } export class NimWaku { @@ -177,10 +178,15 @@ export class NimWaku { if (!message.payload) { throw 'Attempting to send empty message'; } + let timestamp; + if (message.timestamp) { + timestamp = message.timestamp.valueOf() / 1000; + } const rpcMessage = { payload: bufToHex(message.payload), contentTopic: message.contentTopic, + timestamp, }; return this.rpcCall('post_waku_v2_relay_v1_message', [ From 5f7eee394ba4171fed83baf55a1e3053972bb4b5 Mon Sep 17 00:00:00 2001 From: Franck Royer Date: Thu, 22 Jul 2021 10:59:45 +1000 Subject: [PATCH 3/4] Store Response Protobuf change to align with nim-waku status-im/nim-waku#676 --- CHANGELOG.md | 4 ++ proto/waku/v2/store.proto | 10 ++++- src/lib/waku_store/index.ts | 9 ++++ src/proto/waku/v2/store.ts | 85 ++++++++++++++++++++++++++++++++++--- 4 files changed, 100 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d72a9b387e..5992e3ad57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed +- **Breaking**: Store Response Protobuf change to align with nim-waku v0.5 + ([nim-waku#676](https://github.com/status-im/nim-waku/pull/676)). + ## [0.8.1] - 2021-07-16 ### Added diff --git a/proto/waku/v2/store.proto b/proto/waku/v2/store.proto index 7d9db6b8f8..431a38b920 100644 --- a/proto/waku/v2/store.proto +++ b/proto/waku/v2/store.proto @@ -7,6 +7,7 @@ import "waku/v2/message.proto"; message Index { bytes digest = 1; double received_time = 2; + double sender_time = 3; } message PagingInfo { @@ -32,8 +33,13 @@ message HistoryQuery { } message HistoryResponse { - repeated WakuMessage messages = 1; - PagingInfo paging_info = 2; + repeated WakuMessage messages = 2; + PagingInfo paging_info = 3; + enum Error { + ERROR_NONE_UNSPECIFIED = 0; + ERROR_INVALID_CURSOR = 1; + } + Error error = 4; } message HistoryRPC { diff --git a/src/lib/waku_store/index.ts b/src/lib/waku_store/index.ts index 83a3966f5c..4ed2771e4d 100644 --- a/src/lib/waku_store/index.ts +++ b/src/lib/waku_store/index.ts @@ -6,6 +6,7 @@ import Libp2p from 'libp2p'; import { Peer } from 'libp2p/src/peer-store'; import PeerId from 'peer-id'; +import { HistoryResponse_Error } from '../../proto/waku/v2/store'; import { getPeersForProtocol, selectRandomPeer } from '../select_peer'; import { WakuMessage } from '../waku_message'; import { DefaultPubsubTopic } from '../waku_relay'; @@ -117,6 +118,14 @@ export class WakuStore { return null; } + if ( + response.error && + response.error === HistoryResponse_Error.ERROR_INVALID_CURSOR + ) { + console.log('Error in response: INVALID CURSOR'); + return null; + } + if (!response.messages || !response.messages.length) { // No messages left (or stored) console.log('No messages present in HistoryRPC response'); diff --git a/src/proto/waku/v2/store.ts b/src/proto/waku/v2/store.ts index 6a40af498e..5be71d8d29 100644 --- a/src/proto/waku/v2/store.ts +++ b/src/proto/waku/v2/store.ts @@ -8,6 +8,7 @@ export const protobufPackage = 'waku.v2'; export interface Index { digest: Uint8Array; receivedTime: number; + senderTime: number; } export interface PagingInfo { @@ -67,6 +68,43 @@ export interface HistoryQuery { export interface HistoryResponse { messages: WakuMessage[]; pagingInfo: PagingInfo | undefined; + error: HistoryResponse_Error; +} + +export enum HistoryResponse_Error { + ERROR_NONE_UNSPECIFIED = 0, + ERROR_INVALID_CURSOR = 1, + UNRECOGNIZED = -1, +} + +export function historyResponse_ErrorFromJSON( + object: any +): HistoryResponse_Error { + switch (object) { + case 0: + case 'ERROR_NONE_UNSPECIFIED': + return HistoryResponse_Error.ERROR_NONE_UNSPECIFIED; + case 1: + case 'ERROR_INVALID_CURSOR': + return HistoryResponse_Error.ERROR_INVALID_CURSOR; + case -1: + case 'UNRECOGNIZED': + default: + return HistoryResponse_Error.UNRECOGNIZED; + } +} + +export function historyResponse_ErrorToJSON( + object: HistoryResponse_Error +): string { + switch (object) { + case HistoryResponse_Error.ERROR_NONE_UNSPECIFIED: + return 'ERROR_NONE_UNSPECIFIED'; + case HistoryResponse_Error.ERROR_INVALID_CURSOR: + return 'ERROR_INVALID_CURSOR'; + default: + return 'UNKNOWN'; + } } export interface HistoryRPC { @@ -75,7 +113,7 @@ export interface HistoryRPC { response: HistoryResponse | undefined; } -const baseIndex: object = { receivedTime: 0 }; +const baseIndex: object = { receivedTime: 0, senderTime: 0 }; export const Index = { encode(message: Index, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { @@ -85,6 +123,9 @@ export const Index = { if (message.receivedTime !== 0) { writer.uint32(17).double(message.receivedTime); } + if (message.senderTime !== 0) { + writer.uint32(25).double(message.senderTime); + } return writer; }, @@ -102,6 +143,9 @@ export const Index = { case 2: message.receivedTime = reader.double(); break; + case 3: + message.senderTime = reader.double(); + break; default: reader.skipType(tag & 7); break; @@ -121,6 +165,11 @@ export const Index = { } else { message.receivedTime = 0; } + if (object.senderTime !== undefined && object.senderTime !== null) { + message.senderTime = Number(object.senderTime); + } else { + message.senderTime = 0; + } return message; }, @@ -132,6 +181,7 @@ export const Index = { )); message.receivedTime !== undefined && (obj.receivedTime = message.receivedTime); + message.senderTime !== undefined && (obj.senderTime = message.senderTime); return obj; }, @@ -147,6 +197,11 @@ export const Index = { } else { message.receivedTime = 0; } + if (object.senderTime !== undefined && object.senderTime !== null) { + message.senderTime = object.senderTime; + } else { + message.senderTime = 0; + } return message; }, }; @@ -445,7 +500,7 @@ export const HistoryQuery = { }, }; -const baseHistoryResponse: object = {}; +const baseHistoryResponse: object = { error: 0 }; export const HistoryResponse = { encode( @@ -453,10 +508,13 @@ export const HistoryResponse = { writer: _m0.Writer = _m0.Writer.create() ): _m0.Writer { for (const v of message.messages) { - WakuMessage.encode(v!, writer.uint32(10).fork()).ldelim(); + WakuMessage.encode(v!, writer.uint32(18).fork()).ldelim(); } if (message.pagingInfo !== undefined) { - PagingInfo.encode(message.pagingInfo, writer.uint32(18).fork()).ldelim(); + PagingInfo.encode(message.pagingInfo, writer.uint32(26).fork()).ldelim(); + } + if (message.error !== 0) { + writer.uint32(32).int32(message.error); } return writer; }, @@ -469,12 +527,15 @@ export const HistoryResponse = { while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: + case 2: message.messages.push(WakuMessage.decode(reader, reader.uint32())); break; - case 2: + case 3: message.pagingInfo = PagingInfo.decode(reader, reader.uint32()); break; + case 4: + message.error = reader.int32() as any; + break; default: reader.skipType(tag & 7); break; @@ -496,6 +557,11 @@ export const HistoryResponse = { } else { message.pagingInfo = undefined; } + if (object.error !== undefined && object.error !== null) { + message.error = historyResponse_ErrorFromJSON(object.error); + } else { + message.error = 0; + } return message; }, @@ -512,6 +578,8 @@ export const HistoryResponse = { (obj.pagingInfo = message.pagingInfo ? PagingInfo.toJSON(message.pagingInfo) : undefined); + message.error !== undefined && + (obj.error = historyResponse_ErrorToJSON(message.error)); return obj; }, @@ -528,6 +596,11 @@ export const HistoryResponse = { } else { message.pagingInfo = undefined; } + if (object.error !== undefined && object.error !== null) { + message.error = object.error; + } else { + message.error = 0; + } return message; }, }; From c4d0501c6aadb79a66db572ed6b242a128e69566 Mon Sep 17 00:00:00 2001 From: Franck Royer Date: Mon, 26 Jul 2021 11:04:34 +1000 Subject: [PATCH 4/4] nim-waku v0.5 uses new waku relay protocol id --- src/lib/waku.spec.ts | 2 +- src/lib/waku_relay/index.spec.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/waku.spec.ts b/src/lib/waku.spec.ts index fd6d15fe9a..baab135a78 100644 --- a/src/lib/waku.spec.ts +++ b/src/lib/waku.spec.ts @@ -29,7 +29,7 @@ describe('Waku Dial', function () { expect(nimPeers).to.deep.equal([ { multiaddr: multiAddrWithId, - protocol: '/vac/waku/relay/2.0.0-beta2', + protocol: '/vac/waku/relay/2.0.0', connected: true, }, ]); diff --git a/src/lib/waku_relay/index.spec.ts b/src/lib/waku_relay/index.spec.ts index 078d644a47..d9c0c9eb15 100644 --- a/src/lib/waku_relay/index.spec.ts +++ b/src/lib/waku_relay/index.spec.ts @@ -72,7 +72,7 @@ describe('Waku Relay', () => { it('Register correct protocols', async function () { const protocols = Array.from(waku1.libp2p.upgrader.protocols.keys()); - expect(protocols).to.contain('/vac/waku/relay/2.0.0-beta2'); + expect(protocols).to.contain('/vac/waku/relay/2.0.0'); expect(protocols.findIndex((value) => value.match(/sub/))).to.eq(-1); });