@xyo-network/bridge-pub-sub 2.92.11 → 2.93.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/browser/AsyncQueryBus/AsyncQueryBusBase.d.cts.map +1 -1
  2. package/dist/browser/AsyncQueryBus/AsyncQueryBusBase.d.mts.map +1 -1
  3. package/dist/browser/AsyncQueryBus/AsyncQueryBusBase.d.ts.map +1 -1
  4. package/dist/browser/AsyncQueryBus/AsyncQueryBusClient.d.cts.map +1 -1
  5. package/dist/browser/AsyncQueryBus/AsyncQueryBusClient.d.mts.map +1 -1
  6. package/dist/browser/AsyncQueryBus/AsyncQueryBusClient.d.ts.map +1 -1
  7. package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.cts +8 -2
  8. package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.cts.map +1 -1
  9. package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.mts +8 -2
  10. package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.mts.map +1 -1
  11. package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.ts +8 -2
  12. package/dist/browser/AsyncQueryBus/ModuleProxy/ModuleProxy.d.ts.map +1 -1
  13. package/dist/browser/Config.d.cts +2 -0
  14. package/dist/browser/Config.d.cts.map +1 -1
  15. package/dist/browser/Config.d.mts +2 -0
  16. package/dist/browser/Config.d.mts.map +1 -1
  17. package/dist/browser/Config.d.ts +2 -0
  18. package/dist/browser/Config.d.ts.map +1 -1
  19. package/dist/browser/PubSubBridge.d.cts +8 -6
  20. package/dist/browser/PubSubBridge.d.cts.map +1 -1
  21. package/dist/browser/PubSubBridge.d.mts +8 -6
  22. package/dist/browser/PubSubBridge.d.mts.map +1 -1
  23. package/dist/browser/PubSubBridge.d.ts +8 -6
  24. package/dist/browser/PubSubBridge.d.ts.map +1 -1
  25. package/dist/browser/PubSubBridgeModuleResolver.d.cts +2 -2
  26. package/dist/browser/PubSubBridgeModuleResolver.d.cts.map +1 -1
  27. package/dist/browser/PubSubBridgeModuleResolver.d.mts +2 -2
  28. package/dist/browser/PubSubBridgeModuleResolver.d.mts.map +1 -1
  29. package/dist/browser/PubSubBridgeModuleResolver.d.ts +2 -2
  30. package/dist/browser/PubSubBridgeModuleResolver.d.ts.map +1 -1
  31. package/dist/browser/index.cjs +88 -21
  32. package/dist/browser/index.cjs.map +1 -1
  33. package/dist/browser/index.js +88 -21
  34. package/dist/browser/index.js.map +1 -1
  35. package/dist/node/AsyncQueryBus/AsyncQueryBusBase.d.cts.map +1 -1
  36. package/dist/node/AsyncQueryBus/AsyncQueryBusBase.d.mts.map +1 -1
  37. package/dist/node/AsyncQueryBus/AsyncQueryBusBase.d.ts.map +1 -1
  38. package/dist/node/AsyncQueryBus/AsyncQueryBusClient.d.cts.map +1 -1
  39. package/dist/node/AsyncQueryBus/AsyncQueryBusClient.d.mts.map +1 -1
  40. package/dist/node/AsyncQueryBus/AsyncQueryBusClient.d.ts.map +1 -1
  41. package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.cts +8 -2
  42. package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.cts.map +1 -1
  43. package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.mts +8 -2
  44. package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.mts.map +1 -1
  45. package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.ts +8 -2
  46. package/dist/node/AsyncQueryBus/ModuleProxy/ModuleProxy.d.ts.map +1 -1
  47. package/dist/node/Config.d.cts +2 -0
  48. package/dist/node/Config.d.cts.map +1 -1
  49. package/dist/node/Config.d.mts +2 -0
  50. package/dist/node/Config.d.mts.map +1 -1
  51. package/dist/node/Config.d.ts +2 -0
  52. package/dist/node/Config.d.ts.map +1 -1
  53. package/dist/node/PubSubBridge.d.cts +8 -6
  54. package/dist/node/PubSubBridge.d.cts.map +1 -1
  55. package/dist/node/PubSubBridge.d.mts +8 -6
  56. package/dist/node/PubSubBridge.d.mts.map +1 -1
  57. package/dist/node/PubSubBridge.d.ts +8 -6
  58. package/dist/node/PubSubBridge.d.ts.map +1 -1
  59. package/dist/node/PubSubBridgeModuleResolver.d.cts +2 -2
  60. package/dist/node/PubSubBridgeModuleResolver.d.cts.map +1 -1
  61. package/dist/node/PubSubBridgeModuleResolver.d.mts +2 -2
  62. package/dist/node/PubSubBridgeModuleResolver.d.mts.map +1 -1
  63. package/dist/node/PubSubBridgeModuleResolver.d.ts +2 -2
  64. package/dist/node/PubSubBridgeModuleResolver.d.ts.map +1 -1
  65. package/dist/node/index.cjs +94 -22
  66. package/dist/node/index.cjs.map +1 -1
  67. package/dist/node/index.js +94 -22
  68. package/dist/node/index.js.map +1 -1
  69. package/package.json +30 -26
  70. package/src/AsyncQueryBus/AsyncQueryBusBase.ts +8 -4
  71. package/src/AsyncQueryBus/AsyncQueryBusClient.ts +4 -0
  72. package/src/AsyncQueryBus/AsyncQueryBusHost.ts +1 -1
  73. package/src/AsyncQueryBus/ModuleProxy/ModuleProxy.ts +18 -5
  74. package/src/Config.ts +2 -0
  75. package/src/PubSubBridge.ts +42 -16
  76. package/src/PubSubBridgeModuleResolver.ts +32 -9
