@xyo-network/bridge-websocket 2.99.0 → 2.99.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/Bridge.d.cts +19 -14
- package/dist/browser/Bridge.d.cts.map +1 -1
- package/dist/browser/Bridge.d.mts +19 -14
- package/dist/browser/Bridge.d.mts.map +1 -1
- package/dist/browser/Bridge.d.ts +19 -14
- package/dist/browser/Bridge.d.ts.map +1 -1
- package/dist/browser/ClientBridge.d.cts +42 -0
- package/dist/browser/ClientBridge.d.cts.map +1 -0
- package/dist/browser/ClientBridge.d.mts +42 -0
- package/dist/browser/ClientBridge.d.mts.map +1 -0
- package/dist/browser/ClientBridge.d.ts +42 -0
- package/dist/browser/ClientBridge.d.ts.map +1 -0
- package/dist/browser/Config.d.cts +9 -4
- package/dist/browser/Config.d.cts.map +1 -1
- package/dist/browser/Config.d.mts +9 -4
- package/dist/browser/Config.d.mts.map +1 -1
- package/dist/browser/Config.d.ts +9 -4
- package/dist/browser/Config.d.ts.map +1 -1
- package/dist/browser/ModuleProxy/ModuleProxy.d.cts +7 -4
- package/dist/browser/ModuleProxy/ModuleProxy.d.cts.map +1 -1
- package/dist/browser/ModuleProxy/ModuleProxy.d.mts +7 -4
- package/dist/browser/ModuleProxy/ModuleProxy.d.mts.map +1 -1
- package/dist/browser/ModuleProxy/ModuleProxy.d.ts +7 -4
- package/dist/browser/ModuleProxy/ModuleProxy.d.ts.map +1 -1
- package/dist/browser/Params.d.cts +5 -0
- package/dist/browser/Params.d.cts.map +1 -0
- package/dist/browser/Params.d.mts +5 -0
- package/dist/browser/Params.d.mts.map +1 -0
- package/dist/browser/Params.d.ts +5 -0
- package/dist/browser/Params.d.ts.map +1 -0
- package/dist/browser/{ModuleResolver.d.cts → WebsocketBridgeModuleResolver.d.cts} +6 -6
- package/dist/browser/WebsocketBridgeModuleResolver.d.cts.map +1 -0
- package/dist/browser/{ModuleResolver.d.ts → WebsocketBridgeModuleResolver.d.mts} +6 -6
- package/dist/browser/WebsocketBridgeModuleResolver.d.mts.map +1 -0
- package/dist/browser/{ModuleResolver.d.mts → WebsocketBridgeModuleResolver.d.ts} +6 -6
- package/dist/browser/WebsocketBridgeModuleResolver.d.ts.map +1 -0
- package/dist/browser/{index.cjs → index-browser.cjs} +88 -35
- package/dist/browser/index-browser.cjs.map +1 -0
- package/dist/browser/index-browser.d.cts +5 -0
- package/dist/browser/index-browser.d.cts.map +1 -0
- package/dist/browser/index-browser.d.mts +5 -0
- package/dist/browser/index-browser.d.mts.map +1 -0
- package/dist/browser/index-browser.d.ts +5 -0
- package/dist/browser/index-browser.d.ts.map +1 -0
- package/dist/browser/{index.js → index-browser.js} +85 -32
- package/dist/browser/index-browser.js.map +1 -0
- package/dist/node/Bridge.d.cts +19 -14
- package/dist/node/Bridge.d.cts.map +1 -1
- package/dist/node/Bridge.d.mts +19 -14
- package/dist/node/Bridge.d.mts.map +1 -1
- package/dist/node/Bridge.d.ts +19 -14
- package/dist/node/Bridge.d.ts.map +1 -1
- package/dist/node/ClientBridge.d.cts +42 -0
- package/dist/node/ClientBridge.d.cts.map +1 -0
- package/dist/node/ClientBridge.d.mts +42 -0
- package/dist/node/ClientBridge.d.mts.map +1 -0
- package/dist/node/ClientBridge.d.ts +42 -0
- package/dist/node/ClientBridge.d.ts.map +1 -0
- package/dist/node/Config.d.cts +9 -4
- package/dist/node/Config.d.cts.map +1 -1
- package/dist/node/Config.d.mts +9 -4
- package/dist/node/Config.d.mts.map +1 -1
- package/dist/node/Config.d.ts +9 -4
- package/dist/node/Config.d.ts.map +1 -1
- package/dist/node/ModuleProxy/ModuleProxy.d.cts +7 -4
- package/dist/node/ModuleProxy/ModuleProxy.d.cts.map +1 -1
- package/dist/node/ModuleProxy/ModuleProxy.d.mts +7 -4
- package/dist/node/ModuleProxy/ModuleProxy.d.mts.map +1 -1
- package/dist/node/ModuleProxy/ModuleProxy.d.ts +7 -4
- package/dist/node/ModuleProxy/ModuleProxy.d.ts.map +1 -1
- package/dist/node/Params.d.cts +5 -0
- package/dist/node/Params.d.cts.map +1 -0
- package/dist/node/Params.d.mts +5 -0
- package/dist/node/Params.d.mts.map +1 -0
- package/dist/node/Params.d.ts +5 -0
- package/dist/node/Params.d.ts.map +1 -0
- package/dist/node/{ModuleResolver.d.cts → WebsocketBridgeModuleResolver.d.cts} +6 -6
- package/dist/node/WebsocketBridgeModuleResolver.d.cts.map +1 -0
- package/dist/node/WebsocketBridgeModuleResolver.d.mts +11 -0
- package/dist/node/WebsocketBridgeModuleResolver.d.mts.map +1 -0
- package/dist/node/WebsocketBridgeModuleResolver.d.ts +11 -0
- package/dist/node/WebsocketBridgeModuleResolver.d.ts.map +1 -0
- package/dist/node/index-browser.d.cts +5 -0
- package/dist/node/index-browser.d.cts.map +1 -0
- package/dist/node/index-browser.d.mts +5 -0
- package/dist/node/index-browser.d.mts.map +1 -0
- package/dist/node/index-browser.d.ts +5 -0
- package/dist/node/index-browser.d.ts.map +1 -0
- package/dist/node/index.cjs +167 -34
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +167 -35
- package/dist/node/index.js.map +1 -1
- package/package.json +25 -25
- package/src/Bridge.ts +63 -30
- package/src/ClientBridge.ts +113 -0
- package/src/Config.ts +11 -4
- package/src/ModuleProxy/ModuleProxy.ts +21 -13
- package/src/Params.ts +7 -0
- package/src/{ModuleResolver.ts → WebsocketBridgeModuleResolver.ts} +23 -14
- package/src/index-browser.ts +4 -0
- package/xy.config.ts +14 -0
- package/dist/browser/ModuleResolver.d.cts.map +0 -1
- package/dist/browser/ModuleResolver.d.mts.map +0 -1
- package/dist/browser/ModuleResolver.d.ts.map +0 -1
- package/dist/browser/index.cjs.map +0 -1
- package/dist/browser/index.js.map +0 -1
- package/dist/node/ModuleResolver.d.cts.map +0 -1
- package/dist/node/ModuleResolver.d.mts +0 -11
- package/dist/node/ModuleResolver.d.mts.map +0 -1
- package/dist/node/ModuleResolver.d.ts +0 -11
- package/dist/node/ModuleResolver.d.ts.map +0 -1
- 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
|
-
|
|
5
|
-
|
|
3
|
+
import { WebsocketBridgeQuerySender } from './ModuleProxy';
|
|
4
|
+
export interface WebsocketBridgeModuleResolverParams extends BridgeModuleResolverParams {
|
|
5
|
+
querySender: WebsocketBridgeQuerySender;
|
|
6
6
|
}
|
|
7
|
-
export declare class WebsocketBridgeModuleResolver<T extends
|
|
8
|
-
|
|
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=
|
|
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
|
|
23
|
-
__export(
|
|
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(
|
|
27
|
+
module.exports = __toCommonJS(index_browser_exports);
|
|
28
28
|
|
|
29
|
-
// src/
|
|
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/
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
61
|
-
|
|
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/
|
|
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
|
-
|
|
71
|
-
return
|
|
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
|
|
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
|
-
|
|
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
|
|
107
|
-
proxy.upResolver.add(
|
|
108
|
-
proxy.downResolver.add(
|
|
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
|
|
116
|
+
return instance;
|
|
114
117
|
}
|
|
115
118
|
};
|
|
116
119
|
|
|
117
|
-
// src/
|
|
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
|
|
132
|
+
var WebsocketClientBridge = class _WebsocketClientBridge extends import_abstract_bridge3.AbstractBridge {
|
|
130
133
|
static {
|
|
131
|
-
__name(this, "
|
|
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
|
|
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
|
-
|
|
218
|
+
WebsocketClientBridge = _ts_decorate([
|
|
173
219
|
(0, import_module_model2.creatableModule)()
|
|
174
|
-
],
|
|
175
|
-
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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/
|
|
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/
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
36
|
-
|
|
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/
|
|
41
|
+
// src/WebsocketBridgeModuleResolver.ts
|
|
41
42
|
var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
|
|
42
43
|
static {
|
|
43
44
|
__name(this, "WebsocketBridgeModuleResolver");
|
|
44
45
|
}
|
|
45
|
-
|
|
46
|
-
return
|
|
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
|
|
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
|
-
|
|
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
|
|
82
|
-
proxy.upResolver.add(
|
|
83
|
-
proxy.downResolver.add(
|
|
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
|
|
91
|
+
return instance;
|
|
89
92
|
}
|
|
90
93
|
};
|
|
91
94
|
|
|
92
|
-
// src/
|
|
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
|
|
107
|
+
var WebsocketClientBridge = class _WebsocketClientBridge extends AbstractBridge {
|
|
105
108
|
static {
|
|
106
|
-
__name(this, "
|
|
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
|
|
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
|
-
|
|
193
|
+
WebsocketClientBridge = _ts_decorate([
|
|
148
194
|
creatableModule()
|
|
149
|
-
],
|
|
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"]}
|
package/dist/node/Bridge.d.cts
CHANGED
|
@@ -1,23 +1,28 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { Server as HttpServer } from 'node:http';
|
|
1
3
|
import { Address } from '@xylabs/hex';
|
|
2
4
|
import { Promisable } from '@xylabs/promise';
|
|
3
|
-
import {
|
|
4
|
-
import { BridgeExposeOptions, BridgeModule, BridgeParams, BridgeUnexposeOptions } from '@xyo-network/bridge-model';
|
|
5
|
+
import { BridgeExposeOptions, BridgeModule } from '@xyo-network/bridge-model';
|
|
5
6
|
import { AnyConfigSchema, ModuleInstance } from '@xyo-network/module-model';
|
|
6
|
-
import {
|
|
7
|
+
import { Server } from 'socket.io';
|
|
8
|
+
import { WebsocketClientBridge } from './ClientBridge';
|
|
7
9
|
import { WebsocketBridgeConfig } from './Config';
|
|
8
|
-
import {
|
|
9
|
-
export
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
get
|
|
17
|
-
|
|
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;
|
|
18
21
|
exposeHandler(_id: string, _options?: BridgeExposeOptions | undefined): Promisable<ModuleInstance[]>;
|
|
19
22
|
exposedHandler(): Promisable<Address[]>;
|
|
20
23
|
startHandler(): Promise<boolean>;
|
|
21
|
-
|
|
24
|
+
stopHandler(): Promise<boolean>;
|
|
25
|
+
private startServer;
|
|
26
|
+
private stopServer;
|
|
22
27
|
}
|
|
23
28
|
//# sourceMappingURL=Bridge.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Bridge.d.ts","sourceRoot":"","sources":["../../src/Bridge.ts"],"names":[],"mappings":"
|
|
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"}
|