@xyo-network/bridge-websocket 3.18.10 → 4.0.1

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.
@@ -18,7 +18,7 @@ var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
18
18
  import { assertEx as assertEx2 } from "@xylabs/assert";
19
19
  import { AbstractBridge } from "@xyo-network/bridge-abstract";
20
20
  import {
21
- creatableModule
21
+ creatableModule as creatableModule2
22
22
  } from "@xyo-network/module-model";
23
23
  import { Semaphore } from "async-mutex";
24
24
  import { LRUCache } from "lru-cache";
@@ -40,19 +40,17 @@ import {
40
40
 
41
41
  // src/ModuleProxy/ModuleProxy.ts
42
42
  import { AbstractModuleProxy } from "@xyo-network/bridge-abstract";
43
- var WebsocketModuleProxy = class _WebsocketModuleProxy extends AbstractModuleProxy {
44
- static createCount = 0;
45
- constructor(params) {
46
- _WebsocketModuleProxy.createCount = _WebsocketModuleProxy.createCount + 1;
47
- if (Math.floor(_WebsocketModuleProxy.createCount / 10) === _WebsocketModuleProxy.createCount / 10) {
48
- console.log(`WebsocketModuleProxy.createCount: ${_WebsocketModuleProxy.createCount}`);
49
- }
50
- super(params);
51
- }
43
+ import {
44
+ creatableModule
45
+ } from "@xyo-network/module-model";
46
+ var WebsocketModuleProxy = class extends AbstractModuleProxy {
52
47
  async proxyQueryHandler(query, payloads = []) {
53
48
  return await this.params.querySender.sendBridgeQuery(this.params.moduleAddress, query, payloads);
54
49
  }
55
50
  };
51
+ WebsocketModuleProxy = __decorateClass([
52
+ creatableModule()
53
+ ], WebsocketModuleProxy);
56
54
 
57
55
  // src/WebsocketBridgeModuleResolver.ts
58
56
  var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
@@ -74,6 +72,7 @@ var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
74
72
  assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`);
75
73
  const remainderParts = idParts.join(":");
76
74
  const params = {
75
+ name: "WebsocketBridgeModuleResolver",
77
76
  account: await Account.random(),
78
77
  config: { schema: ModuleConfigSchema },
79
78
  host: this,
@@ -81,7 +80,7 @@ var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
81
80
  querySender: this.querySender
82
81
  };
83
82
  this.logger?.debug(`creating HttpProxy [${moduleAddress}] ${id}`);
84
- const proxy = new WebsocketModuleProxy(params);
83
+ const proxy = await WebsocketModuleProxy.create(params);
85
84
  if (proxy) {
86
85
  const state = await proxy.state();
87
86
  if (state) {
@@ -179,7 +178,7 @@ __publicField(WebsocketClientBridge, "defaultMaxConnections", 4);
179
178
  __publicField(WebsocketClientBridge, "defaultMaxPayloadSizeWarning", 256 * 256);
180
179
  __publicField(WebsocketClientBridge, "maxFailureCacheSize", 1e3);
181
180
  WebsocketClientBridge = __decorateClass([
182
- creatableModule()
181
+ creatableModule2()
183
182
  ], WebsocketClientBridge);
184
183
 
185
184
  // src/index-browser.ts
@@ -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 protected static defaultFailureRetryTime = 1000 * 60\n protected static defaultMaxConnections = 4\n protected static defaultMaxPayloadSizeWarning = 256 * 256\n protected 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 protected 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"]}
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 protected static defaultFailureRetryTime = 1000 * 60\n protected static defaultMaxConnections = 4\n protected static defaultMaxPayloadSizeWarning = 256 * 256\n protected 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 name: 'WebsocketBridgeModuleResolver',\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 = await WebsocketModuleProxy.create(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 {\n creatableModule, type ModuleInstance, type ModuleQueryResult,\n} 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\n@creatableModule()\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 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","creatableModule","assertEx","creatableModule"]}
@@ -18,7 +18,7 @@ var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
18
18
  import { createServer as createHttpServer } from "http";
19
19
  import { assertEx as assertEx3 } from "@xylabs/assert";
20
20
  import {
21
- creatableModule as creatableModule2
21
+ creatableModule as creatableModule3
22
22
  } from "@xyo-network/module-model";
23
23
  import { Server } from "socket.io";
24
24
 
@@ -26,7 +26,7 @@ import { Server } from "socket.io";
26
26
  import { assertEx as assertEx2 } from "@xylabs/assert";
27
27
  import { AbstractBridge } from "@xyo-network/bridge-abstract";
28
28
  import {
29
- creatableModule
29
+ creatableModule as creatableModule2
30
30
  } from "@xyo-network/module-model";
31
31
  import { Semaphore } from "async-mutex";
32
32
  import { LRUCache } from "lru-cache";
@@ -48,19 +48,17 @@ import {
48
48
 
49
49
  // src/ModuleProxy/ModuleProxy.ts
50
50
  import { AbstractModuleProxy } from "@xyo-network/bridge-abstract";
51
- var WebsocketModuleProxy = class _WebsocketModuleProxy extends AbstractModuleProxy {
52
- static createCount = 0;
53
- constructor(params) {
54
- _WebsocketModuleProxy.createCount = _WebsocketModuleProxy.createCount + 1;
55
- if (Math.floor(_WebsocketModuleProxy.createCount / 10) === _WebsocketModuleProxy.createCount / 10) {
56
- console.log(`WebsocketModuleProxy.createCount: ${_WebsocketModuleProxy.createCount}`);
57
- }
58
- super(params);
59
- }
51
+ import {
52
+ creatableModule
53
+ } from "@xyo-network/module-model";
54
+ var WebsocketModuleProxy = class extends AbstractModuleProxy {
60
55
  async proxyQueryHandler(query, payloads = []) {
61
56
  return await this.params.querySender.sendBridgeQuery(this.params.moduleAddress, query, payloads);
62
57
  }
63
58
  };
59
+ WebsocketModuleProxy = __decorateClass([
60
+ creatableModule()
61
+ ], WebsocketModuleProxy);
64
62
 
65
63
  // src/WebsocketBridgeModuleResolver.ts
66
64
  var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
@@ -82,6 +80,7 @@ var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
82
80
  assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`);
83
81
  const remainderParts = idParts.join(":");
84
82
  const params = {
83
+ name: "WebsocketBridgeModuleResolver",
85
84
  account: await Account.random(),
86
85
  config: { schema: ModuleConfigSchema },
87
86
  host: this,
@@ -89,7 +88,7 @@ var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
89
88
  querySender: this.querySender
90
89
  };
91
90
  this.logger?.debug(`creating HttpProxy [${moduleAddress}] ${id}`);
92
- const proxy = new WebsocketModuleProxy(params);
91
+ const proxy = await WebsocketModuleProxy.create(params);
93
92
  if (proxy) {
94
93
  const state = await proxy.state();
95
94
  if (state) {
@@ -187,7 +186,7 @@ __publicField(WebsocketClientBridge, "defaultMaxConnections", 4);
187
186
  __publicField(WebsocketClientBridge, "defaultMaxPayloadSizeWarning", 256 * 256);
188
187
  __publicField(WebsocketClientBridge, "maxFailureCacheSize", 1e3);
189
188
  WebsocketClientBridge = __decorateClass([
190
- creatableModule()
189
+ creatableModule2()
191
190
  ], WebsocketClientBridge);
192
191
 
193
192
  // src/Bridge.ts
@@ -212,13 +211,13 @@ var WebsocketBridge = class extends WebsocketClientBridge {
212
211
  if (this.host) {
213
212
  this.startServer();
214
213
  }
215
- return await super.startHandler();
214
+ await super.startHandler();
216
215
  }
217
216
  async stopHandler() {
218
217
  if (this.host) {
219
218
  await this.stopServer();
220
219
  }
221
- return await super.stopHandler();
220
+ await super.stopHandler();
222
221
  }
223
222
  startServer() {
224
223
  if (this.httpServer) {
@@ -249,7 +248,7 @@ var WebsocketBridge = class extends WebsocketClientBridge {
249
248
  }
250
249
  };
251
250
  WebsocketBridge = __decorateClass([
252
- creatableModule2()
251
+ creatableModule3()
253
252
  ], WebsocketBridge);
254
253
  export {
255
254
  BridgeCommands,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Bridge.ts","../../src/ClientBridge.ts","../../src/Config.ts","../../src/WebsocketBridgeModuleResolver.ts","../../src/ModuleProxy/ModuleProxy.ts"],"sourcesContent":["import { createServer as createHttpServer, Server as HttpServer } from 'node:http'\n\nimport { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { BridgeExposeOptions, BridgeModule } from '@xyo-network/bridge-model'\nimport {\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 protected static defaultFailureRetryTime = 1000 * 60\n protected static defaultMaxConnections = 4\n protected static defaultMaxPayloadSizeWarning = 256 * 256\n protected 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 protected 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"]}
1
+ {"version":3,"sources":["../../src/Bridge.ts","../../src/ClientBridge.ts","../../src/Config.ts","../../src/WebsocketBridgeModuleResolver.ts","../../src/ModuleProxy/ModuleProxy.ts"],"sourcesContent":["import { createServer as createHttpServer, Server as HttpServer } from 'node:http'\n\nimport { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { BridgeExposeOptions, BridgeModule } from '@xyo-network/bridge-model'\nimport {\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() {\n if (this.host) {\n this.startServer()\n }\n await super.startHandler()\n }\n\n override async stopHandler() {\n if (this.host) {\n await this.stopServer()\n }\n 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 protected static defaultFailureRetryTime = 1000 * 60\n protected static defaultMaxConnections = 4\n protected static defaultMaxPayloadSizeWarning = 256 * 256\n protected 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 name: 'WebsocketBridgeModuleResolver',\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 = await WebsocketModuleProxy.create(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 {\n creatableModule, type ModuleInstance, type ModuleQueryResult,\n} 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\n@creatableModule()\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 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","creatableModule","assertEx","creatableModule","assertEx","creatableModule"]}
@@ -18,7 +18,7 @@ var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
18
18
  import { createServer as createHttpServer } from "http";
19
19
  import { assertEx as assertEx3 } from "@xylabs/assert";
20
20
  import {
21
- creatableModule as creatableModule2
21
+ creatableModule as creatableModule3
22
22
  } from "@xyo-network/module-model";
23
23
  import { Server } from "socket.io";
24
24
 
@@ -26,7 +26,7 @@ import { Server } from "socket.io";
26
26
  import { assertEx as assertEx2 } from "@xylabs/assert";
27
27
  import { AbstractBridge } from "@xyo-network/bridge-abstract";
28
28
  import {
29
- creatableModule
29
+ creatableModule as creatableModule2
30
30
  } from "@xyo-network/module-model";
31
31
  import { Semaphore } from "async-mutex";
32
32
  import { LRUCache } from "lru-cache";
@@ -48,19 +48,17 @@ import {
48
48
 
49
49
  // src/ModuleProxy/ModuleProxy.ts
50
50
  import { AbstractModuleProxy } from "@xyo-network/bridge-abstract";
51
- var WebsocketModuleProxy = class _WebsocketModuleProxy extends AbstractModuleProxy {
52
- static createCount = 0;
53
- constructor(params) {
54
- _WebsocketModuleProxy.createCount = _WebsocketModuleProxy.createCount + 1;
55
- if (Math.floor(_WebsocketModuleProxy.createCount / 10) === _WebsocketModuleProxy.createCount / 10) {
56
- console.log(`WebsocketModuleProxy.createCount: ${_WebsocketModuleProxy.createCount}`);
57
- }
58
- super(params);
59
- }
51
+ import {
52
+ creatableModule
53
+ } from "@xyo-network/module-model";
54
+ var WebsocketModuleProxy = class extends AbstractModuleProxy {
60
55
  async proxyQueryHandler(query, payloads = []) {
61
56
  return await this.params.querySender.sendBridgeQuery(this.params.moduleAddress, query, payloads);
62
57
  }
63
58
  };
59
+ WebsocketModuleProxy = __decorateClass([
60
+ creatableModule()
61
+ ], WebsocketModuleProxy);
64
62
 
65
63
  // src/WebsocketBridgeModuleResolver.ts
66
64
  var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
@@ -82,6 +80,7 @@ var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
82
80
  assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`);
83
81
  const remainderParts = idParts.join(":");
84
82
  const params = {
83
+ name: "WebsocketBridgeModuleResolver",
85
84
  account: await Account.random(),
86
85
  config: { schema: ModuleConfigSchema },
87
86
  host: this,
@@ -89,7 +88,7 @@ var WebsocketBridgeModuleResolver = class extends AbstractBridgeModuleResolver {
89
88
  querySender: this.querySender
90
89
  };
91
90
  this.logger?.debug(`creating HttpProxy [${moduleAddress}] ${id}`);
92
- const proxy = new WebsocketModuleProxy(params);
91
+ const proxy = await WebsocketModuleProxy.create(params);
93
92
  if (proxy) {
94
93
  const state = await proxy.state();
95
94
  if (state) {
@@ -187,7 +186,7 @@ __publicField(WebsocketClientBridge, "defaultMaxConnections", 4);
187
186
  __publicField(WebsocketClientBridge, "defaultMaxPayloadSizeWarning", 256 * 256);
188
187
  __publicField(WebsocketClientBridge, "maxFailureCacheSize", 1e3);
189
188
  WebsocketClientBridge = __decorateClass([
190
- creatableModule()
189
+ creatableModule2()
191
190
  ], WebsocketClientBridge);
192
191
 
193
192
  // src/Bridge.ts
@@ -212,13 +211,13 @@ var WebsocketBridge = class extends WebsocketClientBridge {
212
211
  if (this.host) {
213
212
  this.startServer();
214
213
  }
215
- return await super.startHandler();
214
+ await super.startHandler();
216
215
  }
217
216
  async stopHandler() {
218
217
  if (this.host) {
219
218
  await this.stopServer();
220
219
  }
221
- return await super.stopHandler();
220
+ await super.stopHandler();
222
221
  }
223
222
  startServer() {
224
223
  if (this.httpServer) {
@@ -249,7 +248,7 @@ var WebsocketBridge = class extends WebsocketClientBridge {
249
248
  }
250
249
  };
251
250
  WebsocketBridge = __decorateClass([
252
- creatableModule2()
251
+ creatableModule3()
253
252
  ], WebsocketBridge);
254
253
  export {
255
254
  BridgeCommands,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Bridge.ts","../../src/ClientBridge.ts","../../src/Config.ts","../../src/WebsocketBridgeModuleResolver.ts","../../src/ModuleProxy/ModuleProxy.ts"],"sourcesContent":["import { createServer as createHttpServer, Server as HttpServer } from 'node:http'\n\nimport { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { BridgeExposeOptions, BridgeModule } from '@xyo-network/bridge-model'\nimport {\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 protected static defaultFailureRetryTime = 1000 * 60\n protected static defaultMaxConnections = 4\n protected static defaultMaxPayloadSizeWarning = 256 * 256\n protected 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 protected 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"]}
1
+ {"version":3,"sources":["../../src/Bridge.ts","../../src/ClientBridge.ts","../../src/Config.ts","../../src/WebsocketBridgeModuleResolver.ts","../../src/ModuleProxy/ModuleProxy.ts"],"sourcesContent":["import { createServer as createHttpServer, Server as HttpServer } from 'node:http'\n\nimport { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { BridgeExposeOptions, BridgeModule } from '@xyo-network/bridge-model'\nimport {\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() {\n if (this.host) {\n this.startServer()\n }\n await super.startHandler()\n }\n\n override async stopHandler() {\n if (this.host) {\n await this.stopServer()\n }\n 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 protected static defaultFailureRetryTime = 1000 * 60\n protected static defaultMaxConnections = 4\n protected static defaultMaxPayloadSizeWarning = 256 * 256\n protected 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 name: 'WebsocketBridgeModuleResolver',\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 = await WebsocketModuleProxy.create(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 {\n creatableModule, type ModuleInstance, type ModuleQueryResult,\n} 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\n@creatableModule()\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 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","creatableModule","assertEx","creatableModule","assertEx","creatableModule"]}
@@ -19,8 +19,8 @@ export declare class WebsocketBridge<TParams extends WebsocketBridgeParams<AnyCo
19
19
  }) | undefined;
20
20
  exposeHandler(_id: string, _options?: BridgeExposeOptions | undefined): Promisable<ModuleInstance[]>;
21
21
  exposedHandler(): Promisable<Address[]>;
22
- startHandler(): Promise<boolean>;
23
- stopHandler(): Promise<boolean>;
22
+ startHandler(): Promise<void>;
23
+ stopHandler(): Promise<void>;
24
24
  private startServer;
25
25
  private stopServer;
26
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Bridge.d.ts","sourceRoot":"","sources":["../../src/Bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAA;AAGlF,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7E,OAAO,EACL,eAAe,EAAmB,cAAc,EACjD,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,MAAM,EAAU,MAAM,WAAW,CAAA;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAEnD,eAAO,MAAM,cAAc;;;CAG1B,CAAA;AAID,qBACa,eAAe,CAC1B,OAAO,SAAS,qBAAqB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,GAAG,qBAAqB,CAAC,qBAAqB,CAAC,CAE5H,SAAQ,qBAAqB,CAAC,OAAO,CACrC,YAAW,YAAY,CAAC,OAAO,CAAC;IAChC,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,IAAI,IAAI;;mBAEP;IAEQ,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,mBAAmB,GAAG,SAAS,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC;IAIpG,cAAc,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;IAIjC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAOhC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAO9C,OAAO,CAAC,WAAW;YAwBL,UAAU;CAMzB"}
1
+ {"version":3,"file":"Bridge.d.ts","sourceRoot":"","sources":["../../src/Bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAA;AAGlF,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7E,OAAO,EACL,eAAe,EAAmB,cAAc,EACjD,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,MAAM,EAAU,MAAM,WAAW,CAAA;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAEnD,eAAO,MAAM,cAAc;;;CAG1B,CAAA;AAID,qBACa,eAAe,CAC1B,OAAO,SAAS,qBAAqB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,GAAG,qBAAqB,CAAC,qBAAqB,CAAC,CAE5H,SAAQ,qBAAqB,CAAC,OAAO,CACrC,YAAW,YAAY,CAAC,OAAO,CAAC;IAChC,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,IAAI,IAAI;;mBAEP;IAEQ,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,mBAAmB,GAAG,SAAS,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC;IAIpG,cAAc,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;IAIjC,YAAY;IAOZ,WAAW;IAO1B,OAAO,CAAC,WAAW;YAwBL,UAAU;CAMzB"}
@@ -2,7 +2,7 @@ import type { Address } from '@xylabs/hex';
2
2
  import type { QueryBoundWitness } from '@xyo-network/boundwitness-model';
3
3
  import type { ModuleProxyParams } from '@xyo-network/bridge-abstract';
4
4
  import { AbstractModuleProxy } from '@xyo-network/bridge-abstract';
5
- import type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model';
5
+ import { type ModuleInstance, type ModuleQueryResult } from '@xyo-network/module-model';
6
6
  import type { Payload } from '@xyo-network/payload-model';
7
7
  export interface WebsocketBridgeQuerySender {
8
8
  sendBridgeQuery: <TOut extends Payload = Payload, TQuery extends QueryBoundWitness = QueryBoundWitness, TIn extends Payload = Payload>(targetAddress: Address, query: TQuery, payloads?: TIn[]) => Promise<ModuleQueryResult<TOut>>;
@@ -15,8 +15,6 @@ export declare class WebsocketModuleProxy<TWrappedModule extends ModuleInstance
15
15
  } = Omit<WebsocketModuleProxyParams, 'config'> & {
16
16
  config: TWrappedModule['config'];
17
17
  }> extends AbstractModuleProxy<TWrappedModule, TParams> implements ModuleInstance<TParams, TWrappedModule['eventData']> {
18
- protected static createCount: number;
19
- constructor(params: TParams);
20
18
  proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads?: Payload[]): Promise<ModuleQueryResult>;
21
19
  }
22
20
  //# sourceMappingURL=ModuleProxy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ModuleProxy.d.ts","sourceRoot":"","sources":["../../../src/ModuleProxy/ModuleProxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAClF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAEzD,MAAM,WAAW,0BAA0B;IACzC,eAAe,EAAE,CAAC,IAAI,SAAS,OAAO,GAAG,OAAO,EAAE,MAAM,SAAS,iBAAiB,GAAG,iBAAiB,EAAE,GAAG,SAAS,OAAO,GAAG,OAAO,EACnI,aAAa,EAAE,OAAO,EACtB,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,GAAG,EAAE,KACb,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAA;CACtC;AAED,MAAM,MAAM,0BAA0B,GAAG,iBAAiB,GAAG;IAC3D,WAAW,EAAE,0BAA0B,CAAA;CACxC,CAAA;AAED,qBAAa,oBAAoB,CAC/B,cAAc,SAAS,cAAc,GAAG,cAAc,EACtD,OAAO,SAAS,IAAI,CAAC,0BAA0B,EAAE,QAAQ,CAAC,GAAG;IAAE,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAA;CAAE,GAAG,IAAI,CAAC,0BAA0B,EAAE,QAAQ,CAAC,GAAG;IAC/I,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAA;CACjC,CAED,SAAQ,mBAAmB,CAAC,cAAc,EAAE,OAAO,CACnD,YAAW,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;IAC/D,SAAS,CAAC,MAAM,CAAC,WAAW,SAAI;gBAEpB,MAAM,EAAE,OAAO;IAQrB,iBAAiB,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAGzI"}
1
+ {"version":3,"file":"ModuleProxy.d.ts","sourceRoot":"","sources":["../../../src/ModuleProxy/ModuleProxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,EACY,KAAK,cAAc,EAAE,KAAK,iBAAiB,EAC7D,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAEzD,MAAM,WAAW,0BAA0B;IACzC,eAAe,EAAE,CAAC,IAAI,SAAS,OAAO,GAAG,OAAO,EAAE,MAAM,SAAS,iBAAiB,GAAG,iBAAiB,EAAE,GAAG,SAAS,OAAO,GAAG,OAAO,EACnI,aAAa,EAAE,OAAO,EACtB,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,GAAG,EAAE,KACb,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAA;CACtC;AAED,MAAM,MAAM,0BAA0B,GAAG,iBAAiB,GAAG;IAC3D,WAAW,EAAE,0BAA0B,CAAA;CACxC,CAAA;AAED,qBACa,oBAAoB,CAC/B,cAAc,SAAS,cAAc,GAAG,cAAc,EACtD,OAAO,SAAS,IAAI,CAAC,0BAA0B,EAAE,QAAQ,CAAC,GAAG;IAAE,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAA;CAAE,GAAG,IAAI,CAAC,0BAA0B,EAAE,QAAQ,CAAC,GAAG;IAC/I,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAA;CACjC,CAED,SAAQ,mBAAmB,CAAC,cAAc,EAAE,OAAO,CACnD,YAAW,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;IACzD,iBAAiB,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAGzI"}
@@ -1 +1 @@
1
- {"version":3,"file":"Params.d.ts","sourceRoot":"","sources":["../../src/Params.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAEhE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAExD,MAAM,MAAM,qBAAqB,CAAC,OAAO,SAAS,eAAe,CAAC,qBAAqB,CAAC,GAAG,eAAe,CAAC,qBAAqB,CAAC,IAC/H,YAAY,CAAC,OAAO,CAAC,CAAA"}
1
+ {"version":3,"file":"Params.d.ts","sourceRoot":"","sources":["../../src/Params.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAEhE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAExD,MAAM,MAAM,qBAAqB,CAAC,OAAO,SAAS,eAAe,CAAC,qBAAqB,CAAC,GAAG,eAAe,CAAC,qBAAqB,CAAC,IAC7H,YAAY,CAAC,OAAO,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"WebsocketBridgeModuleResolver.d.ts","sourceRoot":"","sources":["../../src/WebsocketBridgeModuleResolver.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAA;AAC9E,OAAO,EAAE,4BAA4B,EAAsB,MAAM,8BAA8B,CAAA;AAG/F,OAAO,KAAK,EAEV,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EACf,MAAM,2BAA2B,CAAA;AAOlC,OAAO,KAAK,EAAE,0BAA0B,EAA8B,MAAM,wBAAwB,CAAA;AAGpG,MAAM,WAAW,mCAAoC,SAAQ,0BAA0B;IACrF,WAAW,EAAE,0BAA0B,CAAA;CACxC;AAED,qBAAa,6BAA6B,CACxC,CAAC,SAAS,mCAAmC,GAAG,mCAAmC,CACnF,SAAQ,4BAA4B,CAAC,CAAC,CAAC;IACvC,IAAI,WAAW,+BAEd;IAEc,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;CAqD/I"}
1
+ {"version":3,"file":"WebsocketBridgeModuleResolver.d.ts","sourceRoot":"","sources":["../../src/WebsocketBridgeModuleResolver.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAA;AAC9E,OAAO,EAAE,4BAA4B,EAAsB,MAAM,8BAA8B,CAAA;AAG/F,OAAO,KAAK,EAEV,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EACf,MAAM,2BAA2B,CAAA;AAOlC,OAAO,KAAK,EAAE,0BAA0B,EAA8B,MAAM,wBAAwB,CAAA;AAGpG,MAAM,WAAW,mCAAoC,SAAQ,0BAA0B;IACrF,WAAW,EAAE,0BAA0B,CAAA;CACxC;AAED,qBAAa,6BAA6B,CACxC,CAAC,SAAS,mCAAmC,GAAG,mCAAmC,CACnF,SAAQ,4BAA4B,CAAC,CAAC,CAAC;IACvC,IAAI,WAAW,+BAEd;IAEc,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;CAsD/I"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/bridge-websocket",
3
- "version": "3.18.10",
3
+ "version": "4.0.1",
4
4
  "description": "Primary SDK for using XYO Protocol 2.0",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -37,34 +37,34 @@
37
37
  "module": "dist/neutral/index.mjs",
38
38
  "types": "dist/types/index.d.ts",
39
39
  "dependencies": {
40
- "@xylabs/assert": "^4.11.21",
41
- "@xylabs/hex": "^4.11.21",
42
- "@xylabs/object": "^4.11.21",
43
- "@xylabs/promise": "^4.11.21",
44
- "@xyo-network/account": "^3.18.10",
45
- "@xyo-network/boundwitness-model": "^3.18.10",
46
- "@xyo-network/bridge-abstract": "^3.18.10",
47
- "@xyo-network/bridge-model": "^3.18.10",
48
- "@xyo-network/config-payload-plugin": "^3.18.10",
49
- "@xyo-network/module-model": "^3.18.10",
50
- "@xyo-network/payload-model": "^3.18.10",
40
+ "@xylabs/assert": "^4.12.30",
41
+ "@xylabs/hex": "^4.12.30",
42
+ "@xylabs/object": "^4.12.30",
43
+ "@xylabs/promise": "^4.12.30",
44
+ "@xyo-network/account": "^4.0.1",
45
+ "@xyo-network/boundwitness-model": "^4.0.1",
46
+ "@xyo-network/bridge-abstract": "^4.0.1",
47
+ "@xyo-network/bridge-model": "^4.0.1",
48
+ "@xyo-network/config-payload-plugin": "^4.0.1",
49
+ "@xyo-network/module-model": "^4.0.1",
50
+ "@xyo-network/payload-model": "^4.0.1",
51
51
  "async-mutex": "^0.5.0",
52
52
  "lru-cache": "^11.1.0",
53
53
  "socket.io": "^4.8.1"
54
54
  },
55
55
  "devDependencies": {
56
- "@xylabs/ts-scripts-yarn3": "^6.5.8",
57
- "@xylabs/tsconfig": "^6.5.8",
58
- "@xylabs/vitest-extended": "^4.11.21",
59
- "@xyo-network/account": "^3.18.10",
60
- "@xyo-network/archivist-model": "^3.18.10",
61
- "@xyo-network/node-memory": "^3.18.10",
62
- "@xyo-network/node-model": "^3.18.10",
63
- "@xyo-network/payload-builder": "^3.18.10",
64
- "@xyo-network/payload-wrapper": "^3.18.10",
56
+ "@xylabs/ts-scripts-yarn3": "^6.5.12",
57
+ "@xylabs/tsconfig": "^6.5.12",
58
+ "@xylabs/vitest-extended": "^4.12.30",
59
+ "@xyo-network/account": "^4.0.1",
60
+ "@xyo-network/archivist-model": "^4.0.1",
61
+ "@xyo-network/node-memory": "^4.0.1",
62
+ "@xyo-network/node-model": "^4.0.1",
63
+ "@xyo-network/payload-builder": "^4.0.1",
64
+ "@xyo-network/payload-wrapper": "^4.0.1",
65
65
  "socket.io-client": "^4.8.1",
66
66
  "typescript": "^5.8.3",
67
- "vitest": "^3.2.3"
67
+ "vitest": "^3.2.4"
68
68
  },
69
69
  "publishConfig": {
70
70
  "access": "public"
package/src/Bridge.ts CHANGED
@@ -42,18 +42,18 @@ export class WebsocketBridge<
42
42
  throw new Error('Unsupported')
43
43
  }
44
44
 
45
- override async startHandler(): Promise<boolean> {
45
+ override async startHandler() {
46
46
  if (this.host) {
47
47
  this.startServer()
48
48
  }
49
- return await super.startHandler()
49
+ await super.startHandler()
50
50
  }
51
51
 
52
- override async stopHandler(): Promise<boolean> {
52
+ override async stopHandler() {
53
53
  if (this.host) {
54
54
  await this.stopServer()
55
55
  }
56
- return await super.stopHandler()
56
+ await super.stopHandler()
57
57
  }
58
58
 
59
59
  private startServer() {
@@ -2,7 +2,9 @@ import type { Address } from '@xylabs/hex'
2
2
  import type { QueryBoundWitness } from '@xyo-network/boundwitness-model'
3
3
  import type { ModuleProxyParams } from '@xyo-network/bridge-abstract'
4
4
  import { AbstractModuleProxy } from '@xyo-network/bridge-abstract'
5
- import type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'
5
+ import {
6
+ creatableModule, type ModuleInstance, type ModuleQueryResult,
7
+ } from '@xyo-network/module-model'
6
8
  import type { Payload } from '@xyo-network/payload-model'
7
9
 
8
10
  export interface WebsocketBridgeQuerySender {
@@ -17,6 +19,7 @@ export type WebsocketModuleProxyParams = ModuleProxyParams & {
17
19
  querySender: WebsocketBridgeQuerySender
18
20
  }
19
21
 
22
+ @creatableModule()
20
23
  export class WebsocketModuleProxy<
21
24
  TWrappedModule extends ModuleInstance = ModuleInstance,
22
25
  TParams extends Omit<WebsocketModuleProxyParams, 'config'> & { config: TWrappedModule['config'] } = Omit<WebsocketModuleProxyParams, 'config'> & {
@@ -25,16 +28,6 @@ export class WebsocketModuleProxy<
25
28
  >
26
29
  extends AbstractModuleProxy<TWrappedModule, TParams>
27
30
  implements ModuleInstance<TParams, TWrappedModule['eventData']> {
28
- protected static createCount = 0
29
-
30
- constructor(params: TParams) {
31
- WebsocketModuleProxy.createCount = WebsocketModuleProxy.createCount + 1
32
- if (Math.floor(WebsocketModuleProxy.createCount / 10) === WebsocketModuleProxy.createCount / 10) {
33
- console.log(`WebsocketModuleProxy.createCount: ${WebsocketModuleProxy.createCount}`)
34
- }
35
- super(params)
36
- }
37
-
38
31
  async proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads: Payload[] = []): Promise<ModuleQueryResult> {
39
32
  return await this.params.querySender.sendBridgeQuery(this.params.moduleAddress, query, payloads)
40
33
  }
package/src/Params.ts CHANGED
@@ -3,5 +3,5 @@ import type { AnyConfigSchema } from '@xyo-network/module-model'
3
3
 
4
4
  import type { WebsocketBridgeConfig } from './Config.ts'
5
5
 
6
- export type WebsocketBridgeParams<TConfig extends AnyConfigSchema<WebsocketBridgeConfig> = AnyConfigSchema<WebsocketBridgeConfig>> =
7
- BridgeParams<TConfig>
6
+ export type WebsocketBridgeParams<TConfig extends AnyConfigSchema<WebsocketBridgeConfig> = AnyConfigSchema<WebsocketBridgeConfig>>
7
+ = BridgeParams<TConfig>
@@ -47,6 +47,7 @@ export class WebsocketBridgeModuleResolver<
47
47
  assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`)
48
48
  const remainderParts = idParts.join(':')
49
49
  const params: WebsocketModuleProxyParams = {
50
+ name: 'WebsocketBridgeModuleResolver',
50
51
  account: await Account.random(),
51
52
  config: { schema: ModuleConfigSchema },
52
53
  host: this,
@@ -56,7 +57,7 @@ export class WebsocketBridgeModuleResolver<
56
57
 
57
58
  this.logger?.debug(`creating HttpProxy [${moduleAddress}] ${id}`)
58
59
 
59
- const proxy = new WebsocketModuleProxy<T, WebsocketModuleProxyParams>(params)
60
+ const proxy = await WebsocketModuleProxy.create(params)
60
61
  // calling state here to get the config
61
62
  if (proxy) {
62
63
  const state = await proxy.state()