@@ -1,6 +1,6 @@
1
1
  import { AbstractModuleProxy, ModuleProxyParams } from '@xyo-network/abstract-bridge'
2
2
  import { QueryBoundWitness } from '@xyo-network/boundwitness-model'
3
- import { Module, ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'
3
+ import { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'
4
4
  import { Payload } from '@xyo-network/payload-model'
5
5
 
6
6
  import { AsyncQueryBusClient } from '../AsyncQueryBusClient'
@@ -9,11 +9,24 @@ export type AsyncQueryBusModuleProxyParams = ModuleProxyParams & {
9
9
  busClient: AsyncQueryBusClient
10
10
  }
11
11
 
12
- export class AsyncQueryBusModuleProxy<TWrappedModule extends Module = Module>
13
- extends AbstractModuleProxy<AsyncQueryBusModuleProxyParams, TWrappedModule>
14
- implements ModuleInstance<TWrappedModule['params'], TWrappedModule['eventData']>
12
+ export class AsyncQueryBusModuleProxy<
13
+ TWrappedModule extends ModuleInstance = ModuleInstance,
14
+ TParams extends Omit<AsyncQueryBusModuleProxyParams, 'config'> & { config: TWrappedModule['config'] } = Omit<
15
+ AsyncQueryBusModuleProxyParams,
16
+ 'config'
17
+ > & {
18
+ config: TWrappedModule['config']
19
+ },
20
+ >
21
+ extends AbstractModuleProxy<TWrappedModule, TParams>
22
+ implements ModuleInstance<TParams, TWrappedModule['eventData']>
15
23
  {
24
+ pipeline?: 'one-to-one' | 'one-to-many' | 'many-to-one' | 'many-to-many' | undefined
16
25
  async proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads?: Payload[]): Promise<ModuleQueryResult> {
17
- return await this.proxyParams.busClient.send(this.address, query, payloads)
26
+ return await this.params.busClient.send(this.address, query, payloads)
27
+ }
28
+
29
+ override async startHandler(): Promise<boolean> {
30
+ return await super.startHandler()
18
31
  }
19
32
  }
package/src/Config.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { Address } from '@xylabs/hex'
1
2
  import { EmptyObject } from '@xylabs/object'
2
3
  import { BridgeConfig } from '@xyo-network/bridge-model'
3
4
 
@@ -14,6 +15,7 @@ export type PubSubBridgeConfig<TConfig extends EmptyObject = EmptyObject, TSchem
14
15
  {
15
16
  client?: AsyncQueryBusClientConfig
16
17
  host?: AsyncQueryBusHostConfig
18
+ roots?: Address[]
17
19
  } & TConfig,
18
20
  TSchema extends string ? TSchema : PubSubBridgeConfigSchema
19
21
  >
@@ -1,8 +1,9 @@
1
1
  import { assertEx } from '@xylabs/assert'
2
+ import { exists } from '@xylabs/exists'
2
3
  import { Address } from '@xylabs/hex'
3
4
  import { AbstractBridge } from '@xyo-network/abstract-bridge'
4
5
  import { BridgeExposeOptions, BridgeModule, BridgeUnexposeOptions } from '@xyo-network/bridge-model'
5
- import { creatableModule, ModuleFilterOptions, ModuleIdentifier } from '@xyo-network/module-model'
6
+ import { creatableModule, ModuleFilterOptions, ModuleIdentifier, ModuleInstance, ModuleResolverInstance } from '@xyo-network/module-model'
6
7
  import { LRUCache } from 'lru-cache'
7
8
 
8
9
  import { AsyncQueryBusClient, AsyncQueryBusHost } from './AsyncQueryBus'
@@ -26,14 +27,12 @@ export class PubSubBridge<TParams extends PubSubBridgeParams = PubSubBridgeParam
26
27
  private _busHost?: AsyncQueryBusHost
27
28
  private _resolver?: PubSubBridgeModuleResolver
28
29
 
29
- override get resolver() {
30
+ override get resolver(): ModuleResolverInstance {
30
31
  this._resolver =
31
32
  this._resolver ??
32
33
  new PubSubBridgeModuleResolver({
33
34
  bridge: this,
34
35
  busClient: assertEx(this.busClient(), () => 'busClient not configured'),
35
- downResolver: this.downResolver,
36
- upResolver: this.upResolver,
37
36
  wrapperAccount: this.account,
38
37
  })
39
38
  return this._resolver
@@ -43,24 +42,56 @@ export class PubSubBridge<TParams extends PubSubBridgeParams = PubSubBridgeParam
43
42
  return `${this.config.name ?? moduleName}`
44
43
  }
45
44
 
46
- async exposeHandler(id: ModuleIdentifier, options?: BridgeExposeOptions | undefined): Promise<Address[]> {
47
- const filterOptions: ModuleFilterOptions = { direction: options?.direction }
48
- const module = await super.resolve(id, filterOptions)
45
+ protected get roots() {
46
+ return assertEx(this.config.roots, () => 'roots not configured')
47
+ }
48
+
49
+ override async discoverRoots(): Promise<ModuleInstance[]> {
50
+ const rootInstances = (await Promise.all(this.roots.map(async (root) => await this.resolver.resolve<ModuleInstance>(root)))).filter(exists)
51
+ for (const instance of rootInstances) {
52
+ this.downResolver.add(instance)
53
+ }
54
+ return rootInstances
55
+ }
56
+
57
+ async exposeHandler(id: ModuleIdentifier, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {
58
+ const { maxDepth = 5, direction } = options ?? {}
59
+ const filterOptions: ModuleFilterOptions = { direction }
60
+ const module = assertEx(await super.resolve(id, filterOptions), () => `Expose failed to locate module [${id}]`)
49
61
  if (module) {
50
62
  const host = assertEx(this.busHost(), () => 'Not configured as a host')
51
63
  host.expose(module.address)
52
- return [module.address]
64
+ const children = await module.resolve('*', { direction, maxDepth, visibility: 'public' })
65
+ for (const child of children) {
66
+ host.expose(child.address)
67
+ }
68
+ return [module, ...children]
53
69
  }
54
70
  return []
55
71
  }
56
72
 
57
- async unexposeHandler(id: ModuleIdentifier, options?: BridgeUnexposeOptions | undefined): Promise<Address[]> {
58
- const filterOptions: ModuleFilterOptions = { direction: options?.direction }
73
+ exposedHandler(): Address[] {
74
+ const exposedSet = this.busHost()?.exposedAddresses
75
+ return exposedSet ? [...exposedSet] : []
76
+ }
77
+
78
+ override async startHandler(): Promise<boolean> {
79
+ this.busHost()?.start()
80
+ return await super.startHandler()
81
+ }
82
+
83
+ async unexposeHandler(id: ModuleIdentifier, options?: BridgeUnexposeOptions | undefined): Promise<ModuleInstance[]> {
84
+ const { maxDepth = 1, direction } = options ?? {}
85
+ const filterOptions: ModuleFilterOptions = { direction }
59
86
  const module = await super.resolve(id, filterOptions)
60
87
  if (module) {
61
88
  const host = assertEx(this.busHost(), () => 'Not configured as a host')
62
89
  host.unexpose(module.address)
63
- return [module.address]
90
+ const children = await module.resolve('*', { direction, maxDepth, visibility: 'public' })
91
+ for (const child of children) {
92
+ host.unexpose(child.address)
93
+ }
94
+ return [module, ...children]
64
95
  }
65
96
  return []
66
97
  }
@@ -87,11 +118,6 @@ export class PubSubBridge<TParams extends PubSubBridgeParams = PubSubBridgeParam
87
118
  return this._busHost
88
119
  }
89
120
 
90
- protected override startHandler(): Promise<boolean> {
91
- this.busHost()?.start()
92
- return Promise.resolve(true)
93
- }
94
-
95
121
  protected override stopHandler(_timeout?: number | undefined) {
96
122
  this.busHost()?.stop()
97
123
  return true
@@ -1,7 +1,9 @@
1
- import { Address } from '@xylabs/hex'
2
- import { AbstractBridgeModuleResolver, BridgeModuleResolverOptions } from '@xyo-network/abstract-bridge'
1
+ import { assertEx } from '@xylabs/assert'
2
+ import { Address, isAddress } from '@xylabs/hex'
3
+ import { AbstractBridgeModuleResolver, BridgeModuleResolverOptions, wrapModuleWithType } from '@xyo-network/abstract-bridge'
3
4
  import { Account } from '@xyo-network/account'
4
- import { ModuleFilterOptions, ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model'
5
+ import { ConfigPayload, ConfigSchema } from '@xyo-network/config-payload-plugin'
6
+ import { ModuleConfig, ModuleConfigSchema, ModuleFilterOptions, ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model'
5
7
 
6
8
  import { AsyncQueryBusClient, AsyncQueryBusModuleProxy, AsyncQueryBusModuleProxyParams } from './AsyncQueryBus'
7
9
 
@@ -9,21 +11,42 @@ export interface PubSubBridgeModuleResolverOptions extends BridgeModuleResolverO
9
11
  busClient: AsyncQueryBusClient
10
12
  }
11
13
 
12
- export class PubSubBridgeModuleResolver<
13
- T extends PubSubBridgeModuleResolverOptions = PubSubBridgeModuleResolverOptions,
14
- > extends AbstractBridgeModuleResolver<T> {
15
- async resolveHandler<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined> {
14
+ export class PubSubBridgeModuleResolver extends AbstractBridgeModuleResolver<PubSubBridgeModuleResolverOptions> {
15
+ override async resolveHandler<T extends ModuleInstance = ModuleInstance>(
16
+ id: ModuleIdentifier,
17
+ options?: ModuleFilterOptions<T>,
18
+ ): Promise<T | T[] | undefined> {
19
+ const parentResult = await super.resolveHandler(id, options)
20
+ if (parentResult) {
21
+ return parentResult
22
+ }
16
23
  const idParts = id.split(':')
17
24
  const firstPart = idParts.shift()
25
+ assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`)
18
26
  const remainderParts = idParts.join(':')
19
27
  const account = Account.randomSync()
20
28
  const params: AsyncQueryBusModuleProxyParams = {
21
29
  account,
22
30
  busClient: this.options.busClient,
31
+ config: { schema: ModuleConfigSchema },
23
32
  host: this.options.bridge,
24
33
  moduleAddress: firstPart as Address,
25
34
  }
26
- const proxy = new AsyncQueryBusModuleProxy<T>(params) as unknown as T
27
- return remainderParts.length > 0 ? await proxy.resolve(remainderParts, options) : proxy
35
+ const proxy = new AsyncQueryBusModuleProxy<T, AsyncQueryBusModuleProxyParams>(params)
36
+ if (proxy) {
37
+ const state = await proxy.state()
38
+ if (state) {
39
+ const configSchema = (state.find((payload) => payload.schema === ConfigSchema) as ConfigPayload | undefined)?.config
40
+ const config = assertEx(
41
+ state.find((payload) => payload.schema === configSchema),
42
+ () => 'Unable to locate config',
43
+ ) as ModuleConfig
44
+ proxy.setConfig(config)
45
+ }
46
+ }
47
+ await proxy.start?.()
48
+ const wrappedProxy = wrapModuleWithType(proxy, account) as unknown as T
49
+ this.add(wrappedProxy)
50
+ return remainderParts.length > 0 ? await proxy.resolve(remainderParts, options) : wrappedProxy
28
51
  }
29
52
  }