@xyo-network/bridge-websocket 2.99.0 → 2.99.2

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 (112) hide show
  1. package/dist/browser/Bridge.d.cts +19 -14
  2. package/dist/browser/Bridge.d.cts.map +1 -1
  3. package/dist/browser/Bridge.d.mts +19 -14
  4. package/dist/browser/Bridge.d.mts.map +1 -1
  5. package/dist/browser/Bridge.d.ts +19 -14
  6. package/dist/browser/Bridge.d.ts.map +1 -1
  7. package/dist/browser/ClientBridge.d.cts +42 -0
  8. package/dist/browser/ClientBridge.d.cts.map +1 -0
  9. package/dist/browser/ClientBridge.d.mts +42 -0
  10. package/dist/browser/ClientBridge.d.mts.map +1 -0
  11. package/dist/browser/ClientBridge.d.ts +42 -0
  12. package/dist/browser/ClientBridge.d.ts.map +1 -0
  13. package/dist/browser/Config.d.cts +9 -4
  14. package/dist/browser/Config.d.cts.map +1 -1
  15. package/dist/browser/Config.d.mts +9 -4
  16. package/dist/browser/Config.d.mts.map +1 -1
  17. package/dist/browser/Config.d.ts +9 -4
  18. package/dist/browser/Config.d.ts.map +1 -1
  19. package/dist/browser/ModuleProxy/ModuleProxy.d.cts +7 -4
  20. package/dist/browser/ModuleProxy/ModuleProxy.d.cts.map +1 -1
  21. package/dist/browser/ModuleProxy/ModuleProxy.d.mts +7 -4
  22. package/dist/browser/ModuleProxy/ModuleProxy.d.mts.map +1 -1
  23. package/dist/browser/ModuleProxy/ModuleProxy.d.ts +7 -4
  24. package/dist/browser/ModuleProxy/ModuleProxy.d.ts.map +1 -1
  25. package/dist/browser/Params.d.cts +5 -0
  26. package/dist/browser/Params.d.cts.map +1 -0
  27. package/dist/browser/Params.d.mts +5 -0
  28. package/dist/browser/Params.d.mts.map +1 -0
  29. package/dist/browser/Params.d.ts +5 -0
  30. package/dist/browser/Params.d.ts.map +1 -0
  31. package/dist/browser/{ModuleResolver.d.cts → WebsocketBridgeModuleResolver.d.cts} +6 -6
  32. package/dist/browser/WebsocketBridgeModuleResolver.d.cts.map +1 -0
  33. package/dist/browser/{ModuleResolver.d.ts → WebsocketBridgeModuleResolver.d.mts} +6 -6
  34. package/dist/browser/WebsocketBridgeModuleResolver.d.mts.map +1 -0
  35. package/dist/browser/{ModuleResolver.d.mts → WebsocketBridgeModuleResolver.d.ts} +6 -6
  36. package/dist/browser/WebsocketBridgeModuleResolver.d.ts.map +1 -0
  37. package/dist/browser/{index.cjs → index-browser.cjs} +88 -35
  38. package/dist/browser/index-browser.cjs.map +1 -0
  39. package/dist/browser/index-browser.d.cts +5 -0
  40. package/dist/browser/index-browser.d.cts.map +1 -0
  41. package/dist/browser/index-browser.d.mts +5 -0
  42. package/dist/browser/index-browser.d.mts.map +1 -0
  43. package/dist/browser/index-browser.d.ts +5 -0
  44. package/dist/browser/index-browser.d.ts.map +1 -0
  45. package/dist/browser/{index.js → index-browser.js} +85 -32
  46. package/dist/browser/index-browser.js.map +1 -0
  47. package/dist/node/Bridge.d.cts +19 -14
  48. package/dist/node/Bridge.d.cts.map +1 -1
  49. package/dist/node/Bridge.d.mts +19 -14
  50. package/dist/node/Bridge.d.mts.map +1 -1
  51. package/dist/node/Bridge.d.ts +19 -14
  52. package/dist/node/Bridge.d.ts.map +1 -1
  53. package/dist/node/ClientBridge.d.cts +42 -0
  54. package/dist/node/ClientBridge.d.cts.map +1 -0
  55. package/dist/node/ClientBridge.d.mts +42 -0
  56. package/dist/node/ClientBridge.d.mts.map +1 -0
  57. package/dist/node/ClientBridge.d.ts +42 -0
  58. package/dist/node/ClientBridge.d.ts.map +1 -0
  59. package/dist/node/Config.d.cts +9 -4
  60. package/dist/node/Config.d.cts.map +1 -1
  61. package/dist/node/Config.d.mts +9 -4
  62. package/dist/node/Config.d.mts.map +1 -1
  63. package/dist/node/Config.d.ts +9 -4
  64. package/dist/node/Config.d.ts.map +1 -1
  65. package/dist/node/ModuleProxy/ModuleProxy.d.cts +7 -4
  66. package/dist/node/ModuleProxy/ModuleProxy.d.cts.map +1 -1
  67. package/dist/node/ModuleProxy/ModuleProxy.d.mts +7 -4
  68. package/dist/node/ModuleProxy/ModuleProxy.d.mts.map +1 -1
  69. package/dist/node/ModuleProxy/ModuleProxy.d.ts +7 -4
  70. package/dist/node/ModuleProxy/ModuleProxy.d.ts.map +1 -1
  71. package/dist/node/Params.d.cts +5 -0
  72. package/dist/node/Params.d.cts.map +1 -0
  73. package/dist/node/Params.d.mts +5 -0
  74. package/dist/node/Params.d.mts.map +1 -0
  75. package/dist/node/Params.d.ts +5 -0
  76. package/dist/node/Params.d.ts.map +1 -0
  77. package/dist/node/{ModuleResolver.d.cts → WebsocketBridgeModuleResolver.d.cts} +6 -6
  78. package/dist/node/WebsocketBridgeModuleResolver.d.cts.map +1 -0
  79. package/dist/node/WebsocketBridgeModuleResolver.d.mts +11 -0
  80. package/dist/node/WebsocketBridgeModuleResolver.d.mts.map +1 -0
  81. package/dist/node/WebsocketBridgeModuleResolver.d.ts +11 -0
  82. package/dist/node/WebsocketBridgeModuleResolver.d.ts.map +1 -0
  83. package/dist/node/index-browser.d.cts +5 -0
  84. package/dist/node/index-browser.d.cts.map +1 -0
  85. package/dist/node/index-browser.d.mts +5 -0
  86. package/dist/node/index-browser.d.mts.map +1 -0
  87. package/dist/node/index-browser.d.ts +5 -0
  88. package/dist/node/index-browser.d.ts.map +1 -0
  89. package/dist/node/index.cjs +167 -34
  90. package/dist/node/index.cjs.map +1 -1
  91. package/dist/node/index.js +167 -35
  92. package/dist/node/index.js.map +1 -1
  93. package/package.json +25 -25
  94. package/src/Bridge.ts +63 -30
  95. package/src/ClientBridge.ts +113 -0
  96. package/src/Config.ts +11 -4
  97. package/src/ModuleProxy/ModuleProxy.ts +21 -13
  98. package/src/Params.ts +7 -0
  99. package/src/{ModuleResolver.ts → WebsocketBridgeModuleResolver.ts} +23 -14
  100. package/src/index-browser.ts +4 -0
  101. package/xy.config.ts +14 -0
  102. package/dist/browser/ModuleResolver.d.cts.map +0 -1
  103. package/dist/browser/ModuleResolver.d.mts.map +0 -1
  104. package/dist/browser/ModuleResolver.d.ts.map +0 -1
  105. package/dist/browser/index.cjs.map +0 -1
  106. package/dist/browser/index.js.map +0 -1
  107. package/dist/node/ModuleResolver.d.cts.map +0 -1
  108. package/dist/node/ModuleResolver.d.mts +0 -11
  109. package/dist/node/ModuleResolver.d.mts.map +0 -1
  110. package/dist/node/ModuleResolver.d.ts +0 -11
  111. package/dist/node/ModuleResolver.d.ts.map +0 -1
  112. package/src/spec/socketServer.ts +0 -68
