@dxos/network-manager 0.1.13 → 0.1.16

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 (256) hide show
  1. package/dist/lib/browser/index.mjs +2127 -0
  2. package/dist/lib/browser/index.mjs.map +7 -0
  3. package/dist/lib/browser/meta.json +1 -0
  4. package/dist/lib/browser/testing/index.mjs +2197 -0
  5. package/dist/lib/browser/testing/index.mjs.map +7 -0
  6. package/dist/lib/node/index.cjs +2173 -0
  7. package/dist/lib/node/index.cjs.map +7 -0
  8. package/dist/lib/node/meta.json +1 -0
  9. package/dist/lib/node/testing/index.cjs +2225 -0
  10. package/dist/lib/node/testing/index.cjs.map +7 -0
  11. package/dist/{src → types/src}/connection-log.d.ts +0 -0
  12. package/dist/types/src/connection-log.d.ts.map +1 -0
  13. package/dist/{src → types/src}/index.d.ts +1 -0
  14. package/dist/types/src/index.d.ts.map +1 -0
  15. package/dist/{src → types/src}/network-manager.d.ts +9 -11
  16. package/dist/types/src/network-manager.d.ts.map +1 -0
  17. package/dist/{src → types/src}/protocol-factory.d.ts +11 -5
  18. package/dist/types/src/protocol-factory.d.ts.map +1 -0
  19. package/dist/{src → types/src}/signal/index.d.ts +0 -0
  20. package/dist/types/src/signal/index.d.ts.map +1 -0
  21. package/dist/{src → types/src}/signal/integration.test.d.ts +0 -0
  22. package/dist/types/src/signal/integration.test.d.ts.map +1 -0
  23. package/dist/{src → types/src}/signal/message-router.d.ts +0 -0
  24. package/dist/types/src/signal/message-router.d.ts.map +1 -0
  25. package/dist/{src → types/src}/signal/message-router.test.d.ts +0 -0
  26. package/dist/types/src/signal/message-router.test.d.ts.map +1 -0
  27. package/dist/{src → types/src}/signal/signal-connection.d.ts +0 -0
  28. package/dist/types/src/signal/signal-connection.d.ts.map +1 -0
  29. package/dist/{src → types/src}/signal/signal-messenger.d.ts +0 -0
  30. package/dist/types/src/signal/signal-messenger.d.ts.map +1 -0
  31. package/dist/{src → types/src}/swarm/connection.d.ts +5 -17
  32. package/dist/types/src/swarm/connection.d.ts.map +1 -0
  33. package/dist/{src → types/src}/swarm/index.d.ts +0 -0
  34. package/dist/types/src/swarm/index.d.ts.map +1 -0
  35. package/dist/types/src/swarm/peer.d.ts +70 -0
  36. package/dist/types/src/swarm/peer.d.ts.map +1 -0
  37. package/dist/{src → types/src}/swarm/swarm-mapper.d.ts +1 -1
  38. package/dist/types/src/swarm/swarm-mapper.d.ts.map +1 -0
  39. package/dist/{src → types/src}/swarm/swarm.d.ts +4 -8
  40. package/dist/types/src/swarm/swarm.d.ts.map +1 -0
  41. package/dist/{src → types/src}/swarm/swarm.test.d.ts +0 -0
  42. package/dist/types/src/swarm/swarm.test.d.ts.map +1 -0
  43. package/dist/{src → types/src}/testing/index.d.ts +0 -0
  44. package/dist/types/src/testing/index.d.ts.map +1 -0
  45. package/dist/{src → types/src}/testing/test-builder.d.ts +1 -1
  46. package/dist/types/src/testing/test-builder.d.ts.map +1 -0
  47. package/dist/{src → types/src}/testing/test-protocol.d.ts +2 -2
  48. package/dist/types/src/testing/test-protocol.d.ts.map +1 -0
  49. package/dist/{src → types/src}/tests/basic-test-suite.d.ts +0 -0
  50. package/dist/types/src/tests/basic-test-suite.d.ts.map +1 -0
  51. package/dist/{src → types/src}/tests/memory-transport.test.d.ts +0 -0
  52. package/dist/types/src/tests/memory-transport.test.d.ts.map +1 -0
  53. package/dist/{src → types/src}/tests/presence.test.d.ts +0 -0
  54. package/dist/types/src/tests/presence.test.d.ts.map +1 -0
  55. package/dist/{src → types/src}/tests/property-test-suite.d.ts +0 -0
  56. package/dist/types/src/tests/property-test-suite.d.ts.map +1 -0
  57. package/dist/{src → types/src}/tests/utils.d.ts +0 -0
  58. package/dist/types/src/tests/utils.d.ts.map +1 -0
  59. package/dist/{src → types/src}/tests/webrtc-transport.test.d.ts +0 -0
  60. package/dist/types/src/tests/webrtc-transport.test.d.ts.map +1 -0
  61. package/dist/{src → types/src}/topology/fully-connected-topology.d.ts +0 -0
  62. package/dist/types/src/topology/fully-connected-topology.d.ts.map +1 -0
  63. package/dist/{src → types/src}/topology/index.d.ts +0 -0
  64. package/dist/types/src/topology/index.d.ts.map +1 -0
  65. package/dist/{src → types/src}/topology/mmst-topology.d.ts +0 -0
  66. package/dist/types/src/topology/mmst-topology.d.ts.map +1 -0
  67. package/dist/{src → types/src}/topology/star-topology.d.ts +0 -0
  68. package/dist/types/src/topology/star-topology.d.ts.map +1 -0
  69. package/dist/{src → types/src}/topology/topology.d.ts +0 -0
  70. package/dist/types/src/topology/topology.d.ts.map +1 -0
  71. package/dist/{src → types/src}/transport/index.d.ts +0 -0
  72. package/dist/types/src/transport/index.d.ts.map +1 -0
  73. package/dist/{src → types/src}/transport/memory-transport.d.ts +0 -0
  74. package/dist/types/src/transport/memory-transport.d.ts.map +1 -0
  75. package/dist/{src → types/src}/transport/memory-transport.test.d.ts +0 -0
  76. package/dist/types/src/transport/memory-transport.test.d.ts.map +1 -0
  77. package/dist/{src → types/src}/transport/transport.d.ts +1 -1
  78. package/dist/types/src/transport/transport.d.ts.map +1 -0
  79. package/dist/{src → types/src}/transport/webrtc-simple-peer.test.d.ts +0 -0
  80. package/dist/types/src/transport/webrtc-simple-peer.test.d.ts.map +1 -0
  81. package/dist/{src → types/src}/transport/webrtc-transport-proxy.d.ts +1 -1
  82. package/dist/types/src/transport/webrtc-transport-proxy.d.ts.map +1 -0
  83. package/dist/{src → types/src}/transport/webrtc-transport-proxy.test.d.ts +0 -0
  84. package/dist/types/src/transport/webrtc-transport-proxy.test.d.ts.map +1 -0
  85. package/dist/{src → types/src}/transport/webrtc-transport-service.d.ts +0 -0
  86. package/dist/types/src/transport/webrtc-transport-service.d.ts.map +1 -0
  87. package/dist/{src → types/src}/transport/webrtc-transport.d.ts +1 -1
  88. package/dist/types/src/transport/webrtc-transport.d.ts.map +1 -0
  89. package/dist/{src → types/src}/transport/webrtc-transport.test.d.ts +0 -0
  90. package/dist/types/src/transport/webrtc-transport.test.d.ts.map +1 -0
  91. package/dist/{src → types/src}/transport/webrtc.d.ts +0 -0
  92. package/dist/types/src/transport/webrtc.d.ts.map +1 -0
  93. package/dist/types/src/types.d.ts +6 -0
  94. package/dist/types/src/types.d.ts.map +1 -0
  95. package/dist/types/src/wire-protocol.d.ts +37 -0
  96. package/dist/types/src/wire-protocol.d.ts.map +1 -0
  97. package/package.json +24 -22
  98. package/src/connection-log.ts +8 -8
  99. package/src/globals.d.ts +1 -1
  100. package/src/index.ts +1 -0
  101. package/src/network-manager.ts +14 -5
  102. package/src/protocol-factory.ts +7 -4
  103. package/src/signal/integration.test.ts +8 -7
  104. package/src/signal/message-router.test.ts +14 -15
  105. package/src/signal/message-router.ts +1 -1
  106. package/src/swarm/connection.ts +11 -55
  107. package/src/swarm/peer.ts +119 -30
  108. package/src/swarm/swarm.test.ts +9 -8
  109. package/src/swarm/swarm.ts +97 -116
  110. package/src/testing/test-builder.ts +4 -1
  111. package/src/testing/test-protocol.ts +1 -1
  112. package/src/tests/basic-test-suite.ts +7 -6
  113. package/src/tests/memory-transport.test.ts +1 -1
  114. package/src/tests/presence.test.ts +5 -4
  115. package/src/tests/property-test-suite.ts +4 -3
  116. package/src/tests/utils.ts +1 -1
  117. package/src/tests/webrtc-transport.test.ts +2 -2
  118. package/src/transport/memory-transport.test.ts +4 -4
  119. package/src/transport/memory-transport.ts +5 -5
  120. package/src/transport/webrtc-simple-peer.test.ts +13 -10
  121. package/src/transport/webrtc-transport-proxy.test.ts +9 -13
  122. package/src/transport/webrtc-transport-proxy.ts +1 -1
  123. package/src/transport/webrtc-transport-service.ts +2 -2
  124. package/src/transport/webrtc-transport.test.ts +4 -4
  125. package/src/transport/webrtc-transport.ts +3 -3
  126. package/src/wire-protocol.ts +75 -0
  127. package/testing.d.ts +1 -1
  128. package/testing.js +1 -1
  129. package/dist/src/connection-log.d.ts.map +0 -1
  130. package/dist/src/connection-log.js +0 -98
  131. package/dist/src/connection-log.js.map +0 -1
  132. package/dist/src/index.d.ts.map +0 -1
  133. package/dist/src/index.js +0 -28
  134. package/dist/src/index.js.map +0 -1
  135. package/dist/src/network-manager.d.ts.map +0 -1
  136. package/dist/src/network-manager.js +0 -118
  137. package/dist/src/network-manager.js.map +0 -1
  138. package/dist/src/protocol-factory.d.ts.map +0 -1
  139. package/dist/src/protocol-factory.js +0 -66
  140. package/dist/src/protocol-factory.js.map +0 -1
  141. package/dist/src/signal/index.d.ts.map +0 -1
  142. package/dist/src/signal/index.js +0 -23
  143. package/dist/src/signal/index.js.map +0 -1
  144. package/dist/src/signal/integration.test.d.ts.map +0 -1
  145. package/dist/src/signal/integration.test.js +0 -105
  146. package/dist/src/signal/integration.test.js.map +0 -1
  147. package/dist/src/signal/message-router.d.ts.map +0 -1
  148. package/dist/src/signal/message-router.js +0 -135
  149. package/dist/src/signal/message-router.js.map +0 -1
  150. package/dist/src/signal/message-router.test.d.ts.map +0 -1
  151. package/dist/src/signal/message-router.test.js +0 -211
  152. package/dist/src/signal/message-router.test.js.map +0 -1
  153. package/dist/src/signal/signal-connection.d.ts.map +0 -1
  154. package/dist/src/signal/signal-connection.js +0 -6
  155. package/dist/src/signal/signal-connection.js.map +0 -1
  156. package/dist/src/signal/signal-messenger.d.ts.map +0 -1
  157. package/dist/src/signal/signal-messenger.js +0 -6
  158. package/dist/src/signal/signal-messenger.js.map +0 -1
  159. package/dist/src/swarm/connection.d.ts.map +0 -1
  160. package/dist/src/swarm/connection.js +0 -204
  161. package/dist/src/swarm/connection.js.map +0 -1
  162. package/dist/src/swarm/index.d.ts.map +0 -1
  163. package/dist/src/swarm/index.js +0 -23
  164. package/dist/src/swarm/index.js.map +0 -1
  165. package/dist/src/swarm/peer.d.ts +0 -45
  166. package/dist/src/swarm/peer.d.ts.map +0 -1
  167. package/dist/src/swarm/peer.js +0 -113
  168. package/dist/src/swarm/peer.js.map +0 -1
  169. package/dist/src/swarm/swarm-mapper.d.ts.map +0 -1
  170. package/dist/src/swarm/swarm-mapper.js +0 -92
  171. package/dist/src/swarm/swarm-mapper.js.map +0 -1
  172. package/dist/src/swarm/swarm.d.ts.map +0 -1
  173. package/dist/src/swarm/swarm.js +0 -305
  174. package/dist/src/swarm/swarm.js.map +0 -1
  175. package/dist/src/swarm/swarm.test.d.ts.map +0 -1
  176. package/dist/src/swarm/swarm.test.js +0 -135
  177. package/dist/src/swarm/swarm.test.js.map +0 -1
  178. package/dist/src/testing/index.d.ts.map +0 -1
  179. package/dist/src/testing/index.js +0 -22
  180. package/dist/src/testing/index.js.map +0 -1
  181. package/dist/src/testing/test-builder.d.ts.map +0 -1
  182. package/dist/src/testing/test-builder.js +0 -145
  183. package/dist/src/testing/test-builder.js.map +0 -1
  184. package/dist/src/testing/test-protocol.d.ts.map +0 -1
  185. package/dist/src/testing/test-protocol.js +0 -143
  186. package/dist/src/testing/test-protocol.js.map +0 -1
  187. package/dist/src/tests/basic-test-suite.d.ts.map +0 -1
  188. package/dist/src/tests/basic-test-suite.js +0 -142
  189. package/dist/src/tests/basic-test-suite.js.map +0 -1
  190. package/dist/src/tests/memory-transport.test.d.ts.map +0 -1
  191. package/dist/src/tests/memory-transport.test.js +0 -12
  192. package/dist/src/tests/memory-transport.test.js.map +0 -1
  193. package/dist/src/tests/presence.test.d.ts.map +0 -1
  194. package/dist/src/tests/presence.test.js +0 -61
  195. package/dist/src/tests/presence.test.js.map +0 -1
  196. package/dist/src/tests/property-test-suite.d.ts.map +0 -1
  197. package/dist/src/tests/property-test-suite.js +0 -203
  198. package/dist/src/tests/property-test-suite.js.map +0 -1
  199. package/dist/src/tests/utils.d.ts.map +0 -1
  200. package/dist/src/tests/utils.js +0 -76
  201. package/dist/src/tests/utils.js.map +0 -1
  202. package/dist/src/tests/webrtc-transport.test.d.ts.map +0 -1
  203. package/dist/src/tests/webrtc-transport.test.js +0 -16
  204. package/dist/src/tests/webrtc-transport.test.js.map +0 -1
  205. package/dist/src/topology/fully-connected-topology.d.ts.map +0 -1
  206. package/dist/src/topology/fully-connected-topology.js +0 -35
  207. package/dist/src/topology/fully-connected-topology.js.map +0 -1
  208. package/dist/src/topology/index.d.ts.map +0 -1
  209. package/dist/src/topology/index.js +0 -24
  210. package/dist/src/topology/index.js.map +0 -1
  211. package/dist/src/topology/mmst-topology.d.ts.map +0 -1
  212. package/dist/src/topology/mmst-topology.js +0 -73
  213. package/dist/src/topology/mmst-topology.js.map +0 -1
  214. package/dist/src/topology/star-topology.d.ts.map +0 -1
  215. package/dist/src/topology/star-topology.js +0 -60
  216. package/dist/src/topology/star-topology.js.map +0 -1
  217. package/dist/src/topology/topology.d.ts.map +0 -1
  218. package/dist/src/topology/topology.js +0 -6
  219. package/dist/src/topology/topology.js.map +0 -1
  220. package/dist/src/transport/index.d.ts.map +0 -1
  221. package/dist/src/transport/index.js +0 -25
  222. package/dist/src/transport/index.js.map +0 -1
  223. package/dist/src/transport/memory-transport.d.ts.map +0 -1
  224. package/dist/src/transport/memory-transport.js +0 -138
  225. package/dist/src/transport/memory-transport.js.map +0 -1
  226. package/dist/src/transport/memory-transport.test.d.ts.map +0 -1
  227. package/dist/src/transport/memory-transport.test.js +0 -96
  228. package/dist/src/transport/memory-transport.test.js.map +0 -1
  229. package/dist/src/transport/transport.d.ts.map +0 -1
  230. package/dist/src/transport/transport.js +0 -6
  231. package/dist/src/transport/transport.js.map +0 -1
  232. package/dist/src/transport/webrtc-simple-peer.test.d.ts.map +0 -1
  233. package/dist/src/transport/webrtc-simple-peer.test.js +0 -24
  234. package/dist/src/transport/webrtc-simple-peer.test.js.map +0 -1
  235. package/dist/src/transport/webrtc-transport-proxy.d.ts.map +0 -1
  236. package/dist/src/transport/webrtc-transport-proxy.js +0 -139
  237. package/dist/src/transport/webrtc-transport-proxy.js.map +0 -1
  238. package/dist/src/transport/webrtc-transport-proxy.test.d.ts.map +0 -1
  239. package/dist/src/transport/webrtc-transport-proxy.test.js +0 -219
  240. package/dist/src/transport/webrtc-transport-proxy.test.js.map +0 -1
  241. package/dist/src/transport/webrtc-transport-service.d.ts.map +0 -1
  242. package/dist/src/transport/webrtc-transport-service.js +0 -93
  243. package/dist/src/transport/webrtc-transport-service.js.map +0 -1
  244. package/dist/src/transport/webrtc-transport.d.ts.map +0 -1
  245. package/dist/src/transport/webrtc-transport.js +0 -77
  246. package/dist/src/transport/webrtc-transport.js.map +0 -1
  247. package/dist/src/transport/webrtc-transport.test.d.ts.map +0 -1
  248. package/dist/src/transport/webrtc-transport.test.js +0 -91
  249. package/dist/src/transport/webrtc-transport.test.js.map +0 -1
  250. package/dist/src/transport/webrtc.d.ts.map +0 -1
  251. package/dist/src/transport/webrtc.js +0 -17
  252. package/dist/src/transport/webrtc.js.map +0 -1
  253. package/dist/src/types.d.ts +0 -6
  254. package/dist/src/types.d.ts.map +0 -1
  255. package/dist/src/types.js +0 -6
  256. package/dist/src/types.js.map +0 -1
