@dxos/network-manager 2.33.9-dev.9246a07b → 2.33.9-dev.9bbef4e2
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/src/network-manager.blueprint-test.d.ts +3 -1
- package/dist/src/network-manager.blueprint-test.d.ts.map +1 -1
- package/dist/src/network-manager.blueprint-test.js +46 -17
- package/dist/src/network-manager.blueprint-test.js.map +1 -1
- package/dist/src/network-manager.browser-test.js +1 -1
- package/dist/src/network-manager.browser-test.js.map +1 -1
- package/dist/src/network-manager.d.ts.map +1 -1
- package/dist/src/network-manager.js +6 -6
- package/dist/src/network-manager.js.map +1 -1
- package/dist/src/network-manager.test.js +5 -4
- package/dist/src/network-manager.test.js.map +1 -1
- package/dist/src/proto/gen/dxos/credentials.d.ts.map +1 -1
- package/dist/src/proto/gen/dxos/halo/keys.d.ts.map +1 -1
- package/dist/src/proto/gen/dxos/halo/keys.js.map +1 -1
- package/dist/src/proto/gen/dxos/mesh/signal.d.ts +52 -45
- package/dist/src/proto/gen/dxos/mesh/signal.d.ts.map +1 -1
- package/dist/src/proto/gen/dxos/mesh/signalMessage.d.ts +79 -0
- package/dist/src/proto/gen/dxos/mesh/signalMessage.d.ts.map +1 -0
- package/dist/src/proto/gen/dxos/mesh/signalMessage.js +3 -0
- package/dist/src/proto/gen/dxos/mesh/signalMessage.js.map +1 -0
- package/dist/src/proto/gen/google/protobuf.d.ts +6 -0
- package/dist/src/proto/gen/google/protobuf.d.ts.map +1 -1
- package/dist/src/proto/gen/index.d.ts +17 -5
- package/dist/src/proto/gen/index.d.ts.map +1 -1
- package/dist/src/proto/gen/index.js +1 -1
- package/dist/src/proto/gen/index.js.map +1 -1
- package/dist/src/proto/substitutions.d.ts +4 -0
- package/dist/src/proto/substitutions.d.ts.map +1 -1
- package/dist/src/proto/substitutions.js +3 -1
- package/dist/src/proto/substitutions.js.map +1 -1
- package/dist/src/signal/in-memory-signal-manager.d.ts +7 -7
- package/dist/src/signal/in-memory-signal-manager.d.ts.map +1 -1
- package/dist/src/signal/in-memory-signal-manager.js +29 -8
- package/dist/src/signal/in-memory-signal-manager.js.map +1 -1
- package/dist/src/signal/index.d.ts +1 -2
- package/dist/src/signal/index.d.ts.map +1 -1
- package/dist/src/signal/index.js +1 -2
- package/dist/src/signal/index.js.map +1 -1
- package/dist/src/signal/integration.test.d.ts +2 -0
- package/dist/src/signal/integration.test.d.ts.map +1 -0
- package/dist/src/signal/integration.test.js +102 -0
- package/dist/src/signal/integration.test.js.map +1 -0
- package/dist/src/signal/message-router.d.ts +7 -7
- package/dist/src/signal/message-router.d.ts.map +1 -1
- package/dist/src/signal/message-router.js +6 -1
- package/dist/src/signal/message-router.js.map +1 -1
- package/dist/src/signal/message-router.test.js +15 -19
- package/dist/src/signal/message-router.test.js.map +1 -1
- package/dist/src/signal/signal-client.d.ts +33 -18
- package/dist/src/signal/signal-client.d.ts.map +1 -1
- package/dist/src/signal/signal-client.js +102 -92
- package/dist/src/signal/signal-client.js.map +1 -1
- package/dist/src/signal/signal-client.test.js +60 -77
- package/dist/src/signal/signal-client.test.js.map +1 -1
- package/dist/src/signal/{websocket-signal-manager.d.ts → signal-manager-impl.d.ts} +13 -11
- package/dist/src/signal/signal-manager-impl.d.ts.map +1 -0
- package/dist/src/signal/signal-manager-impl.js +151 -0
- package/dist/src/signal/signal-manager-impl.js.map +1 -0
- package/dist/src/signal/signal-manager.d.ts +12 -11
- package/dist/src/signal/signal-manager.d.ts.map +1 -1
- package/dist/src/signal/signal-rpc-client.d.ts +19 -0
- package/dist/src/signal/signal-rpc-client.d.ts.map +1 -0
- package/dist/src/signal/signal-rpc-client.js +108 -0
- package/dist/src/signal/signal-rpc-client.js.map +1 -0
- package/dist/src/signal/signal-rpc-client.test.d.ts +2 -0
- package/dist/src/signal/signal-rpc-client.test.d.ts.map +1 -0
- package/dist/src/signal/signal-rpc-client.test.js +74 -0
- package/dist/src/signal/signal-rpc-client.test.js.map +1 -0
- package/dist/src/swarm/connection.d.ts +3 -3
- package/dist/src/swarm/connection.d.ts.map +1 -1
- package/dist/src/swarm/connection.js +1 -4
- package/dist/src/swarm/connection.js.map +1 -1
- package/dist/src/swarm/swarm.d.ts +6 -7
- package/dist/src/swarm/swarm.d.ts.map +1 -1
- package/dist/src/swarm/swarm.js +21 -17
- package/dist/src/swarm/swarm.js.map +1 -1
- package/dist/src/swarm/swarm.test.js +156 -117
- package/dist/src/swarm/swarm.test.js.map +1 -1
- package/dist/src/topology/fully-connected-topology.d.ts +0 -1
- package/dist/src/topology/fully-connected-topology.d.ts.map +1 -1
- package/dist/src/topology/fully-connected-topology.js +1 -6
- package/dist/src/topology/fully-connected-topology.js.map +1 -1
- package/dist/src/topology/mmst-topology.d.ts +0 -1
- package/dist/src/topology/mmst-topology.d.ts.map +1 -1
- package/dist/src/topology/mmst-topology.js +1 -6
- package/dist/src/topology/mmst-topology.js.map +1 -1
- package/dist/src/topology/star-topology.d.ts +0 -1
- package/dist/src/topology/star-topology.d.ts.map +1 -1
- package/dist/src/topology/star-topology.js +1 -6
- package/dist/src/topology/star-topology.js.map +1 -1
- package/dist/src/topology/topology.d.ts +0 -6
- package/dist/src/topology/topology.d.ts.map +1 -1
- package/dist/src/transport/in-memory-transport.d.ts +2 -2
- package/dist/src/transport/in-memory-transport.d.ts.map +1 -1
- package/dist/src/transport/in-memory-transport.js.map +1 -1
- package/dist/src/transport/transport.d.ts +3 -3
- package/dist/src/transport/transport.d.ts.map +1 -1
- package/dist/src/transport/webrtc-transport.d.ts +3 -3
- package/dist/src/transport/webrtc-transport.d.ts.map +1 -1
- package/dist/src/transport/webrtc-transport.js.map +1 -1
- package/dist/tests-setup.js +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +14 -12
- package/src/network-manager.blueprint-test.ts +57 -22
- package/src/network-manager.browser-test.ts +1 -1
- package/src/network-manager.test.ts +8 -7
- package/src/network-manager.ts +8 -9
- package/src/proto/defs/dxos/mesh/signal.proto +53 -35
- package/src/proto/defs/dxos/mesh/signalMessage.proto +51 -0
- package/src/proto/gen/dxos/credentials.ts +1 -0
- package/src/proto/gen/dxos/halo/keys.ts +1 -0
- package/src/proto/gen/dxos/mesh/signal.ts +51 -45
- package/src/proto/gen/dxos/mesh/signalMessage.ts +83 -0
- package/src/proto/gen/google/protobuf.ts +7 -0
- package/src/proto/gen/index.ts +18 -6
- package/src/proto/substitutions.ts +3 -1
- package/src/signal/in-memory-signal-manager.ts +37 -12
- package/src/signal/index.ts +1 -2
- package/src/signal/integration.test.ts +117 -0
- package/src/signal/message-router.test.ts +36 -41
- package/src/signal/message-router.ts +22 -18
- package/src/signal/signal-client.test.ts +70 -92
- package/src/signal/signal-client.ts +119 -113
- package/src/signal/signal-manager-impl.ts +166 -0
- package/src/signal/signal-manager.ts +12 -12
- package/src/signal/signal-rpc-client.test.ts +86 -0
- package/src/signal/signal-rpc-client.ts +121 -0
- package/src/swarm/connection.ts +5 -8
- package/src/swarm/swarm.test.ts +208 -169
- package/src/swarm/swarm.ts +24 -20
- package/src/topology/fully-connected-topology.ts +1 -9
- package/src/topology/mmst-topology.ts +1 -9
- package/src/topology/star-topology.ts +1 -7
- package/src/topology/topology.ts +0 -7
- package/src/transport/in-memory-transport.ts +2 -2
- package/src/transport/transport.ts +3 -3
- package/src/transport/webrtc-transport.ts +3 -3
- package/dist/browser-mocha/bundle.js +0 -119346
- package/dist/browser-mocha/main.js +0 -27
- package/dist/src/signal/websocket-rpc.d.ts +0 -30
- package/dist/src/signal/websocket-rpc.d.ts.map +0 -1
- package/dist/src/signal/websocket-rpc.js +0 -203
- package/dist/src/signal/websocket-rpc.js.map +0 -1
- package/dist/src/signal/websocket-signal-manager.d.ts.map +0 -1
- package/dist/src/signal/websocket-signal-manager.js +0 -134
- package/dist/src/signal/websocket-signal-manager.js.map +0 -1
- package/src/signal/websocket-rpc.ts +0 -208
- package/src/signal/websocket-signal-manager.ts +0 -158
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { Stream } from "@dxos/codec-protobuf";
|
|
2
|
+
import substitutions from "../../../substitutions";
|
|
3
|
+
import * as dxos_credentials from "../credentials";
|
|
4
|
+
import * as dxos_halo_keys from "../halo/keys";
|
|
5
|
+
import * as dxos_mesh_signal from "./signal";
|
|
6
|
+
import * as google_protobuf from "../../google/protobuf";
|
|
7
|
+
/**
|
|
8
|
+
* Defined in:
|
|
9
|
+
* {@link file://./../../../defs/dxos/mesh/signalMessage.proto}
|
|
10
|
+
*/
|
|
11
|
+
export interface SignalMessage {
|
|
12
|
+
/**
|
|
13
|
+
* Sender's public key.
|
|
14
|
+
*/
|
|
15
|
+
id: ReturnType<(typeof substitutions)["dxos.halo.keys.PubKey"]["decode"]>;
|
|
16
|
+
/**
|
|
17
|
+
* Receiver`s public key.
|
|
18
|
+
*/
|
|
19
|
+
remoteId: ReturnType<(typeof substitutions)["dxos.halo.keys.PubKey"]["decode"]>;
|
|
20
|
+
/**
|
|
21
|
+
* Swarm identefier.
|
|
22
|
+
*/
|
|
23
|
+
topic: ReturnType<(typeof substitutions)["dxos.halo.keys.PubKey"]["decode"]>;
|
|
24
|
+
/**
|
|
25
|
+
* Unique connection identifier.
|
|
26
|
+
*/
|
|
27
|
+
sessionId: ReturnType<(typeof substitutions)["dxos.halo.keys.PubKey"]["decode"]>;
|
|
28
|
+
/**
|
|
29
|
+
* Message payload.
|
|
30
|
+
*/
|
|
31
|
+
data: MessageData;
|
|
32
|
+
/**
|
|
33
|
+
* Unique message identifier. Used for Acknolegment and matching Anwers to Offers.
|
|
34
|
+
*
|
|
35
|
+
* Options:
|
|
36
|
+
* - proto3_optional = true
|
|
37
|
+
*/
|
|
38
|
+
messageId?: ReturnType<(typeof substitutions)["dxos.halo.keys.PubKey"]["decode"]>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Defined in:
|
|
42
|
+
* {@link file://./../../../defs/dxos/mesh/signalMessage.proto}
|
|
43
|
+
*/
|
|
44
|
+
export interface MessageData {
|
|
45
|
+
offer?: Offer;
|
|
46
|
+
answer?: Answer;
|
|
47
|
+
signal?: Signal;
|
|
48
|
+
ack?: Acknowledgement;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Defined in:
|
|
52
|
+
* {@link file://./../../../defs/dxos/mesh/signalMessage.proto}
|
|
53
|
+
*/
|
|
54
|
+
export interface Offer {
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Defined in:
|
|
58
|
+
* {@link file://./../../../defs/dxos/mesh/signalMessage.proto}
|
|
59
|
+
*/
|
|
60
|
+
export interface Answer {
|
|
61
|
+
accept: boolean;
|
|
62
|
+
/**
|
|
63
|
+
* MessageId of the Offer being answered.
|
|
64
|
+
*
|
|
65
|
+
* Options:
|
|
66
|
+
* - proto3_optional = true
|
|
67
|
+
*/
|
|
68
|
+
offerMessageId?: ReturnType<(typeof substitutions)["dxos.halo.keys.PubKey"]["decode"]>;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Defined in:
|
|
72
|
+
* {@link file://./../../../defs/dxos/mesh/signalMessage.proto}
|
|
73
|
+
*/
|
|
74
|
+
export interface Signal {
|
|
75
|
+
json: string;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Defined in:
|
|
79
|
+
* {@link file://./../../../defs/dxos/mesh/signalMessage.proto}
|
|
80
|
+
*/
|
|
81
|
+
export interface Acknowledgement {
|
|
82
|
+
messageId: ReturnType<(typeof substitutions)["dxos.halo.keys.PubKey"]["decode"]>;
|
|
83
|
+
}
|
|
@@ -3,7 +3,14 @@ import substitutions from "../../substitutions";
|
|
|
3
3
|
import * as dxos_credentials from "../dxos/credentials";
|
|
4
4
|
import * as dxos_halo_keys from "../dxos/halo/keys";
|
|
5
5
|
import * as dxos_mesh_signal from "../dxos/mesh/signal";
|
|
6
|
+
import * as dxos_mesh_signalMessage from "../dxos/mesh/signalMessage";
|
|
6
7
|
export interface Any {
|
|
7
8
|
type_url: string;
|
|
8
9
|
value: Uint8Array;
|
|
9
10
|
}
|
|
11
|
+
export interface Empty {
|
|
12
|
+
}
|
|
13
|
+
export interface Timestamp {
|
|
14
|
+
seconds: string;
|
|
15
|
+
nanos: number;
|
|
16
|
+
}
|
package/src/proto/gen/index.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { Schema } from "@dxos/codec-protobuf";
|
|
|
2
2
|
import * as dxos_credentials from "./dxos/credentials";
|
|
3
3
|
import * as dxos_halo_keys from "./dxos/halo/keys";
|
|
4
4
|
import * as dxos_mesh_signal from "./dxos/mesh/signal";
|
|
5
|
+
import * as dxos_mesh_signalMessage from "./dxos/mesh/signalMessage";
|
|
5
6
|
import * as google_protobuf from "./google/protobuf";
|
|
6
7
|
import substitutions from "../substitutions";
|
|
7
8
|
export interface TYPES {
|
|
@@ -15,15 +16,26 @@ export interface TYPES {
|
|
|
15
16
|
"dxos.halo.keys.KeyType": dxos_halo_keys.KeyType;
|
|
16
17
|
"dxos.halo.keys.PrivKey": dxos_halo_keys.PrivKey;
|
|
17
18
|
"dxos.halo.keys.PubKey": dxos_halo_keys.PubKey;
|
|
18
|
-
"dxos.mesh.signal.
|
|
19
|
-
"dxos.mesh.signal.
|
|
19
|
+
"dxos.mesh.signal.HostEvent": dxos_mesh_signal.HostEvent;
|
|
20
|
+
"dxos.mesh.signal.JoinRequest": dxos_mesh_signal.JoinRequest;
|
|
20
21
|
"dxos.mesh.signal.Message": dxos_mesh_signal.Message;
|
|
21
|
-
"dxos.mesh.signal.
|
|
22
|
-
"dxos.mesh.signal.
|
|
23
|
-
"dxos.mesh.signal.
|
|
22
|
+
"dxos.mesh.signal.PeerEvent": dxos_mesh_signal.PeerEvent;
|
|
23
|
+
"dxos.mesh.signal.ReceptionRequest": dxos_mesh_signal.ReceptionRequest;
|
|
24
|
+
"dxos.mesh.signal.SwarmEvent": dxos_mesh_signal.SwarmEvent;
|
|
25
|
+
"dxos.mesh.signal.SwarmEvent.PeerAvailable": dxos_mesh_signal.SwarmEvent.PeerAvailable;
|
|
26
|
+
"dxos.mesh.signal.SwarmEvent.PeerLeft": dxos_mesh_signal.SwarmEvent.PeerLeft;
|
|
27
|
+
"dxos.mesh.signalMessage.Acknowledgement": dxos_mesh_signalMessage.Acknowledgement;
|
|
28
|
+
"dxos.mesh.signalMessage.Answer": dxos_mesh_signalMessage.Answer;
|
|
29
|
+
"dxos.mesh.signalMessage.MessageData": dxos_mesh_signalMessage.MessageData;
|
|
30
|
+
"dxos.mesh.signalMessage.Offer": dxos_mesh_signalMessage.Offer;
|
|
31
|
+
"dxos.mesh.signalMessage.Signal": dxos_mesh_signalMessage.Signal;
|
|
32
|
+
"dxos.mesh.signalMessage.SignalMessage": dxos_mesh_signalMessage.SignalMessage;
|
|
24
33
|
"google.protobuf.Any": google_protobuf.Any;
|
|
34
|
+
"google.protobuf.Empty": google_protobuf.Empty;
|
|
35
|
+
"google.protobuf.Timestamp": google_protobuf.Timestamp;
|
|
25
36
|
}
|
|
26
37
|
export interface SERVICES {
|
|
38
|
+
"dxos.mesh.signal.Signal": dxos_mesh_signal.Signal;
|
|
27
39
|
}
|
|
28
|
-
export const schemaJson = JSON.parse("{\"nested\":{\"dxos\":{\"nested\":{\"credentials\":{\"nested\":{\"Message\":{\"fields\":{\"payload\":{\"rule\":\"required\",\"type\":\"google.protobuf.Any\",\"id\":1,\"comment\":null}},\"comment\":null},\"SignedMessage\":{\"fields\":{\"signed\":{\"rule\":\"required\",\"type\":\"Signed\",\"id\":1,\"comment\":\"The signed message contents.\"},\"signatures\":{\"rule\":\"repeated\",\"type\":\"Signature\",\"id\":2,\"comment\":\"An array of Signatures, one for each key that signed the message.\"}},\"nested\":{\"Signature\":{\"oneofs\":{\"_keyChain\":{\"oneof\":[\"keyChain\"]}},\"fields\":{\"key\":{\"rule\":\"required\",\"type\":\"PubKey\",\"id\":1,\"comment\":\"The publicKey of the keypair that made this signature.\"},\"signature\":{\"rule\":\"required\",\"type\":\"bytes\",\"id\":2,\"comment\":\"The bytes of the signature.\"},\"keyChain\":{\"type\":\"KeyChain\",\"id\":3,\"options\":{\"proto3_optional\":true},\"comment\":\"The certification chain of SignedMessages for this key.\"}},\"comment\":null},\"Signed\":{\"fields\":{\"created\":{\"rule\":\"required\",\"type\":\"string\",\"id\":1,\"comment\":\"RFC-3339 datetime string.\"},\"nonce\":{\"rule\":\"required\",\"type\":\"bytes\",\"id\":2,\"comment\":null},\"payload\":{\"rule\":\"required\",\"type\":\"google.protobuf.Any\",\"id\":10,\"comment\":\"The payload to be signed.\"}},\"comment\":null}},\"comment\":\"A generic container message used whenever messages are signed (e.g. PartyCredential)\"}}},\"halo\":{\"nested\":{\"keys\":{\"nested\":{\"KeyChain\":{\"fields\":{\"publicKey\":{\"rule\":\"required\",\"type\":\"PubKey\",\"id\":1,\"comment\":null},\"message\":{\"rule\":\"required\",\"type\":\"SignedMessage\",\"id\":2,\"comment\":null},\"parents\":{\"rule\":\"repeated\",\"type\":\"KeyChain\",\"id\":3,\"comment\":null}},\"comment\":null},\"KeyRecord\":{\"oneofs\":{\"_secretKey\":{\"oneof\":[\"secretKey\"]},\"_hint\":{\"oneof\":[\"hint\"]},\"_own\":{\"oneof\":[\"own\"]},\"_trusted\":{\"oneof\":[\"trusted\"]},\"_added\":{\"oneof\":[\"added\"]},\"_created\":{\"oneof\":[\"created\"]}},\"fields\":{\"type\":{\"rule\":\"required\",\"type\":\"KeyType\",\"id\":1,\"comment\":\"The `KeyType` type of the key. This is often unknown for keys from other sources.\"},\"publicKey\":{\"rule\":\"required\",\"type\":\"PubKey\",\"id\":2,\"comment\":\"The public key as a Buffer (required).\"},\"secretKey\":{\"type\":\"PrivKey\",\"id\":3,\"options\":{\"proto3_optional\":true},\"comment\":\"The secret key as a Buffer (this will never be visible outside the Keyring).\"},\"hint\":{\"type\":\"bool\",\"id\":4,\"options\":{\"proto3_optional\":true},\"comment\":\"Is this key from a Greeting \\\"hint\\\"?\"},\"own\":{\"type\":\"bool\",\"id\":5,\"options\":{\"proto3_optional\":true},\"comment\":\"Determines if this is our key?\\nUsually true if `secretKey` is present; may be false for \\\"inception keys\\\" such as the Party key.\"},\"trusted\":{\"type\":\"bool\",\"id\":6,\"options\":{\"proto3_optional\":true},\"comment\":\"Is this key to be trusted?\"},\"added\":{\"type\":\"string\",\"id\":7,\"options\":{\"proto3_optional\":true},\"comment\":\"An RFC-3339 date/time string for when the key was added to the Keyring.\"},\"created\":{\"type\":\"string\",\"id\":8,\"options\":{\"proto3_optional\":true},\"comment\":\"An RFC-3339 date/time string for when the key was created.\"}},\"comment\":null},\"KeyRecordList\":{\"fields\":{\"keys\":{\"rule\":\"repeated\",\"type\":\"KeyRecord\",\"id\":1,\"comment\":null}},\"comment\":null},\"KeyType\":{\"values\":{\"UNKNOWN\":0,\"IDENTITY\":1,\"DEVICE\":2,\"PARTY\":3,\"FEED\":4,\"DXNS_ADDRESS\":5},\"comment\":null,\"comments\":{\"UNKNOWN\":null,\"IDENTITY\":null,\"DEVICE\":null,\"PARTY\":null,\"FEED\":null,\"DXNS_ADDRESS\":null}},\"PrivKey\":{\"fields\":{\"data\":{\"type\":\"bytes\",\"id\":1,\"comment\":null}},\"comment\":null},\"PubKey\":{\"fields\":{\"data\":{\"type\":\"bytes\",\"id\":1,\"comment\":null}},\"comment\":null}}}}},\"mesh\":{\"nested\":{\"signal\":{\"nested\":{\"
|
|
40
|
+
export const schemaJson = JSON.parse("{\"nested\":{\"dxos\":{\"nested\":{\"credentials\":{\"nested\":{\"Message\":{\"fields\":{\"payload\":{\"rule\":\"required\",\"type\":\"google.protobuf.Any\",\"id\":1,\"comment\":null}},\"comment\":null},\"SignedMessage\":{\"fields\":{\"signed\":{\"rule\":\"required\",\"type\":\"Signed\",\"id\":1,\"comment\":\"The signed message contents.\"},\"signatures\":{\"rule\":\"repeated\",\"type\":\"Signature\",\"id\":2,\"comment\":\"An array of Signatures, one for each key that signed the message.\"}},\"nested\":{\"Signature\":{\"oneofs\":{\"_keyChain\":{\"oneof\":[\"keyChain\"]}},\"fields\":{\"key\":{\"rule\":\"required\",\"type\":\"PubKey\",\"id\":1,\"comment\":\"The publicKey of the keypair that made this signature.\"},\"signature\":{\"rule\":\"required\",\"type\":\"bytes\",\"id\":2,\"comment\":\"The bytes of the signature.\"},\"keyChain\":{\"type\":\"KeyChain\",\"id\":3,\"options\":{\"proto3_optional\":true},\"comment\":\"The certification chain of SignedMessages for this key.\"}},\"comment\":null},\"Signed\":{\"fields\":{\"created\":{\"rule\":\"required\",\"type\":\"string\",\"id\":1,\"comment\":\"RFC-3339 datetime string.\"},\"nonce\":{\"rule\":\"required\",\"type\":\"bytes\",\"id\":2,\"comment\":null},\"payload\":{\"rule\":\"required\",\"type\":\"google.protobuf.Any\",\"id\":10,\"comment\":\"The payload to be signed.\"}},\"comment\":null}},\"comment\":\"A generic container message used whenever messages are signed (e.g. PartyCredential)\"}}},\"halo\":{\"nested\":{\"keys\":{\"nested\":{\"KeyChain\":{\"fields\":{\"publicKey\":{\"rule\":\"required\",\"type\":\"PubKey\",\"id\":1,\"comment\":null},\"message\":{\"rule\":\"required\",\"type\":\"SignedMessage\",\"id\":2,\"comment\":null},\"parents\":{\"rule\":\"repeated\",\"type\":\"KeyChain\",\"id\":3,\"comment\":null}},\"comment\":null},\"KeyRecord\":{\"oneofs\":{\"_secretKey\":{\"oneof\":[\"secretKey\"]},\"_hint\":{\"oneof\":[\"hint\"]},\"_own\":{\"oneof\":[\"own\"]},\"_trusted\":{\"oneof\":[\"trusted\"]},\"_added\":{\"oneof\":[\"added\"]},\"_created\":{\"oneof\":[\"created\"]}},\"fields\":{\"type\":{\"rule\":\"required\",\"type\":\"KeyType\",\"id\":1,\"comment\":\"The `KeyType` type of the key. This is often unknown for keys from other sources.\"},\"publicKey\":{\"rule\":\"required\",\"type\":\"PubKey\",\"id\":2,\"comment\":\"The public key as a Buffer (required).\"},\"secretKey\":{\"type\":\"PrivKey\",\"id\":3,\"options\":{\"proto3_optional\":true},\"comment\":\"The secret key as a Buffer (this will never be visible outside the Keyring).\"},\"hint\":{\"type\":\"bool\",\"id\":4,\"options\":{\"proto3_optional\":true},\"comment\":\"Is this key from a Greeting \\\"hint\\\"?\"},\"own\":{\"type\":\"bool\",\"id\":5,\"options\":{\"proto3_optional\":true},\"comment\":\"Determines if this is our key?\\nUsually true if `secretKey` is present; may be false for \\\"inception keys\\\" such as the Party key.\"},\"trusted\":{\"type\":\"bool\",\"id\":6,\"options\":{\"proto3_optional\":true},\"comment\":\"Is this key to be trusted?\"},\"added\":{\"type\":\"string\",\"id\":7,\"options\":{\"proto3_optional\":true},\"comment\":\"An RFC-3339 date/time string for when the key was added to the Keyring.\"},\"created\":{\"type\":\"string\",\"id\":8,\"options\":{\"proto3_optional\":true},\"comment\":\"An RFC-3339 date/time string for when the key was created.\"}},\"comment\":null},\"KeyRecordList\":{\"fields\":{\"keys\":{\"rule\":\"repeated\",\"type\":\"KeyRecord\",\"id\":1,\"comment\":null}},\"comment\":null},\"KeyType\":{\"values\":{\"UNKNOWN\":0,\"IDENTITY\":1,\"DEVICE\":2,\"PARTY\":3,\"FEED\":4,\"DXNS_ADDRESS\":5},\"comment\":null,\"comments\":{\"UNKNOWN\":null,\"IDENTITY\":null,\"DEVICE\":null,\"PARTY\":null,\"FEED\":null,\"DXNS_ADDRESS\":null}},\"PrivKey\":{\"fields\":{\"data\":{\"type\":\"bytes\",\"id\":1,\"comment\":null}},\"comment\":null},\"PubKey\":{\"fields\":{\"data\":{\"type\":\"bytes\",\"id\":1,\"comment\":null}},\"comment\":null}}}}},\"mesh\":{\"nested\":{\"signal\":{\"options\":{\"go_package\":\"github.com/dxos/kube/go/signal/pb\"},\"nested\":{\"HostEvent\":{\"oneofs\":{\"event\":{\"oneof\":[\"peerAvailable\"],\"comment\":null}},\"fields\":{\"peerAvailable\":{\"type\":\"SwarmEvent.PeerAvailable\",\"id\":1,\"comment\":null}},\"comment\":null},\"JoinRequest\":{\"fields\":{\"swarm\":{\"type\":\"bytes\",\"id\":1,\"comment\":null},\"peer\":{\"type\":\"bytes\",\"id\":2,\"comment\":null}},\"comment\":null},\"Message\":{\"fields\":{\"author\":{\"type\":\"bytes\",\"id\":1,\"comment\":null},\"recipient\":{\"type\":\"bytes\",\"id\":2,\"comment\":null},\"payload\":{\"type\":\"google.protobuf.Any\",\"id\":3,\"comment\":null}},\"comment\":null},\"PeerEvent\":{\"oneofs\":{\"event\":{\"oneof\":[\"message\"],\"comment\":null}},\"fields\":{\"message\":{\"type\":\"Message\",\"id\":1,\"comment\":null}},\"comment\":null},\"ReceptionRequest\":{\"fields\":{\"peer\":{\"type\":\"bytes\",\"id\":1,\"comment\":null}},\"comment\":null},\"Signal\":{\"methods\":{\"Join\":{\"requestType\":\"JoinRequest\",\"responseType\":\"SwarmEvent\",\"responseStream\":true,\"comment\":null},\"ReceiveMessages\":{\"requestType\":\"ReceptionRequest\",\"responseType\":\"Message\",\"responseStream\":true,\"comment\":null},\"SendMessage\":{\"requestType\":\"Message\",\"responseType\":\"google.protobuf.Empty\",\"comment\":null}},\"comment\":null},\"SwarmEvent\":{\"oneofs\":{\"event\":{\"oneof\":[\"peerAvailable\",\"peerLeft\"],\"comment\":null}},\"fields\":{\"peerAvailable\":{\"type\":\"PeerAvailable\",\"id\":1,\"comment\":null},\"peerLeft\":{\"type\":\"PeerLeft\",\"id\":2,\"comment\":null}},\"nested\":{\"PeerAvailable\":{\"oneofs\":{\"_until\":{\"oneof\":[\"until\"]},\"_announceBackToHost\":{\"oneof\":[\"announceBackToHost\"]}},\"fields\":{\"peer\":{\"type\":\"bytes\",\"id\":1,\"comment\":null},\"since\":{\"type\":\"google.protobuf.Timestamp\",\"id\":2,\"comment\":null},\"until\":{\"type\":\"google.protobuf.Timestamp\",\"id\":3,\"options\":{\"proto3_optional\":true},\"comment\":null},\"announceBackToHost\":{\"type\":\"bytes\",\"id\":4,\"options\":{\"proto3_optional\":true},\"comment\":null}},\"comment\":null},\"PeerLeft\":{\"fields\":{\"peer\":{\"type\":\"bytes\",\"id\":1,\"comment\":null}},\"comment\":null}},\"comment\":null}}},\"signalMessage\":{\"nested\":{\"Acknowledgement\":{\"fields\":{\"messageId\":{\"type\":\"PubKey\",\"id\":1,\"comment\":null}},\"comment\":null},\"Answer\":{\"oneofs\":{\"_offerMessageId\":{\"oneof\":[\"offerMessageId\"]}},\"fields\":{\"accept\":{\"type\":\"bool\",\"id\":1,\"comment\":null},\"offerMessageId\":{\"type\":\"PubKey\",\"id\":2,\"options\":{\"proto3_optional\":true},\"comment\":\"MessageId of the Offer being answered.\"}},\"comment\":null},\"MessageData\":{\"oneofs\":{\"payload\":{\"oneof\":[\"offer\",\"answer\",\"signal\",\"ack\"],\"comment\":null}},\"fields\":{\"offer\":{\"type\":\"Offer\",\"id\":1,\"comment\":null},\"answer\":{\"type\":\"Answer\",\"id\":2,\"comment\":null},\"signal\":{\"type\":\"Signal\",\"id\":3,\"comment\":null},\"ack\":{\"type\":\"Acknowledgement\",\"id\":4,\"comment\":null}},\"comment\":null},\"Offer\":{\"fields\":{},\"comment\":null},\"Signal\":{\"fields\":{\"json\":{\"type\":\"string\",\"id\":1,\"comment\":null}},\"comment\":null},\"SignalMessage\":{\"oneofs\":{\"_messageId\":{\"oneof\":[\"messageId\"]}},\"fields\":{\"id\":{\"type\":\"PubKey\",\"id\":1,\"comment\":\"Sender's public key.\"},\"remoteId\":{\"type\":\"PubKey\",\"id\":2,\"comment\":\"Receiver`s public key.\"},\"topic\":{\"type\":\"PubKey\",\"id\":3,\"comment\":\"Swarm identefier.\"},\"sessionId\":{\"type\":\"PubKey\",\"id\":4,\"comment\":\"Unique connection identifier.\"},\"data\":{\"type\":\"MessageData\",\"id\":5,\"comment\":\"Message payload.\"},\"messageId\":{\"type\":\"PubKey\",\"id\":6,\"options\":{\"proto3_optional\":true},\"comment\":\"Unique message identifier. Used for Acknolegment and matching Anwers to Offers.\"}},\"comment\":null}}}}}}},\"google\":{\"nested\":{\"protobuf\":{\"nested\":{\"Any\":{\"fields\":{\"type_url\":{\"type\":\"string\",\"id\":1},\"value\":{\"type\":\"bytes\",\"id\":2}},\"comment\":null},\"Empty\":{\"fields\":{},\"comment\":null},\"Timestamp\":{\"fields\":{\"seconds\":{\"type\":\"int64\",\"id\":1},\"nanos\":{\"type\":\"int32\",\"id\":2}},\"comment\":null}}}}}}}");
|
|
29
41
|
export const schema = Schema.fromJson<TYPES, SERVICES>(schemaJson, substitutions);
|
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
// Copyright 2021 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import { timestampSubstitutions } from '@dxos/codec-protobuf';
|
|
5
6
|
import { publicKeySubstitutions } from '@dxos/protocols';
|
|
6
7
|
|
|
7
8
|
export default {
|
|
8
|
-
...publicKeySubstitutions
|
|
9
|
+
...publicKeySubstitutions,
|
|
10
|
+
...timestampSubstitutions
|
|
9
11
|
};
|
|
@@ -8,19 +8,22 @@ import { Event } from '@dxos/async';
|
|
|
8
8
|
import { PublicKey } from '@dxos/protocols';
|
|
9
9
|
import { ComplexMap, ComplexSet } from '@dxos/util';
|
|
10
10
|
|
|
11
|
-
import {
|
|
11
|
+
import { SwarmEvent } from '../proto/gen/dxos/mesh/signal';
|
|
12
|
+
import { Answer, SignalMessage } from '../proto/gen/dxos/mesh/signalMessage';
|
|
12
13
|
import { SignalApi } from './signal-api';
|
|
13
14
|
import { SignalManager } from './signal-manager';
|
|
14
15
|
|
|
15
16
|
export class InMemorySignalManager implements SignalManager {
|
|
16
17
|
readonly statusChanged = new Event<SignalApi.Status[]>();
|
|
17
18
|
readonly commandTrace = new Event<SignalApi.CommandTrace>();
|
|
18
|
-
readonly
|
|
19
|
-
readonly
|
|
19
|
+
readonly swarmEvent = new Event<[topic: PublicKey, swarmEvent: SwarmEvent]>();
|
|
20
|
+
readonly onMessage = new Event<SignalMessage>();
|
|
20
21
|
|
|
21
22
|
constructor (
|
|
22
|
-
private readonly _onOffer: (message:
|
|
23
|
-
) {
|
|
23
|
+
private readonly _onOffer: (message: SignalMessage) => Promise<Answer>
|
|
24
|
+
) {
|
|
25
|
+
state.swarmEvent.on(data => this.swarmEvent.emit(data));
|
|
26
|
+
}
|
|
24
27
|
|
|
25
28
|
getStatus (): SignalApi.Status[] {
|
|
26
29
|
return [];
|
|
@@ -34,7 +37,24 @@ export class InMemorySignalManager implements SignalManager {
|
|
|
34
37
|
state.swarms.get(topic)!.add(peerId);
|
|
35
38
|
state.connections.set(peerId, this);
|
|
36
39
|
|
|
37
|
-
|
|
40
|
+
state.swarmEvent.emit([topic, {
|
|
41
|
+
peerAvailable: {
|
|
42
|
+
peer: peerId.asUint8Array(),
|
|
43
|
+
since: new Date()
|
|
44
|
+
}
|
|
45
|
+
}]);
|
|
46
|
+
|
|
47
|
+
// Emitting swarm events for each peer.
|
|
48
|
+
for (const [topic, peerIds] of state.swarms) {
|
|
49
|
+
Array.from(peerIds).forEach(peerId => {
|
|
50
|
+
this.swarmEvent.emit([topic, {
|
|
51
|
+
peerAvailable: {
|
|
52
|
+
peer: peerId.asUint8Array(),
|
|
53
|
+
since: new Date()
|
|
54
|
+
}
|
|
55
|
+
}]);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
38
58
|
}
|
|
39
59
|
|
|
40
60
|
leave (topic: PublicKey, peerId: PublicKey) {
|
|
@@ -43,22 +63,26 @@ export class InMemorySignalManager implements SignalManager {
|
|
|
43
63
|
}
|
|
44
64
|
|
|
45
65
|
state.swarms.get(topic)!.delete(peerId);
|
|
46
|
-
}
|
|
47
66
|
|
|
48
|
-
|
|
49
|
-
|
|
67
|
+
const swarmEvent: SwarmEvent = {
|
|
68
|
+
peerLeft: {
|
|
69
|
+
peer: peerId.asUint8Array()
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
state.swarmEvent.emit([topic, swarmEvent]);
|
|
50
74
|
}
|
|
51
75
|
|
|
52
|
-
offer (msg:
|
|
76
|
+
offer (msg: SignalMessage) {
|
|
53
77
|
assert(msg.remoteId);
|
|
54
78
|
assert(state.connections.has(msg.remoteId), 'Peer not connected');
|
|
55
79
|
return state.connections.get(msg.remoteId)!._onOffer(msg);
|
|
56
80
|
}
|
|
57
81
|
|
|
58
|
-
async
|
|
82
|
+
async message (msg: SignalMessage) {
|
|
59
83
|
assert(msg.remoteId);
|
|
60
84
|
assert(state.connections.get(msg.remoteId), 'Peer not connected');
|
|
61
|
-
state.connections.get(msg.remoteId)!.
|
|
85
|
+
state.connections.get(msg.remoteId)!.onMessage.emit(msg);
|
|
62
86
|
}
|
|
63
87
|
|
|
64
88
|
async destroy () {}
|
|
@@ -67,6 +91,7 @@ export class InMemorySignalManager implements SignalManager {
|
|
|
67
91
|
// TODO(burdon): Remove global singleton.
|
|
68
92
|
// This is global state for the in-memory signal manager.
|
|
69
93
|
const state = {
|
|
94
|
+
swarmEvent: new Event<[topic: PublicKey, swarmEvent: SwarmEvent]>(),
|
|
70
95
|
// Mapping from topic to set of peers.
|
|
71
96
|
swarms: new ComplexMap<PublicKey, ComplexSet<PublicKey>>(x => x.toHex()),
|
|
72
97
|
|
package/src/signal/index.ts
CHANGED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { expect, mockFn } from 'earljs';
|
|
6
|
+
import waitForExpect from 'wait-for-expect';
|
|
7
|
+
|
|
8
|
+
import { PublicKey } from '@dxos/protocols';
|
|
9
|
+
import { createTestBroker, TestBroker } from '@dxos/signal';
|
|
10
|
+
import { afterTest } from '@dxos/testutils';
|
|
11
|
+
|
|
12
|
+
import { SignalMessage } from '../proto/gen/dxos/mesh/signalMessage';
|
|
13
|
+
import { MessageRouter } from './message-router';
|
|
14
|
+
import { SignalManagerImpl } from './signal-manager-impl';
|
|
15
|
+
|
|
16
|
+
describe('Signal Integration Test', () => {
|
|
17
|
+
let broker: TestBroker;
|
|
18
|
+
|
|
19
|
+
before(async () => {
|
|
20
|
+
broker = await createTestBroker();
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
after(() => {
|
|
24
|
+
broker.stop();
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const setup = () => {
|
|
28
|
+
const signalManager = new SignalManagerImpl([broker.url()]);
|
|
29
|
+
signalManager.onMessage.on(msg => messageRouter.receiveMessage(msg));
|
|
30
|
+
|
|
31
|
+
const signalMock = mockFn<(msg: SignalMessage) => Promise<void>>().resolvesTo();
|
|
32
|
+
const messageRouter = new MessageRouter({
|
|
33
|
+
sendMessage: msg => signalManager.message(msg),
|
|
34
|
+
onSignal: signalMock,
|
|
35
|
+
onOffer: async () => ({ accept: true })
|
|
36
|
+
});
|
|
37
|
+
afterTest(() => messageRouter.destroy());
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
signalManager,
|
|
41
|
+
signalMock,
|
|
42
|
+
messageRouter
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
it('two peers connecting', async () => {
|
|
47
|
+
const peerNetworking1 = setup();
|
|
48
|
+
const peerNetworking2 = setup();
|
|
49
|
+
|
|
50
|
+
const peer1 = PublicKey.random();
|
|
51
|
+
const peer2 = PublicKey.random();
|
|
52
|
+
const topic = PublicKey.random();
|
|
53
|
+
|
|
54
|
+
const promise1 = peerNetworking1.signalManager.swarmEvent.waitFor(([, swarmEvent]) => !!swarmEvent.peerAvailable && peer2.equals(swarmEvent.peerAvailable.peer));
|
|
55
|
+
const promise2 = peerNetworking1.signalManager.swarmEvent.waitFor(([, swarmEvent]) => !!swarmEvent.peerAvailable && peer1.equals(swarmEvent.peerAvailable.peer));
|
|
56
|
+
|
|
57
|
+
peerNetworking1.signalManager.join(topic, peer1);
|
|
58
|
+
peerNetworking2.signalManager.join(topic, peer2);
|
|
59
|
+
|
|
60
|
+
await promise1;
|
|
61
|
+
await promise2;
|
|
62
|
+
|
|
63
|
+
expect(await peerNetworking1.messageRouter.offer({
|
|
64
|
+
topic,
|
|
65
|
+
id: peer1,
|
|
66
|
+
remoteId: peer2,
|
|
67
|
+
sessionId: PublicKey.random(),
|
|
68
|
+
data: {
|
|
69
|
+
offer: {}
|
|
70
|
+
}
|
|
71
|
+
})).toBeAnObjectWith({ accept: true });
|
|
72
|
+
|
|
73
|
+
expect(await peerNetworking2.messageRouter.offer({
|
|
74
|
+
topic,
|
|
75
|
+
id: peer2,
|
|
76
|
+
remoteId: peer1,
|
|
77
|
+
sessionId: PublicKey.random(),
|
|
78
|
+
data: {
|
|
79
|
+
offer: {}
|
|
80
|
+
}
|
|
81
|
+
})).toBeAnObjectWith({ accept: true });
|
|
82
|
+
|
|
83
|
+
{
|
|
84
|
+
const message: SignalMessage = {
|
|
85
|
+
topic,
|
|
86
|
+
id: peer1,
|
|
87
|
+
remoteId: peer2,
|
|
88
|
+
sessionId: PublicKey.random(),
|
|
89
|
+
data: {
|
|
90
|
+
signal: { json: JSON.stringify({ 'foo': 'bar' }) }
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
await peerNetworking1.messageRouter.signal(message);
|
|
94
|
+
|
|
95
|
+
await waitForExpect(() => {
|
|
96
|
+
expect(peerNetworking2.signalMock).toHaveBeenCalledWith([message]);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
{
|
|
101
|
+
const message: SignalMessage = {
|
|
102
|
+
topic,
|
|
103
|
+
id: peer2,
|
|
104
|
+
remoteId: peer1,
|
|
105
|
+
sessionId: PublicKey.random(),
|
|
106
|
+
data: {
|
|
107
|
+
signal: { json: JSON.stringify({ 'foo': 'bar' }) }
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
await peerNetworking2.messageRouter.signal(message);
|
|
111
|
+
|
|
112
|
+
await waitForExpect(() => {
|
|
113
|
+
expect(peerNetworking1.signalMock).toHaveBeenCalledWith([message]);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
});
|
|
@@ -10,9 +10,8 @@ import { Awaited } from '@dxos/async';
|
|
|
10
10
|
import { PublicKey } from '@dxos/protocols';
|
|
11
11
|
import { createTestBroker } from '@dxos/signal';
|
|
12
12
|
import { afterTest } from '@dxos/testutils';
|
|
13
|
-
import { randomInt } from '@dxos/util';
|
|
14
13
|
|
|
15
|
-
import { Answer,
|
|
14
|
+
import { Answer, SignalMessage } from '../proto/gen/dxos/mesh/signalMessage';
|
|
16
15
|
import { MessageRouter } from './message-router';
|
|
17
16
|
import { SignalClient } from './signal-client';
|
|
18
17
|
|
|
@@ -22,11 +21,9 @@ describe('MessageRouter', () => {
|
|
|
22
21
|
let peer2: PublicKey;
|
|
23
22
|
|
|
24
23
|
let broker1: Awaited<ReturnType<typeof createTestBroker>>;
|
|
25
|
-
const signalApiPort1 = randomInt(10000, 50000);
|
|
26
|
-
const signalApiUrl1 = 'http://0.0.0.0:' + signalApiPort1;
|
|
27
24
|
|
|
28
25
|
before(async () => {
|
|
29
|
-
broker1 = await createTestBroker(
|
|
26
|
+
broker1 = await createTestBroker();
|
|
30
27
|
});
|
|
31
28
|
|
|
32
29
|
beforeEach(() => {
|
|
@@ -35,9 +32,8 @@ describe('MessageRouter', () => {
|
|
|
35
32
|
peer2 = PublicKey.random();
|
|
36
33
|
});
|
|
37
34
|
|
|
38
|
-
after(
|
|
39
|
-
|
|
40
|
-
await broker1.stop();
|
|
35
|
+
after(() => {
|
|
36
|
+
broker1.stop();
|
|
41
37
|
});
|
|
42
38
|
|
|
43
39
|
const createSignalClientAndMessageRouter = async ({
|
|
@@ -46,15 +42,15 @@ describe('MessageRouter', () => {
|
|
|
46
42
|
onOffer = async () => ({ accept: true })
|
|
47
43
|
}: {
|
|
48
44
|
signalApiUrl: string;
|
|
49
|
-
onSignal?: (msg:
|
|
50
|
-
onOffer?: (msg:
|
|
45
|
+
onSignal?: (msg: SignalMessage) => Promise<void>;
|
|
46
|
+
onOffer?: (msg: SignalMessage) => Promise<Answer>;
|
|
51
47
|
}) => {
|
|
52
48
|
|
|
53
49
|
// eslint-disable-next-line prefer-const
|
|
54
50
|
let api: SignalClient;
|
|
55
51
|
const router: MessageRouter = new MessageRouter({
|
|
56
52
|
// todo(mykola): added catch to avoid not finished request.
|
|
57
|
-
sendMessage: (msg:
|
|
53
|
+
sendMessage: (msg: SignalMessage) => api.signal(msg).catch((_) => { }),
|
|
58
54
|
onSignal: onSignal,
|
|
59
55
|
onOffer: onOffer
|
|
60
56
|
});
|
|
@@ -62,8 +58,7 @@ describe('MessageRouter', () => {
|
|
|
62
58
|
|
|
63
59
|
api = new SignalClient(
|
|
64
60
|
signalApiUrl,
|
|
65
|
-
|
|
66
|
-
async (msg: Message) => router.receiveMessage(msg)
|
|
61
|
+
async (msg: SignalMessage) => router.receiveMessage(msg)
|
|
67
62
|
);
|
|
68
63
|
|
|
69
64
|
afterTest(() => api.close());
|
|
@@ -74,19 +69,19 @@ describe('MessageRouter', () => {
|
|
|
74
69
|
};
|
|
75
70
|
|
|
76
71
|
test('signaling between 2 clients', async () => {
|
|
77
|
-
const signalMock1 = mockFn<(msg:
|
|
78
|
-
const { api: api1 } = await createSignalClientAndMessageRouter({ signalApiUrl:
|
|
79
|
-
const { api: api2, router: router2 } = await createSignalClientAndMessageRouter({ signalApiUrl:
|
|
72
|
+
const signalMock1 = mockFn<(msg: SignalMessage) => Promise<void>>().resolvesTo();
|
|
73
|
+
const { api: api1 } = await createSignalClientAndMessageRouter({ signalApiUrl: broker1.url(), onSignal: signalMock1 });
|
|
74
|
+
const { api: api2, router: router2 } = await createSignalClientAndMessageRouter({ signalApiUrl: broker1.url() });
|
|
80
75
|
|
|
81
76
|
await api1.join(topic, peer1);
|
|
82
77
|
await api2.join(topic, peer2);
|
|
83
78
|
|
|
84
|
-
const msg:
|
|
79
|
+
const msg: SignalMessage = {
|
|
85
80
|
id: peer2,
|
|
86
81
|
remoteId: peer1,
|
|
87
82
|
sessionId: PublicKey.random(),
|
|
88
83
|
topic,
|
|
89
|
-
data: { signal: { json: '
|
|
84
|
+
data: { signal: { json: JSON.stringify({ 'asd': 'asd' }) } }
|
|
90
85
|
};
|
|
91
86
|
await router2.signal(msg);
|
|
92
87
|
|
|
@@ -98,14 +93,14 @@ describe('MessageRouter', () => {
|
|
|
98
93
|
test('offer/answer', async () => {
|
|
99
94
|
const { api: api1, router: router1 } = await createSignalClientAndMessageRouter(
|
|
100
95
|
{
|
|
101
|
-
signalApiUrl:
|
|
96
|
+
signalApiUrl: broker1.url(),
|
|
102
97
|
onSignal: (async () => { }) as any,
|
|
103
98
|
onOffer:
|
|
104
99
|
async () => ({ accept: true })
|
|
105
100
|
});
|
|
106
101
|
const { api: api2 } = await createSignalClientAndMessageRouter(
|
|
107
102
|
{
|
|
108
|
-
signalApiUrl:
|
|
103
|
+
signalApiUrl: broker1.url(),
|
|
109
104
|
onSignal: (async () => { }) as any,
|
|
110
105
|
onOffer:
|
|
111
106
|
async () => ({ accept: true })
|
|
@@ -125,26 +120,26 @@ describe('MessageRouter', () => {
|
|
|
125
120
|
}).timeout(5_000);
|
|
126
121
|
|
|
127
122
|
test('signaling between 3 clients', async () => {
|
|
128
|
-
const signalMock1 = mockFn<(msg:
|
|
123
|
+
const signalMock1 = mockFn<(msg: SignalMessage) => Promise<void>>().resolvesTo();
|
|
129
124
|
const { api: api1, router: router1 } = await createSignalClientAndMessageRouter(
|
|
130
125
|
{
|
|
131
|
-
signalApiUrl:
|
|
126
|
+
signalApiUrl: broker1.url(),
|
|
132
127
|
onSignal: signalMock1,
|
|
133
128
|
onOffer:
|
|
134
129
|
async () => ({ accept: true })
|
|
135
130
|
});
|
|
136
|
-
const signalMock2 = mockFn<(msg:
|
|
131
|
+
const signalMock2 = mockFn<(msg: SignalMessage) => Promise<void>>().resolvesTo();
|
|
137
132
|
const { api: api2, router: router2 } = await createSignalClientAndMessageRouter(
|
|
138
133
|
{
|
|
139
|
-
signalApiUrl:
|
|
134
|
+
signalApiUrl: broker1.url(),
|
|
140
135
|
onSignal: signalMock2,
|
|
141
136
|
onOffer:
|
|
142
137
|
async () => ({ accept: true })
|
|
143
138
|
});
|
|
144
|
-
const signalMock3 = mockFn<(msg:
|
|
139
|
+
const signalMock3 = mockFn<(msg: SignalMessage) => Promise<void>>().resolvesTo();
|
|
145
140
|
const { api: api3, router: router3 } = await createSignalClientAndMessageRouter(
|
|
146
141
|
{
|
|
147
|
-
signalApiUrl:
|
|
142
|
+
signalApiUrl: broker1.url(),
|
|
148
143
|
onSignal: signalMock3,
|
|
149
144
|
onOffer:
|
|
150
145
|
async () => ({ accept: true })
|
|
@@ -156,7 +151,7 @@ describe('MessageRouter', () => {
|
|
|
156
151
|
await api3.join(topic, peer3);
|
|
157
152
|
|
|
158
153
|
// sending signal from peer1 to peer3.
|
|
159
|
-
const msg1to3:
|
|
154
|
+
const msg1to3: SignalMessage = {
|
|
160
155
|
id: peer1,
|
|
161
156
|
remoteId: peer3,
|
|
162
157
|
sessionId: PublicKey.random(),
|
|
@@ -169,7 +164,7 @@ describe('MessageRouter', () => {
|
|
|
169
164
|
}, 4_000);
|
|
170
165
|
|
|
171
166
|
// sending signal from peer2 to peer3.
|
|
172
|
-
const msg2to3:
|
|
167
|
+
const msg2to3: SignalMessage = {
|
|
173
168
|
id: peer2,
|
|
174
169
|
remoteId: peer3,
|
|
175
170
|
sessionId: PublicKey.random(),
|
|
@@ -182,7 +177,7 @@ describe('MessageRouter', () => {
|
|
|
182
177
|
}, 4_000);
|
|
183
178
|
|
|
184
179
|
// sending signal from peer3 to peer1.
|
|
185
|
-
const msg3to1:
|
|
180
|
+
const msg3to1: SignalMessage = {
|
|
186
181
|
id: peer3,
|
|
187
182
|
remoteId: peer1,
|
|
188
183
|
sessionId: PublicKey.random(),
|
|
@@ -198,14 +193,14 @@ describe('MessageRouter', () => {
|
|
|
198
193
|
test('two offers', async () => {
|
|
199
194
|
const { api: api1, router: router1 } = await createSignalClientAndMessageRouter(
|
|
200
195
|
{
|
|
201
|
-
signalApiUrl:
|
|
196
|
+
signalApiUrl: broker1.url(),
|
|
202
197
|
onSignal: (async () => { }) as any,
|
|
203
198
|
onOffer:
|
|
204
199
|
async () => ({ accept: true })
|
|
205
200
|
});
|
|
206
201
|
const { api: api2, router: router2 } = await createSignalClientAndMessageRouter(
|
|
207
202
|
{
|
|
208
|
-
signalApiUrl:
|
|
203
|
+
signalApiUrl: broker1.url(),
|
|
209
204
|
onSignal: (async () => { }) as any,
|
|
210
205
|
onOffer:
|
|
211
206
|
async () => ({ accept: true })
|
|
@@ -242,9 +237,9 @@ describe('MessageRouter', () => {
|
|
|
242
237
|
// Imitates signal network disruptions (e. g. message doubling, ).
|
|
243
238
|
messageDisruption = msg => [msg]
|
|
244
239
|
}: {
|
|
245
|
-
onSignal1?: (msg:
|
|
246
|
-
onSignal2?: (msg:
|
|
247
|
-
messageDisruption?: (msg:
|
|
240
|
+
onSignal1?: (msg: SignalMessage) => Promise<void>;
|
|
241
|
+
onSignal2?: (msg: SignalMessage) => Promise<void>;
|
|
242
|
+
messageDisruption?: (msg: SignalMessage) => SignalMessage[];
|
|
248
243
|
}): {mr1: MessageRouter; mr2: MessageRouter} => {
|
|
249
244
|
|
|
250
245
|
const mr1: MessageRouter = new MessageRouter({
|
|
@@ -268,7 +263,7 @@ describe('MessageRouter', () => {
|
|
|
268
263
|
// Simulate unreliable connection.
|
|
269
264
|
// Only each 3rd message is sent.
|
|
270
265
|
let i = 0;
|
|
271
|
-
const unreliableConnection = (msg:
|
|
266
|
+
const unreliableConnection = (msg: SignalMessage): SignalMessage[] => {
|
|
272
267
|
i++;
|
|
273
268
|
if (i % 3 !== 0) {
|
|
274
269
|
return [msg];
|
|
@@ -276,8 +271,8 @@ describe('MessageRouter', () => {
|
|
|
276
271
|
return [];
|
|
277
272
|
};
|
|
278
273
|
|
|
279
|
-
const received:
|
|
280
|
-
const signalMock1 = async (msg:
|
|
274
|
+
const received: SignalMessage[] = [];
|
|
275
|
+
const signalMock1 = async (msg: SignalMessage) => {
|
|
281
276
|
received.push(msg);
|
|
282
277
|
};
|
|
283
278
|
|
|
@@ -294,7 +289,7 @@ describe('MessageRouter', () => {
|
|
|
294
289
|
remoteId: PublicKey.random(),
|
|
295
290
|
sessionId: PublicKey.random(),
|
|
296
291
|
topic: PublicKey.random(),
|
|
297
|
-
data: { signal: { json: 'asd' } }
|
|
292
|
+
data: { signal: { json: JSON.stringify({ 'asd': 'asd' }) } }
|
|
298
293
|
});
|
|
299
294
|
});
|
|
300
295
|
// expect to receive 3 messages.
|
|
@@ -305,10 +300,10 @@ describe('MessageRouter', () => {
|
|
|
305
300
|
|
|
306
301
|
test('ignoring doubled messages', async () => {
|
|
307
302
|
// Message got doubled going through signal network.
|
|
308
|
-
const doublingMessage = (msg:
|
|
303
|
+
const doublingMessage = (msg: SignalMessage) => [msg, msg];
|
|
309
304
|
|
|
310
|
-
const received:
|
|
311
|
-
const signalMock1 = async (msg:
|
|
305
|
+
const received: SignalMessage[] = [];
|
|
306
|
+
const signalMock1 = async (msg: SignalMessage) => {
|
|
312
307
|
received.push(msg);
|
|
313
308
|
};
|
|
314
309
|
|