@xyo-network/bridge-websocket 2.94.5 → 2.94.7

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 (88) hide show
  1. package/dist/browser/Bridge.d.cts +21 -0
  2. package/dist/browser/Bridge.d.cts.map +1 -0
  3. package/dist/browser/Bridge.d.mts +21 -0
  4. package/dist/browser/Bridge.d.mts.map +1 -0
  5. package/dist/browser/Bridge.d.ts +21 -0
  6. package/dist/browser/Bridge.d.ts.map +1 -0
  7. package/dist/browser/Config.d.cts +12 -0
  8. package/dist/browser/Config.d.cts.map +1 -0
  9. package/dist/browser/Config.d.mts +12 -0
  10. package/dist/browser/Config.d.mts.map +1 -0
  11. package/dist/browser/Config.d.ts +12 -0
  12. package/dist/browser/Config.d.ts.map +1 -0
  13. package/dist/browser/ModuleProxy/ModuleProxy.d.cts +18 -0
  14. package/dist/browser/ModuleProxy/ModuleProxy.d.cts.map +1 -0
  15. package/dist/browser/ModuleProxy/ModuleProxy.d.mts +18 -0
  16. package/dist/browser/ModuleProxy/ModuleProxy.d.mts.map +1 -0
  17. package/dist/browser/ModuleProxy/ModuleProxy.d.ts +18 -0
  18. package/dist/browser/ModuleProxy/ModuleProxy.d.ts.map +1 -0
  19. package/dist/browser/ModuleProxy/index.d.cts +2 -0
  20. package/dist/browser/ModuleProxy/index.d.cts.map +1 -0
  21. package/dist/browser/ModuleProxy/index.d.mts +2 -0
  22. package/dist/browser/ModuleProxy/index.d.mts.map +1 -0
  23. package/dist/browser/ModuleProxy/index.d.ts +2 -0
  24. package/dist/browser/ModuleProxy/index.d.ts.map +1 -0
  25. package/dist/browser/ModuleResolver.d.cts +11 -0
  26. package/dist/browser/ModuleResolver.d.cts.map +1 -0
  27. package/dist/browser/ModuleResolver.d.mts +11 -0
  28. package/dist/browser/ModuleResolver.d.mts.map +1 -0
  29. package/dist/browser/ModuleResolver.d.ts +11 -0
  30. package/dist/browser/ModuleResolver.d.ts.map +1 -0
  31. package/dist/browser/index.cjs +147 -2
  32. package/dist/browser/index.cjs.map +1 -1
  33. package/dist/browser/index.d.cts +2 -1
  34. package/dist/browser/index.d.cts.map +1 -1
  35. package/dist/browser/index.d.mts +2 -1
  36. package/dist/browser/index.d.mts.map +1 -1
  37. package/dist/browser/index.d.ts +2 -1
  38. package/dist/browser/index.d.ts.map +1 -1
  39. package/dist/browser/index.js +148 -3
  40. package/dist/browser/index.js.map +1 -1
  41. package/dist/node/Bridge.d.cts +21 -0
  42. package/dist/node/Bridge.d.cts.map +1 -0
  43. package/dist/node/Bridge.d.mts +21 -0
  44. package/dist/node/Bridge.d.mts.map +1 -0
  45. package/dist/node/Bridge.d.ts +21 -0
  46. package/dist/node/Bridge.d.ts.map +1 -0
  47. package/dist/node/Config.d.cts +12 -0
  48. package/dist/node/Config.d.cts.map +1 -0
  49. package/dist/node/Config.d.mts +12 -0
  50. package/dist/node/Config.d.mts.map +1 -0
  51. package/dist/node/Config.d.ts +12 -0
  52. package/dist/node/Config.d.ts.map +1 -0
  53. package/dist/node/ModuleProxy/ModuleProxy.d.cts +18 -0
  54. package/dist/node/ModuleProxy/ModuleProxy.d.cts.map +1 -0
  55. package/dist/node/ModuleProxy/ModuleProxy.d.mts +18 -0
  56. package/dist/node/ModuleProxy/ModuleProxy.d.mts.map +1 -0
  57. package/dist/node/ModuleProxy/ModuleProxy.d.ts +18 -0
  58. package/dist/node/ModuleProxy/ModuleProxy.d.ts.map +1 -0
  59. package/dist/node/ModuleProxy/index.d.cts +2 -0
  60. package/dist/node/ModuleProxy/index.d.cts.map +1 -0
  61. package/dist/node/ModuleProxy/index.d.mts +2 -0
  62. package/dist/node/ModuleProxy/index.d.mts.map +1 -0
  63. package/dist/node/ModuleProxy/index.d.ts +2 -0
  64. package/dist/node/ModuleProxy/index.d.ts.map +1 -0
  65. package/dist/node/ModuleResolver.d.cts +11 -0
  66. package/dist/node/ModuleResolver.d.cts.map +1 -0
  67. package/dist/node/ModuleResolver.d.mts +11 -0
  68. package/dist/node/ModuleResolver.d.mts.map +1 -0
  69. package/dist/node/ModuleResolver.d.ts +11 -0
  70. package/dist/node/ModuleResolver.d.ts.map +1 -0
  71. package/dist/node/index.cjs +153 -3
  72. package/dist/node/index.cjs.map +1 -1
  73. package/dist/node/index.d.cts +2 -1
  74. package/dist/node/index.d.cts.map +1 -1
  75. package/dist/node/index.d.mts +2 -1
  76. package/dist/node/index.d.mts.map +1 -1
  77. package/dist/node/index.d.ts +2 -1
  78. package/dist/node/index.d.ts.map +1 -1
  79. package/dist/node/index.js +152 -3
  80. package/dist/node/index.js.map +1 -1
  81. package/package.json +21 -4
  82. package/src/Bridge.ts +54 -0
  83. package/src/Config.ts +16 -0
  84. package/src/ModuleProxy/ModuleProxy.ts +34 -0
  85. package/src/ModuleProxy/index.ts +1 -0
  86. package/src/ModuleResolver.ts +76 -0
  87. package/src/index.ts +2 -1
  88. package/src/spec/socketServer.ts +68 -0
