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