@xyo-network/bridge-http 2.103.8 → 2.104.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/dist/browser/{HttpBridge.d.cts → HttpBridgeBase.d.cts} +3 -3
  2. package/dist/browser/HttpBridgeBase.d.cts.map +1 -0
  3. package/dist/browser/{HttpBridge.d.ts → HttpBridgeBase.d.mts} +3 -3
  4. package/dist/browser/HttpBridgeBase.d.mts.map +1 -0
  5. package/dist/browser/{HttpBridge.d.mts → HttpBridgeBase.d.ts} +3 -3
  6. package/dist/browser/HttpBridgeBase.d.ts.map +1 -0
  7. package/dist/browser/HttpBridgeClientOnly.d.cts +9 -0
  8. package/dist/browser/HttpBridgeClientOnly.d.cts.map +1 -0
  9. package/dist/browser/HttpBridgeClientOnly.d.mts +9 -0
  10. package/dist/browser/HttpBridgeClientOnly.d.mts.map +1 -0
  11. package/dist/browser/HttpBridgeClientOnly.d.ts +9 -0
  12. package/dist/browser/HttpBridgeClientOnly.d.ts.map +1 -0
  13. package/dist/browser/HttpBridgeConfig.d.cts +7 -0
  14. package/dist/browser/HttpBridgeConfig.d.cts.map +1 -1
  15. package/dist/browser/HttpBridgeConfig.d.mts +7 -0
  16. package/dist/browser/HttpBridgeConfig.d.mts.map +1 -1
  17. package/dist/browser/HttpBridgeConfig.d.ts +7 -0
  18. package/dist/browser/HttpBridgeConfig.d.ts.map +1 -1
  19. package/dist/browser/HttpBridgeFull.d.cts +29 -0
  20. package/dist/browser/HttpBridgeFull.d.cts.map +1 -0
  21. package/dist/browser/HttpBridgeFull.d.mts +29 -0
  22. package/dist/browser/HttpBridgeFull.d.mts.map +1 -0
  23. package/dist/browser/HttpBridgeFull.d.ts +29 -0
  24. package/dist/browser/HttpBridgeFull.d.ts.map +1 -0
  25. package/dist/browser/HttpBridgeModuleResolver.d.cts.map +1 -1
  26. package/dist/browser/HttpBridgeModuleResolver.d.mts.map +1 -1
  27. package/dist/browser/HttpBridgeModuleResolver.d.ts.map +1 -1
  28. package/dist/browser/{index.cjs → index-browser.cjs} +47 -21
  29. package/dist/browser/index-browser.cjs.map +1 -0
  30. package/dist/browser/index-browser.d.cts +3 -0
  31. package/dist/browser/index-browser.d.cts.map +1 -0
  32. package/dist/browser/index-browser.d.mts +3 -0
  33. package/dist/browser/index-browser.d.mts.map +1 -0
  34. package/dist/browser/index-browser.d.ts +3 -0
  35. package/dist/browser/index-browser.d.ts.map +1 -0
  36. package/dist/browser/{index.js → index-browser.js} +43 -17
  37. package/dist/browser/index-browser.js.map +1 -0
  38. package/dist/browser/index.d.cts +1 -1
  39. package/dist/browser/index.d.cts.map +1 -1
  40. package/dist/browser/index.d.mts +1 -1
  41. package/dist/browser/index.d.mts.map +1 -1
  42. package/dist/browser/index.d.ts +1 -1
  43. package/dist/browser/index.d.ts.map +1 -1
  44. package/dist/neutral/{HttpBridge.d.cts → HttpBridgeBase.d.cts} +3 -3
  45. package/dist/neutral/HttpBridgeBase.d.cts.map +1 -0
  46. package/dist/neutral/HttpBridgeBase.d.mts +43 -0
  47. package/dist/neutral/HttpBridgeBase.d.mts.map +1 -0
  48. package/dist/neutral/HttpBridgeBase.d.ts +43 -0
  49. package/dist/neutral/HttpBridgeBase.d.ts.map +1 -0
  50. package/dist/neutral/HttpBridgeClientOnly.d.cts +9 -0
  51. package/dist/neutral/HttpBridgeClientOnly.d.cts.map +1 -0
  52. package/dist/neutral/HttpBridgeClientOnly.d.mts +9 -0
  53. package/dist/neutral/HttpBridgeClientOnly.d.mts.map +1 -0
  54. package/dist/neutral/HttpBridgeClientOnly.d.ts +9 -0
  55. package/dist/neutral/HttpBridgeClientOnly.d.ts.map +1 -0
  56. package/dist/neutral/HttpBridgeConfig.d.cts +7 -0
  57. package/dist/neutral/HttpBridgeConfig.d.cts.map +1 -1
  58. package/dist/neutral/HttpBridgeConfig.d.mts +7 -0
  59. package/dist/neutral/HttpBridgeConfig.d.mts.map +1 -1
  60. package/dist/neutral/HttpBridgeConfig.d.ts +7 -0
  61. package/dist/neutral/HttpBridgeConfig.d.ts.map +1 -1
  62. package/dist/neutral/HttpBridgeFull.d.cts +29 -0
  63. package/dist/neutral/HttpBridgeFull.d.cts.map +1 -0
  64. package/dist/neutral/HttpBridgeFull.d.mts +29 -0
  65. package/dist/neutral/HttpBridgeFull.d.mts.map +1 -0
  66. package/dist/neutral/HttpBridgeFull.d.ts +29 -0
  67. package/dist/neutral/HttpBridgeFull.d.ts.map +1 -0
  68. package/dist/neutral/HttpBridgeModuleResolver.d.cts.map +1 -1
  69. package/dist/neutral/HttpBridgeModuleResolver.d.mts.map +1 -1
  70. package/dist/neutral/HttpBridgeModuleResolver.d.ts.map +1 -1
  71. package/dist/neutral/{index.cjs → index-browser.cjs} +47 -21
  72. package/dist/neutral/index-browser.cjs.map +1 -0
  73. package/dist/neutral/index-browser.d.cts +3 -0
  74. package/dist/neutral/index-browser.d.cts.map +1 -0
  75. package/dist/neutral/index-browser.d.mts +3 -0
  76. package/dist/neutral/index-browser.d.mts.map +1 -0
  77. package/dist/neutral/index-browser.d.ts +3 -0
  78. package/dist/neutral/index-browser.d.ts.map +1 -0
  79. package/dist/neutral/{index.js → index-browser.js} +43 -17
  80. package/dist/neutral/index-browser.js.map +1 -0
  81. package/dist/neutral/index.d.cts +1 -1
  82. package/dist/neutral/index.d.cts.map +1 -1
  83. package/dist/neutral/index.d.mts +1 -1
  84. package/dist/neutral/index.d.mts.map +1 -1
  85. package/dist/neutral/index.d.ts +1 -1
  86. package/dist/neutral/index.d.ts.map +1 -1
  87. package/dist/node/HttpBridgeBase.d.cts +43 -0
  88. package/dist/node/HttpBridgeBase.d.cts.map +1 -0
  89. package/dist/node/HttpBridgeBase.d.mts +43 -0
  90. package/dist/node/HttpBridgeBase.d.mts.map +1 -0
  91. package/dist/node/HttpBridgeBase.d.ts +43 -0
  92. package/dist/node/HttpBridgeBase.d.ts.map +1 -0
  93. package/dist/node/HttpBridgeClientOnly.d.cts +9 -0
  94. package/dist/node/HttpBridgeClientOnly.d.cts.map +1 -0
  95. package/dist/node/HttpBridgeClientOnly.d.mts +9 -0
  96. package/dist/node/HttpBridgeClientOnly.d.mts.map +1 -0
  97. package/dist/node/HttpBridgeClientOnly.d.ts +9 -0
  98. package/dist/node/HttpBridgeClientOnly.d.ts.map +1 -0
  99. package/dist/node/HttpBridgeConfig.d.cts +7 -0
  100. package/dist/node/HttpBridgeConfig.d.cts.map +1 -1
  101. package/dist/node/HttpBridgeConfig.d.mts +7 -0
  102. package/dist/node/HttpBridgeConfig.d.mts.map +1 -1
  103. package/dist/node/HttpBridgeConfig.d.ts +7 -0
  104. package/dist/node/HttpBridgeConfig.d.ts.map +1 -1
  105. package/dist/node/HttpBridgeFull.d.cts +29 -0
  106. package/dist/node/HttpBridgeFull.d.cts.map +1 -0
  107. package/dist/node/HttpBridgeFull.d.mts +29 -0
  108. package/dist/node/HttpBridgeFull.d.mts.map +1 -0
  109. package/dist/node/HttpBridgeFull.d.ts +29 -0
  110. package/dist/node/HttpBridgeFull.d.ts.map +1 -0
  111. package/dist/node/HttpBridgeModuleResolver.d.cts.map +1 -1
  112. package/dist/node/HttpBridgeModuleResolver.d.mts.map +1 -1
  113. package/dist/node/HttpBridgeModuleResolver.d.ts.map +1 -1
  114. package/dist/node/index-browser.d.cts +3 -0
  115. package/dist/node/index-browser.d.cts.map +1 -0
  116. package/dist/node/index-browser.d.mts +3 -0
  117. package/dist/node/index-browser.d.mts.map +1 -0
  118. package/dist/node/index-browser.d.ts +3 -0
  119. package/dist/node/index-browser.d.ts.map +1 -0
  120. package/dist/node/index.cjs +197 -27
  121. package/dist/node/index.cjs.map +1 -1
  122. package/dist/node/index.d.cts +1 -1
  123. package/dist/node/index.d.cts.map +1 -1
  124. package/dist/node/index.d.mts +1 -1
  125. package/dist/node/index.d.mts.map +1 -1
  126. package/dist/node/index.d.ts +1 -1
  127. package/dist/node/index.d.ts.map +1 -1
  128. package/dist/node/index.js +188 -27
  129. package/dist/node/index.js.map +1 -1
  130. package/package.json +38 -33
  131. package/src/{HttpBridge.ts → HttpBridgeBase.ts} +14 -13
  132. package/src/HttpBridgeClientOnly.ts +10 -0
  133. package/src/HttpBridgeConfig.ts +7 -0
  134. package/src/HttpBridgeFull.ts +143 -0
  135. package/src/HttpBridgeModuleResolver.ts +2 -0
  136. package/src/index-browser.ts +2 -0
  137. package/src/index.ts +1 -1
  138. package/xy.config.ts +17 -0
  139. package/dist/browser/HttpBridge.d.cts.map +0 -1
  140. package/dist/browser/HttpBridge.d.mts.map +0 -1
  141. package/dist/browser/HttpBridge.d.ts.map +0 -1
  142. package/dist/browser/index.cjs.map +0 -1
  143. package/dist/browser/index.js.map +0 -1
  144. package/dist/neutral/HttpBridge.d.cts.map +0 -1
  145. package/dist/neutral/HttpBridge.d.mts +0 -43
  146. package/dist/neutral/HttpBridge.d.mts.map +0 -1
  147. package/dist/neutral/HttpBridge.d.ts +0 -43
  148. package/dist/neutral/HttpBridge.d.ts.map +0 -1
  149. package/dist/neutral/index.cjs.map +0 -1
  150. package/dist/neutral/index.js.map +0 -1
  151. package/dist/node/HttpBridge.d.cts +0 -43
  152. package/dist/node/HttpBridge.d.cts.map +0 -1
  153. package/dist/node/HttpBridge.d.mts +0 -43
  154. package/dist/node/HttpBridge.d.mts.map +0 -1
  155. package/dist/node/HttpBridge.d.ts +0 -43
  156. package/dist/node/HttpBridge.d.ts.map +0 -1