@@ -29,20 +29,29 @@ var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
29
29
  // src/index.ts
30
30
  var src_exports = {};
31
31
  __export(src_exports, {
32
+ BridgeCommands: () => BridgeCommands,
32
33
  WebsocketBridge: () => WebsocketBridge,
33
34
  WebsocketBridgeConfigSchema: () => WebsocketBridgeConfigSchema
34
35
  });
35
36
  module.exports = __toCommonJS(src_exports);
36
37
 
37
38
  // src/Bridge.ts
39
+ var import_node_http = require("http");
40
+ var import_assert3 = require("@xylabs/assert");
41
+ var import_module_model3 = require("@xyo-network/module-model");
42
+ var import_socket = require("socket.io");
43
+
44
+ // src/ClientBridge.ts
38
45
  var import_assert2 = require("@xylabs/assert");
39
46
  var import_abstract_bridge3 = require("@xyo-network/abstract-bridge");
40
47
  var import_module_model2 = require("@xyo-network/module-model");
48
+ var import_async_mutex = require("async-mutex");
49
+ var import_lru_cache = require("lru-cache");
41
50
 
42
51
  // src/Config.ts
43
52
  var WebsocketBridgeConfigSchema = "network.xyo.bridge.websocket.config";
44
53
 
45
- // src/ModuleResolver.ts
54
+ // src/WebsocketBridgeModuleResolver.ts
46
55
  var import_assert = require("@xylabs/assert");
47
56
  var import_hex = require("@xylabs/hex");
48
57
  var import_abstract_bridge2 = require("@xyo-network/abstract-bridge");
@@ -53,30 +62,28 @@ var import_module_model = require("@xyo-network/module-model");
53
62
  // src/ModuleProxy/ModuleProxy.ts
54
63
  var import_abstract_bridge = require("@xyo-network/abstract-bridge");
