@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.
- package/dist/browser/Bridge.d.cts +21 -0
- package/dist/browser/Bridge.d.cts.map +1 -0
- package/dist/browser/Bridge.d.mts +21 -0
- package/dist/browser/Bridge.d.mts.map +1 -0
- package/dist/browser/Bridge.d.ts +21 -0
- package/dist/browser/Bridge.d.ts.map +1 -0
- package/dist/browser/Config.d.cts +12 -0
- package/dist/browser/Config.d.cts.map +1 -0
- package/dist/browser/Config.d.mts +12 -0
- package/dist/browser/Config.d.mts.map +1 -0
- package/dist/browser/Config.d.ts +12 -0
- package/dist/browser/Config.d.ts.map +1 -0
- package/dist/browser/ModuleProxy/ModuleProxy.d.cts +18 -0
- package/dist/browser/ModuleProxy/ModuleProxy.d.cts.map +1 -0
- package/dist/browser/ModuleProxy/ModuleProxy.d.mts +18 -0
- package/dist/browser/ModuleProxy/ModuleProxy.d.mts.map +1 -0
- package/dist/browser/ModuleProxy/ModuleProxy.d.ts +18 -0
- package/dist/browser/ModuleProxy/ModuleProxy.d.ts.map +1 -0
- package/dist/browser/ModuleProxy/index.d.cts +2 -0
- package/dist/browser/ModuleProxy/index.d.cts.map +1 -0
- package/dist/browser/ModuleProxy/index.d.mts +2 -0
- package/dist/browser/ModuleProxy/index.d.mts.map +1 -0
- package/dist/browser/ModuleProxy/index.d.ts +2 -0
- package/dist/browser/ModuleProxy/index.d.ts.map +1 -0
- package/dist/browser/ModuleResolver.d.cts +11 -0
- package/dist/browser/ModuleResolver.d.cts.map +1 -0
- package/dist/browser/ModuleResolver.d.mts +11 -0
- package/dist/browser/ModuleResolver.d.mts.map +1 -0
- package/dist/browser/ModuleResolver.d.ts +11 -0
- package/dist/browser/ModuleResolver.d.ts.map +1 -0
- package/dist/browser/index.cjs +147 -2
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.d.cts +2 -1
- package/dist/browser/index.d.cts.map +1 -1
- package/dist/browser/index.d.mts +2 -1
- package/dist/browser/index.d.mts.map +1 -1
- package/dist/browser/index.d.ts +2 -1
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +148 -3
- package/dist/browser/index.js.map +1 -1
- package/dist/node/Bridge.d.cts +21 -0
- package/dist/node/Bridge.d.cts.map +1 -0
- package/dist/node/Bridge.d.mts +21 -0
- package/dist/node/Bridge.d.mts.map +1 -0
- package/dist/node/Bridge.d.ts +21 -0
- package/dist/node/Bridge.d.ts.map +1 -0
- package/dist/node/Config.d.cts +12 -0
- package/dist/node/Config.d.cts.map +1 -0
- package/dist/node/Config.d.mts +12 -0
- package/dist/node/Config.d.mts.map +1 -0
- package/dist/node/Config.d.ts +12 -0
- package/dist/node/Config.d.ts.map +1 -0
- package/dist/node/ModuleProxy/ModuleProxy.d.cts +18 -0
- package/dist/node/ModuleProxy/ModuleProxy.d.cts.map +1 -0
- package/dist/node/ModuleProxy/ModuleProxy.d.mts +18 -0
- package/dist/node/ModuleProxy/ModuleProxy.d.mts.map +1 -0
- package/dist/node/ModuleProxy/ModuleProxy.d.ts +18 -0
- package/dist/node/ModuleProxy/ModuleProxy.d.ts.map +1 -0
- package/dist/node/ModuleProxy/index.d.cts +2 -0
- package/dist/node/ModuleProxy/index.d.cts.map +1 -0
- package/dist/node/ModuleProxy/index.d.mts +2 -0
- package/dist/node/ModuleProxy/index.d.mts.map +1 -0
- package/dist/node/ModuleProxy/index.d.ts +2 -0
- package/dist/node/ModuleProxy/index.d.ts.map +1 -0
- package/dist/node/ModuleResolver.d.cts +11 -0
- package/dist/node/ModuleResolver.d.cts.map +1 -0
- package/dist/node/ModuleResolver.d.mts +11 -0
- package/dist/node/ModuleResolver.d.mts.map +1 -0
- package/dist/node/ModuleResolver.d.ts +11 -0
- package/dist/node/ModuleResolver.d.ts.map +1 -0
- package/dist/node/index.cjs +153 -3
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.d.cts +2 -1
- package/dist/node/index.d.cts.map +1 -1
- package/dist/node/index.d.mts +2 -1
- package/dist/node/index.d.mts.map +1 -1
- package/dist/node/index.d.ts +2 -1
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +152 -3
- package/dist/node/index.js.map +1 -1
- package/package.json +21 -4
- package/src/Bridge.ts +54 -0
- package/src/Config.ts +16 -0
- package/src/ModuleProxy/ModuleProxy.ts +34 -0
- package/src/ModuleProxy/index.ts +1 -0
- package/src/ModuleResolver.ts +76 -0
- package/src/index.ts +2 -1
- 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
|
|
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
|
+
})
|