@@ -9,7 +9,18 @@ var __publicField = (obj, key, value) => {
9
9
  };
10
10
  var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
11
11
 
12
- // src/HttpBridge.ts
12
+ // src/HttpBridgeConfig.ts
13
+ var HttpBridgeConfigSchema = "network.xyo.bridge.http.config";
14
+
15
+ // src/HttpBridgeFull.ts
16
+ import { assertEx as assertEx3 } from "@xylabs/assert";
17
+ import { exists as exists2 } from "@xylabs/exists";
18
+ import { toJsonString as toJsonString2 } from "@xylabs/object";
19
+ import { isQueryBoundWitness } from "@xyo-network/boundwitness-model";
20
+ import { creatableModule as creatableModule2, resolveAddressToInstanceUp } from "@xyo-network/module-model";
21
+ import express from "express";
22
+
23
+ // src/HttpBridgeBase.ts
13
24
  import { assertEx as assertEx2 } from "@xylabs/assert";
14
25
  import { AxiosJson } from "@xylabs/axios";
15
26
  import { exists } from "@xylabs/exists";
@@ -23,9 +34,6 @@ import { isPayloadOfSchemaType } from "@xyo-network/payload-model";
23
34
  import { Mutex, Semaphore } from "async-mutex";
24
35
  import { LRUCache } from "lru-cache";
25
36
 
26
- // src/HttpBridgeConfig.ts
27
- var HttpBridgeConfigSchema = "network.xyo.bridge.http.config";
28
-
29
37
  // src/HttpBridgeModuleResolver.ts
30
38
  import { assertEx } from "@xylabs/assert";
31
39
  import { isAddress } from "@xylabs/hex";
@@ -95,6 +103,8 @@ var _HttpBridgeModuleResolver = class _HttpBridgeModuleResolver extends Abstract
95
103
  },
96
104
  host: this,
97
105
  moduleAddress,
106
+ onQuerySendFinished: this.params.onQuerySendFinished,
107
+ onQuerySendStarted: this.params.onQuerySendStarted,
98
108
  querySender: this.querySender
99
109
  };
100
110
  (_a = this.logger) == null ? void 0 : _a.debug(`creating HttpProxy [${moduleAddress}] ${id}`);
@@ -126,7 +136,7 @@ var _HttpBridgeModuleResolver = class _HttpBridgeModuleResolver extends Abstract
126
136
  __name(_HttpBridgeModuleResolver, "HttpBridgeModuleResolver");
127
137
  var HttpBridgeModuleResolver = _HttpBridgeModuleResolver;
128
138
 
129
- // src/HttpBridge.ts
139
+ // src/HttpBridgeBase.ts
130
140
  function _ts_decorate(decorators, target, key, desc) {
131
141
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
132
142
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
@@ -138,11 +148,11 @@ function _ts_decorate(decorators, target, key, desc) {
138
148
  return c > 3 && r && Object.defineProperty(target, key, r), r;
139
149
  }
140
150
  __name(_ts_decorate, "_ts_decorate");
141
- var _HttpBridge = class _HttpBridge extends AbstractBridge {
151
+ var _HttpBridgeBase = class _HttpBridgeBase extends AbstractBridge {
142
152
  _axios;
143
153
  _discoverRootsMutex = new Mutex();
144
154
  _failureTimeCache = new LRUCache({
145
- max: _HttpBridge.maxFailureCacheSize
155
+ max: _HttpBridgeBase.maxFailureCacheSize
146
156
  });
147
157
  _querySemaphore;
148
158
  _resolver;
@@ -150,17 +160,18 @@ var _HttpBridge = class _HttpBridge extends AbstractBridge {
150
160
  this._axios = this._axios ?? new AxiosJson();
151
161
  return this._axios;
152
162
  }
163
+ get clientUrl() {
164
+ var _a;
165
+ return assertEx2(((_a = this.config.client) == null ? void 0 : _a.url) ?? this.config.nodeUrl, () => "No Url Set");
166
+ }
153
167
  get failureRetryTime() {
154
- return this.config.failureRetryTime ?? _HttpBridge.defaultFailureRetryTime;
168
+ return this.config.failureRetryTime ?? _HttpBridgeBase.defaultFailureRetryTime;
155
169
  }
156
170
  get maxConnections() {
157
- return this.config.maxConnections ?? _HttpBridge.defaultMaxConnections;
171
+ return this.config.maxConnections ?? _HttpBridgeBase.defaultMaxConnections;
158
172
  }
159
173
  get maxPayloadSizeWarning() {
160
- return this.config.maxPayloadSizeWarning ?? _HttpBridge.defaultMaxPayloadSizeWarning;
161
- }
162
- get nodeUrl() {
163
- return assertEx2(this.config.nodeUrl, () => "No Url Set");
174
+ return this.config.maxPayloadSizeWarning ?? _HttpBridgeBase.defaultMaxPayloadSizeWarning;
164
175
  }
165
176
  get querySemaphore() {
166
177
  this._querySemaphore = this._querySemaphore ?? new Semaphore(this.maxConnections);
@@ -188,7 +199,7 @@ var _HttpBridge = class _HttpBridge extends AbstractBridge {
188
199
  },
189
200
  querySender: this,
190
201
  root: this,
191
- rootUrl: this.nodeUrl,
202
+ rootUrl: this.clientUrl,
192
203
  wrapperAccount: this.account
193
204
  });
194
205
  return this._resolver;
@@ -218,7 +229,7 @@ var _HttpBridge = class _HttpBridge extends AbstractBridge {
218
229
  });
219
230
  }
220
231
  moduleUrl(address) {
221
- return new URL(address, this.nodeUrl);
232
+ return new URL(address, this.clientUrl);
222
233
  }
