diff --git a/package.json b/package.json index aee86aa2f4d..028764763e5 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "@xylabs/tsconfig-dom-jest": "^3.2.42", "dotenv": "^16.4.1", "eslint": "^8.56.0", - "eslint-plugin-unicorn": "^50.0.1", + "eslint-plugin-unicorn": "^51.0.1", "jest": "^29.7.0", "jest-docblock": "^29.7.0", "jest-environment-jsdom": "^29.7.0", diff --git a/packages/manifest/package.json b/packages/manifest/package.json index 405c12591c5..78dd42d2f4b 100644 --- a/packages/manifest/package.json +++ b/packages/manifest/package.json @@ -16,6 +16,7 @@ "devDependencies": { "@xylabs/ts-scripts-yarn3": "^3.2.42", "@xylabs/tsconfig": "^3.2.42", + "ajv": "^8.12.0", "typescript": "^5.3.3" }, "types": "dist/node/index.d.ts", diff --git a/packages/manifest/src/dapp-package-manifest-schema.json b/packages/manifest/src/dapp-package-manifest-schema.json new file mode 100644 index 00000000000..13a916fc7a2 --- /dev/null +++ b/packages/manifest/src/dapp-package-manifest-schema.json @@ -0,0 +1,27 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://xyo.network/schemas/dapp-package-manifest-schema.json", + "properties": { + "description": { + "type": "string" + }, + "external": { + "$ref": "definitions-schema.json#/definitions/external", + "description": "The list of permission requests made by the dApp" + }, + "nodes": { + "$ref": "definitions-schema.json#/definitions/nodes", + "description": "The list of Nodes that are defined in the manifest" + }, + "schema": { + "pattern": "^network.xyo.dapp.manifest$", + "type": "string" + } + }, + "required": [ + "nodes", + "schema" + ], + "title": "XYO Dapp Manifest", + "type": "object" +} \ No newline at end of file diff --git a/packages/manifest/src/schema.json b/packages/manifest/src/schema.json index 032ab29b108..834d85091b0 100644 --- a/packages/manifest/src/schema.json +++ b/packages/manifest/src/schema.json @@ -1,217 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://xyo.network/schemas/package-manifest-schema.json", "additionalProperties": false, - "definitions": { - "architecture": { - "description": "Architecture", - "enum": [ - "386", - "amd64", - "arm", - "arm64", - "loong64", - "mips", - "mipsle", - "mips64", - "mips64le", - "ppc64", - "ppc64le", - "riscv64", - "s390x", - "wasm" - ], - "type": "string" - }, - "config": { - "additionalProperties": true, - "description": "Config for a module", - "id": { - "type": "string" - }, - "properties": { - "accountPath": { - "description": "HDWallet path to derive account", - "type": "string" - }, - "architecture": { - "$ref": "#/definitions/architecture" - }, - "description": { - "type": "string" - }, - "features": { - "items": { - "$ref": "#/definitions/feature" - }, - "type": "array" - }, - "language": { - "$ref": "#/definitions/language" - }, - "name": { - "type": "string" - }, - "os": { - "$ref": "#/definitions/os" - }, - "schema": { - "type": "string" - } - }, - "required": [ - "name", - "schema" - ], - "type": "object" - }, - "feature": { - "description": "Framework", - "enum": [ - "angular", - "asp.net", - "browser", - "cryengine", - "corona", - "django", - "flutter", - "ionic", - "jquery", - "nodejs", - "phonegap", - "react", - "react-native", - "spring", - "unity", - "unreal", - "vue", - "xamarin" - ], - "type": "string" - }, - "language": { - "description": "Language", - "enum": [ - "c", - "c++", - "c#", - "go", - "java", - "javascript", - "kotlin", - "lua", - "python", - "ruby", - "rust", - "scala", - "solidity", - "swift" - ], - "type": "string" - }, - "module": { - "additionalProperties": false, - "description": "Module Definition", - "properties": { - "config": { - "$ref": "#/definitions/config" - }, - "description": { - "type": "string" - } - }, - "required": [ - "config" - ], - "type": "object" - }, - "modules": { - "description": "List of Modules", - "items": { - "$ref": "#/definitions/module" - }, - "nullable": true, - "type": "array" - }, - "node": { - "additionalProperties": false, - "description": "Node Definition - Generally loaded into an existing or new Node Module", - "id": { - "type": "string" - }, - "properties": { - "config": { - "$ref": "#/definitions/config" - }, - "description": { - "type": "string" - }, - "modules": { - "additionalProperties": false, - "description": "Modules in the Node", - "properties": { - "private": { - "$ref": "#/definitions/modules" - }, - "public": { - "$ref": "#/definitions/modules" - } - }, - "required": [], - "type": "object" - }, - "name": { - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "nodes": { - "description": "List of Node Manifests", - "items": { - "$ref": "#/definitions/node" - }, - "type": "array" - }, - "os": { - "description": "Operating System", - "enum": [ - "aix", - "android", - "darwin", - "dragonfly", - "freebsd", - "illumos", - "ios", - "linux", - "netbsd", - "openbsd", - "osx", - "plan9", - "solaris", - "windows" - ], - "type": "string" - }, - "payloads": { - "description": "List of Modules", - "items": { - "$ref": "#/definitions/module" - }, - "nullable": true, - "type": "array" - } - }, "description": "Describes an XYO Package which is a collection of XYO Modules", "properties": { - "$schema": { - "type": "string" - }, "description": { "type": "string" }, "nodes": { - "$ref": "#/definitions/nodes", + "$ref": "shared/definitions-schema.json#/definitions/nodes", "description": "The list of Nodes that are defined in the manifest" }, "schema": { diff --git a/packages/manifest/src/shared/definitions-schema.json b/packages/manifest/src/shared/definitions-schema.json new file mode 100644 index 00000000000..dc41ca4e3ee --- /dev/null +++ b/packages/manifest/src/shared/definitions-schema.json @@ -0,0 +1,228 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://xyo.network/schemas/definitions-schema.json", + "definitions": { + "architecture": { + "description": "Architecture", + "enum": [ + "386", + "amd64", + "arm", + "arm64", + "loong64", + "mips", + "mipsle", + "mips64", + "mips64le", + "ppc64", + "ppc64le", + "riscv64", + "s390x", + "wasm" + ], + "type": "string" + }, + "config": { + "additionalProperties": true, + "description": "Config for a module", + "properties": { + "accountPath": { + "description": "HDWallet path to derive account", + "type": "string" + }, + "architecture": { + "$ref": "#/definitions/architecture" + }, + "description": { + "type": "string" + }, + "features": { + "items": { + "$ref": "#/definitions/feature" + }, + "type": "array" + }, + "language": { + "$ref": "#/definitions/language" + }, + "name": { + "type": "string" + }, + "os": { + "$ref": "#/definitions/os" + }, + "schema": { + "type": "string" + } + }, + "required": [ + "name", + "schema" + ], + "type": "object" + }, + "external": { + "additionalProperties": false, + "definitions": { + "modules": { + "description": "A List of module permissions requests", + "items": { + "$ref": "#/definitions/external/definitions/moduleRequest" + }, + "type": "array" + }, + "moduleRequest": { + "description": "A module permissions request", + "additionalProperties": false, + "properties": { + "name": { + "description": "Name of the module the dApp is requesting permission to access", + "type": "string" + } + }, + "type": "object" + } + }, + "properties": { + "modules": { + "$ref": "#/definitions/external/definitions/modules" + } + }, + "type": "object" + }, + "feature": { + "description": "Framework", + "enum": [ + "angular", + "asp.net", + "browser", + "cryengine", + "corona", + "django", + "flutter", + "ionic", + "jquery", + "nodejs", + "phonegap", + "react", + "react-native", + "spring", + "unity", + "unreal", + "vue", + "xamarin" + ], + "type": "string" + }, + "language": { + "description": "Language", + "enum": [ + "c", + "c++", + "c#", + "go", + "java", + "javascript", + "kotlin", + "lua", + "python", + "ruby", + "rust", + "scala", + "solidity", + "swift" + ], + "type": "string" + }, + "module": { + "additionalProperties": false, + "description": "Module Definition", + "properties": { + "config": { + "$ref": "#/definitions/config" + }, + "description": { + "type": "string" + } + }, + "required": [ + "config" + ], + "type": "object" + }, + "modules": { + "description": "List of Modules", + "items": { + "$ref": "#/definitions/module" + }, + "nullable": true, + "type": "array" + }, + "node": { + "additionalProperties": false, + "description": "Node Definition - Generally loaded into an existing or new Node Module", + "properties": { + "config": { + "$ref": "#/definitions/config" + }, + "description": { + "type": "string" + }, + "modules": { + "additionalProperties": false, + "description": "Modules in the Node", + "properties": { + "private": { + "$ref": "#/definitions/modules" + }, + "public": { + "$ref": "#/definitions/modules" + } + }, + "required": [], + "type": "object" + }, + "name": { + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "nodes": { + "description": "List of Node Manifests", + "items": { + "$ref": "#/definitions/node" + }, + "type": "array" + }, + "os": { + "description": "Operating System", + "enum": [ + "aix", + "android", + "darwin", + "dragonfly", + "freebsd", + "illumos", + "ios", + "linux", + "netbsd", + "openbsd", + "osx", + "plan9", + "solaris", + "windows" + ], + "type": "string" + }, + "payloads": { + "description": "List of Modules", + "items": { + "$ref": "#/definitions/module" + }, + "nullable": true, + "type": "array" + } + } +} \ No newline at end of file diff --git a/packages/manifest/src/spec/cases/index.ts b/packages/manifest/src/spec/cases/index.ts new file mode 100644 index 00000000000..6becccd43c3 --- /dev/null +++ b/packages/manifest/src/spec/cases/index.ts @@ -0,0 +1,3 @@ +export * from './invalidCase' +export * from './validCase' + diff --git a/packages/manifest/src/spec/cases/invalidCase.ts b/packages/manifest/src/spec/cases/invalidCase.ts new file mode 100644 index 00000000000..8f44175e639 --- /dev/null +++ b/packages/manifest/src/spec/cases/invalidCase.ts @@ -0,0 +1,30 @@ +export const invalidDappPackageManifestSchema = { + external: { + modules1: [ + { + name: 'SomeModule', + }, + ], + }, + nodes: [ + { + config: { + accountPath: "0'", + name: 1, + schema: 'network.xyo.node.config', + }, + modules: { + public1: [ + { + config: { + accountPath: "1'", + name: 'SomeArchivist', + schema: 'network.xyo.archivist.config', + }, + }, + ], + }, + }, + ], + schema: 'network.xyo.foo.manifest', +} diff --git a/packages/manifest/src/spec/cases/validCase.ts b/packages/manifest/src/spec/cases/validCase.ts new file mode 100644 index 00000000000..fe48ec4f119 --- /dev/null +++ b/packages/manifest/src/spec/cases/validCase.ts @@ -0,0 +1,30 @@ +export const validDappPackageManifestSchema = { + external: { + modules: [ + { + name: 'SomeModule', + }, + ], + }, + nodes: [ + { + config: { + accountPath: "0'", + name: 'DappNode', + schema: 'network.xyo.node.config', + }, + modules: { + public: [ + { + config: { + accountPath: "1'", + name: 'SomeArchivist', + schema: 'network.xyo.archivist.config', + }, + }, + ], + }, + }, + ], + schema: 'network.xyo.dapp.manifest', +} diff --git a/packages/manifest/src/spec/dapp-package-manifest-schema.spec.ts b/packages/manifest/src/spec/dapp-package-manifest-schema.spec.ts new file mode 100644 index 00000000000..b86ae38f5f2 --- /dev/null +++ b/packages/manifest/src/spec/dapp-package-manifest-schema.spec.ts @@ -0,0 +1,34 @@ +import Ajv, { ValidateFunction } from 'ajv' + +import dappPackageManifestSchema from '../dapp-package-manifest-schema.json' +// eslint-disable-next-line import/no-internal-modules +import sharedDefinitions from '../shared/definitions-schema.json' +import { invalidDappPackageManifestSchema, validDappPackageManifestSchema } from './cases' + +describe('DappPackageManifestSchemas', () => { + let validate: ValidateFunction | undefined + + beforeEach(() => { + const ajv = new Ajv({ allErrors: true, schemas: [sharedDefinitions], strict: true }) + validate = ajv.compile(dappPackageManifestSchema) + }) + it('valid schema', () => { + if (validate) { + const valid = validate(validDappPackageManifestSchema) + // console.log(validate?.errors) + expect(valid).toBe(true) + } else { + throw new Error('Schema did not compile successfully') + } + }) + it('invalid schema', () => { + if (validate) { + const valid = validate(invalidDappPackageManifestSchema) + // console.log(validate?.errors) + expect(valid).toBe(false) + expect(validate.errors?.length).toBe(4) + } else { + throw new Error('Schema did not compile successfully') + } + }) +}) diff --git a/packages/manifest/src/spec/tsconfig.json b/packages/manifest/src/spec/tsconfig.json new file mode 100644 index 00000000000..16980bd0bd0 --- /dev/null +++ b/packages/manifest/src/spec/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "@xylabs/tsconfig-jest" +} \ No newline at end of file diff --git a/packages/modules/packages/bridge/packages/model/src/Bridge.ts b/packages/modules/packages/bridge/packages/model/src/Bridge.ts index 79c0f1b287b..757a73c3d00 100644 --- a/packages/modules/packages/bridge/packages/model/src/Bridge.ts +++ b/packages/modules/packages/bridge/packages/model/src/Bridge.ts @@ -10,7 +10,7 @@ import { ModuleInstance, ModuleParams, ModuleQueryResult, - ModuleResolver, + ModuleResolverInstance, } from '@xyo-network/module-model' import { Payload, Query } from '@xyo-network/payload-model' @@ -53,7 +53,7 @@ export interface BridgeModule extends CompositeModuleResolver implements ModuleResolver { +export class BridgeModuleResolver extends CompositeModuleResolver implements ModuleResolverInstance { private primed: Promise | undefined = undefined private remoteAddresses?: Promise private resolvedModules: Record> = {} @@ -43,10 +43,6 @@ export class BridgeModuleResolver ext super() } - override get isModuleResolver(): boolean { - return true - } - override add(module: Module): this override add(module: Module[]): this override add(_module: Module | Module[]): this { diff --git a/packages/modules/packages/bridge/packages/pub-sub/src/AsyncQueryBus.ts b/packages/modules/packages/bridge/packages/pub-sub/src/AsyncQueryBus.ts new file mode 100644 index 00000000000..46f7688facf --- /dev/null +++ b/packages/modules/packages/bridge/packages/pub-sub/src/AsyncQueryBus.ts @@ -0,0 +1,390 @@ +/* eslint-disable max-lines */ +import { containsAll } from '@xylabs/array' +import { assertEx } from '@xylabs/assert' +import { delay } from '@xylabs/delay' +import { forget } from '@xylabs/forget' +import { Base } from '@xylabs/object' +import { rejected } from '@xylabs/promise' +import { clearTimeoutEx, setTimeoutEx } from '@xylabs/timer' +import { asArchivistInstance } from '@xyo-network/archivist-model' +import { isBoundWitness, isQueryBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model' +import { CacheConfig } from '@xyo-network/bridge-model' +import { BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model' +import { asDivinerInstance } from '@xyo-network/diviner-model' +import { PayloadHasher } from '@xyo-network/hash' +import { asModuleInstance, ModuleConfig, ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model' +import { PayloadBuilder } from '@xyo-network/payload-builder' +import { isPayloadWithHash, ModuleError, Payload, WithMeta } from '@xyo-network/payload-model' +import { LRUCache } from 'lru-cache' + +import { AsyncQueryBusParams } from './Params' + +export const Pending = 'pending' as const +export type Pending = typeof Pending + +export class AsyncQueryBus extends Base { + protected _lastState?: LRUCache + protected _queryCache?: LRUCache + protected _targetConfigs: Record = {} + protected _targetQueries: Record = {} + + protected moduleName = 'AsyncQueryBus' + + private _pollId?: string + + constructor(params: TParams) { + super(params) + } + + get config() { + return this.params.config + } + + get individualAddressBatchQueryLimitConfig(): number { + return this.config.individualAddressBatchQueryLimit ?? 10 + } + + get pollFrequencyConfig(): number { + return this.config.pollFrequency ?? 1000 + } + + get queryCacheConfig(): LRUCache.Options { + const queryCacheConfig: CacheConfig | undefined = this.config.queryCache === true ? {} : this.config.queryCache + return { max: 100, ttl: 1000 * 60, ...queryCacheConfig } + } + + get resolver() { + return this.params.resolver + } + + get started() { + return !!this._pollId + } + + /** + * A cache of the last offset of the Diviner process per address + */ + protected get lastState(): LRUCache { + const requiredConfig = { max: 1000, ttl: 0 } + this._lastState = this._lastState ?? new LRUCache(requiredConfig) + return this._lastState + } + + /** + * A cache of queries that have been issued + */ + protected get queryCache(): LRUCache { + const config = this.queryCacheConfig + const requiredConfig = { noUpdateTTL: false, ttlAutopurge: true } + this._queryCache = this._queryCache ?? new LRUCache({ ...config, ...requiredConfig }) + return this._queryCache + } + + async listeningModules() { + const mods = this.config.listeningModules + ? await Promise.all( + this.config.listeningModules.map(async (listeningModule) => + assertEx( + asModuleInstance(await this.resolver.resolve(listeningModule)), + () => `${this.moduleName}: Unable to resolve all listeningModule [${listeningModule}]`, + ), + ), + ) + : await this.resolver.resolve({ direction: 'all' }) + return mods + } + + async queriesArchivist() { + return assertEx( + asArchivistInstance(await this.resolver.resolve(this.config.queries?.archivist)), + () => `${this.moduleName}: Unable to resolve queriesArchivist`, + ) + } + + async queriesDiviner() { + return assertEx( + asDivinerInstance(await this.resolver.resolve(this.config.queries?.boundWitnessDiviner)), + () => `${this.moduleName}: Unable to resolve queriesDiviner`, + ) + } + + async responsesArchivist() { + return assertEx( + asArchivistInstance(await this.resolver.resolve(this.config.responses?.archivist)), + () => `${this.moduleName}: Unable to resolve responsesArchivist`, + ) + } + + async responsesDiviner() { + return assertEx( + asDivinerInstance(await this.resolver.resolve(this.config.responses?.boundWitnessDiviner)), + () => `${this.moduleName}: Unable to resolve responsesDiviner`, + ) + } + + async send(address: string, query: QueryBoundWitness, payloads?: Payload[] | undefined): Promise { + this.logger?.debug(`${this.moduleName}: Begin issuing query to: ${address}`) + const $meta = { ...query?.$meta, destination: [address] } + const routedQuery = { ...query, $meta } + const queryArchivist = await this.queriesArchivist() + + const sourceAddress = query.addresses.at(0) + if (sourceAddress && !this.config.listeningModules?.includes(sourceAddress)) { + this.config.listeningModules?.push(sourceAddress) + } + + // TODO: Should we always re-hash to true up timestamps? We can't + // re-sign correctly so we would lose that information if we did and + // would also be replying to consumers with a different query hash than + // they sent us (which might be OK since it reflect the chain of custody) + // Revisit this once we have proxy module support as they are another + // intermediary to consider. + const routedQueryHash = + // Trust the signed hash if it's there + (routedQuery as WithMeta)?.$hash ?? + // TODO: What is the right way to find the dataHash + Object.keys(await PayloadBuilder.toDataHashMap([routedQuery]))[0] + this.logger?.debug(`${this.moduleName}: Issuing query: ${routedQueryHash} to: ${address}`) + // If there was data associated with the query, add it to the insert + const data = payloads ? [routedQuery, ...payloads] : [routedQuery] + const insertResult = await queryArchivist.insert?.(data) + this.logger?.debug(`${this.moduleName}: Issued query: ${routedQueryHash} to: ${address}`) + this.queryCache.set(routedQueryHash, Pending) + if (!insertResult) throw new Error(`${this.moduleName}: Unable to issue query to queryArchivist`) + const context = new Promise((resolve) => { + this.logger?.debug(`${this.moduleName}: Polling for response to query: ${routedQueryHash}`) + const pollForResponse = async () => { + let response = this.queryCache.get(routedQueryHash) + // Poll for response until cache key expires (response timed out) + while (response !== undefined) { + // Wait a bit + await delay(100) + // Check the status of the response + response = this.queryCache.get(routedQueryHash) + // If status is no longer pending that means we received a response + if (response && response !== Pending) { + this.logger?.debug(`${this.moduleName}: Returning response to query: ${routedQueryHash}`) + resolve(response) + return + } + } + // If we got here waiting for a response timed out + this.logger?.error(`${this.moduleName}: Timeout waiting for query response`) + // Resolve with error to match what a local module would do if it were to error + // TODO: BW Builder/Sign result as this module? + const error: ModuleError = { + message: 'Timeout waiting for query response', + query: 'network.xyo.boundwitness', + schema: 'network.xyo.error.module', + sources: [routedQueryHash], + } + resolve([routedQuery, [], [error]]) + return + } + forget(pollForResponse()) + }) + return context + } + + start() { + if (this.started) { + console.warn('AsyncQueryBus starting when already started') + } + this.poll() + } + + stop() { + if (!this.started) { + console.warn('AsyncQueryBus stopping when already stopped') + } + if (this._pollId) clearTimeoutEx(this._pollId) + this._pollId = undefined + } + + protected callLocalModule = async (localModule: ModuleInstance, command: QueryBoundWitness) => { + const localModuleName = localModule.config.name ?? localModule.address + const queryArchivist = await this.queriesArchivist() + const responseArchivist = await this.responsesArchivist() + const commandDestination = (command.$meta as { destination?: string[] })?.destination + if (commandDestination && commandDestination?.includes(localModule.address)) { + // Find the query + const queryIndex = command.payload_hashes.indexOf(command.query) + if (queryIndex !== -1) { + const querySchema = command.payload_schemas[queryIndex] + // If the destination can process this type of query + if (localModule.queries.includes(querySchema)) { + // Get the associated payloads + const commandPayloads = await queryArchivist.get(command.payload_hashes) + const commandPayloadsDict = await PayloadBuilder.toAllHashMap(commandPayloads) + const commandHash = isPayloadWithHash(command) ? command.$hash : await PayloadHasher.hash(command) + // Check that we have all the arguments for the command + if (!containsAll(Object.keys(commandPayloadsDict), command.payload_hashes)) { + this.logger?.error(`${this.moduleName}: Error processing command ${commandHash} for module ${localModuleName}, missing payloads`) + return + } + try { + // Issue the query against module + const commandSchema = commandPayloadsDict[command.query].schema + this.logger?.debug(`${this.moduleName}: Issuing command ${commandSchema} (${commandHash}) addressed to module: ${localModuleName}`) + const response = await localModule.query(command, commandPayloads) + const [bw, payloads, errors] = response + this.logger?.debug(`${this.moduleName}: Replying to command ${commandHash} addressed to module: ${localModuleName}`) + const insertResult = await responseArchivist.insert([bw, ...payloads, ...errors]) + // NOTE: If all archivists support the contract that numPayloads inserted === numPayloads returned we can + // do some deeper assertions here like lenIn === lenOut, but for now this should be good enough since BWs + // should always be unique causing at least one insertion + if (insertResult.length > 0) { + this.logger?.error(`${this.moduleName}: Error replying to command ${commandHash} addressed to module: ${localModuleName}`) + } + if (command?.timestamp) { + // TODO: This needs to be thought through as we can't use a distributed timestamp + // because of collisions. We need to ensure we are using the timestamp of the store + // so there's no chance of multiple commands at the same time + await this.commitState(localModule.address, command.timestamp) + } + } catch (error) { + this.logger?.error(`${this.moduleName}: Error processing command ${commandHash} for module ${localModuleName}: ${error}`) + } + } + } + } + } + + /** + * Commit the internal state of the process. This is similar + * to a transaction completion in a database and should only be called + * when results have been successfully persisted to the appropriate + * external stores. + * @param address The module address to commit the state for + * @param nextState The state to commit + */ + protected async commitState(address: string, nextState: number) { + await Promise.resolve() + // TODO: Offload to Archivist/Diviner instead of in-memory + const lastState = this.lastState.get(address) + if (lastState && lastState >= nextState) return + this.lastState.set(address, nextState) + } + + /** + * Finds unprocessed commands addressed to the supplied address + * @param address The address to find commands for + */ + protected findCommandsToAddress = async (address: string) => { + const queryBoundWitnessDiviner = await this.queriesDiviner() + // Retrieve last offset from state store + const timestamp = await this.retrieveState(address) + const destination = [address] + const limit = this.individualAddressBatchQueryLimitConfig + // Filter for commands to us by destination address + const divinerQuery = { destination, limit, schema: BoundWitnessDivinerQuerySchema, sort: 'asc', timestamp } + const result = await queryBoundWitnessDiviner.divine([divinerQuery]) + const commands = result.filter(isQueryBoundWitness) + const nextState = Math.max(...commands.map((c) => c.timestamp ?? 0)) + // TODO: This needs to be thought through as we can't use a distributed timestamp + // because of collisions. We need to use the timestamp of the store so there's no + // chance of multiple commands at the same time + await this.commitState(address, nextState) + return commands + } + + /** + * Retrieves the last state of the process. Used to recover state after + * preemptions, reboots, etc. + */ + protected async retrieveState(address: string): Promise { + await Promise.resolve() + const state = this.lastState.get(address) + if (state === undefined) { + // If this is a boot we can go back a bit in time + // and begin processing recent commands + const newState = Date.now() - 1000 + this.lastState.set(address, newState) + return newState + } else { + return state + } + } + + private doBackgroundProcessing = async () => { + // TODO: We should make it configurable if we want to be inbound, outbound, or both + // as there is good reason for wanting to limit to just one or the other + const results = await Promise.allSettled([await this.processIncomingQueries(), await this.processIncomingResponses()]) + for (const failure in results.filter(rejected)) { + this.logger?.error(`${this.moduleName}: Error in background processing: ${failure}`) + } + } + + /** + * Runs the background divine process on a loop with a delay + * specified by the `config.pollFrequency` + */ + private poll() { + this._pollId = setTimeoutEx(async () => { + try { + await this.doBackgroundProcessing() + } catch (e) { + this.logger?.error?.(`${this.moduleName}: Error in main loop: ${e}`) + } finally { + if (this._pollId) clearTimeoutEx(this._pollId) + this._pollId = undefined + this.poll() + } + }, this.pollFrequencyConfig) + } + + /** + * Background process for checking for inbound commands + */ + private processIncomingQueries = async () => { + this.logger?.debug(`${this.moduleName}: Checking for inbound commands`) + // Check for any queries that have been issued and have not been responded to + const localModules = await this.listeningModules() + + // TODO: Do in throttled batches + await Promise.allSettled( + localModules.map(async (localModule) => { + try { + const localModuleName = localModule.config.name ?? localModule.address + this.logger?.debug(`${this.moduleName}: Checking for inbound commands to ${localModuleName}`) + const commands = await this.findCommandsToAddress(localModule.address) + if (commands.length === 0) return + this.logger?.debug(`${this.moduleName}: Found commands addressed to local module: ${localModuleName}`) + for (const command of commands) { + await this.callLocalModule(localModule, command) + } + } catch (error) { + this.logger?.error(`${this.moduleName}: Error processing commands for address ${localModule.address}: ${error}`) + } + }), + ) + } + + /** + * Background process for processing incoming responses to previously issued queries + */ + private processIncomingResponses = async () => { + const responseArchivist = await this.responsesArchivist() + const responseBoundWitnessDiviner = await this.responsesDiviner() + const pendingCommands = [...this.queryCache.entries()].filter(([_, status]) => status === Pending) + // TODO: Do in throttled batches + await Promise.allSettled( + pendingCommands.map(async ([sourceQuery, status]) => { + if (status === Pending) { + const divinerQuery = { schema: BoundWitnessDivinerQuerySchema, sourceQuery } + const result = await responseBoundWitnessDiviner.divine([divinerQuery]) + if (result && result.length > 0) { + const response = result.find(isBoundWitness) + if (response && (response?.$meta as unknown as { sourceQuery: string })?.sourceQuery === sourceQuery) { + this.logger?.debug(`${this.moduleName}: Found response to query: ${sourceQuery}`) + // Get any payloads associated with the response + const payloads = response.payload_hashes?.length > 0 ? await responseArchivist.get(response.payload_hashes) : [] + const errors: ModuleError[] = [] + this.queryCache.set(sourceQuery, [response, payloads, errors]) + } + } + } + }), + ) + } +} diff --git a/packages/modules/packages/bridge/packages/pub-sub/src/Config.ts b/packages/modules/packages/bridge/packages/pub-sub/src/Config.ts index a4db9c095ac..03ba8bd1027 100644 --- a/packages/modules/packages/bridge/packages/pub-sub/src/Config.ts +++ b/packages/modules/packages/bridge/packages/pub-sub/src/Config.ts @@ -9,75 +9,75 @@ export type PubSubBridgeConfigSchema = typeof PubSubBridgeConfigSchema /** * Configuration for searchable storage of local state */ -export interface SearchableStorage { +export interface SearchableStorage { /** * Name/Address of the archivist where intermediate communications are stored */ - archivist: string + archivist: TArchivist /** * Name/Address of the diviner where intermediate communications are filtered */ - boundWitnessDiviner: string + boundWitnessDiviner: TDiviner } /** * Configuration for the mutually accessible * modules between the modules being connected */ -export interface IntermediaryConfig { +export interface Intermediary { /** * Name/Address of the archivist where intermediate communications are stored */ - archivist: string + archivist: TArchivist /** * Name/Address of the diviner where intermediate communications are filtered */ - boundWitnessDiviner: string + boundWitnessDiviner: TDiviner } -/** - * Configuration for the PubSubBridge - */ -export type PubSubBridgeConfig = BridgeConfig< - { - /** - * How many queries to process at once when retrieving queries - * for an address - */ - individualAddressBatchQueryLimit?: number - /** - * How often to poll for new queries/responses - */ - pollFrequency?: number - /** - * Configuration for intermediary query storage - */ - queries?: IntermediaryConfig +export interface AsyncQueryBusConfig { + /** + * How many queries to process at once when retrieving queries + * for an address + */ + individualAddressBatchQueryLimit?: number - /** - * Configuration for intermediary response storage - */ - queryCache?: CacheConfig | true + listeningModules?: string[] - /** - * Configuration for intermediary response storage - */ - responses?: IntermediaryConfig + /** + * How often to poll for new queries/responses + */ + pollFrequency?: number + /** + * Configuration for intermediary query storage + */ + queries?: Intermediary - /** - * The root address to connect the bridge to - */ - rootAddress?: string + /** + * Configuration for intermediary response storage + */ + queryCache?: CacheConfig | true - /** - * The configurations schema for the module - */ - schema: PubSubBridgeConfigSchema + /** + * Configuration for intermediary response storage + */ + responses?: Intermediary + + /** + * The root address to connect the bridge to + */ + rootAddress?: string + + /** + * Where the archivist should persist its internal state + */ + stateStore?: SearchableStorage +} - /** - * Where the archivist should persist its internal state - */ - stateStore?: SearchableStorage - } & TConfig, +/** + * Configuration for the PubSubBridge + */ +export type PubSubBridgeConfig = BridgeConfig< + AsyncQueryBusConfig & TConfig, TSchema extends string ? TSchema : PubSubBridgeConfigSchema > diff --git a/packages/modules/packages/bridge/packages/pub-sub/src/Params.ts b/packages/modules/packages/bridge/packages/pub-sub/src/Params.ts index 507569d867f..6cdab5cb30d 100644 --- a/packages/modules/packages/bridge/packages/pub-sub/src/Params.ts +++ b/packages/modules/packages/bridge/packages/pub-sub/src/Params.ts @@ -1,9 +1,15 @@ +import { BaseParams } from '@xylabs/object' import { BridgeParams } from '@xyo-network/bridge-model' -import { AnyConfigSchema } from '@xyo-network/module-model' +import { AnyConfigSchema, ModuleResolver } from '@xyo-network/module-model' -import { PubSubBridgeConfig } from './Config' +import { AsyncQueryBusConfig, PubSubBridgeConfig } from './Config' /** * The parameters for the PubSubBridge */ export type PubSubBridgeParams = AnyConfigSchema> = BridgeParams + +export type AsyncQueryBusParams = BaseParams<{ + config: AsyncQueryBusConfig + resolver: ModuleResolver +}> diff --git a/packages/modules/packages/bridge/packages/pub-sub/src/PubSubBridge.ts b/packages/modules/packages/bridge/packages/pub-sub/src/PubSubBridge.ts index 9648b101388..9edc4cef001 100644 --- a/packages/modules/packages/bridge/packages/pub-sub/src/PubSubBridge.ts +++ b/packages/modules/packages/bridge/packages/pub-sub/src/PubSubBridge.ts @@ -1,55 +1,25 @@ -/* eslint-disable max-lines */ -import { containsAll } from '@xylabs/array' import { assertEx } from '@xylabs/assert' -import { delay } from '@xylabs/delay' -import { forget } from '@xylabs/forget' -import { EmptyObject } from '@xylabs/object' -import { rejected } from '@xylabs/promise' -import { clearTimeoutEx, setTimeoutEx } from '@xylabs/timer' import { AbstractBridge } from '@xyo-network/abstract-bridge' -import { asArchivistInstance } from '@xyo-network/archivist-model' -import { isBoundWitness, isQueryBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model' +import { QueryBoundWitness } from '@xyo-network/boundwitness-model' import { BridgeModule, CacheConfig } from '@xyo-network/bridge-model' -import { BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model' -import { asDivinerInstance } from '@xyo-network/diviner-model' -import { PayloadHasher } from '@xyo-network/hash' import { ModuleManifestPayload, ModuleManifestPayloadSchema } from '@xyo-network/manifest-model' import { creatableModule, ModuleConfig, ModuleEventData, - ModuleInstance, ModuleManifestQuery, ModuleManifestQuerySchema, ModuleQueryResult, } from '@xyo-network/module-model' -import { PayloadBuilder } from '@xyo-network/payload-builder' -import { isPayloadOfSchemaType, isPayloadWithHash, ModuleError, Payload, WithMeta } from '@xyo-network/payload-model' +import { isPayloadOfSchemaType, Payload } from '@xyo-network/payload-model' import { LRUCache } from 'lru-cache' +import { AsyncQueryBus } from './AsyncQueryBus' import { PubSubBridgeConfigSchema } from './Config' import { PubSubBridgeParams } from './Params' const moduleName = 'PubSubBridge' -/** - * Creates an object map of payload hashes to payloads based on the payloads passed in - * @param objs Any array of payloads - * @returns A map of hashes to payloads - */ -const toMap = async (objs: T[]): Promise> => { - const dataHashes = await Promise.all( - objs.map(async (obj) => { - return [await PayloadHasher.hash(obj), obj] - }), - ) - const metaHashes = dataHashes.map(([_, p]) => [(p as WithMeta)?.$hash, p]).filter(([hash]) => hash) - return Object.fromEntries([...dataHashes, ...metaHashes]) -} - -const Pending = 'pending' as const -type Pending = typeof Pending - @creatableModule() export class PubSubBridge extends AbstractBridge @@ -57,22 +27,15 @@ export class PubSubBridge protected _lastState?: LRUCache - protected _queryCache?: LRUCache protected _targetConfigs: Record = {} protected _targetQueries: Record = {} - private _pollId?: string + private _bus?: AsyncQueryBus get discoverCache() { const config = this.discoverCacheConfig @@ -85,58 +48,10 @@ export class PubSubBridge { - const queryCacheConfig: CacheConfig | undefined = this.config.queryCache === true ? {} : this.config.queryCache - return { max: 100, ttl: 1000 * 60, ...queryCacheConfig } - } - - /** - * A cache of the last offset of the Diviner process per address - */ - protected get lastState(): LRUCache { - const requiredConfig = { max: 1000, ttl: 0 } - this._lastState = this._lastState ?? new LRUCache(requiredConfig) - return this._lastState - } - protected get moduleName() { return `${this.config.name ?? moduleName}` } - protected get queryArchivistConfig() { - return this._configQueriesArchivist - } - - protected get queryBoundWitnessDivinerConfig() { - return this._configQueriesBoundWitnessDiviner - } - - /** - * A cache of queries that have been issued - */ - protected get queryCache(): LRUCache { - const config = this.queryCacheConfig - const requiredConfig = { noUpdateTTL: false, ttlAutopurge: true } - this._queryCache = this._queryCache ?? new LRUCache({ ...config, ...requiredConfig }) - return this._queryCache - } - - protected get responseArchivistConfig() { - return this._configResponsesArchivist - } - - protected get responseBoundWitnessDivinerConfig() { - return this._configResponsesBoundWitnessDiviner - } - protected get rootAddress() { return this._configRootAddress } @@ -149,10 +64,9 @@ export class PubSubBridge { - await super.startHandler() + connect() { + //await super.startHandler() this.connected = true - this.poll() return true // const rootTargetDownResolver = this.targetDownResolver() // if (rootTargetDownResolver) { @@ -254,62 +168,8 @@ export class PubSubBridge { if (!this.connected) throw new Error('Not connected') await this.started('throw') - this.logger?.debug(`${this.moduleName}: Begin issuing query to: ${address}`) - const $meta = { ...query?.$meta, destination: [address] } - const routedQuery = { ...query, $meta } - const queryArchivist = await this.getQueryArchivist() - if (!queryArchivist) throw new Error(`${this.moduleName}: Unable to resolve queryArchivist for query`) - // TODO: Should we always re-hash to true up timestamps? We can't - // re-sign correctly so we would lose that information if we did and - // would also be replying to consumers with a different query hash than - // they sent us (which might be OK since it reflect the chain of custody) - // Revisit this once we have proxy module support as they are another - // intermediary to consider. - const routedQueryHash = - // Trust the signed hash if it's there - (routedQuery as WithMeta)?.$hash ?? - // TODO: What is the right way to find the dataHash - Object.keys(await PayloadBuilder.toDataHashMap([routedQuery]))[0] - this.logger?.debug(`${this.moduleName}: Issuing query: ${routedQueryHash} to: ${address}`) - // If there was data associated with the query, add it to the insert - const data = payloads ? [routedQuery, ...payloads] : [routedQuery] - const insertResult = await queryArchivist.insert?.(data) - this.logger?.debug(`${this.moduleName}: Issued query: ${routedQueryHash} to: ${address}`) - this.queryCache.set(routedQueryHash, Pending) - if (!insertResult) throw new Error(`${this.moduleName}: Unable to issue query to queryArchivist`) - const context = new Promise((resolve) => { - this.logger?.debug(`${this.moduleName}: Polling for response to query: ${routedQueryHash}`) - const pollForResponse = async () => { - let response = this.queryCache.get(routedQueryHash) - // Poll for response until cache key expires (response timed out) - while (response !== undefined) { - // Wait a bit - await delay(100) - // Check the status of the response - response = this.queryCache.get(routedQueryHash) - // If status is no longer pending that means we received a response - if (response && response !== Pending) { - this.logger?.debug(`${this.moduleName}: Returning response to query: ${routedQueryHash}`) - resolve(response) - return - } - } - // If we got here waiting for a response timed out - this.logger?.error(`${this.moduleName}: Timeout waiting for query response`) - // Resolve with error to match what a local module would do if it were to error - // TODO: BW Builder/Sign result as this module? - const error: ModuleError = { - message: 'Timeout waiting for query response', - query: 'network.xyo.boundwitness', - schema: 'network.xyo.error.module', - sources: [routedQueryHash], - } - resolve([routedQuery, [], [error]]) - return - } - forget(pollForResponse()) - }) - return context + const bus = this.bus() + return bus.send(address, query, payloads) } override targetQueryable(_address: string, _query: QueryBoundWitness, _payloads?: Payload[], _queryConfig?: ModuleConfig): boolean { @@ -317,272 +177,29 @@ export class PubSubBridge= nextState) return - this.lastState.set(address, nextState) - } - - /** - * Ensures the necessary config entries are present - */ - protected ensureNecessaryConfig = () => { - this._configRootAddress = assertEx(this.config.rootAddress, `${this.moduleName}: Missing entry for rootAddress in module configuration`) - this._configQueriesArchivist = assertEx( - this.config.queries?.archivist, - `${this.moduleName}: Missing entry for query.archivist in module configuration`, - ) - this._configQueriesBoundWitnessDiviner = assertEx( - this.config.queries?.boundWitnessDiviner, - `${this.moduleName}: Missing entry for query.boundWitnessDiviner in module configuration`, - ) - this._configResponsesArchivist = assertEx( - this.config.responses?.archivist, - `${this.moduleName}: Missing entry for response.archivist in module configuration`, - ) - this._configResponsesBoundWitnessDiviner = assertEx( - this.config.responses?.boundWitnessDiviner, - `${this.moduleName}: Missing entry for response.boundWitnessDiviner in module configuration`, - ) - // this._configStateStoreArchivist = assertEx( - // this.config.stateStore?.archivist, - // `${this.moduleName}: Missing entry for stateStore.archivist in module configuration`, - // ) - // this._configStateStoreBoundWitnessDiviner = assertEx( - // this.config.stateStore?.boundWitnessDiviner, - // `${this.moduleName}: Missing entry for stateStore.boundWitnessDiviner in module configuration`, - // ) - } - - /** - * Finds unprocessed commands addressed to the supplied address - * @param address The address to find commands for + * Ensures the necessary config entries are present and create bus if needed */ - protected findCommandsToAddress = async (address: string) => { - const queryBoundWitnessDiviner = await this.getQueryBoundWitnessDiviner() - // Retrieve last offset from state store - const timestamp = await this.retrieveState(address) - const destination = [address] - const limit = this.individualAddressBatchQueryLimitConfig - // Filter for commands to us by destination address - const divinerQuery = { destination, limit, schema: BoundWitnessDivinerQuerySchema, sort: 'asc', timestamp } - const result = await queryBoundWitnessDiviner.divine([divinerQuery]) - const commands = result.filter(isQueryBoundWitness) - const nextState = Math.max(...commands.map((c) => c.timestamp ?? 0)) - // TODO: This needs to be thought through as we can't use a distributed timestamp - // because of collisions. We need to use the timestamp of the store so there's no - // chance of multiple commands at the same time - await this.commitState(address, nextState) - return commands - } - - protected getQueryArchivist = async () => { - return assertEx(asArchivistInstance(await this.resolve(this.queryArchivistConfig)), `${this.moduleName}: Error resolving queryArchivist`) - } - - protected getQueryBoundWitnessDiviner = async () => { - return assertEx( - asDivinerInstance(await this.resolve(this.queryBoundWitnessDivinerConfig)), - `${this.moduleName}: Error resolving queryBoundWitnessDiviner`, - ) - } - - protected getResponseArchivist = async () => { - return assertEx(asArchivistInstance(await this.resolve(this.responseArchivistConfig)), `${this.moduleName}: Error resolving responseArchivist`) - } - - protected getResponseBoundWitnessDiviner = async () => { - return assertEx( - asDivinerInstance(await this.resolve(this.responseBoundWitnessDivinerConfig)), - `${this.moduleName}: Error resolving responseBoundWitnessDiviner`, - ) - } - - // protected getStateStoreArchivist = async () => { - // return assertEx( - // asArchivistInstance(await this.resolve(this.stateStoreArchivistConfig)), - // `${this.moduleName}: Error resolving stateStoreArchivist`, - // ) - // } - - // protected getStateStoreBoundWitnessDiviner = async () => { - // return assertEx( - // asDivinerInstance(await this.resolve(this.stateStoreBoundWitnessDivinerConfig)), - // `${this.moduleName}: Error resolving stateStoreBoundWitnessDiviner`, - // ) - // } - - protected issueCommandAgainstLocalModule = async (localModule: ModuleInstance, command: QueryBoundWitness) => { - const localModuleName = localModule.config.name ?? localModule.address - const queryArchivist = await this.getQueryArchivist() - const responseArchivist = await this.getResponseArchivist() - const commandDestination = (command.$meta as { destination?: string[] })?.destination - if (commandDestination && commandDestination?.includes(localModule.address)) { - // Find the query - const queryIndex = command.payload_hashes.indexOf(command.query) - if (queryIndex !== -1) { - const querySchema = command.payload_schemas[queryIndex] - // If the destination can process this type of query - if (localModule.queries.includes(querySchema)) { - // Get the associated payloads - const commandPayloads = await queryArchivist.get(command.payload_hashes) - const commandPayloadsDict = await toMap(commandPayloads) - const commandHash = isPayloadWithHash(command) ? command.$hash : await PayloadHasher.hash(command) - // Check that we have all the arguments for the command - if (!containsAll(Object.keys(commandPayloadsDict), command.payload_hashes)) { - this.logger?.error(`${this.moduleName}: Error processing command ${commandHash} for module ${localModuleName}, missing payloads`) - return - } - try { - // Issue the query against module - const commandSchema = commandPayloadsDict[command.query].schema - this.logger?.debug(`${this.moduleName}: Issuing command ${commandSchema} (${commandHash}) addressed to module: ${localModuleName}`) - const response = await localModule.query(command, commandPayloads) - const [bw, payloads, errors] = response - this.logger?.debug(`${this.moduleName}: Replying to command ${commandHash} addressed to module: ${localModuleName}`) - const insertResult = await responseArchivist.insert([bw, ...payloads, ...errors]) - // NOTE: If all archivists support the contract that numPayloads inserted === numPayloads returned we can - // do some deeper assertions here like lenIn === lenOut, but for now this should be good enough since BWs - // should always be unique causing at least one insertion - if (insertResult.length > 0) { - this.logger?.error(`${this.moduleName}: Error replying to command ${commandHash} addressed to module: ${localModuleName}`) - } - if (command?.timestamp) { - // TODO: This needs to be thought through as we can't use a distributed timestamp - // because of collisions. We need to ensure we are using the timestamp of the store - // so there's no chance of multiple commands at the same time - await this.commitState(localModule.address, command.timestamp) - } - } catch (error) { - this.logger?.error(`${this.moduleName}: Error processing command ${commandHash} for module ${localModuleName}: ${error}`) - } - } - } - } - } - - /** - * Retrieves the last state of the process. Used to recover state after - * preemptions, reboots, etc. - */ - protected async retrieveState(address: string): Promise { - await Promise.resolve() - const state = this.lastState.get(address) - if (state === undefined) { - // If this is a boot we can go back a bit in time - // and begin processing recent commands - const newState = Date.now() - 1000 - this.lastState.set(address, newState) - return newState - } else { - return state + protected bus() { + if (!this._bus) { + this._bus = new AsyncQueryBus({ + config: this.config, + logger: this.logger, + resolver: this, + }) } + return this._bus } protected override async startHandler(): Promise { - this.ensureNecessaryConfig() - await this.connect() + await Promise.resolve(this.connect()) + const bus = this.bus() + bus.start() return true } - protected override stopHandler(_timeout?: number | undefined): boolean { - // TODO: There's more to it than this (global background circuit - // breaker, timeoutEx management, etc.) - if (this._pollId) clearTimeoutEx(this._pollId) - this._pollId = undefined + protected override stopHandler(_timeout?: number | undefined) { + const bus = this.bus() + bus.stop() return true } - - private doBackgroundProcessing = async () => { - // TODO: We should make it configurable if we want to be inbound, outbound, or both - // as there is good reason for wanting to limit to just one or the other - const results = await Promise.allSettled([await this.processIncomingQueries(), await this.processIncomingResponses()]) - for (const failure in results.filter(rejected)) { - this.logger?.error(`${this.moduleName}: Error in background processing: ${failure}`) - } - } - - /** - * Runs the background divine process on a loop with a delay - * specified by the `config.pollFrequency` - */ - private poll() { - this._pollId = setTimeoutEx(async () => { - try { - await this.doBackgroundProcessing() - } catch (e) { - this.logger?.error?.(`${this.moduleName}: Error in main loop: ${e}`) - } finally { - if (this._pollId) clearTimeoutEx(this._pollId) - this._pollId = undefined - this.poll() - } - }, this.pollFrequencyConfig) - } - - /** - * Background process for checking for inbound commands - */ - private processIncomingQueries = async () => { - this.logger?.debug(`${this.moduleName}: Checking for inbound commands`) - // Check for any queries that have been issued and have not been responded to - const localModules = await this.resolve() - // TODO: Ensure we filter out any proxy modules we created so we don't create a loopback - const localAddresses = localModules.map((module) => module.address) - // TODO: Do in throttled batches - await Promise.allSettled( - localAddresses.map(async (localAddress) => { - try { - const localModule = assertEx(await this.resolve(localAddress), `${this.moduleName}: Error resolving local address: ${localAddress}`) - const localModuleName = localModule.config.name ?? localAddress - this.logger?.debug(`${this.moduleName}: Checking for inbound commands to ${localModuleName}`) - const commands = await this.findCommandsToAddress(localAddress) - if (commands.length === 0) return - this.logger?.debug(`${this.moduleName}: Found commands addressed to local module: ${localModuleName}`) - for (const command of commands) { - await this.issueCommandAgainstLocalModule(localModule, command) - } - } catch (error) { - this.logger?.error(`${this.moduleName}: Error processing commands for address ${localAddress}: ${error}`) - } - }), - ) - } - - /** - * Background process for processing incoming responses to previously issued queries - */ - private processIncomingResponses = async () => { - const responseArchivist = await this.getResponseArchivist() - const responseBoundWitnessDiviner = await this.getResponseBoundWitnessDiviner() - const pendingCommands = [...this.queryCache.entries()].filter(([_, status]) => status === Pending) - // TODO: Do in throttled batches - await Promise.allSettled( - pendingCommands.map(async ([sourceQuery, status]) => { - if (status === Pending) { - const divinerQuery = { schema: BoundWitnessDivinerQuerySchema, sourceQuery } - const result = await responseBoundWitnessDiviner.divine([divinerQuery]) - if (result && result.length > 0) { - const response = result.find(isBoundWitness) - if (response && (response?.$meta as unknown as { sourceQuery: string })?.sourceQuery === sourceQuery) { - this.logger?.debug(`${this.moduleName}: Found response to query: ${sourceQuery}`) - // Get any payloads associated with the response - const payloads = response.payload_hashes?.length > 0 ? await responseArchivist.get(response.payload_hashes) : [] - const errors: ModuleError[] = [] - this.queryCache.set(sourceQuery, [response, payloads, errors]) - } - } - } - }), - ) - } } diff --git a/packages/modules/packages/bridge/packages/pub-sub/src/spec/PubSubBridge.spec.ts b/packages/modules/packages/bridge/packages/pub-sub/src/spec/PubSubBridge.spec.ts index 70b5c09ea88..cc6598ea88a 100644 --- a/packages/modules/packages/bridge/packages/pub-sub/src/spec/PubSubBridge.spec.ts +++ b/packages/modules/packages/bridge/packages/pub-sub/src/spec/PubSubBridge.spec.ts @@ -1,3 +1,4 @@ +/* eslint-disable sort-keys-fix/sort-keys-fix */ /* eslint-disable max-statements */ import { assertEx } from '@xylabs/assert' import { delay } from '@xylabs/delay' @@ -93,7 +94,7 @@ describe('PubSubBridge', () => { for (const mod of Object.values(intermediateNode).filter((v) => v.address !== node.address)) { await node.register(mod) - await node.attach(mod.address, false) + await node.attach(mod.address, true) } const clients = await Promise.all( @@ -104,13 +105,13 @@ describe('PubSubBridge', () => { config: { name: `node${name}`, schema: MemoryNode.configSchema }, }) - const stateStoreArchivistAccount = await Account.create() + const stateStoreArchivistAccount = Account.randomSync() const stateStoreArchivist = await MemoryArchivist.create({ account: stateStoreArchivistAccount, config: { name: `stateStoreArchivist${name}`, schema: MemoryArchivist.configSchema }, }) - const stateStoreBoundWitnessDivinerAccount = await Account.create() + const stateStoreBoundWitnessDivinerAccount = Account.randomSync() const stateStoreBoundWitnessDiviner = await MemoryBoundWitnessDiviner.create({ account: stateStoreBoundWitnessDivinerAccount, config: { @@ -120,7 +121,7 @@ describe('PubSubBridge', () => { }, }) - const moduleAccount = await Account.create() + const moduleAccount = Account.randomSync() const module = await MemoryArchivist.create({ account: moduleAccount, config: { name: `module${name}`, schema: MemoryArchivist.configSchema }, @@ -144,6 +145,7 @@ describe('PubSubBridge', () => { const pubSubBridge: PubSubBridge = await PubSubBridge.create({ account, config: { + listeningModules: [client.module.address], name: `pubSubBridge${name}`, pollFrequency, queries: { @@ -169,8 +171,8 @@ describe('PubSubBridge', () => { await node.register(pubSubBridge) await node.attach(pubSubBridge.address, false) clientsWithBridges.push({ ...client, pubSubBridge }) - await intermediateNode.node.register(node) - await intermediateNode.node.attach(node.address, false) + await node.register(intermediateNode.node) + await node.attach(intermediateNode.node.address, false) }), ) }) @@ -261,6 +263,8 @@ describe('PubSubBridge', () => { // Expect result to be defined expect(result).toBeDefined() + expect(result[1]).toBeArrayOfSize(2) + // Expect target to have data const clientBArchivist = asArchivistInstance(destination.module) expect(clientBArchivist).toBeDefined() diff --git a/packages/modules/packages/module/packages/model/src/instance/ModuleInstance.ts b/packages/modules/packages/module/packages/model/src/instance/ModuleInstance.ts index da750cbc8da..ccfe6964227 100644 --- a/packages/modules/packages/module/packages/model/src/instance/ModuleInstance.ts +++ b/packages/modules/packages/module/packages/model/src/instance/ModuleInstance.ts @@ -5,7 +5,11 @@ import { ModuleEventData } from '../EventsModels' import { Module, ModuleQueryFunctions } from '../module' import { ModuleParams } from '../ModuleParams' -export interface ResolveFunctions { +export const isModuleResolver = (value?: unknown): value is ModuleResolver => { + return typeof (value as Partial).resolve === 'function' +} + +export interface ModuleResolver { resolve(filter?: ModuleFilter, options?: ModuleFilterOptions): Promisable resolve(nameOrAddress: string, options?: ModuleFilterOptions): Promisable resolve( @@ -14,22 +18,21 @@ export interface ResolveFunctions { ): Promisable } -export interface ModuleResolver extends ResolveFunctions { - addResolver: (resolver: ModuleResolver) => this - isModuleResolver: boolean - removeResolver: (resolver: ModuleResolver) => this +export interface ModuleResolverInstance extends ModuleResolver { + addResolver: (resolver: ModuleResolverInstance) => this + removeResolver: (resolver: ModuleResolverInstance) => this } export interface ModuleInstance extends Module, - ResolveFunctions, + ModuleResolver, ModuleQueryFunctions { /* The resolver is a 'down' resolver. It can resolve the module or any children (if it is a node for example), that are in the module*/ - readonly downResolver: Omit + readonly downResolver: Omit /* The resolver is a 'up' resolver. It can resolve the parent or any children of the parent*/ /* This is set by a NodeModule when attaching to the module */ - readonly upResolver: Omit + readonly upResolver: Omit } export type InstanceTypeCheck = TypeCheck diff --git a/packages/modules/packages/module/packages/model/src/instance/ModuleRepository.ts b/packages/modules/packages/module/packages/model/src/instance/ModuleRepository.ts index a647ab9a72a..3a18d33dfc9 100644 --- a/packages/modules/packages/module/packages/model/src/instance/ModuleRepository.ts +++ b/packages/modules/packages/module/packages/model/src/instance/ModuleRepository.ts @@ -1,7 +1,7 @@ import { Module } from '../module' -import { ModuleResolver } from './ModuleInstance' +import { ModuleResolverInstance } from './ModuleInstance' -export interface ModuleRepository extends ModuleResolver { +export interface ModuleRepository extends ModuleResolverInstance { add(module: Module): this add(module: Module[]): this add(module: Module | Module[]): this diff --git a/packages/modules/packages/module/packages/resolver/src/CompositeModuleResolver.ts b/packages/modules/packages/module/packages/resolver/src/CompositeModuleResolver.ts index 20884534048..c266795701e 100644 --- a/packages/modules/packages/module/packages/resolver/src/CompositeModuleResolver.ts +++ b/packages/modules/packages/module/packages/resolver/src/CompositeModuleResolver.ts @@ -1,12 +1,19 @@ import { exists } from '@xylabs/exists' import { Base, BaseParams } from '@xylabs/object' -import { duplicateModules, ModuleFilter, ModuleFilterOptions, ModuleInstance, ModuleRepository, ModuleResolver } from '@xyo-network/module-model' +import { + duplicateModules, + ModuleFilter, + ModuleFilterOptions, + ModuleInstance, + ModuleRepository, + ModuleResolverInstance, +} from '@xyo-network/module-model' import { SimpleModuleResolver } from './SimpleModuleResolver' -export class CompositeModuleResolver extends Base implements ModuleRepository, ModuleResolver { +export class CompositeModuleResolver extends Base implements ModuleRepository, ModuleResolverInstance { static defaultMaxDepth = 5 - protected resolvers: ModuleResolver[] = [] + protected resolvers: ModuleResolverInstance[] = [] private localResolver: SimpleModuleResolver constructor(params: BaseParams = {}) { @@ -16,10 +23,6 @@ export class CompositeModuleResolver extends Base implements ModuleRepository, M this.localResolver = localResolver } - get isModuleResolver() { - return true - } - add(module: ModuleInstance): this add(module: ModuleInstance[]): this add(module: ModuleInstance | ModuleInstance[]): this { @@ -31,7 +34,7 @@ export class CompositeModuleResolver extends Base implements ModuleRepository, M return this } - addResolver(resolver: ModuleResolver): this { + addResolver(resolver: ModuleResolverInstance): this { this.resolvers.push(resolver) return this } @@ -45,7 +48,7 @@ export class CompositeModuleResolver extends Base implements ModuleRepository, M return this } - removeResolver(resolver: ModuleResolver): this { + removeResolver(resolver: ModuleResolverInstance): this { this.resolvers = this.resolvers.filter((item) => item !== resolver) return this } @@ -79,7 +82,7 @@ export class CompositeModuleResolver extends Base implements ModuleRepository, M return result }), ) - const flatResult: T[] = result.flat() + const flatResult: T[] = result.flat().filter(exists) return flatResult.filter(duplicateModules) } } diff --git a/packages/modules/packages/module/packages/resolver/src/SimpleModuleResolver.ts b/packages/modules/packages/module/packages/resolver/src/SimpleModuleResolver.ts index a1d01b0bef5..8e725203506 100644 --- a/packages/modules/packages/module/packages/resolver/src/SimpleModuleResolver.ts +++ b/packages/modules/packages/module/packages/resolver/src/SimpleModuleResolver.ts @@ -6,7 +6,7 @@ import { ModuleFilterOptions, ModuleInstance, ModuleRepository, - ModuleResolver, + ModuleResolverInstance, NameModuleFilter, QueryModuleFilter, } from '@xyo-network/module-model' @@ -16,10 +16,6 @@ export class SimpleModuleResolver implements ModuleRepository { private addressToName: Record = {} private modules: Record = {} - get isModuleResolver() { - return true - } - add(module: ModuleInstance): this add(module: ModuleInstance[]): this add(module: ModuleInstance | ModuleInstance[]): this { @@ -31,7 +27,7 @@ export class SimpleModuleResolver implements ModuleRepository { return this } - addResolver(_resolver: ModuleResolver): this { + addResolver(_resolver: ModuleResolverInstance): this { throw 'Adding resolvers not supported' } @@ -44,7 +40,7 @@ export class SimpleModuleResolver implements ModuleRepository { return this } - removeResolver(_resolver: ModuleResolver): this { + removeResolver(_resolver: ModuleResolverInstance): this { throw 'Removing resolvers not supported' } diff --git a/packages/modules/packages/module/packages/wrapper/src/ModuleWrapper.ts b/packages/modules/packages/module/packages/wrapper/src/ModuleWrapper.ts index 994cdaf5447..5e0382d4ae9 100644 --- a/packages/modules/packages/module/packages/wrapper/src/ModuleWrapper.ts +++ b/packages/modules/packages/module/packages/wrapper/src/ModuleWrapper.ts @@ -31,7 +31,7 @@ import { ModuleManifestQuery, ModuleManifestQuerySchema, ModuleQueryResult, - ModuleResolver, + ModuleResolverInstance, ModuleTypeCheck, } from '@xyo-network/module-model' import { ModuleError, ModuleErrorSchema, Payload, Query } from '@xyo-network/payload-model' @@ -119,11 +119,11 @@ export class ModuleWrapper return this.module.params.config as Exclude } - get downResolver(): ModuleResolver { + get downResolver(): ModuleResolverInstance { //Should we be allowing this? const instance = asModuleInstance(this.module) if (instance) { - return instance.downResolver as ModuleResolver + return instance.downResolver as ModuleResolverInstance } throw new Error('Unsupported') } @@ -140,11 +140,11 @@ export class ModuleWrapper return this.module.queries } - get upResolver(): ModuleResolver { + get upResolver(): ModuleResolverInstance { //Should we be allowing this? const instance = asModuleInstance(this.module) if (instance) { - return instance.upResolver as ModuleResolver + return instance.upResolver as ModuleResolverInstance } throw new Error('Unsupported') } diff --git a/packages/modules/packages/node/packages/abstract/src/AbstractNode.ts b/packages/modules/packages/node/packages/abstract/src/AbstractNode.ts index d6249f392c1..6da234031ce 100644 --- a/packages/modules/packages/node/packages/abstract/src/AbstractNode.ts +++ b/packages/modules/packages/node/packages/abstract/src/AbstractNode.ts @@ -40,10 +40,6 @@ export abstract class AbstractNode(objs: T[]): Promise> { + const result: Record = {} + for (const pair of await this.hashPairs(objs)) { + result[pair[1]] = pair[0] + result[pair[0].$hash] = pair[0] + } + return result + } + static async toDataHashMap(objs: T[]): Promise> { const result: Record = {} for (const pair of await this.dataHashPairs(objs)) { diff --git a/yarn.lock b/yarn.lock index 1411cb1bf8b..27247f46be8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29,7 +29,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.23.5": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.23.5": version: 7.23.5 resolution: "@babel/code-frame@npm:7.23.5" dependencies: @@ -47,25 +47,25 @@ __metadata: linkType: hard "@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3": - version: 7.23.7 - resolution: "@babel/core@npm:7.23.7" + version: 7.23.9 + resolution: "@babel/core@npm:7.23.9" dependencies: "@ampproject/remapping": "npm:^2.2.0" "@babel/code-frame": "npm:^7.23.5" "@babel/generator": "npm:^7.23.6" "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helpers": "npm:^7.23.7" - "@babel/parser": "npm:^7.23.6" - "@babel/template": "npm:^7.22.15" - "@babel/traverse": "npm:^7.23.7" - "@babel/types": "npm:^7.23.6" + "@babel/helpers": "npm:^7.23.9" + "@babel/parser": "npm:^7.23.9" + "@babel/template": "npm:^7.23.9" + "@babel/traverse": "npm:^7.23.9" + "@babel/types": "npm:^7.23.9" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 956841695ea801c8b4196d01072e6c1062335960715a6fcfd4009831003b526b00627c78b373ed49b1658c3622c71142f7ff04235fe839cac4a1a25ed51b90aa + checksum: 268cdbb86bef1b8ea5b1300f2f325e56a1740a5051360cb228ffeaa0f80282b6674f3a2b4d6466adb0691183759b88d4c37b4a4f77232c84a49ed771c84cdc27 languageName: node linkType: hard @@ -190,14 +190,14 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.23.7": - version: 7.23.8 - resolution: "@babel/helpers@npm:7.23.8" +"@babel/helpers@npm:^7.23.9": + version: 7.23.9 + resolution: "@babel/helpers@npm:7.23.9" dependencies: - "@babel/template": "npm:^7.22.15" - "@babel/traverse": "npm:^7.23.7" - "@babel/types": "npm:^7.23.6" - checksum: 4c392351910102403b6a7c922319077b179c276e422a4e45b243b45610f813a05a043b6b116cbf5eb4b437fb51b9a2dfc2b7c65f38a0de7fde1f97d08a675313 + "@babel/template": "npm:^7.23.9" + "@babel/traverse": "npm:^7.23.9" + "@babel/types": "npm:^7.23.9" + checksum: dd56daac8bbd7ed174bb00fd185926fd449e591d9a00edaceb7ac6edbdd7a8db57e2cb365b4fafda382201752789ced2f7ae010f667eab0f198a4571cda4d2c5 languageName: node linkType: hard @@ -212,12 +212,12 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/parser@npm:7.23.6" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.23.6, @babel/parser@npm:^7.23.9": + version: 7.23.9 + resolution: "@babel/parser@npm:7.23.9" bin: parser: ./bin/babel-parser.js - checksum: 6be3a63d3c9d07b035b5a79c022327cb7e16cbd530140ecb731f19a650c794c315a72c699a22413ebeafaff14aa8f53435111898d59e01a393d741b85629fa7d + checksum: 727a7a807100f6a26df859e2f009c4ddbd0d3363287b45daa50bd082ccd0d431d0c4d0e610a91f806e04a1918726cd0f5a0592c9b902a815337feed12e1cafd9 languageName: node linkType: hard @@ -375,20 +375,20 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.22.15, @babel/template@npm:^7.3.3": - version: 7.22.15 - resolution: "@babel/template@npm:7.22.15" +"@babel/template@npm:^7.22.15, @babel/template@npm:^7.23.9, @babel/template@npm:^7.3.3": + version: 7.23.9 + resolution: "@babel/template@npm:7.23.9" dependencies: - "@babel/code-frame": "npm:^7.22.13" - "@babel/parser": "npm:^7.22.15" - "@babel/types": "npm:^7.22.15" - checksum: 21e768e4eed4d1da2ce5d30aa51db0f4d6d8700bc1821fec6292587df7bba2fe1a96451230de8c64b989740731888ebf1141138bfffb14cacccf4d05c66ad93f + "@babel/code-frame": "npm:^7.23.5" + "@babel/parser": "npm:^7.23.9" + "@babel/types": "npm:^7.23.9" + checksum: 1b011ba9354dc2e646561d54b6862e0df51760e6179faadd79be05825b0b6da04911e4e192df943f1766748da3037fd8493615b38707f7cadb0cf0c96601c170 languageName: node linkType: hard -"@babel/traverse@npm:^7.23.2, @babel/traverse@npm:^7.23.7": - version: 7.23.7 - resolution: "@babel/traverse@npm:7.23.7" +"@babel/traverse@npm:^7.23.2, @babel/traverse@npm:^7.23.9": + version: 7.23.9 + resolution: "@babel/traverse@npm:7.23.9" dependencies: "@babel/code-frame": "npm:^7.23.5" "@babel/generator": "npm:^7.23.6" @@ -396,22 +396,22 @@ __metadata: "@babel/helper-function-name": "npm:^7.23.0" "@babel/helper-hoist-variables": "npm:^7.22.5" "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/parser": "npm:^7.23.6" - "@babel/types": "npm:^7.23.6" + "@babel/parser": "npm:^7.23.9" + "@babel/types": "npm:^7.23.9" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 3215e59429963c8dac85c26933372cdd322952aa9930e4bc5ef2d0e4bd7a1510d1ecf8f8fd860ace5d4d9fe496d23805a1ea019a86410aee4111de5f63ee84f9 + checksum: e2bb845f7f229feb7c338f7e150f5f1abc5395dcd3a6a47f63a25242ec3ec6b165f04a6df7d4849468547faee34eb3cf52487eb0bd867a7d3c42fec2a648266f languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.6, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": - version: 7.23.6 - resolution: "@babel/types@npm:7.23.6" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.6, @babel/types@npm:^7.23.9, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": + version: 7.23.9 + resolution: "@babel/types@npm:7.23.9" dependencies: "@babel/helper-string-parser": "npm:^7.23.4" "@babel/helper-validator-identifier": "npm:^7.22.20" to-fast-properties: "npm:^2.0.0" - checksum: 07e70bb94d30b0231396b5e9a7726e6d9227a0a62e0a6830c0bd3232f33b024092e3d5a7d1b096a65bbf2bb43a9ab4c721bf618e115bfbb87b454fa060f88cbf + checksum: bed9634e5fd0f9dc63c84cfa83316c4cb617192db9fedfea464fca743affe93736d7bf2ebf418ee8358751a9d388e303af87a0c050cb5d87d5870c1b0154f6cb languageName: node linkType: hard @@ -445,163 +445,163 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/aix-ppc64@npm:0.19.11" +"@esbuild/aix-ppc64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/aix-ppc64@npm:0.19.12" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/android-arm64@npm:0.19.11" +"@esbuild/android-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/android-arm64@npm:0.19.12" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-arm@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/android-arm@npm:0.19.11" +"@esbuild/android-arm@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/android-arm@npm:0.19.12" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-x64@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/android-x64@npm:0.19.11" +"@esbuild/android-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/android-x64@npm:0.19.12" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/darwin-arm64@npm:0.19.11" +"@esbuild/darwin-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/darwin-arm64@npm:0.19.12" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/darwin-x64@npm:0.19.11" +"@esbuild/darwin-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/darwin-x64@npm:0.19.12" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/freebsd-arm64@npm:0.19.11" +"@esbuild/freebsd-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/freebsd-arm64@npm:0.19.12" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/freebsd-x64@npm:0.19.11" +"@esbuild/freebsd-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/freebsd-x64@npm:0.19.12" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/linux-arm64@npm:0.19.11" +"@esbuild/linux-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-arm64@npm:0.19.12" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/linux-arm@npm:0.19.11" +"@esbuild/linux-arm@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-arm@npm:0.19.12" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/linux-ia32@npm:0.19.11" +"@esbuild/linux-ia32@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-ia32@npm:0.19.12" conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/linux-loong64@npm:0.19.11" +"@esbuild/linux-loong64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-loong64@npm:0.19.12" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/linux-mips64el@npm:0.19.11" +"@esbuild/linux-mips64el@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-mips64el@npm:0.19.12" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/linux-ppc64@npm:0.19.11" +"@esbuild/linux-ppc64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-ppc64@npm:0.19.12" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/linux-riscv64@npm:0.19.11" +"@esbuild/linux-riscv64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-riscv64@npm:0.19.12" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/linux-s390x@npm:0.19.11" +"@esbuild/linux-s390x@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-s390x@npm:0.19.12" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/linux-x64@npm:0.19.11" +"@esbuild/linux-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-x64@npm:0.19.12" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/netbsd-x64@npm:0.19.11" +"@esbuild/netbsd-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/netbsd-x64@npm:0.19.12" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/openbsd-x64@npm:0.19.11" +"@esbuild/openbsd-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/openbsd-x64@npm:0.19.12" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/sunos-x64@npm:0.19.11" +"@esbuild/sunos-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/sunos-x64@npm:0.19.12" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/win32-arm64@npm:0.19.11" +"@esbuild/win32-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/win32-arm64@npm:0.19.12" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/win32-ia32@npm:0.19.11" +"@esbuild/win32-ia32@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/win32-ia32@npm:0.19.12" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.19.11": - version: 0.19.11 - resolution: "@esbuild/win32-x64@npm:0.19.11" +"@esbuild/win32-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/win32-x64@npm:0.19.12" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -1029,12 +1029,12 @@ __metadata: linkType: hard "@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.21 - resolution: "@jridgewell/trace-mapping@npm:0.3.21" + version: 0.3.22 + resolution: "@jridgewell/trace-mapping@npm:0.3.22" dependencies: "@jridgewell/resolve-uri": "npm:^3.1.0" "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 925dda0620887e5a24f11b5a3a106f4e8b1a66155b49be6ceee61432174df33a17c243d8a89b2cd79ccebd281d817878759236a2fc42c47325ae9f73dfbfb90d + checksum: 48d3e3db00dbecb211613649a1849876ba5544a3f41cf5e6b99ea1130272d6cf18591b5b67389bce20f1c871b4ede5900c3b6446a7aab6d0a3b2fe806a834db7 languageName: node linkType: hard @@ -1109,13 +1109,13 @@ __metadata: linkType: hard "@metamask/json-rpc-engine@npm:^7.1.1": - version: 7.3.1 - resolution: "@metamask/json-rpc-engine@npm:7.3.1" + version: 7.3.2 + resolution: "@metamask/json-rpc-engine@npm:7.3.2" dependencies: "@metamask/rpc-errors": "npm:^6.1.0" "@metamask/safe-event-emitter": "npm:^3.0.0" - "@metamask/utils": "npm:^8.2.0" - checksum: 3988ec9229964c8c3c9172ad8ef36bea2f20e63d0dd720431db89a0031b7692c5ebaa2c53afe9896a823b334f4d5eb718e48a5db00477fe8b7643d332ae3010d + "@metamask/utils": "npm:^8.3.0" + checksum: d90e5fdf88461aa90af41ba0304729200afa8226ab8b73db348704a1f545e416c49281a1dfd58591dde769e1ab263080b26d5a0ab1be8362398639dc2d6354de languageName: node linkType: hard @@ -1166,7 +1166,7 @@ __metadata: languageName: node linkType: hard -"@metamask/utils@npm:^8.1.0, @metamask/utils@npm:^8.2.0": +"@metamask/utils@npm:^8.1.0, @metamask/utils@npm:^8.3.0": version: 8.3.0 resolution: "@metamask/utils@npm:8.3.0" dependencies: @@ -1192,15 +1192,6 @@ __metadata: languageName: node linkType: hard -"@noble/curves@npm:1.1.0, @noble/curves@npm:~1.1.0": - version: 1.1.0 - resolution: "@noble/curves@npm:1.1.0" - dependencies: - "@noble/hashes": "npm:1.3.1" - checksum: 7028e3f19a4a2a601f9159e5423f51ae86ab231bed79a6e40649b063e1ed7f55f5da0475f1377bd2c5a8e5fc485af9ce0549ad89da6b983d6af48e5d0a2041ca - languageName: node - linkType: hard - "@noble/curves@npm:1.2.0": version: 1.2.0 resolution: "@noble/curves@npm:1.2.0" @@ -1210,10 +1201,12 @@ __metadata: languageName: node linkType: hard -"@noble/hashes@npm:1.3.1": - version: 1.3.1 - resolution: "@noble/hashes@npm:1.3.1" - checksum: 39474bab7e7813dbbfd8750476f48046d3004984e161fcd4333e40ca823f07b069010b35a20246e5b4ac20858e29913172a4d69720fd1e93620f7bedb70f9b72 +"@noble/curves@npm:1.3.0, @noble/curves@npm:~1.3.0": + version: 1.3.0 + resolution: "@noble/curves@npm:1.3.0" + dependencies: + "@noble/hashes": "npm:1.3.3" + checksum: f3cbdd1af00179e30146eac5539e6df290228fb857a7a8ba36d1a772cbe59288a2ca83d06f175d3446ef00db3a80d7fd8b8347f7de9c2d4d5bf3865d8bb78252 languageName: node linkType: hard @@ -1224,7 +1217,7 @@ __metadata: languageName: node linkType: hard -"@noble/hashes@npm:^1.3.1, @noble/hashes@npm:~1.3.0, @noble/hashes@npm:~1.3.1, @noble/hashes@npm:~1.3.2, @noble/hashes@npm:~1.3.3": +"@noble/hashes@npm:1.3.3, @noble/hashes@npm:^1.3.1, @noble/hashes@npm:~1.3.2, @noble/hashes@npm:~1.3.3": version: 1.3.3 resolution: "@noble/hashes@npm:1.3.3" checksum: 1025ddde4d24630e95c0818e63d2d54ee131b980fe113312d17ed7468bc18f54486ac86c907685759f8a7e13c2f9b9e83ec7b67d1cc20836f36b5e4a65bb102d @@ -1266,15 +1259,15 @@ __metadata: linkType: hard "@npmcli/agent@npm:^2.0.0": - version: 2.2.0 - resolution: "@npmcli/agent@npm:2.2.0" + version: 2.2.1 + resolution: "@npmcli/agent@npm:2.2.1" dependencies: agent-base: "npm:^7.1.0" http-proxy-agent: "npm:^7.0.0" https-proxy-agent: "npm:^7.0.1" lru-cache: "npm:^10.0.1" socks-proxy-agent: "npm:^8.0.1" - checksum: 822ea077553cd9cfc5cbd6d92380b0950fcb054a7027cd1b63a33bd0cbb16b0c6626ea75d95ec0e804643c8904472d3361d2da8c2444b1fb02a9b525d9c07c41 + checksum: d4a48128f61e47f2f5c89315a5350e265dc619987e635bd62b52b29c7ed93536e724e721418c0ce352ceece86c13043c67aba1b70c3f5cc72fce6bb746706162 languageName: node linkType: hard @@ -1473,126 +1466,116 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.9.5": - version: 4.9.5 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.9.5" +"@rollup/rollup-android-arm-eabi@npm:4.9.6": + version: 4.9.6 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.9.6" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.9.5": - version: 4.9.5 - resolution: "@rollup/rollup-android-arm64@npm:4.9.5" +"@rollup/rollup-android-arm64@npm:4.9.6": + version: 4.9.6 + resolution: "@rollup/rollup-android-arm64@npm:4.9.6" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.9.5": - version: 4.9.5 - resolution: "@rollup/rollup-darwin-arm64@npm:4.9.5" +"@rollup/rollup-darwin-arm64@npm:4.9.6": + version: 4.9.6 + resolution: "@rollup/rollup-darwin-arm64@npm:4.9.6" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.9.5": - version: 4.9.5 - resolution: "@rollup/rollup-darwin-x64@npm:4.9.5" +"@rollup/rollup-darwin-x64@npm:4.9.6": + version: 4.9.6 + resolution: "@rollup/rollup-darwin-x64@npm:4.9.6" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.9.5": - version: 4.9.5 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.9.5" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.9.6": + version: 4.9.6 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.9.6" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.9.5": - version: 4.9.5 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.9.5" +"@rollup/rollup-linux-arm64-gnu@npm:4.9.6": + version: 4.9.6 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.9.6" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.9.5": - version: 4.9.5 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.9.5" +"@rollup/rollup-linux-arm64-musl@npm:4.9.6": + version: 4.9.6 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.9.6" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.9.5": - version: 4.9.5 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.9.5" +"@rollup/rollup-linux-riscv64-gnu@npm:4.9.6": + version: 4.9.6 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.9.6" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.9.5": - version: 4.9.5 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.9.5" +"@rollup/rollup-linux-x64-gnu@npm:4.9.6": + version: 4.9.6 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.9.6" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.9.5": - version: 4.9.5 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.9.5" +"@rollup/rollup-linux-x64-musl@npm:4.9.6": + version: 4.9.6 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.9.6" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.9.5": - version: 4.9.5 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.9.5" +"@rollup/rollup-win32-arm64-msvc@npm:4.9.6": + version: 4.9.6 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.9.6" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.9.5": - version: 4.9.5 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.9.5" +"@rollup/rollup-win32-ia32-msvc@npm:4.9.6": + version: 4.9.6 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.9.6" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.9.5": - version: 4.9.5 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.9.5" +"@rollup/rollup-win32-x64-msvc@npm:4.9.6": + version: 4.9.6 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.9.6" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@scure/base@npm:^1.1.3, @scure/base@npm:^1.1.5, @scure/base@npm:~1.1.0, @scure/base@npm:~1.1.4, @scure/base@npm:~1.1.5": +"@scure/base@npm:^1.1.3, @scure/base@npm:^1.1.5, @scure/base@npm:~1.1.4, @scure/base@npm:~1.1.5": version: 1.1.5 resolution: "@scure/base@npm:1.1.5" checksum: 543fa9991c6378b6a0d5ab7f1e27b30bb9c1e860d3ac81119b4213cfdf0ad7b61be004e06506e89de7ce0cec9391c17f5c082bb34c3b617a2ee6a04129f52481 languageName: node linkType: hard -"@scure/bip32@npm:1.3.1": - version: 1.3.1 - resolution: "@scure/bip32@npm:1.3.1" - dependencies: - "@noble/curves": "npm:~1.1.0" - "@noble/hashes": "npm:~1.3.1" - "@scure/base": "npm:~1.1.0" - checksum: 0595955374dfa54a60adfa33d4793fd8b27230e962aaceb5bb5fcf8ccbb935184aa2c45154ec9bdfb26a1877b2ae0a8e4808c9a5464d4ffd971120740b816def - languageName: node - linkType: hard - -"@scure/bip39@npm:1.2.1": - version: 1.2.1 - resolution: "@scure/bip39@npm:1.2.1" +"@scure/bip32@npm:1.3.3": + version: 1.3.3 + resolution: "@scure/bip32@npm:1.3.3" dependencies: - "@noble/hashes": "npm:~1.3.0" - "@scure/base": "npm:~1.1.0" - checksum: 2ea368bbed34d6b1701c20683bf465e147f231a9e37e639b8c82f585d6f978bb0f3855fca7ceff04954ae248b3e313f5d322d0210614fb7acb402739415aaf31 + "@noble/curves": "npm:~1.3.0" + "@noble/hashes": "npm:~1.3.2" + "@scure/base": "npm:~1.1.4" + checksum: 4b8b75567866ff7d6b3ba154538add02d2951e9433e8dd7f0014331ac500cda5a88fe3d39b408fcc36e86b633682013f172b967af022c2e4e4ab07336801d688 languageName: node linkType: hard -"@scure/bip39@npm:^1.2.2": +"@scure/bip39@npm:1.2.2, @scure/bip39@npm:^1.2.2": version: 1.2.2 resolution: "@scure/bip39@npm:1.2.2" dependencies: @@ -1654,11 +1637,11 @@ __metadata: linkType: hard "@sinonjs/commons@npm:^3.0.0": - version: 3.0.0 - resolution: "@sinonjs/commons@npm:3.0.0" + version: 3.0.1 + resolution: "@sinonjs/commons@npm:3.0.1" dependencies: type-detect: "npm:4.0.8" - checksum: 086720ae0bc370829322df32612205141cdd44e592a8a9ca97197571f8f970352ea39d3bda75b347c43789013ddab36b34b59e40380a49bdae1c2df3aa85fe4f + checksum: a0af217ba7044426c78df52c23cedede6daf377586f3ac58857c565769358ab1f44ebf95ba04bbe38814fba6e316ca6f02870a009328294fc2c555d0f85a7117 languageName: node linkType: hard @@ -1788,9 +1771,9 @@ __metadata: linkType: hard "@swc/counter@npm:^0.1.1": - version: 0.1.2 - resolution: "@swc/counter@npm:0.1.2" - checksum: 8427c594f1f0cf44b83885e9c8fe1e370c9db44ae96e07a37c117a6260ee97797d0709483efbcc244e77bac578690215f45b23254c4cd8a70fb25ddbb50bf33e + version: 0.1.3 + resolution: "@swc/counter@npm:0.1.3" + checksum: df8f9cfba9904d3d60f511664c70d23bb323b3a0803ec9890f60133954173047ba9bdeabce28cd70ba89ccd3fd6c71c7b0bd58be85f611e1ffbe5d5c18616598 languageName: node linkType: hard @@ -1950,11 +1933,11 @@ __metadata: linkType: hard "@types/estree-jsx@npm:^1.0.0": - version: 1.0.3 - resolution: "@types/estree-jsx@npm:1.0.3" + version: 1.0.4 + resolution: "@types/estree-jsx@npm:1.0.4" dependencies: "@types/estree": "npm:*" - checksum: 6887a134308b6db4a33a147b56c9d0a47c17ea7e810bdd7c498c306a0fd00bcf2619cb0f57f74009d03dda974b3cd7e414767f85332b1d1b2be30a3ef9e1cca9 + checksum: fb97b3226814e833689304759d8bac29d869ca4cfcfa36f2f3877fb9819f218a11396a28963607e1d0cc72363c3803bfe9a8b16a42924819824e63d10ec386db languageName: node linkType: hard @@ -1966,9 +1949,9 @@ __metadata: linkType: hard "@types/geojson@npm:*": - version: 7946.0.13 - resolution: "@types/geojson@npm:7946.0.13" - checksum: b3b68457c89bc3f0445dc9eb54d07e6f89658672867c54989bc7f71f87d54e562195b291d43e1b84476493351271d7ccb9f5c6ab2012b29fbafbb0e8e43c4bca + version: 7946.0.14 + resolution: "@types/geojson@npm:7946.0.14" + checksum: ae511bee6488ae3bd5a3a3347aedb0371e997b14225b8983679284e22fa4ebd88627c6e3ff8b08bf4cc35068cb29310c89427311ffc9322c255615821a922e71 languageName: node linkType: hard @@ -1992,11 +1975,11 @@ __metadata: linkType: hard "@types/hast@npm:^2.0.0": - version: 2.3.9 - resolution: "@types/hast@npm:2.3.9" + version: 2.3.10 + resolution: "@types/hast@npm:2.3.10" dependencies: "@types/unist": "npm:^2" - checksum: 32a742021a973b1e23399f09a21325fda89bf55486068ef7c6364f5054b991cc8ab007f1134cc9d6c7030b6ed60633d70f7401dffb3dec8d10c997330d458a3f + checksum: 41531b7fbf590b02452996fc63272479c20a07269e370bd6514982cbcd1819b4b84d3ea620f2410d1b9541a23d08ce2eeb0a592145d05e00e249c3d56700d460 languageName: node linkType: hard @@ -2151,11 +2134,11 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:^20.11.5": - version: 20.11.5 - resolution: "@types/node@npm:20.11.5" + version: 20.11.16 + resolution: "@types/node@npm:20.11.16" dependencies: undici-types: "npm:~5.26.4" - checksum: 9f31c471047d7b3e240ce7b77ff29b0d15e83be7e3feafb3d0b0d0931122b438b1eefa302a5a2e1e9849914ff3fd76aafbd8ccb372efb1331ba048da63bce6f8 + checksum: 751f50ec5c9332b11515e82fe37c71479ac4449b711280aa3c7910edf67b1e3f5ac00041512add543f9a892096a68356406998bf02a2c809a73d176c44c28414 languageName: node linkType: hard @@ -2167,9 +2150,9 @@ __metadata: linkType: hard "@types/node@npm:^16.9.2": - version: 16.18.71 - resolution: "@types/node@npm:16.18.71" - checksum: ce8c3b96f6da5d14cce5371b1bc02928cf78b98bc4a47eb5d48eec3f5a8b2c25104b3b72e38bcf05d736cfb58ad205a24fdd07343747aa278ea30cfd79ad67af + version: 16.18.79 + resolution: "@types/node@npm:16.18.79" + checksum: 616845d6bf4c6ac7e47e6a75b1c5b5a93ba730cc4b2f37f5aadac3a561dd7d0d10f584baae969fd6552fc32100c1b66a4c8e8e5d82c935144f91ca9b22cefa69 languageName: node linkType: hard @@ -2227,13 +2210,13 @@ __metadata: linkType: hard "@types/superagent@npm:^8.1.0": - version: 8.1.1 - resolution: "@types/superagent@npm:8.1.1" + version: 8.1.3 + resolution: "@types/superagent@npm:8.1.3" dependencies: "@types/cookiejar": "npm:^2.1.5" "@types/methods": "npm:^1.1.4" "@types/node": "npm:*" - checksum: 02b987833cf0d85da9b137fd296fe8ad25a470d60f7e9d81a6ed3f8f8a5d6bace8780816bd35885e2928f467e819a4aa509879a7da0f28018ab1453845eb91e2 + checksum: 04c8c6ead7fa6def0fb8e970491c6af8920aee7c86f0d82637bcc6dba44f8dd91a6c5c204a1d06978c39fc591e8a73c711327c0dba3a003319dc40930fc7329b languageName: node linkType: hard @@ -4921,6 +4904,7 @@ __metadata: "@xylabs/tsconfig": "npm:^3.2.42" "@xyo-network/manifest-model": "workspace:~" "@xyo-network/manifest-wrapper": "workspace:~" + ajv: "npm:^8.12.0" typescript: "npm:^5.3.3" languageName: unknown linkType: soft @@ -5548,7 +5532,7 @@ __metadata: "@xyo-network/sdk": "workspace:~" dotenv: "npm:^16.4.1" eslint: "npm:^8.56.0" - eslint-plugin-unicorn: "npm:^50.0.1" + eslint-plugin-unicorn: "npm:^51.0.1" jest: "npm:^29.7.0" jest-docblock: "npm:^29.7.0" jest-environment-jsdom: "npm:^29.7.0" @@ -6276,13 +6260,13 @@ __metadata: languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.0": - version: 1.0.0 - resolution: "array-buffer-byte-length@npm:1.0.0" +"array-buffer-byte-length@npm:^1.0.0, array-buffer-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "array-buffer-byte-length@npm:1.0.1" dependencies: - call-bind: "npm:^1.0.2" - is-array-buffer: "npm:^3.0.1" - checksum: 044e101ce150f4804ad19c51d6c4d4cfa505c5b2577bd179256e4aa3f3f6a0a5e9874c78cd428ee566ac574c8a04d7ce21af9fe52e844abfdccb82b33035a7c3 + call-bind: "npm:^1.0.5" + is-array-buffer: "npm:^3.0.4" + checksum: 53524e08f40867f6a9f35318fafe467c32e45e9c682ba67b11943e167344d2febc0f6977a17e699b05699e805c3e8f073d876f8bbf1b559ed494ad2cd0fae09e languageName: node linkType: hard @@ -6343,16 +6327,29 @@ __metadata: languageName: node linkType: hard -"array.prototype.findlastindex@npm:^1.2.3": - version: 1.2.3 - resolution: "array.prototype.findlastindex@npm:1.2.3" +"array.prototype.filter@npm:^1.0.3": + version: 1.0.3 + resolution: "array.prototype.filter@npm:1.0.3" dependencies: call-bind: "npm:^1.0.2" define-properties: "npm:^1.2.0" es-abstract: "npm:^1.22.1" - es-shim-unscopables: "npm:^1.0.0" - get-intrinsic: "npm:^1.2.1" - checksum: 063cbab8eeac3aa01f3e980eecb9a8c5d87723032b49f7f814ecc6d75c33c03c17e3f43a458127a62e16303cab412f95d6ad9dc7e0ae6d9dc27a9bb76c24df7a + es-array-method-boxes-properly: "npm:^1.0.0" + is-string: "npm:^1.0.7" + checksum: 3da2189afb00f95559cc73fc3c50f17a071a65bb705c0b2f2e2a2b2142781215b622442368c8b4387389b6ab251adf09ad347f9a8a4cf29d24404cc5ea1e295c + languageName: node + linkType: hard + +"array.prototype.findlastindex@npm:^1.2.3": + version: 1.2.4 + resolution: "array.prototype.findlastindex@npm:1.2.4" + dependencies: + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.22.3" + es-errors: "npm:^1.3.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 12d7de8da619065b9d4c40550d11c13f2fbbc863c4270ef01d022f49ef16fbe9022441ee9d60b1e952853c661dd4b3e05c21e4348d4631c6d93ddf802a252296 languageName: node linkType: hard @@ -6381,17 +6378,18 @@ __metadata: linkType: hard "arraybuffer.prototype.slice@npm:^1.0.2": - version: 1.0.2 - resolution: "arraybuffer.prototype.slice@npm:1.0.2" + version: 1.0.3 + resolution: "arraybuffer.prototype.slice@npm:1.0.3" dependencies: - array-buffer-byte-length: "npm:^1.0.0" - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - get-intrinsic: "npm:^1.2.1" - is-array-buffer: "npm:^3.0.2" + array-buffer-byte-length: "npm:^1.0.1" + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.22.3" + es-errors: "npm:^1.2.1" + get-intrinsic: "npm:^1.2.3" + is-array-buffer: "npm:^3.0.4" is-shared-array-buffer: "npm:^1.0.2" - checksum: c200faf437786f5b2c80d4564ff5481c886a16dee642ef02abdc7306c7edd523d1f01d1dd12b769c7eb42ac9bc53874510db19a92a2c035c0f6696172aafa5d3 + checksum: 0221f16c1e3ec7b67da870ee0e1f12b825b5f9189835392b59a22990f715827561a4f4cd5330dc7507de272d8df821be6cd4b0cb569babf5ea4be70e365a2f3d languageName: node linkType: hard @@ -6455,21 +6453,21 @@ __metadata: languageName: node linkType: hard -"available-typed-arrays@npm:^1.0.5": - version: 1.0.5 - resolution: "available-typed-arrays@npm:1.0.5" - checksum: 4d4d5e86ea0425696f40717882f66a570647b94ac8d273ddc7549a9b61e5da099e149bf431530ccbd776bd74e02039eb8b5edf426e3e2211ee61af16698a9064 +"available-typed-arrays@npm:^1.0.5, available-typed-arrays@npm:^1.0.6": + version: 1.0.6 + resolution: "available-typed-arrays@npm:1.0.6" + checksum: c1e2e3d3a694f21bf60e0a048d8275fa7358131a0b8e6b57714318d618b59522416db67fb9f56973af0ce596f4333ef1336ca12c37a41d5a72ef79885373a7fd languageName: node linkType: hard "axios@npm:^1": - version: 1.6.5 - resolution: "axios@npm:1.6.5" + version: 1.6.7 + resolution: "axios@npm:1.6.7" dependencies: follow-redirects: "npm:^1.15.4" form-data: "npm:^4.0.0" proxy-from-env: "npm:^1.1.0" - checksum: 465489d9bf8f039b9adbc8103b6299d6a5e26de77b27f0e4173d814d39bca8f4b4659d94e09ee40461aedccd8c2452f1e2b3edace1c9f81220060d2974ff9dc7 + checksum: a1932b089ece759cd261f175d9ebf4d41c8994cf0c0767cda86055c7a19bcfdade8ae3464bf4cec4c8b142f4a657dc664fb77a41855e8376cf38b86d7a86518f languageName: node linkType: hard @@ -6683,16 +6681,16 @@ __metadata: linkType: hard "browserslist@npm:^4.22.2": - version: 4.22.2 - resolution: "browserslist@npm:4.22.2" + version: 4.22.3 + resolution: "browserslist@npm:4.22.3" dependencies: - caniuse-lite: "npm:^1.0.30001565" - electron-to-chromium: "npm:^1.4.601" + caniuse-lite: "npm:^1.0.30001580" + electron-to-chromium: "npm:^1.4.648" node-releases: "npm:^2.0.14" update-browserslist-db: "npm:^1.0.13" bin: browserslist: cli.js - checksum: e3590793db7f66ad3a50817e7b7f195ce61e029bd7187200244db664bfbe0ac832f784e4f6b9c958aef8ea4abe001ae7880b7522682df521f4bc0a5b67660b5e + checksum: d46a906c79dfe95d9702c020afbe5b7b4dbe2019b85432e7a020326adff27e63e3c0a52dc8d4e73247060bbe2c13f000714741903cf96a16baae9c216dc74c75 languageName: node linkType: hard @@ -6870,14 +6868,15 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.4, call-bind@npm:^1.0.5": - version: 1.0.5 - resolution: "call-bind@npm:1.0.5" +"call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6": + version: 1.0.6 + resolution: "call-bind@npm:1.0.6" dependencies: + es-errors: "npm:^1.3.0" function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.1" - set-function-length: "npm:^1.1.1" - checksum: 246d44db6ef9bbd418828dbd5337f80b46be4398d522eded015f31554cbb2ea33025b0203b75c7ab05a1a255b56ef218880cca1743e4121e306729f9e414da39 + get-intrinsic: "npm:^1.2.3" + set-function-length: "npm:^1.2.0" + checksum: d99d92dc414d13a03b8b6f2307fc2f0d16a135b523a14d804a2ba7aaa8aae8223cb40d058703c1e66eed11acaff2dc1bcd6358395fa0eb151d84a42c21dedb19 languageName: node linkType: hard @@ -6934,10 +6933,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001565": - version: 1.0.30001579 - resolution: "caniuse-lite@npm:1.0.30001579" - checksum: 2cd0c02e5d66b09888743ad2b624dbde697ace5c76b55bfd6065ea033f6abea8ac3f5d3c9299c042f91b396e2141b49bc61f5e17086dc9ba3a866cc6790134c0 +"caniuse-lite@npm:^1.0.30001580": + version: 1.0.30001584 + resolution: "caniuse-lite@npm:1.0.30001584" + checksum: 908e4fcafa1e8d52d6c5d79e8c614c4d0cf62af544935f7a78fb5a434157505571ce4c2eacfb549e5d4a6e6e38525350c7a9bf696068ad86eb74e890df1d688f languageName: node linkType: hard @@ -7033,8 +7032,8 @@ __metadata: linkType: hard "chokidar@npm:^3.5.1": - version: 3.5.3 - resolution: "chokidar@npm:3.5.3" + version: 3.6.0 + resolution: "chokidar@npm:3.6.0" dependencies: anymatch: "npm:~3.1.2" braces: "npm:~3.0.2" @@ -7047,7 +7046,7 @@ __metadata: dependenciesMeta: fsevents: optional: true - checksum: 863e3ff78ee7a4a24513d2a416856e84c8e4f5e60efbe03e8ab791af1a183f569b62fc6f6b8044e2804966cb81277ddbbc1dc374fba3265bd609ea8efd62f5b3 + checksum: c327fb07704443f8d15f7b4a7ce93b2f0bc0e6cea07ec28a7570aa22cd51fcf0379df589403976ea956c369f25aa82d84561947e227cd925902e1751371658df languageName: node linkType: hard @@ -7354,11 +7353,11 @@ __metadata: linkType: hard "core-js-compat@npm:^3.34.0": - version: 3.35.0 - resolution: "core-js-compat@npm:3.35.0" + version: 3.35.1 + resolution: "core-js-compat@npm:3.35.1" dependencies: browserslist: "npm:^4.22.2" - checksum: aa21ad2f0c946be7a8ecef92233bc003a38fa27e43a925fcd9b79e32ae49b879e0f5c23459ffc310df38ee547389b8e5e43a6a8be0b2369b9b9ebf3d04ae69b9 + checksum: 9a153c66591e23703e182b258ec6bdaff0a7c578dc5f9ac152fdfef2d09e8ec277f192e28d4634a8b576c8e1a6d3b1ac76ff6b8776e72b71b334e609e177a05e languageName: node linkType: hard @@ -7684,14 +7683,15 @@ __metadata: languageName: node linkType: hard -"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.1": - version: 1.1.1 - resolution: "define-data-property@npm:1.1.1" +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.2": + version: 1.1.2 + resolution: "define-data-property@npm:1.1.2" dependencies: - get-intrinsic: "npm:^1.2.1" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.2" gopd: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.0" - checksum: 5573c8df96b5857408cad64d9b91b69152e305ce4b06218e5f49b59c6cafdbb90a8bd8a0bb83c7bc67a8d479c04aa697063c9bc28d849b7282f9327586d6bc7b + has-property-descriptors: "npm:^1.0.1" + checksum: 19336750149644b2eb53d281ba685c3561abf98d2b0d2a173ee065bb388b977350df2a08c2597b3401bf0e89f313fc69d7582f0373931cc74df0777fb5202cd0 languageName: node linkType: hard @@ -7931,10 +7931,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.601": - version: 1.4.638 - resolution: "electron-to-chromium@npm:1.4.638" - checksum: 52e9d99e84756e403efc53d44b2747a6082df6e33d2a035b9bff9d72006ae5f02c2f4c59ef91345626e90c8c6f5ad3d2dda4a7d32a7194427f18861443882d93 +"electron-to-chromium@npm:^1.4.648": + version: 1.4.659 + resolution: "electron-to-chromium@npm:1.4.659" + checksum: 784ffe2852e2d87b6afc814d62641b4da74264e7c07362675e074e746bd6183b1fa4f40de26b1a9b75afb23561fb48b70904418c4ac45c5b1120b88f4bf0b3cc languageName: node linkType: hard @@ -8030,7 +8030,7 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.22.1": +"es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3": version: 1.22.3 resolution: "es-abstract@npm:1.22.3" dependencies: @@ -8077,6 +8077,20 @@ __metadata: languageName: node linkType: hard +"es-array-method-boxes-properly@npm:^1.0.0": + version: 1.0.0 + resolution: "es-array-method-boxes-properly@npm:1.0.0" + checksum: 27a8a21acf20f3f51f69dce8e643f151e380bffe569e95dc933b9ded9fcd89a765ee21b5229c93f9206c93f87395c6b75f80be8ac8c08a7ceb8771e1822ff1fb + languageName: node + linkType: hard + +"es-errors@npm:^1.0.0, es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 96e65d640156f91b707517e8cdc454dd7d47c32833aa3e85d79f24f9eb7ea85f39b63e36216ef0114996581969b59fe609a94e30316b08f5f4df1d44134cf8d5 + languageName: node + linkType: hard + "es-set-tostringtag@npm:^2.0.1": version: 2.0.2 resolution: "es-set-tostringtag@npm:2.0.2" @@ -8088,7 +8102,7 @@ __metadata: languageName: node linkType: hard -"es-shim-unscopables@npm:^1.0.0": +"es-shim-unscopables@npm:^1.0.0, es-shim-unscopables@npm:^1.0.2": version: 1.0.2 resolution: "es-shim-unscopables@npm:1.0.2" dependencies: @@ -8109,32 +8123,32 @@ __metadata: linkType: hard "esbuild@npm:^0.19.2": - version: 0.19.11 - resolution: "esbuild@npm:0.19.11" - dependencies: - "@esbuild/aix-ppc64": "npm:0.19.11" - "@esbuild/android-arm": "npm:0.19.11" - "@esbuild/android-arm64": "npm:0.19.11" - "@esbuild/android-x64": "npm:0.19.11" - "@esbuild/darwin-arm64": "npm:0.19.11" - "@esbuild/darwin-x64": "npm:0.19.11" - "@esbuild/freebsd-arm64": "npm:0.19.11" - "@esbuild/freebsd-x64": "npm:0.19.11" - "@esbuild/linux-arm": "npm:0.19.11" - "@esbuild/linux-arm64": "npm:0.19.11" - "@esbuild/linux-ia32": "npm:0.19.11" - "@esbuild/linux-loong64": "npm:0.19.11" - "@esbuild/linux-mips64el": "npm:0.19.11" - "@esbuild/linux-ppc64": "npm:0.19.11" - "@esbuild/linux-riscv64": "npm:0.19.11" - "@esbuild/linux-s390x": "npm:0.19.11" - "@esbuild/linux-x64": "npm:0.19.11" - "@esbuild/netbsd-x64": "npm:0.19.11" - "@esbuild/openbsd-x64": "npm:0.19.11" - "@esbuild/sunos-x64": "npm:0.19.11" - "@esbuild/win32-arm64": "npm:0.19.11" - "@esbuild/win32-ia32": "npm:0.19.11" - "@esbuild/win32-x64": "npm:0.19.11" + version: 0.19.12 + resolution: "esbuild@npm:0.19.12" + dependencies: + "@esbuild/aix-ppc64": "npm:0.19.12" + "@esbuild/android-arm": "npm:0.19.12" + "@esbuild/android-arm64": "npm:0.19.12" + "@esbuild/android-x64": "npm:0.19.12" + "@esbuild/darwin-arm64": "npm:0.19.12" + "@esbuild/darwin-x64": "npm:0.19.12" + "@esbuild/freebsd-arm64": "npm:0.19.12" + "@esbuild/freebsd-x64": "npm:0.19.12" + "@esbuild/linux-arm": "npm:0.19.12" + "@esbuild/linux-arm64": "npm:0.19.12" + "@esbuild/linux-ia32": "npm:0.19.12" + "@esbuild/linux-loong64": "npm:0.19.12" + "@esbuild/linux-mips64el": "npm:0.19.12" + "@esbuild/linux-ppc64": "npm:0.19.12" + "@esbuild/linux-riscv64": "npm:0.19.12" + "@esbuild/linux-s390x": "npm:0.19.12" + "@esbuild/linux-x64": "npm:0.19.12" + "@esbuild/netbsd-x64": "npm:0.19.12" + "@esbuild/openbsd-x64": "npm:0.19.12" + "@esbuild/sunos-x64": "npm:0.19.12" + "@esbuild/win32-arm64": "npm:0.19.12" + "@esbuild/win32-ia32": "npm:0.19.12" + "@esbuild/win32-x64": "npm:0.19.12" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -8184,14 +8198,14 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: a40b3858c29618c8c893389372f469245a6b2d1319782af75d33d8ba5dcadfe181fcc935f8e1a907be667946384950a4cf482ebe1e79c99c932d2b8eb35a09d0 + checksum: 861fa8eb2428e8d6521a4b7c7930139e3f45e8d51a86985cc29408172a41f6b18df7b3401e7e5e2d528cdf83742da601ddfdc77043ddc4f1c715a8ddb2d8a255 languageName: node linkType: hard "escalade@npm:^3.1.1": - version: 3.1.1 - resolution: "escalade@npm:3.1.1" - checksum: afa618e73362576b63f6ca83c975456621095a1ed42ff068174e3f5cea48afc422814dda548c96e6ebb5333e7265140c7292abcc81bbd6ccb1757d50d3a4e182 + version: 3.1.2 + resolution: "escalade@npm:3.1.2" + checksum: a1e07fea2f15663c30e40b9193d658397846ffe28ce0a3e4da0d8e485fedfeca228ab846aee101a05015829adf39f9934ff45b2a3fca47bed37a29646bd05cd3 languageName: node linkType: hard @@ -8377,8 +8391,8 @@ __metadata: linkType: hard "eslint-plugin-jsonc@npm:^2.12.2": - version: 2.12.2 - resolution: "eslint-plugin-jsonc@npm:2.12.2" + version: 2.13.0 + resolution: "eslint-plugin-jsonc@npm:2.13.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" eslint-compat-utils: "npm:^0.4.0" @@ -8386,9 +8400,10 @@ __metadata: graphemer: "npm:^1.4.0" jsonc-eslint-parser: "npm:^2.0.4" natural-compare: "npm:^1.4.0" + synckit: "npm:^0.6.0" peerDependencies: eslint: ">=6.0.0" - checksum: 253845255bc22480adc08801cf44ad0fac81bfa61a02b9643a4e948a3a53b3808d94d823fe57fcbeba323ef25ce267e34f07f64b279b90a06ee981f38cf3afc5 + checksum: 32770482d40551de7722ddf3750a1d93ffd39fb8efc821dfb8d7a78ae0fa05c5f96a18b3e2c82beb295bb0411c22c6b6ee17156721c643e237d58f4088854708 languageName: node linkType: hard @@ -8466,9 +8481,9 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-unicorn@npm:^50.0.1": - version: 50.0.1 - resolution: "eslint-plugin-unicorn@npm:50.0.1" +"eslint-plugin-unicorn@npm:^51.0.1": + version: 51.0.1 + resolution: "eslint-plugin-unicorn@npm:51.0.1" dependencies: "@babel/helper-validator-identifier": "npm:^7.22.20" "@eslint-community/eslint-utils": "npm:^4.4.0" @@ -8488,7 +8503,7 @@ __metadata: strip-indent: "npm:^3.0.0" peerDependencies: eslint: ">=8.56.0" - checksum: dd5e45f624a94172965858d7a15434df0ea98e14a300d90cfe7f0cbbd893883e1488036f77cb49162e2b61802c1d5386facfcaf5fd995357a7065013bfb8fe7f + checksum: cea770332423d49d0cd86ca96055be7f14895e1d0a9fb24c8ed4f18a6e1eeff362d4881c46e85d85c37938bb85a6eeae7e347bcf7a3bb7307a8dd309651e0adf languageName: node linkType: hard @@ -8728,14 +8743,14 @@ __metadata: linkType: hard "ethereum-cryptography@npm:^2.0.0": - version: 2.1.2 - resolution: "ethereum-cryptography@npm:2.1.2" + version: 2.1.3 + resolution: "ethereum-cryptography@npm:2.1.3" dependencies: - "@noble/curves": "npm:1.1.0" - "@noble/hashes": "npm:1.3.1" - "@scure/bip32": "npm:1.3.1" - "@scure/bip39": "npm:1.2.1" - checksum: 78983d01ac95047158ec03237ba318152b2c707ccc6a44225da11c72ed6ca575ca0c1630eaf9878fc82fe26272d6624939ef6f020cc89ddddfb941a7393ab909 + "@noble/curves": "npm:1.3.0" + "@noble/hashes": "npm:1.3.3" + "@scure/bip32": "npm:1.3.3" + "@scure/bip39": "npm:1.2.2" + checksum: cc5aa9a4368dc1dd7680ba921957c098ced7b3d7dbb1666334013ab2f8d4cd25a785ad84e66fd9f5c5a9b6de337930ea24ff8c722938f36a9c00cec597ca16b5 languageName: node linkType: hard @@ -8978,11 +8993,11 @@ __metadata: linkType: hard "fastq@npm:^1.6.0": - version: 1.16.0 - resolution: "fastq@npm:1.16.0" + version: 1.17.1 + resolution: "fastq@npm:1.17.1" dependencies: reusify: "npm:^1.0.4" - checksum: de151543aab9d91900ed5da88860c46987ece925c628df586fac664235f25e020ec20729e1c032edb5fd2520fd4aa5b537d69e39b689e65e82112cfbecb4479e + checksum: a443180068b527dd7b3a63dc7f2a47ceca2f3e97b9c00a1efe5538757e6cc4056a3526df94308075d7727561baf09ebaa5b67da8dcbddb913a021c5ae69d1f69 languageName: node linkType: hard @@ -9341,15 +9356,16 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": - version: 1.2.2 - resolution: "get-intrinsic@npm:1.2.2" +"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": + version: 1.2.4 + resolution: "get-intrinsic@npm:1.2.4" dependencies: + es-errors: "npm:^1.3.0" function-bind: "npm:^1.1.2" has-proto: "npm:^1.0.1" has-symbols: "npm:^1.0.3" hasown: "npm:^2.0.0" - checksum: aa96db4f809734d26d49b59bc8669d73a0ae792da561514e987735573a1dfaede516cd102f217a078ea2b42d4c4fb1f83d487932cb15d49826b726cc9cd4470b + checksum: 85bbf4b234c3940edf8a41f4ecbd4e25ce78e5e6ad4e24ca2f77037d983b9ef943fd72f00f3ee97a49ec622a506b67db49c36246150377efcda1c9eb03e5f06d languageName: node linkType: hard @@ -9375,12 +9391,12 @@ __metadata: linkType: hard "get-symbol-description@npm:^1.0.0": - version: 1.0.0 - resolution: "get-symbol-description@npm:1.0.0" + version: 1.0.1 + resolution: "get-symbol-description@npm:1.0.1" dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.1.1" - checksum: 7e5f298afe0f0872747dce4a949ce490ebc5d6dd6aefbbe5044543711c9b19a4dfaebdbc627aee99e1299d58a435b2fbfa083458c1d58be6dc03a3bada24d359 + call-bind: "npm:^1.0.5" + es-errors: "npm:^1.3.0" + checksum: 3feb5130efcade947cbad0304eb2163bab7b80e2c5ce24adcdc242cbdbbbaebbbe0f536807822f333b5d1088288ee19534cb75cd92f18aa76e050ea16e766915 languageName: node linkType: hard @@ -9716,12 +9732,12 @@ __metadata: languageName: node linkType: hard -"has-tostringtag@npm:^1.0.0": - version: 1.0.0 - resolution: "has-tostringtag@npm:1.0.0" +"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.1": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" dependencies: - has-symbols: "npm:^1.0.2" - checksum: 95546e7132efc895a9ae64a8a7cf52588601fc3d52e0304ed228f336992cdf0baaba6f3519d2655e560467db35a1ed79f6420c286cc91a13aa0647a31ed92570 + has-symbols: "npm:^1.0.3" + checksum: c74c5f5ceee3c8a5b8bc37719840dc3749f5b0306d818974141dda2471a1a2ca6c8e46b9d6ac222c5345df7a901c9b6f350b1e6d62763fec877e26609a401bfe languageName: node linkType: hard @@ -10020,9 +10036,9 @@ __metadata: linkType: hard "ignore@npm:^5.2.0, ignore@npm:^5.2.4": - version: 5.3.0 - resolution: "ignore@npm:5.3.0" - checksum: 51594355cea4c6ad6b28b3b85eb81afa7b988a1871feefd7062baf136c95aa06760ee934fa9590e43d967bd377ce84a4cf6135fbeb6063e063f1182a0e9a3bcd + version: 5.3.1 + resolution: "ignore@npm:5.3.1" + checksum: 0a884c2fbc8c316f0b9f92beaf84464253b73230a4d4d286697be45fca081199191ca33e1c2e82d9e5f851f5e9a48a78e25a35c951e7eb41e59f150db3530065 languageName: node linkType: hard @@ -10136,13 +10152,13 @@ __metadata: linkType: hard "internal-slot@npm:^1.0.5": - version: 1.0.6 - resolution: "internal-slot@npm:1.0.6" + version: 1.0.7 + resolution: "internal-slot@npm:1.0.7" dependencies: - get-intrinsic: "npm:^1.2.2" + es-errors: "npm:^1.3.0" hasown: "npm:^2.0.0" side-channel: "npm:^1.0.4" - checksum: bc2022eb1f277f2fcb2a60e7ced451c7ffc7a769b12e63c7a3fb247af8b5a1bed06428ce724046a8bca39ed6eb5b6832501a42f2e9a5ec4a9a7dc4e634431616 + checksum: 3e66720508831153ecf37d13def9f6856f9f2960989ec8a0a0476c98f887fca9eff0163127466485cb825c900c2d6fc601aa9117b7783b90ffce23a71ea5d053 languageName: node linkType: hard @@ -10200,14 +10216,13 @@ __metadata: languageName: node linkType: hard -"is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2": - version: 3.0.2 - resolution: "is-array-buffer@npm:3.0.2" +"is-array-buffer@npm:^3.0.2, is-array-buffer@npm:^3.0.4": + version: 3.0.4 + resolution: "is-array-buffer@npm:3.0.4" dependencies: call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.2.0" - is-typed-array: "npm:^1.1.10" - checksum: dcac9dda66ff17df9cabdc58214172bf41082f956eab30bb0d86bc0fab1e44b690fc8e1f855cf2481245caf4e8a5a006a982a71ddccec84032ed41f9d8da8c14 + get-intrinsic: "npm:^1.2.1" + checksum: 34a26213d981d58b30724ef37a1e0682f4040d580fa9ff58fdfdd3cefcb2287921718c63971c1c404951e7b747c50fdc7caf6e867e951353fa71b369c04c969b languageName: node linkType: hard @@ -10577,12 +10592,12 @@ __metadata: languageName: node linkType: hard -"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.12, is-typed-array@npm:^1.1.9": - version: 1.1.12 - resolution: "is-typed-array@npm:1.1.12" +"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.12, is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.9": + version: 1.1.13 + resolution: "is-typed-array@npm:1.1.13" dependencies: - which-typed-array: "npm:^1.1.11" - checksum: d953adfd3c41618d5e01b2a10f21817e4cdc9572772fa17211100aebb3811b6e3c2e308a0558cc87d218a30504cb90154b833013437776551bfb70606fb088ca + which-typed-array: "npm:^1.1.14" + checksum: f850ba08286358b9a11aee6d93d371a45e3c59b5953549ee1c1a9a55ba5c1dd1bd9952488ae194ad8f32a9cf5e79c8fa5f0cc4d78c00720aa0bbcf238b38062d languageName: node linkType: hard @@ -11509,9 +11524,9 @@ __metadata: linkType: hard "jsonc-parser@npm:^3.2.0": - version: 3.2.0 - resolution: "jsonc-parser@npm:3.2.0" - checksum: bd68b902e5f9394f01da97921f49c5084b2dc03a0c5b4fdb2a429f8d6f292686c1bf87badaeb0a8148d024192a88f5ad2e57b2918ba43fe25cf15f3371db64d4 + version: 3.2.1 + resolution: "jsonc-parser@npm:3.2.1" + checksum: fe2df6f39e21653781d52cae20c5b9e0ab62461918d97f9430b216cea9b6500efc1d8b42c6584cc0a7548b4c996055e9cdc39f09b9782fa6957af2f45306c530 languageName: node linkType: hard @@ -11803,11 +11818,11 @@ __metadata: linkType: hard "magic-string@npm:^0.30.3, magic-string@npm:^0.30.5": - version: 0.30.5 - resolution: "magic-string@npm:0.30.5" + version: 0.30.7 + resolution: "magic-string@npm:0.30.7" dependencies: "@jridgewell/sourcemap-codec": "npm:^1.4.15" - checksum: c8a6b25f813215ca9db526f3a407d6dc0bf35429c2b8111d6f1c2cf6cf6afd5e2d9f9cd189416a0e3959e20ecd635f73639f9825c73de1074b29331fe36ace59 + checksum: 883eaaf6792a3263e44f4bcdcd35ace272268e4b98ed5a770ad711947958d2f9fc683e474945e306e2bdc152b7e44d369ee312690d87025b9879fc63fbe1409c languageName: node linkType: hard @@ -13020,8 +13035,8 @@ __metadata: linkType: hard "npm-check-updates@npm:^16.14.12": - version: 16.14.12 - resolution: "npm-check-updates@npm:16.14.12" + version: 16.14.14 + resolution: "npm-check-updates@npm:16.14.14" dependencies: chalk: "npm:^5.3.0" cli-table3: "npm:^0.6.3" @@ -13058,7 +13073,7 @@ __metadata: bin: ncu: build/src/bin/cli.js npm-check-updates: build/src/bin/cli.js - checksum: ac2f6d8e431d256c69524bc0428c0a0e4fba4268c84721de4079d19a8aa97a85e552e7fa57775da230a2008ca25c9e8bb15933632ed5fa7a869d817481199e45 + checksum: 0addd0daf7ba003628ef56fefab5f35c7f1f020292b6667171bf4628a76aca0f0585ab8d88970b48521bab38728619794ecb6a55718473b942d9b7c33b0e5b43 languageName: node linkType: hard @@ -13236,7 +13251,7 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.13.1, object-inspect@npm:^1.9.0": +"object-inspect@npm:^1.13.1": version: 1.13.1 resolution: "object-inspect@npm:1.13.1" checksum: 92f4989ed83422d56431bc39656d4c780348eb15d397ce352ade6b7fec08f973b53744bd41b94af021901e61acaf78fcc19e65bf464ecc0df958586a672700f0 @@ -13283,14 +13298,15 @@ __metadata: linkType: hard "object.groupby@npm:^1.0.1": - version: 1.0.1 - resolution: "object.groupby@npm:1.0.1" + version: 1.0.2 + resolution: "object.groupby@npm:1.0.2" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - get-intrinsic: "npm:^1.2.1" - checksum: b7123d91403f95d63978513b23a6079c30f503311f64035fafc863c291c787f287b58df3b21ef002ce1d0b820958c9009dd5a8ab696e0eca325639d345e41524 + array.prototype.filter: "npm:^1.0.3" + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.22.3" + es-errors: "npm:^1.0.0" + checksum: 07c1bea1772c45f7967a63358a683ef7b0bd99cabe0563e6fee3e8acc061cc5984d2f01a46472ebf10b2cb439298c46776b2134550dce457fd7240baaaa4f592 languageName: node linkType: hard @@ -13849,13 +13865,13 @@ __metadata: linkType: hard "postcss@npm:^8.4.33": - version: 8.4.33 - resolution: "postcss@npm:8.4.33" + version: 8.4.34 + resolution: "postcss@npm:8.4.34" dependencies: nanoid: "npm:^3.3.7" picocolors: "npm:^1.0.0" source-map-js: "npm:^1.0.2" - checksum: e22a4594c255f26117f38419fb494d7ecab0f596cd409f7aadc8a6173abf180ed7ea970cd13fd366ab12b5840be901d2a09b25197700c2ebcb5a8077326bf519 + checksum: ff4769ff6910f688b0672e0a8f83d1d0a9fee3f61aa33b61b6ade0d5dc2ef53ce1a80d78e2eab03f2d40a15e04bc028682857a4f15d31501d63c80473dee2981 languageName: node linkType: hard @@ -13890,11 +13906,11 @@ __metadata: linkType: hard "prettier@npm:^3.2.4": - version: 3.2.4 - resolution: "prettier@npm:3.2.4" + version: 3.2.5 + resolution: "prettier@npm:3.2.5" bin: prettier: bin/prettier.cjs - checksum: e2b735d0552501b3a7ac8bd3ba3b6de2920bb35bd4cd02d08cb9057ebe3e96d83b9a7e4b903d987b7530a50223b12c74d107c154337236ae2c68156ba1e65cd2 + checksum: d509f9da0b70e8cacc561a1911c0d99ec75117faed27b95cc8534cb2349667dee6351b0ca83fa9d5703f14127faa52b798de40f5705f02d843da133fc3aa416a languageName: node linkType: hard @@ -15891,22 +15907,22 @@ __metadata: linkType: hard "rollup@npm:^4.0.2, rollup@npm:^4.9.5": - version: 4.9.5 - resolution: "rollup@npm:4.9.5" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.9.5" - "@rollup/rollup-android-arm64": "npm:4.9.5" - "@rollup/rollup-darwin-arm64": "npm:4.9.5" - "@rollup/rollup-darwin-x64": "npm:4.9.5" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.9.5" - "@rollup/rollup-linux-arm64-gnu": "npm:4.9.5" - "@rollup/rollup-linux-arm64-musl": "npm:4.9.5" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.9.5" - "@rollup/rollup-linux-x64-gnu": "npm:4.9.5" - "@rollup/rollup-linux-x64-musl": "npm:4.9.5" - "@rollup/rollup-win32-arm64-msvc": "npm:4.9.5" - "@rollup/rollup-win32-ia32-msvc": "npm:4.9.5" - "@rollup/rollup-win32-x64-msvc": "npm:4.9.5" + version: 4.9.6 + resolution: "rollup@npm:4.9.6" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.9.6" + "@rollup/rollup-android-arm64": "npm:4.9.6" + "@rollup/rollup-darwin-arm64": "npm:4.9.6" + "@rollup/rollup-darwin-x64": "npm:4.9.6" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.9.6" + "@rollup/rollup-linux-arm64-gnu": "npm:4.9.6" + "@rollup/rollup-linux-arm64-musl": "npm:4.9.6" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.9.6" + "@rollup/rollup-linux-x64-gnu": "npm:4.9.6" + "@rollup/rollup-linux-x64-musl": "npm:4.9.6" + "@rollup/rollup-win32-arm64-msvc": "npm:4.9.6" + "@rollup/rollup-win32-ia32-msvc": "npm:4.9.6" + "@rollup/rollup-win32-x64-msvc": "npm:4.9.6" "@types/estree": "npm:1.0.5" fsevents: "npm:~2.3.2" dependenciesMeta: @@ -15940,7 +15956,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 4debf528e63edea5c3f5d38e399c6dd7287e2977d90d2d3ce38d4b3412289e2081aff8f8488a11b1699c786f2e904e9e150f30d576fe9316b5b97df0e80b1bce + checksum: 7c343d9d8ece2ebfbde20b62545f7ee16cbba719da94584fef72ad2f0bdea5f2c49cc429839350e7a4181be04e01bfcd1bd45e1654b8b288a612c409eaebdae4 languageName: node linkType: hard @@ -16005,13 +16021,13 @@ __metadata: linkType: hard "safe-regex-test@npm:^1.0.0": - version: 1.0.2 - resolution: "safe-regex-test@npm:1.0.2" + version: 1.0.3 + resolution: "safe-regex-test@npm:1.0.3" dependencies: - call-bind: "npm:^1.0.5" - get-intrinsic: "npm:^1.2.2" + call-bind: "npm:^1.0.6" + es-errors: "npm:^1.3.0" is-regex: "npm:^1.1.4" - checksum: 0e6a472caa8f44a502c7842ea19749de42c2eb1b41cb00456061dc3746cf3468e907522f56e97a15f3b41d88f660bd3d4f9bdec064a39895f7babae0f7aafc6a + checksum: b04de61114b10274d92e25b6de7ccb5de07f11ea15637ff636de4b5190c0f5cd8823fe586dde718504cf78055437d70fd8804976894df502fcf5a210c970afb3 languageName: node linkType: hard @@ -16089,13 +16105,13 @@ __metadata: linkType: hard "semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4": - version: 7.5.4 - resolution: "semver@npm:7.5.4" + version: 7.6.0 + resolution: "semver@npm:7.6.0" dependencies: lru-cache: "npm:^6.0.0" bin: semver: bin/semver.js - checksum: 985dec0d372370229a262c737063860fabd4a1c730662c1ea3200a2f649117761a42184c96df62a0e885e76fbd5dace41087d6c1ac0351b13c0df5d6bcb1b5ac + checksum: 1b41018df2d8aca5a1db4729985e8e20428c650daea60fcd16e926e9383217d00f574fab92d79612771884a98d2ee2a1973f49d630829a8d54d6570defe62535 languageName: node linkType: hard @@ -16106,16 +16122,17 @@ __metadata: languageName: node linkType: hard -"set-function-length@npm:^1.1.1": - version: 1.2.0 - resolution: "set-function-length@npm:1.2.0" +"set-function-length@npm:^1.2.0": + version: 1.2.1 + resolution: "set-function-length@npm:1.2.1" dependencies: - define-data-property: "npm:^1.1.1" + define-data-property: "npm:^1.1.2" + es-errors: "npm:^1.3.0" function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.2" + get-intrinsic: "npm:^1.2.3" gopd: "npm:^1.0.1" has-property-descriptors: "npm:^1.0.1" - checksum: 6d609cd060c488d7d2178a5d4c3689f8a6afa26fa4c48ff4a0516664ff9b84c1c0898915777f5628092dab55c4fcead205525e2edd15c659423bf86f790fdcae + checksum: 9ab1d200149574ab27c1a7acae56d6235e02568fc68655fe8afe63e4e02ccad3c27665f55c32408bd1ff40705939dbb7539abfb9c3a07fda27ecad1ab9e449f5 languageName: node linkType: hard @@ -16199,13 +16216,14 @@ __metadata: linkType: hard "side-channel@npm:^1.0.4": - version: 1.0.4 - resolution: "side-channel@npm:1.0.4" + version: 1.0.5 + resolution: "side-channel@npm:1.0.5" dependencies: - call-bind: "npm:^1.0.0" - get-intrinsic: "npm:^1.0.2" - object-inspect: "npm:^1.9.0" - checksum: c4998d9fc530b0e75a7fd791ad868fdc42846f072734f9080ff55cc8dc7d3899abcda24fd896aa6648c3ab7021b4bb478073eb4f44dfd55bce9714bc1a7c5d45 + call-bind: "npm:^1.0.6" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.4" + object-inspect: "npm:^1.13.1" + checksum: 27708b70b5d81bf18dc8cc23f38f1b6c9511691a64abc4aaf17956e67d132c855cf8b46f931e2fc5a6262b29371eb60da7755c1b9f4f862eccea8562b469f8f6 languageName: node linkType: hard @@ -16460,9 +16478,9 @@ __metadata: linkType: hard "spdx-exceptions@npm:^2.1.0": - version: 2.3.0 - resolution: "spdx-exceptions@npm:2.3.0" - checksum: cb69a26fa3b46305637123cd37c85f75610e8c477b6476fa7354eb67c08128d159f1d36715f19be6f9daf4b680337deb8c65acdcae7f2608ba51931540687ac0 + version: 2.4.0 + resolution: "spdx-exceptions@npm:2.4.0" + checksum: b1b650a8d94424473bf9629cf972c86a91c03cccc260f5c901bce0e4b92d831627fec28c9e0a1e9c34c5ebad0a12cf2eab887bec088e0a862abb9d720c2fd0a1 languageName: node linkType: hard @@ -16856,6 +16874,15 @@ __metadata: languageName: node linkType: hard +"synckit@npm:^0.6.0": + version: 0.6.2 + resolution: "synckit@npm:0.6.2" + dependencies: + tslib: "npm:^2.3.1" + checksum: 9641f4a4f113b7d6a810c34870947c1f19b7a736b510211c0ea69b05aed530d9aa52cb4942f0988a72514ce9fda61011e913c52fa86c58ebf56901d54c2fe241 + languageName: node + linkType: hard + "synckit@npm:^0.8.6": version: 0.8.8 resolution: "synckit@npm:0.8.8" @@ -17105,9 +17132,9 @@ __metadata: linkType: hard "trough@npm:^2.0.0": - version: 2.1.0 - resolution: "trough@npm:2.1.0" - checksum: 6ca8a545d0080ce40c3d0e1e44cf9aa0484a272a91f3a5a02ac433bf1e3ed16983d39da0a77a96467237f7f983cfbf19abc5ab1994c27cde9417e21a2aec76cc + version: 2.2.0 + resolution: "trough@npm:2.2.0" + checksum: 999c1cb3db6ec63e1663f911146a90125065da37f66ba342b031d53edb22a62f56c1f934bbc61a55b2b29dd74207544cfd78875b414665c1ffadcd9a9a009eeb languageName: node linkType: hard @@ -17119,11 +17146,11 @@ __metadata: linkType: hard "ts-api-utils@npm:^1.0.1": - version: 1.0.3 - resolution: "ts-api-utils@npm:1.0.3" + version: 1.2.1 + resolution: "ts-api-utils@npm:1.2.1" peerDependencies: typescript: ">=4.2.0" - checksum: 1350a5110eb1e534e9a6178f4081fb8a4fcc439749e19f4ad699baec9090fcb90fe532d5e191d91a062dc6e454a14a8d7eb2ad202f57135a30c4a44a3024f039 + checksum: 6d7f60fd01e3885bb334607f22b9cb1002e72da81dad2e672fef1b0d1a2f640b0f0ff5310369401488fac90c7a7f5d39c89fd18789af59c672c9b5aef4cade3e languageName: node linkType: hard @@ -17418,20 +17445,20 @@ __metadata: linkType: hard "type-fest@npm:^4.3.3": - version: 4.9.0 - resolution: "type-fest@npm:4.9.0" - checksum: 49acfb67999566a24d5604435c8cff786dfc26ebea5a2a343e14d437d34f30a55248f8e597b8f64446c344bb68ce14af68899f562cf66ca66c1e1a856b393259 + version: 4.10.2 + resolution: "type-fest@npm:4.10.2" + checksum: 2b1ad1270d9fabeeb506ba831d513caeb05bfc852e5e012511d785ce9dc68d773fe0a42bddf857a362c7f3406244809c5b8a698b743bb7617d4a8c470672087f languageName: node linkType: hard "typed-array-buffer@npm:^1.0.0": - version: 1.0.0 - resolution: "typed-array-buffer@npm:1.0.0" + version: 1.0.1 + resolution: "typed-array-buffer@npm:1.0.1" dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.2.1" - is-typed-array: "npm:^1.1.10" - checksum: 3e0281c79b2a40cd97fe715db803884301993f4e8c18e8d79d75fd18f796e8cd203310fec8c7fdb5e6c09bedf0af4f6ab8b75eb3d3a85da69328f28a80456bd3 + call-bind: "npm:^1.0.6" + es-errors: "npm:^1.3.0" + is-typed-array: "npm:^1.1.13" + checksum: 1d65e46b2b9b7ec2a30df39b9ddf32e55ad08d6119aec33975506a3dba56057796bdc3c64dbeb7fdb61bf340a75e279dfd55b48ce8f3b874f01731e1da6833d2 languageName: node linkType: hard @@ -17571,9 +17598,9 @@ __metadata: linkType: hard "ufo@npm:^1.3.2": - version: 1.3.2 - resolution: "ufo@npm:1.3.2" - checksum: 7133290d495e2b3f9416de69982019e81cff40d28cfd3a07accff1122ee52f23d9165e495a140a1b34b183244e88fc4001cb649591385ecbad1d3d0d2264fa6e + version: 1.4.0 + resolution: "ufo@npm:1.4.0" + checksum: b7aea8503878dc5ad797d8fc6fe39fec64d9cc7e89fb147ef86ec676e37bb462d99d67c6aad20b15f7d3e6d275d66666b29214422e268f1d98f6eaf707a207a6 languageName: node linkType: hard @@ -18251,16 +18278,16 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.11, which-typed-array@npm:^1.1.13": - version: 1.1.13 - resolution: "which-typed-array@npm:1.1.13" +"which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.14": + version: 1.1.14 + resolution: "which-typed-array@npm:1.1.14" dependencies: - available-typed-arrays: "npm:^1.0.5" - call-bind: "npm:^1.0.4" + available-typed-arrays: "npm:^1.0.6" + call-bind: "npm:^1.0.5" for-each: "npm:^0.3.3" gopd: "npm:^1.0.1" - has-tostringtag: "npm:^1.0.0" - checksum: 605e3e10b7118af904a0e79d0d50b95275102f06ec902734024989cd71354929f7acee50de43529d3baf5858e2e4eb32c75e6ebd226c888ad976d8140e4a3e71 + has-tostringtag: "npm:^1.0.1" + checksum: 56253d2c9d6b41b8a4af96d8c2751bac5508906bd500cdcd0dc5301fb082de0391a4311ab21258bc8d2609ed593f422c1a66f0020fcb3a1e97f719bc928b9018 languageName: node linkType: hard @@ -18419,8 +18446,8 @@ __metadata: linkType: hard "ws@npm:^8.11.0": - version: 8.14.2 - resolution: "ws@npm:8.14.2" + version: 8.16.0 + resolution: "ws@npm:8.16.0" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -18429,7 +18456,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 815ff01d9bc20a249b2228825d9739268a03a4408c2e0b14d49b0e2ae89d7f10847e813b587ba26992bdc33e9d03bed131e4cae73ff996baf789d53e99c31186 + checksum: 7c511c59e979bd37b63c3aea4a8e4d4163204f00bd5633c053b05ed67835481995f61a523b0ad2b603566f9a89b34cb4965cb9fab9649fbfebd8f740cea57f17 languageName: node linkType: hard