@@ -0,0 +1,76 @@
1
+ import { assertEx } from '@xylabs/assert'
2
+ import { Address, isAddress } from '@xylabs/hex'
3
+ import { AbstractBridgeModuleResolver, BridgeModuleResolverOptions, wrapModuleWithType } from '@xyo-network/abstract-bridge'
4
+ import { Account } from '@xyo-network/account'
5
+ import { ConfigPayload, ConfigSchema } from '@xyo-network/config-payload-plugin'
6
+ import { asModuleInstance, ModuleConfig, ModuleConfigSchema, ModuleFilterOptions, ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model'
7
+
8
+ import { WebsocketModuleProxy, WebsocketModuleProxyParams } from './ModuleProxy'
9
+
10
+ export interface WebsocketBridgeModuleResolverOptions extends BridgeModuleResolverOptions {
11
+ url: string
12
+ }
13
+
14
+ export class WebsocketBridgeModuleResolver<
15
+ T extends WebsocketBridgeModuleResolverOptions = WebsocketBridgeModuleResolverOptions,
16
+ > extends AbstractBridgeModuleResolver<T> {
17
+ moduleUrl(address: Address) {
18
+ return new URL(address, this.options.url)
19
+ }
20
+
21
+ override async resolveHandler<T extends ModuleInstance = ModuleInstance>(
22
+ id: ModuleIdentifier,
23
+ options?: ModuleFilterOptions<T>,
24
+ ): Promise<T | T[] | undefined> {
25
+ const parentResult = await super.resolveHandler(id, options)
26
+ if (parentResult) {
27
+ return parentResult
28
+ }
29
+ if (id === '*') {
30
+ return []
31
+ }
32
+ const idParts = id.split(':')
33
+ const firstPart = assertEx(idParts.shift(), () => 'Missing firstPart')
34
+ const moduleAddress = firstPart as Address
35
+ assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`)
36
+ const remainderParts = idParts.join(':')
37
+ const params: WebsocketModuleProxyParams = {
38
+ account: Account.randomSync(),
39
+ config: { schema: ModuleConfigSchema },
40
+ host: this,
41
+ moduleAddress,
42
+ moduleUrl: this.moduleUrl(moduleAddress).href,
43
+ }
44
+
45
+ //console.log(`creating WebsocketProxy [${moduleAddress}] ${id}`)
46
+
47
+ const proxy = new WebsocketModuleProxy<T, WebsocketModuleProxyParams>(params)
48
+ //calling state here to get the config
49
+ if (proxy) {
50
+ const state = await proxy.state()
51
+ if (state) {
52
+ const configSchema = (state.find((payload) => payload.schema === ConfigSchema) as ConfigPayload | undefined)?.config
53
+ const config = assertEx(
54
+ state.find((payload) => payload.schema === configSchema),
55
+ () => 'Unable to locate config',
56
+ ) as ModuleConfig
57
+ proxy.setConfig(config)
58
+ }
59
+ }
60
+
61
+ await proxy.start()
62
+
63
+ 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)
67
+
68
+ if (remainderParts.length > 0) {
69
+ const result = await wrapped.resolve<T>(remainderParts, options)
70
+ return result
71
+ }
72
+
73
+ //console.log(`resolved: ${proxy.address} [${wrapped.constructor.name}] [${as.constructor.name}]`)
74
+ return as
75
+ }
76
+ }
package/src/index.ts CHANGED
@@ -1 +1,2 @@
1
- export const TODO = true
1
+ export * from './Bridge'
2
+ export * from './Config'
@@ -0,0 +1,68 @@
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
+ })