@dxos/messaging 0.6.8-main.3be982f → 0.6.8-staging.77f93a3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/index.mjs +466 -199
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +456 -197
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/types/src/messenger.blueprint-test.d.ts +4 -0
- package/dist/types/src/messenger.blueprint-test.d.ts.map +1 -0
- package/dist/types/src/messenger.d.ts +4 -10
- package/dist/types/src/messenger.d.ts.map +1 -1
- package/dist/types/src/signal-client/signal-client.d.ts +6 -10
- package/dist/types/src/signal-client/signal-client.d.ts.map +1 -1
- package/dist/types/src/signal-client/signal-local-state.d.ts +2 -10
- package/dist/types/src/signal-client/signal-local-state.d.ts.map +1 -1
- package/dist/types/src/signal-manager/edge-signal-manager.d.ts +18 -19
- package/dist/types/src/signal-manager/edge-signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-manager/index.d.ts +1 -0
- package/dist/types/src/signal-manager/index.d.ts.map +1 -1
- package/dist/types/src/signal-manager/memory-signal-manager.d.ts +14 -25
- package/dist/types/src/signal-manager/memory-signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-manager/signal-manager.d.ts +5 -6
- package/dist/types/src/signal-manager/signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-manager/websocket-signal-manager.d.ts +14 -29
- package/dist/types/src/signal-manager/websocket-signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-methods.d.ts +29 -14
- package/dist/types/src/signal-methods.d.ts.map +1 -1
- package/dist/types/src/testing/index.d.ts +5 -0
- package/dist/types/src/testing/index.d.ts.map +1 -0
- package/dist/types/src/testing/test-builder.d.ts +19 -0
- package/dist/types/src/testing/test-builder.d.ts.map +1 -0
- package/dist/types/src/testing/test-messages.d.ts +6 -0
- package/dist/types/src/testing/test-messages.d.ts.map +1 -0
- package/dist/types/src/testing/test-peer.d.ts +23 -0
- package/dist/types/src/testing/test-peer.d.ts.map +1 -0
- package/dist/types/src/testing/utils.d.ts +10 -0
- package/dist/types/src/testing/utils.d.ts.map +1 -0
- package/package.json +15 -14
- package/src/messenger.blueprint-test.ts +346 -0
- package/src/messenger.test.ts +26 -362
- package/src/messenger.ts +20 -18
- package/src/signal-client/signal-client-monitor.ts +3 -3
- package/src/signal-client/signal-client.test.ts +56 -52
- package/src/signal-client/signal-client.ts +30 -16
- package/src/signal-client/signal-local-state.ts +28 -10
- package/src/signal-manager/edge-signal-manager.test.ts +31 -35
- package/src/signal-manager/edge-signal-manager.ts +88 -36
- package/src/signal-manager/index.ts +1 -0
- package/src/signal-manager/memory-signal-manager.ts +36 -50
- package/src/signal-manager/signal-manager.ts +5 -7
- package/src/signal-manager/websocket-signal-manager.test.ts +27 -31
- package/src/signal-manager/websocket-signal-manager.ts +34 -65
- package/src/signal-methods.ts +33 -11
- package/src/testing/index.ts +8 -0
- package/src/testing/test-builder.ts +54 -0
- package/src/testing/test-messages.ts +24 -0
- package/src/testing/test-peer.ts +66 -0
- package/src/testing/utils.ts +50 -0
- package/dist/types/src/testing.d.ts +0 -40
- package/dist/types/src/testing.d.ts.map +0 -1
- package/src/testing.ts +0 -120
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signal-methods.d.ts","sourceRoot":"","sources":["../../../src/signal-methods.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"signal-methods.d.ts","sourceRoot":"","sources":["../../../src/signal-methods.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,4CAA4C,CAAC;AACvE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAE1E,MAAM,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;AACvE,eAAO,MAAM,YAAY,gBAAiB,QAAQ,WAAY,CAAC;AAE/D,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,QAAQ,CAAC;IACjB,SAAS,EAAE,QAAQ,CAAC;IACpB,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,UAAU,CAAC;KACnB,CAAC;CACH;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,IAAI,CAAC;IACxB,eAAe,EAAE,IAAI,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,SAAS,CAAC;IAEjB;;OAEG;IACH,aAAa,CAAC,EAAE;QACd,IAAI,EAAE,QAAQ,CAAC;QACf,KAAK,EAAE,IAAI,CAAC;KACb,CAAC;IAEF;;OAEG;IACH,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,QAAQ,CAAC;KAChB,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAE9B;;OAEG;IACH,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAE1B;;OAEG;IACH,IAAI,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtE;;OAEG;IACH,KAAK,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvE;;OAEG;IACH,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjD;;OAEG;IAEH,iBAAiB,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAErD;;OAEG;IACH,mBAAmB,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,aAAa,EAAE,QAAQ,CAAC,SAAS,CAAC;IAC7E,SAAS,IAAI,YAAY,CAAC;CAC3B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/testing/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type PublicKey } from '@dxos/keys';
|
|
2
|
+
import { TestPeer } from './test-peer';
|
|
3
|
+
import { type SignalManager, MemorySignalManager } from '../signal-manager';
|
|
4
|
+
import { type Message } from '../signal-methods';
|
|
5
|
+
export type TestBuilderOptions = {
|
|
6
|
+
signalManagerFactory?: (identityKey: PublicKey, deviceKey: PublicKey) => Promise<SignalManager>;
|
|
7
|
+
messageDisruption?: (msg: Message) => Message[];
|
|
8
|
+
};
|
|
9
|
+
export declare class TestBuilder {
|
|
10
|
+
options: TestBuilderOptions;
|
|
11
|
+
private _signalContext;
|
|
12
|
+
private readonly _peers;
|
|
13
|
+
constructor(options: TestBuilderOptions);
|
|
14
|
+
createSignalManager(identityKey: PublicKey, deviceKey: PublicKey): Promise<SignalManager | MemorySignalManager>;
|
|
15
|
+
createPeer(): Promise<TestPeer>;
|
|
16
|
+
createPeers(count: number): Promise<TestPeer[]>;
|
|
17
|
+
close(): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=test-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-builder.d.ts","sourceRoot":"","sources":["../../../../src/testing/test-builder.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,KAAK,aAAa,EAAE,mBAAmB,EAA8B,MAAM,mBAAmB,CAAC;AACxG,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,oBAAoB,CAAC,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IAChG,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,EAAE,CAAC;CACjD,CAAC;AAEF,qBAAa,WAAW;IAIH,OAAO,EAAE,kBAAkB;IAH9C,OAAO,CAAC,cAAc,CAAoC;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;gBAEtB,OAAO,EAAE,kBAAkB;IAExC,mBAAmB,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;IAkBhE,UAAU,IAAI,OAAO,CAAC,QAAQ,CAAC;IAO/B,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAI/C,KAAK;CAGZ"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type TaggedType } from '@dxos/codec-protobuf';
|
|
2
|
+
import { type TYPES } from '@dxos/protocols';
|
|
3
|
+
export declare const PAYLOAD_1: TaggedType<TYPES, 'google.protobuf.Any'>;
|
|
4
|
+
export declare const PAYLOAD_2: TaggedType<TYPES, 'google.protobuf.Any'>;
|
|
5
|
+
export declare const PAYLOAD_3: TaggedType<TYPES, 'google.protobuf.Any'>;
|
|
6
|
+
//# sourceMappingURL=test-messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-messages.d.ts","sourceRoot":"","sources":["../../../../src/testing/test-messages.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,eAAO,MAAM,SAAS,EAAE,UAAU,CAAC,KAAK,EAAE,qBAAqB,CAI9D,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,UAAU,CAAC,KAAK,EAAE,qBAAqB,CAI9D,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,UAAU,CAAC,KAAK,EAAE,qBAAqB,CAI9D,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Event } from '@dxos/async';
|
|
2
|
+
import { Resource } from '@dxos/context';
|
|
3
|
+
import { PublicKey } from '@dxos/keys';
|
|
4
|
+
import { type TestBuilder } from './test-builder';
|
|
5
|
+
import { Messenger } from '../messenger';
|
|
6
|
+
import { type SignalManager } from '../signal-manager';
|
|
7
|
+
import { type Message, type PeerInfo } from '../signal-methods';
|
|
8
|
+
export declare class TestPeer extends Resource {
|
|
9
|
+
private readonly testBuilder;
|
|
10
|
+
peerId: PublicKey;
|
|
11
|
+
identityKey: PublicKey;
|
|
12
|
+
signalManager: SignalManager;
|
|
13
|
+
messenger: Messenger;
|
|
14
|
+
defaultReceived: Event<Message>;
|
|
15
|
+
constructor(testBuilder: TestBuilder);
|
|
16
|
+
get peerInfo(): PeerInfo;
|
|
17
|
+
waitTillReceive(message: Message): Promise<Message>;
|
|
18
|
+
waitForPeerAvailable(topic: PublicKey, peer: PeerInfo): Promise<import("../signal-methods").SwarmEvent>;
|
|
19
|
+
waitForPeerLeft(topic: PublicKey, peer: PeerInfo): Promise<import("../signal-methods").SwarmEvent>;
|
|
20
|
+
protected _open(): Promise<void>;
|
|
21
|
+
protected _close(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=test-peer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-peer.d.ts","sourceRoot":"","sources":["../../../../src/testing/test-peer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEhE,qBAAa,QAAS,SAAQ,QAAQ;IAOxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IANjC,MAAM,YAAsB;IAC5B,WAAW,YAAsB;IACjC,aAAa,EAAG,aAAa,CAAC;IAC9B,SAAS,EAAG,SAAS,CAAC;IACtB,eAAe,iBAAwB;gBAEjB,WAAW,EAAE,WAAW;IAIrD,IAAI,QAAQ,IAAI,QAAQ,CAKvB;IAEK,eAAe,CAAC,OAAO,EAAE,OAAO;IAIhC,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ;IAIrD,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ;cAI7B,KAAK;cAgBL,MAAM;CAIhC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Event } from '@dxos/async';
|
|
2
|
+
import { type Any } from '@dxos/codec-protobuf';
|
|
3
|
+
import { PublicKey } from '@dxos/keys';
|
|
4
|
+
import { type SignalMethods, type Message, type PeerInfo } from '../signal-methods';
|
|
5
|
+
export declare const expectPeerAvailable: (client: SignalMethods, expectedTopic: PublicKey, peer: PeerInfo) => Promise<import("../signal-methods").SwarmEvent>;
|
|
6
|
+
export declare const expectPeerLeft: (client: SignalMethods, expectedTopic: PublicKey, peer: PeerInfo) => Promise<import("../signal-methods").SwarmEvent>;
|
|
7
|
+
export declare const expectReceivedMessage: (event: Event<Message>, expectedMessage: Message) => Promise<Message>;
|
|
8
|
+
export declare const createMessage: (author: PeerInfo, recipient: PeerInfo, payload?: Any) => Message;
|
|
9
|
+
export declare const messageEqual: (msg1: Message, msg2: Message) => boolean;
|
|
10
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/testing/utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEpF,eAAO,MAAM,mBAAmB,WAAY,aAAa,iBAAiB,SAAS,QAAQ,QAAQ,oDAOhG,CAAC;AAEJ,eAAO,MAAM,cAAc,WAAY,aAAa,iBAAiB,SAAS,QAAQ,QAAQ,oDAM3F,CAAC;AAEJ,eAAO,MAAM,qBAAqB,UAAW,KAAK,CAAC,OAAO,CAAC,mBAAmB,OAAO,qBAUpF,CAAC;AAEF,eAAO,MAAM,aAAa,WAAY,QAAQ,aAAa,QAAQ,YAAW,GAAG,KAAe,OAI9F,CAAC;AAEH,eAAO,MAAM,YAAY,SAAU,OAAO,QAAQ,OAAO,YAGM,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/messaging",
|
|
3
|
-
"version": "0.6.8-
|
|
3
|
+
"version": "0.6.8-staging.77f93a3",
|
|
4
4
|
"description": "Messaging",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -25,27 +25,28 @@
|
|
|
25
25
|
"README.md"
|
|
26
26
|
],
|
|
27
27
|
"dependencies": {
|
|
28
|
+
"@bufbuild/protobuf": "^2.0.0",
|
|
28
29
|
"isomorphic-ws": "^5.0.0",
|
|
29
30
|
"ws": "^8.14.2",
|
|
30
|
-
"@dxos/
|
|
31
|
-
"@dxos/
|
|
32
|
-
"@dxos/
|
|
33
|
-
"@dxos/
|
|
34
|
-
"@dxos/
|
|
35
|
-
"@dxos/
|
|
36
|
-
"@dxos/
|
|
37
|
-
"@dxos/
|
|
38
|
-
"@dxos/protocols": "0.6.8-
|
|
39
|
-
"@dxos/rpc": "0.6.8-
|
|
40
|
-
"@dxos/
|
|
41
|
-
"@dxos/
|
|
31
|
+
"@dxos/codec-protobuf": "0.6.8-staging.77f93a3",
|
|
32
|
+
"@dxos/context": "0.6.8-staging.77f93a3",
|
|
33
|
+
"@dxos/edge-client": "0.6.8-staging.77f93a3",
|
|
34
|
+
"@dxos/invariant": "0.6.8-staging.77f93a3",
|
|
35
|
+
"@dxos/keys": "0.6.8-staging.77f93a3",
|
|
36
|
+
"@dxos/log": "0.6.8-staging.77f93a3",
|
|
37
|
+
"@dxos/node-std": "0.6.8-staging.77f93a3",
|
|
38
|
+
"@dxos/async": "0.6.8-staging.77f93a3",
|
|
39
|
+
"@dxos/protocols": "0.6.8-staging.77f93a3",
|
|
40
|
+
"@dxos/rpc": "0.6.8-staging.77f93a3",
|
|
41
|
+
"@dxos/tracing": "0.6.8-staging.77f93a3",
|
|
42
|
+
"@dxos/util": "0.6.8-staging.77f93a3"
|
|
42
43
|
},
|
|
43
44
|
"devDependencies": {
|
|
44
45
|
"@types/node": "^18.11.9",
|
|
45
46
|
"earljs": "~0.1.10",
|
|
46
47
|
"typescript": "^5.5.4",
|
|
47
48
|
"wait-for-expect": "^3.0.2",
|
|
48
|
-
"@dxos/signal": "0.6.8-
|
|
49
|
+
"@dxos/signal": "0.6.8-staging.77f93a3"
|
|
49
50
|
},
|
|
50
51
|
"publishConfig": {
|
|
51
52
|
"access": "public"
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { expect } from 'earljs';
|
|
6
|
+
|
|
7
|
+
import { asyncTimeout, latch, sleep } from '@dxos/async';
|
|
8
|
+
import { type PublicKey } from '@dxos/keys';
|
|
9
|
+
import { describe, test, afterTest } from '@dxos/test';
|
|
10
|
+
import { range } from '@dxos/util';
|
|
11
|
+
|
|
12
|
+
import { type SignalManager, WebsocketSignalManager } from './signal-manager';
|
|
13
|
+
import { type Message } from './signal-methods';
|
|
14
|
+
import { messageEqual, PAYLOAD_1, PAYLOAD_2, PAYLOAD_3, TestBuilder } from './testing';
|
|
15
|
+
|
|
16
|
+
export const messengerTests = (
|
|
17
|
+
signalManagerFactory: (identityKey: PublicKey, deviceKey: PublicKey) => Promise<SignalManager>,
|
|
18
|
+
) => {
|
|
19
|
+
test('Message between peers', async () => {
|
|
20
|
+
const builder = new TestBuilder({
|
|
21
|
+
signalManagerFactory,
|
|
22
|
+
});
|
|
23
|
+
afterTest(() => builder.close());
|
|
24
|
+
const peer1 = await builder.createPeer();
|
|
25
|
+
const peer2 = await builder.createPeer();
|
|
26
|
+
|
|
27
|
+
const message: Message = {
|
|
28
|
+
author: peer1.peerInfo,
|
|
29
|
+
recipient: peer2.peerInfo,
|
|
30
|
+
payload: PAYLOAD_1,
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
await sleep(1000);
|
|
34
|
+
|
|
35
|
+
const promise = peer2.waitTillReceive(message);
|
|
36
|
+
|
|
37
|
+
await peer1.messenger.sendMessage(message);
|
|
38
|
+
|
|
39
|
+
await promise;
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test('Message 3 peers', async () => {
|
|
43
|
+
const builder = new TestBuilder({
|
|
44
|
+
signalManagerFactory,
|
|
45
|
+
});
|
|
46
|
+
afterTest(() => builder.close());
|
|
47
|
+
const peer1 = await builder.createPeer();
|
|
48
|
+
const peer2 = await builder.createPeer();
|
|
49
|
+
const peer3 = await builder.createPeer();
|
|
50
|
+
|
|
51
|
+
{
|
|
52
|
+
const message: Message = {
|
|
53
|
+
author: peer1.peerInfo,
|
|
54
|
+
recipient: peer2.peerInfo,
|
|
55
|
+
payload: PAYLOAD_1,
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const promise = peer2.waitTillReceive(message);
|
|
59
|
+
await peer1.messenger.sendMessage(message);
|
|
60
|
+
await asyncTimeout(promise, 1_000);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
{
|
|
64
|
+
const message: Message = {
|
|
65
|
+
author: peer1.peerInfo,
|
|
66
|
+
recipient: peer3.peerInfo,
|
|
67
|
+
payload: PAYLOAD_2,
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const promise = peer3.waitTillReceive(message);
|
|
71
|
+
await peer1.messenger.sendMessage(message);
|
|
72
|
+
await asyncTimeout(promise, 1_000);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
{
|
|
76
|
+
const message: Message = {
|
|
77
|
+
author: peer2.peerInfo,
|
|
78
|
+
recipient: peer1.peerInfo,
|
|
79
|
+
payload: PAYLOAD_3,
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const promise = peer1.waitTillReceive(message);
|
|
83
|
+
await peer2.messenger.sendMessage(message);
|
|
84
|
+
await asyncTimeout(promise, 1_000);
|
|
85
|
+
}
|
|
86
|
+
}).timeout(1_000);
|
|
87
|
+
|
|
88
|
+
test('Message routing', async () => {
|
|
89
|
+
const builder = new TestBuilder({
|
|
90
|
+
signalManagerFactory,
|
|
91
|
+
});
|
|
92
|
+
afterTest(() => builder.close());
|
|
93
|
+
const peer1 = await builder.createPeer();
|
|
94
|
+
const peer2 = await builder.createPeer();
|
|
95
|
+
|
|
96
|
+
// Subscribe first listener for second messenger.
|
|
97
|
+
const onMessage1: Message[] = [];
|
|
98
|
+
await peer2.messenger.listen({
|
|
99
|
+
peer: peer2.peerInfo,
|
|
100
|
+
payloadType: PAYLOAD_1.type_url,
|
|
101
|
+
onMessage: async (message) => {
|
|
102
|
+
onMessage1.push(message);
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// Subscribe first listener for second messenger.
|
|
107
|
+
const onMessage2: Message[] = [];
|
|
108
|
+
await peer2.messenger.listen({
|
|
109
|
+
peer: peer2.peerInfo,
|
|
110
|
+
payloadType: PAYLOAD_1.type_url,
|
|
111
|
+
onMessage: async (message) => {
|
|
112
|
+
onMessage2.push(message);
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
// Subscribe third listener for second messenger.
|
|
117
|
+
const onMessage3: Message[] = [];
|
|
118
|
+
await peer2.messenger.listen({
|
|
119
|
+
peer: peer2.peerInfo,
|
|
120
|
+
payloadType: PAYLOAD_2.type_url,
|
|
121
|
+
onMessage: async (message) => {
|
|
122
|
+
onMessage3.push(message);
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
// Message from the 1st peer to the 2nd peer with payload type "2".
|
|
127
|
+
{
|
|
128
|
+
const message: Message = {
|
|
129
|
+
author: peer1.peerInfo,
|
|
130
|
+
recipient: peer2.peerInfo,
|
|
131
|
+
payload: PAYLOAD_1,
|
|
132
|
+
};
|
|
133
|
+
const promise = peer2.waitTillReceive(message);
|
|
134
|
+
|
|
135
|
+
await peer1.messenger.sendMessage(message);
|
|
136
|
+
|
|
137
|
+
// 3 listeners (default one that was returned by setupPeer() and 2 that listen for type "1") should receive message.
|
|
138
|
+
await asyncTimeout(promise, 1_000);
|
|
139
|
+
expect(messageEqual(message, onMessage1[0])).toEqual(true);
|
|
140
|
+
expect(messageEqual(message, onMessage2[0])).toEqual(true);
|
|
141
|
+
expect(onMessage3.length === 0);
|
|
142
|
+
}
|
|
143
|
+
}).timeout(4_000);
|
|
144
|
+
|
|
145
|
+
test('Unsubscribe listener', async () => {
|
|
146
|
+
const builder = new TestBuilder({
|
|
147
|
+
signalManagerFactory,
|
|
148
|
+
});
|
|
149
|
+
afterTest(() => builder.close());
|
|
150
|
+
const peer1 = await builder.createPeer();
|
|
151
|
+
const peer2 = await builder.createPeer();
|
|
152
|
+
|
|
153
|
+
// Subscribe first listener for second messenger.
|
|
154
|
+
const messages1: Message[] = [];
|
|
155
|
+
await peer2.messenger.listen({
|
|
156
|
+
peer: peer2.peerInfo,
|
|
157
|
+
payloadType: PAYLOAD_1.type_url,
|
|
158
|
+
onMessage: async (message) => {
|
|
159
|
+
messages1.push(message);
|
|
160
|
+
},
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
// Subscribe first listener for second messenger.
|
|
164
|
+
const messages2: Message[] = [];
|
|
165
|
+
const listenerHandle2 = await peer2.messenger.listen({
|
|
166
|
+
peer: peer2.peerInfo,
|
|
167
|
+
payloadType: PAYLOAD_1.type_url,
|
|
168
|
+
onMessage: async (message) => {
|
|
169
|
+
messages2.push(message);
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
// Message from the 1st peer to the 2nd peer with payload type "1".
|
|
174
|
+
{
|
|
175
|
+
const message: Message = {
|
|
176
|
+
author: peer1.peerInfo,
|
|
177
|
+
recipient: peer2.peerInfo,
|
|
178
|
+
payload: PAYLOAD_1,
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
const receivePromise = peer2.waitTillReceive(message);
|
|
182
|
+
await peer1.messenger.sendMessage(message);
|
|
183
|
+
|
|
184
|
+
// 2 subscribed listeners should receive message.
|
|
185
|
+
await asyncTimeout(receivePromise, 1_000);
|
|
186
|
+
expect(messages1[0]).toEqual(message);
|
|
187
|
+
expect(messages2[0]).toEqual(message);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Unsubscribe second listener.
|
|
191
|
+
await listenerHandle2.unsubscribe();
|
|
192
|
+
|
|
193
|
+
// Message from the 1st peer to the 2nd peer with payload type "1".
|
|
194
|
+
{
|
|
195
|
+
const message: Message = {
|
|
196
|
+
author: peer1.peerInfo,
|
|
197
|
+
recipient: peer2.peerInfo,
|
|
198
|
+
payload: PAYLOAD_1,
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
const receivePromise = peer2.waitTillReceive(message);
|
|
202
|
+
await peer1.messenger.sendMessage(message);
|
|
203
|
+
|
|
204
|
+
// 1 listener that was not unsubscribed should receive message.
|
|
205
|
+
await asyncTimeout(receivePromise, 1_000);
|
|
206
|
+
expect(messages1[1]).toEqual(message);
|
|
207
|
+
expect(messages1.length).toEqual(2);
|
|
208
|
+
expect(messages2.length).toEqual(1);
|
|
209
|
+
}
|
|
210
|
+
})
|
|
211
|
+
.tag('flaky')
|
|
212
|
+
.timeout(1_000);
|
|
213
|
+
|
|
214
|
+
test('re-entrant message', async () => {
|
|
215
|
+
const builder = new TestBuilder({
|
|
216
|
+
signalManagerFactory,
|
|
217
|
+
});
|
|
218
|
+
afterTest(() => builder.close());
|
|
219
|
+
const peer1 = await builder.createPeer();
|
|
220
|
+
const peer2 = await builder.createPeer();
|
|
221
|
+
|
|
222
|
+
const message: Message = {
|
|
223
|
+
author: peer1.peerInfo,
|
|
224
|
+
recipient: peer2.peerInfo,
|
|
225
|
+
payload: PAYLOAD_1,
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
{
|
|
229
|
+
const receivePromise = peer2.waitTillReceive(message);
|
|
230
|
+
await peer1.messenger.sendMessage(message);
|
|
231
|
+
await asyncTimeout(receivePromise, 1_000);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
{
|
|
235
|
+
//
|
|
236
|
+
// Close and reopen peer1
|
|
237
|
+
//
|
|
238
|
+
|
|
239
|
+
await peer2.close();
|
|
240
|
+
await peer2.open();
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
{
|
|
244
|
+
const receivePromise = peer2.waitTillReceive(message);
|
|
245
|
+
await peer1.messenger.sendMessage(message);
|
|
246
|
+
await asyncTimeout(receivePromise, 1_000);
|
|
247
|
+
}
|
|
248
|
+
}).timeout(1_000);
|
|
249
|
+
|
|
250
|
+
describe('Reliability', () => {
|
|
251
|
+
test('message with non reliable connection', async () => {
|
|
252
|
+
// Simulate unreliable connection.
|
|
253
|
+
// Only each 3rd message is sent.
|
|
254
|
+
let i = 0;
|
|
255
|
+
const unreliableConnection = (data: Message): Message[] => {
|
|
256
|
+
i++;
|
|
257
|
+
if (i % 3 !== 0) {
|
|
258
|
+
return [data];
|
|
259
|
+
}
|
|
260
|
+
return [];
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
const builder = new TestBuilder({
|
|
264
|
+
signalManagerFactory,
|
|
265
|
+
messageDisruption: unreliableConnection,
|
|
266
|
+
});
|
|
267
|
+
afterTest(() => builder.close());
|
|
268
|
+
const peer1 = await builder.createPeer();
|
|
269
|
+
await peer1.open();
|
|
270
|
+
const peer2 = await builder.createPeer();
|
|
271
|
+
await peer2.open();
|
|
272
|
+
|
|
273
|
+
const message = {
|
|
274
|
+
author: peer2.peerInfo,
|
|
275
|
+
recipient: peer1.peerInfo,
|
|
276
|
+
payload: PAYLOAD_1,
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
const receivePromise = peer1.defaultReceived.waitForCount(3);
|
|
280
|
+
// Sending 3 messages.
|
|
281
|
+
Array(3)
|
|
282
|
+
.fill(0)
|
|
283
|
+
.forEach(async () => {
|
|
284
|
+
await peer2.messenger.sendMessage(message);
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
// expect to receive 3 messages.
|
|
288
|
+
await receivePromise;
|
|
289
|
+
}).timeout(5_000);
|
|
290
|
+
|
|
291
|
+
test('ignoring doubled messages', async () => {
|
|
292
|
+
// Message got doubled going through signal network.
|
|
293
|
+
const doublingMessage = (data: Message) => [data, data];
|
|
294
|
+
|
|
295
|
+
const builder = new TestBuilder({
|
|
296
|
+
signalManagerFactory,
|
|
297
|
+
messageDisruption: doublingMessage,
|
|
298
|
+
});
|
|
299
|
+
afterTest(() => builder.close());
|
|
300
|
+
const peer1 = await builder.createPeer();
|
|
301
|
+
await peer1.open();
|
|
302
|
+
const peer2 = await builder.createPeer();
|
|
303
|
+
await peer2.open();
|
|
304
|
+
|
|
305
|
+
const [promise, inc] = latch({ count: 1 });
|
|
306
|
+
let count = 0;
|
|
307
|
+
peer1.defaultReceived.on((msg) => {
|
|
308
|
+
count = inc();
|
|
309
|
+
});
|
|
310
|
+
// sending message.
|
|
311
|
+
await peer2.messenger.sendMessage({
|
|
312
|
+
author: peer2.peerInfo,
|
|
313
|
+
recipient: peer1.peerInfo,
|
|
314
|
+
payload: PAYLOAD_1,
|
|
315
|
+
});
|
|
316
|
+
// expect to receive 1 message.
|
|
317
|
+
await asyncTimeout(promise(), 1000);
|
|
318
|
+
expect(count).toEqual(1);
|
|
319
|
+
});
|
|
320
|
+
}).timeout(5_000);
|
|
321
|
+
|
|
322
|
+
describe('load', () => {
|
|
323
|
+
test('many connections to KUBE', async () => {
|
|
324
|
+
const builder = new TestBuilder({
|
|
325
|
+
signalManagerFactory: async () =>
|
|
326
|
+
new WebsocketSignalManager([{ server: 'wss://dev.kube.dxos.org/.well-known/dx/signal' }]),
|
|
327
|
+
});
|
|
328
|
+
void range(100).map(async () => {
|
|
329
|
+
const peer = await builder.createPeer();
|
|
330
|
+
|
|
331
|
+
void peer.messenger.sendMessage({
|
|
332
|
+
author: peer.peerInfo,
|
|
333
|
+
recipient: peer.peerInfo,
|
|
334
|
+
payload: {
|
|
335
|
+
type_url: 'dxos.test',
|
|
336
|
+
value: Buffer.from('TEST'),
|
|
337
|
+
},
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
await sleep(1000000);
|
|
342
|
+
})
|
|
343
|
+
.tag('stress')
|
|
344
|
+
.timeout(5_000);
|
|
345
|
+
});
|
|
346
|
+
};
|