@xyo-network/bridge-websocket 2.99.1 → 2.99.3

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 (176) 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/neutral/Bridge.d.cts +28 -0
  48. package/dist/neutral/Bridge.d.cts.map +1 -0
  49. package/dist/neutral/Bridge.d.mts +28 -0
  50. package/dist/neutral/Bridge.d.mts.map +1 -0
  51. package/dist/neutral/Bridge.d.ts +28 -0
  52. package/dist/neutral/Bridge.d.ts.map +1 -0
  53. package/dist/neutral/ClientBridge.d.cts +42 -0
  54. package/dist/neutral/ClientBridge.d.cts.map +1 -0
  55. package/dist/neutral/ClientBridge.d.mts +42 -0
  56. package/dist/neutral/ClientBridge.d.mts.map +1 -0
  57. package/dist/neutral/ClientBridge.d.ts +42 -0
  58. package/dist/neutral/ClientBridge.d.ts.map +1 -0
  59. package/dist/neutral/Config.d.cts +17 -0
  60. package/dist/neutral/Config.d.cts.map +1 -0
  61. package/dist/neutral/Config.d.mts +17 -0
  62. package/dist/neutral/Config.d.mts.map +1 -0
  63. package/dist/neutral/Config.d.ts +17 -0
  64. package/dist/neutral/Config.d.ts.map +1 -0
  65. package/dist/neutral/ModuleProxy/ModuleProxy.d.cts +21 -0
  66. package/dist/neutral/ModuleProxy/ModuleProxy.d.cts.map +1 -0
  67. package/dist/neutral/ModuleProxy/ModuleProxy.d.mts +21 -0
  68. package/dist/neutral/ModuleProxy/ModuleProxy.d.mts.map +1 -0
  69. package/dist/neutral/ModuleProxy/ModuleProxy.d.ts +21 -0
  70. package/dist/neutral/ModuleProxy/ModuleProxy.d.ts.map +1 -0
  71. package/dist/neutral/ModuleProxy/index.d.cts +2 -0
  72. package/dist/neutral/ModuleProxy/index.d.cts.map +1 -0
  73. package/dist/neutral/ModuleProxy/index.d.mts +2 -0
  74. package/dist/neutral/ModuleProxy/index.d.mts.map +1 -0
  75. package/dist/neutral/ModuleProxy/index.d.ts +2 -0
  76. package/dist/neutral/ModuleProxy/index.d.ts.map +1 -0
  77. package/dist/neutral/Params.d.cts +5 -0
  78. package/dist/neutral/Params.d.cts.map +1 -0
  79. package/dist/neutral/Params.d.mts +5 -0
  80. package/dist/neutral/Params.d.mts.map +1 -0
  81. package/dist/neutral/Params.d.ts +5 -0
  82. package/dist/neutral/Params.d.ts.map +1 -0
  83. package/dist/{node/ModuleResolver.d.cts → neutral/WebsocketBridgeModuleResolver.d.cts} +6 -6
  84. package/dist/neutral/WebsocketBridgeModuleResolver.d.cts.map +1 -0
  85. package/dist/neutral/WebsocketBridgeModuleResolver.d.mts +11 -0
  86. package/dist/neutral/WebsocketBridgeModuleResolver.d.mts.map +1 -0
  87. package/dist/neutral/WebsocketBridgeModuleResolver.d.ts +11 -0
  88. package/dist/neutral/WebsocketBridgeModuleResolver.d.ts.map +1 -0
  89. package/dist/neutral/index-browser.d.cts +5 -0
  90. package/dist/neutral/index-browser.d.cts.map +1 -0
  91. package/dist/neutral/index-browser.d.mts +5 -0
  92. package/dist/neutral/index-browser.d.mts.map +1 -0
  93. package/dist/neutral/index-browser.d.ts +5 -0
  94. package/dist/neutral/index-browser.d.ts.map +1 -0
  95. package/dist/neutral/index.cjs +304 -0
  96. package/dist/neutral/index.cjs.map +1 -0
  97. package/dist/neutral/index.d.cts +3 -0
  98. package/dist/neutral/index.d.cts.map +1 -0
  99. package/dist/neutral/index.d.mts +3 -0
  100. package/dist/neutral/index.d.mts.map +1 -0
  101. package/dist/neutral/index.d.ts +3 -0
  102. package/dist/neutral/index.d.ts.map +1 -0
  103. package/dist/neutral/index.js +283 -0
  104. package/dist/neutral/index.js.map +1 -0
  105. package/dist/neutral/socketServer.d.cts +10 -0
  106. package/dist/neutral/socketServer.d.cts.map +1 -0
  107. package/dist/neutral/socketServer.d.mts +10 -0
  108. package/dist/neutral/socketServer.d.mts.map +1 -0
  109. package/dist/neutral/socketServer.d.ts +10 -0
  110. package/dist/neutral/socketServer.d.ts.map +1 -0
  111. package/dist/node/Bridge.d.cts +19 -14
  112. package/dist/node/Bridge.d.cts.map +1 -1
  113. package/dist/node/Bridge.d.mts +19 -14
  114. package/dist/node/Bridge.d.mts.map +1 -1
  115. package/dist/node/Bridge.d.ts +19 -14
  116. package/dist/node/Bridge.d.ts.map +1 -1
  117. package/dist/node/ClientBridge.d.cts +42 -0
  118. package/dist/node/ClientBridge.d.cts.map +1 -0
  119. package/dist/node/ClientBridge.d.mts +42 -0
  120. package/dist/node/ClientBridge.d.mts.map +1 -0
  121. package/dist/node/ClientBridge.d.ts +42 -0
  122. package/dist/node/ClientBridge.d.ts.map +1 -0
  123. package/dist/node/Config.d.cts +9 -4
  124. package/dist/node/Config.d.cts.map +1 -1
  125. package/dist/node/Config.d.mts +9 -4
  126. package/dist/node/Config.d.mts.map +1 -1
  127. package/dist/node/Config.d.ts +9 -4
  128. package/dist/node/Config.d.ts.map +1 -1
  129. package/dist/node/ModuleProxy/ModuleProxy.d.cts +7 -4
  130. package/dist/node/ModuleProxy/ModuleProxy.d.cts.map +1 -1
  131. package/dist/node/ModuleProxy/ModuleProxy.d.mts +7 -4
  132. package/dist/node/ModuleProxy/ModuleProxy.d.mts.map +1 -1
  133. package/dist/node/ModuleProxy/ModuleProxy.d.ts +7 -4
  134. package/dist/node/ModuleProxy/ModuleProxy.d.ts.map +1 -1
  135. package/dist/node/Params.d.cts +5 -0
  136. package/dist/node/Params.d.cts.map +1 -0
  137. package/dist/node/Params.d.mts +5 -0
  138. package/dist/node/Params.d.mts.map +1 -0
  139. package/dist/node/Params.d.ts +5 -0
  140. package/dist/node/Params.d.ts.map +1 -0
  141. package/dist/node/WebsocketBridgeModuleResolver.d.cts +11 -0
  142. package/dist/node/WebsocketBridgeModuleResolver.d.cts.map +1 -0
  143. package/dist/node/WebsocketBridgeModuleResolver.d.mts +11 -0
  144. package/dist/node/WebsocketBridgeModuleResolver.d.mts.map +1 -0
  145. package/dist/node/WebsocketBridgeModuleResolver.d.ts +11 -0
  146. package/dist/node/WebsocketBridgeModuleResolver.d.ts.map +1 -0
  147. package/dist/node/index-browser.d.cts +5 -0
  148. package/dist/node/index-browser.d.cts.map +1 -0
  149. package/dist/node/index-browser.d.mts +5 -0
  150. package/dist/node/index-browser.d.mts.map +1 -0
  151. package/dist/node/index-browser.d.ts +5 -0
  152. package/dist/node/index-browser.d.ts.map +1 -0
  153. package/dist/node/index.cjs +167 -34
  154. package/dist/node/index.cjs.map +1 -1
  155. package/dist/node/index.js +167 -35
  156. package/dist/node/index.js.map +1 -1
  157. package/package.json +27 -26
  158. package/src/Bridge.ts +63 -30
  159. package/src/ClientBridge.ts +113 -0
  160. package/src/Config.ts +11 -4
  161. package/src/ModuleProxy/ModuleProxy.ts +21 -13
  162. package/src/Params.ts +7 -0
  163. package/src/{ModuleResolver.ts → WebsocketBridgeModuleResolver.ts} +23 -14
  164. package/src/index-browser.ts +4 -0
  165. package/xy.config.ts +14 -0
  166. package/dist/browser/ModuleResolver.d.cts.map +0 -1
  167. package/dist/browser/ModuleResolver.d.mts.map +0 -1
  168. package/dist/browser/ModuleResolver.d.ts.map +0 -1
  169. package/dist/browser/index.cjs.map +0 -1
  170. package/dist/browser/index.js.map +0 -1
  171. package/dist/node/ModuleResolver.d.cts.map +0 -1
  172. package/dist/node/ModuleResolver.d.mts +0 -11
  173. package/dist/node/ModuleResolver.d.mts.map +0 -1
  174. package/dist/node/ModuleResolver.d.ts +0 -11
  175. package/dist/node/ModuleResolver.d.ts.map +0 -1
  176. package/src/spec/socketServer.ts +0 -68
