@xyo-network/bridge-websocket 2.99.1 → 2.99.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/dist/browser/Bridge.d.cts +19 -14
  2. package/dist/browser/Bridge.d.cts.map +1 -1
  3. package/dist/browser/Bridge.d.mts +19 -14
  4. package/dist/browser/Bridge.d.mts.map +1 -1
  5. package/dist/browser/Bridge.d.ts +19 -14
  6. package/dist/browser/Bridge.d.ts.map +1 -1
  7. package/dist/browser/ClientBridge.d.cts +42 -0
  8. package/dist/browser/ClientBridge.d.cts.map +1 -0
  9. package/dist/browser/ClientBridge.d.mts +42 -0
  10. package/dist/browser/ClientBridge.d.mts.map +1 -0
  11. package/dist/browser/ClientBridge.d.ts +42 -0
  12. package/dist/browser/ClientBridge.d.ts.map +1 -0
  13. package/dist/browser/Config.d.cts +9 -4
  14. package/dist/browser/Config.d.cts.map +1 -1
  15. package/dist/browser/Config.d.mts +9 -4
  16. package/dist/browser/Config.d.mts.map +1 -1
  17. package/dist/browser/Config.d.ts +9 -4
  18. package/dist/browser/Config.d.ts.map +1 -1
  19. package/dist/browser/ModuleProxy/ModuleProxy.d.cts +7 -4
  20. package/dist/browser/ModuleProxy/ModuleProxy.d.cts.map +1 -1
  21. package/dist/browser/ModuleProxy/ModuleProxy.d.mts +7 -4
  22. package/dist/browser/ModuleProxy/ModuleProxy.d.mts.map +1 -1
  23. package/dist/browser/ModuleProxy/ModuleProxy.d.ts +7 -4
  24. package/dist/browser/ModuleProxy/ModuleProxy.d.ts.map +1 -1
  25. package/dist/browser/Params.d.cts +5 -0
  26. package/dist/browser/Params.d.cts.map +1 -0
  27. package/dist/browser/Params.d.mts +5 -0
  28. package/dist/browser/Params.d.mts.map +1 -0
  29. package/dist/browser/Params.d.ts +5 -0
  30. package/dist/browser/Params.d.ts.map +1 -0
  31. package/dist/browser/{ModuleResolver.d.cts → WebsocketBridgeModuleResolver.d.cts} +6 -6
  32. package/dist/browser/WebsocketBridgeModuleResolver.d.cts.map +1 -0
  33. package/dist/browser/{ModuleResolver.d.ts → WebsocketBridgeModuleResolver.d.mts} +6 -6
  34. package/dist/browser/WebsocketBridgeModuleResolver.d.mts.map +1 -0
  35. package/dist/browser/{ModuleResolver.d.mts → WebsocketBridgeModuleResolver.d.ts} +6 -6
  36. package/dist/browser/WebsocketBridgeModuleResolver.d.ts.map +1 -0
  37. package/dist/browser/{index.cjs → index-browser.cjs} +88 -35
  38. package/dist/browser/index-browser.cjs.map +1 -0
  39. package/dist/browser/index-browser.d.cts +5 -0
  40. package/dist/browser/index-browser.d.cts.map +1 -0
  41. package/dist/browser/index-browser.d.mts +5 -0
  42. package/dist/browser/index-browser.d.mts.map +1 -0
  43. package/dist/browser/index-browser.d.ts +5 -0
  44. package/dist/browser/index-browser.d.ts.map +1 -0
  45. package/dist/browser/{index.js → index-browser.js} +85 -32
  46. package/dist/browser/index-browser.js.map +1 -0
  47. package/dist/neutral/Bridge.d.cts +28 -0
  48. package/dist/neutral/Bridge.d.cts.map +1 -0
  49. package/dist/neutral/Bridge.d.mts +28 -0
  50. package/dist/neutral/Bridge.d.mts.map +1 -0
  51. package/dist/neutral/Bridge.d.ts +28 -0
  52. package/dist/neutral/Bridge.d.ts.map +1 -0
  53. package/dist/neutral/ClientBridge.d.cts +42 -0
  54. package/dist/neutral/ClientBridge.d.cts.map +1 -0
  55. package/dist/neutral/ClientBridge.d.mts +42 -0
  56. package/dist/neutral/ClientBridge.d.mts.map +1 -0
  57. package/dist/neutral/ClientBridge.d.ts +42 -0
  58. package/dist/neutral/ClientBridge.d.ts.map +1 -0
  59. package/dist/neutral/Config.d.cts +17 -0
  60. package/dist/neutral/Config.d.cts.map +1 -0
  61. package/dist/neutral/Config.d.mts +17 -0
  62. package/dist/neutral/Config.d.mts.map +1 -0
  63. package/dist/neutral/Config.d.ts +17 -0
  64. package/dist/neutral/Config.d.ts.map +1 -0
  65. package/dist/neutral/ModuleProxy/ModuleProxy.d.cts +21 -0
  66. package/dist/neutral/ModuleProxy/ModuleProxy.d.cts.map +1 -0
  67. package/dist/neutral/ModuleProxy/ModuleProxy.d.mts +21 -0
  68. package/dist/neutral/ModuleProxy/ModuleProxy.d.mts.map +1 -0
  69. package/dist/neutral/ModuleProxy/ModuleProxy.d.ts +21 -0
  70. package/dist/neutral/ModuleProxy/ModuleProxy.d.ts.map +1 -0
  71. package/dist/neutral/ModuleProxy/index.d.cts +2 -0
  72. package/dist/neutral/ModuleProxy/index.d.cts.map +1 -0
  73. package/dist/neutral/ModuleProxy/index.d.mts +2 -0
  74. package/dist/neutral/ModuleProxy/index.d.mts.map +1 -0
  75. package/dist/neutral/ModuleProxy/index.d.ts +2 -0
  76. package/dist/neutral/ModuleProxy/index.d.ts.map +1 -0
  77. package/dist/neutral/Params.d.cts +5 -0
  78. package/dist/neutral/Params.d.cts.map +1 -0
  79. package/dist/neutral/Params.d.mts +5 -0
  80. package/dist/neutral/Params.d.mts.map +1 -0
  81. package/dist/neutral/Params.d.ts +5 -0
  82. package/dist/neutral/Params.d.ts.map +1 -0
  83. package/dist/{node/ModuleResolver.d.cts → neutral/WebsocketBridgeModuleResolver.d.cts} +6 -6
  84. package/dist/neutral/WebsocketBridgeModuleResolver.d.cts.map +1 -0
  85. package/dist/neutral/WebsocketBridgeModuleResolver.d.mts +11 -0
  86. package/dist/neutral/WebsocketBridgeModuleResolver.d.mts.map +1 -0
  87. package/dist/neutral/WebsocketBridgeModuleResolver.d.ts +11 -0
  88. package/dist/neutral/WebsocketBridgeModuleResolver.d.ts.map +1 -0
  89. package/dist/neutral/index-browser.d.cts +5 -0
  90. package/dist/neutral/index-browser.d.cts.map +1 -0
  91. package/dist/neutral/index-browser.d.mts +5 -0
  92. package/dist/neutral/index-browser.d.mts.map +1 -0
  93. package/dist/neutral/index-browser.d.ts +5 -0
  94. package/dist/neutral/index-browser.d.ts.map +1 -0
  95. package/dist/neutral/index.cjs +304 -0
  96. package/dist/neutral/index.cjs.map +1 -0
  97. package/dist/neutral/index.d.cts +3 -0
  98. package/dist/neutral/index.d.cts.map +1 -0
  99. package/dist/neutral/index.d.mts +3 -0
  100. package/dist/neutral/index.d.mts.map +1 -0
  101. package/dist/neutral/index.d.ts +3 -0
  102. package/dist/neutral/index.d.ts.map +1 -0
  103. package/dist/neutral/index.js +283 -0
  104. package/dist/neutral/index.js.map +1 -0
  105. package/dist/neutral/socketServer.d.cts +10 -0
  106. package/dist/neutral/socketServer.d.cts.map +1 -0
  107. package/dist/neutral/socketServer.d.mts +10 -0
  108. package/dist/neutral/socketServer.d.mts.map +1 -0
  109. package/dist/neutral/socketServer.d.ts +10 -0
  110. package/dist/neutral/socketServer.d.ts.map +1 -0
  111. package/dist/node/Bridge.d.cts +19 -14
  112. package/dist/node/Bridge.d.cts.map +1 -1
  113. package/dist/node/Bridge.d.mts +19 -14
  114. package/dist/node/Bridge.d.mts.map +1 -1
  115. package/dist/node/Bridge.d.ts +19 -14
  116. package/dist/node/Bridge.d.ts.map +1 -1
  117. package/dist/node/ClientBridge.d.cts +42 -0
  118. package/dist/node/ClientBridge.d.cts.map +1 -0
  119. package/dist/node/ClientBridge.d.mts +42 -0
  120. package/dist/node/ClientBridge.d.mts.map +1 -0
  121. package/dist/node/ClientBridge.d.ts +42 -0
  122. package/dist/node/ClientBridge.d.ts.map +1 -0
  123. package/dist/node/Config.d.cts +9 -4
  124. package/dist/node/Config.d.cts.map +1 -1
  125. package/dist/node/Config.d.mts +9 -4
  126. package/dist/node/Config.d.mts.map +1 -1
  127. package/dist/node/Config.d.ts +9 -4
  128. package/dist/node/Config.d.ts.map +1 -1
  129. package/dist/node/ModuleProxy/ModuleProxy.d.cts +7 -4
  130. package/dist/node/ModuleProxy/ModuleProxy.d.cts.map +1 -1
  131. package/dist/node/ModuleProxy/ModuleProxy.d.mts +7 -4
  132. package/dist/node/ModuleProxy/ModuleProxy.d.mts.map +1 -1
  133. package/dist/node/ModuleProxy/ModuleProxy.d.ts +7 -4
  134. package/dist/node/ModuleProxy/ModuleProxy.d.ts.map +1 -1
  135. package/dist/node/Params.d.cts +5 -0
  136. package/dist/node/Params.d.cts.map +1 -0
  137. package/dist/node/Params.d.mts +5 -0
  138. package/dist/node/Params.d.mts.map +1 -0
  139. package/dist/node/Params.d.ts +5 -0
  140. package/dist/node/Params.d.ts.map +1 -0
  141. package/dist/node/WebsocketBridgeModuleResolver.d.cts +11 -0
  142. package/dist/node/WebsocketBridgeModuleResolver.d.cts.map +1 -0
  143. package/dist/node/WebsocketBridgeModuleResolver.d.mts +11 -0
  144. package/dist/node/WebsocketBridgeModuleResolver.d.mts.map +1 -0
  145. package/dist/node/WebsocketBridgeModuleResolver.d.ts +11 -0
  146. package/dist/node/WebsocketBridgeModuleResolver.d.ts.map +1 -0
  147. package/dist/node/index-browser.d.cts +5 -0
  148. package/dist/node/index-browser.d.cts.map +1 -0
  149. package/dist/node/index-browser.d.mts +5 -0
  150. package/dist/node/index-browser.d.mts.map +1 -0
  151. package/dist/node/index-browser.d.ts +5 -0
  152. package/dist/node/index-browser.d.ts.map +1 -0
  153. package/dist/node/index.cjs +167 -34
  154. package/dist/node/index.cjs.map +1 -1
  155. package/dist/node/index.js +167 -35
  156. package/dist/node/index.js.map +1 -1
  157. package/package.json +27 -26
  158. package/src/Bridge.ts +63 -30
  159. package/src/ClientBridge.ts +113 -0
  160. package/src/Config.ts +11 -4
  161. package/src/ModuleProxy/ModuleProxy.ts +21 -13
  162. package/src/Params.ts +7 -0
  163. package/src/{ModuleResolver.ts → WebsocketBridgeModuleResolver.ts} +23 -14
  164. package/src/index-browser.ts +4 -0
  165. package/xy.config.ts +14 -0
  166. package/dist/browser/ModuleResolver.d.cts.map +0 -1
  167. package/dist/browser/ModuleResolver.d.mts.map +0 -1
  168. package/dist/browser/ModuleResolver.d.ts.map +0 -1
  169. package/dist/browser/index.cjs.map +0 -1
  170. package/dist/browser/index.js.map +0 -1
  171. package/dist/node/ModuleResolver.d.cts.map +0 -1
  172. package/dist/node/ModuleResolver.d.mts +0 -11
  173. package/dist/node/ModuleResolver.d.mts.map +0 -1
  174. package/dist/node/ModuleResolver.d.ts +0 -11
  175. package/dist/node/ModuleResolver.d.ts.map +0 -1
  176. package/src/spec/socketServer.ts +0 -68