223
234
  async sendBridgeQuery(targetAddress, query, payloads) {
224
235
  var _a, _b, _c, _d;
@@ -271,7 +282,7 @@ var _HttpBridge = class _HttpBridge extends AbstractBridge {
271
282
  };
272
283
  const boundQuery = await this.bindQuery(queryPayload);
273
284
  try {
274
- const response = await this.axios.post(this.nodeUrl.toString(), boundQuery);
285
+ const response = await this.axios.post(this.clientUrl.toString(), boundQuery);
275
286
  if (response.status === 404) {
276
287
  return [];
277
288
  }
@@ -282,7 +293,7 @@ var _HttpBridge = class _HttpBridge extends AbstractBridge {
282
293
  return payloads;
283
294
  } catch (ex) {
284
295
  const error = ex;
285
- (_a = this.logger) == null ? void 0 : _a.warn(`Unable to connect to remote node: ${error.message} [${this.nodeUrl}]`);
296
+ (_a = this.logger) == null ? void 0 : _a.warn(`Unable to connect to remote node: ${error.message} [${this.clientUrl}]`);
286
297
  }
287
298
  }
288
299
  async resolveRootNode(nodeManifest) {
@@ -303,19 +314,169 @@ var _HttpBridge = class _HttpBridge extends AbstractBridge {
303
314
  return [];
304
315
  }
305
316
  };
306
- __name(_HttpBridge, "HttpBridge");
307
- __publicField(_HttpBridge, "configSchemas", [
308
- ...__superGet(_HttpBridge, _HttpBridge, "configSchemas"),
317
+ __name(_HttpBridgeBase, "HttpBridgeBase");
318
+ __publicField(_HttpBridgeBase, "configSchemas", [
319
+ ...__superGet(_HttpBridgeBase, _HttpBridgeBase, "configSchemas"),
309
320
  HttpBridgeConfigSchema
310
321
  ]);
311
- __publicField(_HttpBridge, "defaultConfigSchema", HttpBridgeConfigSchema);
312
- __publicField(_HttpBridge, "defaultFailureRetryTime", 1e3 * 60);
313
- __publicField(_HttpBridge, "defaultMaxConnections", 4);
314
- __publicField(_HttpBridge, "defaultMaxPayloadSizeWarning", 256 * 256);
315
- __publicField(_HttpBridge, "maxFailureCacheSize", 1e3);
316
- var HttpBridge = _HttpBridge;
317
- HttpBridge = _ts_decorate([
322
+ __publicField(_HttpBridgeBase, "defaultConfigSchema", HttpBridgeConfigSchema);
323
+ __publicField(_HttpBridgeBase, "defaultFailureRetryTime", 1e3 * 60);
324
+ __publicField(_HttpBridgeBase, "defaultMaxConnections", 4);
325
+ __publicField(_HttpBridgeBase, "defaultMaxPayloadSizeWarning", 256 * 256);
326
+ __publicField(_HttpBridgeBase, "maxFailureCacheSize", 1e3);
327
+ var HttpBridgeBase = _HttpBridgeBase;
328
+ HttpBridgeBase = _ts_decorate([
318
329
  creatableModule()
330
+ ], HttpBridgeBase);
331
+
332
+ // src/HttpBridgeFull.ts
333
+ function _ts_decorate2(decorators, target, key, desc) {
334
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
335
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
336
+ r = Reflect.decorate(decorators, target, key, desc);
337
+ else
338
+ for (var i = decorators.length - 1; i >= 0; i--)
339
+ if (d = decorators[i])
340
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
341
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
342
+ }
343
+ __name(_ts_decorate2, "_ts_decorate");
344
+ var _HttpBridge = class _HttpBridge extends HttpBridgeBase {
345
+ _app;
346
+ _exposedModules = [];
347
+ _server;
348
+ get app() {
349
+ this._app = this._app ?? (() => {
350
+ const app = express();
351
+ app.use(express.json());
352
+ app.post("/", (req, res) => {
353
+ this.handlePost(req, res);
354
+ });
355
+ return app;
356
+ })();
357
+ return this._app;
358
+ }
359
+ async exposeChild(mod, options) {
360
+ var _a, _b;
361
+ const { maxDepth = 5 } = options ?? {};
362
+ console.log(`exposeChild: ${mod.address} ${mod == null ? void 0 : mod.id} ${maxDepth}`);
363
+ assertEx3(this.config.host, () => "Not configured as a host");
364
+ this._exposedModules.push(new WeakRef(mod));
365
+ const children = maxDepth > 0 ? await ((_a = mod.publicChildren) == null ? void 0 : _a.call(mod)) ?? [] : [];
366
+ this.logger.log(`childrenToExpose [${mod.id}][${mod.address}]: ${toJsonString2(children.map((child) => child.id))}`);
367
+ const exposedChildren = (await Promise.all(children.map((child) => this.exposeChild(child, {
368
+ maxDepth: maxDepth - 1,
369
+ required: false
370
+ })))).flat().filter(exists2);
371
+ const allExposed = [
372
+ mod,
373
+ ...exposedChildren
374
+ ];
375
+ for (const exposedMod of allExposed)
376
+ (_b = this.logger) == null ? void 0 : _b.log(`exposed: ${exposedMod.address} [${mod.id}]`);
377
+ return allExposed;
378
+ }
379
+ async exposeHandler(address, options) {
380
+ const { required = true } = options ?? {};
381
+ const mod = await resolveAddressToInstanceUp(this, address);
382
+ console.log(`exposeHandler: ${address} ${mod == null ? void 0 : mod.id}`);
383
+ if (required && !mod) {
384
+ throw new Error(`Unable to find required module: ${address}`);
385
+ }
386
+ if (mod) {
387
+ return this.exposeChild(mod, options);
388
+ }
389
+ return [];
390
+ }
391
+ exposedHandler() {
392
+ return this._exposedModules.map((ref) => {
393
+ var _a;
394
+ return (_a = ref.deref()) == null ? void 0 : _a.address;
395
+ }).filter(exists2);
396
+ }
397
+ async startHandler() {
398
+ return await super.startHandler() && this.startHttpServer();
399
+ }
400
+ async stopHandler(_timeout) {
401
+ return await super.stopHandler() && this.stopHttpServer();
402
+ }
403
+ async unexposeHandler(address, options) {
404
+ var _a, _b;
405
+ const { maxDepth = 2, required = true } = options ?? {};
406
+ assertEx3(this.config.host, () => "Not configured as a host");
407
+ const mod = (_a = this._exposedModules.find((ref) => {
408
+ var _a2;
409
+ return ((_a2 = ref.deref()) == null ? void 0 : _a2.address) === address;
410
+ })) == null ? void 0 : _a.deref();
411
+ assertEx3(!required || mod, () => `Module not exposed: ${address}`);
412
+ this._exposedModules = this._exposedModules.filter((ref) => {
413
+ var _a2;
414
+ return ((_a2 = ref.deref()) == null ? void 0 : _a2.address) !== address;
415
+ });
416
+ if (mod) {
417
+ const children = maxDepth > 0 ? await ((_b = mod.publicChildren) == null ? void 0 : _b.call(mod)) ?? [] : [];
418
+ const exposedChildren = (await Promise.all(children.map((child) => this.unexposeHandler(child.address, {
419
+ maxDepth: maxDepth - 1,
420
+ required: false
421
+ })))).flat().filter(exists2);
422
+ return [
423
+ mod,
424
+ ...exposedChildren
425
+ ];
426
+ }
427
+ return [];
428
+ }
429
+ async callLocalModule(address, query, payloads) {
430
+ var _a;
431
+ const mod = (_a = this._exposedModules.find((ref) => {
432
+ var _a2;
433
+ return ((_a2 = ref.deref()) == null ? void 0 : _a2.address) === address;
434
+ })) == null ? void 0 : _a.deref();
435
+ if (mod) {
436
+ return await mod.query(query, payloads);
437
+ }
438
+ return null;
439
+ }
440
+ handlePost(req, res) {
441
+ const allPayloads = req.body;
442
+ const query = allPayloads.find(isQueryBoundWitness);
443
+ const payloads = allPayloads.filter((payload) => !isQueryBoundWitness(payload));
444
+ this.callLocalModule(req.route, query, payloads).then((result) => {
445
+ if (result === null) {
446
+ res.status(404).json({
447
+ error: "Module not found"
448
+ });
449
+ } else {
450
+ const envelope = {
451
+ data: result
452
+ };
453
+ res.json(envelope);
454
+ }
455
+ }).catch((ex) => {
456
+ res.status(500).json({
457
+ error: ex.message
458
+ });
459
+ });
460
+ }
461
+ startHttpServer() {
462
+ var _a;
463
+ if (this.config.host) {
464
+ assertEx3(!this._server, () => "Server already started");
465
+ this._server = this.app.listen(((_a = this.config.host) == null ? void 0 : _a.port) ?? 3030);
466
+ }
467
+ return true;
468
+ }
469
+ stopHttpServer() {
470
+ const server = assertEx3(this._server, () => "Server not started");
471
+ server.close();
472
+ this._server = void 0;
473
+ return true;
474
+ }
475
+ };
476
+ __name(_HttpBridge, "HttpBridge");
477
+ var HttpBridge = _HttpBridge;
478
+ HttpBridge = _ts_decorate2([
479
+ creatableModule2()
319
480
  ], HttpBridge);
320
481
  export {
321
482
  HttpBridge,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/HttpBridge.ts","../../src/HttpBridgeConfig.ts","../../src/HttpBridgeModuleResolver.ts","../../src/ModuleProxy/ModuleProxy.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { AxiosError, AxiosJson } from '@xylabs/axios'\nimport { exists } from '@xylabs/exists'\nimport { forget } from '@xylabs/forget'\nimport { Address } from '@xylabs/hex'\nimport { toJsonString } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { ApiEnvelope } from '@xyo-network/api-models'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractBridge } from '@xyo-network/bridge-abstract'\nimport {\n BridgeExposeOptions,\n BridgeModule,\n BridgeParams,\n BridgeUnexposeOptions,\n QuerySendFinishedEventArgs,\n QuerySendStartedEventArgs,\n} from '@xyo-network/bridge-model'\nimport { NodeManifestPayload, NodeManifestPayloadSchema } from '@xyo-network/manifest-model'\nimport {\n AnyConfigSchema,\n creatableModule,\n ModuleInstance,\n ModuleQueryResult,\n ModuleResolverInstance,\n ModuleStateQuery,\n ModuleStateQuerySchema,\n} from '@xyo-network/module-model'\nimport { asAttachableNodeInstance } from '@xyo-network/node-model'\nimport { isPayloadOfSchemaType, Payload, Schema, WithMeta } from '@xyo-network/payload-model'\nimport { Mutex, Semaphore } from 'async-mutex'\nimport { LRUCache } from 'lru-cache'\n\nimport { HttpBridgeConfig, HttpBridgeConfigSchema } from './HttpBridgeConfig'\nimport { HttpBridgeModuleResolver } from './HttpBridgeModuleResolver'\nimport { BridgeQuerySender } from './ModuleProxy'\n\nexport interface HttpBridgeParams extends BridgeParams<AnyConfigSchema<HttpBridgeConfig>> {}\n\n@creatableModule()\nexport class HttpBridge<TParams extends HttpBridgeParams> extends AbstractBridge<TParams> implements BridgeModule<TParams>, BridgeQuerySender {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, HttpBridgeConfigSchema]\n static override readonly defaultConfigSchema: Schema = HttpBridgeConfigSchema\n static defaultFailureRetryTime = 1000 * 60\n static defaultMaxConnections = 4\n static defaultMaxPayloadSizeWarning = 256 * 256\n static maxFailureCacheSize = 1000\n\n private _axios?: AxiosJson\n private _discoverRootsMutex = new Mutex()\n private _failureTimeCache = new LRUCache<Address, number>({ max: HttpBridge.maxFailureCacheSize })\n private _querySemaphore?: Semaphore\n private _resolver?: HttpBridgeModuleResolver\n\n get axios() {\n this._axios = this._axios ?? new AxiosJson()\n return this._axios\n }\n\n get failureRetryTime() {\n return this.config.failureRetryTime ?? HttpBridge.defaultFailureRetryTime\n }\n\n get maxConnections() {\n return this.config.maxConnections ?? HttpBridge.defaultMaxConnections\n }\n\n get maxPayloadSizeWarning() {\n return this.config.maxPayloadSizeWarning ?? HttpBridge.defaultMaxPayloadSizeWarning\n }\n\n get nodeUrl() {\n return assertEx(this.config.nodeUrl, () => 'No Url Set')\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 ??\n new HttpBridgeModuleResolver({\n additionalSigners: this.additionalSigners,\n archiving: { ...this.archiving, resolveArchivists: this.resolveArchivingArchivists.bind(this) },\n bridge: this,\n onQuerySendFinished: (args: Omit<QuerySendFinishedEventArgs, 'module'>) => {\n forget(this.emit('querySendFinished', { module: this, ...args }))\n },\n onQuerySendStarted: (args: Omit<QuerySendStartedEventArgs, 'module'>) => {\n forget(this.emit('querySendStarted', { module: this, ...args }))\n },\n querySender: this,\n root: this,\n rootUrl: this.nodeUrl,\n wrapperAccount: this.account,\n })\n return this._resolver\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 getRoots(force?: boolean): Promise<ModuleInstance[]> {\n return await this._discoverRootsMutex.runExclusive(async () => {\n if (this._roots === undefined || force) {\n const state = await this.getRootState()\n this.logger?.debug(`HttpBridge:discoverRoots.state [${state?.length}]`)\n const nodeManifest = state?.find(isPayloadOfSchemaType<WithMeta<NodeManifestPayload>>(NodeManifestPayloadSchema))\n if (nodeManifest) {\n const mods = (await this.resolveRootNode(nodeManifest)).filter(exists)\n this.logger?.debug(`HttpBridge:discoverRoots [${mods.length}]`)\n this._roots = mods\n } else {\n this._roots = []\n }\n }\n return this._roots\n })\n }\n\n moduleUrl(address: Address) {\n return new URL(address, this.nodeUrl)\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 const payloadSize = JSON.stringify([query, payloads]).length\n if (payloadSize > this.maxPayloadSizeWarning) {\n this.logger?.warn(\n `Large targetQuery being sent: ${payloadSize} bytes [${this.address}][${this.moduleAddress}] [${query.schema}] [${payloads?.length}]`,\n )\n }\n const moduleUrl = this.moduleUrl(targetAddress).href\n const result = await this.axios.post<ApiEnvelope<ModuleQueryResult<TOut>>>(moduleUrl, [query, payloads])\n if (result.status === 404) {\n throw `target module not found [${moduleUrl}] [${result.status}]`\n }\n if (result.status >= 400) {\n this.logger?.error(`targetQuery failed [${moduleUrl}]`)\n throw `targetQuery failed [${moduleUrl}] [${result.status}]`\n }\n return result.data?.data\n } catch (ex) {\n const error = ex as AxiosError\n this.logger?.error(`Error: ${toJsonString(error)}`)\n throw error\n } finally {\n this.querySemaphore.release()\n }\n }\n\n override unexposeHandler(_id: string, _options?: BridgeUnexposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n private async getRootState() {\n const queryPayload: ModuleStateQuery = { schema: ModuleStateQuerySchema }\n const boundQuery = await this.bindQuery(queryPayload)\n try {\n const response = await this.axios.post<ApiEnvelope<ModuleQueryResult>>(this.nodeUrl.toString(), boundQuery)\n if (response.status === 404) {\n return []\n }\n const [, payloads, errors] = response.data.data\n if (errors.length > 0) {\n throw new Error(`getRootState failed: ${JSON.stringify(errors, null, 2)}`)\n }\n return payloads\n } catch (ex) {\n const error = ex as Error\n this.logger?.warn(`Unable to connect to remote node: ${error.message} [${this.nodeUrl}]`)\n }\n }\n\n private async resolveRootNode(nodeManifest: NodeManifestPayload): Promise<ModuleInstance[]> {\n const rootModule = assertEx(\n (await this.resolver.resolveHandler(assertEx(nodeManifest.status?.address, () => 'Root has no address'))).at(0),\n () => `Root not found [${nodeManifest.status?.address}]`,\n )\n assertEx(rootModule.constructor.name !== 'HttpModuleProxy', () => 'rootModule is not a Wrapper')\n const rootNode = asAttachableNodeInstance(rootModule, 'Root modules is not a node')\n if (rootNode) {\n this.logger.debug(`rootNode: ${rootNode.id}`)\n this.downResolver.addResolver(rootNode as unknown as ModuleResolverInstance)\n return [rootNode]\n }\n return []\n }\n}\n","import { EmptyObject } from '@xylabs/object'\nimport { BridgeConfig } from '@xyo-network/bridge-model'\n\nexport type HttpBridgeConfigSchema = 'network.xyo.bridge.http.config'\nexport const HttpBridgeConfigSchema: HttpBridgeConfigSchema = 'network.xyo.bridge.http.config'\n\nexport type HttpBridgeConfig<TConfig extends EmptyObject = EmptyObject, TSchema extends string | void = void> = BridgeConfig<\n {\n failureRetryTime?: number\n failureTimeCacheMax?: number\n maxConnections?: number\n maxPayloadSizeWarning?: number\n nodeUrl?: string\n schema: HttpBridgeConfigSchema\n } & TConfig,\n TSchema extends string ? TSchema : HttpBridgeConfigSchema\n>\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { Account } from '@xyo-network/account'\nimport { AbstractBridgeModuleResolver, BridgeModuleResolverParams, wrapModuleWithType } from '@xyo-network/bridge-abstract'\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 { BridgeQuerySender, HttpModuleProxy, HttpModuleProxyParams } from './ModuleProxy'\n\nexport interface HttpBridgeModuleResolverParams extends BridgeModuleResolverParams {\n querySender: BridgeQuerySender\n rootUrl: string\n}\n\nexport class HttpBridgeModuleResolver<\n T extends HttpBridgeModuleResolverParams = HttpBridgeModuleResolverParams,\n> extends AbstractBridgeModuleResolver<T> {\n get querySender() {\n return this.params.querySender\n }\n\n moduleUrl(address: Address) {\n return new URL(address, this.params.rootUrl)\n }\n\n override async resolveHandler<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T[]> {\n const parentResult = await super.resolveHandler(id, options)\n if (parentResult.length > 0) {\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: HttpModuleProxyParams = {\n account: Account.randomSync(),\n additionalSigners: this.params.additionalSigners,\n archiving: this.params.archiving,\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 HttpModuleProxy<T, HttpModuleProxyParams>(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 ? [result] : []\n }\n\n //console.log(`resolved: ${proxy.address} [${wrapped.constructor.name}] [${as.constructor.name}]`)\n return [instance]\n }\n}\n","import { forget } from '@xylabs/forget'\nimport { Address } from '@xylabs/hex'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleProxy, ModuleProxyParams } from '@xyo-network/bridge-abstract'\nimport { AttachableModuleInstance, ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\n\nexport interface BridgeQuerySender {\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 HttpModuleProxyParams = ModuleProxyParams & {\n querySender: BridgeQuerySender\n}\n\nexport class HttpModuleProxy<\n TWrappedModule extends ModuleInstance = ModuleInstance,\n TParams extends Omit<HttpModuleProxyParams, 'config'> & { config: TWrappedModule['config'] } = Omit<HttpModuleProxyParams, 'config'> & {\n config: TWrappedModule['config']\n },\n >\n extends AbstractModuleProxy<TWrappedModule, TParams>\n implements AttachableModuleInstance<TParams, TWrappedModule['eventData']>\n{\n static createCount = 0\n\n constructor(params: TParams) {\n HttpModuleProxy.createCount = HttpModuleProxy.createCount + 1\n if (Math.floor(HttpModuleProxy.createCount / 10) === HttpModuleProxy.createCount / 10) {\n console.log(`HttpModuleProxy.createCount: ${HttpModuleProxy.createCount}`)\n }\n super(params)\n }\n\n async proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads: Payload[] = []): Promise<ModuleQueryResult> {\n if (this.archiving && this.isAllowedArchivingQuery(query.schema)) {\n forget(this.storeToArchivists([query, ...(payloads ?? [])]))\n }\n const result = await this.params.querySender.sendBridgeQuery(this.params.moduleAddress, query, payloads)\n if (this.archiving && this.isAllowedArchivingQuery(query.schema)) {\n forget(this.storeToArchivists(result.flat()))\n }\n return result\n }\n}\n"],"mappings":"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","names":["assertEx","AxiosJson","exists","forget","toJsonString","AbstractBridge","NodeManifestPayloadSchema","creatableModule","ModuleStateQuerySchema","asAttachableNodeInstance","isPayloadOfSchemaType","Mutex","Semaphore","LRUCache","HttpBridgeConfigSchema","assertEx","isAddress","Account","AbstractBridgeModuleResolver","wrapModuleWithType","ConfigSchema","asModuleInstance","ModuleConfigSchema","ResolveHelper","forget","AbstractModuleProxy","HttpModuleProxy","AbstractModuleProxy","constructor","params","createCount","Math","floor","console","log","proxyQueryHandler","query","payloads","archiving","isAllowedArchivingQuery","schema","forget","storeToArchivists","result","querySender","sendBridgeQuery","moduleAddress","flat","HttpBridgeModuleResolver","AbstractBridgeModuleResolver","querySender","params","moduleUrl","address","URL","rootUrl","resolveHandler","id","options","parentResult","length","idParts","split","untransformedFirstPart","assertEx","shift","firstPart","ResolveHelper","transformModuleIdentifier","moduleAddress","isAddress","remainderParts","join","account","Account","randomSync","additionalSigners","archiving","config","schema","ModuleConfigSchema","host","logger","debug","proxy","HttpModuleProxy","state","configSchema","find","payload","ConfigSchema","setConfig","start","wrapped","wrapModuleWithType","instance","asModuleInstance","upResolver","add","downResolver","result","resolve","HttpBridge","AbstractBridge","_axios","_discoverRootsMutex","Mutex","_failureTimeCache","LRUCache","max","maxFailureCacheSize","_querySemaphore","_resolver","axios","AxiosJson","failureRetryTime","config","defaultFailureRetryTime","maxConnections","defaultMaxConnections","maxPayloadSizeWarning","defaultMaxPayloadSizeWarning","nodeUrl","assertEx","querySemaphore","Semaphore","resolver","HttpBridgeModuleResolver","additionalSigners","archiving","resolveArchivists","resolveArchivingArchivists","bind","bridge","onQuerySendFinished","args","forget","emit","module","onQuerySendStarted","querySender","root","rootUrl","wrapperAccount","account","exposeHandler","_id","_options","Error","exposedHandler","getRoots","force","runExclusive","_roots","undefined","state","getRootState","logger","debug","length","nodeManifest","find","isPayloadOfSchemaType","NodeManifestPayloadSchema","mods","resolveRootNode","filter","exists","moduleUrl","address","URL","sendBridgeQuery","targetAddress","query","payloads","lastFailureTime","get","now","Date","timeSincePreviousFailure","delete","acquire","payloadSize","JSON","stringify","warn","moduleAddress","schema","href","result","post","status","error","data","ex","toJsonString","release","unexposeHandler","queryPayload","ModuleStateQuerySchema","boundQuery","bindQuery","response","toString","errors","message","rootModule","resolveHandler","at","constructor","name","rootNode","asAttachableNodeInstance","id","downResolver","addResolver","configSchemas","HttpBridgeConfigSchema","defaultConfigSchema","creatableModule"]}
1
+ {"version":3,"sources":["../../src/HttpBridgeConfig.ts","../../src/HttpBridgeFull.ts","../../src/HttpBridgeBase.ts","../../src/HttpBridgeModuleResolver.ts","../../src/ModuleProxy/ModuleProxy.ts"],"sourcesContent":["import { EmptyObject } from '@xylabs/object'\nimport { BridgeConfig } from '@xyo-network/bridge-model'\n\nexport type HttpBridgeConfigSchema = 'network.xyo.bridge.http.config'\nexport const HttpBridgeConfigSchema: HttpBridgeConfigSchema = 'network.xyo.bridge.http.config'\n\nexport type HttpBridgeConfig<TConfig extends EmptyObject = EmptyObject, TSchema extends string | void = void> = BridgeConfig<\n {\n client?: BridgeConfig['client'] & {\n url: string\n }\n failureRetryTime?: number\n failureTimeCacheMax?: number\n host?: {\n port: number\n }\n maxConnections?: number\n maxPayloadSizeWarning?: number\n /** @deprecated use client.url instead */\n nodeUrl?: string\n schema: HttpBridgeConfigSchema\n } & TConfig,\n TSchema extends string ? TSchema : HttpBridgeConfigSchema\n>\n","import { Server } from 'node:http'\n\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { toJsonString } from '@xylabs/object'\nimport { ApiEnvelopeSuccess } from '@xyo-network/api-models'\nimport { isQueryBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BridgeExposeOptions, BridgeParams, BridgeUnexposeOptions } from '@xyo-network/bridge-model'\nimport { AnyConfigSchema, creatableModule, ModuleInstance, ModuleQueryResult, resolveAddressToInstanceUp } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport express, { Application, Request, Response } from 'express'\n\nimport { HttpBridgeBase } from './HttpBridgeBase'\nimport { HttpBridgeConfig } from './HttpBridgeConfig'\n\nexport interface HttpBridgeParams extends BridgeParams<AnyConfigSchema<HttpBridgeConfig>> {}\n\n@creatableModule()\nexport class HttpBridge<TParams extends HttpBridgeParams> extends HttpBridgeBase<TParams> {\n protected _app?: Application\n protected _exposedModules: WeakRef<ModuleInstance>[] = []\n protected _server?: Server\n\n get app() {\n this._app =\n this._app ??\n (() => {\n const app = express()\n app.use(express.json())\n\n app.post<Payload[]>('/', (req, res) => {\n this.handlePost(req, res)\n })\n\n return app\n })()\n return this._app\n }\n\n async exposeChild(mod: ModuleInstance, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 5 } = options ?? {}\n console.log(`exposeChild: ${mod.address} ${mod?.id} ${maxDepth}`)\n assertEx(this.config.host, () => 'Not configured as a host')\n this._exposedModules.push(new WeakRef(mod))\n const children = maxDepth > 0 ? (await mod.publicChildren?.()) ?? [] : []\n this.logger.log(`childrenToExpose [${mod.id}][${mod.address}]: ${toJsonString(children.map((child) => child.id))}`)\n const exposedChildren = (await Promise.all(children.map((child) => this.exposeChild(child, { maxDepth: maxDepth - 1, required: false }))))\n .flat()\n .filter(exists)\n const allExposed = [mod, ...exposedChildren]\n\n for (const exposedMod of allExposed) this.logger?.log(`exposed: ${exposedMod.address} [${mod.id}]`)\n\n return allExposed\n }\n\n override async exposeHandler(address: Address, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {\n const { required = true } = options ?? {}\n const mod = await resolveAddressToInstanceUp(this, address)\n console.log(`exposeHandler: ${address} ${mod?.id}`)\n if (required && !mod) {\n throw new Error(`Unable to find required module: ${address}`)\n }\n if (mod) {\n return this.exposeChild(mod, options)\n }\n return []\n }\n\n override exposedHandler(): Address[] {\n return this._exposedModules.map((ref) => ref.deref()?.address).filter(exists)\n }\n\n override async startHandler(): Promise<boolean> {\n return (await super.startHandler()) && this.startHttpServer()\n }\n\n override async stopHandler(_timeout?: number | undefined): Promise<boolean> {\n return (await super.stopHandler()) && this.stopHttpServer()\n }\n\n override async unexposeHandler(address: Address, options?: BridgeUnexposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 2, required = true } = options ?? {}\n assertEx(this.config.host, () => 'Not configured as a host')\n const mod = this._exposedModules.find((ref) => ref.deref()?.address === address)?.deref()\n assertEx(!required || mod, () => `Module not exposed: ${address}`)\n this._exposedModules = this._exposedModules.filter((ref) => ref.deref()?.address !== address)\n if (mod) {\n const children = maxDepth > 0 ? (await mod.publicChildren?.()) ?? [] : []\n const exposedChildren = (\n await Promise.all(children.map((child) => this.unexposeHandler(child.address, { maxDepth: maxDepth - 1, required: false })))\n )\n .flat()\n .filter(exists)\n return [mod, ...exposedChildren]\n }\n return []\n }\n\n protected async callLocalModule(address: Address, query: QueryBoundWitness, payloads: Payload[]): Promise<ModuleQueryResult | null> {\n const mod = this._exposedModules.find((ref) => ref.deref()?.address === address)?.deref()\n if (mod) {\n return await mod.query(query, payloads)\n }\n return null\n }\n\n protected handlePost(req: Request<Payload[]>, res: Response) {\n const allPayloads = req.body as Payload[]\n const query = allPayloads.find(isQueryBoundWitness) as QueryBoundWitness\n const payloads = allPayloads.filter((payload) => !isQueryBoundWitness(payload))\n this.callLocalModule(req.route, query, payloads)\n .then((result) => {\n if (result === null) {\n res.status(404).json({ error: 'Module not found' })\n } else {\n const envelope = {\n data: result,\n } as ApiEnvelopeSuccess<ModuleQueryResult>\n res.json(envelope)\n }\n })\n .catch((ex) => {\n res.status(500).json({ error: (ex as Error).message })\n })\n }\n\n protected startHttpServer() {\n if (this.config.host) {\n assertEx(!this._server, () => 'Server already started')\n this._server = this.app.listen(this.config.host?.port ?? 3030)\n }\n return true\n }\n\n protected stopHttpServer() {\n const server = assertEx(this._server, () => 'Server not started')\n server.close()\n this._server = undefined\n return true\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { AxiosError, AxiosJson } from '@xylabs/axios'\nimport { exists } from '@xylabs/exists'\nimport { forget } from '@xylabs/forget'\nimport { Address } from '@xylabs/hex'\nimport { toJsonString } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { ApiEnvelope } from '@xyo-network/api-models'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractBridge } from '@xyo-network/bridge-abstract'\nimport {\n BridgeExposeOptions,\n BridgeModule,\n BridgeParams,\n BridgeUnexposeOptions,\n QuerySendFinishedEventArgs,\n QuerySendStartedEventArgs,\n} from '@xyo-network/bridge-model'\nimport { NodeManifestPayload, NodeManifestPayloadSchema } from '@xyo-network/manifest-model'\nimport {\n AnyConfigSchema,\n creatableModule,\n ModuleInstance,\n ModuleQueryResult,\n ModuleResolverInstance,\n ModuleStateQuery,\n ModuleStateQuerySchema,\n} from '@xyo-network/module-model'\nimport { asAttachableNodeInstance } from '@xyo-network/node-model'\nimport { isPayloadOfSchemaType, Payload, Schema, WithMeta } from '@xyo-network/payload-model'\nimport { Mutex, Semaphore } from 'async-mutex'\nimport { LRUCache } from 'lru-cache'\n\nimport { HttpBridgeConfig, HttpBridgeConfigSchema } from './HttpBridgeConfig'\nimport { HttpBridgeModuleResolver } from './HttpBridgeModuleResolver'\nimport { BridgeQuerySender } from './ModuleProxy'\n\nexport interface HttpBridgeParams extends BridgeParams<AnyConfigSchema<HttpBridgeConfig>> {}\n\n@creatableModule()\nexport class HttpBridgeBase<TParams extends HttpBridgeParams> extends AbstractBridge<TParams> implements BridgeModule<TParams>, BridgeQuerySender {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, HttpBridgeConfigSchema]\n static override readonly defaultConfigSchema: Schema = HttpBridgeConfigSchema\n static defaultFailureRetryTime = 1000 * 60\n static defaultMaxConnections = 4\n static defaultMaxPayloadSizeWarning = 256 * 256\n static maxFailureCacheSize = 1000\n\n private _axios?: AxiosJson\n private _discoverRootsMutex = new Mutex()\n private _failureTimeCache = new LRUCache<Address, number>({ max: HttpBridgeBase.maxFailureCacheSize })\n private _querySemaphore?: Semaphore\n private _resolver?: HttpBridgeModuleResolver\n\n get axios() {\n this._axios = this._axios ?? new AxiosJson()\n return this._axios\n }\n\n get clientUrl() {\n // eslint-disable-next-line deprecation/deprecation\n return assertEx(this.config.client?.url ?? this.config.nodeUrl, () => 'No Url Set')\n }\n\n get failureRetryTime() {\n return this.config.failureRetryTime ?? HttpBridgeBase.defaultFailureRetryTime\n }\n\n get maxConnections() {\n return this.config.maxConnections ?? HttpBridgeBase.defaultMaxConnections\n }\n\n get maxPayloadSizeWarning() {\n return this.config.maxPayloadSizeWarning ?? HttpBridgeBase.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 ??\n new HttpBridgeModuleResolver({\n additionalSigners: this.additionalSigners,\n archiving: { ...this.archiving, resolveArchivists: this.resolveArchivingArchivists.bind(this) },\n bridge: this,\n onQuerySendFinished: (args: Omit<QuerySendFinishedEventArgs, 'module'>) => {\n forget(this.emit('querySendFinished', { module: this, ...args }))\n },\n onQuerySendStarted: (args: Omit<QuerySendStartedEventArgs, 'module'>) => {\n forget(this.emit('querySendStarted', { module: this, ...args }))\n },\n querySender: this,\n root: this,\n rootUrl: this.clientUrl,\n wrapperAccount: this.account,\n })\n return this._resolver\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 getRoots(force?: boolean): Promise<ModuleInstance[]> {\n return await this._discoverRootsMutex.runExclusive(async () => {\n if (this._roots === undefined || force) {\n const state = await this.getRootState()\n this.logger?.debug(`HttpBridge:discoverRoots.state [${state?.length}]`)\n const nodeManifest = state?.find(isPayloadOfSchemaType<WithMeta<NodeManifestPayload>>(NodeManifestPayloadSchema))\n if (nodeManifest) {\n const mods = (await this.resolveRootNode(nodeManifest)).filter(exists)\n this.logger?.debug(`HttpBridge:discoverRoots [${mods.length}]`)\n this._roots = mods\n } else {\n this._roots = []\n }\n }\n return this._roots\n })\n }\n\n moduleUrl(address: Address) {\n return new URL(address, this.clientUrl)\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 const payloadSize = JSON.stringify([query, payloads]).length\n if (payloadSize > this.maxPayloadSizeWarning) {\n this.logger?.warn(\n `Large targetQuery being sent: ${payloadSize} bytes [${this.address}][${this.moduleAddress}] [${query.schema}] [${payloads?.length}]`,\n )\n }\n const moduleUrl = this.moduleUrl(targetAddress).href\n const result = await this.axios.post<ApiEnvelope<ModuleQueryResult<TOut>>>(moduleUrl, [query, payloads])\n if (result.status === 404) {\n throw `target module not found [${moduleUrl}] [${result.status}]`\n }\n if (result.status >= 400) {\n this.logger?.error(`targetQuery failed [${moduleUrl}]`)\n throw `targetQuery failed [${moduleUrl}] [${result.status}]`\n }\n return result.data?.data\n } catch (ex) {\n const error = ex as AxiosError\n this.logger?.error(`Error: ${toJsonString(error)}`)\n throw error\n } finally {\n this.querySemaphore.release()\n }\n }\n\n override unexposeHandler(_id: string, _options?: BridgeUnexposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n private async getRootState() {\n const queryPayload: ModuleStateQuery = { schema: ModuleStateQuerySchema }\n const boundQuery = await this.bindQuery(queryPayload)\n try {\n const response = await this.axios.post<ApiEnvelope<ModuleQueryResult>>(this.clientUrl.toString(), boundQuery)\n if (response.status === 404) {\n return []\n }\n const [, payloads, errors] = response.data.data\n if (errors.length > 0) {\n throw new Error(`getRootState failed: ${JSON.stringify(errors, null, 2)}`)\n }\n return payloads\n } catch (ex) {\n const error = ex as Error\n this.logger?.warn(`Unable to connect to remote node: ${error.message} [${this.clientUrl}]`)\n }\n }\n\n private async resolveRootNode(nodeManifest: NodeManifestPayload): Promise<ModuleInstance[]> {\n const rootModule = assertEx(\n (await this.resolver.resolveHandler(assertEx(nodeManifest.status?.address, () => 'Root has no address'))).at(0),\n () => `Root not found [${nodeManifest.status?.address}]`,\n )\n assertEx(rootModule.constructor.name !== 'HttpModuleProxy', () => 'rootModule is not a Wrapper')\n const rootNode = asAttachableNodeInstance(rootModule, 'Root modules is not a node')\n if (rootNode) {\n this.logger.debug(`rootNode: ${rootNode.id}`)\n this.downResolver.addResolver(rootNode as unknown as ModuleResolverInstance)\n return [rootNode]\n }\n return []\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { Account } from '@xyo-network/account'\nimport { AbstractBridgeModuleResolver, BridgeModuleResolverParams, wrapModuleWithType } from '@xyo-network/bridge-abstract'\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 { BridgeQuerySender, HttpModuleProxy, HttpModuleProxyParams } from './ModuleProxy'\n\nexport interface HttpBridgeModuleResolverParams extends BridgeModuleResolverParams {\n querySender: BridgeQuerySender\n rootUrl: string\n}\n\nexport class HttpBridgeModuleResolver<\n T extends HttpBridgeModuleResolverParams = HttpBridgeModuleResolverParams,\n> extends AbstractBridgeModuleResolver<T> {\n get querySender() {\n return this.params.querySender\n }\n\n moduleUrl(address: Address) {\n return new URL(address, this.params.rootUrl)\n }\n\n override async resolveHandler<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T[]> {\n const parentResult = await super.resolveHandler(id, options)\n if (parentResult.length > 0) {\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: HttpModuleProxyParams = {\n account: Account.randomSync(),\n additionalSigners: this.params.additionalSigners,\n archiving: this.params.archiving,\n config: { schema: ModuleConfigSchema },\n host: this,\n moduleAddress,\n onQuerySendFinished: this.params.onQuerySendFinished,\n onQuerySendStarted: this.params.onQuerySendStarted,\n querySender: this.querySender,\n }\n\n this.logger?.debug(`creating HttpProxy [${moduleAddress}] ${id}`)\n\n const proxy = new HttpModuleProxy<T, HttpModuleProxyParams>(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 ? [result] : []\n }\n\n //console.log(`resolved: ${proxy.address} [${wrapped.constructor.name}] [${as.constructor.name}]`)\n return [instance]\n }\n}\n","import { forget } from '@xylabs/forget'\nimport { Address } from '@xylabs/hex'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleProxy, ModuleProxyParams } from '@xyo-network/bridge-abstract'\nimport { AttachableModuleInstance, ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\n\nexport interface BridgeQuerySender {\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 HttpModuleProxyParams = ModuleProxyParams & {\n querySender: BridgeQuerySender\n}\n\nexport class HttpModuleProxy<\n TWrappedModule extends ModuleInstance = ModuleInstance,\n TParams extends Omit<HttpModuleProxyParams, 'config'> & { config: TWrappedModule['config'] } = Omit<HttpModuleProxyParams, 'config'> & {\n config: TWrappedModule['config']\n },\n >\n extends AbstractModuleProxy<TWrappedModule, TParams>\n implements AttachableModuleInstance<TParams, TWrappedModule['eventData']>\n{\n static createCount = 0\n\n constructor(params: TParams) {\n HttpModuleProxy.createCount = HttpModuleProxy.createCount + 1\n if (Math.floor(HttpModuleProxy.createCount / 10) === HttpModuleProxy.createCount / 10) {\n console.log(`HttpModuleProxy.createCount: ${HttpModuleProxy.createCount}`)\n }\n super(params)\n }\n\n async proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads: Payload[] = []): Promise<ModuleQueryResult> {\n if (this.archiving && this.isAllowedArchivingQuery(query.schema)) {\n forget(this.storeToArchivists([query, ...(payloads ?? [])]))\n }\n const result = await this.params.querySender.sendBridgeQuery(this.params.moduleAddress, query, payloads)\n if (this.archiving && this.isAllowedArchivingQuery(query.schema)) {\n forget(this.storeToArchivists(result.flat()))\n }\n return result\n }\n}\n"],"mappings":"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","names":["HttpBridgeConfigSchema","assertEx","exists","toJsonString","isQueryBoundWitness","creatableModule","resolveAddressToInstanceUp","express","assertEx","AxiosJson","exists","forget","toJsonString","AbstractBridge","NodeManifestPayloadSchema","creatableModule","ModuleStateQuerySchema","asAttachableNodeInstance","isPayloadOfSchemaType","Mutex","Semaphore","LRUCache","assertEx","isAddress","Account","AbstractBridgeModuleResolver","wrapModuleWithType","ConfigSchema","asModuleInstance","ModuleConfigSchema","ResolveHelper","forget","AbstractModuleProxy","HttpModuleProxy","AbstractModuleProxy","constructor","params","createCount","Math","floor","console","log","proxyQueryHandler","query","payloads","archiving","isAllowedArchivingQuery","schema","forget","storeToArchivists","result","querySender","sendBridgeQuery","moduleAddress","flat","HttpBridgeModuleResolver","AbstractBridgeModuleResolver","querySender","params","moduleUrl","address","URL","rootUrl","resolveHandler","id","options","parentResult","length","idParts","split","untransformedFirstPart","assertEx","shift","firstPart","ResolveHelper","transformModuleIdentifier","moduleAddress","isAddress","remainderParts","join","account","Account","randomSync","additionalSigners","archiving","config","schema","ModuleConfigSchema","host","onQuerySendFinished","onQuerySendStarted","logger","debug","proxy","HttpModuleProxy","state","configSchema","find","payload","ConfigSchema","setConfig","start","wrapped","wrapModuleWithType","instance","asModuleInstance","upResolver","add","downResolver","result","resolve","HttpBridgeBase","AbstractBridge","_axios","_discoverRootsMutex","Mutex","_failureTimeCache","LRUCache","max","maxFailureCacheSize","_querySemaphore","_resolver","axios","AxiosJson","clientUrl","assertEx","config","client","url","nodeUrl","failureRetryTime","defaultFailureRetryTime","maxConnections","defaultMaxConnections","maxPayloadSizeWarning","defaultMaxPayloadSizeWarning","querySemaphore","Semaphore","resolver","HttpBridgeModuleResolver","additionalSigners","archiving","resolveArchivists","resolveArchivingArchivists","bind","bridge","onQuerySendFinished","args","forget","emit","module","onQuerySendStarted","querySender","root","rootUrl","wrapperAccount","account","exposeHandler","_id","_options","Error","exposedHandler","getRoots","force","runExclusive","_roots","undefined","state","getRootState","logger","debug","length","nodeManifest","find","isPayloadOfSchemaType","NodeManifestPayloadSchema","mods","resolveRootNode","filter","exists","moduleUrl","address","URL","sendBridgeQuery","targetAddress","query","payloads","lastFailureTime","get","now","Date","timeSincePreviousFailure","delete","acquire","payloadSize","JSON","stringify","warn","moduleAddress","schema","href","result","post","status","error","data","ex","toJsonString","release","unexposeHandler","queryPayload","ModuleStateQuerySchema","boundQuery","bindQuery","response","toString","errors","message","rootModule","resolveHandler","at","constructor","name","rootNode","asAttachableNodeInstance","id","downResolver","addResolver","configSchemas","HttpBridgeConfigSchema","defaultConfigSchema","creatableModule","HttpBridge","HttpBridgeBase","_app","_exposedModules","_server","app","express","use","json","post","req","res","handlePost","exposeChild","mod","options","maxDepth","console","log","address","id","assertEx","config","host","push","WeakRef","children","publicChildren","logger","toJsonString","map","child","exposedChildren","Promise","all","required","flat","filter","exists","allExposed","exposedMod","exposeHandler","resolveAddressToInstanceUp","Error","exposedHandler","ref","deref","startHandler","startHttpServer","stopHandler","_timeout","stopHttpServer","unexposeHandler","find","callLocalModule","query","payloads","allPayloads","body","isQueryBoundWitness","payload","route","then","result","status","error","envelope","data","catch","ex","message","listen","port","server","close","undefined","creatableModule"]}
package/package.json CHANGED
@@ -10,51 +10,55 @@
10
10
  "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js/issues"
11
11
  },
12
12
  "dependencies": {
13
- "@xylabs/assert": "^3.5.0",
14
- "@xylabs/axios": "^3.5.0",
15
- "@xylabs/exists": "^3.5.0",
16
- "@xylabs/forget": "^3.5.0",
17
- "@xylabs/hex": "^3.5.0",
18
- "@xylabs/object": "^3.5.0",
19
- "@xylabs/promise": "^3.5.0",
20
- "@xyo-network/account": "~2.103.8",
21
- "@xyo-network/api-models": "~2.103.8",
22
- "@xyo-network/boundwitness-model": "~2.103.8",
23
- "@xyo-network/bridge-abstract": "~2.103.8",
24
- "@xyo-network/bridge-model": "~2.103.8",
25
- "@xyo-network/config-payload-plugin": "~2.103.8",
26
- "@xyo-network/manifest-model": "~2.103.8",
27
- "@xyo-network/module-model": "~2.103.8",
28
- "@xyo-network/node-model": "~2.103.8",
29
- "@xyo-network/payload-model": "~2.103.8",
13
+ "@xylabs/assert": "^3.5.1",
14
+ "@xylabs/axios": "^3.5.1",
15
+ "@xylabs/exists": "^3.5.1",
16
+ "@xylabs/forget": "^3.5.1",
17
+ "@xylabs/hex": "^3.5.1",
18
+ "@xylabs/object": "^3.5.1",
19
+ "@xylabs/promise": "^3.5.1",
20
+ "@xyo-network/account": "~2.104.0",
21
+ "@xyo-network/api-models": "~2.104.0",
22
+ "@xyo-network/boundwitness-model": "~2.104.0",
23
+ "@xyo-network/bridge-abstract": "~2.104.0",
24
+ "@xyo-network/bridge-model": "~2.104.0",
25
+ "@xyo-network/config-payload-plugin": "~2.104.0",
26
+ "@xyo-network/manifest-model": "~2.104.0",
27
+ "@xyo-network/module-model": "~2.104.0",
28
+ "@xyo-network/node-model": "~2.104.0",
29
+ "@xyo-network/payload-model": "~2.104.0",
30
30
  "async-mutex": "^0.5.0",
31
31
  "lru-cache": "^10.2.2"
32
32
  },
33
33
  "devDependencies": {
34
+ "@types/express": "^4.17.21",
34
35
  "@xylabs/ts-scripts-yarn3": "^3.10.4",
35
36
  "@xylabs/tsconfig": "^3.10.4",
36
- "@xyo-network/account": "~2.103.8",
37
- "@xyo-network/archivist-model": "~2.103.8",
38
- "@xyo-network/diviner-model": "~2.103.8",
39
- "@xyo-network/module-resolver": "~2.103.8",
40
- "@xyo-network/node-memory": "~2.103.8",
41
- "@xyo-network/node-model": "~2.103.8",
42
- "@xyo-network/payload-builder": "~2.103.8",
43
- "@xyo-network/payload-wrapper": "~2.103.8",
37
+ "@xyo-network/account": "~2.104.0",
38
+ "@xyo-network/archivist-model": "~2.104.0",
39
+ "@xyo-network/diviner-model": "~2.104.0",
40
+ "@xyo-network/module-resolver": "~2.104.0",
41
+ "@xyo-network/node-memory": "~2.104.0",
42
+ "@xyo-network/node-model": "~2.104.0",
43
+ "@xyo-network/payload-builder": "~2.104.0",
44
+ "@xyo-network/payload-wrapper": "~2.104.0",
45
+ "express": "^4.19.2",
44
46
  "typescript": "^5.4.5"
45
47
  },
48
+ "optionalDependencies": {
49
+ "express": "^4.19.2"
50
+ },
46
51
  "description": "Primary SDK for using XYO Protocol 2.0",
47
- "types": "dist/node/index.d.ts",
48
52
  "exports": {
49
53
  ".": {
50
54
  "browser": {
51
55
  "require": {
52
- "types": "./dist/browser/index.d.cts",
53
- "default": "./dist/browser/index.cjs"
56
+ "types": "./dist/browser/index-browser.d.cts",
57
+ "default": "./dist/browser/index-browser.cjs"
54
58
  },
55
59
  "import": {
56
- "types": "./dist/browser/index.d.mts",
57
- "default": "./dist/browser/index.js"
60
+ "types": "./dist/browser/index-browser.d.mts",
61
+ "default": "./dist/browser/index-browser.js"
58
62
  }
59
63
  },
60
64
  "node": {
@@ -70,8 +74,9 @@
70
74
  },
71
75
  "./package.json": "./package.json"
72
76
  },
73
- "main": "dist/node/index.cjs",
74
- "module": "dist/node/index.js",
77
+ "main": "dist/neutral/index-browser.cjs",
78
+ "module": "dist/neutral/index-browser.js",
79
+ "types": "dist/neutral/index-browser.d.ts",
75
80
  "homepage": "https://xyo.network",
76
81
  "license": "LGPL-3.0-only",
77
82
  "publishConfig": {
@@ -82,6 +87,6 @@
82
87
  "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
83
88
  },
84
89
  "sideEffects": false,
85
- "version": "2.103.8",
90
+ "version": "2.104.0",
86
91
  "type": "module"
87
92
  }
@@ -38,7 +38,7 @@ import { BridgeQuerySender } from './ModuleProxy'
38
38
  export interface HttpBridgeParams extends BridgeParams<AnyConfigSchema<HttpBridgeConfig>> {}
39
39
 
40
40
  @creatableModule()
41
- export class HttpBridge<TParams extends HttpBridgeParams> extends AbstractBridge<TParams> implements BridgeModule<TParams>, BridgeQuerySender {
41
+ export class HttpBridgeBase<TParams extends HttpBridgeParams> extends AbstractBridge<TParams> implements BridgeModule<TParams>, BridgeQuerySender {
42
42
  static override readonly configSchemas: Schema[] = [...super.configSchemas, HttpBridgeConfigSchema]
43
43
  static override readonly defaultConfigSchema: Schema = HttpBridgeConfigSchema
44
44
  static defaultFailureRetryTime = 1000 * 60
@@ -48,7 +48,7 @@ export class HttpBridge<TParams extends HttpBridgeParams> extends AbstractBridge
48
48
 
49
49
  private _axios?: AxiosJson
50
50
  private _discoverRootsMutex = new Mutex()
51
- private _failureTimeCache = new LRUCache<Address, number>({ max: HttpBridge.maxFailureCacheSize })
51
+ private _failureTimeCache = new LRUCache<Address, number>({ max: HttpBridgeBase.maxFailureCacheSize })
52
52
  private _querySemaphore?: Semaphore
53
53
  private _resolver?: HttpBridgeModuleResolver
54
54
 
@@ -57,20 +57,21 @@ export class HttpBridge<TParams extends HttpBridgeParams> extends AbstractBridge
57
57
  return this._axios
58
58
  }
59
59
 
60
+ get clientUrl() {
61
+ // eslint-disable-next-line deprecation/deprecation
62
+ return assertEx(this.config.client?.url ?? this.config.nodeUrl, () => 'No Url Set')
63
+ }
64
+
60
65
  get failureRetryTime() {
61
- return this.config.failureRetryTime ?? HttpBridge.defaultFailureRetryTime
66
+ return this.config.failureRetryTime ?? HttpBridgeBase.defaultFailureRetryTime
62
67
  }
63
68
 
64
69
  get maxConnections() {
65
- return this.config.maxConnections ?? HttpBridge.defaultMaxConnections
70
+ return this.config.maxConnections ?? HttpBridgeBase.defaultMaxConnections
66
71
  }
67
72
 
68
73
  get maxPayloadSizeWarning() {
69
- return this.config.maxPayloadSizeWarning ?? HttpBridge.defaultMaxPayloadSizeWarning
70
- }
71
-
72
- get nodeUrl() {
73
- return assertEx(this.config.nodeUrl, () => 'No Url Set')
74
+ return this.config.maxPayloadSizeWarning ?? HttpBridgeBase.defaultMaxPayloadSizeWarning
74
75
  }
75
76
 
76
77
  get querySemaphore() {
@@ -93,7 +94,7 @@ export class HttpBridge<TParams extends HttpBridgeParams> extends AbstractBridge
93
94
  },
94
95
  querySender: this,
95
96
  root: this,
96
- rootUrl: this.nodeUrl,
97
+ rootUrl: this.clientUrl,
97
98
  wrapperAccount: this.account,
98
99
  })
99
100
  return this._resolver
@@ -126,7 +127,7 @@ export class HttpBridge<TParams extends HttpBridgeParams> extends AbstractBridge
126
127
  }
127
128
 
128
129
  moduleUrl(address: Address) {
129
- return new URL(address, this.nodeUrl)
130
+ return new URL(address, this.clientUrl)
130
131
  }
131
132
 
132
133
  async sendBridgeQuery<TOut extends Payload = Payload, TQuery extends QueryBoundWitness = QueryBoundWitness, TIn extends Payload = Payload>(
@@ -178,7 +179,7 @@ export class HttpBridge<TParams extends HttpBridgeParams> extends AbstractBridge
178
179
  const queryPayload: ModuleStateQuery = { schema: ModuleStateQuerySchema }
179
180
  const boundQuery = await this.bindQuery(queryPayload)
180
181
  try {
181
- const response = await this.axios.post<ApiEnvelope<ModuleQueryResult>>(this.nodeUrl.toString(), boundQuery)
182
+ const response = await this.axios.post<ApiEnvelope<ModuleQueryResult>>(this.clientUrl.toString(), boundQuery)
182
183
  if (response.status === 404) {
183
184
  return []
184
185
  }
@@ -189,7 +190,7 @@ export class HttpBridge<TParams extends HttpBridgeParams> extends AbstractBridge
189
190
  return payloads
190
191
  } catch (ex) {
191
192
  const error = ex as Error
192
- this.logger?.warn(`Unable to connect to remote node: ${error.message} [${this.nodeUrl}]`)
193
+ this.logger?.warn(`Unable to connect to remote node: ${error.message} [${this.clientUrl}]`)
193
194
  }
194
195
  }
195
196