@dxos/network-manager 0.1.0

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.
Files changed (184) hide show
  1. package/LICENSE +21 -0
  2. package/dist/src/connection-log.d.ts +23 -0
  3. package/dist/src/connection-log.d.ts.map +1 -0
  4. package/dist/src/connection-log.js +98 -0
  5. package/dist/src/connection-log.js.map +1 -0
  6. package/dist/src/index.d.ts +9 -0
  7. package/dist/src/index.d.ts.map +1 -0
  8. package/dist/src/index.js +28 -0
  9. package/dist/src/index.js.map +1 -0
  10. package/dist/src/network-manager.d.ts +80 -0
  11. package/dist/src/network-manager.d.ts.map +1 -0
  12. package/dist/src/network-manager.js +123 -0
  13. package/dist/src/network-manager.js.map +1 -0
  14. package/dist/src/network-manager.test.d.ts +2 -0
  15. package/dist/src/network-manager.test.d.ts.map +1 -0
  16. package/dist/src/network-manager.test.js +621 -0
  17. package/dist/src/network-manager.test.js.map +1 -0
  18. package/dist/src/presence.test.d.ts +2 -0
  19. package/dist/src/presence.test.d.ts.map +1 -0
  20. package/dist/src/presence.test.js +60 -0
  21. package/dist/src/presence.test.js.map +1 -0
  22. package/dist/src/protocol-factory.d.ts +30 -0
  23. package/dist/src/protocol-factory.d.ts.map +1 -0
  24. package/dist/src/protocol-factory.js +64 -0
  25. package/dist/src/protocol-factory.js.map +1 -0
  26. package/dist/src/signal/index.d.ts +4 -0
  27. package/dist/src/signal/index.d.ts.map +1 -0
  28. package/dist/src/signal/index.js +23 -0
  29. package/dist/src/signal/index.js.map +1 -0
  30. package/dist/src/signal/integration.test.d.ts +2 -0
  31. package/dist/src/signal/integration.test.d.ts.map +1 -0
  32. package/dist/src/signal/integration.test.js +105 -0
  33. package/dist/src/signal/integration.test.js.map +1 -0
  34. package/dist/src/signal/message-router.d.ts +39 -0
  35. package/dist/src/signal/message-router.d.ts.map +1 -0
  36. package/dist/src/signal/message-router.js +135 -0
  37. package/dist/src/signal/message-router.js.map +1 -0
  38. package/dist/src/signal/message-router.test.d.ts +2 -0
  39. package/dist/src/signal/message-router.test.d.ts.map +1 -0
  40. package/dist/src/signal/message-router.test.js +211 -0
  41. package/dist/src/signal/message-router.test.js.map +1 -0
  42. package/dist/src/signal/signal-connection.d.ts +21 -0
  43. package/dist/src/signal/signal-connection.d.ts.map +1 -0
  44. package/dist/src/signal/signal-connection.js +6 -0
  45. package/dist/src/signal/signal-connection.js.map +1 -0
  46. package/dist/src/signal/signal-messaging.d.ts +34 -0
  47. package/dist/src/signal/signal-messaging.d.ts.map +1 -0
  48. package/dist/src/signal/signal-messaging.js +6 -0
  49. package/dist/src/signal/signal-messaging.js.map +1 -0
  50. package/dist/src/swarm/connection.d.ts +69 -0
  51. package/dist/src/swarm/connection.d.ts.map +1 -0
  52. package/dist/src/swarm/connection.js +187 -0
  53. package/dist/src/swarm/connection.js.map +1 -0
  54. package/dist/src/swarm/index.d.ts +4 -0
  55. package/dist/src/swarm/index.d.ts.map +1 -0
  56. package/dist/src/swarm/index.js +23 -0
  57. package/dist/src/swarm/index.js.map +1 -0
  58. package/dist/src/swarm/swarm-mapper.d.ts +30 -0
  59. package/dist/src/swarm/swarm-mapper.d.ts.map +1 -0
  60. package/dist/src/swarm/swarm-mapper.js +90 -0
  61. package/dist/src/swarm/swarm-mapper.js.map +1 -0
  62. package/dist/src/swarm/swarm.d.ts +64 -0
  63. package/dist/src/swarm/swarm.d.ts.map +1 -0
  64. package/dist/src/swarm/swarm.js +276 -0
  65. package/dist/src/swarm/swarm.js.map +1 -0
  66. package/dist/src/swarm/swarm.test.d.ts +2 -0
  67. package/dist/src/swarm/swarm.test.d.ts.map +1 -0
  68. package/dist/src/swarm/swarm.test.js +145 -0
  69. package/dist/src/swarm/swarm.test.js.map +1 -0
  70. package/dist/src/testing/index.d.ts +2 -0
  71. package/dist/src/testing/index.d.ts.map +1 -0
  72. package/dist/src/testing/index.js +21 -0
  73. package/dist/src/testing/index.js.map +1 -0
  74. package/dist/src/testing/test-protocol.d.ts +59 -0
  75. package/dist/src/testing/test-protocol.d.ts.map +1 -0
  76. package/dist/src/testing/test-protocol.js +140 -0
  77. package/dist/src/testing/test-protocol.js.map +1 -0
  78. package/dist/src/topology/fully-connected-topology.d.ts +11 -0
  79. package/dist/src/topology/fully-connected-topology.d.ts.map +1 -0
  80. package/dist/src/topology/fully-connected-topology.js +34 -0
  81. package/dist/src/topology/fully-connected-topology.js.map +1 -0
  82. package/dist/src/topology/index.d.ts +5 -0
  83. package/dist/src/topology/index.d.ts.map +1 -0
  84. package/dist/src/topology/index.js +24 -0
  85. package/dist/src/topology/index.js.map +1 -0
  86. package/dist/src/topology/mmst-topology.d.ts +31 -0
  87. package/dist/src/topology/mmst-topology.d.ts.map +1 -0
  88. package/dist/src/topology/mmst-topology.js +73 -0
  89. package/dist/src/topology/mmst-topology.js.map +1 -0
  90. package/dist/src/topology/star-topology.d.ts +13 -0
  91. package/dist/src/topology/star-topology.d.ts.map +1 -0
  92. package/dist/src/topology/star-topology.js +60 -0
  93. package/dist/src/topology/star-topology.js.map +1 -0
  94. package/dist/src/topology/topology.d.ts +56 -0
  95. package/dist/src/topology/topology.d.ts.map +1 -0
  96. package/dist/src/topology/topology.js +6 -0
  97. package/dist/src/topology/topology.js.map +1 -0
  98. package/dist/src/transport/index.d.ts +6 -0
  99. package/dist/src/transport/index.d.ts.map +1 -0
  100. package/dist/src/transport/index.js +25 -0
  101. package/dist/src/transport/index.js.map +1 -0
  102. package/dist/src/transport/memory-transport.d.ts +32 -0
  103. package/dist/src/transport/memory-transport.d.ts.map +1 -0
  104. package/dist/src/transport/memory-transport.js +98 -0
  105. package/dist/src/transport/memory-transport.js.map +1 -0
  106. package/dist/src/transport/memory-transport.test.d.ts +2 -0
  107. package/dist/src/transport/memory-transport.test.d.ts.map +1 -0
  108. package/dist/src/transport/memory-transport.test.js +84 -0
  109. package/dist/src/transport/memory-transport.test.js.map +1 -0
  110. package/dist/src/transport/transport.d.ts +38 -0
  111. package/dist/src/transport/transport.d.ts.map +1 -0
  112. package/dist/src/transport/transport.js +6 -0
  113. package/dist/src/transport/transport.js.map +1 -0
  114. package/dist/src/transport/webrtc-transport-proxy.d.ts +48 -0
  115. package/dist/src/transport/webrtc-transport-proxy.d.ts.map +1 -0
  116. package/dist/src/transport/webrtc-transport-proxy.js +139 -0
  117. package/dist/src/transport/webrtc-transport-proxy.js.map +1 -0
  118. package/dist/src/transport/webrtc-transport-proxy.test.d.ts +2 -0
  119. package/dist/src/transport/webrtc-transport-proxy.test.d.ts.map +1 -0
  120. package/dist/src/transport/webrtc-transport-proxy.test.js +245 -0
  121. package/dist/src/transport/webrtc-transport-proxy.test.js.map +1 -0
  122. package/dist/src/transport/webrtc-transport-service.d.ts +15 -0
  123. package/dist/src/transport/webrtc-transport-service.d.ts.map +1 -0
  124. package/dist/src/transport/webrtc-transport-service.js +97 -0
  125. package/dist/src/transport/webrtc-transport-service.js.map +1 -0
  126. package/dist/src/transport/webrtc-transport.d.ts +34 -0
  127. package/dist/src/transport/webrtc-transport.d.ts.map +1 -0
  128. package/dist/src/transport/webrtc-transport.js +100 -0
  129. package/dist/src/transport/webrtc-transport.js.map +1 -0
  130. package/dist/src/transport/webrtc-transport.test.d.ts +2 -0
  131. package/dist/src/transport/webrtc-transport.test.d.ts.map +1 -0
  132. package/dist/src/transport/webrtc-transport.test.js +80 -0
  133. package/dist/src/transport/webrtc-transport.test.js.map +1 -0
  134. package/dist/src/transport/webrtc.d.ts +6 -0
  135. package/dist/src/transport/webrtc.d.ts.map +1 -0
  136. package/dist/src/transport/webrtc.js +17 -0
  137. package/dist/src/transport/webrtc.js.map +1 -0
  138. package/dist/src/transport/wrtc-simple-peer.test.d.ts +2 -0
  139. package/dist/src/transport/wrtc-simple-peer.test.d.ts.map +1 -0
  140. package/dist/src/transport/wrtc-simple-peer.test.js +24 -0
  141. package/dist/src/transport/wrtc-simple-peer.test.js.map +1 -0
  142. package/dist/src/types.d.ts +6 -0
  143. package/dist/src/types.d.ts.map +1 -0
  144. package/dist/src/types.js +6 -0
  145. package/dist/src/types.js.map +1 -0
  146. package/package.json +58 -0
  147. package/src/connection-log.ts +102 -0
  148. package/src/globals.d.ts +7 -0
  149. package/src/index.ts +12 -0
  150. package/src/network-manager.test.ts +764 -0
  151. package/src/network-manager.ts +204 -0
  152. package/src/presence.test.ts +78 -0
  153. package/src/protocol-factory.ts +83 -0
  154. package/src/signal/index.ts +7 -0
  155. package/src/signal/integration.test.ts +129 -0
  156. package/src/signal/message-router.test.ts +274 -0
  157. package/src/signal/message-router.ts +200 -0
  158. package/src/signal/signal-connection.ts +20 -0
  159. package/src/signal/signal-messaging.ts +38 -0
  160. package/src/swarm/connection.ts +206 -0
  161. package/src/swarm/index.ts +7 -0
  162. package/src/swarm/swarm-mapper.ts +120 -0
  163. package/src/swarm/swarm.test.ts +192 -0
  164. package/src/swarm/swarm.ts +328 -0
  165. package/src/testing/index.ts +5 -0
  166. package/src/testing/test-protocol.ts +160 -0
  167. package/src/topology/fully-connected-topology.ts +38 -0
  168. package/src/topology/index.ts +8 -0
  169. package/src/topology/mmst-topology.ts +105 -0
  170. package/src/topology/star-topology.ts +67 -0
  171. package/src/topology/topology.ts +69 -0
  172. package/src/transport/index.ts +9 -0
  173. package/src/transport/memory-transport.test.ts +110 -0
  174. package/src/transport/memory-transport.ts +128 -0
  175. package/src/transport/transport.ts +47 -0
  176. package/src/transport/webrtc-transport-proxy.test.ts +290 -0
  177. package/src/transport/webrtc-transport-proxy.ts +167 -0
  178. package/src/transport/webrtc-transport-service.ts +115 -0
  179. package/src/transport/webrtc-transport.test.ts +112 -0
  180. package/src/transport/webrtc-transport.ts +122 -0
  181. package/src/transport/webrtc.ts +15 -0
  182. package/src/transport/wrtc-simple-peer.test.ts +24 -0
  183. package/src/types.ts +10 -0
  184. package/src/typings.d.ts +7 -0