@@ -0,0 +1,113 @@
1
+ import { assertEx } from '@xylabs/assert'
2
+ import { Address } from '@xylabs/hex'
3
+ import { Promisable } from '@xylabs/promise'
4
+ import { AbstractBridge } from '@xyo-network/abstract-bridge'
5
+ import { QueryBoundWitness } from '@xyo-network/boundwitness-model'
6
+ import { BridgeExposeOptions, BridgeModule, BridgeUnexposeOptions } from '@xyo-network/bridge-model'
7
+ import { creatableModule, ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'
8
+ import { Payload, Schema } from '@xyo-network/payload-model'
9
+ import { Semaphore } from 'async-mutex'
10
+ import { LRUCache } from 'lru-cache'
11
+
12
+ import { WebsocketBridgeConfigSchema } from './Config'
13
+ import { WebsocketBridgeQuerySender } from './ModuleProxy'
14
+ import { WebsocketBridgeParams } from './Params'
15
+ import { WebsocketBridgeModuleResolver } from './WebsocketBridgeModuleResolver'
16
+
17
+ @creatableModule()
18
+ export class WebsocketClientBridge<TParams extends WebsocketBridgeParams = WebsocketBridgeParams>
19
+ extends AbstractBridge<TParams>
20
+ implements BridgeModule<TParams>, WebsocketBridgeQuerySender
21
+ {
22
+ static override readonly configSchemas: Schema[] = [...super.configSchemas, WebsocketBridgeConfigSchema]
23
+ static override readonly defaultConfigSchema: Schema = WebsocketBridgeConfigSchema
24
+ static defaultFailureRetryTime = 1000 * 60
25
+ static defaultMaxConnections = 4
26
+ static defaultMaxPayloadSizeWarning = 256 * 256
27
+ static maxFailureCacheSize = 1000
28
+
29
+ private _failureTimeCache = new LRUCache<Address, number>({ max: WebsocketClientBridge.maxFailureCacheSize })
30
+ private _querySemaphore?: Semaphore
31
+
32
+ private _resolver?: WebsocketBridgeModuleResolver
33
+
34
+ get client() {
35
+ return this.config.client
36
+ }
37
+
38
+ get failureRetryTime() {
39
+ return this.client?.failureRetryTime ?? WebsocketClientBridge.defaultFailureRetryTime
40
+ }
41
+
42
+ get maxConnections() {
43
+ return this.client?.maxConnections ?? WebsocketClientBridge.defaultMaxConnections
44
+ }
45
+
46
+ get maxPayloadSizeWarning() {
47
+ return this.client?.maxPayloadSizeWarning ?? WebsocketClientBridge.defaultMaxPayloadSizeWarning
48
+ }
49
+
50
+ get querySemaphore() {
51
+ this._querySemaphore = this._querySemaphore ?? new Semaphore(this.maxConnections)
52
+ return this._querySemaphore
53
+ }
54
+
55
+ override get resolver() {
56
+ this._resolver =
57
+ this._resolver ?? new WebsocketBridgeModuleResolver({ bridge: this, querySender: this, root: this, wrapperAccount: this.account })
58
+ return this._resolver
59
+ }
60
+
61
+ get url() {
62
+ return assertEx(this.config.client?.url, () => 'No Url Set')
63
+ }
64
+
65
+ override async discoverRoots(): Promise<ModuleInstance[]> {
66
+ return await Promise.resolve([])
67
+ }
68
+
69
+ override exposeHandler(_id: string, _options?: BridgeExposeOptions | undefined): Promisable<ModuleInstance[]> {
70
+ throw new Error('Unsupported')
71
+ }
72
+
73
+ override exposedHandler(): Promisable<Address[]> {
74
+ throw new Error('Unsupported')
75
+ }
76
+
77
+ async sendBridgeQuery<TOut extends Payload = Payload, TQuery extends QueryBoundWitness = QueryBoundWitness, TIn extends Payload = Payload>(
78
+ targetAddress: Address,
79
+ _query: TQuery,
80
+ _payloads?: TIn[],
81
+ ): Promise<ModuleQueryResult<TOut>> {
82
+ const lastFailureTime = this._failureTimeCache.get(targetAddress)
83
+ if (lastFailureTime !== undefined) {
84
+ const now = Date.now()
85
+ const timeSincePreviousFailure = now - lastFailureTime
86
+ if (timeSincePreviousFailure > this.failureRetryTime) {
87
+ throw new Error(`target module failed recently [${targetAddress}] [${timeSincePreviousFailure}ms ago]`)
88
+ }
89
+ this._failureTimeCache.delete(targetAddress)
90
+ }
91
+ try {
92
+ await this.querySemaphore.acquire()
93
+ throw new Error('Unsupported')
94
+ } catch (ex) {
95
+ const error = ex as Error
96
+ throw error
97
+ } finally {
98
+ this.querySemaphore.release()
99
+ }
100
+ }
101
+
102
+ override async startHandler(): Promise<boolean> {
103
+ const { discoverRoot = true } = this.config
104
+ if (discoverRoot) {
105
+ await this.discoverRoots()
106
+ }
107
+ return true
108
+ }
109
+
110
+ override unexposeHandler(_id: string, _options?: BridgeUnexposeOptions | undefined): Promisable<ModuleInstance[]> {
111
+ throw new Error('Unsupported')
112
+ }
113
+ }
package/src/Config.ts CHANGED
@@ -7,10 +7,17 @@ export type WebsocketBridgeConfigSchema = typeof WebsocketBridgeConfigSchema
7
7
  export type WebsocketBridgeConfig<TConfig extends EmptyObject = EmptyObject, TSchema extends string | void = void> = BridgeConfig<
8
8
  {
9
9
  discoverRoot?: boolean
10
- /** @deprecated Do not use this for any new development */
11
- legacyMode?: boolean
12
10
  schema: WebsocketBridgeConfigSchema
13
- url?: string
14
11
  } & TConfig,
15
- TSchema extends string ? TSchema : WebsocketBridgeConfigSchema
12
+ TSchema extends string ? TSchema : WebsocketBridgeConfigSchema,
13
+ {
14
+ failureRetryTime?: number
15
+ failureTimeCacheMax?: number
16
+ maxConnections?: number
17
+ maxPayloadSizeWarning?: number
18
+ url: string
19
+ },
20
+ {
21
+ port?: number
22
+ }
16
23
  >
@@ -1,13 +1,19 @@
1
+ import { Address } from '@xylabs/hex'
1
2
  import { AbstractModuleProxy, ModuleProxyParams } from '@xyo-network/abstract-bridge'
2
3
  import { QueryBoundWitness } from '@xyo-network/boundwitness-model'
3
4
  import { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'
4
5
  import { Payload } from '@xyo-network/payload-model'
5
- import { io as Client } from 'socket.io-client'
6
+
7
+ export interface WebsocketBridgeQuerySender {
8
+ sendBridgeQuery: <TOut extends Payload = Payload, TQuery extends QueryBoundWitness = QueryBoundWitness, TIn extends Payload = Payload>(
9
+ targetAddress: Address,
10
+ query: TQuery,
11
+ payloads?: TIn[],
12
+ ) => Promise<ModuleQueryResult<TOut>>
13
+ }
6
14
 
7
15
  export type WebsocketModuleProxyParams = ModuleProxyParams & {
8
- client?: typeof Client
9
- maxPayloadSizeWarning?: number
10
- moduleUrl: string
16
+ querySender: WebsocketBridgeQuerySender
11
17
  }
12
18
 
13
19
  export class WebsocketModuleProxy<
@@ -19,15 +25,17 @@ export class WebsocketModuleProxy<
19
25
  extends AbstractModuleProxy<TWrappedModule, TParams>
20
26
  implements ModuleInstance<TParams, TWrappedModule['eventData']>
21
27
  {
22
- async proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads: Payload[] = []): Promise<ModuleQueryResult> {
23
- const { maxPayloadSizeWarning } = this.params
24
- const payloadSize = JSON.stringify([query, payloads]).length
25
- if (maxPayloadSizeWarning && payloadSize > maxPayloadSizeWarning) {
26
- this.logger?.warn(
27
- `Large targetQuery being sent: ${payloadSize} bytes [${this.address}][${this.moduleAddress}] [${query.schema}] [${payloads?.length}]`,
28
- )
28
+ 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}`)
29
34
  }
30
- await Promise.resolve()
31
- throw new Error('Unsupported')
35
+ super(params)
36
+ }
37
+
38
+ async proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads: Payload[] = []): Promise<ModuleQueryResult> {
39
+ return await this.params.querySender.sendBridgeQuery(this.params.moduleAddress, query, payloads)
32
40
  }
33
41
  }
package/src/Params.ts ADDED
@@ -0,0 +1,7 @@
1
+ import { BridgeParams } from '@xyo-network/bridge-model'
2
+ import { AnyConfigSchema } from '@xyo-network/module-model'
3
+
4
+ import { WebsocketBridgeConfig } from './Config'
5
+
6
+ export type WebsocketBridgeParams<TConfig extends AnyConfigSchema<WebsocketBridgeConfig> = AnyConfigSchema<WebsocketBridgeConfig>> =
7
+ BridgeParams<TConfig>
@@ -3,19 +3,27 @@ import { Address, isAddress } from '@xylabs/hex'
3
3
  import { AbstractBridgeModuleResolver, BridgeModuleResolverParams, wrapModuleWithType } from '@xyo-network/abstract-bridge'
4
4
  import { Account } from '@xyo-network/account'
5
5
  import { ConfigPayload, ConfigSchema } from '@xyo-network/config-payload-plugin'
6
- import { asModuleInstance, ModuleConfig, ModuleConfigSchema, ModuleFilterOptions, ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model'
6
+ import {
7
+ asModuleInstance,
8
+ ModuleConfig,
9
+ ModuleConfigSchema,
10
+ ModuleFilterOptions,
11
+ ModuleIdentifier,
12
+ ModuleInstance,
13
+ ResolveHelper,
14
+ } from '@xyo-network/module-model'
7
15
 
8
- import { WebsocketModuleProxy, WebsocketModuleProxyParams } from './ModuleProxy'
16
+ import { WebsocketBridgeQuerySender, WebsocketModuleProxy, WebsocketModuleProxyParams } from './ModuleProxy'
9
17
 
10
- export interface WebsocketBridgeModuleResolverOptions extends BridgeModuleResolverParams {
11
- url: string
18
+ export interface WebsocketBridgeModuleResolverParams extends BridgeModuleResolverParams {
19
+ querySender: WebsocketBridgeQuerySender
12
20
  }
13
21
 
14
22
  export class WebsocketBridgeModuleResolver<
15
- T extends WebsocketBridgeModuleResolverOptions = WebsocketBridgeModuleResolverOptions,
23
+ T extends WebsocketBridgeModuleResolverParams = WebsocketBridgeModuleResolverParams,
16
24
  > extends AbstractBridgeModuleResolver<T> {
17
- moduleUrl(address: Address) {
18
- return new URL(address, this.params.url)
25
+ get querySender() {
26
+ return this.params.querySender
19
27
  }
20
28
 
21
29
  override async resolveHandler<T extends ModuleInstance = ModuleInstance>(
@@ -30,7 +38,8 @@ export class WebsocketBridgeModuleResolver<
30
38
  return []
31
39
  }
32
40
  const idParts = id.split(':')
33
- const firstPart = assertEx(idParts.shift(), () => 'Missing firstPart')
41
+ const untransformedFirstPart = assertEx(idParts.shift(), () => `Invalid module identifier: ${id}`)
42
+ const firstPart = await ResolveHelper.transformModuleIdentifier(untransformedFirstPart)
34
43
  const moduleAddress = firstPart as Address
35
44
  assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`)
36
45
  const remainderParts = idParts.join(':')
@@ -39,10 +48,10 @@ export class WebsocketBridgeModuleResolver<
39
48
  config: { schema: ModuleConfigSchema },
40
49
  host: this,
41
50
  moduleAddress,
42
- moduleUrl: this.moduleUrl(moduleAddress).href,
51
+ querySender: this.querySender,
43
52
  }
44
53
 
45
- //console.log(`creating WebsocketProxy [${moduleAddress}] ${id}`)
54
+ this.logger?.debug(`creating HttpProxy [${moduleAddress}] ${id}`)
46
55
 
47
56
  const proxy = new WebsocketModuleProxy<T, WebsocketModuleProxyParams>(params)
48
57
  //calling state here to get the config
@@ -61,9 +70,9 @@ export class WebsocketBridgeModuleResolver<
61
70
  await proxy.start()
62
71
 
63
72
  const wrapped = assertEx(wrapModuleWithType(proxy, Account.randomSync()) as unknown as T, () => `Failed to wrapModuleWithType [${id}]`)
64
- const as = assertEx(asModuleInstance<T>(wrapped, {}), () => `Failed to asModuleInstance [${id}]`)
65
- proxy.upResolver.add(as)
66
- proxy.downResolver.add(as)
73
+ const instance = assertEx(asModuleInstance<T>(wrapped, {}), () => `Failed to asModuleInstance [${id}]`)
74
+ proxy.upResolver.add(instance)
75
+ proxy.downResolver.add(instance)
67
76
 
68
77
  if (remainderParts.length > 0) {
69
78
  const result = await wrapped.resolve<T>(remainderParts, options)
@@ -71,6 +80,6 @@ export class WebsocketBridgeModuleResolver<
71
80
  }
72
81
 
73
82
  //console.log(`resolved: ${proxy.address} [${wrapped.constructor.name}] [${as.constructor.name}]`)
74
- return as
83
+ return instance
75
84
  }
