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