@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,21 @@
1
+ "use strict";
2
+ //
3
+ // Copyright 2020 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 __exportStar = (this && this.__exportStar) || function(m, exports) {
17
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ __exportStar(require("./test-protocol"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;;;;;;;;;;;;AAEF,kDAAgC"}
@@ -0,0 +1,59 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import { EventEmitter } from 'events';
4
+ import { Extension, Protocol } from '@dxos/mesh-protocol';
5
+ export declare const getPeerId: (protocol: Protocol) => Buffer | undefined;
6
+ /**
7
+ * Object Implementing a p2p protocol (interaction across a set of peers using a common protocol)
8
+ * and an associated transport connection protocol (interaction with each individual peer over a single network
9
+ * transport connection).
10
+ */
11
+ export declare class TestProtocolPlugin extends EventEmitter {
12
+ /** @type {Map<string, {Protocol}>} */
13
+ _peers: Map<any, any>;
14
+ /** @type {Buffer} */
15
+ _peerId: Buffer;
16
+ /** @type {Boolean} */
17
+ _uppercase: boolean;
18
+ initCalled: boolean;
19
+ /**
20
+ * Test Protocol. Passes through messages unchanged, or folds to upper case.
21
+ * Provides a way to test that two protocols with different behavior are
22
+ * indeed being used with two different swarm keys.
23
+ * @param {Buffer} peerId
24
+ * @param {Boolean} uppercase Fold payload case to upper if set.
25
+ */
26
+ constructor(peerId: Buffer, uppercase?: boolean);
27
+ /**
28
+ * This node's id.
29
+ * @return {Buffer}
30
+ */
31
+ get peerId(): Buffer;
32
+ /**
33
+ * Array of the currently connected peers' node ids (not including our id).
34
+ * @return {{Protocol}[]}
35
+ */
36
+ get peers(): any[];
37
+ /**
38
+ * Factory function for Extensions (per-connection object).
39
+ * Called when a new peer transport connection is established.
40
+ * @return {Extension}
41
+ */
42
+ createExtension(): Extension;
43
+ /**
44
+ * Send/Receive messages with peer when initiating a request/response interaction.
45
+ * @param peerId Must be the value passed to the constructor on the responding node.
46
+ * @param payload Message to send
47
+ * @return Message received from peer in response to our request.
48
+ */
49
+ send(peerId: Buffer, payload: string): Promise<string>;
50
+ private _init;
51
+ _receive(protocol: Protocol, data: any): Promise<void>;
52
+ _onPeerConnect(protocol: Protocol): Promise<void>;
53
+ _onPeerDisconnect(protocol: Protocol): Promise<void>;
54
+ }
55
+ /**
56
+ * @return {ProtocolProvider}
57
+ */
58
+ export declare const testProtocolProvider: (swarmKey: Buffer, nodeId: Buffer, protocolPlugin: any) => import("..").ProtocolProvider;
59
+ //# sourceMappingURL=test-protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-protocol.d.ts","sourceRoot":"","sources":["../../../src/testing/test-protocol.ts"],"names":[],"mappings":";;AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAKtC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAO1D,eAAO,MAAM,SAAS,aAAc,QAAQ,uBAM3C,CAAC;AAEF;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,sCAAsC;IACtC,MAAM,gBAAC;IAEP,qBAAqB;IACrB,OAAO,SAAC;IAER,sBAAsB;IACtB,UAAU,UAAC;IAEX,UAAU,UAAS;IAEnB;;;;;;OAMG;gBACS,MAAM,EAAE,MAAM,EAAE,SAAS,UAAQ;IAU7C;;;OAGG;IACH,IAAI,MAAM,WAET;IAED;;;OAGG;IACH,IAAI,KAAK,UAER;IAED;;;;OAIG;IACH,eAAe;IAWf;;;;;OAKG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAW9C,KAAK;IAIb,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG;IAYtC,cAAc,CAAC,QAAQ,EAAE,QAAQ;IAcjC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ;CAS3C;AAED;;GAEG;AAEH,eAAO,MAAM,oBAAoB,aAAc,MAAM,UAAU,MAAM,kBAAkB,GAAG,kCAKtF,CAAC"}
@@ -0,0 +1,140 @@
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.testProtocolProvider = exports.TestProtocolPlugin = exports.getPeerId = void 0;
10
+ // Test/mock Protocol implementation used in network-manager tests.
11
+ const events_1 = require("events");
12
+ const node_assert_1 = __importDefault(require("node:assert"));
13
+ const keys_1 = require("@dxos/keys");
14
+ const log_1 = require("@dxos/log");
15
+ const mesh_protocol_1 = require("@dxos/mesh-protocol");
16
+ const protocol_factory_1 = require("../protocol-factory");
17
+ const EXTENSION_NAME = 'test';
18
+ // TODO(dboreham): This method should be added to Protocol (and one for "my ID"?).
19
+ const getPeerId = (protocol) => {
20
+ var _a;
21
+ const { peerId } = (_a = protocol.getSession()) !== null && _a !== void 0 ? _a : {};
22
+ if (!peerId) {
23
+ return undefined;
24
+ }
25
+ return keys_1.PublicKey.bufferize(peerId);
26
+ };
27
+ exports.getPeerId = getPeerId;
28
+ /**
29
+ * Object Implementing a p2p protocol (interaction across a set of peers using a common protocol)
30
+ * and an associated transport connection protocol (interaction with each individual peer over a single network
31
+ * transport connection).
32
+ */
33
+ class TestProtocolPlugin extends events_1.EventEmitter {
34
+ /**
35
+ * Test Protocol. Passes through messages unchanged, or folds to upper case.
36
+ * Provides a way to test that two protocols with different behavior are
37
+ * indeed being used with two different swarm keys.
38
+ * @param {Buffer} peerId
39
+ * @param {Boolean} uppercase Fold payload case to upper if set.
40
+ */
41
+ constructor(peerId, uppercase = false) {
42
+ super();
43
+ this.initCalled = false;
44
+ (0, node_assert_1.default)(Buffer.isBuffer(peerId));
45
+ // TODO(dboreham): Mis-named because this is OUR node ID, not the id of any peer.
46
+ this._peerId = peerId;
47
+ this._uppercase = uppercase;
48
+ this._peers = new Map();
49
+ }
50
+ /**
51
+ * This node's id.
52
+ * @return {Buffer}
53
+ */
54
+ get peerId() {
55
+ return this._peerId;
56
+ }
57
+ /**
58
+ * Array of the currently connected peers' node ids (not including our id).
59
+ * @return {{Protocol}[]}
60
+ */
61
+ get peers() {
62
+ return Array.from(this._peers.values());
63
+ }
64
+ /**
65
+ * Factory function for Extensions (per-connection object).
66
+ * Called when a new peer transport connection is established.
67
+ * @return {Extension}
68
+ */
69
+ createExtension() {
70
+ return new mesh_protocol_1.Extension(EXTENSION_NAME, { binary: true })
71
+ .setInitHandler(this._init.bind(this))
72
+ .setMessageHandler(this._receive.bind(this))
73
+ .setHandshakeHandler(this._onPeerConnect.bind(this))
74
+ .setCloseHandler(this._onPeerDisconnect.bind(this));
75
+ }
76
+ // Methods below are per-peer-connection.
77
+ // TODO(dboreham): Why are these here and not on Protocol?
78
+ /**
79
+ * Send/Receive messages with peer when initiating a request/response interaction.
80
+ * @param peerId Must be the value passed to the constructor on the responding node.
81
+ * @param payload Message to send
82
+ * @return Message received from peer in response to our request.
83
+ */
84
+ async send(peerId, payload) {
85
+ (0, node_assert_1.default)(Buffer.isBuffer(peerId));
86
+ const peerIdStr = keys_1.PublicKey.stringify(peerId);
87
+ const peer = this._peers.get(peerIdStr);
88
+ // TODO(dboreham): Throw fatal error if peer not found.
89
+ const extension = peer.getExtension(EXTENSION_NAME);
90
+ const encoded = Buffer.from(payload);
91
+ (0, log_1.log)('Sent', { peerIdStr, payload }, { file: "packages/core/mesh/network-manager/src/testing/test-protocol.ts", line: 106 });
92
+ return await extension.send(encoded, { oneway: true });
93
+ }
94
+ async _init(protocol) {
95
+ this.initCalled = true;
96
+ }
97
+ async _receive(protocol, data) {
98
+ const peerId = (0, exports.getPeerId)(protocol);
99
+ (0, node_assert_1.default)(peerId !== undefined);
100
+ const peerIdStr = keys_1.PublicKey.stringify(peerId);
101
+ let payload = data.data.toString();
102
+ if (this._uppercase) {
103
+ payload = payload.toUpperCase();
104
+ }
105
+ (0, log_1.log)('Received', { peerIdStr, payload }, { file: "packages/core/mesh/network-manager/src/testing/test-protocol.ts", line: 122 });
106
+ this.emit('receive', protocol, payload);
107
+ }
108
+ async _onPeerConnect(protocol) {
109
+ const peerId = (0, exports.getPeerId)(protocol);
110
+ if (peerId === undefined) {
111
+ return;
112
+ }
113
+ const peerIdStr = keys_1.PublicKey.stringify(peerId);
114
+ if (this._peers.has(peerIdStr)) {
115
+ return;
116
+ }
117
+ this._peers.set(peerIdStr, protocol);
118
+ this.emit('connect', protocol);
119
+ }
120
+ async _onPeerDisconnect(protocol) {
121
+ const peerId = (0, exports.getPeerId)(protocol);
122
+ if (peerId === undefined) {
123
+ return;
124
+ }
125
+ this._peers.delete(keys_1.PublicKey.stringify(peerId));
126
+ this.emit('disconnect', peerId);
127
+ }
128
+ }
129
+ exports.TestProtocolPlugin = TestProtocolPlugin;
130
+ /**
131
+ * @return {ProtocolProvider}
132
+ */
133
+ // TODO(dboreham): Try to encapsulate swarm_key, nodeId.
134
+ const testProtocolProvider = (swarmKey, nodeId, protocolPlugin) => (0, protocol_factory_1.protocolFactory)({
135
+ getTopics: () => [swarmKey],
136
+ session: { peerId: keys_1.PublicKey.stringify(nodeId) },
137
+ plugins: [protocolPlugin]
138
+ });
139
+ exports.testProtocolProvider = testProtocolProvider;
140
+ //# sourceMappingURL=test-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-protocol.js","sourceRoot":"","sources":["../../../src/testing/test-protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { PublicKey } from '@dxos/keys';
2
+ import { SwarmController, Topology } from './topology';
3
+ export declare class FullyConnectedTopology implements Topology {
4
+ private _controller?;
5
+ init(controller: SwarmController): void;
6
+ update(): void;
7
+ onOffer(peer: PublicKey): Promise<boolean>;
8
+ destroy(): Promise<void>;
9
+ toString(): string;
10
+ }
11
+ //# sourceMappingURL=fully-connected-topology.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fully-connected-topology.d.ts","sourceRoot":"","sources":["../../../src/topology/fully-connected-topology.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEvD,qBAAa,sBAAuB,YAAW,QAAQ;IACrD,OAAO,CAAC,WAAW,CAAC,CAAkB;IAEtC,IAAI,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI;IAKvC,MAAM,IAAI,IAAI;IAQR,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAI1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,QAAQ;CAGT"}
@@ -0,0 +1,34 @@
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.FullyConnectedTopology = void 0;
10
+ const node_assert_1 = __importDefault(require("node:assert"));
11
+ class FullyConnectedTopology {
12
+ init(controller) {
13
+ (0, node_assert_1.default)(!this._controller, 'Already initialized');
14
+ this._controller = controller;
15
+ }
16
+ update() {
17
+ (0, node_assert_1.default)(this._controller, 'Not initialized');
18
+ const { candidates: discovered } = this._controller.getState();
19
+ for (const peer of discovered) {
20
+ this._controller.connect(peer);
21
+ }
22
+ }
23
+ async onOffer(peer) {
24
+ return true;
25
+ }
26
+ async destroy() {
27
+ // Nothing to do.
28
+ }
29
+ toString() {
30
+ return 'FullyConnectedTopology';
31
+ }
32
+ }
33
+ exports.FullyConnectedTopology = FullyConnectedTopology;
34
+ //# sourceMappingURL=fully-connected-topology.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fully-connected-topology.js","sourceRoot":"","sources":["../../../src/topology/fully-connected-topology.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;;AAEF,8DAAiC;AAMjC,MAAa,sBAAsB;IAGjC,IAAI,CAAC,UAA2B;QAC9B,IAAA,qBAAM,EAAC,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;QACjD,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IAED,MAAM;QACJ,IAAA,qBAAM,EAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;QAC5C,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QAC/D,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE;YAC7B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAChC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAe;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO;QACX,iBAAiB;IACnB,CAAC;IAED,QAAQ;QACN,OAAO,wBAAwB,CAAC;IAClC,CAAC;CACF;AA3BD,wDA2BC"}
@@ -0,0 +1,5 @@
1
+ export * from './fully-connected-topology';
2
+ export * from './mmst-topology';
3
+ export * from './star-topology';
4
+ export * from './topology';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/topology/index.ts"],"names":[],"mappings":"AAIA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ //
3
+ // Copyright 2020 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 __exportStar = (this && this.__exportStar) || function(m, exports) {
17
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ __exportStar(require("./fully-connected-topology"), exports);
21
+ __exportStar(require("./mmst-topology"), exports);
22
+ __exportStar(require("./star-topology"), exports);
23
+ __exportStar(require("./topology"), exports);
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/topology/index.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;;;;;;;;;;;;AAEF,6DAA2C;AAC3C,kDAAgC;AAChC,kDAAgC;AAChC,6CAA2B"}
@@ -0,0 +1,31 @@
1
+ import { PublicKey } from '@dxos/keys';
2
+ import { SwarmController, Topology } from './topology';
3
+ export interface MMSTTopologyOptions {
4
+ /**
5
+ * Number of connections the peer will originate by itself.
6
+ */
7
+ originateConnections?: number;
8
+ /**
9
+ * Maximum number of connections allowed, all other connections will be dropped.
10
+ */
11
+ maxPeers?: number;
12
+ /**
13
+ * Size of random sample from which peer candidates are selected.
14
+ */
15
+ sampleSize?: number;
16
+ }
17
+ export declare class MMSTTopology implements Topology {
18
+ private readonly _originateConnections;
19
+ private readonly _maxPeers;
20
+ private readonly _sampleSize;
21
+ private _controller?;
22
+ private _sampleCollected;
23
+ constructor({ originateConnections, maxPeers, sampleSize }?: MMSTTopologyOptions);
24
+ init(controller: SwarmController): void;
25
+ update(): void;
26
+ onOffer(peer: PublicKey): Promise<boolean>;
27
+ destroy(): Promise<void>;
28
+ private _runAlgorithm;
29
+ toString(): string;
30
+ }
31
+ //# sourceMappingURL=mmst-topology.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mmst-topology.d.ts","sourceRoot":"","sources":["../../../src/topology/mmst-topology.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,YAAa,YAAW,QAAQ;IAC3C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,OAAO,CAAC,WAAW,CAAC,CAAkB;IAEtC,OAAO,CAAC,gBAAgB,CAAS;gBAErB,EAAE,oBAAwB,EAAE,QAAY,EAAE,UAAe,EAAE,GAAE,mBAAwB;IAMjG,IAAI,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI;IAKvC,MAAM,IAAI,IAAI;IAWR,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,OAAO,CAAC,aAAa;IAwBrB,QAAQ;CAGT"}
@@ -0,0 +1,73 @@
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.MMSTTopology = void 0;
10
+ const node_assert_1 = __importDefault(require("node:assert"));
11
+ const xor_distance_1 = __importDefault(require("xor-distance"));
12
+ const log_1 = require("@dxos/log");
13
+ class MMSTTopology {
14
+ constructor({ originateConnections = 2, maxPeers = 4, sampleSize = 10 } = {}) {
15
+ this._sampleCollected = false;
16
+ this._originateConnections = originateConnections;
17
+ this._maxPeers = maxPeers;
18
+ this._sampleSize = sampleSize;
19
+ }
20
+ init(controller) {
21
+ (0, node_assert_1.default)(!this._controller, 'Already initialized');
22
+ this._controller = controller;
23
+ }
24
+ update() {
25
+ (0, node_assert_1.default)(this._controller, 'Not initialized');
26
+ const { connected, candidates } = this._controller.getState();
27
+ // Run the algorithms if we have first candidates, ran it before, or have more connections than needed.
28
+ if (this._sampleCollected || connected.length > this._maxPeers || candidates.length > 0) {
29
+ (0, log_1.log)('Running the algorithm.', {}, { file: "packages/core/mesh/network-manager/src/topology/mmst-topology.ts", line: 55 });
30
+ this._sampleCollected = true;
31
+ this._runAlgorithm();
32
+ }
33
+ }
34
+ async onOffer(peer) {
35
+ (0, node_assert_1.default)(this._controller, 'Not initialized');
36
+ const { connected } = this._controller.getState();
37
+ const accept = connected.length < this._maxPeers;
38
+ (0, log_1.log)(`Offer ${peer} accept=${accept}`, {}, { file: "packages/core/mesh/network-manager/src/topology/mmst-topology.ts", line: 65 });
39
+ return accept;
40
+ }
41
+ async destroy() {
42
+ // Nothing to do.
43
+ }
44
+ _runAlgorithm() {
45
+ (0, node_assert_1.default)(this._controller, 'Not initialized');
46
+ const { connected, candidates, ownPeerId } = this._controller.getState();
47
+ if (connected.length > this._maxPeers) {
48
+ // Disconnect extra peers.
49
+ const sorted = sortByXorDistance(connected, ownPeerId)
50
+ .reverse()
51
+ .slice(0, this._maxPeers - connected.length);
52
+ for (const peer of sorted) {
53
+ (0, log_1.log)(`Disconnect ${peer}.`, {}, { file: "packages/core/mesh/network-manager/src/topology/mmst-topology.ts", line: 83 });
54
+ this._controller.disconnect(peer);
55
+ }
56
+ }
57
+ else if (connected.length < this._originateConnections) {
58
+ // Connect new peers to reach desired quota.
59
+ const sample = candidates.sort(() => Math.random() - 0.5).slice(0, this._sampleSize);
60
+ const sorted = sortByXorDistance(sample, ownPeerId).slice(0, this._originateConnections - connected.length);
61
+ for (const peer of sorted) {
62
+ (0, log_1.log)(`Connect ${peer}.`, {}, { file: "packages/core/mesh/network-manager/src/topology/mmst-topology.ts", line: 91 });
63
+ this._controller.connect(peer);
64
+ }
65
+ }
66
+ }
67
+ toString() {
68
+ return 'MMSTTopology';
69
+ }
70
+ }
71
+ exports.MMSTTopology = MMSTTopology;
72
+ const sortByXorDistance = (keys, reference) => keys.sort((a, b) => xor_distance_1.default.gt((0, xor_distance_1.default)(a.asBuffer(), reference.asBuffer()), (0, xor_distance_1.default)(b.asBuffer(), reference.asBuffer())));
73
+ //# sourceMappingURL=mmst-topology.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mmst-topology.js","sourceRoot":"","sources":["../../../src/topology/mmst-topology.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { PublicKey } from '@dxos/keys';
2
+ import { SwarmController, Topology } from './topology';
3
+ export declare class StarTopology implements Topology {
4
+ private readonly _centralPeer;
5
+ private _controller?;
6
+ constructor(_centralPeer: PublicKey);
7
+ toString(): string;
8
+ init(controller: SwarmController): void;
9
+ update(): void;
10
+ onOffer(peer: PublicKey): Promise<boolean>;
11
+ destroy(): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=star-topology.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"star-topology.d.ts","sourceRoot":"","sources":["../../../src/topology/star-topology.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEvD,qBAAa,YAAa,YAAW,QAAQ;IAKzC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAJ/B,OAAO,CAAC,WAAW,CAAC,CAAkB;gBAInB,YAAY,EAAE,SAAS;IAG1C,QAAQ;IAIR,IAAI,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI;IAKvC,MAAM,IAAI,IAAI;IAwBR,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAW1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
@@ -0,0 +1,60 @@
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.StarTopology = void 0;
10
+ const node_assert_1 = __importDefault(require("node:assert"));
11
+ const log_1 = require("@dxos/log");
12
+ class StarTopology {
13
+ // prettier-ignore
14
+ constructor(_centralPeer) {
15
+ this._centralPeer = _centralPeer;
16
+ }
17
+ toString() {
18
+ return `StarTopology(${this._centralPeer.truncate()})`;
19
+ }
20
+ init(controller) {
21
+ (0, node_assert_1.default)(!this._controller, 'Already initialized.');
22
+ this._controller = controller;
23
+ }
24
+ update() {
25
+ (0, node_assert_1.default)(this._controller, 'Not initialized.');
26
+ const { candidates, connected, ownPeerId } = this._controller.getState();
27
+ if (!ownPeerId.equals(this._centralPeer)) {
28
+ (0, log_1.log)('leaf peer dropping all connections apart from central peer.', {}, { file: "packages/core/mesh/network-manager/src/topology/star-topology.ts", line: 33 });
29
+ // Drop all connections other than central peer.
30
+ for (const peer of connected) {
31
+ if (!peer.equals(this._centralPeer)) {
32
+ (0, log_1.log)('dropping connection', { peer }, { file: "packages/core/mesh/network-manager/src/topology/star-topology.ts", line: 38 });
33
+ this._controller.disconnect(peer);
34
+ }
35
+ }
36
+ }
37
+ for (const peer of candidates) {
38
+ // Connect to central peer.
39
+ if (peer.equals(this._centralPeer) || ownPeerId.equals(this._centralPeer)) {
40
+ (0, log_1.log)('connecting to peer', { peer }, { file: "packages/core/mesh/network-manager/src/topology/star-topology.ts", line: 47 });
41
+ this._controller.connect(peer);
42
+ }
43
+ }
44
+ }
45
+ async onOffer(peer) {
46
+ (0, node_assert_1.default)(this._controller, 'Not initialized.');
47
+ const { ownPeerId } = this._controller.getState();
48
+ (0, log_1.log)('offer', {
49
+ peer,
50
+ isCentral: peer.equals(this._centralPeer),
51
+ isSelfCentral: ownPeerId.equals(this._centralPeer)
52
+ }, { file: "packages/core/mesh/network-manager/src/topology/star-topology.ts", line: 56 });
53
+ return ownPeerId.equals(this._centralPeer) || peer.equals(this._centralPeer);
54
+ }
55
+ async destroy() {
56
+ // Nothing to do.
57
+ }
58
+ }
59
+ exports.StarTopology = StarTopology;
60
+ //# sourceMappingURL=star-topology.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"star-topology.js","sourceRoot":"","sources":["../../../src/topology/star-topology.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;;AAEF,8DAAiC;AAGjC,mCAAgC;AAIhC,MAAa,YAAY;IAGvB,kBAAkB;IAClB,YACmB,YAAuB;QAAvB,iBAAY,GAAZ,YAAY,CAAW;IACvC,CAAC;IAEJ,QAAQ;QACN,OAAO,gBAAgB,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC;IACzD,CAAC;IAED,IAAI,CAAC,UAA2B;QAC9B,IAAA,qBAAM,EAAC,CAAC,IAAI,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC;QAClD,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IAED,MAAM;QACJ,IAAA,qBAAM,EAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAC7C,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QACzE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;YACxC,IAAA,SAAG,EAAC,6DAA6D,6FAAC,CAAC;YAEnE,gDAAgD;YAChD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE;gBAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;oBACnC,IAAA,SAAG,EAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,yFAAC,CAAC;oBACrC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;iBACnC;aACF;SACF;QAED,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE;YAC7B,2BAA2B;YAC3B,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;gBACzE,IAAA,SAAG,EAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,yFAAC,CAAC;gBACpC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;aAChC;SACF;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAe;QAC3B,IAAA,qBAAM,EAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAC7C,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QAClD,IAAA,SAAG,EAAC,OAAO,EAAE;YACX,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;YACzC,aAAa,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;SACnD,yFAAC,CAAC;QACH,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC/E,CAAC;IAED,KAAK,CAAC,OAAO;QACX,iBAAiB;IACnB,CAAC;CACF;AAvDD,oCAuDC"}
@@ -0,0 +1,56 @@
1
+ import { PublicKey } from '@dxos/keys';
2
+ export interface SwarmController {
3
+ /**
4
+ * Get current state.
5
+ */
6
+ getState(): SwarmState;
7
+ /**
8
+ * Initiate a connection.
9
+ */
10
+ connect(peer: PublicKey): void;
11
+ /**
12
+ * Disconnect from a peer.
13
+ */
14
+ disconnect(peer: PublicKey): void;
15
+ }
16
+ export interface SwarmState {
17
+ /**
18
+ * This node's peer Id.
19
+ */
20
+ ownPeerId: PublicKey;
21
+ /**
22
+ * Peers with established connections.
23
+ */
24
+ connected: PublicKey[];
25
+ /**
26
+ * Candidates for connection. Does not intersect with a set of already connected peers.
27
+ */
28
+ candidates: PublicKey[];
29
+ }
30
+ export interface Topology {
31
+ /**
32
+ * Called when swarm is created.
33
+ *
34
+ * May be used to bind the swarm controller and initialize any asynchronous actions.
35
+ *
36
+ * @param controller
37
+ */
38
+ init(controller: SwarmController): void;
39
+ /**
40
+ * Called when swarm state is updated.
41
+ */
42
+ update(): void;
43
+ /**
44
+ * Called when remote peer offers a connection.
45
+ *
46
+ * @returns true - to accept the connection, false - to reject.
47
+ */
48
+ onOffer(peer: PublicKey): Promise<boolean>;
49
+ /**
50
+ * Called when swarm is destroyed or topology is changed.
51
+ *
52
+ * Any error thrown here will be a critical error for the swarm.
53
+ */
54
+ destroy(): Promise<void>;
55
+ }
56
+ //# sourceMappingURL=topology.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topology.d.ts","sourceRoot":"","sources":["../../../src/topology/topology.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,QAAQ,IAAI,UAAU,CAAC;IAEvB;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IAE/B;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,SAAS,EAAE,SAAS,CAAC;IAErB;;OAEG;IACH,SAAS,EAAE,SAAS,EAAE,CAAC;IAEvB;;OAEG;IACH,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,QAAQ;IACvB;;;;;;OAMG;IACH,IAAI,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IAExC;;OAEG;IACH,MAAM,IAAI,IAAI,CAAC;IAEf;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3C;;;;OAIG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ //
3
+ // Copyright 2020 DXOS.org
4
+ //
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=topology.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topology.js","sourceRoot":"","sources":["../../../src/topology/topology.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE"}
@@ -0,0 +1,6 @@
1
+ export * from './memory-transport';
2
+ export * from './transport';
3
+ export * from './webrtc-transport';
4
+ export * from './webrtc-transport-service';
5
+ export * from './webrtc-transport-proxy';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/transport/index.ts"],"names":[],"mappings":"AAIA,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ //
3
+ // Copyright 2020 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 __exportStar = (this && this.__exportStar) || function(m, exports) {
17
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ __exportStar(require("./memory-transport"), exports);
21
+ __exportStar(require("./transport"), exports);
22
+ __exportStar(require("./webrtc-transport"), exports);
23
+ __exportStar(require("./webrtc-transport-service"), exports);
24
+ __exportStar(require("./webrtc-transport-proxy"), exports);
25
+ //# sourceMappingURL=index.js.map