76
85
  }
@@ -0,0 +1,4 @@
1
+ import { WebsocketClientBridge } from './ClientBridge'
2
+ export * from './Config'
3
+
4
+ export class WebsocketBridge extends WebsocketClientBridge {}
package/xy.config.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { XyTsupConfig } from '@xylabs/ts-scripts-yarn3'
2
+ const config: XyTsupConfig = {
3
+ compile: {
4
+ browser: {
5
+ src: { entry: ['./src/index-browser.ts'] },
6
+ },
7
+ node: {
8
+ src: { entry: ['./src/index.ts'] },
9
+ },
10
+ },
11
+ }
12
+
13
+ // eslint-disable-next-line import/no-default-export
14
+ export default config
@@ -1 +0,0 @@
1
- {"version":3,"file":"ModuleResolver.d.ts","sourceRoot":"","sources":["../../src/ModuleResolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAa,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,4BAA4B,EAAE,0BAA0B,EAAsB,MAAM,8BAA8B,CAAA;AAG3H,OAAO,EAAsD,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAIrJ,MAAM,WAAW,oCAAqC,SAAQ,0BAA0B;IACtF,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,qBAAa,6BAA6B,CACxC,CAAC,SAAS,oCAAoC,GAAG,oCAAoC,CACrF,SAAQ,4BAA4B,CAAC,CAAC,CAAC;IACvC,SAAS,CAAC,OAAO,EAAE,OAAO;IAIX,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EACrE,EAAE,EAAE,gBAAgB,EACpB,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC/B,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;CAoDhC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ModuleResolver.d.ts","sourceRoot":"","sources":["../../src/ModuleResolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAa,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,4BAA4B,EAAE,0BAA0B,EAAsB,MAAM,8BAA8B,CAAA;AAG3H,OAAO,EAAsD,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAIrJ,MAAM,WAAW,oCAAqC,SAAQ,0BAA0B;IACtF,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,qBAAa,6BAA6B,CACxC,CAAC,SAAS,oCAAoC,GAAG,oCAAoC,CACrF,SAAQ,4BAA4B,CAAC,CAAC,CAAC;IACvC,SAAS,CAAC,OAAO,EAAE,OAAO;IAIX,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EACrE,EAAE,EAAE,gBAAgB,EACpB,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC/B,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;CAoDhC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ModuleResolver.d.ts","sourceRoot":"","sources":["../../src/ModuleResolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAa,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,4BAA4B,EAAE,0BAA0B,EAAsB,MAAM,8BAA8B,CAAA;AAG3H,OAAO,EAAsD,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAIrJ,MAAM,WAAW,oCAAqC,SAAQ,0BAA0B;IACtF,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,qBAAa,6BAA6B,CACxC,CAAC,SAAS,oCAAoC,GAAG,oCAAoC,CACrF,SAAQ,4BAA4B,CAAC,CAAC,CAAC;IACvC,SAAS,CAAC,OAAO,EAAE,OAAO;IAIX,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EACrE,EAAE,EAAE,gBAAgB,EACpB,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC/B,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;CAoDhC"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/Bridge.ts","../../src/Config.ts","../../src/ModuleResolver.ts","../../src/ModuleProxy/ModuleProxy.ts"],"sourcesContent":["export * from './Bridge'\nexport * from './Config'\n","import { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { AbstractBridge } from '@xyo-network/abstract-bridge'\nimport { BridgeExposeOptions, BridgeModule, BridgeParams, BridgeUnexposeOptions } from '@xyo-network/bridge-model'\nimport { AnyConfigSchema, creatableModule, ModuleInstance } from '@xyo-network/module-model'\nimport { Schema } from '@xyo-network/payload-model'\n\nimport { WebsocketBridgeConfig, WebsocketBridgeConfigSchema } from './Config'\nimport { WebsocketBridgeModuleResolver } from './ModuleResolver'\n\nexport type WebsocketBridgeParams<TConfig extends AnyConfigSchema<WebsocketBridgeConfig> = AnyConfigSchema<WebsocketBridgeConfig>> =\n BridgeParams<TConfig>\n\n@creatableModule()\nexport class WebsocketBridge<TParams extends WebsocketBridgeParams> extends AbstractBridge<TParams> implements BridgeModule<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, WebsocketBridgeConfigSchema]\n static override readonly defaultConfigSchema: Schema = WebsocketBridgeConfigSchema\n static maxPayloadSizeWarning = 256 * 256\n\n private _resolver?: WebsocketBridgeModuleResolver\n\n override get resolver() {\n this._resolver = this._resolver ?? new WebsocketBridgeModuleResolver({ bridge: this, root: this, url: this.url, wrapperAccount: this.account })\n return this._resolver\n }\n\n get url() {\n return assertEx(this.config.url, () => 'No Url Set')\n }\n\n override async discoverRoots(): Promise<ModuleInstance[]> {\n return await Promise.resolve([])\n }\n\n override exposeHandler(_id: string, _options?: BridgeExposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n override exposedHandler(): Promisable<Address[]> {\n throw new Error('Unsupported')\n }\n\n override async startHandler(): Promise<boolean> {\n const { discoverRoot = true } = this.config\n if (discoverRoot) {\n await this.discoverRoots()\n }\n return true\n }\n\n override unexposeHandler(_id: string, _options?: BridgeUnexposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n}\n","import { EmptyObject } from '@xylabs/object'\nimport { BridgeConfig } from '@xyo-network/bridge-model'\n\nexport const WebsocketBridgeConfigSchema = 'network.xyo.bridge.websocket.config'\nexport type WebsocketBridgeConfigSchema = typeof WebsocketBridgeConfigSchema\n\nexport type WebsocketBridgeConfig<TConfig extends EmptyObject = EmptyObject, TSchema extends string | void = void> = BridgeConfig<\n {\n discoverRoot?: boolean\n /** @deprecated Do not use this for any new development */\n legacyMode?: boolean\n schema: WebsocketBridgeConfigSchema\n url?: string\n } & TConfig,\n TSchema extends string ? TSchema : WebsocketBridgeConfigSchema\n>\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { AbstractBridgeModuleResolver, BridgeModuleResolverParams, wrapModuleWithType } from '@xyo-network/abstract-bridge'\nimport { Account } from '@xyo-network/account'\nimport { ConfigPayload, ConfigSchema } from '@xyo-network/config-payload-plugin'\nimport { asModuleInstance, ModuleConfig, ModuleConfigSchema, ModuleFilterOptions, ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model'\n\nimport { WebsocketModuleProxy, WebsocketModuleProxyParams } from './ModuleProxy'\n\nexport interface WebsocketBridgeModuleResolverOptions extends BridgeModuleResolverParams {\n url: string\n}\n\nexport class WebsocketBridgeModuleResolver<\n T extends WebsocketBridgeModuleResolverOptions = WebsocketBridgeModuleResolverOptions,\n> extends AbstractBridgeModuleResolver<T> {\n moduleUrl(address: Address) {\n return new URL(address, this.params.url)\n }\n\n override async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n id: ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n const parentResult = await super.resolveHandler(id, options)\n if (parentResult) {\n return parentResult\n }\n if (id === '*') {\n return []\n }\n const idParts = id.split(':')\n const firstPart = assertEx(idParts.shift(), () => 'Missing firstPart')\n const moduleAddress = firstPart as Address\n assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`)\n const remainderParts = idParts.join(':')\n const params: WebsocketModuleProxyParams = {\n account: Account.randomSync(),\n config: { schema: ModuleConfigSchema },\n host: this,\n moduleAddress,\n moduleUrl: this.moduleUrl(moduleAddress).href,\n }\n\n //console.log(`creating WebsocketProxy [${moduleAddress}] ${id}`)\n\n const proxy = new WebsocketModuleProxy<T, WebsocketModuleProxyParams>(params)\n //calling state here to get the config\n if (proxy) {\n const state = await proxy.state()\n if (state) {\n const configSchema = (state.find((payload) => payload.schema === ConfigSchema) as ConfigPayload | undefined)?.config\n const config = assertEx(\n state.find((payload) => payload.schema === configSchema),\n () => 'Unable to locate config',\n ) as ModuleConfig\n proxy.setConfig(config)\n }\n }\n\n await proxy.start()\n\n const wrapped = assertEx(wrapModuleWithType(proxy, Account.randomSync()) as unknown as T, () => `Failed to wrapModuleWithType [${id}]`)\n const as = assertEx(asModuleInstance<T>(wrapped, {}), () => `Failed to asModuleInstance [${id}]`)\n proxy.upResolver.add(as)\n proxy.downResolver.add(as)\n\n if (remainderParts.length > 0) {\n const result = await wrapped.resolve<T>(remainderParts, options)\n return result\n }\n\n //console.log(`resolved: ${proxy.address} [${wrapped.constructor.name}] [${as.constructor.name}]`)\n return as\n }\n}\n","import { AbstractModuleProxy, ModuleProxyParams } from '@xyo-network/abstract-bridge'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { io as Client } from 'socket.io-client'\n\nexport type WebsocketModuleProxyParams = ModuleProxyParams & {\n client?: typeof Client\n maxPayloadSizeWarning?: number\n moduleUrl: string\n}\n\nexport class WebsocketModuleProxy<\n TWrappedModule extends ModuleInstance = ModuleInstance,\n TParams extends Omit<WebsocketModuleProxyParams, 'config'> & { config: TWrappedModule['config'] } = Omit<WebsocketModuleProxyParams, 'config'> & {\n config: TWrappedModule['config']\n },\n >\n extends AbstractModuleProxy<TWrappedModule, TParams>\n implements ModuleInstance<TParams, TWrappedModule['eventData']>\n{\n async proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads: Payload[] = []): Promise<ModuleQueryResult> {\n const { maxPayloadSizeWarning } = this.params\n const payloadSize = JSON.stringify([query, payloads]).length\n if (maxPayloadSizeWarning && payloadSize > maxPayloadSizeWarning) {\n this.logger?.warn(\n `Large targetQuery being sent: ${payloadSize} bytes [${this.address}][${this.moduleAddress}] [${query.schema}] [${payloads?.length}]`,\n )\n }\n await Promise.resolve()\n throw new Error('Unsupported')\n }\n}\n"],"mappings":"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","names":["import_assert","import_abstract_bridge","import_module_model","WebsocketBridgeConfigSchema","import_abstract_bridge","WebsocketModuleProxy","AbstractModuleProxy","proxyQueryHandler","query","payloads","maxPayloadSizeWarning","params","payloadSize","JSON","stringify","length","logger","warn","address","moduleAddress","schema","Promise","resolve","Error","WebsocketBridgeModuleResolver","AbstractBridgeModuleResolver","moduleUrl","address","URL","params","url","resolveHandler","id","options","parentResult","idParts","split","firstPart","assertEx","shift","moduleAddress","isAddress","remainderParts","join","account","Account","randomSync","config","schema","ModuleConfigSchema","host","href","proxy","WebsocketModuleProxy","state","configSchema","find","payload","ConfigSchema","setConfig","start","wrapped","wrapModuleWithType","as","asModuleInstance","upResolver","add","downResolver","length","result","resolve","WebsocketBridge","AbstractBridge","configSchemas","WebsocketBridgeConfigSchema","defaultConfigSchema","maxPayloadSizeWarning","_resolver","resolver","WebsocketBridgeModuleResolver","bridge","root","url","wrapperAccount","account","assertEx","config","discoverRoots","Promise","resolve","exposeHandler","_id","_options","Error","exposedHandler","startHandler","discoverRoot","unexposeHandler","creatableModule"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/Bridge.ts","../../src/Config.ts","../../src/ModuleResolver.ts","../../src/ModuleProxy/ModuleProxy.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { Address } from '@xylabs/hex'\nimport { Promisable } from '@xylabs/promise'\nimport { AbstractBridge } from '@xyo-network/abstract-bridge'\nimport { BridgeExposeOptions, BridgeModule, BridgeParams, BridgeUnexposeOptions } from '@xyo-network/bridge-model'\nimport { AnyConfigSchema, creatableModule, ModuleInstance } from '@xyo-network/module-model'\nimport { Schema } from '@xyo-network/payload-model'\n\nimport { WebsocketBridgeConfig, WebsocketBridgeConfigSchema } from './Config'\nimport { WebsocketBridgeModuleResolver } from './ModuleResolver'\n\nexport type WebsocketBridgeParams<TConfig extends AnyConfigSchema<WebsocketBridgeConfig> = AnyConfigSchema<WebsocketBridgeConfig>> =\n BridgeParams<TConfig>\n\n@creatableModule()\nexport class WebsocketBridge<TParams extends WebsocketBridgeParams> extends AbstractBridge<TParams> implements BridgeModule<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, WebsocketBridgeConfigSchema]\n static override readonly defaultConfigSchema: Schema = WebsocketBridgeConfigSchema\n static maxPayloadSizeWarning = 256 * 256\n\n private _resolver?: WebsocketBridgeModuleResolver\n\n override get resolver() {\n this._resolver = this._resolver ?? new WebsocketBridgeModuleResolver({ bridge: this, root: this, url: this.url, wrapperAccount: this.account })\n return this._resolver\n }\n\n get url() {\n return assertEx(this.config.url, () => 'No Url Set')\n }\n\n override async discoverRoots(): Promise<ModuleInstance[]> {\n return await Promise.resolve([])\n }\n\n override exposeHandler(_id: string, _options?: BridgeExposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n override exposedHandler(): Promisable<Address[]> {\n throw new Error('Unsupported')\n }\n\n override async startHandler(): Promise<boolean> {\n const { discoverRoot = true } = this.config\n if (discoverRoot) {\n await this.discoverRoots()\n }\n return true\n }\n\n override unexposeHandler(_id: string, _options?: BridgeUnexposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n}\n","import { EmptyObject } from '@xylabs/object'\nimport { BridgeConfig } from '@xyo-network/bridge-model'\n\nexport const WebsocketBridgeConfigSchema = 'network.xyo.bridge.websocket.config'\nexport type WebsocketBridgeConfigSchema = typeof WebsocketBridgeConfigSchema\n\nexport type WebsocketBridgeConfig<TConfig extends EmptyObject = EmptyObject, TSchema extends string | void = void> = BridgeConfig<\n {\n discoverRoot?: boolean\n /** @deprecated Do not use this for any new development */\n legacyMode?: boolean\n schema: WebsocketBridgeConfigSchema\n url?: string\n } & TConfig,\n TSchema extends string ? TSchema : WebsocketBridgeConfigSchema\n>\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { AbstractBridgeModuleResolver, BridgeModuleResolverParams, wrapModuleWithType } from '@xyo-network/abstract-bridge'\nimport { Account } from '@xyo-network/account'\nimport { ConfigPayload, ConfigSchema } from '@xyo-network/config-payload-plugin'\nimport { asModuleInstance, ModuleConfig, ModuleConfigSchema, ModuleFilterOptions, ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model'\n\nimport { WebsocketModuleProxy, WebsocketModuleProxyParams } from './ModuleProxy'\n\nexport interface WebsocketBridgeModuleResolverOptions extends BridgeModuleResolverParams {\n url: string\n}\n\nexport class WebsocketBridgeModuleResolver<\n T extends WebsocketBridgeModuleResolverOptions = WebsocketBridgeModuleResolverOptions,\n> extends AbstractBridgeModuleResolver<T> {\n moduleUrl(address: Address) {\n return new URL(address, this.params.url)\n }\n\n override async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n id: ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n ): Promise<T | T[] | undefined> {\n const parentResult = await super.resolveHandler(id, options)\n if (parentResult) {\n return parentResult\n }\n if (id === '*') {\n return []\n }\n const idParts = id.split(':')\n const firstPart = assertEx(idParts.shift(), () => 'Missing firstPart')\n const moduleAddress = firstPart as Address\n assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`)\n const remainderParts = idParts.join(':')\n const params: WebsocketModuleProxyParams = {\n account: Account.randomSync(),\n config: { schema: ModuleConfigSchema },\n host: this,\n moduleAddress,\n moduleUrl: this.moduleUrl(moduleAddress).href,\n }\n\n //console.log(`creating WebsocketProxy [${moduleAddress}] ${id}`)\n\n const proxy = new WebsocketModuleProxy<T, WebsocketModuleProxyParams>(params)\n //calling state here to get the config\n if (proxy) {\n const state = await proxy.state()\n if (state) {\n const configSchema = (state.find((payload) => payload.schema === ConfigSchema) as ConfigPayload | undefined)?.config\n const config = assertEx(\n state.find((payload) => payload.schema === configSchema),\n () => 'Unable to locate config',\n ) as ModuleConfig\n proxy.setConfig(config)\n }\n }\n\n await proxy.start()\n\n const wrapped = assertEx(wrapModuleWithType(proxy, Account.randomSync()) as unknown as T, () => `Failed to wrapModuleWithType [${id}]`)\n const as = assertEx(asModuleInstance<T>(wrapped, {}), () => `Failed to asModuleInstance [${id}]`)\n proxy.upResolver.add(as)\n proxy.downResolver.add(as)\n\n if (remainderParts.length > 0) {\n const result = await wrapped.resolve<T>(remainderParts, options)\n return result\n }\n\n //console.log(`resolved: ${proxy.address} [${wrapped.constructor.name}] [${as.constructor.name}]`)\n return as\n }\n}\n","import { AbstractModuleProxy, ModuleProxyParams } from '@xyo-network/abstract-bridge'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { io as Client } from 'socket.io-client'\n\nexport type WebsocketModuleProxyParams = ModuleProxyParams & {\n client?: typeof Client\n maxPayloadSizeWarning?: number\n moduleUrl: string\n}\n\nexport class WebsocketModuleProxy<\n TWrappedModule extends ModuleInstance = ModuleInstance,\n TParams extends Omit<WebsocketModuleProxyParams, 'config'> & { config: TWrappedModule['config'] } = Omit<WebsocketModuleProxyParams, 'config'> & {\n config: TWrappedModule['config']\n },\n >\n extends AbstractModuleProxy<TWrappedModule, TParams>\n implements ModuleInstance<TParams, TWrappedModule['eventData']>\n{\n async proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads: Payload[] = []): Promise<ModuleQueryResult> {\n const { maxPayloadSizeWarning } = this.params\n const payloadSize = JSON.stringify([query, payloads]).length\n if (maxPayloadSizeWarning && payloadSize > maxPayloadSizeWarning) {\n this.logger?.warn(\n `Large targetQuery being sent: ${payloadSize} bytes [${this.address}][${this.moduleAddress}] [${query.schema}] [${payloads?.length}]`,\n )\n }\n await Promise.resolve()\n throw new Error('Unsupported')\n }\n}\n"],"mappings":"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","names":["assertEx","AbstractBridge","creatableModule","WebsocketBridgeConfigSchema","assertEx","isAddress","AbstractBridgeModuleResolver","wrapModuleWithType","Account","ConfigSchema","asModuleInstance","ModuleConfigSchema","AbstractModuleProxy","WebsocketModuleProxy","AbstractModuleProxy","proxyQueryHandler","query","payloads","maxPayloadSizeWarning","params","payloadSize","JSON","stringify","length","logger","warn","address","moduleAddress","schema","Promise","resolve","Error","WebsocketBridgeModuleResolver","AbstractBridgeModuleResolver","moduleUrl","address","URL","params","url","resolveHandler","id","options","parentResult","idParts","split","firstPart","assertEx","shift","moduleAddress","isAddress","remainderParts","join","account","Account","randomSync","config","schema","ModuleConfigSchema","host","href","proxy","WebsocketModuleProxy","state","configSchema","find","payload","ConfigSchema","setConfig","start","wrapped","wrapModuleWithType","as","asModuleInstance","upResolver","add","downResolver","length","result","resolve","WebsocketBridge","AbstractBridge","configSchemas","WebsocketBridgeConfigSchema","defaultConfigSchema","maxPayloadSizeWarning","_resolver","resolver","WebsocketBridgeModuleResolver","bridge","root","url","wrapperAccount","account","assertEx","config","discoverRoots","Promise","resolve","exposeHandler","_id","_options","Error","exposedHandler","startHandler","discoverRoot","unexposeHandler","creatableModule"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ModuleResolver.d.ts","sourceRoot":"","sources":["../../src/ModuleResolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAa,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,4BAA4B,EAAE,0BAA0B,EAAsB,MAAM,8BAA8B,CAAA;AAG3H,OAAO,EAAsD,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAIrJ,MAAM,WAAW,oCAAqC,SAAQ,0BAA0B;IACtF,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,qBAAa,6BAA6B,CACxC,CAAC,SAAS,oCAAoC,GAAG,oCAAoC,CACrF,SAAQ,4BAA4B,CAAC,CAAC,CAAC;IACvC,SAAS,CAAC,OAAO,EAAE,OAAO;IAIX,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EACrE,EAAE,EAAE,gBAAgB,EACpB,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC/B,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;CAoDhC"}
@@ -1,11 +0,0 @@
1
- import { Address } from '@xylabs/hex';
2
- import { AbstractBridgeModuleResolver, BridgeModuleResolverParams } from '@xyo-network/abstract-bridge';
3
- import { ModuleFilterOptions, ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model';
4
- export interface WebsocketBridgeModuleResolverOptions extends BridgeModuleResolverParams {
5
- url: string;
6
- }
7
- export declare class WebsocketBridgeModuleResolver<T extends WebsocketBridgeModuleResolverOptions = WebsocketBridgeModuleResolverOptions> extends AbstractBridgeModuleResolver<T> {
8
- moduleUrl(address: Address): URL;
9
- resolveHandler<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | T[] | undefined>;
10
- }
11
- //# sourceMappingURL=ModuleResolver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ModuleResolver.d.ts","sourceRoot":"","sources":["../../src/ModuleResolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAa,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,4BAA4B,EAAE,0BAA0B,EAAsB,MAAM,8BAA8B,CAAA;AAG3H,OAAO,EAAsD,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAIrJ,MAAM,WAAW,oCAAqC,SAAQ,0BAA0B;IACtF,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,qBAAa,6BAA6B,CACxC,CAAC,SAAS,oCAAoC,GAAG,oCAAoC,CACrF,SAAQ,4BAA4B,CAAC,CAAC,CAAC;IACvC,SAAS,CAAC,OAAO,EAAE,OAAO;IAIX,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EACrE,EAAE,EAAE,gBAAgB,EACpB,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC/B,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;CAoDhC"}
@@ -1,11 +0,0 @@
1
- import { Address } from '@xylabs/hex';
2
- import { AbstractBridgeModuleResolver, BridgeModuleResolverParams } from '@xyo-network/abstract-bridge';
3
- import { ModuleFilterOptions, ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model';
4
- export interface WebsocketBridgeModuleResolverOptions extends BridgeModuleResolverParams {
5
- url: string;
6
- }
7
- export declare class WebsocketBridgeModuleResolver<T extends WebsocketBridgeModuleResolverOptions = WebsocketBridgeModuleResolverOptions> extends AbstractBridgeModuleResolver<T> {
8
- moduleUrl(address: Address): URL;
9
- resolveHandler<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | T[] | undefined>;
10
- }
11
- //# sourceMappingURL=ModuleResolver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ModuleResolver.d.ts","sourceRoot":"","sources":["../../src/ModuleResolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAa,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,4BAA4B,EAAE,0BAA0B,EAAsB,MAAM,8BAA8B,CAAA;AAG3H,OAAO,EAAsD,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAIrJ,MAAM,WAAW,oCAAqC,SAAQ,0BAA0B;IACtF,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,qBAAa,6BAA6B,CACxC,CAAC,SAAS,oCAAoC,GAAG,oCAAoC,CACrF,SAAQ,4BAA4B,CAAC,CAAC,CAAC;IACvC,SAAS,CAAC,OAAO,EAAE,OAAO;IAIX,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EACrE,EAAE,EAAE,gBAAgB,EACpB,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC/B,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;CAoDhC"}
@@ -1,68 +0,0 @@
1
- import { io as Client, Socket } from 'socket.io-client'
2
-
3
- import { BridgeCommands, createServer } from '../socketServer'
4
-
5
- /**
6
- * @group module
7
- * @group bridge
8
- */
9
- describe('WebsocketBridge', () => {
10
- let ioServer: { start: () => void; stop: () => void }
11
- let moduleClientA: Socket
12
- const port = 3001
13
- const serverUrl = `http://localhost:${port}`
14
- const moduleAddressA = 'f4f4fa193a3b785bcf3f9902d031d49f1cf01a11'
15
- const moduleAddressB = '0d8cf1ea18281a34c166624ff9d4e5a473d05ae5'
16
-
17
- beforeAll((done) => {
18
- ioServer = createServer(port)
19
- ioServer.start()
20
- done()
21
- })
22
-
23
- afterAll((done) => {
24
- ioServer.stop()
25
- done()
26
- })
27
-
28
- beforeEach((done) => {
29
- moduleClientA = Client(serverUrl, {
30
- forceNew: true,
31
- reconnection: true,
32
- reconnectionAttempts: 5,
33
- reconnectionDelay: 0,
34
- transports: ['websocket'],
35
- })
36
- moduleClientA.on('connect', () => {
37
- done()
38
- })
39
- })
40
-
41
- afterEach((done) => {
42
- if (moduleClientA.connected) {
43
- moduleClientA.disconnect()
44
- }
45
- done()
46
- })
47
-
48
- test('should communicate between modules', (done) => {
49
- const moduleClientB = Client(serverUrl, {
50
- forceNew: true,
51
- reconnection: true,
52
- reconnectionAttempts: 5,
53
- reconnectionDelay: 0,
54
- transports: ['websocket'],
55
- })
56
- const query = `Hello from ${moduleAddressB}`
57
- moduleClientB.on('connect', () => {
58
- moduleClientB.emit(BridgeCommands.bridge, moduleAddressA)
59
- moduleClientA.emit(BridgeCommands.sendMessage, { address: moduleAddressA, query })
60
- })
61
- moduleClientB.on('message', (received) => {
62
- expect(received).toBe(query)
63
- moduleClientB.disconnect()
64
- done()
65
- })
66
- moduleClientA.emit(BridgeCommands.bridge, moduleAddressA)
67
- })
68
- })