@@ -1,11 +1,11 @@
1
- import { Address } from '@xylabs/hex';
2
1
  import { AbstractBridgeModuleResolver, BridgeModuleResolverParams } from '@xyo-network/abstract-bridge';
3
2
  import { ModuleFilterOptions, ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model';
4
- export interface WebsocketBridgeModuleResolverOptions extends BridgeModuleResolverParams {
5
- url: string;
3
+ import { WebsocketBridgeQuerySender } from './ModuleProxy';
4
+ export interface WebsocketBridgeModuleResolverParams extends BridgeModuleResolverParams {
5
+ querySender: WebsocketBridgeQuerySender;
6
6
  }
7
- export declare class WebsocketBridgeModuleResolver<T extends WebsocketBridgeModuleResolverOptions = WebsocketBridgeModuleResolverOptions> extends AbstractBridgeModuleResolver<T> {
8
- moduleUrl(address: Address): URL;
7
+ export declare class WebsocketBridgeModuleResolver<T extends WebsocketBridgeModuleResolverParams = WebsocketBridgeModuleResolverParams> extends AbstractBridgeModuleResolver<T> {
8
+ get querySender(): WebsocketBridgeQuerySender;
9
9
  resolveHandler<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | T[] | undefined>;
10
10
  }
11
- //# sourceMappingURL=ModuleResolver.d.ts.map
11
+ //# sourceMappingURL=WebsocketBridgeModuleResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebsocketBridgeModuleResolver.d.ts","sourceRoot":"","sources":["../../src/WebsocketBridgeModuleResolver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,4BAA4B,EAAE,0BAA0B,EAAsB,MAAM,8BAA8B,CAAA;AAG3H,OAAO,EAIL,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EAEf,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,0BAA0B,EAAoD,MAAM,eAAe,CAAA;AAE5G,MAAM,WAAW,mCAAoC,SAAQ,0BAA0B;IACrF,WAAW,EAAE,0BAA0B,CAAA;CACxC;AAED,qBAAa,6BAA6B,CACxC,CAAC,SAAS,mCAAmC,GAAG,mCAAmC,CACnF,SAAQ,4BAA4B,CAAC,CAAC,CAAC;IACvC,IAAI,WAAW,+BAEd;IAEc,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EACrE,EAAE,EAAE,gBAAgB,EACpB,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC/B,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;CAqDhC"}
@@ -18,23 +18,25 @@ var __copyProps = (to, from, except, desc) => {
18
18
  };
19
19
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
20
 
21
- // src/index.ts
22
- var src_exports = {};
23
- __export(src_exports, {
21
+ // src/index-browser.ts
22
+ var index_browser_exports = {};
23
+ __export(index_browser_exports, {
24
24
  WebsocketBridge: () => WebsocketBridge,
25
25
  WebsocketBridgeConfigSchema: () => WebsocketBridgeConfigSchema
26
26
  });
27
- module.exports = __toCommonJS(src_exports);
27
+ module.exports = __toCommonJS(index_browser_exports);
28
28
 
29
- // src/Bridge.ts
29
+ // src/ClientBridge.ts
30
30
  var import_assert2 = require("@xylabs/assert");
31
31
  var import_abstract_bridge3 = require("@xyo-network/abstract-bridge");
32
32
  var import_module_model2 = require("@xyo-network/module-model");
33
+ var import_async_mutex = require("async-mutex");
34
+ var import_lru_cache = require("lru-cache");
33
35
 
34
36
  // src/Config.ts
35
37
  var WebsocketBridgeConfigSchema = "network.xyo.bridge.websocket.config";
36
38
 
37
- // src/ModuleResolver.ts
39
+ // src/WebsocketBridgeModuleResolver.ts
38
40
  var import_assert = require("@xylabs/assert");
39
41
  var import_hex = require("@xylabs/hex");
40
42
  var import_abstract_bridge2 = require("@xyo-network/abstract-bridge");
@@ -44,31 +46,30 @@ var import_module_model = require("@xyo-network/module-model");
44
46
 
45
47
  // src/ModuleProxy/ModuleProxy.ts
46
48
  var import_abstract_bridge = require("@xyo-network/abstract-bridge");
47
- var WebsocketModuleProxy = class extends import_abstract_bridge.AbstractModuleProxy {
49
+ var WebsocketModuleProxy = class _WebsocketModuleProxy extends import_abstract_bridge.AbstractModuleProxy {
48
50
  static {
49
51
  __name(this, "WebsocketModuleProxy");
50
52
  }
51
- async proxyQueryHandler(query, payloads = []) {
52
- const { maxPayloadSizeWarning } = this.params;
53
- const payloadSize = JSON.stringify([
54
- query,
55
- payloads
56
- ]).length;
57
- if (maxPayloadSizeWarning && payloadSize > maxPayloadSizeWarning) {
58
- this.logger?.warn(`Large targetQuery being sent: ${payloadSize} bytes [${this.address}][${this.moduleAddress}] [${query.schema}] [${payloads?.length}]`);
53
+ static createCount = 0;
54
+ constructor(params) {
55
+ _WebsocketModuleProxy.createCount = _WebsocketModuleProxy.createCount + 1;
56
+ if (Math.floor(_WebsocketModuleProxy.createCount / 10) === _WebsocketModuleProxy.createCount / 10) {
57
+ console.log(`WebsocketModuleProxy.createCount: ${_WebsocketModuleProxy.createCount}`);
59
58
  }
60
- await Promise.resolve();
61
- throw new Error("Unsupported");
59
+ super(params);
60
+ }
61
+ async proxyQueryHandler(query, payloads = []) {
62
+ return await this.params.querySender.sendBridgeQuery(this.params.moduleAddress, query, payloads);
62
63
  }
63
64
  };
64
65
 
65
- // src/ModuleResolver.ts
66
+ // src/WebsocketBridgeModuleResolver.ts
66
67
  var WebsocketBridgeModuleResolver = class extends import_abstract_bridge2.AbstractBridgeModuleResolver {
67
68
  static {
68
69
  __name(this, "WebsocketBridgeModuleResolver");
69
70
  }
70
- moduleUrl(address) {
71
- return new URL(address, this.params.url);
71
+ get querySender() {
72
+ return this.params.querySender;
72
73
  }
73
74
  async resolveHandler(id, options) {
74
75
  const parentResult = await super.resolveHandler(id, options);
@@ -79,7 +80,8 @@ var WebsocketBridgeModuleResolver = class extends import_abstract_bridge2.Abstra
79
80
  return [];
80
81
  }
81
82
  const idParts = id.split(":");
82
- const firstPart = (0, import_assert.assertEx)(idParts.shift(), () => "Missing firstPart");
83
+ const untransformedFirstPart = (0, import_assert.assertEx)(idParts.shift(), () => `Invalid module identifier: ${id}`);
84
+ const firstPart = await import_module_model.ResolveHelper.transformModuleIdentifier(untransformedFirstPart);
83
85
  const moduleAddress = firstPart;
84
86
  (0, import_assert.assertEx)((0, import_hex.isAddress)(firstPart), () => `Invalid module address: ${firstPart}`);
85
87
  const remainderParts = idParts.join(":");
@@ -90,8 +92,9 @@ var WebsocketBridgeModuleResolver = class extends import_abstract_bridge2.Abstra
90
92
  },
91
93
  host: this,
92
94
  moduleAddress,
93
- moduleUrl: this.moduleUrl(moduleAddress).href
95
+ querySender: this.querySender
94
96
  };
97
+ this.logger?.debug(`creating HttpProxy [${moduleAddress}] ${id}`);
95
98
  const proxy = new WebsocketModuleProxy(params);
96
99
  if (proxy) {
97
100
  const state = await proxy.state();
@@ -103,18 +106,18 @@ var WebsocketBridgeModuleResolver = class extends import_abstract_bridge2.Abstra
103
106
  }
104
107
  await proxy.start();
105
108
  const wrapped = (0, import_assert.assertEx)((0, import_abstract_bridge2.wrapModuleWithType)(proxy, import_account.Account.randomSync()), () => `Failed to wrapModuleWithType [${id}]`);
106
- const as = (0, import_assert.assertEx)((0, import_module_model.asModuleInstance)(wrapped, {}), () => `Failed to asModuleInstance [${id}]`);
107
- proxy.upResolver.add(as);
108
- proxy.downResolver.add(as);
109
+ const instance = (0, import_assert.assertEx)((0, import_module_model.asModuleInstance)(wrapped, {}), () => `Failed to asModuleInstance [${id}]`);
110
+ proxy.upResolver.add(instance);
111
+ proxy.downResolver.add(instance);
109
112
  if (remainderParts.length > 0) {
110
113
  const result = await wrapped.resolve(remainderParts, options);
111
114
  return result;
112
115
  }
113
- return as;
116
+ return instance;
114
117
  }
115
118
  };
116
119
 
117
- // src/Bridge.ts
120
+ // src/ClientBridge.ts
118
121
  function _ts_decorate(decorators, target, key, desc) {
119
122
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
120
123
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
@@ -126,28 +129,51 @@ function _ts_decorate(decorators, target, key, desc) {
126
129
  return c > 3 && r && Object.defineProperty(target, key, r), r;
127
130
  }
128
131
  __name(_ts_decorate, "_ts_decorate");
129
- var WebsocketBridge = class extends import_abstract_bridge3.AbstractBridge {
132
+ var WebsocketClientBridge = class _WebsocketClientBridge extends import_abstract_bridge3.AbstractBridge {
130
133
  static {
131
- __name(this, "WebsocketBridge");
134
+ __name(this, "WebsocketClientBridge");
132
135
  }
133
136
  static configSchemas = [
134
137
  ...super.configSchemas,
135
138
  WebsocketBridgeConfigSchema
136
139
  ];
137
140
  static defaultConfigSchema = WebsocketBridgeConfigSchema;
138
- static maxPayloadSizeWarning = 256 * 256;
141
+ static defaultFailureRetryTime = 1e3 * 60;
142
+ static defaultMaxConnections = 4;
143
+ static defaultMaxPayloadSizeWarning = 256 * 256;
144
+ static maxFailureCacheSize = 1e3;
145
+ _failureTimeCache = new import_lru_cache.LRUCache({
146
+ max: _WebsocketClientBridge.maxFailureCacheSize
147
+ });
148
+ _querySemaphore;
139
149
  _resolver;
150
+ get client() {
151
+ return this.config.client;
152
+ }
153
+ get failureRetryTime() {
154
+ return this.client?.failureRetryTime ?? _WebsocketClientBridge.defaultFailureRetryTime;
155
+ }
156
+ get maxConnections() {
157
+ return this.client?.maxConnections ?? _WebsocketClientBridge.defaultMaxConnections;
158
+ }
159
+ get maxPayloadSizeWarning() {
160
+ return this.client?.maxPayloadSizeWarning ?? _WebsocketClientBridge.defaultMaxPayloadSizeWarning;
161
+ }
162
+ get querySemaphore() {
163
+ this._querySemaphore = this._querySemaphore ?? new import_async_mutex.Semaphore(this.maxConnections);
164
+ return this._querySemaphore;
165
+ }
140
166
  get resolver() {
141
167
  this._resolver = this._resolver ?? new WebsocketBridgeModuleResolver({
142
168
  bridge: this,
169
+ querySender: this,
143
170
  root: this,
144
- url: this.url,
145
171
  wrapperAccount: this.account
146
172
  });
147
173
  return this._resolver;
148
174
  }
149
175
  get url() {
150
- return (0, import_assert2.assertEx)(this.config.url, () => "No Url Set");
176
+ return (0, import_assert2.assertEx)(this.config.client?.url, () => "No Url Set");
151
177
  }
152
178
  async discoverRoots() {
153
179
  return await Promise.resolve([]);
@@ -158,6 +184,26 @@ var WebsocketBridge = class extends import_abstract_bridge3.AbstractBridge {
158
184
  exposedHandler() {
159
185
  throw new Error("Unsupported");
160
186
  }
187
+ async sendBridgeQuery(targetAddress, _query, _payloads) {
188
+ const lastFailureTime = this._failureTimeCache.get(targetAddress);
189
+ if (lastFailureTime !== void 0) {
190
+ const now = Date.now();
191
+ const timeSincePreviousFailure = now - lastFailureTime;
192
+ if (timeSincePreviousFailure > this.failureRetryTime) {
193
+ throw new Error(`target module failed recently [${targetAddress}] [${timeSincePreviousFailure}ms ago]`);
194
+ }
195
+ this._failureTimeCache.delete(targetAddress);
196
+ }
197
+ try {
198
+ await this.querySemaphore.acquire();
199
+ throw new Error("Unsupported");
200
+ } catch (ex) {
201
+ const error = ex;
202
+ throw error;
203
+ } finally {
204
+ this.querySemaphore.release();
205
+ }
206
+ }
161
207
  async startHandler() {
162
208
  const { discoverRoot = true } = this.config;
163
209
  if (discoverRoot) {
@@ -169,7 +215,14 @@ var WebsocketBridge = class extends import_abstract_bridge3.AbstractBridge {
169
215
  throw new Error("Unsupported");
170
216
  }
171
217
  };
172
- WebsocketBridge = _ts_decorate([
218
+ WebsocketClientBridge = _ts_decorate([
173
219
  (0, import_module_model2.creatableModule)()
174
- ], WebsocketBridge);
175
- //# sourceMappingURL=index.cjs.map
220
+ ], WebsocketClientBridge);
221
+
222
+ // src/index-browser.ts
223
+ var WebsocketBridge = class extends WebsocketClientBridge {
224
+ static {
225
+ __name(this, "WebsocketBridge");
226
+ }
227
+ };
228
+ //# sourceMappingURL=index-browser.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index-browser.ts","../../src/ClientBridge.ts","../../src/Config.ts","../../src/WebsocketBridgeModuleResolver.ts","../../src/ModuleProxy/ModuleProxy.ts"],"sourcesContent":["import { WebsocketClientBridge } from './ClientBridge'\nexport * from './Config'\n\nexport class WebsocketBridge extends WebsocketClientBridge {}\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_abstract_bridge","import_module_model","WebsocketBridgeConfigSchema","import_abstract_bridge","WebsocketModuleProxy","AbstractModuleProxy","createCount","constructor","params","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","configSchemas","WebsocketBridgeConfigSchema","defaultConfigSchema","defaultFailureRetryTime","defaultMaxConnections","defaultMaxPayloadSizeWarning","maxFailureCacheSize","_failureTimeCache","LRUCache","max","_querySemaphore","_resolver","client","config","failureRetryTime","maxConnections","maxPayloadSizeWarning","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","creatableModule","WebsocketBridge","WebsocketClientBridge"]}
@@ -0,0 +1,5 @@
1
+ import { WebsocketClientBridge } from './ClientBridge';
2
+ export * from './Config';
3
+ export declare class WebsocketBridge extends WebsocketClientBridge {
4
+ }
5
+ //# sourceMappingURL=index-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-browser.d.ts","sourceRoot":"","sources":["../../src/index-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACtD,cAAc,UAAU,CAAA;AAExB,qBAAa,eAAgB,SAAQ,qBAAqB;CAAG"}
@@ -0,0 +1,5 @@
1
+ import { WebsocketClientBridge } from './ClientBridge';
2
+ export * from './Config';
3
+ export declare class WebsocketBridge extends WebsocketClientBridge {
4
+ }
5
+ //# sourceMappingURL=index-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-browser.d.ts","sourceRoot":"","sources":["../../src/index-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACtD,cAAc,UAAU,CAAA;AAExB,qBAAa,eAAgB,SAAQ,qBAAqB;CAAG"}
@@ -0,0 +1,5 @@
1
+ import { WebsocketClientBridge } from './ClientBridge';
2
+ export * from './Config';
3
+ export declare class WebsocketBridge extends WebsocketClientBridge {
4
+ }
5
+ //# sourceMappingURL=index-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-browser.d.ts","sourceRoot":"","sources":["../../src/index-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACtD,cAAc,UAAU,CAAA;AAExB,qBAAa,eAAgB,SAAQ,qBAAqB;CAAG"}
@@ -1,49 +1,50 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
3
 
4
- // src/Bridge.ts
4
+ // src/ClientBridge.ts
5
5
  import { assertEx as assertEx2 } from "@xylabs/assert";
6
6
  import { AbstractBridge } from "@xyo-network/abstract-bridge";
7
7
  import { creatableModule } from "@xyo-network/module-model";
8
+ import { Semaphore } from "async-mutex";
9
+ import { LRUCache } from "lru-cache";
8
10
 
9
11
  // src/Config.ts
10
12
  var WebsocketBridgeConfigSchema = "network.xyo.bridge.websocket.config";
11
13
 
12
- // src/ModuleResolver.ts
14
+ // src/WebsocketBridgeModuleResolver.ts
13
15
  import { assertEx } from "@xylabs/assert";
14
16
  import { isAddress } from "@xylabs/hex";
15
17
  import { AbstractBridgeModuleResolver, wrapModuleWithType } from "@xyo-network/abstract-bridge";
16
18
  import { Account } from "@xyo-network/account";
17
19
  import { ConfigSchema } from "@xyo-network/config-payload-plugin";
18
- import { asModuleInstance, ModuleConfigSchema } from "@xyo-network/module-model";
20
+ import { asModuleInstance, ModuleConfigSchema, ResolveHelper } from "@xyo-network/module-model";
19
21
 
20
22
  // src/ModuleProxy/ModuleProxy.ts
21
23
  import { AbstractModuleProxy } from "@xyo-network/abstract-bridge";
22
- var WebsocketModuleProxy = class extends AbstractModuleProxy {
24
+ var WebsocketModuleProxy = class _WebsocketModuleProxy extends AbstractModuleProxy {
23
25
  static {
24
26
  __name(this, "WebsocketModuleProxy");
25
27
  }
26
- async proxyQueryHandler(query, payloads = []) {
27
- const { maxPayloadSizeWarning } = this.params;
28
- const payloadSize = JSON.stringify([
29
- query,
30
- payloads
31
- ]).length;
32
- if (maxPayloadSizeWarning && payloadSize > maxPayloadSizeWarning) {
33
- this.logger?.warn(`Large targetQuery being sent: ${payloadSize} bytes [${this.address}][${this.moduleAddress}] [${query.schema}] [${payloads?.length}]`);
28
+ static createCount = 0;
29
+ constructor(params) {
30
+ _WebsocketModuleProxy.createCount = _WebsocketModuleProxy.createCount + 1;
31
+ if (Math.floor(_WebsocketModuleProxy.createCount / 10) === _WebsocketModuleProxy.createCount / 10) {
32
+ console.log(`WebsocketModuleProxy.createCount: ${_WebsocketModuleProxy.createCount}`);
34
33
  }
35
- await Promise.resolve();
36
- throw new Error("Unsupported");
34
+ super(params);
35
+ }
36
+ async proxyQueryHandler(query, payloads = []) {
37
+ return await this.params.querySender.sendBridgeQuery(this.params.moduleAddress, query, payloads);
37
38
  }
38
39
  };
39
40
 
40
- // src/ModuleResolver.ts
41
+ // src/WebsocketBridgeModuleResolver.ts
41
42
  var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
42
43
  static {
43
44
  __name(this, "WebsocketBridgeModuleResolver");
44
45
  }
45
- moduleUrl(address) {
46
- return new URL(address, this.params.url);
46
+ get querySender() {
47
+ return this.params.querySender;
47
48
  }
48
49
  async resolveHandler(id, options) {
49
50
  const parentResult = await super.resolveHandler(id, options);
@@ -54,7 +55,8 @@ var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
54
55
  return [];
55
56
  }
56
57
  const idParts = id.split(":");
57
- const firstPart = assertEx(idParts.shift(), () => "Missing firstPart");
58
+ const untransformedFirstPart = assertEx(idParts.shift(), () => `Invalid module identifier: ${id}`);
59
+ const firstPart = await ResolveHelper.transformModuleIdentifier(untransformedFirstPart);
58
60
  const moduleAddress = firstPart;
59
61
  assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`);
60
62
  const remainderParts = idParts.join(":");
@@ -65,8 +67,9 @@ var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
65
67
  },
66
68
  host: this,
67
69
  moduleAddress,
68
- moduleUrl: this.moduleUrl(moduleAddress).href
70
+ querySender: this.querySender
69
71
  };
72
+ this.logger?.debug(`creating HttpProxy [${moduleAddress}] ${id}`);
70
73
  const proxy = new WebsocketModuleProxy(params);
71
74
  if (proxy) {
72
75
  const state = await proxy.state();
@@ -78,18 +81,18 @@ var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
78
81
  }
79
82
  await proxy.start();
80
83
  const wrapped = assertEx(wrapModuleWithType(proxy, Account.randomSync()), () => `Failed to wrapModuleWithType [${id}]`);
81
- const as = assertEx(asModuleInstance(wrapped, {}), () => `Failed to asModuleInstance [${id}]`);
82
- proxy.upResolver.add(as);
83
- proxy.downResolver.add(as);
84
+ const instance = assertEx(asModuleInstance(wrapped, {}), () => `Failed to asModuleInstance [${id}]`);
85
+ proxy.upResolver.add(instance);
86
+ proxy.downResolver.add(instance);
84
87
  if (remainderParts.length > 0) {
85
88
  const result = await wrapped.resolve(remainderParts, options);
86
89
  return result;
87
90
  }
88
- return as;
91
+ return instance;
89
92
  }
90
93
  };
91
94
 
92
- // src/Bridge.ts
95
+ // src/ClientBridge.ts
93
96
  function _ts_decorate(decorators, target, key, desc) {
94
97
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
95
98
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
@@ -101,28 +104,51 @@ function _ts_decorate(decorators, target, key, desc) {
101
104
  return c > 3 && r && Object.defineProperty(target, key, r), r;
102
105
  }
103
106
  __name(_ts_decorate, "_ts_decorate");
104
- var WebsocketBridge = class extends AbstractBridge {
107
+ var WebsocketClientBridge = class _WebsocketClientBridge extends AbstractBridge {
105
108
  static {
106
- __name(this, "WebsocketBridge");
109
+ __name(this, "WebsocketClientBridge");
107
110
  }
108
111
  static configSchemas = [
109
112
  ...super.configSchemas,
110
113
  WebsocketBridgeConfigSchema
111
114
  ];
112
115
  static defaultConfigSchema = WebsocketBridgeConfigSchema;
113
- static maxPayloadSizeWarning = 256 * 256;
116
+ static defaultFailureRetryTime = 1e3 * 60;
117
+ static defaultMaxConnections = 4;
118
+ static defaultMaxPayloadSizeWarning = 256 * 256;
119
+ static maxFailureCacheSize = 1e3;
120
+ _failureTimeCache = new LRUCache({
121
+ max: _WebsocketClientBridge.maxFailureCacheSize
122
+ });
123
+ _querySemaphore;
114
124
  _resolver;
125
+ get client() {
126
+ return this.config.client;
127
+ }
128
+ get failureRetryTime() {
129
+ return this.client?.failureRetryTime ?? _WebsocketClientBridge.defaultFailureRetryTime;
130
+ }
131
+ get maxConnections() {
132
+ return this.client?.maxConnections ?? _WebsocketClientBridge.defaultMaxConnections;
133
+ }
134
+ get maxPayloadSizeWarning() {
135
+ return this.client?.maxPayloadSizeWarning ?? _WebsocketClientBridge.defaultMaxPayloadSizeWarning;
136
+ }
137
+ get querySemaphore() {
138
+ this._querySemaphore = this._querySemaphore ?? new Semaphore(this.maxConnections);
139
+ return this._querySemaphore;
140
+ }
115
141
  get resolver() {
116
142
  this._resolver = this._resolver ?? new WebsocketBridgeModuleResolver({
117
143
  bridge: this,
144
+ querySender: this,
118
145
  root: this,
119
- url: this.url,
120
146
  wrapperAccount: this.account
121
147
  });
122
148
  return this._resolver;
123
149
  }
124
150
  get url() {
125
- return assertEx2(this.config.url, () => "No Url Set");
151
+ return assertEx2(this.config.client?.url, () => "No Url Set");
126
152
  }
127
153
  async discoverRoots() {
128
154
  return await Promise.resolve([]);
@@ -133,6 +159,26 @@ var WebsocketBridge = class extends AbstractBridge {
133
159
  exposedHandler() {
134
160
  throw new Error("Unsupported");
135
161
  }
162
+ async sendBridgeQuery(targetAddress, _query, _payloads) {
163
+ const lastFailureTime = this._failureTimeCache.get(targetAddress);
164
+ if (lastFailureTime !== void 0) {
165
+ const now = Date.now();
166
+ const timeSincePreviousFailure = now - lastFailureTime;
167
+ if (timeSincePreviousFailure > this.failureRetryTime) {
168
+ throw new Error(`target module failed recently [${targetAddress}] [${timeSincePreviousFailure}ms ago]`);
169
+ }
170
+ this._failureTimeCache.delete(targetAddress);
171
+ }
172
+ try {
173
+ await this.querySemaphore.acquire();
174
+ throw new Error("Unsupported");
175
+ } catch (ex) {
176
+ const error = ex;
177
+ throw error;
178
+ } finally {
179
+ this.querySemaphore.release();
180
+ }
181
+ }
136
182
  async startHandler() {
137
183
  const { discoverRoot = true } = this.config;
138
184
  if (discoverRoot) {
@@ -144,11 +190,18 @@ var WebsocketBridge = class extends AbstractBridge {
144
190
  throw new Error("Unsupported");
145
191
  }
146
192
  };
147
- WebsocketBridge = _ts_decorate([
193
+ WebsocketClientBridge = _ts_decorate([
148
194
  creatableModule()
149
- ], WebsocketBridge);
195
+ ], WebsocketClientBridge);
196
+
197
+ // src/index-browser.ts
198
+ var WebsocketBridge = class extends WebsocketClientBridge {
199
+ static {
200
+ __name(this, "WebsocketBridge");
201
+ }
202
+ };
150
203
  export {
151
204
  WebsocketBridge,
152
205
  WebsocketBridgeConfigSchema
153
206
  };
154
- //# sourceMappingURL=index.js.map
207
+ //# sourceMappingURL=index-browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ClientBridge.ts","../../src/Config.ts","../../src/WebsocketBridgeModuleResolver.ts","../../src/ModuleProxy/ModuleProxy.ts","../../src/index-browser.ts"],"sourcesContent":["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","import { WebsocketClientBridge } from './ClientBridge'\nexport * from './Config'\n\nexport class WebsocketBridge extends WebsocketClientBridge {}\n"],"mappings":"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","names":["assertEx","AbstractBridge","creatableModule","Semaphore","LRUCache","WebsocketBridgeConfigSchema","assertEx","isAddress","AbstractBridgeModuleResolver","wrapModuleWithType","Account","ConfigSchema","asModuleInstance","ModuleConfigSchema","ResolveHelper","AbstractModuleProxy","WebsocketModuleProxy","AbstractModuleProxy","createCount","constructor","params","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","configSchemas","WebsocketBridgeConfigSchema","defaultConfigSchema","defaultFailureRetryTime","defaultMaxConnections","defaultMaxPayloadSizeWarning","maxFailureCacheSize","_failureTimeCache","LRUCache","max","_querySemaphore","_resolver","client","config","failureRetryTime","maxConnections","maxPayloadSizeWarning","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","creatableModule","WebsocketBridge","WebsocketClientBridge"]}
@@ -0,0 +1,28 @@
1
+ /// <reference types="node" />
2
+ import { Server as HttpServer } from 'node:http';
3
+ import { Address } from '@xylabs/hex';
4
+ import { Promisable } from '@xylabs/promise';
5
+ import { BridgeExposeOptions, BridgeModule } from '@xyo-network/bridge-model';
6
+ import { AnyConfigSchema, ModuleInstance } from '@xyo-network/module-model';
7
+ import { Server } from 'socket.io';
8
+ import { WebsocketClientBridge } from './ClientBridge';
9
+ import { WebsocketBridgeConfig } from './Config';
10
+ import { WebsocketBridgeParams } from './Params';
11
+ export declare const BridgeCommands: {
12
+ join: string;
13
+ query: string;
14
+ };
15
+ export declare class WebsocketBridge<TParams extends WebsocketBridgeParams<AnyConfigSchema<WebsocketBridgeConfig>> = WebsocketBridgeParams<WebsocketBridgeConfig>> extends WebsocketClientBridge<TParams> implements BridgeModule<TParams> {
16
+ httpServer?: HttpServer;
17
+ server?: Server;
18
+ get host(): (import("@xyo-network/bridge-model").BridgeHostConfig & {
19
+ port?: number | undefined;
20
+ }) | undefined;
21
+ exposeHandler(_id: string, _options?: BridgeExposeOptions | undefined): Promisable<ModuleInstance[]>;
22
+ exposedHandler(): Promisable<Address[]>;
23
+ startHandler(): Promise<boolean>;
24
+ stopHandler(): Promise<boolean>;
25
+ private startServer;
26
+ private stopServer;
27
+ }
28
+ //# sourceMappingURL=Bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Bridge.d.ts","sourceRoot":"","sources":["../../src/Bridge.ts"],"names":[],"mappings":";AAAA,OAAO,EAAoC,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAA;AAGlF,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7E,OAAO,EAAE,eAAe,EAAmB,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAE5F,OAAO,EAAE,MAAM,EAAU,MAAM,WAAW,CAAA;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAEhD,eAAO,MAAM,cAAc;;;CAG1B,CAAA;AAID,qBACa,eAAe,CACxB,OAAO,SAAS,qBAAqB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,GAAG,qBAAqB,CAAC,qBAAqB,CAAC,CAE9H,SAAQ,qBAAqB,CAAC,OAAO,CACrC,YAAW,YAAY,CAAC,OAAO,CAAC;IAEhC,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,IAAI,IAAI;;mBAEP;IAEQ,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,mBAAmB,GAAG,SAAS,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC;IAIpG,cAAc,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;IAIjC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAOhC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAO9C,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,UAAU;CAMnB"}
@@ -0,0 +1,28 @@
1
+ /// <reference types="node" />
2
+ import { Server as HttpServer } from 'node:http';
3
+ import { Address } from '@xylabs/hex';
4
+ import { Promisable } from '@xylabs/promise';
5
+ import { BridgeExposeOptions, BridgeModule } from '@xyo-network/bridge-model';
6
+ import { AnyConfigSchema, ModuleInstance } from '@xyo-network/module-model';
7
+ import { Server } from 'socket.io';
8
+ import { WebsocketClientBridge } from './ClientBridge';
9
+ import { WebsocketBridgeConfig } from './Config';
10
+ import { WebsocketBridgeParams } from './Params';
11
+ export declare const BridgeCommands: {
12
+ join: string;
13
+ query: string;
14
+ };
15
+ export declare class WebsocketBridge<TParams extends WebsocketBridgeParams<AnyConfigSchema<WebsocketBridgeConfig>> = WebsocketBridgeParams<WebsocketBridgeConfig>> extends WebsocketClientBridge<TParams> implements BridgeModule<TParams> {
16
+ httpServer?: HttpServer;
17
+ server?: Server;
18
+ get host(): (import("@xyo-network/bridge-model").BridgeHostConfig & {
19
+ port?: number | undefined;
20
+ }) | undefined;
21
+ exposeHandler(_id: string, _options?: BridgeExposeOptions | undefined): Promisable<ModuleInstance[]>;
22
+ exposedHandler(): Promisable<Address[]>;
23
+ startHandler(): Promise<boolean>;
24
+ stopHandler(): Promise<boolean>;
25
+ private startServer;
26
+ private stopServer;
27
+ }
28
+ //# sourceMappingURL=Bridge.d.ts.map