@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 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transport/index.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;;;;;;;;;;;;AAEF,qDAAmC;AACnC,8CAA4B;AAC5B,qDAAmC;AACnC,6DAA2C;AAC3C,2DAAyC"}
@@ -0,0 +1,32 @@
1
+ /// <reference types="node" />
2
+ import { Event } from '@dxos/async';
3
+ import { ErrorStream } from '@dxos/debug';
4
+ import { PublicKey } from '@dxos/keys';
5
+ import { Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';
6
+ import { Transport, TransportFactory } from './transport';
7
+ /**
8
+ * Fake transport.
9
+ */
10
+ export declare class MemoryTransport implements Transport {
11
+ private readonly _ownId;
12
+ private readonly _remoteId;
13
+ private readonly _sessionId;
14
+ private readonly _topic;
15
+ private readonly _stream;
16
+ private static readonly _connections;
17
+ readonly closed: Event<void>;
18
+ readonly connected: Event<void>;
19
+ readonly errors: ErrorStream;
20
+ private readonly _ownKey;
21
+ private readonly _remoteKey;
22
+ private readonly _outgoingDelay;
23
+ private readonly _incomingDelay;
24
+ private _remoteConnection?;
25
+ constructor(_ownId: PublicKey, _remoteId: PublicKey, _sessionId: PublicKey, _topic: PublicKey, _stream: NodeJS.ReadWriteStream);
26
+ get remoteId(): PublicKey;
27
+ get sessionId(): PublicKey;
28
+ signal(signal: Signal): Promise<void>;
29
+ close(): Promise<void>;
30
+ }
31
+ export declare const MemoryTransportFactory: TransportFactory;
32
+ //# sourceMappingURL=memory-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-transport.d.ts","sourceRoot":"","sources":["../../../src/transport/memory-transport.ts"],"names":[],"mappings":";AAOA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAG/D,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAkB1D;;GAEG;AAEH,qBAAa,eAAgB,YAAW,SAAS;IAmB7C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IArB1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAElC;IAEF,SAAgB,MAAM,cAAqB;IAC3C,SAAgB,SAAS,cAAqB;IAC9C,SAAgB,MAAM,cAAqB;IAE3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAE3C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6C;IAC5E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6C;IAE5E,OAAO,CAAC,iBAAiB,CAAC,CAAkB;gBAGzB,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,SAAS,EACrB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,CAAC,eAAe;IA0BlD,IAAI,QAAQ,IAAI,SAAS,CAExB;IAED,IAAI,SAAS,IAAI,SAAS,CAEzB;IAEK,MAAM,CAAC,MAAM,EAAE,MAAM;IAIrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CA0B7B;AAED,eAAO,MAAM,sBAAsB,EAAE,gBAEpC,CAAC"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ //
3
+ // Copyright 2020 DXOS.org
4
+ //
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.MemoryTransportFactory = exports.MemoryTransport = void 0;
10
+ const node_assert_1 = __importDefault(require("node:assert"));
11
+ const stream_1 = require("stream");
12
+ const async_1 = require("@dxos/async");
13
+ const debug_1 = require("@dxos/debug");
14
+ const log_1 = require("@dxos/log");
15
+ const util_1 = require("@dxos/util");
16
+ // Delay (in milliseconds) for data being sent through in-memory connections to simulate network latency.
17
+ const MEMORY_TRANSPORT_DELAY = 1;
18
+ /**
19
+ * Creates a binary stream that delays data being sent through the stream by the specified amount of time.
20
+ */
21
+ const createStreamDelay = (delay) => new stream_1.Transform({
22
+ objectMode: true,
23
+ transform: (chunk, _, cb) => {
24
+ setTimeout(() => cb(null, chunk), delay); // TODO(burdon): Randomize.
25
+ }
26
+ });
27
+ /**
28
+ * Fake transport.
29
+ */
30
+ // TODO(burdon): Remove static variables.
31
+ class MemoryTransport {
32
+ constructor(_ownId, _remoteId, _sessionId, _topic, _stream) {
33
+ this._ownId = _ownId;
34
+ this._remoteId = _remoteId;
35
+ this._sessionId = _sessionId;
36
+ this._topic = _topic;
37
+ this._stream = _stream;
38
+ this.closed = new async_1.Event();
39
+ this.connected = new async_1.Event();
40
+ this.errors = new debug_1.ErrorStream();
41
+ this._outgoingDelay = createStreamDelay(MEMORY_TRANSPORT_DELAY);
42
+ this._incomingDelay = createStreamDelay(MEMORY_TRANSPORT_DELAY);
43
+ (0, log_1.log)('creating', { topic: this._topic, peerId: this._ownId, remoteId: this._remoteId }, { file: "packages/core/mesh/network-manager/src/transport/memory-transport.ts", line: 62 });
44
+ this._ownKey = [this._topic, this._ownId, this._remoteId];
45
+ this._remoteKey = [this._topic, this._remoteId, this._ownId];
46
+ (0, node_assert_1.default)(!MemoryTransport._connections.has(this._ownKey), 'Duplicate memory connection');
47
+ MemoryTransport._connections.set(this._ownKey, this);
48
+ this._remoteConnection = MemoryTransport._connections.get(this._remoteKey);
49
+ if (this._remoteConnection) {
50
+ this._remoteConnection._remoteConnection = this;
51
+ (0, log_1.log)('connected', { topic: this._topic, peerId: this._ownId, remoteId: this._remoteId }, { file: "packages/core/mesh/network-manager/src/transport/memory-transport.ts", line: 74 });
52
+ this._stream
53
+ .pipe(this._outgoingDelay)
54
+ .pipe(this._remoteConnection._stream)
55
+ .pipe(this._incomingDelay)
56
+ .pipe(this._stream);
57
+ this.connected.emit();
58
+ this._remoteConnection.connected.emit();
59
+ }
60
+ }
61
+ get remoteId() {
62
+ return this._remoteId;
63
+ }
64
+ get sessionId() {
65
+ return this._sessionId;
66
+ }
67
+ async signal(signal) {
68
+ // No-op.
69
+ }
70
+ async close() {
71
+ (0, log_1.log)('closing', { topic: this._topic, peerId: this._ownId, remoteId: this._remoteId }, { file: "packages/core/mesh/network-manager/src/transport/memory-transport.ts", line: 99 });
72
+ MemoryTransport._connections.delete(this._ownKey);
73
+ if (this._remoteConnection) {
74
+ MemoryTransport._connections.delete(this._remoteKey);
75
+ // TODO(dmaretskyi): Hypercore streams do not seem to have the unpipe method.
76
+ // NOTE(burdon): Using readable-stream.wrap() might help (see feed-store).
77
+ // code this._stream
78
+ // code .unpipe(this._outgoingDelay)
79
+ // code .unpipe(this._remoteConnection._stream)
80
+ // code .unpipe(this._incomingDelay)
81
+ // code .unpipe(this._stream);
82
+ this._outgoingDelay.unpipe();
83
+ this._incomingDelay.unpipe();
84
+ this._remoteConnection.closed.emit();
85
+ this._remoteConnection._remoteConnection = undefined;
86
+ this._remoteConnection = undefined;
87
+ }
88
+ this.closed.emit();
89
+ (0, log_1.log)('closed', { topic: this._topic }, { file: "packages/core/mesh/network-manager/src/transport/memory-transport.ts", line: 122 });
90
+ }
91
+ }
92
+ exports.MemoryTransport = MemoryTransport;
93
+ // TODO(burdon): Remove global properties.
94
+ MemoryTransport._connections = new util_1.ComplexMap(([topic, nodeId, remoteId]) => topic.toHex() + nodeId.toHex() + remoteId.toHex());
95
+ exports.MemoryTransportFactory = {
96
+ create: (opts) => new MemoryTransport(opts.ownId, opts.remoteId, opts.sessionId, opts.topic, opts.stream)
97
+ };
98
+ //# sourceMappingURL=memory-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-transport.js","sourceRoot":"","sources":["../../../src/transport/memory-transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memory-transport.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-transport.test.d.ts","sourceRoot":"","sources":["../../../src/transport/memory-transport.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ //
3
+ // Copyright 2021 DXOS.org
4
+ //
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const expect_1 = __importDefault(require("expect"));
10
+ const wait_for_expect_1 = __importDefault(require("wait-for-expect"));
11
+ const crypto_1 = require("@dxos/crypto");
12
+ const keys_1 = require("@dxos/keys");
13
+ const mesh_protocol_1 = require("@dxos/mesh-protocol");
14
+ const testutils_1 = require("@dxos/testutils");
15
+ const util_1 = require("@dxos/util");
16
+ const testing_1 = require("../testing");
17
+ const memory_transport_1 = require("./memory-transport");
18
+ // TODO(burdon): Flaky test.
19
+ // Cannot log after tests are done. Did you forget to wait for something async in your test?
20
+ // Attempted to log "Ignoring unsupported ICE candidate.".
21
+ const createPair = () => {
22
+ const topic = keys_1.PublicKey.random();
23
+ const peer1Id = keys_1.PublicKey.random();
24
+ const peer2Id = keys_1.PublicKey.random();
25
+ const sessionId = keys_1.PublicKey.random();
26
+ const plugin1 = new testing_1.TestProtocolPlugin(peer1Id.asBuffer());
27
+ const protocolProvider1 = (0, testing_1.testProtocolProvider)(topic.asBuffer(), peer1Id.asBuffer(), plugin1);
28
+ const connection1 = new memory_transport_1.MemoryTransport(peer1Id, peer2Id, sessionId, topic, protocolProvider1({ channel: (0, crypto_1.discoveryKey)(topic), initiator: true }).stream);
29
+ (0, testutils_1.afterTest)(() => connection1.close());
30
+ (0, testutils_1.afterTest)(() => connection1.errors.assertNoUnhandledErrors());
31
+ const plugin2 = new testing_1.TestProtocolPlugin(peer2Id.asBuffer());
32
+ const protocolProvider2 = (0, testing_1.testProtocolProvider)(topic.asBuffer(), peer2Id.asBuffer(), plugin2);
33
+ const connection2 = new memory_transport_1.MemoryTransport(peer2Id, peer1Id, sessionId, topic, protocolProvider2({ channel: (0, crypto_1.discoveryKey)(topic), initiator: false }).stream);
34
+ (0, testutils_1.afterTest)(() => connection2.close());
35
+ (0, testutils_1.afterTest)(() => connection2.errors.assertNoUnhandledErrors());
36
+ return {
37
+ connection1,
38
+ connection2,
39
+ plugin1,
40
+ plugin2,
41
+ peer1Id,
42
+ peer2Id,
43
+ topic
44
+ };
45
+ };
46
+ describe('MemoryTransport', function () {
47
+ it('establish connection and send data through with protocol', async function () {
48
+ const { plugin1, plugin2, peer1Id } = createPair();
49
+ const received = [];
50
+ const mockReceive = (p, s) => {
51
+ received.push(p, s);
52
+ return undefined;
53
+ };
54
+ plugin1.on('receive', mockReceive);
55
+ plugin2.on('connect', async (protocol) => {
56
+ await plugin2.send(peer1Id.asBuffer(), '{"message": "Hello"}');
57
+ });
58
+ await (0, wait_for_expect_1.default)(() => {
59
+ (0, expect_1.default)(received.length).toBe(2);
60
+ (0, expect_1.default)(received[0]).toBeInstanceOf(mesh_protocol_1.Protocol);
61
+ (0, expect_1.default)(received[1]).toBe('{"message": "Hello"}');
62
+ });
63
+ });
64
+ it('10 pairs of peers connecting at the same time', async function () {
65
+ await Promise.all((0, util_1.range)(10).map(async () => {
66
+ const { plugin1, plugin2, peer1Id } = createPair();
67
+ const received = [];
68
+ const mockReceive = (p, s) => {
69
+ received.push(p, s);
70
+ return undefined;
71
+ };
72
+ plugin1.on('receive', mockReceive);
73
+ plugin2.on('connect', async (protocol) => {
74
+ await plugin2.send(peer1Id.asBuffer(), '{"message": "Hello"}');
75
+ });
76
+ await (0, wait_for_expect_1.default)(() => {
77
+ (0, expect_1.default)(received.length).toBe(2);
78
+ (0, expect_1.default)(received[0]).toBeInstanceOf(mesh_protocol_1.Protocol);
79
+ (0, expect_1.default)(received[1]).toBe('{"message": "Hello"}');
80
+ });
81
+ }));
82
+ });
83
+ });
84
+ //# sourceMappingURL=memory-transport.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-transport.test.js","sourceRoot":"","sources":["../../../src/transport/memory-transport.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /// <reference types="node" />
2
+ import { Event } from '@dxos/async';
3
+ import { ErrorStream } from '@dxos/debug';
4
+ import { PublicKey } from '@dxos/keys';
5
+ import { Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';
6
+ import { SignalMessage } from '../signal';
7
+ /**
8
+ * Abstraction over a P2P connection transport. Currently either WebRTC or in-memory.
9
+ */
10
+ export interface Transport {
11
+ closed: Event;
12
+ connected: Event;
13
+ errors: ErrorStream;
14
+ signal(signal: Signal): Promise<void>;
15
+ close(): Promise<void>;
16
+ }
17
+ export declare type TransportOptions = {
18
+ /**
19
+ * Did local node initiate this connection.
20
+ */
21
+ initiator: boolean;
22
+ ownId: PublicKey;
23
+ remoteId: PublicKey;
24
+ sessionId: PublicKey;
25
+ topic: PublicKey;
26
+ /**
27
+ * Wire protocol.
28
+ */
29
+ stream: NodeJS.ReadWriteStream;
30
+ /**
31
+ * Send a signal message to remote peer.
32
+ */
33
+ sendSignal: (msg: SignalMessage) => Promise<void>;
34
+ };
35
+ export interface TransportFactory {
36
+ create(options: TransportOptions): Transport;
37
+ }
38
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/transport/transport.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAE/D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,KAAK,CAAC;IACd,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,oBAAY,gBAAgB,GAAG;IAC7B;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,SAAS,CAAC;IAEjB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC;IAE/B;;OAEG;IACH,UAAU,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAC9C"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ //
3
+ // Copyright 2020 DXOS.org
4
+ //
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/transport/transport.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE"}
@@ -0,0 +1,48 @@
1
+ /// <reference types="node" />
2
+ import { Event } from '@dxos/async';
3
+ import { ErrorStream } from '@dxos/debug';
4
+ import { PublicKey } from '@dxos/keys';
5
+ import { BridgeService } from '@dxos/protocols/proto/dxos/mesh/bridge';
6
+ import { Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';
7
+ import { SignalMessage } from '../signal';
8
+ import { Transport, TransportFactory, TransportOptions } from './transport';
9
+ export interface WebRTCTransportProxyParams {
10
+ initiator: boolean;
11
+ stream: NodeJS.ReadWriteStream;
12
+ ownId: PublicKey;
13
+ remoteId: PublicKey;
14
+ sessionId: PublicKey;
15
+ topic: PublicKey;
16
+ sendSignal: (msg: SignalMessage) => void;
17
+ bridgeService: BridgeService;
18
+ }
19
+ export declare class WebRTCTransportProxy implements Transport {
20
+ private readonly _params;
21
+ readonly closed: Event<void>;
22
+ private _closed;
23
+ readonly connected: Event<void>;
24
+ readonly errors: ErrorStream;
25
+ private _serviceStream;
26
+ private readonly _proxyId;
27
+ constructor(_params: WebRTCTransportProxyParams);
28
+ private _handleConnection;
29
+ private _handleData;
30
+ private _handleSignal;
31
+ signal(signal: Signal): Promise<void>;
32
+ close(): Promise<void>;
33
+ /**
34
+ * Called when underlying proxy service becomes unavailable.
35
+ */
36
+ forceClose(): void;
37
+ }
38
+ export declare class WebRTCTransportProxyFactory implements TransportFactory {
39
+ private _bridgeService;
40
+ private _connections;
41
+ /**
42
+ * Sets the current BridgeService to be used to open connections.
43
+ * Calling this method will close any existing connections.
44
+ */
45
+ setBridgeService(bridgeService: BridgeService | undefined): this;
46
+ create(options: TransportOptions): Transport;
47
+ }
48
+ //# sourceMappingURL=webrtc-transport-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webrtc-transport-proxy.d.ts","sourceRoot":"","sources":["../../../src/transport/webrtc-transport-proxy.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAgC,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACrG,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAE/D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC;IAC/B,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;IACzC,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,qBAAa,oBAAqB,YAAW,SAAS;IAWlD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAV1B,QAAQ,CAAC,MAAM,cAAe;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,QAAQ,CAAC,SAAS,cAAe;IACjC,QAAQ,CAAC,MAAM,cAAqB;IAEpC,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;gBAI5B,OAAO,EAAE,0BAA0B;YAkCxC,iBAAiB;IAiB/B,OAAO,CAAC,WAAW;YAKL,aAAa;IAUrB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAc5B;;OAEG;IACH,UAAU;CAKX;AAED,qBAAa,2BAA4B,YAAW,gBAAgB;IAClE,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,YAAY,CAAmC;IAEvD;;;OAGG;IACH,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI;IAShE,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS;CAa7C"}
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ //
3
+ // Copyright 2022 DXOS.org
4
+ //
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.WebRTCTransportProxyFactory = exports.WebRTCTransportProxy = void 0;
10
+ const assert_1 = __importDefault(require("assert"));
11
+ const async_1 = require("@dxos/async");
12
+ const debug_1 = require("@dxos/debug");
13
+ const keys_1 = require("@dxos/keys");
14
+ const log_1 = require("@dxos/log");
15
+ const bridge_1 = require("@dxos/protocols/proto/dxos/mesh/bridge");
16
+ class WebRTCTransportProxy {
17
+ // prettier-ignore
18
+ constructor(_params) {
19
+ this._params = _params;
20
+ this.closed = new async_1.Event();
21
+ this._closed = false;
22
+ this.connected = new async_1.Event();
23
+ this.errors = new debug_1.ErrorStream();
24
+ this._proxyId = keys_1.PublicKey.random();
25
+ this._serviceStream = this._params.bridgeService.open({
26
+ proxyId: this._proxyId,
27
+ initiator: this._params.initiator
28
+ });
29
+ this._serviceStream.waitUntilReady().then(() => {
30
+ this._serviceStream.subscribe(async (msg) => {
31
+ if (msg.connection) {
32
+ await this._handleConnection(msg.connection);
33
+ }
34
+ else if (msg.data) {
35
+ this._handleData(msg.data);
36
+ }
37
+ else if (msg.signal) {
38
+ await this._handleSignal(msg.signal);
39
+ }
40
+ });
41
+ this._params.stream.on('data', async (data) => {
42
+ try {
43
+ await this._params.bridgeService.sendData({
44
+ proxyId: this._proxyId,
45
+ payload: data
46
+ });
47
+ }
48
+ catch (err) {
49
+ log_1.log.catch(err, {}, { file: "packages/core/mesh/network-manager/src/transport/webrtc-transport-proxy.ts", line: 66 });
50
+ }
51
+ });
52
+ }, (error) => log_1.log.catch(error, {}, { file: "packages/core/mesh/network-manager/src/transport/webrtc-transport-proxy.ts", line: 70 }));
53
+ }
54
+ async _handleConnection(connectionEvent) {
55
+ if (connectionEvent.error) {
56
+ this.errors.raise(new Error(connectionEvent.error));
57
+ }
58
+ switch (connectionEvent.state) {
59
+ case bridge_1.ConnectionState.CONNECTED: {
60
+ this.connected.emit();
61
+ break;
62
+ }
63
+ case bridge_1.ConnectionState.CLOSED: {
64
+ await this.close();
65
+ break;
66
+ }
67
+ }
68
+ }
69
+ _handleData(dataEvent) {
70
+ // NOTE: This must be a Buffer otherwise hypercore-protocol breaks.
71
+ this._params.stream.write(Buffer.from(dataEvent.payload));
72
+ }
73
+ async _handleSignal(signalEvent) {
74
+ await this._params.sendSignal({
75
+ author: this._params.ownId,
76
+ recipient: this._params.remoteId,
77
+ topic: this._params.topic,
78
+ sessionId: this._params.sessionId,
79
+ data: { signal: signalEvent.payload }
80
+ });
81
+ }
82
+ async signal(signal) {
83
+ await this._params.bridgeService.sendSignal({
84
+ proxyId: this._proxyId,
85
+ signal
86
+ });
87
+ }
88
+ async close() {
89
+ if (this._closed) {
90
+ return;
91
+ }
92
+ this._serviceStream.close();
93
+ try {
94
+ await this._params.bridgeService.close({ proxyId: this._proxyId });
95
+ }
96
+ catch (err) {
97
+ log_1.log.catch(err, {}, { file: "packages/core/mesh/network-manager/src/transport/webrtc-transport-proxy.ts", line: 121 });
98
+ }
99
+ this.closed.emit();
100
+ this._closed = true;
101
+ }
102
+ /**
103
+ * Called when underlying proxy service becomes unavailable.
104
+ */
105
+ forceClose() {
106
+ this._serviceStream.close();
107
+ this.closed.emit();
108
+ this._closed = true;
109
+ }
110
+ }
111
+ exports.WebRTCTransportProxy = WebRTCTransportProxy;
112
+ class WebRTCTransportProxyFactory {
113
+ constructor() {
114
+ this._connections = new Set();
115
+ }
116
+ /**
117
+ * Sets the current BridgeService to be used to open connections.
118
+ * Calling this method will close any existing connections.
119
+ */
120
+ setBridgeService(bridgeService) {
121
+ this._bridgeService = bridgeService;
122
+ for (const connection of this._connections) {
123
+ connection.forceClose();
124
+ }
125
+ return this;
126
+ }
127
+ create(options) {
128
+ (0, assert_1.default)(this._bridgeService, 'WebRTCTransportProxyFactory is not ready to open connections');
129
+ const transport = new WebRTCTransportProxy({
130
+ ...options,
131
+ bridgeService: this._bridgeService
132
+ });
133
+ this._connections.add(transport);
134
+ transport.closed.on(() => this._connections.delete(transport));
135
+ return transport;
136
+ }
137
+ }
138
+ exports.WebRTCTransportProxyFactory = WebRTCTransportProxyFactory;
139
+ //# sourceMappingURL=webrtc-transport-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webrtc-transport-proxy.js","sourceRoot":"","sources":["../../../src/transport/webrtc-transport-proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=webrtc-transport-proxy.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webrtc-transport-proxy.test.d.ts","sourceRoot":"","sources":["../../../src/transport/webrtc-transport-proxy.test.ts"],"names":[],"mappings":""}