@xyo-network/bridge-websocket 3.6.9 → 3.6.11
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/index-browser.mjs +42 -53
- package/dist/browser/index-browser.mjs.map +1 -1
- package/dist/neutral/index.mjs +46 -62
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/node/index.mjs +46 -62
- package/dist/node/index.mjs.map +1 -1
- package/package.json +21 -21
- package/src/ClientBridge.ts +7 -7
|
@@ -1,10 +1,25 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
|
-
var
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
4
|
+
var __reflectGet = Reflect.get;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
7
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
8
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
9
|
+
if (decorator = decorators[i])
|
|
10
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
11
|
+
if (kind && result) __defProp(target, key, result);
|
|
12
|
+
return result;
|
|
13
|
+
};
|
|
14
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
15
|
+
var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
|
|
3
16
|
|
|
4
17
|
// src/ClientBridge.ts
|
|
5
18
|
import { assertEx as assertEx2 } from "@xylabs/assert";
|
|
6
19
|
import { AbstractBridge } from "@xyo-network/bridge-abstract";
|
|
7
|
-
import {
|
|
20
|
+
import {
|
|
21
|
+
creatableModule
|
|
22
|
+
} from "@xyo-network/module-model";
|
|
8
23
|
import { Semaphore } from "async-mutex";
|
|
9
24
|
import { LRUCache } from "lru-cache";
|
|
10
25
|
|
|
@@ -17,14 +32,15 @@ import { isAddress } from "@xylabs/hex";
|
|
|
17
32
|
import { Account } from "@xyo-network/account";
|
|
18
33
|
import { AbstractBridgeModuleResolver, wrapModuleWithType } from "@xyo-network/bridge-abstract";
|
|
19
34
|
import { ConfigSchema } from "@xyo-network/config-payload-plugin";
|
|
20
|
-
import {
|
|
35
|
+
import {
|
|
36
|
+
asModuleInstance,
|
|
37
|
+
ModuleConfigSchema,
|
|
38
|
+
ResolveHelper
|
|
39
|
+
} from "@xyo-network/module-model";
|
|
21
40
|
|
|
22
41
|
// src/ModuleProxy/ModuleProxy.ts
|
|
23
42
|
import { AbstractModuleProxy } from "@xyo-network/bridge-abstract";
|
|
24
43
|
var WebsocketModuleProxy = class _WebsocketModuleProxy extends AbstractModuleProxy {
|
|
25
|
-
static {
|
|
26
|
-
__name(this, "WebsocketModuleProxy");
|
|
27
|
-
}
|
|
28
44
|
static createCount = 0;
|
|
29
45
|
constructor(params) {
|
|
30
46
|
_WebsocketModuleProxy.createCount = _WebsocketModuleProxy.createCount + 1;
|
|
@@ -40,9 +56,6 @@ var WebsocketModuleProxy = class _WebsocketModuleProxy extends AbstractModulePro
|
|
|
40
56
|
|
|
41
57
|
// src/WebsocketBridgeModuleResolver.ts
|
|
42
58
|
var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
|
|
43
|
-
static {
|
|
44
|
-
__name(this, "WebsocketBridgeModuleResolver");
|
|
45
|
-
}
|
|
46
59
|
get querySender() {
|
|
47
60
|
return this.params.querySender;
|
|
48
61
|
}
|
|
@@ -62,9 +75,7 @@ var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
|
|
|
62
75
|
const remainderParts = idParts.join(":");
|
|
63
76
|
const params = {
|
|
64
77
|
account: await Account.random(),
|
|
65
|
-
config: {
|
|
66
|
-
schema: ModuleConfigSchema
|
|
67
|
-
},
|
|
78
|
+
config: { schema: ModuleConfigSchema },
|
|
68
79
|
host: this,
|
|
69
80
|
moduleAddress,
|
|
70
81
|
querySender: this.querySender
|
|
@@ -75,7 +86,10 @@ var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
|
|
|
75
86
|
const state = await proxy.state();
|
|
76
87
|
if (state) {
|
|
77
88
|
const configSchema = state.find((payload) => payload.schema === ConfigSchema)?.config;
|
|
78
|
-
const config = assertEx(
|
|
89
|
+
const config = assertEx(
|
|
90
|
+
state.find((payload) => payload.schema === configSchema),
|
|
91
|
+
() => "Unable to locate config"
|
|
92
|
+
);
|
|
79
93
|
proxy.setConfig(config);
|
|
80
94
|
}
|
|
81
95
|
}
|
|
@@ -86,53 +100,28 @@ var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
|
|
|
86
100
|
proxy.downResolver.add(instance);
|
|
87
101
|
if (remainderParts.length > 0) {
|
|
88
102
|
const result = await wrapped.resolve(remainderParts, options);
|
|
89
|
-
return result ? [
|
|
90
|
-
result
|
|
91
|
-
] : [];
|
|
103
|
+
return result ? [result] : [];
|
|
92
104
|
}
|
|
93
|
-
return [
|
|
94
|
-
instance
|
|
95
|
-
];
|
|
105
|
+
return [instance];
|
|
96
106
|
}
|
|
97
107
|
};
|
|
98
108
|
|
|
99
109
|
// src/ClientBridge.ts
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
});
|
|
110
|
+
var WebsocketClientBridge = class extends AbstractBridge {
|
|
111
|
+
_failureTimeCache = new LRUCache({ max: WebsocketClientBridge.maxFailureCacheSize });
|
|
123
112
|
_querySemaphore;
|
|
124
113
|
_resolver;
|
|
125
114
|
get client() {
|
|
126
115
|
return this.config.client;
|
|
127
116
|
}
|
|
128
117
|
get failureRetryTime() {
|
|
129
|
-
return this.client?.failureRetryTime ??
|
|
118
|
+
return this.client?.failureRetryTime ?? WebsocketClientBridge.defaultFailureRetryTime;
|
|
130
119
|
}
|
|
131
120
|
get maxConnections() {
|
|
132
|
-
return this.client?.maxConnections ??
|
|
121
|
+
return this.client?.maxConnections ?? WebsocketClientBridge.defaultMaxConnections;
|
|
133
122
|
}
|
|
134
123
|
get maxPayloadSizeWarning() {
|
|
135
|
-
return this.client?.maxPayloadSizeWarning ??
|
|
124
|
+
return this.client?.maxPayloadSizeWarning ?? WebsocketClientBridge.defaultMaxPayloadSizeWarning;
|
|
136
125
|
}
|
|
137
126
|
get querySemaphore() {
|
|
138
127
|
this._querySemaphore = this._querySemaphore ?? new Semaphore(this.maxConnections);
|
|
@@ -140,10 +129,7 @@ var WebsocketClientBridge = class _WebsocketClientBridge extends AbstractBridge
|
|
|
140
129
|
}
|
|
141
130
|
get resolver() {
|
|
142
131
|
this._resolver = this._resolver ?? new WebsocketBridgeModuleResolver({
|
|
143
|
-
archiving: {
|
|
144
|
-
...this.archiving,
|
|
145
|
-
resolveArchivists: this.resolveArchivingArchivists.bind(this)
|
|
146
|
-
},
|
|
132
|
+
archiving: { ...this.archiving, resolveArchivists: this.resolveArchivingArchivists.bind(this) },
|
|
147
133
|
bridge: this,
|
|
148
134
|
querySender: this,
|
|
149
135
|
root: this,
|
|
@@ -186,15 +172,18 @@ var WebsocketClientBridge = class _WebsocketClientBridge extends AbstractBridge
|
|
|
186
172
|
throw new Error("Unsupported");
|
|
187
173
|
}
|
|
188
174
|
};
|
|
189
|
-
WebsocketClientBridge
|
|
175
|
+
__publicField(WebsocketClientBridge, "configSchemas", [...__superGet(WebsocketClientBridge, WebsocketClientBridge, "configSchemas"), WebsocketBridgeConfigSchema]);
|
|
176
|
+
__publicField(WebsocketClientBridge, "defaultConfigSchema", WebsocketBridgeConfigSchema);
|
|
177
|
+
__publicField(WebsocketClientBridge, "defaultFailureRetryTime", 1e3 * 60);
|
|
178
|
+
__publicField(WebsocketClientBridge, "defaultMaxConnections", 4);
|
|
179
|
+
__publicField(WebsocketClientBridge, "defaultMaxPayloadSizeWarning", 256 * 256);
|
|
180
|
+
__publicField(WebsocketClientBridge, "maxFailureCacheSize", 1e3);
|
|
181
|
+
WebsocketClientBridge = __decorateClass([
|
|
190
182
|
creatableModule()
|
|
191
183
|
], WebsocketClientBridge);
|
|
192
184
|
|
|
193
185
|
// src/index-browser.ts
|
|
194
186
|
var WebsocketBridge = class extends WebsocketClientBridge {
|
|
195
|
-
static {
|
|
196
|
-
__name(this, "WebsocketBridge");
|
|
197
|
-
}
|
|
198
187
|
};
|
|
199
188
|
export {
|
|
200
189
|
WebsocketBridge,
|
|
@@ -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 {\n BridgeExposeOptions, BridgeModule, BridgeUnexposeOptions,\n} from '@xyo-network/bridge-model'\nimport {\n creatableModule, ModuleInstance, ModuleQueryResult,\n} 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.ts'\nimport { WebsocketBridgeQuerySender } from './ModuleProxy/index.ts'\nimport { WebsocketBridgeParams } from './Params.ts'\nimport { WebsocketBridgeModuleResolver } from './WebsocketBridgeModuleResolver.ts'\n\n@creatableModule()\nexport class WebsocketClientBridge<TParams extends WebsocketBridgeParams = WebsocketBridgeParams>\n extends AbstractBridge<TParams>\n implements BridgeModule<TParams>, WebsocketBridgeQuerySender {\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 throw ex as 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 type { EmptyObject } from '@xylabs/object'\nimport type { 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 type { Address } from '@xylabs/hex'\nimport { isAddress } from '@xylabs/hex'\nimport { Account } from '@xyo-network/account'\nimport type { BridgeModuleResolverParams } from '@xyo-network/bridge-abstract'\nimport { AbstractBridgeModuleResolver, wrapModuleWithType } from '@xyo-network/bridge-abstract'\nimport type { ConfigPayload } from '@xyo-network/config-payload-plugin'\nimport { ConfigSchema } from '@xyo-network/config-payload-plugin'\nimport type {\n ModuleConfig,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n} from '@xyo-network/module-model'\nimport {\n asModuleInstance,\n ModuleConfigSchema,\n ResolveHelper,\n} from '@xyo-network/module-model'\n\nimport type { WebsocketBridgeQuerySender, WebsocketModuleProxyParams } from './ModuleProxy/index.ts'\nimport { WebsocketModuleProxy } from './ModuleProxy/index.ts'\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: await Account.random(),\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, await Account.random()) 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 type { Address } from '@xylabs/hex'\nimport type { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport type { ModuleProxyParams } from '@xyo-network/bridge-abstract'\nimport { AbstractModuleProxy } from '@xyo-network/bridge-abstract'\nimport type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport type { 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 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.ts'\nexport * from './Config.ts'\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","random","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","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 {\n BridgeExposeOptions, BridgeModule, BridgeUnexposeOptions,\n} from '@xyo-network/bridge-model'\nimport {\n creatableModule, ModuleInstance, ModuleQueryResult,\n} 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.ts'\nimport { WebsocketBridgeQuerySender } from './ModuleProxy/index.ts'\nimport { WebsocketBridgeParams } from './Params.ts'\nimport { WebsocketBridgeModuleResolver } from './WebsocketBridgeModuleResolver.ts'\n\n@creatableModule()\nexport class WebsocketClientBridge<TParams extends WebsocketBridgeParams = WebsocketBridgeParams>\n extends AbstractBridge<TParams>\n implements BridgeModule<TParams>, WebsocketBridgeQuerySender {\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 throw ex as 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 type { EmptyObject } from '@xylabs/object'\nimport type { 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 type { Address } from '@xylabs/hex'\nimport { isAddress } from '@xylabs/hex'\nimport { Account } from '@xyo-network/account'\nimport type { BridgeModuleResolverParams } from '@xyo-network/bridge-abstract'\nimport { AbstractBridgeModuleResolver, wrapModuleWithType } from '@xyo-network/bridge-abstract'\nimport type { ConfigPayload } from '@xyo-network/config-payload-plugin'\nimport { ConfigSchema } from '@xyo-network/config-payload-plugin'\nimport type {\n ModuleConfig,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n} from '@xyo-network/module-model'\nimport {\n asModuleInstance,\n ModuleConfigSchema,\n ResolveHelper,\n} from '@xyo-network/module-model'\n\nimport type { WebsocketBridgeQuerySender, WebsocketModuleProxyParams } from './ModuleProxy/index.ts'\nimport { WebsocketModuleProxy } from './ModuleProxy/index.ts'\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: await Account.random(),\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, await Account.random()) 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 type { Address } from '@xylabs/hex'\nimport type { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport type { ModuleProxyParams } from '@xyo-network/bridge-abstract'\nimport { AbstractModuleProxy } from '@xyo-network/bridge-abstract'\nimport type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport type { 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 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.ts'\nexport * from './Config.ts'\n\nexport class WebsocketBridge extends WebsocketClientBridge {}\n"],"mappings":"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","names":["assertEx","assertEx"]}
|
package/dist/neutral/index.mjs
CHANGED
|
@@ -1,16 +1,33 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
|
-
var
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
4
|
+
var __reflectGet = Reflect.get;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
7
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
8
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
9
|
+
if (decorator = decorators[i])
|
|
10
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
11
|
+
if (kind && result) __defProp(target, key, result);
|
|
12
|
+
return result;
|
|
13
|
+
};
|
|
14
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
15
|
+
var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
|
|
3
16
|
|
|
4
17
|
// src/Bridge.ts
|
|
5
18
|
import { createServer as createHttpServer } from "node:http";
|
|
6
19
|
import { assertEx as assertEx3 } from "@xylabs/assert";
|
|
7
|
-
import {
|
|
20
|
+
import {
|
|
21
|
+
creatableModule as creatableModule2
|
|
22
|
+
} from "@xyo-network/module-model";
|
|
8
23
|
import { Server } from "socket.io";
|
|
9
24
|
|
|
10
25
|
// src/ClientBridge.ts
|
|
11
26
|
import { assertEx as assertEx2 } from "@xylabs/assert";
|
|
12
27
|
import { AbstractBridge } from "@xyo-network/bridge-abstract";
|
|
13
|
-
import {
|
|
28
|
+
import {
|
|
29
|
+
creatableModule
|
|
30
|
+
} from "@xyo-network/module-model";
|
|
14
31
|
import { Semaphore } from "async-mutex";
|
|
15
32
|
import { LRUCache } from "lru-cache";
|
|
16
33
|
|
|
@@ -23,14 +40,15 @@ import { isAddress } from "@xylabs/hex";
|
|
|
23
40
|
import { Account } from "@xyo-network/account";
|
|
24
41
|
import { AbstractBridgeModuleResolver, wrapModuleWithType } from "@xyo-network/bridge-abstract";
|
|
25
42
|
import { ConfigSchema } from "@xyo-network/config-payload-plugin";
|
|
26
|
-
import {
|
|
43
|
+
import {
|
|
44
|
+
asModuleInstance,
|
|
45
|
+
ModuleConfigSchema,
|
|
46
|
+
ResolveHelper
|
|
47
|
+
} from "@xyo-network/module-model";
|
|
27
48
|
|
|
28
49
|
// src/ModuleProxy/ModuleProxy.ts
|
|
29
50
|
import { AbstractModuleProxy } from "@xyo-network/bridge-abstract";
|
|
30
51
|
var WebsocketModuleProxy = class _WebsocketModuleProxy extends AbstractModuleProxy {
|
|
31
|
-
static {
|
|
32
|
-
__name(this, "WebsocketModuleProxy");
|
|
33
|
-
}
|
|
34
52
|
static createCount = 0;
|
|
35
53
|
constructor(params) {
|
|
36
54
|
_WebsocketModuleProxy.createCount = _WebsocketModuleProxy.createCount + 1;
|
|
@@ -46,9 +64,6 @@ var WebsocketModuleProxy = class _WebsocketModuleProxy extends AbstractModulePro
|
|
|
46
64
|
|
|
47
65
|
// src/WebsocketBridgeModuleResolver.ts
|
|
48
66
|
var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
|
|
49
|
-
static {
|
|
50
|
-
__name(this, "WebsocketBridgeModuleResolver");
|
|
51
|
-
}
|
|
52
67
|
get querySender() {
|
|
53
68
|
return this.params.querySender;
|
|
54
69
|
}
|
|
@@ -68,9 +83,7 @@ var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
|
|
|
68
83
|
const remainderParts = idParts.join(":");
|
|
69
84
|
const params = {
|
|
70
85
|
account: await Account.random(),
|
|
71
|
-
config: {
|
|
72
|
-
schema: ModuleConfigSchema
|
|
73
|
-
},
|
|
86
|
+
config: { schema: ModuleConfigSchema },
|
|
74
87
|
host: this,
|
|
75
88
|
moduleAddress,
|
|
76
89
|
querySender: this.querySender
|
|
@@ -81,7 +94,10 @@ var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
|
|
|
81
94
|
const state = await proxy.state();
|
|
82
95
|
if (state) {
|
|
83
96
|
const configSchema = state.find((payload) => payload.schema === ConfigSchema)?.config;
|
|
84
|
-
const config = assertEx(
|
|
97
|
+
const config = assertEx(
|
|
98
|
+
state.find((payload) => payload.schema === configSchema),
|
|
99
|
+
() => "Unable to locate config"
|
|
100
|
+
);
|
|
85
101
|
proxy.setConfig(config);
|
|
86
102
|
}
|
|
87
103
|
}
|
|
@@ -92,53 +108,28 @@ var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
|
|
|
92
108
|
proxy.downResolver.add(instance);
|
|
93
109
|
if (remainderParts.length > 0) {
|
|
94
110
|
const result = await wrapped.resolve(remainderParts, options);
|
|
95
|
-
return result ? [
|
|
96
|
-
result
|
|
97
|
-
] : [];
|
|
111
|
+
return result ? [result] : [];
|
|
98
112
|
}
|
|
99
|
-
return [
|
|
100
|
-
instance
|
|
101
|
-
];
|
|
113
|
+
return [instance];
|
|
102
114
|
}
|
|
103
115
|
};
|
|
104
116
|
|
|
105
117
|
// src/ClientBridge.ts
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
109
|
-
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;
|
|
110
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
111
|
-
}
|
|
112
|
-
__name(_ts_decorate, "_ts_decorate");
|
|
113
|
-
var WebsocketClientBridge = class _WebsocketClientBridge extends AbstractBridge {
|
|
114
|
-
static {
|
|
115
|
-
__name(this, "WebsocketClientBridge");
|
|
116
|
-
}
|
|
117
|
-
static configSchemas = [
|
|
118
|
-
...super.configSchemas,
|
|
119
|
-
WebsocketBridgeConfigSchema
|
|
120
|
-
];
|
|
121
|
-
static defaultConfigSchema = WebsocketBridgeConfigSchema;
|
|
122
|
-
static defaultFailureRetryTime = 1e3 * 60;
|
|
123
|
-
static defaultMaxConnections = 4;
|
|
124
|
-
static defaultMaxPayloadSizeWarning = 256 * 256;
|
|
125
|
-
static maxFailureCacheSize = 1e3;
|
|
126
|
-
_failureTimeCache = new LRUCache({
|
|
127
|
-
max: _WebsocketClientBridge.maxFailureCacheSize
|
|
128
|
-
});
|
|
118
|
+
var WebsocketClientBridge = class extends AbstractBridge {
|
|
119
|
+
_failureTimeCache = new LRUCache({ max: WebsocketClientBridge.maxFailureCacheSize });
|
|
129
120
|
_querySemaphore;
|
|
130
121
|
_resolver;
|
|
131
122
|
get client() {
|
|
132
123
|
return this.config.client;
|
|
133
124
|
}
|
|
134
125
|
get failureRetryTime() {
|
|
135
|
-
return this.client?.failureRetryTime ??
|
|
126
|
+
return this.client?.failureRetryTime ?? WebsocketClientBridge.defaultFailureRetryTime;
|
|
136
127
|
}
|
|
137
128
|
get maxConnections() {
|
|
138
|
-
return this.client?.maxConnections ??
|
|
129
|
+
return this.client?.maxConnections ?? WebsocketClientBridge.defaultMaxConnections;
|
|
139
130
|
}
|
|
140
131
|
get maxPayloadSizeWarning() {
|
|
141
|
-
return this.client?.maxPayloadSizeWarning ??
|
|
132
|
+
return this.client?.maxPayloadSizeWarning ?? WebsocketClientBridge.defaultMaxPayloadSizeWarning;
|
|
142
133
|
}
|
|
143
134
|
get querySemaphore() {
|
|
144
135
|
this._querySemaphore = this._querySemaphore ?? new Semaphore(this.maxConnections);
|
|
@@ -146,10 +137,7 @@ var WebsocketClientBridge = class _WebsocketClientBridge extends AbstractBridge
|
|
|
146
137
|
}
|
|
147
138
|
get resolver() {
|
|
148
139
|
this._resolver = this._resolver ?? new WebsocketBridgeModuleResolver({
|
|
149
|
-
archiving: {
|
|
150
|
-
...this.archiving,
|
|
151
|
-
resolveArchivists: this.resolveArchivingArchivists.bind(this)
|
|
152
|
-
},
|
|
140
|
+
archiving: { ...this.archiving, resolveArchivists: this.resolveArchivingArchivists.bind(this) },
|
|
153
141
|
bridge: this,
|
|
154
142
|
querySender: this,
|
|
155
143
|
root: this,
|
|
@@ -192,27 +180,23 @@ var WebsocketClientBridge = class _WebsocketClientBridge extends AbstractBridge
|
|
|
192
180
|
throw new Error("Unsupported");
|
|
193
181
|
}
|
|
194
182
|
};
|
|
195
|
-
WebsocketClientBridge
|
|
183
|
+
__publicField(WebsocketClientBridge, "configSchemas", [...__superGet(WebsocketClientBridge, WebsocketClientBridge, "configSchemas"), WebsocketBridgeConfigSchema]);
|
|
184
|
+
__publicField(WebsocketClientBridge, "defaultConfigSchema", WebsocketBridgeConfigSchema);
|
|
185
|
+
__publicField(WebsocketClientBridge, "defaultFailureRetryTime", 1e3 * 60);
|
|
186
|
+
__publicField(WebsocketClientBridge, "defaultMaxConnections", 4);
|
|
187
|
+
__publicField(WebsocketClientBridge, "defaultMaxPayloadSizeWarning", 256 * 256);
|
|
188
|
+
__publicField(WebsocketClientBridge, "maxFailureCacheSize", 1e3);
|
|
189
|
+
WebsocketClientBridge = __decorateClass([
|
|
196
190
|
creatableModule()
|
|
197
191
|
], WebsocketClientBridge);
|
|
198
192
|
|
|
199
193
|
// src/Bridge.ts
|
|
200
|
-
function _ts_decorate2(decorators, target, key, desc) {
|
|
201
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
202
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
203
|
-
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;
|
|
204
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
205
|
-
}
|
|
206
|
-
__name(_ts_decorate2, "_ts_decorate");
|
|
207
194
|
var BridgeCommands = {
|
|
208
195
|
join: "join",
|
|
209
196
|
query: "query"
|
|
210
197
|
};
|
|
211
198
|
var DEFAULT_HOST_PORT = 8080;
|
|
212
199
|
var WebsocketBridge = class extends WebsocketClientBridge {
|
|
213
|
-
static {
|
|
214
|
-
__name(this, "WebsocketBridge");
|
|
215
|
-
}
|
|
216
200
|
httpServer;
|
|
217
201
|
server;
|
|
218
202
|
get host() {
|
|
@@ -264,7 +248,7 @@ var WebsocketBridge = class extends WebsocketClientBridge {
|
|
|
264
248
|
this.httpServer = void 0;
|
|
265
249
|
}
|
|
266
250
|
};
|
|
267
|
-
WebsocketBridge =
|
|
251
|
+
WebsocketBridge = __decorateClass([
|
|
268
252
|
creatableModule2()
|
|
269
253
|
], WebsocketBridge);
|
|
270
254
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Bridge.ts","../../src/ClientBridge.ts","../../src/Config.ts","../../src/WebsocketBridgeModuleResolver.ts","../../src/ModuleProxy/ModuleProxy.ts"],"sourcesContent":["import type { Server as HttpServer } from 'node:http'\nimport { createServer as createHttpServer } from 'node:http'\n\nimport { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { BridgeExposeOptions, BridgeModule } from '@xyo-network/bridge-model'\nimport {\n AnyConfigSchema, creatableModule, ModuleInstance,\n} from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { Server, Socket } from 'socket.io'\n\nimport { WebsocketClientBridge } from './ClientBridge.ts'\nimport { WebsocketBridgeConfig } from './Config.ts'\nimport { WebsocketBridgeParams } from './Params.ts'\n\nexport const BridgeCommands = {\n join: 'join',\n query: 'query',\n}\n\nconst DEFAULT_HOST_PORT = 8080\n\n@creatableModule()\nexport class WebsocketBridge<\n TParams extends WebsocketBridgeParams<AnyConfigSchema<WebsocketBridgeConfig>> = WebsocketBridgeParams<WebsocketBridgeConfig>,\n>\n extends WebsocketClientBridge<TParams>\n implements BridgeModule<TParams> {\n httpServer?: HttpServer\n server?: Server\n\n get host() {\n return this.config.host\n }\n\n override exposeHandler(_id: string, _options?: BridgeExposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n override exposedHandler(): Promisable<Address[]> {\n throw new Error('Unsupported')\n }\n\n override async startHandler(): Promise<boolean> {\n if (this.host) {\n this.startServer()\n }\n return await super.startHandler()\n }\n\n override async stopHandler(): Promise<boolean> {\n if (this.host) {\n await this.stopServer()\n }\n return await super.stopHandler()\n }\n\n private startServer() {\n if (this.httpServer) {\n throw new Error('Http Server already started')\n }\n if (this.server) {\n throw new Error('Socket Server already started')\n }\n const host = assertEx(this.host, () => 'No Host Configured')\n this.httpServer = createHttpServer() as HttpServer\n this.server = new Server(this.httpServer)\n\n this.server.on('connection', (socket: Socket) => {\n socket.on(BridgeCommands.join, async (address: Address) => {\n await socket.join(address)\n console.log(`User ${socket.id} has connected to module ${address}`)\n })\n\n socket.on(BridgeCommands.query, ({ address, query }: { address: Address; query: Payload[] }) => {\n socket.to(address).emit('message', query)\n })\n })\n this.httpServer.listen(host.port ?? DEFAULT_HOST_PORT)\n }\n\n private async stopServer() {\n await this.server?.close()\n this.server = undefined\n this.httpServer?.close()\n this.httpServer = undefined\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractBridge } from '@xyo-network/bridge-abstract'\nimport {\n BridgeExposeOptions, BridgeModule, BridgeUnexposeOptions,\n} from '@xyo-network/bridge-model'\nimport {\n creatableModule, ModuleInstance, ModuleQueryResult,\n} 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.ts'\nimport { WebsocketBridgeQuerySender } from './ModuleProxy/index.ts'\nimport { WebsocketBridgeParams } from './Params.ts'\nimport { WebsocketBridgeModuleResolver } from './WebsocketBridgeModuleResolver.ts'\n\n@creatableModule()\nexport class WebsocketClientBridge<TParams extends WebsocketBridgeParams = WebsocketBridgeParams>\n extends AbstractBridge<TParams>\n implements BridgeModule<TParams>, WebsocketBridgeQuerySender {\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 throw ex as 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 type { EmptyObject } from '@xylabs/object'\nimport type { 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 type { Address } from '@xylabs/hex'\nimport { isAddress } from '@xylabs/hex'\nimport { Account } from '@xyo-network/account'\nimport type { BridgeModuleResolverParams } from '@xyo-network/bridge-abstract'\nimport { AbstractBridgeModuleResolver, wrapModuleWithType } from '@xyo-network/bridge-abstract'\nimport type { ConfigPayload } from '@xyo-network/config-payload-plugin'\nimport { ConfigSchema } from '@xyo-network/config-payload-plugin'\nimport type {\n ModuleConfig,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n} from '@xyo-network/module-model'\nimport {\n asModuleInstance,\n ModuleConfigSchema,\n ResolveHelper,\n} from '@xyo-network/module-model'\n\nimport type { WebsocketBridgeQuerySender, WebsocketModuleProxyParams } from './ModuleProxy/index.ts'\nimport { WebsocketModuleProxy } from './ModuleProxy/index.ts'\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: await Account.random(),\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, await Account.random()) 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 type { Address } from '@xylabs/hex'\nimport type { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport type { ModuleProxyParams } from '@xyo-network/bridge-abstract'\nimport { AbstractModuleProxy } from '@xyo-network/bridge-abstract'\nimport type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport type { 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 static createCount = 0\n\n constructor(params: TParams) {\n WebsocketModuleProxy.createCount = WebsocketModuleProxy.createCount + 1\n if (Math.floor(WebsocketModuleProxy.createCount / 10) === WebsocketModuleProxy.createCount / 10) {\n console.log(`WebsocketModuleProxy.createCount: ${WebsocketModuleProxy.createCount}`)\n }\n super(params)\n }\n\n async proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads: Payload[] = []): Promise<ModuleQueryResult> {\n return await this.params.querySender.sendBridgeQuery(this.params.moduleAddress, query, payloads)\n }\n}\n"],"mappings":"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","names":["createServer","createHttpServer","assertEx","creatableModule","Server","assertEx","AbstractBridge","creatableModule","Semaphore","LRUCache","WebsocketBridgeConfigSchema","assertEx","isAddress","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","random","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","release","unexposeHandler","BridgeCommands","join","query","DEFAULT_HOST_PORT","WebsocketBridge","WebsocketClientBridge","httpServer","server","host","config","exposeHandler","_id","_options","Error","exposedHandler","startHandler","startServer","stopHandler","stopServer","assertEx","createHttpServer","Server","on","socket","address","console","log","id","to","emit","listen","port","close","undefined"]}
|
|
1
|
+
{"version":3,"sources":["../../src/Bridge.ts","../../src/ClientBridge.ts","../../src/Config.ts","../../src/WebsocketBridgeModuleResolver.ts","../../src/ModuleProxy/ModuleProxy.ts"],"sourcesContent":["import type { Server as HttpServer } from 'node:http'\nimport { createServer as createHttpServer } from 'node:http'\n\nimport { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { BridgeExposeOptions, BridgeModule } from '@xyo-network/bridge-model'\nimport {\n AnyConfigSchema, creatableModule, ModuleInstance,\n} from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { Server, Socket } from 'socket.io'\n\nimport { WebsocketClientBridge } from './ClientBridge.ts'\nimport { WebsocketBridgeConfig } from './Config.ts'\nimport { WebsocketBridgeParams } from './Params.ts'\n\nexport const BridgeCommands = {\n join: 'join',\n query: 'query',\n}\n\nconst DEFAULT_HOST_PORT = 8080\n\n@creatableModule()\nexport class WebsocketBridge<\n TParams extends WebsocketBridgeParams<AnyConfigSchema<WebsocketBridgeConfig>> = WebsocketBridgeParams<WebsocketBridgeConfig>,\n>\n extends WebsocketClientBridge<TParams>\n implements BridgeModule<TParams> {\n httpServer?: HttpServer\n server?: Server\n\n get host() {\n return this.config.host\n }\n\n override exposeHandler(_id: string, _options?: BridgeExposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n override exposedHandler(): Promisable<Address[]> {\n throw new Error('Unsupported')\n }\n\n override async startHandler(): Promise<boolean> {\n if (this.host) {\n this.startServer()\n }\n return await super.startHandler()\n }\n\n override async stopHandler(): Promise<boolean> {\n if (this.host) {\n await this.stopServer()\n }\n return await super.stopHandler()\n }\n\n private startServer() {\n if (this.httpServer) {\n throw new Error('Http Server already started')\n }\n if (this.server) {\n throw new Error('Socket Server already started')\n }\n const host = assertEx(this.host, () => 'No Host Configured')\n this.httpServer = createHttpServer() as HttpServer\n this.server = new Server(this.httpServer)\n\n this.server.on('connection', (socket: Socket) => {\n socket.on(BridgeCommands.join, async (address: Address) => {\n await socket.join(address)\n console.log(`User ${socket.id} has connected to module ${address}`)\n })\n\n socket.on(BridgeCommands.query, ({ address, query }: { address: Address; query: Payload[] }) => {\n socket.to(address).emit('message', query)\n })\n })\n this.httpServer.listen(host.port ?? DEFAULT_HOST_PORT)\n }\n\n private async stopServer() {\n await this.server?.close()\n this.server = undefined\n this.httpServer?.close()\n this.httpServer = undefined\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractBridge } from '@xyo-network/bridge-abstract'\nimport {\n BridgeExposeOptions, BridgeModule, BridgeUnexposeOptions,\n} from '@xyo-network/bridge-model'\nimport {\n creatableModule, ModuleInstance, ModuleQueryResult,\n} 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.ts'\nimport { WebsocketBridgeQuerySender } from './ModuleProxy/index.ts'\nimport { WebsocketBridgeParams } from './Params.ts'\nimport { WebsocketBridgeModuleResolver } from './WebsocketBridgeModuleResolver.ts'\n\n@creatableModule()\nexport class WebsocketClientBridge<TParams extends WebsocketBridgeParams = WebsocketBridgeParams>\n extends AbstractBridge<TParams>\n implements BridgeModule<TParams>, WebsocketBridgeQuerySender {\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 throw ex as 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 type { EmptyObject } from '@xylabs/object'\nimport type { 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 type { Address } from '@xylabs/hex'\nimport { isAddress } from '@xylabs/hex'\nimport { Account } from '@xyo-network/account'\nimport type { BridgeModuleResolverParams } from '@xyo-network/bridge-abstract'\nimport { AbstractBridgeModuleResolver, wrapModuleWithType } from '@xyo-network/bridge-abstract'\nimport type { ConfigPayload } from '@xyo-network/config-payload-plugin'\nimport { ConfigSchema } from '@xyo-network/config-payload-plugin'\nimport type {\n ModuleConfig,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n} from '@xyo-network/module-model'\nimport {\n asModuleInstance,\n ModuleConfigSchema,\n ResolveHelper,\n} from '@xyo-network/module-model'\n\nimport type { WebsocketBridgeQuerySender, WebsocketModuleProxyParams } from './ModuleProxy/index.ts'\nimport { WebsocketModuleProxy } from './ModuleProxy/index.ts'\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: await Account.random(),\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, await Account.random()) 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 type { Address } from '@xylabs/hex'\nimport type { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport type { ModuleProxyParams } from '@xyo-network/bridge-abstract'\nimport { AbstractModuleProxy } from '@xyo-network/bridge-abstract'\nimport type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport type { 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 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":["assertEx","creatableModule","assertEx","assertEx","assertEx","creatableModule"]}
|
package/dist/node/index.mjs
CHANGED
|
@@ -1,16 +1,33 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
|
-
var
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
4
|
+
var __reflectGet = Reflect.get;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
7
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
8
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
9
|
+
if (decorator = decorators[i])
|
|
10
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
11
|
+
if (kind && result) __defProp(target, key, result);
|
|
12
|
+
return result;
|
|
13
|
+
};
|
|
14
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
15
|
+
var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
|
|
3
16
|
|
|
4
17
|
// src/Bridge.ts
|
|
5
18
|
import { createServer as createHttpServer } from "node:http";
|
|
6
19
|
import { assertEx as assertEx3 } from "@xylabs/assert";
|
|
7
|
-
import {
|
|
20
|
+
import {
|
|
21
|
+
creatableModule as creatableModule2
|
|
22
|
+
} from "@xyo-network/module-model";
|
|
8
23
|
import { Server } from "socket.io";
|
|
9
24
|
|
|
10
25
|
// src/ClientBridge.ts
|
|
11
26
|
import { assertEx as assertEx2 } from "@xylabs/assert";
|
|
12
27
|
import { AbstractBridge } from "@xyo-network/bridge-abstract";
|
|
13
|
-
import {
|
|
28
|
+
import {
|
|
29
|
+
creatableModule
|
|
30
|
+
} from "@xyo-network/module-model";
|
|
14
31
|
import { Semaphore } from "async-mutex";
|
|
15
32
|
import { LRUCache } from "lru-cache";
|
|
16
33
|
|
|
@@ -23,14 +40,15 @@ import { isAddress } from "@xylabs/hex";
|
|
|
23
40
|
import { Account } from "@xyo-network/account";
|
|
24
41
|
import { AbstractBridgeModuleResolver, wrapModuleWithType } from "@xyo-network/bridge-abstract";
|
|
25
42
|
import { ConfigSchema } from "@xyo-network/config-payload-plugin";
|
|
26
|
-
import {
|
|
43
|
+
import {
|
|
44
|
+
asModuleInstance,
|
|
45
|
+
ModuleConfigSchema,
|
|
46
|
+
ResolveHelper
|
|
47
|
+
} from "@xyo-network/module-model";
|
|
27
48
|
|
|
28
49
|
// src/ModuleProxy/ModuleProxy.ts
|
|
29
50
|
import { AbstractModuleProxy } from "@xyo-network/bridge-abstract";
|
|
30
51
|
var WebsocketModuleProxy = class _WebsocketModuleProxy extends AbstractModuleProxy {
|
|
31
|
-
static {
|
|
32
|
-
__name(this, "WebsocketModuleProxy");
|
|
33
|
-
}
|
|
34
52
|
static createCount = 0;
|
|
35
53
|
constructor(params) {
|
|
36
54
|
_WebsocketModuleProxy.createCount = _WebsocketModuleProxy.createCount + 1;
|
|
@@ -46,9 +64,6 @@ var WebsocketModuleProxy = class _WebsocketModuleProxy extends AbstractModulePro
|
|
|
46
64
|
|
|
47
65
|
// src/WebsocketBridgeModuleResolver.ts
|
|
48
66
|
var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
|
|
49
|
-
static {
|
|
50
|
-
__name(this, "WebsocketBridgeModuleResolver");
|
|
51
|
-
}
|
|
52
67
|
get querySender() {
|
|
53
68
|
return this.params.querySender;
|
|
54
69
|
}
|
|
@@ -68,9 +83,7 @@ var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
|
|
|
68
83
|
const remainderParts = idParts.join(":");
|
|
69
84
|
const params = {
|
|
70
85
|
account: await Account.random(),
|
|
71
|
-
config: {
|
|
72
|
-
schema: ModuleConfigSchema
|
|
73
|
-
},
|
|
86
|
+
config: { schema: ModuleConfigSchema },
|
|
74
87
|
host: this,
|
|
75
88
|
moduleAddress,
|
|
76
89
|
querySender: this.querySender
|
|
@@ -81,7 +94,10 @@ var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
|
|
|
81
94
|
const state = await proxy.state();
|
|
82
95
|
if (state) {
|
|
83
96
|
const configSchema = state.find((payload) => payload.schema === ConfigSchema)?.config;
|
|
84
|
-
const config = assertEx(
|
|
97
|
+
const config = assertEx(
|
|
98
|
+
state.find((payload) => payload.schema === configSchema),
|
|
99
|
+
() => "Unable to locate config"
|
|
100
|
+
);
|
|
85
101
|
proxy.setConfig(config);
|
|
86
102
|
}
|
|
87
103
|
}
|
|
@@ -92,53 +108,28 @@ var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
|
|
|
92
108
|
proxy.downResolver.add(instance);
|
|
93
109
|
if (remainderParts.length > 0) {
|
|
94
110
|
const result = await wrapped.resolve(remainderParts, options);
|
|
95
|
-
return result ? [
|
|
96
|
-
result
|
|
97
|
-
] : [];
|
|
111
|
+
return result ? [result] : [];
|
|
98
112
|
}
|
|
99
|
-
return [
|
|
100
|
-
instance
|
|
101
|
-
];
|
|
113
|
+
return [instance];
|
|
102
114
|
}
|
|
103
115
|
};
|
|
104
116
|
|
|
105
117
|
// src/ClientBridge.ts
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
109
|
-
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;
|
|
110
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
111
|
-
}
|
|
112
|
-
__name(_ts_decorate, "_ts_decorate");
|
|
113
|
-
var WebsocketClientBridge = class _WebsocketClientBridge extends AbstractBridge {
|
|
114
|
-
static {
|
|
115
|
-
__name(this, "WebsocketClientBridge");
|
|
116
|
-
}
|
|
117
|
-
static configSchemas = [
|
|
118
|
-
...super.configSchemas,
|
|
119
|
-
WebsocketBridgeConfigSchema
|
|
120
|
-
];
|
|
121
|
-
static defaultConfigSchema = WebsocketBridgeConfigSchema;
|
|
122
|
-
static defaultFailureRetryTime = 1e3 * 60;
|
|
123
|
-
static defaultMaxConnections = 4;
|
|
124
|
-
static defaultMaxPayloadSizeWarning = 256 * 256;
|
|
125
|
-
static maxFailureCacheSize = 1e3;
|
|
126
|
-
_failureTimeCache = new LRUCache({
|
|
127
|
-
max: _WebsocketClientBridge.maxFailureCacheSize
|
|
128
|
-
});
|
|
118
|
+
var WebsocketClientBridge = class extends AbstractBridge {
|
|
119
|
+
_failureTimeCache = new LRUCache({ max: WebsocketClientBridge.maxFailureCacheSize });
|
|
129
120
|
_querySemaphore;
|
|
130
121
|
_resolver;
|
|
131
122
|
get client() {
|
|
132
123
|
return this.config.client;
|
|
133
124
|
}
|
|
134
125
|
get failureRetryTime() {
|
|
135
|
-
return this.client?.failureRetryTime ??
|
|
126
|
+
return this.client?.failureRetryTime ?? WebsocketClientBridge.defaultFailureRetryTime;
|
|
136
127
|
}
|
|
137
128
|
get maxConnections() {
|
|
138
|
-
return this.client?.maxConnections ??
|
|
129
|
+
return this.client?.maxConnections ?? WebsocketClientBridge.defaultMaxConnections;
|
|
139
130
|
}
|
|
140
131
|
get maxPayloadSizeWarning() {
|
|
141
|
-
return this.client?.maxPayloadSizeWarning ??
|
|
132
|
+
return this.client?.maxPayloadSizeWarning ?? WebsocketClientBridge.defaultMaxPayloadSizeWarning;
|
|
142
133
|
}
|
|
143
134
|
get querySemaphore() {
|
|
144
135
|
this._querySemaphore = this._querySemaphore ?? new Semaphore(this.maxConnections);
|
|
@@ -146,10 +137,7 @@ var WebsocketClientBridge = class _WebsocketClientBridge extends AbstractBridge
|
|
|
146
137
|
}
|
|
147
138
|
get resolver() {
|
|
148
139
|
this._resolver = this._resolver ?? new WebsocketBridgeModuleResolver({
|
|
149
|
-
archiving: {
|
|
150
|
-
...this.archiving,
|
|
151
|
-
resolveArchivists: this.resolveArchivingArchivists.bind(this)
|
|
152
|
-
},
|
|
140
|
+
archiving: { ...this.archiving, resolveArchivists: this.resolveArchivingArchivists.bind(this) },
|
|
153
141
|
bridge: this,
|
|
154
142
|
querySender: this,
|
|
155
143
|
root: this,
|
|
@@ -192,27 +180,23 @@ var WebsocketClientBridge = class _WebsocketClientBridge extends AbstractBridge
|
|
|
192
180
|
throw new Error("Unsupported");
|
|
193
181
|
}
|
|
194
182
|
};
|
|
195
|
-
WebsocketClientBridge
|
|
183
|
+
__publicField(WebsocketClientBridge, "configSchemas", [...__superGet(WebsocketClientBridge, WebsocketClientBridge, "configSchemas"), WebsocketBridgeConfigSchema]);
|
|
184
|
+
__publicField(WebsocketClientBridge, "defaultConfigSchema", WebsocketBridgeConfigSchema);
|
|
185
|
+
__publicField(WebsocketClientBridge, "defaultFailureRetryTime", 1e3 * 60);
|
|
186
|
+
__publicField(WebsocketClientBridge, "defaultMaxConnections", 4);
|
|
187
|
+
__publicField(WebsocketClientBridge, "defaultMaxPayloadSizeWarning", 256 * 256);
|
|
188
|
+
__publicField(WebsocketClientBridge, "maxFailureCacheSize", 1e3);
|
|
189
|
+
WebsocketClientBridge = __decorateClass([
|
|
196
190
|
creatableModule()
|
|
197
191
|
], WebsocketClientBridge);
|
|
198
192
|
|
|
199
193
|
// src/Bridge.ts
|
|
200
|
-
function _ts_decorate2(decorators, target, key, desc) {
|
|
201
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
202
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
203
|
-
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;
|
|
204
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
205
|
-
}
|
|
206
|
-
__name(_ts_decorate2, "_ts_decorate");
|
|
207
194
|
var BridgeCommands = {
|
|
208
195
|
join: "join",
|
|
209
196
|
query: "query"
|
|
210
197
|
};
|
|
211
198
|
var DEFAULT_HOST_PORT = 8080;
|
|
212
199
|
var WebsocketBridge = class extends WebsocketClientBridge {
|
|
213
|
-
static {
|
|
214
|
-
__name(this, "WebsocketBridge");
|
|
215
|
-
}
|
|
216
200
|
httpServer;
|
|
217
201
|
server;
|
|
218
202
|
get host() {
|
|
@@ -264,7 +248,7 @@ var WebsocketBridge = class extends WebsocketClientBridge {
|
|
|
264
248
|
this.httpServer = void 0;
|
|
265
249
|
}
|
|
266
250
|
};
|
|
267
|
-
WebsocketBridge =
|
|
251
|
+
WebsocketBridge = __decorateClass([
|
|
268
252
|
creatableModule2()
|
|
269
253
|
], WebsocketBridge);
|
|
270
254
|
export {
|
package/dist/node/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Bridge.ts","../../src/ClientBridge.ts","../../src/Config.ts","../../src/WebsocketBridgeModuleResolver.ts","../../src/ModuleProxy/ModuleProxy.ts"],"sourcesContent":["import type { Server as HttpServer } from 'node:http'\nimport { createServer as createHttpServer } from 'node:http'\n\nimport { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { BridgeExposeOptions, BridgeModule } from '@xyo-network/bridge-model'\nimport {\n AnyConfigSchema, creatableModule, ModuleInstance,\n} from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { Server, Socket } from 'socket.io'\n\nimport { WebsocketClientBridge } from './ClientBridge.ts'\nimport { WebsocketBridgeConfig } from './Config.ts'\nimport { WebsocketBridgeParams } from './Params.ts'\n\nexport const BridgeCommands = {\n join: 'join',\n query: 'query',\n}\n\nconst DEFAULT_HOST_PORT = 8080\n\n@creatableModule()\nexport class WebsocketBridge<\n TParams extends WebsocketBridgeParams<AnyConfigSchema<WebsocketBridgeConfig>> = WebsocketBridgeParams<WebsocketBridgeConfig>,\n>\n extends WebsocketClientBridge<TParams>\n implements BridgeModule<TParams> {\n httpServer?: HttpServer\n server?: Server\n\n get host() {\n return this.config.host\n }\n\n override exposeHandler(_id: string, _options?: BridgeExposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n override exposedHandler(): Promisable<Address[]> {\n throw new Error('Unsupported')\n }\n\n override async startHandler(): Promise<boolean> {\n if (this.host) {\n this.startServer()\n }\n return await super.startHandler()\n }\n\n override async stopHandler(): Promise<boolean> {\n if (this.host) {\n await this.stopServer()\n }\n return await super.stopHandler()\n }\n\n private startServer() {\n if (this.httpServer) {\n throw new Error('Http Server already started')\n }\n if (this.server) {\n throw new Error('Socket Server already started')\n }\n const host = assertEx(this.host, () => 'No Host Configured')\n this.httpServer = createHttpServer() as HttpServer\n this.server = new Server(this.httpServer)\n\n this.server.on('connection', (socket: Socket) => {\n socket.on(BridgeCommands.join, async (address: Address) => {\n await socket.join(address)\n console.log(`User ${socket.id} has connected to module ${address}`)\n })\n\n socket.on(BridgeCommands.query, ({ address, query }: { address: Address; query: Payload[] }) => {\n socket.to(address).emit('message', query)\n })\n })\n this.httpServer.listen(host.port ?? DEFAULT_HOST_PORT)\n }\n\n private async stopServer() {\n await this.server?.close()\n this.server = undefined\n this.httpServer?.close()\n this.httpServer = undefined\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractBridge } from '@xyo-network/bridge-abstract'\nimport {\n BridgeExposeOptions, BridgeModule, BridgeUnexposeOptions,\n} from '@xyo-network/bridge-model'\nimport {\n creatableModule, ModuleInstance, ModuleQueryResult,\n} 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.ts'\nimport { WebsocketBridgeQuerySender } from './ModuleProxy/index.ts'\nimport { WebsocketBridgeParams } from './Params.ts'\nimport { WebsocketBridgeModuleResolver } from './WebsocketBridgeModuleResolver.ts'\n\n@creatableModule()\nexport class WebsocketClientBridge<TParams extends WebsocketBridgeParams = WebsocketBridgeParams>\n extends AbstractBridge<TParams>\n implements BridgeModule<TParams>, WebsocketBridgeQuerySender {\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 throw ex as 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 type { EmptyObject } from '@xylabs/object'\nimport type { 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 type { Address } from '@xylabs/hex'\nimport { isAddress } from '@xylabs/hex'\nimport { Account } from '@xyo-network/account'\nimport type { BridgeModuleResolverParams } from '@xyo-network/bridge-abstract'\nimport { AbstractBridgeModuleResolver, wrapModuleWithType } from '@xyo-network/bridge-abstract'\nimport type { ConfigPayload } from '@xyo-network/config-payload-plugin'\nimport { ConfigSchema } from '@xyo-network/config-payload-plugin'\nimport type {\n ModuleConfig,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n} from '@xyo-network/module-model'\nimport {\n asModuleInstance,\n ModuleConfigSchema,\n ResolveHelper,\n} from '@xyo-network/module-model'\n\nimport type { WebsocketBridgeQuerySender, WebsocketModuleProxyParams } from './ModuleProxy/index.ts'\nimport { WebsocketModuleProxy } from './ModuleProxy/index.ts'\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: await Account.random(),\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, await Account.random()) 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 type { Address } from '@xylabs/hex'\nimport type { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport type { ModuleProxyParams } from '@xyo-network/bridge-abstract'\nimport { AbstractModuleProxy } from '@xyo-network/bridge-abstract'\nimport type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport type { 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 static createCount = 0\n\n constructor(params: TParams) {\n WebsocketModuleProxy.createCount = WebsocketModuleProxy.createCount + 1\n if (Math.floor(WebsocketModuleProxy.createCount / 10) === WebsocketModuleProxy.createCount / 10) {\n console.log(`WebsocketModuleProxy.createCount: ${WebsocketModuleProxy.createCount}`)\n }\n super(params)\n }\n\n async proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads: Payload[] = []): Promise<ModuleQueryResult> {\n return await this.params.querySender.sendBridgeQuery(this.params.moduleAddress, query, payloads)\n }\n}\n"],"mappings":"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","names":["createServer","createHttpServer","assertEx","creatableModule","Server","assertEx","AbstractBridge","creatableModule","Semaphore","LRUCache","WebsocketBridgeConfigSchema","assertEx","isAddress","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","random","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","release","unexposeHandler","BridgeCommands","join","query","DEFAULT_HOST_PORT","WebsocketBridge","WebsocketClientBridge","httpServer","server","host","config","exposeHandler","_id","_options","Error","exposedHandler","startHandler","startServer","stopHandler","stopServer","assertEx","createHttpServer","Server","on","socket","address","console","log","id","to","emit","listen","port","close","undefined"]}
|
|
1
|
+
{"version":3,"sources":["../../src/Bridge.ts","../../src/ClientBridge.ts","../../src/Config.ts","../../src/WebsocketBridgeModuleResolver.ts","../../src/ModuleProxy/ModuleProxy.ts"],"sourcesContent":["import type { Server as HttpServer } from 'node:http'\nimport { createServer as createHttpServer } from 'node:http'\n\nimport { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { BridgeExposeOptions, BridgeModule } from '@xyo-network/bridge-model'\nimport {\n AnyConfigSchema, creatableModule, ModuleInstance,\n} from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { Server, Socket } from 'socket.io'\n\nimport { WebsocketClientBridge } from './ClientBridge.ts'\nimport { WebsocketBridgeConfig } from './Config.ts'\nimport { WebsocketBridgeParams } from './Params.ts'\n\nexport const BridgeCommands = {\n join: 'join',\n query: 'query',\n}\n\nconst DEFAULT_HOST_PORT = 8080\n\n@creatableModule()\nexport class WebsocketBridge<\n TParams extends WebsocketBridgeParams<AnyConfigSchema<WebsocketBridgeConfig>> = WebsocketBridgeParams<WebsocketBridgeConfig>,\n>\n extends WebsocketClientBridge<TParams>\n implements BridgeModule<TParams> {\n httpServer?: HttpServer\n server?: Server\n\n get host() {\n return this.config.host\n }\n\n override exposeHandler(_id: string, _options?: BridgeExposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n override exposedHandler(): Promisable<Address[]> {\n throw new Error('Unsupported')\n }\n\n override async startHandler(): Promise<boolean> {\n if (this.host) {\n this.startServer()\n }\n return await super.startHandler()\n }\n\n override async stopHandler(): Promise<boolean> {\n if (this.host) {\n await this.stopServer()\n }\n return await super.stopHandler()\n }\n\n private startServer() {\n if (this.httpServer) {\n throw new Error('Http Server already started')\n }\n if (this.server) {\n throw new Error('Socket Server already started')\n }\n const host = assertEx(this.host, () => 'No Host Configured')\n this.httpServer = createHttpServer() as HttpServer\n this.server = new Server(this.httpServer)\n\n this.server.on('connection', (socket: Socket) => {\n socket.on(BridgeCommands.join, async (address: Address) => {\n await socket.join(address)\n console.log(`User ${socket.id} has connected to module ${address}`)\n })\n\n socket.on(BridgeCommands.query, ({ address, query }: { address: Address; query: Payload[] }) => {\n socket.to(address).emit('message', query)\n })\n })\n this.httpServer.listen(host.port ?? DEFAULT_HOST_PORT)\n }\n\n private async stopServer() {\n await this.server?.close()\n this.server = undefined\n this.httpServer?.close()\n this.httpServer = undefined\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractBridge } from '@xyo-network/bridge-abstract'\nimport {\n BridgeExposeOptions, BridgeModule, BridgeUnexposeOptions,\n} from '@xyo-network/bridge-model'\nimport {\n creatableModule, ModuleInstance, ModuleQueryResult,\n} 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.ts'\nimport { WebsocketBridgeQuerySender } from './ModuleProxy/index.ts'\nimport { WebsocketBridgeParams } from './Params.ts'\nimport { WebsocketBridgeModuleResolver } from './WebsocketBridgeModuleResolver.ts'\n\n@creatableModule()\nexport class WebsocketClientBridge<TParams extends WebsocketBridgeParams = WebsocketBridgeParams>\n extends AbstractBridge<TParams>\n implements BridgeModule<TParams>, WebsocketBridgeQuerySender {\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 throw ex as 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 type { EmptyObject } from '@xylabs/object'\nimport type { 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 type { Address } from '@xylabs/hex'\nimport { isAddress } from '@xylabs/hex'\nimport { Account } from '@xyo-network/account'\nimport type { BridgeModuleResolverParams } from '@xyo-network/bridge-abstract'\nimport { AbstractBridgeModuleResolver, wrapModuleWithType } from '@xyo-network/bridge-abstract'\nimport type { ConfigPayload } from '@xyo-network/config-payload-plugin'\nimport { ConfigSchema } from '@xyo-network/config-payload-plugin'\nimport type {\n ModuleConfig,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n} from '@xyo-network/module-model'\nimport {\n asModuleInstance,\n ModuleConfigSchema,\n ResolveHelper,\n} from '@xyo-network/module-model'\n\nimport type { WebsocketBridgeQuerySender, WebsocketModuleProxyParams } from './ModuleProxy/index.ts'\nimport { WebsocketModuleProxy } from './ModuleProxy/index.ts'\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: await Account.random(),\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, await Account.random()) 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 type { Address } from '@xylabs/hex'\nimport type { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport type { ModuleProxyParams } from '@xyo-network/bridge-abstract'\nimport { AbstractModuleProxy } from '@xyo-network/bridge-abstract'\nimport type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport type { 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 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":";;;;;;;;;;;;;;;;;AACA,SAAS,gBAAgB,wBAAwB;AAEjD,SAAS,YAAAA,iBAAgB;AAIzB;AAAA,EACmB,mBAAAC;AAAA,OACZ;AAEP,SAAS,cAAsB;;;ACX/B,SAAS,YAAAC,iBAAgB;AAIzB,SAAS,sBAAsB;AAI/B;AAAA,EACE;AAAA,OACK;AAEP,SAAS,iBAAiB;AAC1B,SAAS,gBAAgB;;;ACVlB,IAAM,8BAA8B;;;ACH3C,SAAS,gBAAgB;AAEzB,SAAS,iBAAiB;AAC1B,SAAS,eAAe;AAExB,SAAS,8BAA8B,0BAA0B;AAEjE,SAAS,oBAAoB;AAO7B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACfP,SAAS,2BAA2B;AAgB7B,IAAM,uBAAN,MAAM,8BAMH,oBACwD;AAAA,EAChE,OAAO,cAAc;AAAA,EAErB,YAAY,QAAiB;AAC3B,0BAAqB,cAAc,sBAAqB,cAAc;AACtE,QAAI,KAAK,MAAM,sBAAqB,cAAc,EAAE,MAAM,sBAAqB,cAAc,IAAI;AAC/F,cAAQ,IAAI,qCAAqC,sBAAqB,WAAW,EAAE;AAAA,IACrF;AACA,UAAM,MAAM;AAAA,EACd;AAAA,EAEA,MAAM,kBAAmE,OAAU,WAAsB,CAAC,GAA+B;AACvI,WAAO,MAAM,KAAK,OAAO,YAAY,gBAAgB,KAAK,OAAO,eAAe,OAAO,QAAQ;AAAA,EACjG;AACF;;;ADbO,IAAM,gCAAN,cAEG,6BAAgC;AAAA,EACxC,IAAI,cAAc;AAChB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,MAAe,eAA0D,IAAsB,SAAgD;AAC7I,UAAM,eAAe,MAAM,MAAM,eAAe,IAAI,OAAO;AAC3D,QAAI,cAAc;AAChB,aAAO;AAAA,IACT;AACA,QAAI,OAAO,KAAK;AACd,aAAO,CAAC;AAAA,IACV;AACA,UAAM,UAAU,GAAG,MAAM,GAAG;AAC5B,UAAM,yBAAyB,SAAS,QAAQ,MAAM,GAAG,MAAM,8BAA8B,EAAE,EAAE;AACjG,UAAM,YAAY,MAAM,cAAc,0BAA0B,sBAAsB;AACtF,UAAM,gBAAgB;AACtB,aAAS,UAAU,SAAS,GAAG,MAAM,2BAA2B,SAAS,EAAE;AAC3E,UAAM,iBAAiB,QAAQ,KAAK,GAAG;AACvC,UAAM,SAAqC;AAAA,MACzC,SAAS,MAAM,QAAQ,OAAO;AAAA,MAC9B,QAAQ,EAAE,QAAQ,mBAAmB;AAAA,MACrC,MAAM;AAAA,MACN;AAAA,MACA,aAAa,KAAK;AAAA,IACpB;AAEA,SAAK,QAAQ,MAAM,uBAAuB,aAAa,KAAK,EAAE,EAAE;AAEhE,UAAM,QAAQ,IAAI,qBAAoD,MAAM;AAE5E,QAAI,OAAO;AACT,YAAM,QAAQ,MAAM,MAAM,MAAM;AAChC,UAAI,OAAO;AACT,cAAM,eAAgB,MAAM,KAAK,aAAW,QAAQ,WAAW,YAAY,GAAiC;AAC5G,cAAM,SAAS;AAAA,UACb,MAAM,KAAK,aAAW,QAAQ,WAAW,YAAY;AAAA,UACrD,MAAM;AAAA,QACR;AACA,cAAM,UAAU,MAAM;AAAA,MACxB;AAAA,IACF;AAEA,UAAM,MAAM,MAAM;AAElB,UAAM,UAAU,SAAS,mBAAmB,OAAO,MAAM,QAAQ,OAAO,CAAC,GAAmB,MAAM,iCAAiC,EAAE,GAAG;AACxI,UAAM,WAAW,SAAS,iBAAoB,SAAS,CAAC,CAAC,GAAG,MAAM,+BAA+B,EAAE,GAAG;AACtG,UAAM,WAAW,IAAI,QAAQ;AAC7B,UAAM,aAAa,IAAI,QAAQ;AAE/B,QAAI,eAAe,SAAS,GAAG;AAC7B,YAAM,SAAS,MAAM,QAAQ,QAAW,gBAAgB,OAAO;AAC/D,aAAO,SAAS,CAAC,MAAM,IAAI,CAAC;AAAA,IAC9B;AAGA,WAAO,CAAC,QAAQ;AAAA,EAClB;AACF;;;AFlEO,IAAM,wBAAN,cACG,eACqD;AAAA,EAQrD,oBAAoB,IAAI,SAA0B,EAAE,KAAK,sBAAsB,oBAAoB,CAAC;AAAA,EACpG;AAAA,EAEA;AAAA,EAER,IAAI,SAAS;AACX,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,mBAAmB;AACrB,WAAO,KAAK,QAAQ,oBAAoB,sBAAsB;AAAA,EAChE;AAAA,EAEA,IAAI,iBAAiB;AACnB,WAAO,KAAK,QAAQ,kBAAkB,sBAAsB;AAAA,EAC9D;AAAA,EAEA,IAAI,wBAAwB;AAC1B,WAAO,KAAK,QAAQ,yBAAyB,sBAAsB;AAAA,EACrE;AAAA,EAEA,IAAI,iBAAiB;AACnB,SAAK,kBAAkB,KAAK,mBAAmB,IAAI,UAAU,KAAK,cAAc;AAChF,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAa,WAAW;AACtB,SAAK,YACD,KAAK,aACF,IAAI,8BAA8B;AAAA,MACnC,WAAW,EAAE,GAAG,KAAK,WAAW,mBAAmB,KAAK,2BAA2B,KAAK,IAAI,EAAE;AAAA,MAC9F,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,MAAM;AAAA,MACN,gBAAgB,KAAK;AAAA,IACvB,CAAC;AACL,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,MAAM;AACR,WAAOC,UAAS,KAAK,OAAO,QAAQ,KAAK,MAAM,YAAY;AAAA,EAC7D;AAAA,EAES,cAAc,KAAa,UAA0E;AAC5G,UAAM,IAAI,MAAM,aAAa;AAAA,EAC/B;AAAA,EAES,iBAAwC;AAC/C,UAAM,IAAI,MAAM,aAAa;AAAA,EAC/B;AAAA,EAEA,MAAM,WAAsC;AAC1C,WAAO,MAAM,QAAQ,QAAQ,CAAC,CAAC;AAAA,EACjC;AAAA,EAEA,MAAM,gBACJ,eACA,QACA,WACkC;AAClC,UAAM,kBAAkB,KAAK,kBAAkB,IAAI,aAAa;AAChE,QAAI,oBAAoB,QAAW;AACjC,YAAM,MAAM,KAAK,IAAI;AACrB,YAAM,2BAA2B,MAAM;AACvC,UAAI,2BAA2B,KAAK,kBAAkB;AACpD,cAAM,IAAI,MAAM,kCAAkC,aAAa,MAAM,wBAAwB,SAAS;AAAA,MACxG;AACA,WAAK,kBAAkB,OAAO,aAAa;AAAA,IAC7C;AACA,QAAI;AACF,YAAM,KAAK,eAAe,QAAQ;AAClC,YAAM,IAAI,MAAM,aAAa;AAAA,IAC/B,SAAS,IAAI;AACX,YAAM;AAAA,IACR,UAAE;AACA,WAAK,eAAe,QAAQ;AAAA,IAC9B;AAAA,EACF;AAAA,EAES,gBAAgB,KAAa,UAA4E;AAChH,UAAM,IAAI,MAAM,aAAa;AAAA,EAC/B;AACF;AAzFE,cAHW,uBAGc,iBAA0B,CAAC,GAAG,yDAAM,kBAAe,2BAA2B;AACvG,cAJW,uBAIc,uBAA8B;AACvD,cALW,uBAKJ,2BAA0B,MAAO;AACxC,cANW,uBAMJ,yBAAwB;AAC/B,cAPW,uBAOJ,gCAA+B,MAAM;AAC5C,cARW,uBAQJ,uBAAsB;AARlB,wBAAN;AAAA,EADN,gBAAgB;AAAA,GACJ;;;ADJN,IAAM,iBAAiB;AAAA,EAC5B,MAAM;AAAA,EACN,OAAO;AACT;AAEA,IAAM,oBAAoB;AAGnB,IAAM,kBAAN,cAGG,sBACyB;AAAA,EACjC;AAAA,EACA;AAAA,EAEA,IAAI,OAAO;AACT,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAES,cAAc,KAAa,UAA0E;AAC5G,UAAM,IAAI,MAAM,aAAa;AAAA,EAC/B;AAAA,EAES,iBAAwC;AAC/C,UAAM,IAAI,MAAM,aAAa;AAAA,EAC/B;AAAA,EAEA,MAAe,eAAiC;AAC9C,QAAI,KAAK,MAAM;AACb,WAAK,YAAY;AAAA,IACnB;AACA,WAAO,MAAM,MAAM,aAAa;AAAA,EAClC;AAAA,EAEA,MAAe,cAAgC;AAC7C,QAAI,KAAK,MAAM;AACb,YAAM,KAAK,WAAW;AAAA,IACxB;AACA,WAAO,MAAM,MAAM,YAAY;AAAA,EACjC;AAAA,EAEQ,cAAc;AACpB,QAAI,KAAK,YAAY;AACnB,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AACA,QAAI,KAAK,QAAQ;AACf,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD;AACA,UAAM,OAAOC,UAAS,KAAK,MAAM,MAAM,oBAAoB;AAC3D,SAAK,aAAa,iBAAiB;AACnC,SAAK,SAAS,IAAI,OAAO,KAAK,UAAU;AAExC,SAAK,OAAO,GAAG,cAAc,CAAC,WAAmB;AAC/C,aAAO,GAAG,eAAe,MAAM,OAAO,YAAqB;AACzD,cAAM,OAAO,KAAK,OAAO;AACzB,gBAAQ,IAAI,QAAQ,OAAO,EAAE,4BAA4B,OAAO,EAAE;AAAA,MACpE,CAAC;AAED,aAAO,GAAG,eAAe,OAAO,CAAC,EAAE,SAAS,MAAM,MAA8C;AAC9F,eAAO,GAAG,OAAO,EAAE,KAAK,WAAW,KAAK;AAAA,MAC1C,CAAC;AAAA,IACH,CAAC;AACD,SAAK,WAAW,OAAO,KAAK,QAAQ,iBAAiB;AAAA,EACvD;AAAA,EAEA,MAAc,aAAa;AACzB,UAAM,KAAK,QAAQ,MAAM;AACzB,SAAK,SAAS;AACd,SAAK,YAAY,MAAM;AACvB,SAAK,aAAa;AAAA,EACpB;AACF;AAhEa,kBAAN;AAAA,EADNC,iBAAgB;AAAA,GACJ;","names":["assertEx","creatableModule","assertEx","assertEx","assertEx","creatableModule"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/bridge-websocket",
|
|
3
|
-
"version": "3.6.
|
|
3
|
+
"version": "3.6.11",
|
|
4
4
|
"description": "Primary SDK for using XYO Protocol 2.0",
|
|
5
5
|
"homepage": "https://xyo.network",
|
|
6
6
|
"bugs": {
|
|
@@ -37,17 +37,17 @@
|
|
|
37
37
|
"module": "dist/neutral/index.mjs",
|
|
38
38
|
"types": "dist/neutral/index.d.ts",
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@xylabs/assert": "^4.
|
|
41
|
-
"@xylabs/hex": "^4.
|
|
42
|
-
"@xylabs/object": "^4.
|
|
43
|
-
"@xylabs/promise": "^4.
|
|
44
|
-
"@xyo-network/account": "^3.6.
|
|
45
|
-
"@xyo-network/boundwitness-model": "^3.6.
|
|
46
|
-
"@xyo-network/bridge-abstract": "^3.6.
|
|
47
|
-
"@xyo-network/bridge-model": "^3.6.
|
|
48
|
-
"@xyo-network/config-payload-plugin": "^3.6.
|
|
49
|
-
"@xyo-network/module-model": "^3.6.
|
|
50
|
-
"@xyo-network/payload-model": "^3.6.
|
|
40
|
+
"@xylabs/assert": "^4.5.1",
|
|
41
|
+
"@xylabs/hex": "^4.5.1",
|
|
42
|
+
"@xylabs/object": "^4.5.1",
|
|
43
|
+
"@xylabs/promise": "^4.5.1",
|
|
44
|
+
"@xyo-network/account": "^3.6.11",
|
|
45
|
+
"@xyo-network/boundwitness-model": "^3.6.11",
|
|
46
|
+
"@xyo-network/bridge-abstract": "^3.6.11",
|
|
47
|
+
"@xyo-network/bridge-model": "^3.6.11",
|
|
48
|
+
"@xyo-network/config-payload-plugin": "^3.6.11",
|
|
49
|
+
"@xyo-network/module-model": "^3.6.11",
|
|
50
|
+
"@xyo-network/payload-model": "^3.6.11",
|
|
51
51
|
"async-mutex": "^0.5.0",
|
|
52
52
|
"lru-cache": "^11.0.2",
|
|
53
53
|
"socket.io": "^4.8.1"
|
|
@@ -55,16 +55,16 @@
|
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@xylabs/ts-scripts-yarn3": "^4.2.6",
|
|
57
57
|
"@xylabs/tsconfig": "^4.2.6",
|
|
58
|
-
"@xylabs/vitest-extended": "^4.
|
|
59
|
-
"@xyo-network/account": "^3.6.
|
|
60
|
-
"@xyo-network/archivist-model": "^3.6.
|
|
61
|
-
"@xyo-network/node-memory": "^3.6.
|
|
62
|
-
"@xyo-network/node-model": "^3.6.
|
|
63
|
-
"@xyo-network/payload-builder": "^3.6.
|
|
64
|
-
"@xyo-network/payload-wrapper": "^3.6.
|
|
58
|
+
"@xylabs/vitest-extended": "^4.5.1",
|
|
59
|
+
"@xyo-network/account": "^3.6.11",
|
|
60
|
+
"@xyo-network/archivist-model": "^3.6.11",
|
|
61
|
+
"@xyo-network/node-memory": "^3.6.11",
|
|
62
|
+
"@xyo-network/node-model": "^3.6.11",
|
|
63
|
+
"@xyo-network/payload-builder": "^3.6.11",
|
|
64
|
+
"@xyo-network/payload-wrapper": "^3.6.11",
|
|
65
65
|
"socket.io-client": "^4.8.1",
|
|
66
|
-
"typescript": "^5.7.
|
|
67
|
-
"vitest": "^
|
|
66
|
+
"typescript": "^5.7.3",
|
|
67
|
+
"vitest": "^3.0.4"
|
|
68
68
|
},
|
|
69
69
|
"publishConfig": {
|
|
70
70
|
"access": "public"
|
package/src/ClientBridge.ts
CHANGED
|
@@ -58,13 +58,13 @@ export class WebsocketClientBridge<TParams extends WebsocketBridgeParams = Webso
|
|
|
58
58
|
override get resolver() {
|
|
59
59
|
this._resolver
|
|
60
60
|
= this._resolver
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
61
|
+
?? new WebsocketBridgeModuleResolver({
|
|
62
|
+
archiving: { ...this.archiving, resolveArchivists: this.resolveArchivingArchivists.bind(this) },
|
|
63
|
+
bridge: this,
|
|
64
|
+
querySender: this,
|
|
65
|
+
root: this,
|
|
66
|
+
wrapperAccount: this.account,
|
|
67
|
+
})
|
|
68
68
|
return this._resolver
|
|
69
69
|
}
|
|
70
70
|
|