@xyo-network/bridge-websocket 2.107.1 → 2.107.4

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.
@@ -1,2 +1,225 @@
1
- "use strict";var h=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var z=Object.getOwnPropertyNames;var B=Object.prototype.hasOwnProperty;var s=(r,e)=>h(r,"name",{value:e,configurable:!0});var I=(r,e)=>{for(var t in e)h(r,t,{get:e[t],enumerable:!0})},j=(r,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of z(e))!B.call(r,o)&&o!==t&&h(r,o,{get:()=>e[o],enumerable:!(a=U(e,o))||a.enumerable});return r};var O=r=>j(h({},"__esModule",{value:!0}),r);var D={};I(D,{WebsocketBridge:()=>C,WebsocketBridgeConfigSchema:()=>p});module.exports=O(D);var T=require("@xylabs/assert"),_=require("@xyo-network/bridge-abstract"),A=require("@xyo-network/module-model"),F=require("async-mutex"),$=require("lru-cache");var p="network.xyo.bridge.websocket.config";var m=require("@xylabs/assert"),P=require("@xylabs/hex"),v=require("@xyo-network/account"),w=require("@xyo-network/bridge-abstract"),R=require("@xyo-network/config-payload-plugin"),d=require("@xyo-network/module-model");var M=require("@xyo-network/bridge-abstract");var g=class r extends M.AbstractModuleProxy{static{s(this,"WebsocketModuleProxy")}static createCount=0;constructor(e){r.createCount=r.createCount+1,Math.floor(r.createCount/10)===r.createCount/10&&console.log(`WebsocketModuleProxy.createCount: ${r.createCount}`),super(e)}async proxyQueryHandler(e,t=[]){return await this.params.querySender.sendBridgeQuery(this.params.moduleAddress,e,t)}};var y=class extends w.AbstractBridgeModuleResolver{static{s(this,"WebsocketBridgeModuleResolver")}get querySender(){return this.params.querySender}async resolveHandler(e,t){let a=await super.resolveHandler(e,t);if(a)return a;if(e==="*")return[];let o=e.split(":"),n=(0,m.assertEx)(o.shift(),()=>`Invalid module identifier: ${e}`),i=await d.ResolveHelper.transformModuleIdentifier(n),l=i;(0,m.assertEx)((0,P.isAddress)(i),()=>`Invalid module address: ${i}`);let b=o.join(":"),H={account:v.Account.randomSync(),config:{schema:d.ModuleConfigSchema},host:this,moduleAddress:l,querySender:this.querySender};this.logger?.debug(`creating HttpProxy [${l}] ${e}`);let c=new g(H);if(c){let u=await c.state();if(u){let W=u.find(S=>S.schema===R.ConfigSchema)?.config,E=(0,m.assertEx)(u.find(S=>S.schema===W),()=>"Unable to locate config");c.setConfig(E)}}await c.start();let q=(0,m.assertEx)((0,w.wrapModuleWithType)(c,v.Account.randomSync()),()=>`Failed to wrapModuleWithType [${e}]`),x=(0,m.assertEx)((0,d.asModuleInstance)(q,{}),()=>`Failed to asModuleInstance [${e}]`);if(c.upResolver.add(x),c.downResolver.add(x),b.length>0){let u=await q.resolve(b,t);return u?[u]:[]}return[x]}};function Q(r,e,t,a){var o=arguments.length,n=o<3?e:a===null?a=Object.getOwnPropertyDescriptor(e,t):a,i;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")n=Reflect.decorate(r,e,t,a);else for(var l=r.length-1;l>=0;l--)(i=r[l])&&(n=(o<3?i(n):o>3?i(e,t,n):i(e,t))||n);return o>3&&n&&Object.defineProperty(e,t,n),n}s(Q,"_ts_decorate");var f=class r extends _.AbstractBridge{static{s(this,"WebsocketClientBridge")}static configSchemas=[...super.configSchemas,p];static defaultConfigSchema=p;static defaultFailureRetryTime=1e3*60;static defaultMaxConnections=4;static defaultMaxPayloadSizeWarning=256*256;static maxFailureCacheSize=1e3;_failureTimeCache=new $.LRUCache({max:r.maxFailureCacheSize});_querySemaphore;_resolver;get client(){return this.config.client}get failureRetryTime(){return this.client?.failureRetryTime??r.defaultFailureRetryTime}get maxConnections(){return this.client?.maxConnections??r.defaultMaxConnections}get maxPayloadSizeWarning(){return this.client?.maxPayloadSizeWarning??r.defaultMaxPayloadSizeWarning}get querySemaphore(){return this._querySemaphore=this._querySemaphore??new F.Semaphore(this.maxConnections),this._querySemaphore}get resolver(){return this._resolver=this._resolver??new y({archiving:{...this.archiving,resolveArchivists:this.resolveArchivingArchivists.bind(this)},bridge:this,querySender:this,root:this,wrapperAccount:this.account}),this._resolver}get url(){return(0,T.assertEx)(this.config.client?.url,()=>"No Url Set")}exposeHandler(e,t){throw new Error("Unsupported")}exposedHandler(){throw new Error("Unsupported")}async getRoots(){return await Promise.resolve([])}async sendBridgeQuery(e,t,a){let o=this._failureTimeCache.get(e);if(o!==void 0){let i=Date.now()-o;if(i>this.failureRetryTime)throw new Error(`target module failed recently [${e}] [${i}ms ago]`);this._failureTimeCache.delete(e)}try{throw await this.querySemaphore.acquire(),new Error("Unsupported")}catch(n){throw n}finally{this.querySemaphore.release()}}unexposeHandler(e,t){throw new Error("Unsupported")}};f=Q([(0,A.creatableModule)()],f);var C=class extends f{static{s(this,"WebsocketBridge")}};
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/index-browser.ts
22
+ var index_browser_exports = {};
23
+ __export(index_browser_exports, {
24
+ WebsocketBridge: () => WebsocketBridge,
25
+ WebsocketBridgeConfigSchema: () => WebsocketBridgeConfigSchema
26
+ });
27
+ module.exports = __toCommonJS(index_browser_exports);
28
+
29
+ // src/ClientBridge.ts
30
+ var import_assert2 = require("@xylabs/assert");
31
+ var import_bridge_abstract3 = require("@xyo-network/bridge-abstract");
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");
35
+
36
+ // src/Config.ts
37
+ var WebsocketBridgeConfigSchema = "network.xyo.bridge.websocket.config";
38
+
39
+ // src/WebsocketBridgeModuleResolver.ts
40
+ var import_assert = require("@xylabs/assert");
41
+ var import_hex = require("@xylabs/hex");
42
+ var import_account = require("@xyo-network/account");
43
+ var import_bridge_abstract2 = require("@xyo-network/bridge-abstract");
44
+ var import_config_payload_plugin = require("@xyo-network/config-payload-plugin");
45
+ var import_module_model = require("@xyo-network/module-model");
46
+
47
+ // src/ModuleProxy/ModuleProxy.ts
48
+ var import_bridge_abstract = require("@xyo-network/bridge-abstract");
49
+ var WebsocketModuleProxy = class _WebsocketModuleProxy extends import_bridge_abstract.AbstractModuleProxy {
50
+ static {
51
+ __name(this, "WebsocketModuleProxy");
52
+ }
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}`);
58
+ }
59
+ super(params);
60
+ }
61
+ async proxyQueryHandler(query, payloads = []) {
62
+ return await this.params.querySender.sendBridgeQuery(this.params.moduleAddress, query, payloads);
63
+ }
64
+ };
65
+
66
+ // src/WebsocketBridgeModuleResolver.ts
67
+ var WebsocketBridgeModuleResolver = class extends import_bridge_abstract2.AbstractBridgeModuleResolver {
68
+ static {
69
+ __name(this, "WebsocketBridgeModuleResolver");
70
+ }
71
+ get querySender() {
72
+ return this.params.querySender;
73
+ }
74
+ async resolveHandler(id, options) {
75
+ const parentResult = await super.resolveHandler(id, options);
76
+ if (parentResult) {
77
+ return parentResult;
78
+ }
79
+ if (id === "*") {
80
+ return [];
81
+ }
82
+ const idParts = id.split(":");
83
+ const untransformedFirstPart = (0, import_assert.assertEx)(idParts.shift(), () => `Invalid module identifier: ${id}`);
84
+ const firstPart = await import_module_model.ResolveHelper.transformModuleIdentifier(untransformedFirstPart);
85
+ const moduleAddress = firstPart;
86
+ (0, import_assert.assertEx)((0, import_hex.isAddress)(firstPart), () => `Invalid module address: ${firstPart}`);
87
+ const remainderParts = idParts.join(":");
88
+ const params = {
89
+ account: import_account.Account.randomSync(),
90
+ config: {
91
+ schema: import_module_model.ModuleConfigSchema
92
+ },
93
+ host: this,
94
+ moduleAddress,
95
+ querySender: this.querySender
96
+ };
97
+ this.logger?.debug(`creating HttpProxy [${moduleAddress}] ${id}`);
98
+ const proxy = new WebsocketModuleProxy(params);
99
+ if (proxy) {
100
+ const state = await proxy.state();
101
+ if (state) {
102
+ const configSchema = state.find((payload) => payload.schema === import_config_payload_plugin.ConfigSchema)?.config;
103
+ const config = (0, import_assert.assertEx)(state.find((payload) => payload.schema === configSchema), () => "Unable to locate config");
104
+ proxy.setConfig(config);
105
+ }
106
+ }
107
+ await proxy.start();
108
+ const wrapped = (0, import_assert.assertEx)((0, import_bridge_abstract2.wrapModuleWithType)(proxy, import_account.Account.randomSync()), () => `Failed to wrapModuleWithType [${id}]`);
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);
112
+ if (remainderParts.length > 0) {
113
+ const result = await wrapped.resolve(remainderParts, options);
114
+ return result ? [
115
+ result
116
+ ] : [];
117
+ }
118
+ return [
119
+ instance
120
+ ];
121
+ }
122
+ };
123
+
124
+ // src/ClientBridge.ts
125
+ function _ts_decorate(decorators, target, key, desc) {
126
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
127
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
128
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
129
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
130
+ }
131
+ __name(_ts_decorate, "_ts_decorate");
132
+ var WebsocketClientBridge = class _WebsocketClientBridge extends import_bridge_abstract3.AbstractBridge {
133
+ static {
134
+ __name(this, "WebsocketClientBridge");
135
+ }
136
+ static configSchemas = [
137
+ ...super.configSchemas,
138
+ WebsocketBridgeConfigSchema
139
+ ];
140
+ static defaultConfigSchema = WebsocketBridgeConfigSchema;
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;
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
+ }
166
+ get resolver() {
167
+ this._resolver = this._resolver ?? new WebsocketBridgeModuleResolver({
168
+ archiving: {
169
+ ...this.archiving,
170
+ resolveArchivists: this.resolveArchivingArchivists.bind(this)
171
+ },
172
+ bridge: this,
173
+ querySender: this,
174
+ root: this,
175
+ wrapperAccount: this.account
176
+ });
177
+ return this._resolver;
178
+ }
179
+ get url() {
180
+ return (0, import_assert2.assertEx)(this.config.client?.url, () => "No Url Set");
181
+ }
182
+ exposeHandler(_id, _options) {
183
+ throw new Error("Unsupported");
184
+ }
185
+ exposedHandler() {
186
+ throw new Error("Unsupported");
187
+ }
188
+ async getRoots() {
189
+ return await Promise.resolve([]);
190
+ }
191
+ async sendBridgeQuery(targetAddress, _query, _payloads) {
192
+ const lastFailureTime = this._failureTimeCache.get(targetAddress);
193
+ if (lastFailureTime !== void 0) {
194
+ const now = Date.now();
195
+ const timeSincePreviousFailure = now - lastFailureTime;
196
+ if (timeSincePreviousFailure > this.failureRetryTime) {
197
+ throw new Error(`target module failed recently [${targetAddress}] [${timeSincePreviousFailure}ms ago]`);
198
+ }
199
+ this._failureTimeCache.delete(targetAddress);
200
+ }
201
+ try {
202
+ await this.querySemaphore.acquire();
203
+ throw new Error("Unsupported");
204
+ } catch (ex) {
205
+ const error = ex;
206
+ throw error;
207
+ } finally {
208
+ this.querySemaphore.release();
209
+ }
210
+ }
211
+ unexposeHandler(_id, _options) {
212
+ throw new Error("Unsupported");
213
+ }
214
+ };
215
+ WebsocketClientBridge = _ts_decorate([
216
+ (0, import_module_model2.creatableModule)()
217
+ ], WebsocketClientBridge);
218
+
219
+ // src/index-browser.ts
220
+ var WebsocketBridge = class extends WebsocketClientBridge {
221
+ static {
222
+ __name(this, "WebsocketBridge");
223
+ }
224
+ };
2
225
  //# sourceMappingURL=index-browser.cjs.map
@@ -1 +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 { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractBridge } from '@xyo-network/bridge-abstract'\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 ??\n new WebsocketBridgeModuleResolver({\n archiving: { ...this.archiving, resolveArchivists: this.resolveArchivingArchivists.bind(this) },\n bridge: this,\n querySender: this,\n root: this,\n wrapperAccount: this.account,\n })\n return this._resolver\n }\n\n get url() {\n return assertEx(this.config.client?.url, () => 'No Url Set')\n }\n\n override exposeHandler(_id: string, _options?: BridgeExposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n override exposedHandler(): Promisable<Address[]> {\n throw new Error('Unsupported')\n }\n\n async getRoots(): Promise<ModuleInstance[]> {\n return await Promise.resolve([])\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 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' as const\nexport type WebsocketBridgeConfigSchema = typeof WebsocketBridgeConfigSchema\n\nexport type WebsocketBridgeConfig<TConfig extends EmptyObject = EmptyObject, TSchema extends string | void = void> = BridgeConfig<\n {\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 { Account } from '@xyo-network/account'\nimport { AbstractBridgeModuleResolver, BridgeModuleResolverParams, wrapModuleWithType } from '@xyo-network/bridge-abstract'\nimport { ConfigPayload, ConfigSchema } from '@xyo-network/config-payload-plugin'\nimport {\n asModuleInstance,\n ModuleConfig,\n ModuleConfigSchema,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ResolveHelper,\n} from '@xyo-network/module-model'\n\nimport { 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>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T[]> {\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 ? [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 { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleProxy, ModuleProxyParams } from '@xyo-network/bridge-abstract'\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":["index_browser_exports","__export","WebsocketBridge","WebsocketBridgeConfigSchema","__toCommonJS","import_assert","import_bridge_abstract","import_module_model","import_async_mutex","import_lru_cache","WebsocketBridgeConfigSchema","import_assert","import_hex","import_account","import_bridge_abstract","import_config_payload_plugin","import_module_model","import_bridge_abstract","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","archiving","resolveArchivists","resolveArchivingArchivists","bind","bridge","querySender","root","wrapperAccount","account","url","assertEx","exposeHandler","_id","_options","Error","exposedHandler","getRoots","Promise","resolve","sendBridgeQuery","targetAddress","_query","_payloads","lastFailureTime","get","undefined","timeSincePreviousFailure","Date","now","delete","acquire","ex","release","unexposeHandler","WebsocketBridge","WebsocketClientBridge"]}
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 { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractBridge } from '@xyo-network/bridge-abstract'\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 ??\n new WebsocketBridgeModuleResolver({\n archiving: { ...this.archiving, resolveArchivists: this.resolveArchivingArchivists.bind(this) },\n bridge: this,\n querySender: this,\n root: this,\n wrapperAccount: this.account,\n })\n return this._resolver\n }\n\n get url() {\n return assertEx(this.config.client?.url, () => 'No Url Set')\n }\n\n override exposeHandler(_id: string, _options?: BridgeExposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n override exposedHandler(): Promisable<Address[]> {\n throw new Error('Unsupported')\n }\n\n async getRoots(): Promise<ModuleInstance[]> {\n return await Promise.resolve([])\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 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' as const\nexport type WebsocketBridgeConfigSchema = typeof WebsocketBridgeConfigSchema\n\nexport type WebsocketBridgeConfig<TConfig extends EmptyObject = EmptyObject, TSchema extends string | void = void> = BridgeConfig<\n {\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 { Account } from '@xyo-network/account'\nimport { AbstractBridgeModuleResolver, BridgeModuleResolverParams, wrapModuleWithType } from '@xyo-network/bridge-abstract'\nimport { ConfigPayload, ConfigSchema } from '@xyo-network/config-payload-plugin'\nimport {\n asModuleInstance,\n ModuleConfig,\n ModuleConfigSchema,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ResolveHelper,\n} from '@xyo-network/module-model'\n\nimport { 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>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T[]> {\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 ? [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 { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleProxy, ModuleProxyParams } from '@xyo-network/bridge-abstract'\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_bridge_abstract","import_module_model","WebsocketBridgeConfigSchema","import_bridge_abstract","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","archiving","resolveArchivists","resolveArchivingArchivists","bind","bridge","querySender","root","wrapperAccount","account","url","assertEx","exposeHandler","_id","_options","Error","exposedHandler","getRoots","Promise","resolve","sendBridgeQuery","targetAddress","_query","_payloads","lastFailureTime","get","undefined","now","Date","timeSincePreviousFailure","delete","acquire","ex","error","release","unexposeHandler","WebsocketBridge","WebsocketClientBridge"]}
@@ -1,2 +1,204 @@
1
- var M=Object.defineProperty;var a=(r,e)=>M(r,"name",{value:e,configurable:!0});import{assertEx as E}from"@xylabs/assert";import{AbstractBridge as U}from"@xyo-network/bridge-abstract";import{creatableModule as z}from"@xyo-network/module-model";import{Semaphore as B}from"async-mutex";import{LRUCache as I}from"lru-cache";var y="network.xyo.bridge.websocket.config";import{assertEx as d}from"@xylabs/assert";import{isAddress as R}from"@xylabs/hex";import{Account as S}from"@xyo-network/account";import{AbstractBridgeModuleResolver as T,wrapModuleWithType as _}from"@xyo-network/bridge-abstract";import{ConfigSchema as A}from"@xyo-network/config-payload-plugin";import{asModuleInstance as F,ModuleConfigSchema as $,ResolveHelper as H}from"@xyo-network/module-model";import{AbstractModuleProxy as P}from"@xyo-network/bridge-abstract";var f=class r extends P{static{a(this,"WebsocketModuleProxy")}static createCount=0;constructor(e){r.createCount=r.createCount+1,Math.floor(r.createCount/10)===r.createCount/10&&console.log(`WebsocketModuleProxy.createCount: ${r.createCount}`),super(e)}async proxyQueryHandler(e,t=[]){return await this.params.querySender.sendBridgeQuery(this.params.moduleAddress,e,t)}};var h=class extends T{static{a(this,"WebsocketBridgeModuleResolver")}get querySender(){return this.params.querySender}async resolveHandler(e,t){let s=await super.resolveHandler(e,t);if(s)return s;if(e==="*")return[];let i=e.split(":"),o=d(i.shift(),()=>`Invalid module identifier: ${e}`),n=await H.transformModuleIdentifier(o),l=n;d(R(n),()=>`Invalid module address: ${n}`);let w=i.join(":"),C={account:S.randomSync(),config:{schema:$},host:this,moduleAddress:l,querySender:this.querySender};this.logger?.debug(`creating HttpProxy [${l}] ${e}`);let c=new f(C);if(c){let u=await c.state();if(u){let b=u.find(g=>g.schema===A)?.config,q=d(u.find(g=>g.schema===b),()=>"Unable to locate config");c.setConfig(q)}}await c.start();let x=d(_(c,S.randomSync()),()=>`Failed to wrapModuleWithType [${e}]`),p=d(F(x,{}),()=>`Failed to asModuleInstance [${e}]`);if(c.upResolver.add(p),c.downResolver.add(p),w.length>0){let u=await x.resolve(w,t);return u?[u]:[]}return[p]}};function W(r,e,t,s){var i=arguments.length,o=i<3?e:s===null?s=Object.getOwnPropertyDescriptor(e,t):s,n;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(r,e,t,s);else for(var l=r.length-1;l>=0;l--)(n=r[l])&&(o=(i<3?n(o):i>3?n(e,t,o):n(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}a(W,"_ts_decorate");var m=class r extends U{static{a(this,"WebsocketClientBridge")}static configSchemas=[...super.configSchemas,y];static defaultConfigSchema=y;static defaultFailureRetryTime=1e3*60;static defaultMaxConnections=4;static defaultMaxPayloadSizeWarning=256*256;static maxFailureCacheSize=1e3;_failureTimeCache=new I({max:r.maxFailureCacheSize});_querySemaphore;_resolver;get client(){return this.config.client}get failureRetryTime(){return this.client?.failureRetryTime??r.defaultFailureRetryTime}get maxConnections(){return this.client?.maxConnections??r.defaultMaxConnections}get maxPayloadSizeWarning(){return this.client?.maxPayloadSizeWarning??r.defaultMaxPayloadSizeWarning}get querySemaphore(){return this._querySemaphore=this._querySemaphore??new B(this.maxConnections),this._querySemaphore}get resolver(){return this._resolver=this._resolver??new h({archiving:{...this.archiving,resolveArchivists:this.resolveArchivingArchivists.bind(this)},bridge:this,querySender:this,root:this,wrapperAccount:this.account}),this._resolver}get url(){return E(this.config.client?.url,()=>"No Url Set")}exposeHandler(e,t){throw new Error("Unsupported")}exposedHandler(){throw new Error("Unsupported")}async getRoots(){return await Promise.resolve([])}async sendBridgeQuery(e,t,s){let i=this._failureTimeCache.get(e);if(i!==void 0){let n=Date.now()-i;if(n>this.failureRetryTime)throw new Error(`target module failed recently [${e}] [${n}ms ago]`);this._failureTimeCache.delete(e)}try{throw await this.querySemaphore.acquire(),new Error("Unsupported")}catch(o){throw o}finally{this.querySemaphore.release()}}unexposeHandler(e,t){throw new Error("Unsupported")}};m=W([z()],m);var v=class extends m{static{a(this,"WebsocketBridge")}};export{v as WebsocketBridge,y as WebsocketBridgeConfigSchema};
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/ClientBridge.ts
5
+ import { assertEx as assertEx2 } from "@xylabs/assert";
6
+ import { AbstractBridge } from "@xyo-network/bridge-abstract";
7
+ import { creatableModule } from "@xyo-network/module-model";
8
+ import { Semaphore } from "async-mutex";
9
+ import { LRUCache } from "lru-cache";
10
+
11
+ // src/Config.ts
12
+ var WebsocketBridgeConfigSchema = "network.xyo.bridge.websocket.config";
13
+
14
+ // src/WebsocketBridgeModuleResolver.ts
15
+ import { assertEx } from "@xylabs/assert";
16
+ import { isAddress } from "@xylabs/hex";
17
+ import { Account } from "@xyo-network/account";
18
+ import { AbstractBridgeModuleResolver, wrapModuleWithType } from "@xyo-network/bridge-abstract";
19
+ import { ConfigSchema } from "@xyo-network/config-payload-plugin";
20
+ import { asModuleInstance, ModuleConfigSchema, ResolveHelper } from "@xyo-network/module-model";
21
+
22
+ // src/ModuleProxy/ModuleProxy.ts
23
+ import { AbstractModuleProxy } from "@xyo-network/bridge-abstract";
24
+ var WebsocketModuleProxy = class _WebsocketModuleProxy extends AbstractModuleProxy {
25
+ static {
26
+ __name(this, "WebsocketModuleProxy");
27
+ }
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}`);
33
+ }
34
+ super(params);
35
+ }
36
+ async proxyQueryHandler(query, payloads = []) {
37
+ return await this.params.querySender.sendBridgeQuery(this.params.moduleAddress, query, payloads);
38
+ }
39
+ };
40
+
41
+ // src/WebsocketBridgeModuleResolver.ts
42
+ var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
43
+ static {
44
+ __name(this, "WebsocketBridgeModuleResolver");
45
+ }
46
+ get querySender() {
47
+ return this.params.querySender;
48
+ }
49
+ async resolveHandler(id, options) {
50
+ const parentResult = await super.resolveHandler(id, options);
51
+ if (parentResult) {
52
+ return parentResult;
53
+ }
54
+ if (id === "*") {
55
+ return [];
56
+ }
57
+ const idParts = id.split(":");
58
+ const untransformedFirstPart = assertEx(idParts.shift(), () => `Invalid module identifier: ${id}`);
59
+ const firstPart = await ResolveHelper.transformModuleIdentifier(untransformedFirstPart);
60
+ const moduleAddress = firstPart;
61
+ assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`);
62
+ const remainderParts = idParts.join(":");
63
+ const params = {
64
+ account: Account.randomSync(),
65
+ config: {
66
+ schema: ModuleConfigSchema
67
+ },
68
+ host: this,
69
+ moduleAddress,
70
+ querySender: this.querySender
71
+ };
72
+ this.logger?.debug(`creating HttpProxy [${moduleAddress}] ${id}`);
73
+ const proxy = new WebsocketModuleProxy(params);
74
+ if (proxy) {
75
+ const state = await proxy.state();
76
+ if (state) {
77
+ const configSchema = state.find((payload) => payload.schema === ConfigSchema)?.config;
78
+ const config = assertEx(state.find((payload) => payload.schema === configSchema), () => "Unable to locate config");
79
+ proxy.setConfig(config);
80
+ }
81
+ }
82
+ await proxy.start();
83
+ const wrapped = assertEx(wrapModuleWithType(proxy, Account.randomSync()), () => `Failed to wrapModuleWithType [${id}]`);
84
+ const instance = assertEx(asModuleInstance(wrapped, {}), () => `Failed to asModuleInstance [${id}]`);
85
+ proxy.upResolver.add(instance);
86
+ proxy.downResolver.add(instance);
87
+ if (remainderParts.length > 0) {
88
+ const result = await wrapped.resolve(remainderParts, options);
89
+ return result ? [
90
+ result
91
+ ] : [];
92
+ }
93
+ return [
94
+ instance
95
+ ];
96
+ }
97
+ };
98
+
99
+ // src/ClientBridge.ts
100
+ function _ts_decorate(decorators, target, key, desc) {
101
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
102
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
103
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
104
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
105
+ }
106
+ __name(_ts_decorate, "_ts_decorate");
107
+ var WebsocketClientBridge = class _WebsocketClientBridge extends AbstractBridge {
108
+ static {
109
+ __name(this, "WebsocketClientBridge");
110
+ }
111
+ static configSchemas = [
112
+ ...super.configSchemas,
113
+ WebsocketBridgeConfigSchema
114
+ ];
115
+ static defaultConfigSchema = WebsocketBridgeConfigSchema;
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;
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
+ }
141
+ get resolver() {
142
+ this._resolver = this._resolver ?? new WebsocketBridgeModuleResolver({
143
+ archiving: {
144
+ ...this.archiving,
145
+ resolveArchivists: this.resolveArchivingArchivists.bind(this)
146
+ },
147
+ bridge: this,
148
+ querySender: this,
149
+ root: this,
150
+ wrapperAccount: this.account
151
+ });
152
+ return this._resolver;
153
+ }
154
+ get url() {
155
+ return assertEx2(this.config.client?.url, () => "No Url Set");
156
+ }
157
+ exposeHandler(_id, _options) {
158
+ throw new Error("Unsupported");
159
+ }
160
+ exposedHandler() {
161
+ throw new Error("Unsupported");
162
+ }
163
+ async getRoots() {
164
+ return await Promise.resolve([]);
165
+ }
166
+ async sendBridgeQuery(targetAddress, _query, _payloads) {
167
+ const lastFailureTime = this._failureTimeCache.get(targetAddress);
168
+ if (lastFailureTime !== void 0) {
169
+ const now = Date.now();
170
+ const timeSincePreviousFailure = now - lastFailureTime;
171
+ if (timeSincePreviousFailure > this.failureRetryTime) {
172
+ throw new Error(`target module failed recently [${targetAddress}] [${timeSincePreviousFailure}ms ago]`);
173
+ }
174
+ this._failureTimeCache.delete(targetAddress);
175
+ }
176
+ try {
177
+ await this.querySemaphore.acquire();
178
+ throw new Error("Unsupported");
179
+ } catch (ex) {
180
+ const error = ex;
181
+ throw error;
182
+ } finally {
183
+ this.querySemaphore.release();
184
+ }
185
+ }
186
+ unexposeHandler(_id, _options) {
187
+ throw new Error("Unsupported");
188
+ }
189
+ };
190
+ WebsocketClientBridge = _ts_decorate([
191
+ creatableModule()
192
+ ], WebsocketClientBridge);
193
+
194
+ // src/index-browser.ts
195
+ var WebsocketBridge = class extends WebsocketClientBridge {
196
+ static {
197
+ __name(this, "WebsocketBridge");
198
+ }
199
+ };
200
+ export {
201
+ WebsocketBridge,
202
+ WebsocketBridgeConfigSchema
203
+ };
2
204
  //# sourceMappingURL=index-browser.js.map
@@ -1 +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 { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractBridge } from '@xyo-network/bridge-abstract'\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 ??\n new WebsocketBridgeModuleResolver({\n archiving: { ...this.archiving, resolveArchivists: this.resolveArchivingArchivists.bind(this) },\n bridge: this,\n querySender: this,\n root: this,\n wrapperAccount: this.account,\n })\n return this._resolver\n }\n\n get url() {\n return assertEx(this.config.client?.url, () => 'No Url Set')\n }\n\n override exposeHandler(_id: string, _options?: BridgeExposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n override exposedHandler(): Promisable<Address[]> {\n throw new Error('Unsupported')\n }\n\n async getRoots(): Promise<ModuleInstance[]> {\n return await Promise.resolve([])\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 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' as const\nexport type WebsocketBridgeConfigSchema = typeof WebsocketBridgeConfigSchema\n\nexport type WebsocketBridgeConfig<TConfig extends EmptyObject = EmptyObject, TSchema extends string | void = void> = BridgeConfig<\n {\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 { Account } from '@xyo-network/account'\nimport { AbstractBridgeModuleResolver, BridgeModuleResolverParams, wrapModuleWithType } from '@xyo-network/bridge-abstract'\nimport { ConfigPayload, ConfigSchema } from '@xyo-network/config-payload-plugin'\nimport {\n asModuleInstance,\n ModuleConfig,\n ModuleConfigSchema,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ResolveHelper,\n} from '@xyo-network/module-model'\n\nimport { 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>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T[]> {\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 ? [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 { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleProxy, ModuleProxyParams } from '@xyo-network/bridge-abstract'\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","Account","AbstractBridgeModuleResolver","wrapModuleWithType","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","archiving","resolveArchivists","resolveArchivingArchivists","bind","bridge","querySender","root","wrapperAccount","account","url","assertEx","exposeHandler","_id","_options","Error","exposedHandler","getRoots","Promise","resolve","sendBridgeQuery","targetAddress","_query","_payloads","lastFailureTime","get","undefined","timeSincePreviousFailure","Date","now","delete","acquire","ex","release","unexposeHandler","WebsocketBridge","WebsocketClientBridge"]}
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 { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractBridge } from '@xyo-network/bridge-abstract'\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 ??\n new WebsocketBridgeModuleResolver({\n archiving: { ...this.archiving, resolveArchivists: this.resolveArchivingArchivists.bind(this) },\n bridge: this,\n querySender: this,\n root: this,\n wrapperAccount: this.account,\n })\n return this._resolver\n }\n\n get url() {\n return assertEx(this.config.client?.url, () => 'No Url Set')\n }\n\n override exposeHandler(_id: string, _options?: BridgeExposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n override exposedHandler(): Promisable<Address[]> {\n throw new Error('Unsupported')\n }\n\n async getRoots(): Promise<ModuleInstance[]> {\n return await Promise.resolve([])\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 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' as const\nexport type WebsocketBridgeConfigSchema = typeof WebsocketBridgeConfigSchema\n\nexport type WebsocketBridgeConfig<TConfig extends EmptyObject = EmptyObject, TSchema extends string | void = void> = BridgeConfig<\n {\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 { Account } from '@xyo-network/account'\nimport { AbstractBridgeModuleResolver, BridgeModuleResolverParams, wrapModuleWithType } from '@xyo-network/bridge-abstract'\nimport { ConfigPayload, ConfigSchema } from '@xyo-network/config-payload-plugin'\nimport {\n asModuleInstance,\n ModuleConfig,\n ModuleConfigSchema,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ResolveHelper,\n} from '@xyo-network/module-model'\n\nimport { 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>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T[]> {\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 ? [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 { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleProxy, ModuleProxyParams } from '@xyo-network/bridge-abstract'\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","Account","AbstractBridgeModuleResolver","wrapModuleWithType","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","archiving","resolveArchivists","resolveArchivingArchivists","bind","bridge","querySender","root","wrapperAccount","account","url","assertEx","exposeHandler","_id","_options","Error","exposedHandler","getRoots","Promise","resolve","sendBridgeQuery","targetAddress","_query","_payloads","lastFailureTime","get","undefined","now","Date","timeSincePreviousFailure","delete","acquire","ex","error","release","unexposeHandler","WebsocketBridge","WebsocketClientBridge"]}