@xyo-network/bridge-http-express 5.6.4 → 6.0.0

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.
@@ -191,4 +191,4 @@ export {
191
191
  HttpBridgeExpress,
192
192
  HttpBridgeExpressConfigSchema
193
193
  };
194
- //# sourceMappingURL=index.mjs.map
194
+ //# sourceMappingURL=index.mjs.map
@@ -1 +1,7 @@
1
- {"version":3,"sources":["../../src/HttpBridge.ts"],"sourcesContent":["import type { Server } from 'node:http'\n\nimport {\n asyncHandler,\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n jsonBodyParser,\n responseProfiler,\n useRequestCounters,\n} from '@xylabs/express'\nimport type { Address } from '@xylabs/sdk-js'\nimport {\n assertEx,\n exists, toSafeJsonString,\n} from '@xylabs/sdk-js'\nimport type { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { isQueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport type { HttpBridgeConfig } from '@xyo-network/bridge-http'\nimport { HttpBridge } from '@xyo-network/bridge-http'\nimport type {\n BridgeExposeOptions, BridgeParams, BridgeUnexposeOptions,\n} from '@xyo-network/bridge-model'\n// import { standardResponses } from '@xyo-network/express-node-middleware'\nimport type {\n AnyConfigSchema, ModuleInstance, ModuleQueryResult,\n} from '@xyo-network/module-model'\nimport { creatableModule } from '@xyo-network/module-model'\nimport { resolveAddressToInstanceUp } from '@xyo-network/module-resolver'\nimport type { Payload, Schema } from '@xyo-network/payload-model'\nimport { asSchema } from '@xyo-network/payload-model'\nimport type {\n Application, Request, Response,\n} from 'express'\nimport express from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\n/**\n * The type of the path parameters for the address path.\n */\ninterface AddressPathParams {\n address: Address\n}\n\n/**\n * The type of the request body for the address path.\n */\ntype PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]]\n\n// TODO: This does not match the error response shape of the legacy bridge BUT it its the\n// shape this bridge is currently returning. Massage this into the standard\n// error shape constructed via middleware.\n/* type ErrorResponseBody = {\n error: string\n} */\n\nexport const HttpBridgeExpressConfigSchema = asSchema('network.xyo.bridge.http.express.config', true)\nexport type HttpBridgeExpressConfigSchema = typeof HttpBridgeExpressConfigSchema\n\nexport interface HttpBridgeExpressConfig extends HttpBridgeConfig<{}, HttpBridgeExpressConfigSchema> {}\n\nexport interface HttpBridgeExpressParams extends BridgeParams<AnyConfigSchema<HttpBridgeExpressConfig>> {}\n\n@creatableModule()\nexport class HttpBridgeExpress<TParams extends HttpBridgeExpressParams> extends HttpBridge<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, HttpBridgeExpressConfigSchema]\n protected _app?: Application\n protected _exposedModules: WeakRef<ModuleInstance>[] = []\n protected _server?: Server\n\n protected get app() {\n if (!this._app) this._app = this.initializeApp()\n return assertEx(this._app, () => 'App not initialized')\n }\n\n async exposeChild(mod: ModuleInstance, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 5 } = options ?? {}\n assertEx(this.config.host, () => 'Not configured as a host')\n this._exposedModules.push(new WeakRef(mod))\n const children = maxDepth > 0 ? ((await mod.publicChildren?.()) ?? []) : []\n this.logger?.log(`childrenToExpose [${mod.id}][${mod.address}]: ${toSafeJsonString(children.map(child => child.id))}`)\n const exposedChildren = (await Promise.all(children.map(child => this.exposeChild(child, { maxDepth: maxDepth - 1, required: false }))))\n .flat()\n .filter(exists)\n const allExposed = [mod, ...exposedChildren]\n\n for (const exposedMod of allExposed) this.logger?.log(`exposed: ${exposedMod.address} [${mod.id}]`)\n\n return allExposed\n }\n\n override async exposeHandler(address: Address, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {\n const { required = true } = options ?? {}\n const mod = await resolveAddressToInstanceUp(this, address)\n if (required && !mod) {\n throw new Error(`Unable to find required module: ${address}`)\n }\n if (mod) {\n return this.exposeChild(mod, options)\n }\n return []\n }\n\n override exposedHandler(): Address[] {\n return this._exposedModules.map(ref => ref.deref()?.address).filter(exists)\n }\n\n override async startHandler() {\n await super.startHandler()\n await this.startHttpServer()\n }\n\n override async stopHandler(_timeout?: number | undefined) {\n await super.stopHandler()\n await this.stopHttpServer()\n }\n\n override async unexposeHandler(address: Address, options?: BridgeUnexposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 2, required = true } = options ?? {}\n assertEx(this.config.host, () => 'Not configured as a host')\n const mod = this._exposedModules.find(ref => ref.deref()?.address === address)?.deref()\n assertEx(!required || mod, () => `Module not exposed: ${address}`)\n this._exposedModules = this._exposedModules.filter(ref => ref.deref()?.address !== address)\n if (mod) {\n const children = maxDepth > 0 ? ((await mod.publicChildren?.()) ?? []) : []\n const exposedChildren = (\n await Promise.all(children.map(child => this.unexposeHandler(child.address, { maxDepth: maxDepth - 1, required: false })))\n )\n .flat()\n .filter(exists)\n return [mod, ...exposedChildren]\n }\n return []\n }\n\n protected async callLocalModule(address: Address, query: QueryBoundWitness, payloads: Payload[]): Promise<ModuleQueryResult | null> {\n const mod = this._exposedModules.find(ref => ref.deref()?.address === address)?.deref()\n return mod ? await mod.query(query, payloads) : null\n }\n\n protected async handleGet(req: Request<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>, res: Response) {\n const { address } = req.params\n try {\n if (address == this.address) {\n res.json(await this.stateQuery(this.account))\n } else {\n const mod = this._exposedModules.find(ref => ref.deref()?.address === address)?.deref()\n // TODO: Use standard errors middleware\n if (mod) {\n res.json(await mod.stateQuery(this.account))\n } else {\n res.status(StatusCodes.NOT_FOUND).json({ error: 'Module not found' })\n }\n }\n } catch (ex) {\n // TODO: Sanitize message\n res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ error: (ex as Error).message })\n }\n }\n\n protected async handlePost(req: Request<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>, res: Response) {\n const { address } = req.params\n const [bw, payloads = []] = Array.isArray(req.body) ? req.body : []\n const query = isQueryBoundWitness(bw) ? bw : undefined\n if (!query) {\n // TODO: Use standard errors middleware\n res.status(StatusCodes.BAD_REQUEST).json({ error: 'No query provided' })\n return\n }\n try {\n if (address == this.address) {\n const result = await this.query(query, payloads)\n return res.json(result)\n } else {\n const result = await this.callLocalModule(address, query, payloads)\n // TODO: Use standard errors middleware\n if (result === null) {\n res.status(StatusCodes.NOT_FOUND).json({ error: 'Module not found' })\n } else {\n res.json(result)\n }\n }\n } catch (ex) {\n // TODO: Sanitize message\n res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ error: (ex as Error).message })\n }\n }\n\n protected initializeApp(): Application {\n // Create the express app\n const app = express()\n\n // Add middleware\n app.use(responseProfiler)\n app.use(jsonBodyParser)\n // removed for now since this causes a cycle\n // app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n useRequestCounters(app)\n\n // Add routes\n // Redirect all requests to the root to this module's address\n app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${this.address}`))\n app.post('/', (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${this.address}`))\n\n app.get<AddressPathParams, ModuleQueryResult>(\n '/:address',\n\n asyncHandler(async (req, res) => await this.handleGet(req, res)),\n )\n app.post<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>(\n '/:address',\n\n asyncHandler(async (req, res) => { await this.handlePost(req, res) }),\n )\n return app\n }\n\n protected startHttpServer(): Promise<boolean> {\n if (this.config.host) {\n assertEx(!this._server, () => 'Server already started')\n this._server = this.app.listen(this.config.host?.port ?? 3030)\n }\n return Promise.resolve(true)\n }\n\n protected stopHttpServer(): Promise<boolean> {\n if (this.config.host) {\n return new Promise((resolve, reject) => {\n if (this._server) {\n this._server.close((err) => {\n if (err) {\n reject(err)\n } else {\n this._server = undefined\n resolve(true)\n }\n })\n }\n })\n }\n return Promise.resolve(true)\n }\n}\n"],"mappings":"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","names":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/HttpBridge.ts"],
4
+ "sourcesContent": ["import type { Server } from 'node:http'\n\nimport {\n asyncHandler,\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n jsonBodyParser,\n responseProfiler,\n useRequestCounters,\n} from '@xylabs/express'\nimport type { Address } from '@xylabs/sdk-js'\nimport {\n assertEx,\n exists, toSafeJsonString,\n} from '@xylabs/sdk-js'\nimport type { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { isQueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport type { HttpBridgeConfig } from '@xyo-network/bridge-http'\nimport { HttpBridge } from '@xyo-network/bridge-http'\nimport type {\n BridgeExposeOptions, BridgeParams, BridgeUnexposeOptions,\n} from '@xyo-network/bridge-model'\n// import { standardResponses } from '@xyo-network/express-node-middleware'\nimport type {\n AnyConfigSchema, ModuleInstance, ModuleQueryResult,\n} from '@xyo-network/module-model'\nimport { creatableModule } from '@xyo-network/module-model'\nimport { resolveAddressToInstanceUp } from '@xyo-network/module-resolver'\nimport type { Payload, Schema } from '@xyo-network/payload-model'\nimport { asSchema } from '@xyo-network/payload-model'\nimport type {\n Application, Request, Response,\n} from 'express'\nimport express from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\n/**\n * The type of the path parameters for the address path.\n */\ninterface AddressPathParams {\n address: Address\n}\n\n/**\n * The type of the request body for the address path.\n */\ntype PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]]\n\n// TODO: This does not match the error response shape of the legacy bridge BUT it its the\n// shape this bridge is currently returning. Massage this into the standard\n// error shape constructed via middleware.\n/* type ErrorResponseBody = {\n error: string\n} */\n\nexport const HttpBridgeExpressConfigSchema = asSchema('network.xyo.bridge.http.express.config', true)\nexport type HttpBridgeExpressConfigSchema = typeof HttpBridgeExpressConfigSchema\n\nexport interface HttpBridgeExpressConfig extends HttpBridgeConfig<{}, HttpBridgeExpressConfigSchema> {}\n\nexport interface HttpBridgeExpressParams extends BridgeParams<AnyConfigSchema<HttpBridgeExpressConfig>> {}\n\n@creatableModule()\nexport class HttpBridgeExpress<TParams extends HttpBridgeExpressParams> extends HttpBridge<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, HttpBridgeExpressConfigSchema]\n protected _app?: Application\n protected _exposedModules: WeakRef<ModuleInstance>[] = []\n protected _server?: Server\n\n protected get app() {\n if (!this._app) this._app = this.initializeApp()\n return assertEx(this._app, () => 'App not initialized')\n }\n\n async exposeChild(mod: ModuleInstance, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 5 } = options ?? {}\n assertEx(this.config.host, () => 'Not configured as a host')\n this._exposedModules.push(new WeakRef(mod))\n const children = maxDepth > 0 ? ((await mod.publicChildren?.()) ?? []) : []\n this.logger?.log(`childrenToExpose [${mod.id}][${mod.address}]: ${toSafeJsonString(children.map(child => child.id))}`)\n const exposedChildren = (await Promise.all(children.map(child => this.exposeChild(child, { maxDepth: maxDepth - 1, required: false }))))\n .flat()\n .filter(exists)\n const allExposed = [mod, ...exposedChildren]\n\n for (const exposedMod of allExposed) this.logger?.log(`exposed: ${exposedMod.address} [${mod.id}]`)\n\n return allExposed\n }\n\n override async exposeHandler(address: Address, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {\n const { required = true } = options ?? {}\n const mod = await resolveAddressToInstanceUp(this, address)\n if (required && !mod) {\n throw new Error(`Unable to find required module: ${address}`)\n }\n if (mod) {\n return this.exposeChild(mod, options)\n }\n return []\n }\n\n override exposedHandler(): Address[] {\n return this._exposedModules.map(ref => ref.deref()?.address).filter(exists)\n }\n\n override async startHandler() {\n await super.startHandler()\n await this.startHttpServer()\n }\n\n override async stopHandler(_timeout?: number | undefined) {\n await super.stopHandler()\n await this.stopHttpServer()\n }\n\n override async unexposeHandler(address: Address, options?: BridgeUnexposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 2, required = true } = options ?? {}\n assertEx(this.config.host, () => 'Not configured as a host')\n const mod = this._exposedModules.find(ref => ref.deref()?.address === address)?.deref()\n assertEx(!required || mod, () => `Module not exposed: ${address}`)\n this._exposedModules = this._exposedModules.filter(ref => ref.deref()?.address !== address)\n if (mod) {\n const children = maxDepth > 0 ? ((await mod.publicChildren?.()) ?? []) : []\n const exposedChildren = (\n await Promise.all(children.map(child => this.unexposeHandler(child.address, { maxDepth: maxDepth - 1, required: false })))\n )\n .flat()\n .filter(exists)\n return [mod, ...exposedChildren]\n }\n return []\n }\n\n protected async callLocalModule(address: Address, query: QueryBoundWitness, payloads: Payload[]): Promise<ModuleQueryResult | null> {\n const mod = this._exposedModules.find(ref => ref.deref()?.address === address)?.deref()\n return mod ? await mod.query(query, payloads) : null\n }\n\n protected async handleGet(req: Request<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>, res: Response) {\n const { address } = req.params\n try {\n if (address == this.address) {\n res.json(await this.stateQuery(this.account))\n } else {\n const mod = this._exposedModules.find(ref => ref.deref()?.address === address)?.deref()\n // TODO: Use standard errors middleware\n if (mod) {\n res.json(await mod.stateQuery(this.account))\n } else {\n res.status(StatusCodes.NOT_FOUND).json({ error: 'Module not found' })\n }\n }\n } catch (ex) {\n // TODO: Sanitize message\n res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ error: (ex as Error).message })\n }\n }\n\n protected async handlePost(req: Request<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>, res: Response) {\n const { address } = req.params\n const [bw, payloads = []] = Array.isArray(req.body) ? req.body : []\n const query = isQueryBoundWitness(bw) ? bw : undefined\n if (!query) {\n // TODO: Use standard errors middleware\n res.status(StatusCodes.BAD_REQUEST).json({ error: 'No query provided' })\n return\n }\n try {\n if (address == this.address) {\n const result = await this.query(query, payloads)\n return res.json(result)\n } else {\n const result = await this.callLocalModule(address, query, payloads)\n // TODO: Use standard errors middleware\n if (result === null) {\n res.status(StatusCodes.NOT_FOUND).json({ error: 'Module not found' })\n } else {\n res.json(result)\n }\n }\n } catch (ex) {\n // TODO: Sanitize message\n res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ error: (ex as Error).message })\n }\n }\n\n protected initializeApp(): Application {\n // Create the express app\n const app = express()\n\n // Add middleware\n app.use(responseProfiler)\n app.use(jsonBodyParser)\n // removed for now since this causes a cycle\n // app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n useRequestCounters(app)\n\n // Add routes\n // Redirect all requests to the root to this module's address\n app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${this.address}`))\n app.post('/', (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${this.address}`))\n\n app.get<AddressPathParams, ModuleQueryResult>(\n '/:address',\n\n asyncHandler(async (req, res) => await this.handleGet(req, res)),\n )\n app.post<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>(\n '/:address',\n\n asyncHandler(async (req, res) => { await this.handlePost(req, res) }),\n )\n return app\n }\n\n protected startHttpServer(): Promise<boolean> {\n if (this.config.host) {\n assertEx(!this._server, () => 'Server already started')\n this._server = this.app.listen(this.config.host?.port ?? 3030)\n }\n return Promise.resolve(true)\n }\n\n protected stopHttpServer(): Promise<boolean> {\n if (this.config.host) {\n return new Promise((resolve, reject) => {\n if (this._server) {\n this._server.close((err) => {\n if (err) {\n reject(err)\n } else {\n this._server = undefined\n resolve(true)\n }\n })\n }\n })\n }\n return Promise.resolve(true)\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/bridge-http-express",
3
- "version": "5.6.4",
3
+ "version": "6.0.0",
4
4
  "description": "Primary SDK for using XYO Protocol 2.0",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -33,10 +33,10 @@
33
33
  "package.json"
34
34
  ],
35
35
  "dependencies": {
36
- "@xyo-network/bridge-http": "~5.6.4",
37
- "@xyo-network/bridge-model": "~5.6.4",
38
- "@xyo-network/module-model": "~5.6.4",
39
- "@xyo-network/module-resolver": "~5.6.4"
36
+ "@xyo-network/bridge-http": "~6.0.0",
37
+ "@xyo-network/bridge-model": "~6.0.0",
38
+ "@xyo-network/module-model": "~6.0.0",
39
+ "@xyo-network/module-resolver": "~6.0.0"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@bitauth/libauth": "~3.0.0",
@@ -45,27 +45,27 @@
45
45
  "@scure/base": "~2.2.0",
46
46
  "@scure/bip39": "~2.2.0",
47
47
  "@types/express": "^5.0.6",
48
- "@types/node": "^25.6.0",
49
- "@xylabs/express": "^5.1.2",
50
- "@xylabs/sdk-js": "^5.1.2",
51
- "@xylabs/threads": "~5.1.2",
52
- "@xylabs/toolchain": "~7.13.15",
53
- "@xylabs/tsconfig": "~7.13.15",
54
- "@xylabs/vitest-extended": "~5.1.2",
55
- "@xyo-network/account": "~5.6.2",
56
- "@xyo-network/account-model": "~5.6.3",
57
- "@xyo-network/api-models": "~5.6.3",
58
- "@xyo-network/boundwitness-builder": "~5.6.2",
59
- "@xyo-network/boundwitness-model": "~5.6.3",
60
- "@xyo-network/boundwitness-wrapper": "~5.6.2",
61
- "@xyo-network/config-payload-plugin": "~5.6.3",
62
- "@xyo-network/manifest-model": "~5.6.3",
63
- "@xyo-network/payload-builder": "~5.6.2",
64
- "@xyo-network/payload-model": "~5.6.3",
65
- "@xyo-network/payload-wrapper": "~5.6.2",
66
- "@xyo-network/query-payload-plugin": "~5.6.3",
67
- "@xyo-network/wallet": "~5.6.2",
68
- "@xyo-network/wallet-model": "~5.6.3",
48
+ "@types/node": "^25.9.1",
49
+ "@xylabs/express": "^6.0.0",
50
+ "@xylabs/sdk-js": "^6.0.0",
51
+ "@xylabs/threads": "~6.0.0",
52
+ "@xylabs/toolchain": "~8.0.17",
53
+ "@xylabs/tsconfig": "~8.0.17",
54
+ "@xylabs/vitest-extended": "~6.0.0",
55
+ "@xyo-network/account": "~6.0",
56
+ "@xyo-network/account-model": "~6.0",
57
+ "@xyo-network/api-models": "~6.0.0",
58
+ "@xyo-network/boundwitness-builder": "~6.0",
59
+ "@xyo-network/boundwitness-model": "~6.0",
60
+ "@xyo-network/boundwitness-wrapper": "~6.0",
61
+ "@xyo-network/config-payload-plugin": "~6.0",
62
+ "@xyo-network/manifest-model": "~6.0",
63
+ "@xyo-network/payload-builder": "~6.0.0",
64
+ "@xyo-network/payload-model": "~6.0.0",
65
+ "@xyo-network/payload-wrapper": "~6.0.0",
66
+ "@xyo-network/query-payload-plugin": "~6.0",
67
+ "@xyo-network/wallet": "~6.0.0",
68
+ "@xyo-network/wallet-model": "~6.0",
69
69
  "async-mutex": "^0.5.0",
70
70
  "bn.js": "^5.2.3",
71
71
  "body-parser": "~2.2.2",
@@ -73,51 +73,51 @@
73
73
  "chalk": "^5.6.2",
74
74
  "connect": "^3.7.0",
75
75
  "debug": "~4.4.3",
76
- "eslint": "^10.3.0",
76
+ "eslint": "^10.4.0",
77
77
  "ethers": "^6.16.0",
78
78
  "express": "^5.2.1",
79
79
  "express-mung": "~0.5.1",
80
80
  "get-port-please": "~3.2.0",
81
81
  "hash-wasm": "~4.12.0",
82
82
  "http-status-codes": "~2.3.0",
83
- "lru-cache": "^11.3.6",
83
+ "lru-cache": "^11.5.0",
84
84
  "observable-fns": "~0.6.1",
85
85
  "pako": "~2.1.0",
86
86
  "rollbar": "~3.1.0",
87
87
  "tslib": "^2.8.1",
88
- "typescript": "~5.9.3",
89
- "vite": "^8.0.10",
90
- "vitest": "~4.1.5",
88
+ "typescript": "~6.0.3",
89
+ "vite": "^8.0.13",
90
+ "vitest": "~4.1.6",
91
91
  "wasm-feature-detect": "~1.8.0",
92
92
  "winston": "~3.19.0",
93
93
  "winston-transport": "~4.9.0",
94
94
  "zod": "^4.4.3",
95
- "@xyo-network/archivist-model": "~5.6.4",
96
- "@xyo-network/bridge-abstract": "~5.6.4",
97
- "@xyo-network/diviner-model": "~5.6.4",
98
- "@xyo-network/bridge-pub-sub": "~5.6.4",
99
- "@xyo-network/node-model": "~5.6.4",
100
- "@xyo-network/node-memory": "~5.6.4"
95
+ "@xyo-network/archivist-model": "~6.0.0",
96
+ "@xyo-network/bridge-pub-sub": "~6.0.0",
97
+ "@xyo-network/bridge-abstract": "~6.0.0",
98
+ "@xyo-network/diviner-model": "~6.0.0",
99
+ "@xyo-network/node-memory": "~6.0.0",
100
+ "@xyo-network/node-model": "~6.0.0"
101
101
  },
102
102
  "peerDependencies": {
103
103
  "@bitauth/libauth": "~3.0",
104
104
  "@opentelemetry/api": "^1.9",
105
105
  "@opentelemetry/sdk-trace-base": "^2.7",
106
106
  "@scure/base": "~2.2",
107
- "@xylabs/express": "^5.1",
108
- "@xylabs/sdk-js": "^5.1",
109
- "@xylabs/threads": "~5.1",
110
- "@xyo-network/account": "~5.6",
111
- "@xyo-network/account-model": "~5.6",
112
- "@xyo-network/boundwitness-builder": "~5.6",
113
- "@xyo-network/boundwitness-model": "~5.6",
114
- "@xyo-network/boundwitness-wrapper": "~5.6",
115
- "@xyo-network/config-payload-plugin": "~5.6",
116
- "@xyo-network/manifest-model": "~5.6",
117
- "@xyo-network/payload-builder": "~5.6",
118
- "@xyo-network/payload-model": "~5.6",
119
- "@xyo-network/query-payload-plugin": "~5.6",
120
- "@xyo-network/wallet-model": "~5.6",
107
+ "@xylabs/express": "^6.0",
108
+ "@xylabs/sdk-js": "^6.0",
109
+ "@xylabs/threads": "~6.0",
110
+ "@xyo-network/account": "~6.0",
111
+ "@xyo-network/account-model": "~6.0",
112
+ "@xyo-network/boundwitness-builder": "~6.0",
113
+ "@xyo-network/boundwitness-model": "~6.0",
114
+ "@xyo-network/boundwitness-wrapper": "~6.0",
115
+ "@xyo-network/config-payload-plugin": "~6.0",
116
+ "@xyo-network/manifest-model": "~6.0",
117
+ "@xyo-network/payload-builder": "~6.0",
118
+ "@xyo-network/payload-model": "~6.0",
119
+ "@xyo-network/query-payload-plugin": "~6.0",
120
+ "@xyo-network/wallet-model": "~6.0",
121
121
  "async-mutex": "^0.5",
122
122
  "bn.js": "^5.2",
123
123
  "body-parser": "~2.2",