@@ -0,0 +1,621 @@
1
+ "use strict";
2
+ //
3
+ // Copyright 2021 DXOS.org
4
+ //
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || function (mod) {
22
+ if (mod && mod.__esModule) return mod;
23
+ var result = {};
24
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
25
+ __setModuleDefault(result, mod);
26
+ return result;
27
+ };
28
+ var __importDefault = (this && this.__importDefault) || function (mod) {
29
+ return (mod && mod.__esModule) ? mod : { "default": mod };
30
+ };
31
+ Object.defineProperty(exports, "__esModule", { value: true });
32
+ const expect_1 = __importDefault(require("expect"));
33
+ const fc = __importStar(require("fast-check"));
34
+ const wait_for_expect_1 = __importDefault(require("wait-for-expect"));
35
+ const async_1 = require("@dxos/async");
36
+ const keys_1 = require("@dxos/keys");
37
+ const log_1 = require("@dxos/log");
38
+ const mesh_protocol_1 = require("@dxos/mesh-protocol");
39
+ const messaging_1 = require("@dxos/messaging");
40
+ const protocol_plugin_presence_1 = require("@dxos/protocol-plugin-presence");
41
+ const protocols_1 = require("@dxos/protocols");
42
+ const rpc_1 = require("@dxos/rpc");
43
+ const testutils_1 = require("@dxos/testutils");
44
+ const util_1 = require("@dxos/util");
45
+ const network_manager_1 = require("./network-manager");
46
+ const protocol_factory_1 = require("./protocol-factory");
47
+ const testing_1 = require("./testing");
48
+ const topology_1 = require("./topology");
49
+ const transport_1 = require("./transport");
50
+ // Signal server will be started by the setup script.
51
+ const SIGNAL_URL = 'ws://localhost:4000/.well-known/dx/signal';
52
+ // TODO(burdon): Remove global and replace with factories.
53
+ const signalContext = new messaging_1.MemorySignalManagerContext();
54
+ /**
55
+ * @deprecated
56
+ */
57
+ // TODO(burdon): Builder pattern.
58
+ const createPeer = async ({ topic, peerId, topology = new topology_1.FullyConnectedTopology(), signalHosts, transportFactory }) => {
59
+ const signalManager = signalHosts ? new messaging_1.WebsocketSignalManager(signalHosts) : new messaging_1.MemorySignalManager(signalContext);
60
+ await signalManager.subscribeMessages(peerId);
61
+ const networkManager = new network_manager_1.NetworkManager({
62
+ signalManager,
63
+ transportFactory
64
+ });
65
+ (0, testutils_1.afterTest)(() => networkManager.destroy());
66
+ const plugin = new testing_1.TestProtocolPlugin(peerId.asBuffer());
67
+ const protocolProvider = (0, testing_1.testProtocolProvider)(topic.asBuffer(), peerId.asBuffer(), plugin);
68
+ await networkManager.openSwarmConnection({ topic, peerId, protocol: protocolProvider, topology });
69
+ return {
70
+ networkManager,
71
+ plugin
72
+ };
73
+ };
74
+ describe('NetworkManager', function () {
75
+ describe('WebRTC transport', function () {
76
+ let topic;
77
+ let peer1Id;
78
+ let peer2Id;
79
+ beforeEach(function () {
80
+ topic = keys_1.PublicKey.random();
81
+ peer1Id = keys_1.PublicKey.random();
82
+ peer2Id = keys_1.PublicKey.random();
83
+ });
84
+ sharedTests({
85
+ inMemory: false,
86
+ signalUrl: SIGNAL_URL,
87
+ getTransportFactory: async () => (0, transport_1.createWebRTCTransportFactory)()
88
+ });
89
+ // TODO(burdon): Factor out config and remove consts.
90
+ it.skip('two peers with different signal & turn servers', async function () {
91
+ const { networkManager: networkManager1, plugin: plugin1 } = await createPeer({
92
+ topic,
93
+ peerId: peer1Id,
94
+ signalHosts: ['wss://apollo3.kube.moon.dxos.network/dxos/signal'],
95
+ transportFactory: (0, transport_1.createWebRTCTransportFactory)({
96
+ iceServers: {
97
+ urls: 'turn:apollo3.kube.moon.dxos.network:3478',
98
+ username: 'dxos',
99
+ credential: 'dxos'
100
+ }
101
+ })
102
+ });
103
+ await (0, async_1.sleep)(3000);
104
+ const { networkManager: networkManager2, plugin: plugin2 } = await createPeer({
105
+ topic,
106
+ peerId: peer2Id,
107
+ signalHosts: ['wss://apollo2.kube.moon.dxos.network/dxos/signal'],
108
+ transportFactory: (0, transport_1.createWebRTCTransportFactory)({
109
+ iceServers: {
110
+ urls: 'turn:apollo2.kube.moon.dxos.network:3478',
111
+ username: 'dxos',
112
+ credential: 'dxos'
113
+ }
114
+ })
115
+ });
116
+ const received = [];
117
+ const mockReceive = (p, s) => {
118
+ received.push(p, s);
119
+ return undefined;
120
+ };
121
+ plugin1.on('receive', mockReceive);
122
+ plugin2.on('connect', async () => {
123
+ await plugin2.send(peer1Id.asBuffer(), '{"message": "Hello"}');
124
+ });
125
+ await (0, wait_for_expect_1.default)(() => {
126
+ (0, expect_1.default)(received.length).toBe(2);
127
+ (0, expect_1.default)(received[0]).toBeInstanceOf(mesh_protocol_1.Protocol);
128
+ (0, expect_1.default)(received[1]).toBe('{"message": "Hello"}');
129
+ });
130
+ await networkManager1.destroy();
131
+ await networkManager2.destroy();
132
+ }).timeout(10000);
133
+ describe('StarTopology', function () {
134
+ it('two peers connect to each other', async function () {
135
+ const { plugin: plugin1 } = await createPeer({
136
+ topic,
137
+ peerId: peer1Id,
138
+ topology: new topology_1.StarTopology(peer1Id),
139
+ transportFactory: (0, transport_1.createWebRTCTransportFactory)()
140
+ });
141
+ const { plugin: plugin2 } = await createPeer({
142
+ topic,
143
+ peerId: peer2Id,
144
+ topology: new topology_1.StarTopology(peer1Id),
145
+ transportFactory: (0, transport_1.createWebRTCTransportFactory)()
146
+ });
147
+ const received = [];
148
+ const mockReceive = (p, s) => {
149
+ received.push(p, s);
150
+ return undefined;
151
+ };
152
+ plugin1.on('receive', mockReceive);
153
+ plugin2.on('connect', async () => {
154
+ await plugin2.send(peer1Id.asBuffer(), '{"message": "Hello"}');
155
+ });
156
+ await (0, wait_for_expect_1.default)(() => {
157
+ (0, expect_1.default)(received.length).toBe(2);
158
+ (0, expect_1.default)(received[0]).toBeInstanceOf(mesh_protocol_1.Protocol);
159
+ (0, expect_1.default)(received[1]).toBe('{"message": "Hello"}');
160
+ });
161
+ // TODO(burdon): Close.
162
+ }).timeout(10000);
163
+ });
164
+ }).timeout(10000);
165
+ describe('WebRTC proxy transport', function () {
166
+ const createTransportFactory = async () => {
167
+ const [rpcPortA, rpcPortB] = (0, rpc_1.createLinkedPorts)();
168
+ const webRTCTransportService = new transport_1.WebRTCTransportService();
169
+ const service = (0, rpc_1.createProtoRpcPeer)({
170
+ requested: {},
171
+ exposed: {
172
+ BridgeService: protocols_1.schema.getService('dxos.mesh.bridge.BridgeService')
173
+ },
174
+ handlers: { BridgeService: webRTCTransportService },
175
+ port: rpcPortA,
176
+ noHandshake: true,
177
+ encodingOptions: {
178
+ preserveAny: true
179
+ }
180
+ });
181
+ const rpcClient = (0, rpc_1.createProtoRpcPeer)({
182
+ requested: {
183
+ BridgeService: protocols_1.schema.getService('dxos.mesh.bridge.BridgeService')
184
+ },
185
+ exposed: {},
186
+ handlers: {},
187
+ port: rpcPortB,
188
+ noHandshake: true,
189
+ encodingOptions: {
190
+ preserveAny: true
191
+ }
192
+ });
193
+ await service.open();
194
+ (0, testutils_1.afterTest)(() => service.close());
195
+ await rpcClient.open();
196
+ (0, testutils_1.afterTest)(() => rpcClient.close());
197
+ return new transport_1.WebRTCTransportProxyFactory().setBridgeService(rpcClient.rpc.BridgeService);
198
+ };
199
+ sharedTests({
200
+ inMemory: false,
201
+ signalUrl: SIGNAL_URL,
202
+ getTransportFactory: createTransportFactory
203
+ });
204
+ });
205
+ describe('memory transport', function () {
206
+ sharedTests({
207
+ inMemory: true,
208
+ getTransportFactory: async () => transport_1.MemoryTransportFactory
209
+ });
210
+ it('large amount of peers and connections', async function () {
211
+ const numTopics = 5;
212
+ const peersPerTopic = 5;
213
+ await Promise.all((0, util_1.range)(numTopics).map(async () => {
214
+ const topic = keys_1.PublicKey.random();
215
+ await Promise.all((0, util_1.range)(peersPerTopic).map(async (_, index) => {
216
+ const peerId = keys_1.PublicKey.random();
217
+ const { plugin } = await createPeer({
218
+ topic,
219
+ peerId,
220
+ transportFactory: transport_1.MemoryTransportFactory
221
+ });
222
+ const [done, pongReceived] = (0, async_1.latch)({ count: peersPerTopic - 1 });
223
+ plugin.on('connect', async (protocol) => {
224
+ var _a;
225
+ const { peerId } = (_a = protocol.getSession()) !== null && _a !== void 0 ? _a : {};
226
+ const remoteId = keys_1.PublicKey.from(peerId);
227
+ await plugin.send(remoteId.asBuffer(), 'ping');
228
+ });
229
+ plugin.on('receive', async (protocol, data) => {
230
+ var _a;
231
+ const { peerId } = (_a = protocol.getSession()) !== null && _a !== void 0 ? _a : {};
232
+ const remoteId = keys_1.PublicKey.from(peerId);
233
+ if (data === 'ping') {
234
+ await plugin.send(remoteId.asBuffer(), 'pong');
235
+ }
236
+ else if (data === 'pong') {
237
+ pongReceived();
238
+ }
239
+ else {
240
+ throw new Error(`Invalid message: ${data}`);
241
+ }
242
+ });
243
+ await done();
244
+ }));
245
+ }));
246
+ });
247
+ // This test performs random actions in the real system and compares it's state with a simplified model.
248
+ // TODO(dmaretskyi): Run this on with actual webrtc and signal servers.
249
+ it('property-based tests', async function () {
250
+ const assertState = async (model, real) => {
251
+ await (0, wait_for_expect_1.default)(() => {
252
+ for (const peer of real.peers.values()) {
253
+ if (peer.presence) {
254
+ for (const expectedJoinedPeer of model.joinedPeers) {
255
+ if (expectedJoinedPeer.equals(peer.presence.peerId)) {
256
+ continue;
257
+ }
258
+ const actuallyConnectedPeers = peer.presence.peers;
259
+ if (!actuallyConnectedPeers.some((x) => keys_1.PublicKey.equals(expectedJoinedPeer, x))) {
260
+ throw new Error(`Expected ${expectedJoinedPeer} to be in the list of joined peers of peer ${peer.presence.peerId.toString('hex')}, actually connected peers: ${actuallyConnectedPeers.map((key) => key.toString('hex'))}`);
261
+ }
262
+ }
263
+ }
264
+ }
265
+ }, 5000);
266
+ real.peers.forEach((peer) => peer.networkManager.topics.forEach((topic) => {
267
+ peer.networkManager.getSwarm(topic).errors.assertNoUnhandledErrors();
268
+ }));
269
+ };
270
+ class CreatePeerCommand {
271
+ constructor(peerId) {
272
+ this.peerId = peerId;
273
+ this.check = (model) => !model.peers.has(this.peerId);
274
+ this.toString = () => `CreatePeer(${this.peerId})`;
275
+ }
276
+ async run(model, real) {
277
+ model.peers.add(this.peerId);
278
+ const networkManager = new network_manager_1.NetworkManager({
279
+ signalManager: new messaging_1.MemorySignalManager(signalContext),
280
+ transportFactory: transport_1.MemoryTransportFactory
281
+ });
282
+ (0, testutils_1.afterTest)(() => networkManager.destroy());
283
+ real.peers.set(this.peerId, {
284
+ networkManager
285
+ });
286
+ await assertState(model, real);
287
+ }
288
+ }
289
+ class RemovePeerCommand {
290
+ constructor(peerId) {
291
+ this.peerId = peerId;
292
+ this.check = (model) => model.peers.has(this.peerId);
293
+ this.toString = () => `RemovePeer(${this.peerId})`;
294
+ }
295
+ async run(model, real) {
296
+ model.peers.delete(this.peerId);
297
+ model.joinedPeers.delete(this.peerId);
298
+ const peer = real.peers.get(this.peerId);
299
+ await peer.networkManager.destroy();
300
+ real.peers.delete(this.peerId);
301
+ await assertState(model, real);
302
+ }
303
+ }
304
+ class JoinTopicCommand {
305
+ constructor(peerId) {
306
+ this.peerId = peerId;
307
+ this.check = (model) => model.peers.has(this.peerId) && !model.joinedPeers.has(this.peerId);
308
+ this.toString = () => `JoinTopic(peerId=${this.peerId})`;
309
+ }
310
+ async run(model, real) {
311
+ model.joinedPeers.add(this.peerId);
312
+ const peer = real.peers.get(this.peerId);
313
+ const presence = new protocol_plugin_presence_1.PresencePlugin(this.peerId.asBuffer());
314
+ (0, testutils_1.afterTest)(() => presence.stop());
315
+ const protocol = (0, protocol_factory_1.createProtocolFactory)(model.topic, this.peerId, [presence]);
316
+ await peer.networkManager.openSwarmConnection({
317
+ peerId: this.peerId,
318
+ topic: model.topic,
319
+ protocol,
320
+ topology: new topology_1.FullyConnectedTopology(),
321
+ presence
322
+ });
323
+ peer.presence = presence;
324
+ await assertState(model, real);
325
+ }
326
+ }
327
+ class LeaveTopicCommand {
328
+ constructor(peerId) {
329
+ this.peerId = peerId;
330
+ this.check = (model) => model.peers.has(this.peerId) && model.joinedPeers.has(this.peerId);
331
+ this.toString = () => `LeaveTopic(peerId=${this.peerId})`;
332
+ }
333
+ async run(model, real) {
334
+ model.joinedPeers.delete(this.peerId);
335
+ const peer = real.peers.get(this.peerId);
336
+ await peer.networkManager.closeSwarmConnection(model.topic);
337
+ peer.presence = undefined;
338
+ await assertState(model, real);
339
+ }
340
+ }
341
+ const peerIds = (0, util_1.range)(10).map(() => keys_1.PublicKey.random());
342
+ const aPeerId = fc.constantFrom(...peerIds);
343
+ const allCommands = [
344
+ aPeerId.map((x) => new CreatePeerCommand(x)),
345
+ aPeerId.map((x) => new RemovePeerCommand(x)),
346
+ aPeerId.map((p) => new JoinTopicCommand(p)),
347
+ aPeerId.map((p) => new LeaveTopicCommand(p))
348
+ ];
349
+ await fc.assert(fc.asyncProperty(fc.commands(allCommands, { maxCommands: 30 }), async (cmds) => {
350
+ const s = () => ({
351
+ model: {
352
+ topic: keys_1.PublicKey.random(),
353
+ peers: new util_1.ComplexSet(keys_1.PublicKey.hash),
354
+ joinedPeers: new util_1.ComplexSet(keys_1.PublicKey.hash)
355
+ },
356
+ real: {
357
+ peers: new util_1.ComplexMap(keys_1.PublicKey.hash)
358
+ }
359
+ });
360
+ await fc.asyncModelRun(s, cmds);
361
+ }), {
362
+ examples: [
363
+ [
364
+ [
365
+ new CreatePeerCommand(peerIds[0]),
366
+ new CreatePeerCommand(peerIds[1]),
367
+ new JoinTopicCommand(peerIds[0]),
368
+ new JoinTopicCommand(peerIds[1]),
369
+ new LeaveTopicCommand(peerIds[0]),
370
+ new LeaveTopicCommand(peerIds[1]),
371
+ new RemovePeerCommand(peerIds[0]),
372
+ new RemovePeerCommand(peerIds[1])
373
+ ]
374
+ ],
375
+ [
376
+ [
377
+ new CreatePeerCommand(peerIds[0]),
378
+ new JoinTopicCommand(peerIds[0]),
379
+ new CreatePeerCommand(peerIds[1]),
380
+ new RemovePeerCommand(peerIds[0]),
381
+ new JoinTopicCommand(peerIds[1]),
382
+ new RemovePeerCommand(peerIds[1])
383
+ ]
384
+ ],
385
+ [
386
+ [
387
+ new CreatePeerCommand(peerIds[0]),
388
+ new JoinTopicCommand(peerIds[0]),
389
+ new RemovePeerCommand(peerIds[0]),
390
+ new CreatePeerCommand(peerIds[1]),
391
+ new JoinTopicCommand(peerIds[1]),
392
+ new CreatePeerCommand(peerIds[2]),
393
+ new JoinTopicCommand(peerIds[2])
394
+ ]
395
+ ]
396
+ ]
397
+ });
398
+ })
399
+ .timeout(30000)
400
+ .retries(10);
401
+ }).timeout(30000);
402
+ });
403
+ function sharedTests({ inMemory, signalUrl, getTransportFactory }) {
404
+ it('two peers connect to each other', async function () {
405
+ const topic = keys_1.PublicKey.random();
406
+ const peer1Id = keys_1.PublicKey.random();
407
+ const peer2Id = keys_1.PublicKey.random();
408
+ const { plugin: plugin1 } = await createPeer({
409
+ topic,
410
+ peerId: peer1Id,
411
+ signalHosts: !inMemory ? [signalUrl] : undefined,
412
+ transportFactory: await getTransportFactory()
413
+ });
414
+ const { plugin: plugin2 } = await createPeer({
415
+ topic,
416
+ peerId: peer2Id,
417
+ signalHosts: !inMemory ? [signalUrl] : undefined,
418
+ transportFactory: await getTransportFactory()
419
+ });
420
+ const received = [];
421
+ const mockReceive = (p, s) => {
422
+ received.push(p, s);
423
+ return undefined;
424
+ };
425
+ plugin1.on('receive', mockReceive);
426
+ plugin2.on('connect', async () => {
427
+ await plugin2.send(peer1Id.asBuffer(), '{"message": "Hello"}');
428
+ });
429
+ await (0, wait_for_expect_1.default)(() => {
430
+ (0, expect_1.default)(received.length).toBe(2);
431
+ (0, expect_1.default)(received[0]).toBeInstanceOf(mesh_protocol_1.Protocol);
432
+ (0, expect_1.default)(received[1]).toBe('{"message": "Hello"}');
433
+ });
434
+ })
435
+ .timeout(10000)
436
+ .retries(10);
437
+ it('join and leave swarm', async function () {
438
+ const topic = keys_1.PublicKey.random();
439
+ const peer1Id = keys_1.PublicKey.random();
440
+ const peer2Id = keys_1.PublicKey.random();
441
+ const { networkManager: networkManager1, plugin: plugin1 } = await createPeer({
442
+ topic,
443
+ peerId: peer1Id,
444
+ signalHosts: !inMemory ? [signalUrl] : undefined,
445
+ transportFactory: await getTransportFactory()
446
+ });
447
+ const { networkManager: networkManager2, plugin: plugin2 } = await createPeer({
448
+ topic,
449
+ peerId: peer2Id,
450
+ signalHosts: !inMemory ? [signalUrl] : undefined,
451
+ transportFactory: await getTransportFactory()
452
+ });
453
+ await Promise.all([async_1.Event.wrap(plugin1, 'connect').waitForCount(1), async_1.Event.wrap(plugin2, 'connect').waitForCount(1)]);
454
+ (0, log_1.log)('Connected', {}, { file: "packages/core/mesh/network-manager/src/network-manager.test.ts", line: 573 });
455
+ const promise1 = async_1.Event.wrap(plugin1, 'disconnect').waitForCount(1);
456
+ const promise2 = async_1.Event.wrap(plugin2, 'disconnect').waitForCount(1);
457
+ await networkManager1.closeSwarmConnection(topic);
458
+ await promise1;
459
+ (0, log_1.log)('Peer1 disconnected', {}, { file: "packages/core/mesh/network-manager/src/network-manager.test.ts", line: 581 });
460
+ await promise2;
461
+ (0, log_1.log)('Peer2 disconnected', {}, { file: "packages/core/mesh/network-manager/src/network-manager.test.ts", line: 584 });
462
+ await networkManager1.destroy();
463
+ (0, log_1.log)('Peer1 destroyed', {}, { file: "packages/core/mesh/network-manager/src/network-manager.test.ts", line: 587 });
464
+ await networkManager2.destroy();
465
+ (0, log_1.log)('Peer2 destroyed', {}, { file: "packages/core/mesh/network-manager/src/network-manager.test.ts", line: 589 });
466
+ })
467
+ .timeout(10000)
468
+ .retries(10);
469
+ it('join and leave swarm and reconnect', async function () {
470
+ const topic = keys_1.PublicKey.random();
471
+ const peer1Id = keys_1.PublicKey.random();
472
+ const peer2Id = keys_1.PublicKey.random();
473
+ const { networkManager: networkManager1, plugin: plugin1 } = await createPeer({
474
+ topic,
475
+ peerId: peer1Id,
476
+ signalHosts: !inMemory ? [signalUrl] : undefined,
477
+ transportFactory: await getTransportFactory()
478
+ });
479
+ const { networkManager: networkManager2, plugin: plugin2 } = await createPeer({
480
+ topic,
481
+ peerId: peer2Id,
482
+ signalHosts: !inMemory ? [signalUrl] : undefined,
483
+ transportFactory: await getTransportFactory()
484
+ });
485
+ // prettier-ignore
486
+ await Promise.all([
487
+ async_1.Event.wrap(plugin1, 'connect').waitForCount(1),
488
+ async_1.Event.wrap(plugin2, 'connect').waitForCount(1)
489
+ ]);
490
+ (0, log_1.log)('Connected', {}, { file: "packages/core/mesh/network-manager/src/network-manager.test.ts", line: 617 });
491
+ const disconnectPromises = Promise.all([
492
+ async_1.Event.wrap(plugin1, 'disconnect').waitForCount(1),
493
+ async_1.Event.wrap(plugin2, 'disconnect').waitForCount(1)
494
+ ]);
495
+ const connectPromises = Promise.all([
496
+ async_1.Event.wrap(plugin1, 'connect').waitForCount(1),
497
+ async_1.Event.wrap(plugin2, 'connect').waitForCount(1)
498
+ ]);
499
+ (0, log_1.log)('Disconnecting peer2', {}, { file: "packages/core/mesh/network-manager/src/network-manager.test.ts", line: 629 });
500
+ await networkManager2.closeSwarmConnection(topic);
501
+ (0, log_1.log)('Reconnecting peer2', {}, { file: "packages/core/mesh/network-manager/src/network-manager.test.ts", line: 632 });
502
+ const newPeer2Id = keys_1.PublicKey.random();
503
+ await networkManager2.openSwarmConnection({
504
+ topic,
505
+ peerId: newPeer2Id,
506
+ protocol: (0, testing_1.testProtocolProvider)(topic.asBuffer(), peer2Id.asBuffer(), plugin2),
507
+ topology: new topology_1.FullyConnectedTopology()
508
+ });
509
+ await disconnectPromises;
510
+ await connectPromises;
511
+ await networkManager1.destroy();
512
+ (0, log_1.log)('Peer1 destroyed', {}, { file: "packages/core/mesh/network-manager/src/network-manager.test.ts", line: 645 });
513
+ await networkManager2.destroy();
514
+ (0, log_1.log)('Peer2 destroyed', {}, { file: "packages/core/mesh/network-manager/src/network-manager.test.ts", line: 647 });
515
+ })
516
+ .timeout(10000)
517
+ .retries(10);
518
+ it('join 2 swarms', async function () {
519
+ const peerId = keys_1.PublicKey.random();
520
+ const plugin1 = new testing_1.TestProtocolPlugin(peerId.asBuffer());
521
+ const plugin2 = new testing_1.TestProtocolPlugin(peerId.asBuffer());
522
+ const signalManager = inMemory ? new messaging_1.MemorySignalManager(signalContext) : new messaging_1.WebsocketSignalManager([signalUrl]);
523
+ const networkManager = new network_manager_1.NetworkManager({
524
+ signalManager,
525
+ transportFactory: await getTransportFactory()
526
+ });
527
+ (0, testutils_1.afterTest)(() => networkManager.destroy());
528
+ // Joining first swarm.
529
+ {
530
+ const topic = keys_1.PublicKey.random();
531
+ const protocolProvider = (0, testing_1.testProtocolProvider)(topic.asBuffer(), peerId.asBuffer(), plugin1);
532
+ await networkManager.openSwarmConnection({
533
+ topic,
534
+ peerId,
535
+ protocol: protocolProvider,
536
+ topology: new topology_1.FullyConnectedTopology()
537
+ });
538
+ // Creating and joining second peer.
539
+ await createPeer({
540
+ topic,
541
+ peerId: keys_1.PublicKey.random(),
542
+ signalHosts: !inMemory ? [signalUrl] : undefined,
543
+ transportFactory: await getTransportFactory()
544
+ });
545
+ }
546
+ // Joining second swarm with same peerId.
547
+ {
548
+ const topic = keys_1.PublicKey.random();
549
+ const protocolProvider = (0, testing_1.testProtocolProvider)(topic.asBuffer(), peerId.asBuffer(), plugin2);
550
+ await networkManager.openSwarmConnection({
551
+ topic,
552
+ peerId,
553
+ protocol: protocolProvider,
554
+ topology: new topology_1.FullyConnectedTopology()
555
+ });
556
+ // Creating and joining second peer.
557
+ await createPeer({
558
+ topic,
559
+ peerId: keys_1.PublicKey.random(),
560
+ signalHosts: !inMemory ? [signalUrl] : undefined,
561
+ transportFactory: await getTransportFactory()
562
+ });
563
+ }
564
+ await Promise.all([async_1.Event.wrap(plugin1, 'connect').waitForCount(1), async_1.Event.wrap(plugin2, 'connect').waitForCount(1)]);
565
+ });
566
+ it('two swarms at the same time', async function () {
567
+ const topicA = keys_1.PublicKey.random();
568
+ const topicB = keys_1.PublicKey.random();
569
+ const peerA1Id = keys_1.PublicKey.random();
570
+ const peerA2Id = keys_1.PublicKey.random();
571
+ const peerB1Id = keys_1.PublicKey.random();
572
+ const peerB2Id = keys_1.PublicKey.random();
573
+ const { plugin: pluginA1 } = await createPeer({
574
+ topic: topicA,
575
+ peerId: peerA1Id,
576
+ transportFactory: await getTransportFactory()
577
+ });
578
+ const { plugin: pluginA2 } = await createPeer({
579
+ topic: topicA,
580
+ peerId: peerA2Id,
581
+ transportFactory: await getTransportFactory()
582
+ });
583
+ const { plugin: pluginB1 } = await createPeer({
584
+ topic: topicB,
585
+ peerId: peerB1Id,
586
+ transportFactory: await getTransportFactory()
587
+ });
588
+ const { plugin: pluginB2 } = await createPeer({
589
+ topic: topicB,
590
+ peerId: peerB2Id,
591
+ transportFactory: await getTransportFactory()
592
+ });
593
+ const receivedA = [];
594
+ const mockReceiveA = (p, s) => {
595
+ receivedA.push(p, s);
596
+ return undefined;
597
+ };
598
+ pluginA1.on('receive', mockReceiveA);
599
+ const receivedB = [];
600
+ const mockReceiveB = (p, s) => {
601
+ receivedB.push(p, s);
602
+ return undefined;
603
+ };
604
+ pluginB1.on('receive', mockReceiveB);
605
+ pluginA2.on('connect', async () => {
606
+ await pluginA2.send(peerA1Id.asBuffer(), 'Test A');
607
+ });
608
+ pluginB2.on('connect', async () => {
609
+ await pluginB2.send(peerB1Id.asBuffer(), 'Test B');
610
+ });
611
+ await (0, wait_for_expect_1.default)(() => {
612
+ (0, expect_1.default)(receivedA.length).toBe(2);
613
+ (0, expect_1.default)(receivedA[0]).toBeInstanceOf(mesh_protocol_1.Protocol);
614
+ (0, expect_1.default)(receivedA[1]).toBe('Test A');
615
+ (0, expect_1.default)(receivedB.length).toBe(2);
616
+ (0, expect_1.default)(receivedB[0]).toBeInstanceOf(mesh_protocol_1.Protocol);
617
+ (0, expect_1.default)(receivedB[1]).toBe('Test B');
618
+ });
619
+ });
620
+ }
621
+ //# sourceMappingURL=network-manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-manager.test.js","sourceRoot":"","sources":["../../src/network-manager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=presence.test.d.ts.map