55
64
  var _WebsocketModuleProxy = class _WebsocketModuleProxy extends import_abstract_bridge.AbstractModuleProxy {
56
- async proxyQueryHandler(query, payloads = []) {
57
- var _a;
58
- const { maxPayloadSizeWarning } = this.params;
59
- const payloadSize = JSON.stringify([
60
- query,
61
- payloads
62
- ]).length;
63
- if (maxPayloadSizeWarning && payloadSize > maxPayloadSizeWarning) {
64
- (_a = this.logger) == null ? void 0 : _a.warn(`Large targetQuery being sent: ${payloadSize} bytes [${this.address}][${this.moduleAddress}] [${query.schema}] [${payloads == null ? void 0 : payloads.length}]`);
65
+ constructor(params) {
66
+ _WebsocketModuleProxy.createCount = _WebsocketModuleProxy.createCount + 1;
67
+ if (Math.floor(_WebsocketModuleProxy.createCount / 10) === _WebsocketModuleProxy.createCount / 10) {
68
+ console.log(`WebsocketModuleProxy.createCount: ${_WebsocketModuleProxy.createCount}`);
65
69
  }
66
- await Promise.resolve();
67
- throw new Error("Unsupported");
70
+ super(params);
71
+ }
72
+ async proxyQueryHandler(query, payloads = []) {
73
+ return await this.params.querySender.sendBridgeQuery(this.params.moduleAddress, query, payloads);
68
74
  }
69
75
  };
70
76
  __name(_WebsocketModuleProxy, "WebsocketModuleProxy");
77
+ __publicField(_WebsocketModuleProxy, "createCount", 0);
71
78
  var WebsocketModuleProxy = _WebsocketModuleProxy;
72
79
 
73
- // src/ModuleResolver.ts
80
+ // src/WebsocketBridgeModuleResolver.ts
74
81
  var _WebsocketBridgeModuleResolver = class _WebsocketBridgeModuleResolver extends import_abstract_bridge2.AbstractBridgeModuleResolver {
75
- moduleUrl(address) {
76
- return new URL(address, this.params.url);
82
+ get querySender() {
83
+ return this.params.querySender;
77
84
  }
78
85
  async resolveHandler(id, options) {
79
- var _a;
86
+ var _a, _b;
80
87
  const parentResult = await super.resolveHandler(id, options);
81
88
  if (parentResult) {
82
89
  return parentResult;
@@ -85,7 +92,8 @@ var _WebsocketBridgeModuleResolver = class _WebsocketBridgeModuleResolver extend
85
92
  return [];
86
93
  }
87
94
  const idParts = id.split(":");
88
- const firstPart = (0, import_assert.assertEx)(idParts.shift(), () => "Missing firstPart");
95
+ const untransformedFirstPart = (0, import_assert.assertEx)(idParts.shift(), () => `Invalid module identifier: ${id}`);
96
+ const firstPart = await import_module_model.ResolveHelper.transformModuleIdentifier(untransformedFirstPart);
89
97
  const moduleAddress = firstPart;
90
98
  (0, import_assert.assertEx)((0, import_hex.isAddress)(firstPart), () => `Invalid module address: ${firstPart}`);
91
99
  const remainderParts = idParts.join(":");
@@ -96,33 +104,34 @@ var _WebsocketBridgeModuleResolver = class _WebsocketBridgeModuleResolver extend
96
104
  },
97
105
  host: this,
98
106
  moduleAddress,
99
- moduleUrl: this.moduleUrl(moduleAddress).href
107
+ querySender: this.querySender
100
108
  };
109
+ (_a = this.logger) == null ? void 0 : _a.debug(`creating HttpProxy [${moduleAddress}] ${id}`);
101
110
  const proxy = new WebsocketModuleProxy(params);
102
111
  if (proxy) {
103
112
  const state = await proxy.state();
104
113
  if (state) {
105
- const configSchema = (_a = state.find((payload) => payload.schema === import_config_payload_plugin.ConfigSchema)) == null ? void 0 : _a.config;
114
+ const configSchema = (_b = state.find((payload) => payload.schema === import_config_payload_plugin.ConfigSchema)) == null ? void 0 : _b.config;
106
115
  const config = (0, import_assert.assertEx)(state.find((payload) => payload.schema === configSchema), () => "Unable to locate config");
107
116
  proxy.setConfig(config);
108
117
  }
109
118
  }
110
119
  await proxy.start();
111
120
  const wrapped = (0, import_assert.assertEx)((0, import_abstract_bridge2.wrapModuleWithType)(proxy, import_account.Account.randomSync()), () => `Failed to wrapModuleWithType [${id}]`);
112
- const as = (0, import_assert.assertEx)((0, import_module_model.asModuleInstance)(wrapped, {}), () => `Failed to asModuleInstance [${id}]`);
113
- proxy.upResolver.add(as);
114
- proxy.downResolver.add(as);
121
+ const instance = (0, import_assert.assertEx)((0, import_module_model.asModuleInstance)(wrapped, {}), () => `Failed to asModuleInstance [${id}]`);
122
+ proxy.upResolver.add(instance);
123
+ proxy.downResolver.add(instance);
115
124
  if (remainderParts.length > 0) {
116
125
  const result = await wrapped.resolve(remainderParts, options);
117
126
  return result;
118
127
  }
119
- return as;
128
+ return instance;
120
129
  }
121
130
  };
122
131
  __name(_WebsocketBridgeModuleResolver, "WebsocketBridgeModuleResolver");
123
132
  var WebsocketBridgeModuleResolver = _WebsocketBridgeModuleResolver;
124
133
 
125
- // src/Bridge.ts
134
+ // src/ClientBridge.ts
126
135
  function _ts_decorate(decorators, target, key, desc) {
127
136
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
128
137
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
@@ -134,19 +143,43 @@ function _ts_decorate(decorators, target, key, desc) {
134
143
  return c > 3 && r && Object.defineProperty(target, key, r), r;
135
144
  }
136
145
  __name(_ts_decorate, "_ts_decorate");
137
- var _WebsocketBridge = class _WebsocketBridge extends import_abstract_bridge3.AbstractBridge {
146
+ var _WebsocketClientBridge = class _WebsocketClientBridge extends import_abstract_bridge3.AbstractBridge {
147
+ _failureTimeCache = new import_lru_cache.LRUCache({
148
+ max: _WebsocketClientBridge.maxFailureCacheSize
149
+ });
150
+ _querySemaphore;
138
151
  _resolver;
152
+ get client() {
153
+ return this.config.client;
154
+ }
155
+ get failureRetryTime() {
156
+ var _a;
157
+ return ((_a = this.client) == null ? void 0 : _a.failureRetryTime) ?? _WebsocketClientBridge.defaultFailureRetryTime;
158
+ }
159
+ get maxConnections() {
160
+ var _a;
161
+ return ((_a = this.client) == null ? void 0 : _a.maxConnections) ?? _WebsocketClientBridge.defaultMaxConnections;
162
+ }
163
+ get maxPayloadSizeWarning() {
164
+ var _a;
165
+ return ((_a = this.client) == null ? void 0 : _a.maxPayloadSizeWarning) ?? _WebsocketClientBridge.defaultMaxPayloadSizeWarning;
166
+ }
167
+ get querySemaphore() {
168
+ this._querySemaphore = this._querySemaphore ?? new import_async_mutex.Semaphore(this.maxConnections);
169
+ return this._querySemaphore;
170
+ }
139
171
  get resolver() {
140
172
  this._resolver = this._resolver ?? new WebsocketBridgeModuleResolver({
141
173
  bridge: this,
174
+ querySender: this,
142
175
  root: this,
143
- url: this.url,
144
176
  wrapperAccount: this.account
145
177
  });
146
178
  return this._resolver;
147
179
  }
148
180
  get url() {
149
- return (0, import_assert2.assertEx)(this.config.url, () => "No Url Set");
181
+ var _a;
182
+ return (0, import_assert2.assertEx)((_a = this.config.client) == null ? void 0 : _a.url, () => "No Url Set");
150
183
  }
151
184
  async discoverRoots() {
152
185
  return await Promise.resolve([]);
@@ -157,6 +190,26 @@ var _WebsocketBridge = class _WebsocketBridge extends import_abstract_bridge3.Ab
157
190
  exposedHandler() {
158
191
  throw new Error("Unsupported");
159
192
  }
193
+ async sendBridgeQuery(targetAddress, _query, _payloads) {
194
+ const lastFailureTime = this._failureTimeCache.get(targetAddress);
195
+ if (lastFailureTime !== void 0) {
196
+ const now = Date.now();
197
+ const timeSincePreviousFailure = now - lastFailureTime;
198
+ if (timeSincePreviousFailure > this.failureRetryTime) {
199
+ throw new Error(`target module failed recently [${targetAddress}] [${timeSincePreviousFailure}ms ago]`);
200
+ }
201
+ this._failureTimeCache.delete(targetAddress);
202
+ }
203
+ try {
204
+ await this.querySemaphore.acquire();
205
+ throw new Error("Unsupported");
206
+ } catch (ex) {
207
+ const error = ex;
208
+ throw error;
209
+ } finally {
210
+ this.querySemaphore.release();
211
+ }
212
+ }
160
213
  async startHandler() {
161
214
  const { discoverRoot = true } = this.config;
162
215
  if (discoverRoot) {
@@ -168,19 +221,99 @@ var _WebsocketBridge = class _WebsocketBridge extends import_abstract_bridge3.Ab
168
221
  throw new Error("Unsupported");
169
222
  }
170
223
  };
171
- __name(_WebsocketBridge, "WebsocketBridge");
172
- __publicField(_WebsocketBridge, "configSchemas", [
173
- ...__superGet(_WebsocketBridge, _WebsocketBridge, "configSchemas"),
224
+ __name(_WebsocketClientBridge, "WebsocketClientBridge");
225
+ __publicField(_WebsocketClientBridge, "configSchemas", [
226
+ ...__superGet(_WebsocketClientBridge, _WebsocketClientBridge, "configSchemas"),
174
227
  WebsocketBridgeConfigSchema
175
228
  ]);
176
- __publicField(_WebsocketBridge, "defaultConfigSchema", WebsocketBridgeConfigSchema);
177
- __publicField(_WebsocketBridge, "maxPayloadSizeWarning", 256 * 256);
178
- var WebsocketBridge = _WebsocketBridge;
179
- WebsocketBridge = _ts_decorate([
229
+ __publicField(_WebsocketClientBridge, "defaultConfigSchema", WebsocketBridgeConfigSchema);
230
+ __publicField(_WebsocketClientBridge, "defaultFailureRetryTime", 1e3 * 60);
231
+ __publicField(_WebsocketClientBridge, "defaultMaxConnections", 4);
232
+ __publicField(_WebsocketClientBridge, "defaultMaxPayloadSizeWarning", 256 * 256);
233
+ __publicField(_WebsocketClientBridge, "maxFailureCacheSize", 1e3);
234
+ var WebsocketClientBridge = _WebsocketClientBridge;
235
+ WebsocketClientBridge = _ts_decorate([
180
236
  (0, import_module_model2.creatableModule)()
237
+ ], WebsocketClientBridge);
238
+
239
+ // src/Bridge.ts
240
+ function _ts_decorate2(decorators, target, key, desc) {
241
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
242
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
243
+ r = Reflect.decorate(decorators, target, key, desc);
244
+ else
245
+ for (var i = decorators.length - 1; i >= 0; i--)
246
+ if (d = decorators[i])
247
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
248
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
249
+ }
250
+ __name(_ts_decorate2, "_ts_decorate");
251
+ var BridgeCommands = {
252
+ join: "join",
253
+ query: "query"
254
+ };
255
+ var DEFAULT_HOST_PORT = 8080;
256
+ var _WebsocketBridge = class _WebsocketBridge extends WebsocketClientBridge {
257
+ httpServer;
258
+ server;
259
+ get host() {
260
+ return this.config.host;
261
+ }
262
+ exposeHandler(_id, _options) {
263
+ throw new Error("Unsupported");
264
+ }
265
+ exposedHandler() {
266
+ throw new Error("Unsupported");
267
+ }
268
+ async startHandler() {
269
+ if (this.host) {
270
+ this.startServer();
271
+ }
272
+ return await super.startHandler();
273
+ }
274
+ async stopHandler() {
275
+ if (this.host) {
276
+ this.stopServer();
277
+ }
278
+ return await super.stopHandler();
279
+ }
280
+ startServer() {
281
+ if (this.httpServer) {
282
+ throw new Error("Http Server already started");
283
+ }
284
+ if (this.server) {
285
+ throw new Error("Socket Server already started");
286
+ }
287
+ const host = (0, import_assert3.assertEx)(this.host, () => "No Host Configured");
288
+ this.httpServer = (0, import_node_http.createServer)();
289
+ this.server = new import_socket.Server(this.httpServer);
290
+ this.server.on("connection", (socket) => {
291
+ socket.on(BridgeCommands.join, async (address) => {
292
+ await socket.join(address);
293
+ console.log(`User ${socket.id} has connected to module ${address}`);
294
+ });
295
+ socket.on(BridgeCommands.query, ({ address, query }) => {
296
+ socket.to(address).emit("message", query);
297
+ });
298
+ });
299
+ this.httpServer.listen(host.port ?? DEFAULT_HOST_PORT);
300
+ }
301
+ stopServer() {
302
+ var _a, _b;
303
+ (_a = this.server) == null ? void 0 : _a.close();
304
+ this.server = void 0;
305
+ (_b = this.httpServer) == null ? void 0 : _b.close();
306
+ this.httpServer = void 0;
307
+ }
308
+ };
309
+ __name(_WebsocketBridge, "WebsocketBridge");
310
+ var WebsocketBridge = _WebsocketBridge;
311
+ WebsocketBridge = _ts_decorate2([
312
+ (0, import_module_model3.creatableModule)()
181
313
  ], WebsocketBridge);
182
314
  // Annotate the CommonJS export names for ESM import in node:
183
315
  0 && (module.exports = {
316
+ BridgeCommands,
184
317
  WebsocketBridge,
185
318
  WebsocketBridgeConfigSchema
186
319
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/Bridge.ts","../../src/Config.ts","../../src/ModuleResolver.ts","../../src/ModuleProxy/ModuleProxy.ts"],"sourcesContent":["export * from './Bridge'\nexport * from './Config'\n","import { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { AbstractBridge } from '@xyo-network/abstract-bridge'\nimport { BridgeExposeOptions, BridgeModule, BridgeParams, BridgeUnexposeOptions } from '@xyo-network/bridge-model'\nimport { AnyConfigSchema, creatableModule, ModuleInstance } from '@xyo-network/module-model'\nimport { Schema } from '@xyo-network/payload-model'\n\nimport { WebsocketBridgeConfig, WebsocketBridgeConfigSchema } from './Config'\nimport { WebsocketBridgeModuleResolver } from './ModuleResolver'\n\nexport type WebsocketBridgeParams<TConfig extends AnyConfigSchema<WebsocketBridgeConfig> = AnyConfigSchema<WebsocketBridgeConfig>> =\n BridgeParams<TConfig>\n\n@creatableModule()\nexport class WebsocketBridge<TParams extends WebsocketBridgeParams> extends AbstractBridge<TParams> implements BridgeModule<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, WebsocketBridgeConfigSchema]\n static override readonly defaultConfigSchema: Schema = WebsocketBridgeConfigSchema\n static maxPayloadSizeWarning = 256 * 256\n\n private _resolver?: WebsocketBridgeModuleResolver\n\n override get resolver() {\n this._resolver = this._resolver ?? new WebsocketBridgeModuleResolver({ bridge: this, root: this, url: this.url, wrapperAccount: this.account })\n return this._resolver\n }\n\n get url() {\n return assertEx(this.config.url, () => 'No Url Set')\n }\n\n override async discoverRoots(): Promise<ModuleInstance[]> {\n return await Promise.resolve([])\n }\n\n override exposeHandler(_id: string, _options?: BridgeExposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n override exposedHandler(): Promisable<Address[]> {\n throw new Error('Unsupported')\n }\n\n override async startHandler(): Promise<boolean> {\n const { discoverRoot = true } = this.config\n if (discoverRoot) {\n await this.discoverRoots()\n }\n return true\n }\n\n override unexposeHandler(_id: string, _options?: BridgeUnexposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n}\n","import { EmptyObject } from '@xylabs/object'\nimport { BridgeConfig } from '@xyo-network/bridge-model'\n\nexport const WebsocketBridgeConfigSchema = 'network.xyo.bridge.websocket.config'\nexport type WebsocketBridgeConfigSchema = typeof WebsocketBridgeConfigSchema\n\nexport type WebsocketBridgeConfig<TConfig extends EmptyObject = EmptyObject, TSchema extends string | void = void> = BridgeConfig<\n {\n discoverRoot?: boolean\n /** @deprecated Do not use this for any new development */\n legacyMode?: boolean\n schema: WebsocketBridgeConfigSchema\n url?: string\n } & TConfig,\n TSchema extends string ? TSchema : WebsocketBridgeConfigSchema\n>\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { AbstractBridgeModuleResolver, BridgeModuleResolverParams, wrapModuleWithType } from '@xyo-network/abstract-bridge'\nimport { Account } from '@xyo-network/account'\nimport { ConfigPayload, ConfigSchema } from '@xyo-network/config-payload-plugin'\nimport { asModuleInstance, ModuleConfig, ModuleConfigSchema, ModuleFilterOptions, ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model'\n\nimport { WebsocketModuleProxy, WebsocketModuleProxyParams } from './ModuleProxy'\n\nexport interface WebsocketBridgeModuleResolverOptions extends BridgeModuleResolverParams {\n url: string\n}\n\nexport class WebsocketBridgeModuleResolver<\n T extends WebsocketBridgeModuleResolverOptions = WebsocketBridgeModuleResolverOptions,\n> extends AbstractBridgeModuleResolver<T> {\n moduleUrl(address: Address) {\n return new URL(address, this.params.url)\n }\n\n override async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n id: ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n const parentResult = await super.resolveHandler(id, options)\n if (parentResult) {\n return parentResult\n }\n if (id === '*') {\n return []\n }\n const idParts = id.split(':')\n const firstPart = assertEx(idParts.shift(), () => 'Missing firstPart')\n const moduleAddress = firstPart as Address\n assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`)\n const remainderParts = idParts.join(':')\n const params: WebsocketModuleProxyParams = {\n account: Account.randomSync(),\n config: { schema: ModuleConfigSchema },\n host: this,\n moduleAddress,\n moduleUrl: this.moduleUrl(moduleAddress).href,\n }\n\n //console.log(`creating WebsocketProxy [${moduleAddress}] ${id}`)\n\n const proxy = new WebsocketModuleProxy<T, WebsocketModuleProxyParams>(params)\n //calling state here to get the config\n if (proxy) {\n const state = await proxy.state()\n if (state) {\n const configSchema = (state.find((payload) => payload.schema === ConfigSchema) as ConfigPayload | undefined)?.config\n const config = assertEx(\n state.find((payload) => payload.schema === configSchema),\n () => 'Unable to locate config',\n ) as ModuleConfig\n proxy.setConfig(config)\n }\n }\n\n await proxy.start()\n\n const wrapped = assertEx(wrapModuleWithType(proxy, Account.randomSync()) as unknown as T, () => `Failed to wrapModuleWithType [${id}]`)\n const as = assertEx(asModuleInstance<T>(wrapped, {}), () => `Failed to asModuleInstance [${id}]`)\n proxy.upResolver.add(as)\n proxy.downResolver.add(as)\n\n if (remainderParts.length > 0) {\n const result = await wrapped.resolve<T>(remainderParts, options)\n return result\n }\n\n //console.log(`resolved: ${proxy.address} [${wrapped.constructor.name}] [${as.constructor.name}]`)\n return as\n }\n}\n","import { AbstractModuleProxy, ModuleProxyParams } from '@xyo-network/abstract-bridge'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { io as Client } from 'socket.io-client'\n\nexport type WebsocketModuleProxyParams = ModuleProxyParams & {\n client?: typeof Client\n maxPayloadSizeWarning?: number\n moduleUrl: string\n}\n\nexport class WebsocketModuleProxy<\n TWrappedModule extends ModuleInstance = ModuleInstance,\n TParams extends Omit<WebsocketModuleProxyParams, 'config'> & { config: TWrappedModule['config'] } = Omit<WebsocketModuleProxyParams, 'config'> & {\n config: TWrappedModule['config']\n },\n >\n extends AbstractModuleProxy<TWrappedModule, TParams>\n implements ModuleInstance<TParams, TWrappedModule['eventData']>\n{\n async proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads: Payload[] = []): Promise<ModuleQueryResult> {\n const { maxPayloadSizeWarning } = this.params\n const payloadSize = JSON.stringify([query, payloads]).length\n if (maxPayloadSizeWarning && payloadSize > maxPayloadSizeWarning) {\n this.logger?.warn(\n `Large targetQuery being sent: ${payloadSize} bytes [${this.address}][${this.moduleAddress}] [${query.schema}] [${payloads?.length}]`,\n )\n }\n await Promise.resolve()\n throw new Error('Unsupported')\n }\n}\n"],"mappings":"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","names":["import_assert","import_abstract_bridge","import_module_model","WebsocketBridgeConfigSchema","import_abstract_bridge","WebsocketModuleProxy","AbstractModuleProxy","proxyQueryHandler","query","payloads","maxPayloadSizeWarning","params","payloadSize","JSON","stringify","length","logger","warn","address","moduleAddress","schema","Promise","resolve","Error","WebsocketBridgeModuleResolver","AbstractBridgeModuleResolver","moduleUrl","address","URL","params","url","resolveHandler","id","options","parentResult","idParts","split","firstPart","assertEx","shift","moduleAddress","isAddress","remainderParts","join","account","Account","randomSync","config","schema","ModuleConfigSchema","host","href","proxy","WebsocketModuleProxy","state","configSchema","find","payload","ConfigSchema","setConfig","start","wrapped","wrapModuleWithType","as","asModuleInstance","upResolver","add","downResolver","length","result","resolve","WebsocketBridge","AbstractBridge","_resolver","resolver","WebsocketBridgeModuleResolver","bridge","root","url","wrapperAccount","account","assertEx","config","discoverRoots","Promise","resolve","exposeHandler","_id","_options","Error","exposedHandler","startHandler","discoverRoot","unexposeHandler","configSchemas","WebsocketBridgeConfigSchema","defaultConfigSchema","maxPayloadSizeWarning","creatableModule"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/Bridge.ts","../../src/ClientBridge.ts","../../src/Config.ts","../../src/WebsocketBridgeModuleResolver.ts","../../src/ModuleProxy/ModuleProxy.ts"],"sourcesContent":["export * from './Bridge'\nexport * from './Config'\n","import { createServer as createHttpServer, Server as HttpServer } from 'node:http'\n\nimport { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { BridgeExposeOptions, BridgeModule } from '@xyo-network/bridge-model'\nimport { AnyConfigSchema, creatableModule, ModuleInstance } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { Server, Socket } from 'socket.io'\n\nimport { WebsocketClientBridge } from './ClientBridge'\nimport { WebsocketBridgeConfig } from './Config'\nimport { WebsocketBridgeParams } from './Params'\n\nexport const BridgeCommands = {\n join: 'join',\n query: 'query',\n}\n\nconst DEFAULT_HOST_PORT = 8080\n\n@creatableModule()\nexport class WebsocketBridge<\n TParams extends WebsocketBridgeParams<AnyConfigSchema<WebsocketBridgeConfig>> = WebsocketBridgeParams<WebsocketBridgeConfig>,\n >\n extends WebsocketClientBridge<TParams>\n implements BridgeModule<TParams>\n{\n httpServer?: HttpServer\n server?: Server\n\n get host() {\n return this.config.host\n }\n\n override exposeHandler(_id: string, _options?: BridgeExposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n override exposedHandler(): Promisable<Address[]> {\n throw new Error('Unsupported')\n }\n\n override async startHandler(): Promise<boolean> {\n if (this.host) {\n this.startServer()\n }\n return await super.startHandler()\n }\n\n override async stopHandler(): Promise<boolean> {\n if (this.host) {\n this.stopServer()\n }\n return await super.stopHandler()\n }\n\n private startServer() {\n if (this.httpServer) {\n throw new Error('Http Server already started')\n }\n if (this.server) {\n throw new Error('Socket Server already started')\n }\n const host = assertEx(this.host, () => 'No Host Configured')\n this.httpServer = createHttpServer()\n this.server = new Server(this.httpServer)\n\n this.server.on('connection', (socket: Socket) => {\n socket.on(BridgeCommands.join, async (address: Address) => {\n await socket.join(address)\n console.log(`User ${socket.id} has connected to module ${address}`)\n })\n\n socket.on(BridgeCommands.query, ({ address, query }: { address: Address; query: Payload[] }) => {\n socket.to(address).emit('message', query)\n })\n })\n this.httpServer.listen(host.port ?? DEFAULT_HOST_PORT)\n }\n\n private stopServer() {\n this.server?.close()\n this.server = undefined\n this.httpServer?.close()\n this.httpServer = undefined\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { AbstractBridge } from '@xyo-network/abstract-bridge'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BridgeExposeOptions, BridgeModule, BridgeUnexposeOptions } from '@xyo-network/bridge-model'\nimport { creatableModule, ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport { Payload, Schema } from '@xyo-network/payload-model'\nimport { Semaphore } from 'async-mutex'\nimport { LRUCache } from 'lru-cache'\n\nimport { WebsocketBridgeConfigSchema } from './Config'\nimport { WebsocketBridgeQuerySender } from './ModuleProxy'\nimport { WebsocketBridgeParams } from './Params'\nimport { WebsocketBridgeModuleResolver } from './WebsocketBridgeModuleResolver'\n\n@creatableModule()\nexport class WebsocketClientBridge<TParams extends WebsocketBridgeParams = WebsocketBridgeParams>\n extends AbstractBridge<TParams>\n implements BridgeModule<TParams>, WebsocketBridgeQuerySender\n{\n static override readonly configSchemas: Schema[] = [...super.configSchemas, WebsocketBridgeConfigSchema]\n static override readonly defaultConfigSchema: Schema = WebsocketBridgeConfigSchema\n static defaultFailureRetryTime = 1000 * 60\n static defaultMaxConnections = 4\n static defaultMaxPayloadSizeWarning = 256 * 256\n static maxFailureCacheSize = 1000\n\n private _failureTimeCache = new LRUCache<Address, number>({ max: WebsocketClientBridge.maxFailureCacheSize })\n private _querySemaphore?: Semaphore\n\n private _resolver?: WebsocketBridgeModuleResolver\n\n get client() {\n return this.config.client\n }\n\n get failureRetryTime() {\n return this.client?.failureRetryTime ?? WebsocketClientBridge.defaultFailureRetryTime\n }\n\n get maxConnections() {\n return this.client?.maxConnections ?? WebsocketClientBridge.defaultMaxConnections\n }\n\n get maxPayloadSizeWarning() {\n return this.client?.maxPayloadSizeWarning ?? WebsocketClientBridge.defaultMaxPayloadSizeWarning\n }\n\n get querySemaphore() {\n this._querySemaphore = this._querySemaphore ?? new Semaphore(this.maxConnections)\n return this._querySemaphore\n }\n\n override get resolver() {\n this._resolver =\n this._resolver ?? new WebsocketBridgeModuleResolver({ bridge: this, querySender: this, root: this, wrapperAccount: this.account })\n return this._resolver\n }\n\n get url() {\n return assertEx(this.config.client?.url, () => 'No Url Set')\n }\n\n override async discoverRoots(): Promise<ModuleInstance[]> {\n return await Promise.resolve([])\n }\n\n override exposeHandler(_id: string, _options?: BridgeExposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n override exposedHandler(): Promisable<Address[]> {\n throw new Error('Unsupported')\n }\n\n async sendBridgeQuery<TOut extends Payload = Payload, TQuery extends QueryBoundWitness = QueryBoundWitness, TIn extends Payload = Payload>(\n targetAddress: Address,\n _query: TQuery,\n _payloads?: TIn[],\n ): Promise<ModuleQueryResult<TOut>> {\n const lastFailureTime = this._failureTimeCache.get(targetAddress)\n if (lastFailureTime !== undefined) {\n const now = Date.now()\n const timeSincePreviousFailure = now - lastFailureTime\n if (timeSincePreviousFailure > this.failureRetryTime) {\n throw new Error(`target module failed recently [${targetAddress}] [${timeSincePreviousFailure}ms ago]`)\n }\n this._failureTimeCache.delete(targetAddress)\n }\n try {\n await this.querySemaphore.acquire()\n throw new Error('Unsupported')\n } catch (ex) {\n const error = ex as Error\n throw error\n } finally {\n this.querySemaphore.release()\n }\n }\n\n override async startHandler(): Promise<boolean> {\n const { discoverRoot = true } = this.config\n if (discoverRoot) {\n await this.discoverRoots()\n }\n return true\n }\n\n override unexposeHandler(_id: string, _options?: BridgeUnexposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n}\n","import { EmptyObject } from '@xylabs/object'\nimport { BridgeConfig } from '@xyo-network/bridge-model'\n\nexport const WebsocketBridgeConfigSchema = 'network.xyo.bridge.websocket.config'\nexport type WebsocketBridgeConfigSchema = typeof WebsocketBridgeConfigSchema\n\nexport type WebsocketBridgeConfig<TConfig extends EmptyObject = EmptyObject, TSchema extends string | void = void> = BridgeConfig<\n {\n discoverRoot?: boolean\n schema: WebsocketBridgeConfigSchema\n } & TConfig,\n TSchema extends string ? TSchema : WebsocketBridgeConfigSchema,\n {\n failureRetryTime?: number\n failureTimeCacheMax?: number\n maxConnections?: number\n maxPayloadSizeWarning?: number\n url: string\n },\n {\n port?: number\n }\n>\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { AbstractBridgeModuleResolver, BridgeModuleResolverParams, wrapModuleWithType } from '@xyo-network/abstract-bridge'\nimport { Account } from '@xyo-network/account'\nimport { ConfigPayload, ConfigSchema } from '@xyo-network/config-payload-plugin'\nimport {\n asModuleInstance,\n ModuleConfig,\n ModuleConfigSchema,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ResolveHelper,\n} from '@xyo-network/module-model'\n\nimport { WebsocketBridgeQuerySender, WebsocketModuleProxy, WebsocketModuleProxyParams } from './ModuleProxy'\n\nexport interface WebsocketBridgeModuleResolverParams extends BridgeModuleResolverParams {\n querySender: WebsocketBridgeQuerySender\n}\n\nexport class WebsocketBridgeModuleResolver<\n T extends WebsocketBridgeModuleResolverParams = WebsocketBridgeModuleResolverParams,\n> extends AbstractBridgeModuleResolver<T> {\n get querySender() {\n return this.params.querySender\n }\n\n override async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n id: ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n const parentResult = await super.resolveHandler(id, options)\n if (parentResult) {\n return parentResult\n }\n if (id === '*') {\n return []\n }\n const idParts = id.split(':')\n const untransformedFirstPart = assertEx(idParts.shift(), () => `Invalid module identifier: ${id}`)\n const firstPart = await ResolveHelper.transformModuleIdentifier(untransformedFirstPart)\n const moduleAddress = firstPart as Address\n assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`)\n const remainderParts = idParts.join(':')\n const params: WebsocketModuleProxyParams = {\n account: Account.randomSync(),\n config: { schema: ModuleConfigSchema },\n host: this,\n moduleAddress,\n querySender: this.querySender,\n }\n\n this.logger?.debug(`creating HttpProxy [${moduleAddress}] ${id}`)\n\n const proxy = new WebsocketModuleProxy<T, WebsocketModuleProxyParams>(params)\n //calling state here to get the config\n if (proxy) {\n const state = await proxy.state()\n if (state) {\n const configSchema = (state.find((payload) => payload.schema === ConfigSchema) as ConfigPayload | undefined)?.config\n const config = assertEx(\n state.find((payload) => payload.schema === configSchema),\n () => 'Unable to locate config',\n ) as ModuleConfig\n proxy.setConfig(config)\n }\n }\n\n await proxy.start()\n\n const wrapped = assertEx(wrapModuleWithType(proxy, Account.randomSync()) as unknown as T, () => `Failed to wrapModuleWithType [${id}]`)\n const instance = assertEx(asModuleInstance<T>(wrapped, {}), () => `Failed to asModuleInstance [${id}]`)\n proxy.upResolver.add(instance)\n proxy.downResolver.add(instance)\n\n if (remainderParts.length > 0) {\n const result = await wrapped.resolve<T>(remainderParts, options)\n return result\n }\n\n //console.log(`resolved: ${proxy.address} [${wrapped.constructor.name}] [${as.constructor.name}]`)\n return instance\n }\n}\n","import { Address } from '@xylabs/hex'\nimport { AbstractModuleProxy, ModuleProxyParams } from '@xyo-network/abstract-bridge'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\n\nexport interface WebsocketBridgeQuerySender {\n sendBridgeQuery: <TOut extends Payload = Payload, TQuery extends QueryBoundWitness = QueryBoundWitness, TIn extends Payload = Payload>(\n targetAddress: Address,\n query: TQuery,\n payloads?: TIn[],\n ) => Promise<ModuleQueryResult<TOut>>\n}\n\nexport type WebsocketModuleProxyParams = ModuleProxyParams & {\n querySender: WebsocketBridgeQuerySender\n}\n\nexport class WebsocketModuleProxy<\n TWrappedModule extends ModuleInstance = ModuleInstance,\n TParams extends Omit<WebsocketModuleProxyParams, 'config'> & { config: TWrappedModule['config'] } = Omit<WebsocketModuleProxyParams, 'config'> & {\n config: TWrappedModule['config']\n },\n >\n extends AbstractModuleProxy<TWrappedModule, TParams>\n implements ModuleInstance<TParams, TWrappedModule['eventData']>\n{\n static createCount = 0\n\n constructor(params: TParams) {\n WebsocketModuleProxy.createCount = WebsocketModuleProxy.createCount + 1\n if (Math.floor(WebsocketModuleProxy.createCount / 10) === WebsocketModuleProxy.createCount / 10) {\n console.log(`WebsocketModuleProxy.createCount: ${WebsocketModuleProxy.createCount}`)\n }\n super(params)\n }\n\n async proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads: Payload[] = []): Promise<ModuleQueryResult> {\n return await this.params.querySender.sendBridgeQuery(this.params.moduleAddress, query, payloads)\n }\n}\n"],"mappings":"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","names":["import_assert","import_module_model","import_assert","import_abstract_bridge","import_module_model","WebsocketBridgeConfigSchema","import_abstract_bridge","WebsocketModuleProxy","AbstractModuleProxy","constructor","params","createCount","Math","floor","console","log","proxyQueryHandler","query","payloads","querySender","sendBridgeQuery","moduleAddress","WebsocketBridgeModuleResolver","AbstractBridgeModuleResolver","querySender","params","resolveHandler","id","options","parentResult","idParts","split","untransformedFirstPart","assertEx","shift","firstPart","ResolveHelper","transformModuleIdentifier","moduleAddress","isAddress","remainderParts","join","account","Account","randomSync","config","schema","ModuleConfigSchema","host","logger","debug","proxy","WebsocketModuleProxy","state","configSchema","find","payload","ConfigSchema","setConfig","start","wrapped","wrapModuleWithType","instance","asModuleInstance","upResolver","add","downResolver","length","result","resolve","WebsocketClientBridge","AbstractBridge","_failureTimeCache","LRUCache","max","maxFailureCacheSize","_querySemaphore","_resolver","client","config","failureRetryTime","defaultFailureRetryTime","maxConnections","defaultMaxConnections","maxPayloadSizeWarning","defaultMaxPayloadSizeWarning","querySemaphore","Semaphore","resolver","WebsocketBridgeModuleResolver","bridge","querySender","root","wrapperAccount","account","url","assertEx","discoverRoots","Promise","resolve","exposeHandler","_id","_options","Error","exposedHandler","sendBridgeQuery","targetAddress","_query","_payloads","lastFailureTime","get","undefined","now","Date","timeSincePreviousFailure","delete","acquire","ex","error","release","startHandler","discoverRoot","unexposeHandler","configSchemas","WebsocketBridgeConfigSchema","defaultConfigSchema","creatableModule","BridgeCommands","join","query","DEFAULT_HOST_PORT","WebsocketBridge","WebsocketClientBridge","httpServer","server","host","config","exposeHandler","_id","_options","Error","exposedHandler","startHandler","startServer","stopHandler","stopServer","assertEx","createHttpServer","Server","on","socket","address","console","log","id","to","emit","listen","port","close","undefined","creatableModule"]}