@@ -0,0 +1,2173 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
+ mod
23
+ ));
24
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
25
+
26
+ // packages/core/mesh/network-manager/src/index.ts
27
+ var src_exports = {};
28
+ __export(src_exports, {
29
+ Connection: () => Connection,
30
+ ConnectionLog: () => ConnectionLog,
31
+ ConnectionState: () => ConnectionState,
32
+ EventType: () => EventType,
33
+ FullyConnectedTopology: () => FullyConnectedTopology,
34
+ MMSTTopology: () => MMSTTopology,
35
+ MemoryTransport: () => MemoryTransport,
36
+ MemoryTransportFactory: () => MemoryTransportFactory,
37
+ MessageRouter: () => MessageRouter,
38
+ NetworkManager: () => NetworkManager,
39
+ StarTopology: () => StarTopology,
40
+ Swarm: () => Swarm,
41
+ SwarmMapper: () => SwarmMapper,
42
+ WebRTCTransport: () => WebRTCTransport,
43
+ WebRTCTransportProxy: () => WebRTCTransportProxy,
44
+ WebRTCTransportProxyFactory: () => WebRTCTransportProxyFactory,
45
+ WebRTCTransportService: () => WebRTCTransportService,
46
+ adaptProtocolProvider: () => adaptProtocolProvider,
47
+ createProtocolFactory: () => createProtocolFactory,
48
+ createTeleportProtocolFactory: () => createTeleportProtocolFactory,
49
+ createWebRTCTransportFactory: () => createWebRTCTransportFactory,
50
+ protocolFactory: () => protocolFactory,
51
+ transportProtocolProvider: () => transportProtocolProvider
52
+ });
53
+ module.exports = __toCommonJS(src_exports);
54
+
55
+ // packages/core/mesh/network-manager/src/connection-log.ts
56
+ var import_async5 = require("@dxos/async");
57
+ var import_debug3 = require("@dxos/debug");
58
+ var import_keys5 = require("@dxos/keys");
59
+ var import_util4 = require("@dxos/util");
60
+
61
+ // packages/core/mesh/network-manager/src/swarm/connection.ts
62
+ var import_node_assert = __toESM(require("node:assert"));
63
+ var import_async = require("@dxos/async");
64
+ var import_debug = require("@dxos/debug");
65
+ var import_log = require("@dxos/log");
66
+ var __decorate = function(decorators, target, key, desc) {
67
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
68
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
69
+ r = Reflect.decorate(decorators, target, key, desc);
70
+ else
71
+ for (var i = decorators.length - 1; i >= 0; i--)
72
+ if (d = decorators[i])
73
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
74
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
75
+ };
76
+ var ConnectionState;
77
+ (function(ConnectionState4) {
78
+ ConnectionState4["INITIAL"] = "INITIAL";
79
+ ConnectionState4["CONNECTING"] = "CONNECTING";
80
+ ConnectionState4["CONNECTED"] = "CONNECTED";
81
+ ConnectionState4["CLOSED"] = "CLOSED";
82
+ })(ConnectionState || (ConnectionState = {}));
83
+ var Connection = class {
84
+ constructor(topic, ownId, remoteId, sessionId, initiator, _signalMessaging, _protocol, _transportFactory) {
85
+ this.topic = topic;
86
+ this.ownId = ownId;
87
+ this.remoteId = remoteId;
88
+ this.sessionId = sessionId;
89
+ this.initiator = initiator;
90
+ this._signalMessaging = _signalMessaging;
91
+ this._protocol = _protocol;
92
+ this._transportFactory = _transportFactory;
93
+ this._state = ConnectionState.INITIAL;
94
+ this._bufferedSignals = [];
95
+ this.stateChanged = new import_async.Event();
96
+ this.errors = new import_debug.ErrorStream();
97
+ }
98
+ get state() {
99
+ return this._state;
100
+ }
101
+ get transport() {
102
+ return this._transport;
103
+ }
104
+ get protocol() {
105
+ return this._protocol;
106
+ }
107
+ openConnection() {
108
+ (0, import_node_assert.default)(this._state === ConnectionState.INITIAL, "Invalid state.");
109
+ this._changeState(ConnectionState.CONNECTING);
110
+ this._protocol.initialize().catch((err) => {
111
+ this.errors.raise(err);
112
+ });
113
+ (0, import_node_assert.default)(!this._transport);
114
+ this._transport = this._transportFactory.createTransport({
115
+ initiator: this.initiator,
116
+ stream: this._protocol.stream,
117
+ sendSignal: async (signal) => {
118
+ await this._signalMessaging.signal({
119
+ author: this.ownId,
120
+ recipient: this.remoteId,
121
+ sessionId: this.sessionId,
122
+ topic: this.topic,
123
+ data: {
124
+ signal
125
+ }
126
+ });
127
+ }
128
+ });
129
+ this._transport.connected.once(() => {
130
+ this._changeState(ConnectionState.CONNECTED);
131
+ });
132
+ this._transport.closed.once(() => {
133
+ this._transport = void 0;
134
+ this.close().catch((err) => this.errors.raise(err));
135
+ });
136
+ this._transport.errors.pipeTo(this.errors);
137
+ for (const signal of this._bufferedSignals) {
138
+ void this._transport.signal(signal);
139
+ }
140
+ this._bufferedSignals = [];
141
+ }
142
+ async close() {
143
+ var _a;
144
+ if (this._state === ConnectionState.CLOSED) {
145
+ return;
146
+ }
147
+ (0, import_log.log)("closing...", {
148
+ peerId: this.ownId
149
+ }, {
150
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/connection.ts",
151
+ line: 131,
152
+ scope: this,
153
+ callSite: (f, a) => f(...a)
154
+ });
155
+ try {
156
+ await this._protocol.destroy();
157
+ } catch (err) {
158
+ import_log.log.catch(err, {}, {
159
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/connection.ts",
160
+ line: 137,
161
+ scope: this,
162
+ callSite: (f, a) => f(...a)
163
+ });
164
+ }
165
+ try {
166
+ await ((_a = this._transport) == null ? void 0 : _a.destroy());
167
+ } catch (err1) {
168
+ import_log.log.catch(err1, {}, {
169
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/connection.ts",
170
+ line: 144,
171
+ scope: this,
172
+ callSite: (f, a) => f(...a)
173
+ });
174
+ }
175
+ (0, import_log.log)("closed", {
176
+ peerId: this.ownId
177
+ }, {
178
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/connection.ts",
179
+ line: 147,
180
+ scope: this,
181
+ callSite: (f, a) => f(...a)
182
+ });
183
+ this._changeState(ConnectionState.CLOSED);
184
+ }
185
+ async signal(msg) {
186
+ var _a, _b;
187
+ (0, import_node_assert.default)(msg.sessionId);
188
+ if (!msg.sessionId.equals(this.sessionId)) {
189
+ (0, import_log.log)("dropping signal for incorrect session id", {}, {
190
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/connection.ts",
191
+ line: 154,
192
+ scope: this,
193
+ callSite: (f, a) => f(...a)
194
+ });
195
+ return;
196
+ }
197
+ (0, import_node_assert.default)(msg.data.signal);
198
+ (0, import_node_assert.default)((_a = msg.author) == null ? void 0 : _a.equals(this.remoteId));
199
+ (0, import_node_assert.default)((_b = msg.recipient) == null ? void 0 : _b.equals(this.ownId));
200
+ if (this._state === ConnectionState.INITIAL) {
201
+ (0, import_log.log)("buffered signal", {
202
+ peerId: this.ownId,
203
+ remoteId: this.remoteId,
204
+ msg: msg.data
205
+ }, {
206
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/connection.ts",
207
+ line: 162,
208
+ scope: this,
209
+ callSite: (f, a) => f(...a)
210
+ });
211
+ this._bufferedSignals.push(msg.data.signal);
212
+ return;
213
+ }
214
+ (0, import_node_assert.default)(this._transport, "Connection not ready to accept signals.");
215
+ (0, import_log.log)("received signal", {
216
+ peerId: this.ownId,
217
+ remoteId: this.remoteId,
218
+ msg: msg.data
219
+ }, {
220
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/connection.ts",
221
+ line: 168,
222
+ scope: this,
223
+ callSite: (f, a) => f(...a)
224
+ });
225
+ await this._transport.signal(msg.data.signal);
226
+ }
227
+ _changeState(state) {
228
+ (0, import_node_assert.default)(state !== this._state, "Already in this state.");
229
+ this._state = state;
230
+ this.stateChanged.emit(state);
231
+ }
232
+ };
233
+ __decorate([
234
+ import_async.synchronized
235
+ ], Connection.prototype, "close", null);
236
+
237
+ // packages/core/mesh/network-manager/src/swarm/swarm.ts
238
+ var import_node_assert4 = __toESM(require("node:assert"));
239
+ var import_async3 = require("@dxos/async");
240
+ var import_context = require("@dxos/context");
241
+ var import_debug2 = require("@dxos/debug");
242
+ var import_keys3 = require("@dxos/keys");
243
+ var import_log4 = require("@dxos/log");
244
+ var import_util2 = require("@dxos/util");
245
+
246
+ // packages/core/mesh/network-manager/src/signal/message-router.ts
247
+ var import_node_assert2 = __toESM(require("node:assert"));
248
+ var import_keys = require("@dxos/keys");
249
+ var import_log2 = require("@dxos/log");
250
+ var import_protocols = require("@dxos/protocols");
251
+ var import_util = require("@dxos/util");
252
+ var MessageRouter = class {
253
+ constructor({ sendMessage, onSignal, onOffer, topic }) {
254
+ this._offerRecords = new import_util.ComplexMap((key) => key.toHex());
255
+ this._sendMessage = sendMessage;
256
+ this._onSignal = onSignal;
257
+ this._onOffer = onOffer;
258
+ this._topic = topic;
259
+ }
260
+ async receiveMessage({ author, recipient, payload }) {
261
+ var _a, _b, _c;
262
+ if (payload.type_url !== "dxos.mesh.swarm.SwarmMessage") {
263
+ return;
264
+ }
265
+ const message = import_protocols.schema.getCodecForType("dxos.mesh.swarm.SwarmMessage").decode(payload.value);
266
+ if (!this._topic.equals(message.topic)) {
267
+ return;
268
+ }
269
+ (0, import_log2.log)("received", {
270
+ from: author,
271
+ to: recipient,
272
+ msg: message
273
+ }, {
274
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/signal/message-router.ts",
275
+ line: 67,
276
+ scope: this,
277
+ callSite: (f, a) => f(...a)
278
+ });
279
+ if ((_a = message.data) == null ? void 0 : _a.offer) {
280
+ await this._handleOffer({
281
+ author,
282
+ recipient,
283
+ message
284
+ });
285
+ } else if ((_b = message.data) == null ? void 0 : _b.answer) {
286
+ await this._resolveAnswers(message);
287
+ } else if ((_c = message.data) == null ? void 0 : _c.signal) {
288
+ await this._handleSignal({
289
+ author,
290
+ recipient,
291
+ message
292
+ });
293
+ }
294
+ }
295
+ async signal(message) {
296
+ var _a;
297
+ (0, import_node_assert2.default)((_a = message.data) == null ? void 0 : _a.signal);
298
+ await this._sendReliableMessage({
299
+ author: message.author,
300
+ recipient: message.recipient,
301
+ message
302
+ });
303
+ }
304
+ async offer(message) {
305
+ const networkMessage = {
306
+ ...message,
307
+ messageId: import_keys.PublicKey.random()
308
+ };
309
+ return new Promise((resolve, reject) => {
310
+ this._offerRecords.set(networkMessage.messageId, {
311
+ resolve,
312
+ reject
313
+ });
314
+ return this._sendReliableMessage({
315
+ author: message.author,
316
+ recipient: message.recipient,
317
+ message: networkMessage
318
+ });
319
+ });
320
+ }
321
+ async _sendReliableMessage({ author, recipient, message }) {
322
+ var _a;
323
+ const networkMessage = {
324
+ ...message,
325
+ messageId: (_a = message.messageId) != null ? _a : import_keys.PublicKey.random()
326
+ };
327
+ (0, import_log2.log)("sending", {
328
+ from: author,
329
+ to: recipient,
330
+ msg: networkMessage
331
+ }, {
332
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/signal/message-router.ts",
333
+ line: 117,
334
+ scope: this,
335
+ callSite: (f, a) => f(...a)
336
+ });
337
+ await this._encodeAndSend({
338
+ author,
339
+ recipient,
340
+ message: networkMessage
341
+ });
342
+ }
343
+ async _encodeAndSend({ author, recipient, message }) {
344
+ await this._sendMessage({
345
+ author,
346
+ recipient,
347
+ payload: {
348
+ type_url: "dxos.mesh.swarm.SwarmMessage",
349
+ value: import_protocols.schema.getCodecForType("dxos.mesh.swarm.SwarmMessage").encode(message)
350
+ }
351
+ });
352
+ }
353
+ async _resolveAnswers(message) {
354
+ var _a, _b, _c;
355
+ (0, import_node_assert2.default)((_b = (_a = message.data) == null ? void 0 : _a.answer) == null ? void 0 : _b.offerMessageId, "No offerMessageId");
356
+ const offerRecord = this._offerRecords.get(message.data.answer.offerMessageId);
357
+ if (offerRecord) {
358
+ this._offerRecords.delete(message.data.answer.offerMessageId);
359
+ (0, import_node_assert2.default)((_c = message.data) == null ? void 0 : _c.answer, "No answer");
360
+ (0, import_log2.log)("resolving", {
361
+ answer: message.data.answer
362
+ }, {
363
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/signal/message-router.ts",
364
+ line: 146,
365
+ scope: this,
366
+ callSite: (f, a) => f(...a)
367
+ });
368
+ offerRecord.resolve(message.data.answer);
369
+ }
370
+ }
371
+ async _handleOffer({ author, recipient, message }) {
372
+ (0, import_node_assert2.default)(message.data.offer, "No offer");
373
+ const offerMessage = {
374
+ author,
375
+ recipient,
376
+ ...message,
377
+ data: {
378
+ offer: message.data.offer
379
+ }
380
+ };
381
+ const answer = await this._onOffer(offerMessage);
382
+ answer.offerMessageId = message.messageId;
383
+ await this._sendReliableMessage({
384
+ author: recipient,
385
+ recipient: author,
386
+ message: {
387
+ topic: message.topic,
388
+ sessionId: message.sessionId,
389
+ data: {
390
+ answer
391
+ }
392
+ }
393
+ });
394
+ }
395
+ async _handleSignal({ author, recipient, message }) {
396
+ (0, import_node_assert2.default)(message.messageId);
397
+ (0, import_node_assert2.default)(message.data.signal, "No Signal");
398
+ const signalMessage = {
399
+ author,
400
+ recipient,
401
+ ...message,
402
+ data: {
403
+ signal: message.data.signal
404
+ }
405
+ };
406
+ await this._onSignal(signalMessage);
407
+ }
408
+ };
409
+
410
+ // packages/core/mesh/network-manager/src/swarm/peer.ts
411
+ var import_node_assert3 = __toESM(require("node:assert"));
412
+ var import_async2 = require("@dxos/async");
413
+ var import_keys2 = require("@dxos/keys");
414
+ var import_log3 = require("@dxos/log");
415
+ var __decorate2 = function(decorators, target, key, desc) {
416
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
417
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
418
+ r = Reflect.decorate(decorators, target, key, desc);
419
+ else
420
+ for (var i = decorators.length - 1; i >= 0; i--)
421
+ if (d = decorators[i])
422
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
423
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
424
+ };
425
+ var Peer = class {
426
+ constructor(id, topic, localPeerId, _signalMessaging, _protocolProvider, _transportFactory, _callbacks) {
427
+ this.id = id;
428
+ this.topic = topic;
429
+ this.localPeerId = localPeerId;
430
+ this._signalMessaging = _signalMessaging;
431
+ this._protocolProvider = _protocolProvider;
432
+ this._transportFactory = _transportFactory;
433
+ this._callbacks = _callbacks;
434
+ this.advertizing = false;
435
+ this.initiating = false;
436
+ }
437
+ async onOffer(message) {
438
+ const remoteId = message.author;
439
+ if (this.connection || this.initiating) {
440
+ if (remoteId.toHex() < this.localPeerId.toHex()) {
441
+ import_log3.log.info("closing local connection and accepting remote peer's offer", {
442
+ id: this.id,
443
+ topic: this.topic,
444
+ peerId: this.localPeerId
445
+ }, {
446
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/peer.ts",
447
+ line: 83,
448
+ scope: this,
449
+ callSite: (f, a) => f(...a)
450
+ });
451
+ if (this.connection) {
452
+ await this.closeConnection();
453
+ }
454
+ } else {
455
+ return {
456
+ accept: false
457
+ };
458
+ }
459
+ }
460
+ if (await this._callbacks.onOffer(remoteId)) {
461
+ if (!this.connection) {
462
+ (0, import_node_assert3.default)(message.sessionId);
463
+ const connection = this._createConnection(false, message.sessionId);
464
+ try {
465
+ connection.openConnection();
466
+ } catch (err) {
467
+ import_log3.log.warn("connection error", {
468
+ topic: this.topic,
469
+ peerId: this.localPeerId,
470
+ remoteId: this.id,
471
+ err
472
+ }, {
473
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/peer.ts",
474
+ line: 107,
475
+ scope: this,
476
+ callSite: (f, a) => f(...a)
477
+ });
478
+ await this.closeConnection();
479
+ }
480
+ return {
481
+ accept: true
482
+ };
483
+ }
484
+ }
485
+ return {
486
+ accept: false
487
+ };
488
+ }
489
+ async initiateConnection() {
490
+ (0, import_node_assert3.default)(!this.initiating, "Initiation in progress.");
491
+ (0, import_node_assert3.default)(!this.connection, "Already connected.");
492
+ const sessionId = import_keys2.PublicKey.random();
493
+ (0, import_log3.log)("initiating...", {
494
+ id: this.id,
495
+ topic: this.topic,
496
+ peerId: this.id,
497
+ sessionId
498
+ }, {
499
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/peer.ts",
500
+ line: 125,
501
+ scope: this,
502
+ callSite: (f, a) => f(...a)
503
+ });
504
+ const connection = this._createConnection(true, sessionId);
505
+ this.initiating = true;
506
+ try {
507
+ const answer = await this._signalMessaging.offer({
508
+ author: this.localPeerId,
509
+ recipient: this.id,
510
+ sessionId,
511
+ topic: this.topic,
512
+ data: {
513
+ offer: {}
514
+ }
515
+ });
516
+ (0, import_log3.log)("received", {
517
+ answer,
518
+ topic: this.topic,
519
+ ownId: this.localPeerId,
520
+ remoteId: this.id
521
+ }, {
522
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/peer.ts",
523
+ line: 137,
524
+ scope: this,
525
+ callSite: (f, a) => f(...a)
526
+ });
527
+ if (connection.state !== ConnectionState.INITIAL) {
528
+ (0, import_log3.log)("ignoring response", {}, {
529
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/peer.ts",
530
+ line: 139,
531
+ scope: this,
532
+ callSite: (f, a) => f(...a)
533
+ });
534
+ return;
535
+ }
536
+ if (!answer.accept) {
537
+ this._callbacks.onRejected();
538
+ return;
539
+ }
540
+ connection.openConnection();
541
+ this._callbacks.onAccepted();
542
+ } catch (err) {
543
+ import_log3.log.warn("initiation error", {
544
+ topic: this.topic,
545
+ peerId: this.localPeerId,
546
+ remoteId: this.id,
547
+ err
548
+ }, {
549
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/peer.ts",
550
+ line: 150,
551
+ scope: this,
552
+ callSite: (f, a) => f(...a)
553
+ });
554
+ await this.closeConnection();
555
+ throw err;
556
+ } finally {
557
+ this.initiating = false;
558
+ }
559
+ }
560
+ _createConnection(initiator, sessionId) {
561
+ (0, import_log3.log)("creating connection", {
562
+ topic: this.topic,
563
+ peerId: this.localPeerId,
564
+ remoteId: this.id,
565
+ initiator,
566
+ sessionId
567
+ }, {
568
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/peer.ts",
569
+ line: 164,
570
+ scope: this,
571
+ callSite: (f, a) => f(...a)
572
+ });
573
+ (0, import_node_assert3.default)(!this.connection, "Already connected.");
574
+ const connection = new Connection(
575
+ this.topic,
576
+ this.localPeerId,
577
+ this.id,
578
+ sessionId,
579
+ initiator,
580
+ this._signalMessaging,
581
+ this._protocolProvider({
582
+ initiator,
583
+ localPeerId: this.localPeerId,
584
+ remotePeerId: this.id,
585
+ topic: this.topic
586
+ }),
587
+ this._transportFactory
588
+ );
589
+ this._callbacks.onInitiated(connection);
590
+ connection.stateChanged.on((state) => {
591
+ switch (state) {
592
+ case ConnectionState.CONNECTED: {
593
+ this._callbacks.onConnected();
594
+ break;
595
+ }
596
+ case ConnectionState.CLOSED: {
597
+ (0, import_log3.log)("connection closed", {
598
+ topic: this.topic,
599
+ peerId: this.localPeerId,
600
+ remoteId: this.id,
601
+ initiator
602
+ }, {
603
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/peer.ts",
604
+ line: 193,
605
+ scope: this,
606
+ callSite: (f, a) => f(...a)
607
+ });
608
+ (0, import_node_assert3.default)(this.connection === connection, "Connection mismatch (race condition).");
609
+ this.connection = void 0;
610
+ this._callbacks.onDisconnected();
611
+ break;
612
+ }
613
+ }
614
+ });
615
+ connection.errors.handle((err) => {
616
+ import_log3.log.warn("connection error", {
617
+ topic: this.topic,
618
+ peerId: this.localPeerId,
619
+ remoteId: this.id,
620
+ initiator,
621
+ err
622
+ }, {
623
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/peer.ts",
624
+ line: 203,
625
+ scope: this,
626
+ callSite: (f, a) => f(...a)
627
+ });
628
+ void this.closeConnection().catch(() => {
629
+ import_log3.log.catch(err, {}, {
630
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/peer.ts",
631
+ line: 207,
632
+ scope: this,
633
+ callSite: (f, a) => f(...a)
634
+ });
635
+ });
636
+ });
637
+ this.connection = connection;
638
+ return connection;
639
+ }
640
+ async closeConnection() {
641
+ if (!this.connection) {
642
+ return;
643
+ }
644
+ const connection = this.connection;
645
+ (0, import_log3.log)("closing...", {
646
+ peerId: this.id,
647
+ sessionId: connection.sessionId
648
+ }, {
649
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/peer.ts",
650
+ line: 221,
651
+ scope: this,
652
+ callSite: (f, a) => f(...a)
653
+ });
654
+ await connection.close();
655
+ (0, import_log3.log)("closed", {
656
+ peerId: this.id,
657
+ sessionId: connection.sessionId
658
+ }, {
659
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/peer.ts",
660
+ line: 227,
661
+ scope: this,
662
+ callSite: (f, a) => f(...a)
663
+ });
664
+ }
665
+ async onSignal(message) {
666
+ if (!this.connection) {
667
+ (0, import_log3.log)("dropping signal message for non-existent connection", {
668
+ message
669
+ }, {
670
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/peer.ts",
671
+ line: 232,
672
+ scope: this,
673
+ callSite: (f, a) => f(...a)
674
+ });
675
+ return;
676
+ }
677
+ await this.connection.signal(message);
678
+ }
679
+ async destroy() {
680
+ var _a;
681
+ (0, import_log3.log)("Destroying peer", {
682
+ peerId: this.id,
683
+ topic: this.topic
684
+ }, {
685
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/peer.ts",
686
+ line: 240,
687
+ scope: this,
688
+ callSite: (f, a) => f(...a)
689
+ });
690
+ await ((_a = this == null ? void 0 : this.connection) == null ? void 0 : _a.close());
691
+ }
692
+ };
693
+ __decorate2([
694
+ import_async2.synchronized
695
+ ], Peer.prototype, "destroy", null);
696
+
697
+ // packages/core/mesh/network-manager/src/swarm/swarm.ts
698
+ var __decorate3 = function(decorators, target, key, desc) {
699
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
700
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
701
+ r = Reflect.decorate(decorators, target, key, desc);
702
+ else
703
+ for (var i = decorators.length - 1; i >= 0; i--)
704
+ if (d = decorators[i])
705
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
706
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
707
+ };
708
+ var INITIATION_DELAY = 100;
709
+ var getClassName = (obj) => Object.getPrototypeOf(obj).constructor.name;
710
+ var Swarm = class {
711
+ constructor(_topic, _ownPeerId, _topology, _protocolProvider, _messenger, _transportFactory, _label) {
712
+ this._topic = _topic;
713
+ this._ownPeerId = _ownPeerId;
714
+ this._topology = _topology;
715
+ this._protocolProvider = _protocolProvider;
716
+ this._messenger = _messenger;
717
+ this._transportFactory = _transportFactory;
718
+ this._label = _label;
719
+ this._peers = new import_util2.ComplexMap(import_keys3.PublicKey.hash);
720
+ this._ctx = new import_context.Context();
721
+ this.connectionAdded = new import_async3.Event();
722
+ this.disconnected = new import_async3.Event();
723
+ this.connected = new import_async3.Event();
724
+ this.errors = new import_debug2.ErrorStream();
725
+ this.instanceId = import_keys3.PublicKey.random();
726
+ (0, import_log4.log)("creating swarm", {
727
+ peerId: _ownPeerId
728
+ }, {
729
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/swarm.ts",
730
+ line: 80,
731
+ scope: this,
732
+ callSite: (f, a) => f(...a)
733
+ });
734
+ _topology.init(this._getSwarmController());
735
+ this._swarmMessenger = new MessageRouter({
736
+ sendMessage: async (msg) => await this._messenger.sendMessage(msg),
737
+ onSignal: async (msg) => await this.onSignal(msg),
738
+ onOffer: async (msg) => await this.onOffer(msg),
739
+ topic: this._topic
740
+ });
741
+ this._messenger.listen({
742
+ peerId: this._ownPeerId,
743
+ payloadType: "dxos.mesh.swarm.SwarmMessage",
744
+ onMessage: async (message) => await this._swarmMessenger.receiveMessage(message)
745
+ }).catch((error) => import_log4.log.catch(error, {}, {
746
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/swarm.ts",
747
+ line: 96,
748
+ scope: this,
749
+ callSite: (f, a) => f(...a)
750
+ }));
751
+ }
752
+ get connections() {
753
+ return Array.from(this._peers.values()).map((peer) => peer.connection).filter(import_util2.isNotNullOrUndefined);
754
+ }
755
+ get ownPeerId() {
756
+ return this._ownPeerId;
757
+ }
758
+ get label() {
759
+ return this._label;
760
+ }
761
+ get topic() {
762
+ return this._topic;
763
+ }
764
+ async destroy() {
765
+ (0, import_log4.log)("destroying...", {}, {
766
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/swarm.ts",
767
+ line: 124,
768
+ scope: this,
769
+ callSite: (f, a) => f(...a)
770
+ });
771
+ await this._ctx.dispose();
772
+ await this._topology.destroy();
773
+ await Promise.all(Array.from(this._peers.keys()).map((key) => this._destroyPeer(key)));
774
+ (0, import_log4.log)("destroyed", {}, {
775
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/swarm.ts",
776
+ line: 128,
777
+ scope: this,
778
+ callSite: (f, a) => f(...a)
779
+ });
780
+ }
781
+ async setTopology(topology) {
782
+ if (topology === this._topology) {
783
+ return;
784
+ }
785
+ (0, import_log4.log)("setting topology", {
786
+ previous: getClassName(this._topology),
787
+ topology: getClassName(topology)
788
+ }, {
789
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/swarm.ts",
790
+ line: 135,
791
+ scope: this,
792
+ callSite: (f, a) => f(...a)
793
+ });
794
+ await this._topology.destroy();
795
+ this._topology = topology;
796
+ this._topology.init(this._getSwarmController());
797
+ this._topology.update();
798
+ }
799
+ _getOrCreatePeer(peerId) {
800
+ let peer = this._peers.get(peerId);
801
+ if (!peer) {
802
+ peer = new Peer(peerId, this._topic, this._ownPeerId, this._swarmMessenger, this._protocolProvider, this._transportFactory, {
803
+ onInitiated: (connection) => {
804
+ this.connectionAdded.emit(connection);
805
+ },
806
+ onConnected: () => {
807
+ this.connected.emit(peerId);
808
+ },
809
+ onDisconnected: async () => {
810
+ if (!peer.advertizing) {
811
+ await this._destroyPeer(peer.id);
812
+ }
813
+ this.disconnected.emit(peerId);
814
+ this._topology.update();
815
+ },
816
+ onRejected: () => {
817
+ if (this._peers.has(peerId)) {
818
+ void this._destroyPeer(peerId);
819
+ }
820
+ },
821
+ onAccepted: () => {
822
+ this._topology.update();
823
+ },
824
+ onOffer: (remoteId) => {
825
+ return this._topology.onOffer(remoteId);
826
+ }
827
+ });
828
+ this._peers.set(peerId, peer);
829
+ }
830
+ return peer;
831
+ }
832
+ async _destroyPeer(peerId) {
833
+ (0, import_node_assert4.default)(this._peers.has(peerId));
834
+ await this._peers.get(peerId).destroy();
835
+ this._peers.delete(peerId);
836
+ }
837
+ onSwarmEvent(swarmEvent) {
838
+ (0, import_log4.log)("swarm event", {
839
+ swarmEvent
840
+ }, {
841
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/swarm.ts",
842
+ line: 199,
843
+ scope: this,
844
+ callSite: (f, a) => f(...a)
845
+ });
846
+ if (this._ctx.disposed) {
847
+ import_log4.log.warn("ignored for destroyed swarm", {}, {
848
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/swarm.ts",
849
+ line: 201,
850
+ scope: this,
851
+ callSite: (f, a) => f(...a)
852
+ });
853
+ return;
854
+ }
855
+ if (swarmEvent.peerAvailable) {
856
+ const peerId = import_keys3.PublicKey.from(swarmEvent.peerAvailable.peer);
857
+ (0, import_log4.log)("new peer", {
858
+ peerId
859
+ }, {
860
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/swarm.ts",
861
+ line: 207,
862
+ scope: this,
863
+ callSite: (f, a) => f(...a)
864
+ });
865
+ if (!peerId.equals(this._ownPeerId)) {
866
+ const peer = this._getOrCreatePeer(peerId);
867
+ peer.advertizing = true;
868
+ }
869
+ } else if (swarmEvent.peerLeft) {
870
+ const peer1 = this._peers.get(import_keys3.PublicKey.from(swarmEvent.peerLeft.peer));
871
+ if (peer1) {
872
+ peer1.advertizing = false;
873
+ if (!peer1.connection) {
874
+ void this._destroyPeer(peer1.id);
875
+ }
876
+ }
877
+ }
878
+ this._topology.update();
879
+ }
880
+ async onOffer(message) {
881
+ var _a, _b;
882
+ (0, import_log4.log)("offer", {
883
+ message
884
+ }, {
885
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/swarm.ts",
886
+ line: 226,
887
+ scope: this,
888
+ callSite: (f, a) => f(...a)
889
+ });
890
+ if (this._ctx.disposed) {
891
+ import_log4.log.info("ignored for destroyed swarm", {}, {
892
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/swarm.ts",
893
+ line: 228,
894
+ scope: this,
895
+ callSite: (f, a) => f(...a)
896
+ });
897
+ return {
898
+ accept: false
899
+ };
900
+ }
901
+ (0, import_node_assert4.default)(message.author);
902
+ if (!((_a = message.recipient) == null ? void 0 : _a.equals(this._ownPeerId))) {
903
+ (0, import_log4.log)("rejecting offer with incorrect peerId", {
904
+ message
905
+ }, {
906
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/swarm.ts",
907
+ line: 235,
908
+ scope: this,
909
+ callSite: (f, a) => f(...a)
910
+ });
911
+ return {
912
+ accept: false
913
+ };
914
+ }
915
+ if (!((_b = message.topic) == null ? void 0 : _b.equals(this._topic))) {
916
+ (0, import_log4.log)("rejecting offer with incorrect topic", {
917
+ message
918
+ }, {
919
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/swarm.ts",
920
+ line: 239,
921
+ scope: this,
922
+ callSite: (f, a) => f(...a)
923
+ });
924
+ return {
925
+ accept: false
926
+ };
927
+ }
928
+ const peer = this._getOrCreatePeer(message.author);
929
+ const answer = await peer.onOffer(message);
930
+ this._topology.update();
931
+ return answer;
932
+ }
933
+ async onSignal(message) {
934
+ var _a, _b;
935
+ (0, import_log4.log)("signal", {
936
+ message
937
+ }, {
938
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/swarm.ts",
939
+ line: 250,
940
+ scope: this,
941
+ callSite: (f, a) => f(...a)
942
+ });
943
+ if (this._ctx.disposed) {
944
+ import_log4.log.info("ignored for destroyed swarm", {}, {
945
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/swarm.ts",
946
+ line: 252,
947
+ scope: this,
948
+ callSite: (f, a) => f(...a)
949
+ });
950
+ return;
951
+ }
952
+ (0, import_node_assert4.default)((_a = message.recipient) == null ? void 0 : _a.equals(this._ownPeerId), `Invalid signal peer id expected=${this.ownPeerId}, actual=${message.recipient}`);
953
+ (0, import_node_assert4.default)((_b = message.topic) == null ? void 0 : _b.equals(this._topic));
954
+ (0, import_node_assert4.default)(message.author);
955
+ const peer = this._getOrCreatePeer(message.author);
956
+ await peer.onSignal(message);
957
+ }
958
+ _getSwarmController() {
959
+ return {
960
+ getState: () => ({
961
+ ownPeerId: this._ownPeerId,
962
+ connected: Array.from(this._peers.values()).filter((peer) => peer.connection).map((peer) => peer.id),
963
+ candidates: Array.from(this._peers.values()).filter((peer) => !peer.connection && peer.advertizing).map((peer) => peer.id)
964
+ }),
965
+ connect: (peer) => {
966
+ if (this._ctx.disposed) {
967
+ return;
968
+ }
969
+ (0, import_async3.scheduleTask)(this._ctx, async () => {
970
+ try {
971
+ await this._initiateConnection(peer);
972
+ } catch (err) {
973
+ import_log4.log.warn("initiation error", err, {
974
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/swarm.ts",
975
+ line: 287,
976
+ scope: this,
977
+ callSite: (f, a) => f(...a)
978
+ });
979
+ }
980
+ });
981
+ },
982
+ disconnect: async (peer) => {
983
+ if (this._ctx.disposed) {
984
+ return;
985
+ }
986
+ (0, import_async3.scheduleTask)(this._ctx, async () => {
987
+ await this._closeConnection(peer);
988
+ this._topology.update();
989
+ });
990
+ }
991
+ };
992
+ }
993
+ async _initiateConnection(remoteId) {
994
+ if (remoteId.toHex() < this._ownPeerId.toHex()) {
995
+ (0, import_log4.log)("initiation delay", {
996
+ remoteId
997
+ }, {
998
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/swarm.ts",
999
+ line: 312,
1000
+ scope: this,
1001
+ callSite: (f, a) => f(...a)
1002
+ });
1003
+ await (0, import_async3.sleep)(INITIATION_DELAY);
1004
+ }
1005
+ if (this._ctx.disposed) {
1006
+ return;
1007
+ }
1008
+ const peer = this._getOrCreatePeer(remoteId);
1009
+ if (peer.connection) {
1010
+ return;
1011
+ }
1012
+ (0, import_log4.log)("initiating connection...", {
1013
+ remoteId
1014
+ }, {
1015
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/swarm.ts",
1016
+ line: 326,
1017
+ scope: this,
1018
+ callSite: (f, a) => f(...a)
1019
+ });
1020
+ await peer.initiateConnection();
1021
+ this._topology.update();
1022
+ (0, import_log4.log)("initiated", {
1023
+ remoteId
1024
+ }, {
1025
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/swarm.ts",
1026
+ line: 329,
1027
+ scope: this,
1028
+ callSite: (f, a) => f(...a)
1029
+ });
1030
+ }
1031
+ async _closeConnection(peerId) {
1032
+ const peer = this._peers.get(peerId);
1033
+ if (!peer) {
1034
+ return;
1035
+ }
1036
+ await peer.closeConnection();
1037
+ }
1038
+ };
1039
+ __decorate3([
1040
+ import_log4.logInfo
1041
+ ], Swarm.prototype, "instanceId", void 0);
1042
+ __decorate3([
1043
+ import_log4.logInfo
1044
+ ], Swarm.prototype, "ownPeerId", null);
1045
+ __decorate3([
1046
+ import_log4.logInfo
1047
+ ], Swarm.prototype, "topic", null);
1048
+
1049
+ // packages/core/mesh/network-manager/src/swarm/swarm-mapper.ts
1050
+ var import_async4 = require("@dxos/async");
1051
+ var import_keys4 = require("@dxos/keys");
1052
+ var import_log5 = require("@dxos/log");
1053
+ var import_util3 = require("@dxos/util");
1054
+ var SwarmMapper = class {
1055
+ get peers() {
1056
+ return Array.from(this._peers.values());
1057
+ }
1058
+ constructor(_swarm, _presence) {
1059
+ this._swarm = _swarm;
1060
+ this._presence = _presence;
1061
+ this._subscriptions = new import_async4.EventSubscriptions();
1062
+ this._connectionSubscriptions = new import_util3.ComplexMap(import_keys4.PublicKey.hash);
1063
+ this._peers = new import_util3.ComplexMap(import_keys4.PublicKey.hash);
1064
+ this.mapUpdated = new import_async4.Event();
1065
+ this._subscriptions.add(_swarm.connectionAdded.on((connection) => {
1066
+ this._update();
1067
+ this._connectionSubscriptions.set(connection.remoteId, connection.stateChanged.on(() => {
1068
+ this._update();
1069
+ }));
1070
+ }));
1071
+ this._subscriptions.add(_swarm.disconnected.on((peerId) => {
1072
+ var _a;
1073
+ (_a = this._connectionSubscriptions.get(peerId)) == null ? void 0 : _a();
1074
+ this._connectionSubscriptions.delete(peerId);
1075
+ this._update();
1076
+ }));
1077
+ if (_presence) {
1078
+ this._subscriptions.add(_presence.graphUpdated.on(() => {
1079
+ this._update();
1080
+ }));
1081
+ }
1082
+ this._update();
1083
+ }
1084
+ _update() {
1085
+ (0, import_log5.log)("updating swarm", {}, {
1086
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/swarm-mapper.ts",
1087
+ line: 77,
1088
+ scope: this,
1089
+ callSite: (f, a) => f(...a)
1090
+ });
1091
+ this._peers.clear();
1092
+ this._peers.set(this._swarm.ownPeerId, {
1093
+ id: this._swarm.ownPeerId,
1094
+ state: "ME",
1095
+ connections: []
1096
+ });
1097
+ for (const connection of this._swarm.connections) {
1098
+ this._peers.set(connection.remoteId, {
1099
+ id: connection.remoteId,
1100
+ state: connection.state,
1101
+ connections: [
1102
+ this._swarm.ownPeerId
1103
+ ]
1104
+ });
1105
+ }
1106
+ if (this._presence) {
1107
+ this._presence.graph.forEachNode((node) => {
1108
+ const id = import_keys4.PublicKey.fromHex(node.id);
1109
+ if (this._peers.has(id)) {
1110
+ return;
1111
+ }
1112
+ this._peers.set(id, {
1113
+ id,
1114
+ state: "INDIRECTLY_CONNECTED",
1115
+ connections: []
1116
+ });
1117
+ });
1118
+ this._presence.graph.forEachLink((link) => {
1119
+ const from = import_keys4.PublicKey.from(link.fromId);
1120
+ const to = import_keys4.PublicKey.from(link.toId);
1121
+ if (!from.equals(this._swarm.ownPeerId) && !to.equals(this._swarm.ownPeerId)) {
1122
+ this._peers.get(from).connections.push(to);
1123
+ }
1124
+ });
1125
+ }
1126
+ (0, import_log5.log)("graph changed", {
1127
+ directConnections: this._swarm.connections.length,
1128
+ totalPeersInSwarm: this._peers.size
1129
+ }, {
1130
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/swarm/swarm-mapper.ts",
1131
+ line: 118,
1132
+ scope: this,
1133
+ callSite: (f, a) => f(...a)
1134
+ });
1135
+ this.mapUpdated.emit(Array.from(this._peers.values()));
1136
+ }
1137
+ destroy() {
1138
+ Array.from(this._connectionSubscriptions.values()).forEach((cb) => cb());
1139
+ this._subscriptions.clear();
1140
+ }
1141
+ };
1142
+
1143
+ // packages/core/mesh/network-manager/src/connection-log.ts
1144
+ var EventType;
1145
+ (function(EventType2) {
1146
+ EventType2["CONNECTION_STATE_CHANGED"] = "CONNECTION_STATE_CHANGED";
1147
+ EventType2["PROTOCOL_ERROR"] = "PROTOCOL_ERROR";
1148
+ EventType2["PROTOCOL_EXTENSIONS_INITIALIZED"] = "PROTOCOL_EXTENSIONS_INITIALIZED";
1149
+ EventType2["PROTOCOL_EXTENSIONS_HANDSHAKE"] = "PROTOCOL_EXTENSIONS_HANDSHAKE";
1150
+ EventType2["PROTOCOL_HANDSHAKE"] = "PROTOCOL_HANDSHAKE";
1151
+ })(EventType || (EventType = {}));
1152
+ var ConnectionLog = class {
1153
+ constructor() {
1154
+ this._swarms = new import_util4.ComplexMap(import_keys5.PublicKey.hash);
1155
+ this.update = new import_async5.Event();
1156
+ }
1157
+ getSwarmInfo(swarmId) {
1158
+ var _a;
1159
+ return (_a = this._swarms.get(swarmId)) != null ? _a : (0, import_debug3.raise)(new Error(`Swarm not found: ${swarmId}`));
1160
+ }
1161
+ get swarms() {
1162
+ return Array.from(this._swarms.values());
1163
+ }
1164
+ swarmJoined(swarm) {
1165
+ const info = {
1166
+ id: swarm.instanceId,
1167
+ topic: swarm.topic,
1168
+ isActive: true,
1169
+ label: swarm.label,
1170
+ connections: []
1171
+ };
1172
+ this._swarms.set(swarm.instanceId, info);
1173
+ this.update.emit();
1174
+ swarm.connectionAdded.on((connection) => {
1175
+ var _a, _b, _c, _d, _e;
1176
+ const connectionInfo = {
1177
+ state: ConnectionState.INITIAL,
1178
+ remotePeerId: connection.remoteId,
1179
+ sessionId: connection.sessionId,
1180
+ transport: connection.transport && Object.getPrototypeOf(connection.transport).constructor.name,
1181
+ protocolExtensions: (_a = connection.protocol.protocol) == null ? void 0 : _a.extensionNames,
1182
+ events: []
1183
+ };
1184
+ info.connections.push(connectionInfo);
1185
+ this.update.emit();
1186
+ connection.stateChanged.on((state) => {
1187
+ connectionInfo.state = state;
1188
+ connectionInfo.events.push({
1189
+ type: EventType.CONNECTION_STATE_CHANGED,
1190
+ newState: state
1191
+ });
1192
+ this.update.emit();
1193
+ });
1194
+ (_b = connection.protocol.protocol) == null ? void 0 : _b.error.on((error) => {
1195
+ var _a2;
1196
+ connectionInfo.events.push({
1197
+ type: EventType.PROTOCOL_ERROR,
1198
+ error: (_a2 = error.stack) != null ? _a2 : error.message
1199
+ });
1200
+ this.update.emit();
1201
+ });
1202
+ (_c = connection.protocol.protocol) == null ? void 0 : _c.extensionsInitialized.on(() => {
1203
+ connectionInfo.events.push({
1204
+ type: EventType.PROTOCOL_EXTENSIONS_INITIALIZED
1205
+ });
1206
+ this.update.emit();
1207
+ });
1208
+ (_d = connection.protocol.protocol) == null ? void 0 : _d.extensionsHandshake.on(() => {
1209
+ connectionInfo.events.push({
1210
+ type: EventType.PROTOCOL_EXTENSIONS_HANDSHAKE
1211
+ });
1212
+ this.update.emit();
1213
+ });
1214
+ (_e = connection.protocol.protocol) == null ? void 0 : _e.handshake.on(() => {
1215
+ connectionInfo.events.push({
1216
+ type: EventType.PROTOCOL_HANDSHAKE
1217
+ });
1218
+ this.update.emit();
1219
+ });
1220
+ });
1221
+ }
1222
+ swarmLeft(swarm) {
1223
+ this.getSwarmInfo(swarm.instanceId).isActive = false;
1224
+ this.update.emit();
1225
+ }
1226
+ };
1227
+
1228
+ // packages/core/mesh/network-manager/src/network-manager.ts
1229
+ var import_node_assert5 = __toESM(require("node:assert"));
1230
+ var import_async6 = require("@dxos/async");
1231
+ var import_keys6 = require("@dxos/keys");
1232
+ var import_log6 = require("@dxos/log");
1233
+ var import_messaging = require("@dxos/messaging");
1234
+ var import_util5 = require("@dxos/util");
1235
+ var NetworkManager = class {
1236
+ constructor({ transportFactory, signalManager, log: log14 }) {
1237
+ this._swarms = new import_util5.ComplexMap(import_keys6.PublicKey.hash);
1238
+ this._mappers = new import_util5.ComplexMap(import_keys6.PublicKey.hash);
1239
+ this.topicsUpdated = new import_async6.Event();
1240
+ this._transportFactory = transportFactory;
1241
+ this._signalManager = signalManager;
1242
+ this._signalManager.swarmEvent.on(({ topic, swarmEvent: event }) => {
1243
+ var _a;
1244
+ return (_a = this._swarms.get(topic)) == null ? void 0 : _a.onSwarmEvent(event);
1245
+ });
1246
+ this._messenger = new import_messaging.Messenger({
1247
+ signalManager: this._signalManager
1248
+ });
1249
+ this._signalConnection = {
1250
+ join: (opts) => this._signalManager.join(opts),
1251
+ leave: (opts) => this._signalManager.leave(opts)
1252
+ };
1253
+ if (log14) {
1254
+ this._connectionLog = new ConnectionLog();
1255
+ }
1256
+ }
1257
+ get connectionLog() {
1258
+ return this._connectionLog;
1259
+ }
1260
+ get signalManager() {
1261
+ return this._signalManager;
1262
+ }
1263
+ get topics() {
1264
+ return Array.from(this._swarms.keys());
1265
+ }
1266
+ getSwarmMap(topic) {
1267
+ return this._mappers.get(topic);
1268
+ }
1269
+ getSwarm(topic) {
1270
+ return this._swarms.get(topic);
1271
+ }
1272
+ async close() {
1273
+ for (const topic of this._swarms.keys()) {
1274
+ await this.leaveSwarm(topic).catch((err) => {
1275
+ (0, import_log6.log)(err, {}, {
1276
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/network-manager.ts",
1277
+ line: 128,
1278
+ scope: this,
1279
+ callSite: (f, a) => f(...a)
1280
+ });
1281
+ });
1282
+ }
1283
+ await this._signalManager.destroy();
1284
+ }
1285
+ async joinSwarm({ topic, peerId, topology, protocolProvider: protocol, presence, label }) {
1286
+ var _a;
1287
+ (0, import_node_assert5.default)(import_keys6.PublicKey.isPublicKey(topic));
1288
+ (0, import_node_assert5.default)(import_keys6.PublicKey.isPublicKey(peerId));
1289
+ (0, import_node_assert5.default)(topology);
1290
+ (0, import_node_assert5.default)(typeof protocol === "function");
1291
+ if (this._swarms.has(topic)) {
1292
+ throw new Error(`Already connected to swarm: ${import_keys6.PublicKey.from(topic)}`);
1293
+ }
1294
+ (0, import_log6.log)("joining", {
1295
+ topic: import_keys6.PublicKey.from(topic),
1296
+ peerId,
1297
+ topology: topology.toString()
1298
+ }, {
1299
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/network-manager.ts",
1300
+ line: 155,
1301
+ scope: this,
1302
+ callSite: (f, a) => f(...a)
1303
+ });
1304
+ const swarm = new Swarm(topic, peerId, topology, protocol, this._messenger, this._transportFactory, label);
1305
+ swarm.errors.handle((error) => {
1306
+ (0, import_log6.log)("swarm error", {
1307
+ error
1308
+ }, {
1309
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/network-manager.ts",
1310
+ line: 158,
1311
+ scope: this,
1312
+ callSite: (f, a) => f(...a)
1313
+ });
1314
+ });
1315
+ this._swarms.set(topic, swarm);
1316
+ this._signalConnection.join({
1317
+ topic,
1318
+ peerId
1319
+ }).catch((error) => import_log6.log.catch(error, {}, {
1320
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/network-manager.ts",
1321
+ line: 162,
1322
+ scope: this,
1323
+ callSite: (f, a) => f(...a)
1324
+ }));
1325
+ this._mappers.set(topic, new SwarmMapper(swarm, presence));
1326
+ this.topicsUpdated.emit();
1327
+ (_a = this._connectionLog) == null ? void 0 : _a.swarmJoined(swarm);
1328
+ (0, import_log6.log)("joined", {
1329
+ topic: import_keys6.PublicKey.from(topic),
1330
+ count: this._swarms.size
1331
+ }, {
1332
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/network-manager.ts",
1333
+ line: 167,
1334
+ scope: this,
1335
+ callSite: (f, a) => f(...a)
1336
+ });
1337
+ return {
1338
+ close: () => this.leaveSwarm(topic)
1339
+ };
1340
+ }
1341
+ async leaveSwarm(topic) {
1342
+ var _a;
1343
+ if (!this._swarms.has(topic)) {
1344
+ import_log6.log.warn("swarm not open", {
1345
+ topic: import_keys6.PublicKey.from(topic)
1346
+ }, {
1347
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/network-manager.ts",
1348
+ line: 179,
1349
+ scope: this,
1350
+ callSite: (f, a) => f(...a)
1351
+ });
1352
+ return;
1353
+ }
1354
+ (0, import_log6.log)("leaving", {
1355
+ topic: import_keys6.PublicKey.from(topic)
1356
+ }, {
1357
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/network-manager.ts",
1358
+ line: 183,
1359
+ scope: this,
1360
+ callSite: (f, a) => f(...a)
1361
+ });
1362
+ const swarm = this._swarms.get(topic);
1363
+ await this._signalConnection.leave({
1364
+ topic,
1365
+ peerId: swarm.ownPeerId
1366
+ });
1367
+ const map = this._mappers.get(topic);
1368
+ map.destroy();
1369
+ this._mappers.delete(topic);
1370
+ (_a = this._connectionLog) == null ? void 0 : _a.swarmLeft(swarm);
1371
+ await swarm.destroy();
1372
+ this._swarms.delete(topic);
1373
+ await this.topicsUpdated.emit();
1374
+ (0, import_log6.log)("left", {
1375
+ topic: import_keys6.PublicKey.from(topic),
1376
+ count: this._swarms.size
1377
+ }, {
1378
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/network-manager.ts",
1379
+ line: 197,
1380
+ scope: this,
1381
+ callSite: (f, a) => f(...a)
1382
+ });
1383
+ }
1384
+ };
1385
+
1386
+ // packages/core/mesh/network-manager/src/protocol-factory.ts
1387
+ var import_node_assert6 = __toESM(require("node:assert"));
1388
+ var import_crypto = require("@dxos/crypto");
1389
+ var import_keys7 = require("@dxos/keys");
1390
+ var import_log7 = require("@dxos/log");
1391
+ var import_mesh_protocol = require("@dxos/mesh-protocol");
1392
+ var protocolFactory = ({ session = {}, plugins = [], getTopics }) => {
1393
+ (0, import_node_assert6.default)(getTopics);
1394
+ return ({ channel, initiator }) => {
1395
+ (0, import_log7.log)("creating protocol", {}, {
1396
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/protocol-factory.ts",
1397
+ line: 41,
1398
+ scope: void 0,
1399
+ callSite: (f, a) => f(...a)
1400
+ });
1401
+ const protocol = new import_mesh_protocol.Protocol({
1402
+ streamOptions: {
1403
+ live: true
1404
+ },
1405
+ discoveryToPublicKey: (dk) => {
1406
+ const publicKey = getTopics().find((topic) => (0, import_crypto.discoveryKey)(topic).equals(dk));
1407
+ if (publicKey) {
1408
+ protocol.setContext({
1409
+ topic: import_keys7.PublicKey.stringify(publicKey)
1410
+ });
1411
+ }
1412
+ (0, import_node_assert6.default)(publicKey, "PublicKey not found in discovery.");
1413
+ return publicKey;
1414
+ },
1415
+ initiator,
1416
+ userSession: session,
1417
+ discoveryKey: channel
1418
+ });
1419
+ protocol.setExtensions(plugins.map((plugin) => plugin.createExtension())).init();
1420
+ return protocol;
1421
+ };
1422
+ };
1423
+ var createProtocolFactory = (topic, peerId, plugins) => protocolFactory({
1424
+ getTopics: () => [
1425
+ topic.asBuffer()
1426
+ ],
1427
+ session: {
1428
+ peerId: import_keys7.PublicKey.stringify(peerId.asBuffer())
1429
+ },
1430
+ plugins
1431
+ });
1432
+ var transportProtocolProvider = (rendezvousKey, peerId, protocolPlugin) => {
1433
+ return protocolFactory({
1434
+ getTopics: () => [
1435
+ rendezvousKey
1436
+ ],
1437
+ session: {
1438
+ peerId: import_keys7.PublicKey.stringify(peerId)
1439
+ },
1440
+ plugins: [
1441
+ protocolPlugin
1442
+ ]
1443
+ });
1444
+ };
1445
+
1446
+ // packages/core/mesh/network-manager/src/topology/fully-connected-topology.ts
1447
+ var import_node_assert7 = __toESM(require("node:assert"));
1448
+ var FullyConnectedTopology = class {
1449
+ toString() {
1450
+ return "FullyConnectedTopology";
1451
+ }
1452
+ init(controller) {
1453
+ (0, import_node_assert7.default)(!this._controller, "Already initialized");
1454
+ this._controller = controller;
1455
+ }
1456
+ update() {
1457
+ (0, import_node_assert7.default)(this._controller, "Not initialized");
1458
+ const { candidates: discovered } = this._controller.getState();
1459
+ for (const peer of discovered) {
1460
+ this._controller.connect(peer);
1461
+ }
1462
+ }
1463
+ async onOffer(peer) {
1464
+ return true;
1465
+ }
1466
+ async destroy() {
1467
+ }
1468
+ };
1469
+
1470
+ // packages/core/mesh/network-manager/src/topology/mmst-topology.ts
1471
+ var import_node_assert8 = __toESM(require("node:assert"));
1472
+ var import_xor_distance = __toESM(require("xor-distance"));
1473
+ var import_log8 = require("@dxos/log");
1474
+ var MMSTTopology = class {
1475
+ constructor({ originateConnections = 2, maxPeers = 4, sampleSize = 10 } = {}) {
1476
+ this._sampleCollected = false;
1477
+ this._originateConnections = originateConnections;
1478
+ this._maxPeers = maxPeers;
1479
+ this._sampleSize = sampleSize;
1480
+ }
1481
+ init(controller) {
1482
+ (0, import_node_assert8.default)(!this._controller, "Already initialized");
1483
+ this._controller = controller;
1484
+ }
1485
+ update() {
1486
+ (0, import_node_assert8.default)(this._controller, "Not initialized");
1487
+ const { connected, candidates } = this._controller.getState();
1488
+ if (this._sampleCollected || connected.length > this._maxPeers || candidates.length > 0) {
1489
+ (0, import_log8.log)("Running the algorithm.", {}, {
1490
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/topology/mmst-topology.ts",
1491
+ line: 55,
1492
+ scope: this,
1493
+ callSite: (f, a) => f(...a)
1494
+ });
1495
+ this._sampleCollected = true;
1496
+ this._runAlgorithm();
1497
+ }
1498
+ }
1499
+ async onOffer(peer) {
1500
+ (0, import_node_assert8.default)(this._controller, "Not initialized");
1501
+ const { connected } = this._controller.getState();
1502
+ const accept = connected.length < this._maxPeers;
1503
+ (0, import_log8.log)(`Offer ${peer} accept=${accept}`, {}, {
1504
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/topology/mmst-topology.ts",
1505
+ line: 65,
1506
+ scope: this,
1507
+ callSite: (f, a) => f(...a)
1508
+ });
1509
+ return accept;
1510
+ }
1511
+ async destroy() {
1512
+ }
1513
+ _runAlgorithm() {
1514
+ (0, import_node_assert8.default)(this._controller, "Not initialized");
1515
+ const { connected, candidates, ownPeerId } = this._controller.getState();
1516
+ if (connected.length > this._maxPeers) {
1517
+ const sorted = sortByXorDistance(connected, ownPeerId).reverse().slice(0, this._maxPeers - connected.length);
1518
+ for (const peer of sorted) {
1519
+ (0, import_log8.log)(`Disconnect ${peer}.`, {}, {
1520
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/topology/mmst-topology.ts",
1521
+ line: 83,
1522
+ scope: this,
1523
+ callSite: (f, a) => f(...a)
1524
+ });
1525
+ this._controller.disconnect(peer);
1526
+ }
1527
+ } else if (connected.length < this._originateConnections) {
1528
+ const sample = candidates.sort(() => Math.random() - 0.5).slice(0, this._sampleSize);
1529
+ const sorted1 = sortByXorDistance(sample, ownPeerId).slice(0, this._originateConnections - connected.length);
1530
+ for (const peer1 of sorted1) {
1531
+ (0, import_log8.log)(`Connect ${peer1}.`, {}, {
1532
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/topology/mmst-topology.ts",
1533
+ line: 91,
1534
+ scope: this,
1535
+ callSite: (f, a) => f(...a)
1536
+ });
1537
+ this._controller.connect(peer1);
1538
+ }
1539
+ }
1540
+ }
1541
+ toString() {
1542
+ return "MMSTTopology";
1543
+ }
1544
+ };
1545
+ var sortByXorDistance = (keys, reference) => keys.sort((a, b) => import_xor_distance.default.gt((0, import_xor_distance.default)(a.asBuffer(), reference.asBuffer()), (0, import_xor_distance.default)(b.asBuffer(), reference.asBuffer())));
1546
+
1547
+ // packages/core/mesh/network-manager/src/topology/star-topology.ts
1548
+ var import_node_assert9 = __toESM(require("node:assert"));
1549
+ var import_log9 = require("@dxos/log");
1550
+ var StarTopology = class {
1551
+ constructor(_centralPeer) {
1552
+ this._centralPeer = _centralPeer;
1553
+ }
1554
+ toString() {
1555
+ return `StarTopology(${this._centralPeer.truncate()})`;
1556
+ }
1557
+ init(controller) {
1558
+ (0, import_node_assert9.default)(!this._controller, "Already initialized.");
1559
+ this._controller = controller;
1560
+ }
1561
+ update() {
1562
+ (0, import_node_assert9.default)(this._controller, "Not initialized.");
1563
+ const { candidates, connected, ownPeerId } = this._controller.getState();
1564
+ if (!ownPeerId.equals(this._centralPeer)) {
1565
+ (0, import_log9.log)("leaf peer dropping all connections apart from central peer.", {}, {
1566
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/topology/star-topology.ts",
1567
+ line: 33,
1568
+ scope: this,
1569
+ callSite: (f, a) => f(...a)
1570
+ });
1571
+ for (const peer of connected) {
1572
+ if (!peer.equals(this._centralPeer)) {
1573
+ (0, import_log9.log)("dropping connection", {
1574
+ peer
1575
+ }, {
1576
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/topology/star-topology.ts",
1577
+ line: 38,
1578
+ scope: this,
1579
+ callSite: (f, a) => f(...a)
1580
+ });
1581
+ this._controller.disconnect(peer);
1582
+ }
1583
+ }
1584
+ }
1585
+ for (const peer1 of candidates) {
1586
+ if (peer1.equals(this._centralPeer) || ownPeerId.equals(this._centralPeer)) {
1587
+ (0, import_log9.log)("connecting to peer", {
1588
+ peer: peer1
1589
+ }, {
1590
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/topology/star-topology.ts",
1591
+ line: 47,
1592
+ scope: this,
1593
+ callSite: (f, a) => f(...a)
1594
+ });
1595
+ this._controller.connect(peer1);
1596
+ }
1597
+ }
1598
+ }
1599
+ async onOffer(peer) {
1600
+ (0, import_node_assert9.default)(this._controller, "Not initialized.");
1601
+ const { ownPeerId } = this._controller.getState();
1602
+ (0, import_log9.log)("offer", {
1603
+ peer,
1604
+ isCentral: peer.equals(this._centralPeer),
1605
+ isSelfCentral: ownPeerId.equals(this._centralPeer)
1606
+ }, {
1607
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/topology/star-topology.ts",
1608
+ line: 56,
1609
+ scope: this,
1610
+ callSite: (f, a) => f(...a)
1611
+ });
1612
+ return ownPeerId.equals(this._centralPeer) || peer.equals(this._centralPeer);
1613
+ }
1614
+ async destroy() {
1615
+ }
1616
+ };
1617
+
1618
+ // packages/core/mesh/network-manager/src/transport/memory-transport.ts
1619
+ var import_node_assert10 = __toESM(require("node:assert"));
1620
+ var import_node_stream = require("node:stream");
1621
+ var import_async7 = require("@dxos/async");
1622
+ var import_debug4 = require("@dxos/debug");
1623
+ var import_keys8 = require("@dxos/keys");
1624
+ var import_log10 = require("@dxos/log");
1625
+ var import_util6 = require("@dxos/util");
1626
+ var MEMORY_TRANSPORT_DELAY = 1;
1627
+ var createStreamDelay = (delay) => {
1628
+ return new import_node_stream.Transform({
1629
+ objectMode: true,
1630
+ transform: (chunk, _, cb) => {
1631
+ setTimeout(() => cb(null, chunk), delay);
1632
+ }
1633
+ });
1634
+ };
1635
+ var MemoryTransportFactory = {
1636
+ createTransport: (params) => new MemoryTransport(params)
1637
+ };
1638
+ var _MemoryTransport = class {
1639
+ constructor(options) {
1640
+ var _a;
1641
+ this.options = options;
1642
+ this.closed = new import_async7.Event();
1643
+ this.connected = new import_async7.Event();
1644
+ this.errors = new import_debug4.ErrorStream();
1645
+ this._id = import_keys8.PublicKey.random();
1646
+ this._remote = new import_async7.Trigger();
1647
+ this._outgoingDelay = createStreamDelay(MEMORY_TRANSPORT_DELAY);
1648
+ this._incomingDelay = createStreamDelay(MEMORY_TRANSPORT_DELAY);
1649
+ this._destroyed = false;
1650
+ (0, import_log10.log)("creating", {
1651
+ id: this._id
1652
+ }, {
1653
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/memory-transport.ts",
1654
+ line: 59,
1655
+ scope: this,
1656
+ callSite: (f, a) => f(...a)
1657
+ });
1658
+ (0, import_node_assert10.default)(!_MemoryTransport._connections.has(this._id), "Duplicate memory connection");
1659
+ _MemoryTransport._connections.set(this._id, this);
1660
+ if (this.options.initiator) {
1661
+ setTimeout(async () => {
1662
+ (0, import_log10.log)("sending signal", {
1663
+ transportId: this._id
1664
+ }, {
1665
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/memory-transport.ts",
1666
+ line: 68,
1667
+ scope: this,
1668
+ callSite: (f, a) => f(...a)
1669
+ });
1670
+ void this.options.sendSignal({
1671
+ payload: {
1672
+ transportId: this._id.toHex()
1673
+ }
1674
+ });
1675
+ });
1676
+ } else {
1677
+ this._remote.wait({
1678
+ timeout: (_a = this.options.timeout) != null ? _a : 1e3
1679
+ }).then((remoteId) => {
1680
+ if (this._destroyed) {
1681
+ return;
1682
+ }
1683
+ this._remoteId = remoteId;
1684
+ this._remoteConnection = _MemoryTransport._connections.get(this._remoteId);
1685
+ if (!this._remoteConnection) {
1686
+ this._destroyed = true;
1687
+ this.closed.emit();
1688
+ return;
1689
+ }
1690
+ (0, import_node_assert10.default)(!this._remoteConnection._remoteConnection, new Error(`Remote already connected: ${this._remoteId}`));
1691
+ this._remoteConnection._remoteConnection = this;
1692
+ this._remoteConnection._remoteId = this._id;
1693
+ (0, import_log10.log)("connected", {
1694
+ id: this._id,
1695
+ remote: this._remoteId
1696
+ }, {
1697
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/memory-transport.ts",
1698
+ line: 94,
1699
+ scope: this,
1700
+ callSite: (f, a) => f(...a)
1701
+ });
1702
+ this.options.stream.pipe(this._outgoingDelay).pipe(this._remoteConnection.options.stream).pipe(this._incomingDelay).pipe(this.options.stream);
1703
+ this.connected.emit();
1704
+ this._remoteConnection.connected.emit();
1705
+ }).catch((err) => {
1706
+ if (this._destroyed) {
1707
+ return;
1708
+ }
1709
+ this.errors.raise(err);
1710
+ });
1711
+ }
1712
+ }
1713
+ async destroy() {
1714
+ (0, import_log10.log)("closing", {
1715
+ id: this._id
1716
+ }, {
1717
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/memory-transport.ts",
1718
+ line: 115,
1719
+ scope: this,
1720
+ callSite: (f, a) => f(...a)
1721
+ });
1722
+ this._destroyed = true;
1723
+ _MemoryTransport._connections.delete(this._id);
1724
+ if (this._remoteConnection) {
1725
+ (0, import_log10.log)("closing", {
1726
+ id: this._remoteId
1727
+ }, {
1728
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/memory-transport.ts",
1729
+ line: 120,
1730
+ scope: this,
1731
+ callSite: (f, a) => f(...a)
1732
+ });
1733
+ this._remoteConnection._destroyed = true;
1734
+ _MemoryTransport._connections.delete(this._remoteId);
1735
+ this._outgoingDelay.unpipe();
1736
+ this._incomingDelay.unpipe();
1737
+ this._remoteConnection.closed.emit();
1738
+ this._remoteConnection._remoteConnection = void 0;
1739
+ this._remoteConnection = void 0;
1740
+ (0, import_log10.log)("closed", {
1741
+ id: this._remoteId
1742
+ }, {
1743
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/memory-transport.ts",
1744
+ line: 138,
1745
+ scope: this,
1746
+ callSite: (f, a) => f(...a)
1747
+ });
1748
+ }
1749
+ this.closed.emit();
1750
+ (0, import_log10.log)("closed", {
1751
+ id: this._id
1752
+ }, {
1753
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/memory-transport.ts",
1754
+ line: 142,
1755
+ scope: this,
1756
+ callSite: (f, a) => f(...a)
1757
+ });
1758
+ }
1759
+ signal(signal) {
1760
+ const { payload: json } = signal;
1761
+ if (json && json.transportId) {
1762
+ const transportId = json.transportId;
1763
+ if (transportId) {
1764
+ const remoteId = import_keys8.PublicKey.fromHex(transportId);
1765
+ (0, import_log10.log)("received signal", {
1766
+ id: this._id,
1767
+ remoteId
1768
+ }, {
1769
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/memory-transport.ts",
1770
+ line: 152,
1771
+ scope: this,
1772
+ callSite: (f, a) => f(...a)
1773
+ });
1774
+ this._remote.wake(remoteId);
1775
+ }
1776
+ }
1777
+ }
1778
+ };
1779
+ var MemoryTransport = _MemoryTransport;
1780
+ MemoryTransport._connections = new import_util6.ComplexMap(import_keys8.PublicKey.hash);
1781
+
1782
+ // packages/core/mesh/network-manager/src/transport/webrtc-transport.ts
1783
+ var import_node_assert11 = __toESM(require("node:assert"));
1784
+ var import_simple_peer = __toESM(require("simple-peer"));
1785
+ var import_async8 = require("@dxos/async");
1786
+ var import_debug5 = require("@dxos/debug");
1787
+ var import_log11 = require("@dxos/log");
1788
+
1789
+ // packages/core/mesh/network-manager/src/transport/webrtc.ts
1790
+ var wrtc = null;
1791
+ try {
1792
+ wrtc = require("@koush/wrtc");
1793
+ } catch (e) {
1794
+ }
1795
+
1796
+ // packages/core/mesh/network-manager/src/transport/webrtc-transport.ts
1797
+ var WebRTCTransport = class {
1798
+ constructor(params) {
1799
+ var _a;
1800
+ this.params = params;
1801
+ this.closed = new import_async8.Event();
1802
+ this.connected = new import_async8.Event();
1803
+ this.errors = new import_debug5.ErrorStream();
1804
+ (0, import_log11.log)("created connection", params, {
1805
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/webrtc-transport.ts",
1806
+ line: 34,
1807
+ scope: this,
1808
+ callSite: (f, a) => f(...a)
1809
+ });
1810
+ this._peer = new import_simple_peer.default({
1811
+ initiator: this.params.initiator,
1812
+ wrtc: import_simple_peer.default.WEBRTC_SUPPORT ? void 0 : (_a = wrtc) != null ? _a : (0, import_debug5.raise)(new Error("wrtc not available")),
1813
+ config: this.params.webrtcConfig
1814
+ });
1815
+ this._peer.on("signal", async (data) => {
1816
+ (0, import_log11.log)("signal", data, {
1817
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/webrtc-transport.ts",
1818
+ line: 42,
1819
+ scope: this,
1820
+ callSite: (f, a) => f(...a)
1821
+ });
1822
+ await this.params.sendSignal({
1823
+ payload: {
1824
+ data
1825
+ }
1826
+ });
1827
+ });
1828
+ this._peer.on("connect", () => {
1829
+ (0, import_log11.log)("connected", {}, {
1830
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/webrtc-transport.ts",
1831
+ line: 47,
1832
+ scope: this,
1833
+ callSite: (f, a) => f(...a)
1834
+ });
1835
+ this.params.stream.pipe(this._peer).pipe(this.params.stream);
1836
+ this.connected.emit();
1837
+ });
1838
+ this._peer.on("close", async () => {
1839
+ (0, import_log11.log)("closed", {}, {
1840
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/webrtc-transport.ts",
1841
+ line: 53,
1842
+ scope: this,
1843
+ callSite: (f, a) => f(...a)
1844
+ });
1845
+ await this._disconnectStreams();
1846
+ this.closed.emit();
1847
+ });
1848
+ this._peer.on("error", async (err) => {
1849
+ this.errors.raise(err);
1850
+ await this.destroy();
1851
+ });
1852
+ }
1853
+ async destroy() {
1854
+ (0, import_log11.log)("closing...", {}, {
1855
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/webrtc-transport.ts",
1856
+ line: 65,
1857
+ scope: this,
1858
+ callSite: (f, a) => f(...a)
1859
+ });
1860
+ await this._disconnectStreams();
1861
+ this._peer.destroy();
1862
+ this.closed.emit();
1863
+ (0, import_log11.log)("closed", {}, {
1864
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/webrtc-transport.ts",
1865
+ line: 69,
1866
+ scope: this,
1867
+ callSite: (f, a) => f(...a)
1868
+ });
1869
+ }
1870
+ signal(signal) {
1871
+ (0, import_node_assert11.default)(this._peer, "Connection not ready to accept signals.");
1872
+ (0, import_node_assert11.default)(signal.payload.data, "Signal message must contain signal data.");
1873
+ this._peer.signal(signal.payload.data);
1874
+ }
1875
+ async _disconnectStreams() {
1876
+ var _a, _b, _c, _d;
1877
+ (_d = (_c = (_b = (_a = this.params.stream).unpipe) == null ? void 0 : _b.call(_a, this._peer)) == null ? void 0 : _c.unpipe) == null ? void 0 : _d.call(_c, this.params.stream);
1878
+ }
1879
+ };
1880
+ var createWebRTCTransportFactory = (webrtcConfig) => ({
1881
+ createTransport: (params) => new WebRTCTransport({
1882
+ ...params,
1883
+ webrtcConfig
1884
+ })
1885
+ });
1886
+
1887
+ // packages/core/mesh/network-manager/src/transport/webrtc-transport-service.ts
1888
+ var import_node_assert12 = __toESM(require("node:assert"));
1889
+ var import_node_stream2 = require("node:stream");
1890
+ var import_codec_protobuf = require("@dxos/codec-protobuf");
1891
+ var import_keys9 = require("@dxos/keys");
1892
+ var import_log12 = require("@dxos/log");
1893
+ var import_bridge = require("@dxos/protocols/proto/dxos/mesh/bridge");
1894
+ var import_util7 = require("@dxos/util");
1895
+ var WebRTCTransportService = class {
1896
+ constructor(_webrtcConfig) {
1897
+ this._webrtcConfig = _webrtcConfig;
1898
+ this.transports = new import_util7.ComplexMap(import_keys9.PublicKey.hash);
1899
+ }
1900
+ open(request) {
1901
+ const rpcStream = new import_codec_protobuf.Stream(({ ready, next, close }) => {
1902
+ const duplex = new import_node_stream2.Duplex({
1903
+ read: () => {
1904
+ },
1905
+ write: function(chunk, _, callback) {
1906
+ next({
1907
+ data: {
1908
+ payload: chunk
1909
+ }
1910
+ });
1911
+ callback();
1912
+ }
1913
+ });
1914
+ const transport = new WebRTCTransport({
1915
+ initiator: request.initiator,
1916
+ stream: duplex,
1917
+ sendSignal: async (signal) => {
1918
+ next({
1919
+ signal: {
1920
+ payload: signal
1921
+ }
1922
+ });
1923
+ }
1924
+ });
1925
+ next({
1926
+ connection: {
1927
+ state: import_bridge.ConnectionState.CONNECTING
1928
+ }
1929
+ });
1930
+ transport.connected.on(() => {
1931
+ next({
1932
+ connection: {
1933
+ state: import_bridge.ConnectionState.CONNECTED
1934
+ }
1935
+ });
1936
+ });
1937
+ transport.errors.handle((err) => {
1938
+ next({
1939
+ connection: {
1940
+ state: import_bridge.ConnectionState.CLOSED,
1941
+ error: err.toString()
1942
+ }
1943
+ });
1944
+ close(err);
1945
+ });
1946
+ transport.closed.on(() => {
1947
+ next({
1948
+ connection: {
1949
+ state: import_bridge.ConnectionState.CLOSED
1950
+ }
1951
+ });
1952
+ close();
1953
+ });
1954
+ ready();
1955
+ this.transports.set(request.proxyId, {
1956
+ transport,
1957
+ stream: duplex
1958
+ });
1959
+ });
1960
+ return rpcStream;
1961
+ }
1962
+ async sendSignal({ proxyId, signal }) {
1963
+ (0, import_node_assert12.default)(this.transports.has(proxyId));
1964
+ await this.transports.get(proxyId).transport.signal(signal);
1965
+ }
1966
+ async sendData({ proxyId, payload }) {
1967
+ (0, import_node_assert12.default)(this.transports.has(proxyId));
1968
+ await this.transports.get(proxyId).stream.push(payload);
1969
+ }
1970
+ async close({ proxyId }) {
1971
+ var _a, _b;
1972
+ await ((_a = this.transports.get(proxyId)) == null ? void 0 : _a.transport.destroy());
1973
+ await ((_b = this.transports.get(proxyId)) == null ? void 0 : _b.stream.end());
1974
+ this.transports.delete(proxyId);
1975
+ (0, import_log12.log)("Closed.", {}, {
1976
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/webrtc-transport-service.ts",
1977
+ line: 108,
1978
+ scope: this,
1979
+ callSite: (f, a) => f(...a)
1980
+ });
1981
+ }
1982
+ };
1983
+
1984
+ // packages/core/mesh/network-manager/src/transport/webrtc-transport-proxy.ts
1985
+ var import_node_assert13 = __toESM(require("node:assert"));
1986
+ var import_async9 = require("@dxos/async");
1987
+ var import_debug6 = require("@dxos/debug");
1988
+ var import_keys10 = require("@dxos/keys");
1989
+ var import_log13 = require("@dxos/log");
1990
+ var import_bridge2 = require("@dxos/protocols/proto/dxos/mesh/bridge");
1991
+ var WebRTCTransportProxy = class {
1992
+ constructor(_params) {
1993
+ this._params = _params;
1994
+ this.closed = new import_async9.Event();
1995
+ this._closed = false;
1996
+ this.connected = new import_async9.Event();
1997
+ this.errors = new import_debug6.ErrorStream();
1998
+ this._proxyId = import_keys10.PublicKey.random();
1999
+ this._serviceStream = this._params.bridgeService.open({
2000
+ proxyId: this._proxyId,
2001
+ initiator: this._params.initiator
2002
+ });
2003
+ this._serviceStream.waitUntilReady().then(() => {
2004
+ this._serviceStream.subscribe(async (event) => {
2005
+ (0, import_log13.log)("WebRTCTransportProxy: event", event, {
2006
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/webrtc-transport-proxy.ts",
2007
+ line: 46,
2008
+ scope: this,
2009
+ callSite: (f, a) => f(...a)
2010
+ });
2011
+ if (event.connection) {
2012
+ await this._handleConnection(event.connection);
2013
+ } else if (event.data) {
2014
+ this._handleData(event.data);
2015
+ } else if (event.signal) {
2016
+ await this._handleSignal(event.signal);
2017
+ }
2018
+ });
2019
+ this._params.stream.on("data", async (data) => {
2020
+ try {
2021
+ await this._params.bridgeService.sendData({
2022
+ proxyId: this._proxyId,
2023
+ payload: data
2024
+ });
2025
+ } catch (err) {
2026
+ import_log13.log.catch(err, {}, {
2027
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/webrtc-transport-proxy.ts",
2028
+ line: 63,
2029
+ scope: this,
2030
+ callSite: (f, a) => f(...a)
2031
+ });
2032
+ }
2033
+ });
2034
+ }, (error) => import_log13.log.catch(error, {}, {
2035
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/webrtc-transport-proxy.ts",
2036
+ line: 67,
2037
+ scope: this,
2038
+ callSite: (f, a) => f(...a)
2039
+ }));
2040
+ }
2041
+ async _handleConnection(connectionEvent) {
2042
+ if (connectionEvent.error) {
2043
+ this.errors.raise(new Error(connectionEvent.error));
2044
+ }
2045
+ switch (connectionEvent.state) {
2046
+ case import_bridge2.ConnectionState.CONNECTED: {
2047
+ this.connected.emit();
2048
+ break;
2049
+ }
2050
+ case import_bridge2.ConnectionState.CLOSED: {
2051
+ await this.destroy();
2052
+ break;
2053
+ }
2054
+ }
2055
+ }
2056
+ _handleData(dataEvent) {
2057
+ this._params.stream.write(Buffer.from(dataEvent.payload));
2058
+ }
2059
+ async _handleSignal(signalEvent) {
2060
+ await this._params.sendSignal(signalEvent.payload);
2061
+ }
2062
+ signal(signal) {
2063
+ this._params.bridgeService.sendSignal({
2064
+ proxyId: this._proxyId,
2065
+ signal
2066
+ }).catch((err) => this.errors.raise(err));
2067
+ }
2068
+ async destroy() {
2069
+ if (this._closed) {
2070
+ return;
2071
+ }
2072
+ this._serviceStream.close();
2073
+ try {
2074
+ await this._params.bridgeService.close({
2075
+ proxyId: this._proxyId
2076
+ });
2077
+ } catch (err) {
2078
+ import_log13.log.catch(err, {}, {
2079
+ file: "/home/runner/work/dxos/dxos/packages/core/mesh/network-manager/src/transport/webrtc-transport-proxy.ts",
2080
+ line: 117,
2081
+ scope: this,
2082
+ callSite: (f, a) => f(...a)
2083
+ });
2084
+ }
2085
+ this.closed.emit();
2086
+ this._closed = true;
2087
+ }
2088
+ forceClose() {
2089
+ this._serviceStream.close();
2090
+ this.closed.emit();
2091
+ this._closed = true;
2092
+ }
2093
+ };
2094
+ var WebRTCTransportProxyFactory = class {
2095
+ constructor() {
2096
+ this._connections = /* @__PURE__ */ new Set();
2097
+ }
2098
+ setBridgeService(bridgeService) {
2099
+ this._bridgeService = bridgeService;
2100
+ for (const connection of this._connections) {
2101
+ connection.forceClose();
2102
+ }
2103
+ return this;
2104
+ }
2105
+ createTransport(options) {
2106
+ (0, import_node_assert13.default)(this._bridgeService, "WebRTCTransportProxyFactory is not ready to open connections");
2107
+ const transport = new WebRTCTransportProxy({
2108
+ ...options,
2109
+ bridgeService: this._bridgeService
2110
+ });
2111
+ this._connections.add(transport);
2112
+ transport.closed.on(() => this._connections.delete(transport));
2113
+ return transport;
2114
+ }
2115
+ };
2116
+
2117
+ // packages/core/mesh/network-manager/src/wire-protocol.ts
2118
+ var import_crypto2 = require("@dxos/crypto");
2119
+ var import_teleport = require("@dxos/teleport");
2120
+ var adaptProtocolProvider = (factory) => ({ initiator, localPeerId, remotePeerId, topic }) => {
2121
+ const protocol = factory({
2122
+ channel: (0, import_crypto2.discoveryKey)(topic),
2123
+ initiator
2124
+ });
2125
+ return {
2126
+ initialize: () => protocol.open(),
2127
+ destroy: () => protocol.close(),
2128
+ stream: protocol.stream,
2129
+ protocol
2130
+ };
2131
+ };
2132
+ var createTeleportProtocolFactory = (onConnection) => {
2133
+ return (params) => {
2134
+ const teleport = new import_teleport.Teleport(params);
2135
+ return {
2136
+ stream: teleport.stream,
2137
+ initialize: async () => {
2138
+ await teleport.open();
2139
+ await onConnection(teleport);
2140
+ },
2141
+ destroy: async () => {
2142
+ await teleport.close();
2143
+ }
2144
+ };
2145
+ };
2146
+ };
2147
+ // Annotate the CommonJS export names for ESM import in node:
2148
+ 0 && (module.exports = {
2149
+ Connection,
2150
+ ConnectionLog,
2151
+ ConnectionState,
2152
+ EventType,
2153
+ FullyConnectedTopology,
2154
+ MMSTTopology,
2155
+ MemoryTransport,
2156
+ MemoryTransportFactory,
2157
+ MessageRouter,
2158
+ NetworkManager,
2159
+ StarTopology,
2160
+ Swarm,
2161
+ SwarmMapper,
2162
+ WebRTCTransport,
2163
+ WebRTCTransportProxy,
2164
+ WebRTCTransportProxyFactory,
2165
+ WebRTCTransportService,
2166
+ adaptProtocolProvider,
2167
+ createProtocolFactory,
2168
+ createTeleportProtocolFactory,
2169
+ createWebRTCTransportFactory,
2170
+ protocolFactory,
2171
+ transportProtocolProvider
2172
+ });
2173
+ //# sourceMappingURL=index.cjs.map