@xyo-network/sdk 7.4.2 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/neutral/api-location-diviner.mjs +1 -1
- package/dist/neutral/api-location-diviner.mjs.map +2 -2
- package/dist/neutral/archivist-abstract.mjs +30 -25
- package/dist/neutral/archivist-abstract.mjs.map +2 -2
- package/dist/neutral/archivist-generic.mjs +4 -2
- package/dist/neutral/archivist-generic.mjs.map +2 -2
- package/dist/neutral/archivist-memory.mjs +5 -4
- package/dist/neutral/archivist-memory.mjs.map +2 -2
- package/dist/neutral/archivist-model.mjs +10 -5
- package/dist/neutral/archivist-model.mjs.map +2 -2
- package/dist/neutral/archivist-view.mjs +5 -3
- package/dist/neutral/archivist-view.mjs.map +2 -2
- package/dist/neutral/boundwitness-loader.mjs +11 -6
- package/dist/neutral/boundwitness-loader.mjs.map +2 -2
- package/dist/neutral/bridge-abstract.mjs +39 -26
- package/dist/neutral/bridge-abstract.mjs.map +2 -2
- package/dist/neutral/bridge-http.mjs +19 -15
- package/dist/neutral/bridge-http.mjs.map +2 -2
- package/dist/neutral/bridge-wrapper.mjs +4 -2
- package/dist/neutral/bridge-wrapper.mjs.map +2 -2
- package/dist/neutral/diviner-abstract.mjs +2 -2
- package/dist/neutral/diviner-abstract.mjs.map +2 -2
- package/dist/neutral/diviner-boundwitness.memory.mjs +4 -5
- package/dist/neutral/diviner-boundwitness.memory.mjs.map +2 -2
- package/dist/neutral/diviner-boundwitness.mjs +4 -5
- package/dist/neutral/diviner-boundwitness.mjs.map +2 -2
- package/dist/neutral/diviner-payload-generic.mjs +13 -15
- package/dist/neutral/diviner-payload-generic.mjs.map +2 -2
- package/dist/neutral/manifest-wrapper.mjs +4 -2
- package/dist/neutral/manifest-wrapper.mjs.map +2 -2
- package/dist/neutral/module-abstract.mjs +43 -46
- package/dist/neutral/module-abstract.mjs.map +3 -3
- package/dist/neutral/module-model.mjs +18 -1
- package/dist/neutral/module-model.mjs.map +2 -2
- package/dist/neutral/module-resolver.mjs +59 -51
- package/dist/neutral/module-resolver.mjs.map +3 -3
- package/dist/neutral/module-wrapper.mjs +11 -6
- package/dist/neutral/module-wrapper.mjs.map +2 -2
- package/dist/neutral/modules/archivist-abstract/AbstractArchivist.d.ts.map +1 -1
- package/dist/neutral/modules/archivist-generic/Archivist.d.ts.map +1 -1
- package/dist/neutral/modules/archivist-memory/MemoryDriver.d.ts.map +1 -1
- package/dist/neutral/modules/archivist-model/lib/getBoundWitness.d.ts.map +1 -1
- package/dist/neutral/modules/archivist-model/lib/hydrateBoundWitness.d.ts.map +1 -1
- package/dist/neutral/modules/archivist-view/ViewArchivist.d.ts.map +1 -1
- package/dist/neutral/modules/boundwitness-loader/Loader.d.ts.map +1 -1
- package/dist/neutral/modules/bridge-abstract/AbstractBridge.d.ts.map +1 -1
- package/dist/neutral/modules/bridge-abstract/AbstractModuleProxy/AbstractModuleProxy.d.ts.map +1 -1
- package/dist/neutral/modules/bridge-http/HttpBridge.d.ts.map +1 -1
- package/dist/neutral/modules/bridge-http/ModuleProxy/ModuleProxy.d.ts.map +1 -1
- package/dist/neutral/modules/bridge-wrapper/BridgeWrapper.d.ts.map +1 -1
- package/dist/neutral/modules/diviner-boundwitness/MemoryBoundWitnessDiviner.d.ts.map +1 -1
- package/dist/neutral/modules/diviner-payload-generic/Diviner.d.ts.map +1 -1
- package/dist/neutral/modules/manifest-wrapper/Wrapper.d.ts.map +1 -1
- package/dist/neutral/modules/manifest-wrapper/WrapperEx.d.ts.map +1 -1
- package/dist/neutral/modules/module-abstract/AbstractModule.d.ts +0 -1
- package/dist/neutral/modules/module-abstract/AbstractModule.d.ts.map +1 -1
- package/dist/neutral/modules/module-abstract/AbstractModuleInstance.d.ts.map +1 -1
- package/dist/neutral/modules/module-abstract/QueryValidator/ModuleConfigQueryValidator.d.ts.map +1 -1
- package/dist/neutral/modules/module-model/QueryableModule/IsQueryableModuleFactory.d.ts.map +1 -1
- package/dist/neutral/modules/module-resolver/CompositeModuleResolver.d.ts.map +1 -1
- package/dist/neutral/modules/module-resolver/ResolveHelper/ResolveHelper.d.ts.map +1 -1
- package/dist/neutral/modules/module-resolver/ResolveHelper/resolveAll.d.ts.map +1 -1
- package/dist/neutral/modules/module-resolver/ResolveHelper/resolveLocalNameToAddress.d.ts.map +1 -1
- package/dist/neutral/modules/module-resolver/ResolveHelper/resolvePathToAddress.d.ts.map +1 -1
- package/dist/neutral/modules/module-resolver/SimpleModuleResolver.d.ts.map +1 -1
- package/dist/neutral/modules/module-wrapper/ModuleWrapper.d.ts.map +1 -1
- package/dist/neutral/modules/node-abstract/AbstractNode.d.ts.map +1 -1
- package/dist/neutral/modules/node-memory/MemoryNode.d.ts.map +1 -1
- package/dist/neutral/modules/node-memory/NodeHelper/flatAttachToExistingNode.d.ts.map +1 -1
- package/dist/neutral/modules/node-view/ViewNode.d.ts.map +1 -1
- package/dist/neutral/modules/node-wrapper/NodeWrapper.d.ts.map +1 -1
- package/dist/neutral/modules/payloadset-plugin/Resolver.d.ts.map +1 -1
- package/dist/neutral/modules/sentinel-abstract/AbstractSentinel.d.ts.map +1 -1
- package/dist/neutral/modules/sentinel-memory/MemorySentinel.d.ts.map +1 -1
- package/dist/neutral/modules/sentinel-memory/SentinelRunner.d.ts.map +1 -1
- package/dist/neutral/modules/witness-abstract/AbstractWitness.d.ts.map +1 -1
- package/dist/neutral/node-abstract.mjs +8 -4
- package/dist/neutral/node-abstract.mjs.map +2 -2
- package/dist/neutral/node-memory.mjs +6 -4
- package/dist/neutral/node-memory.mjs.map +2 -2
- package/dist/neutral/node-view.mjs +2 -1
- package/dist/neutral/node-view.mjs.map +2 -2
- package/dist/neutral/node-wrapper.mjs +16 -7
- package/dist/neutral/node-wrapper.mjs.map +2 -2
- package/dist/neutral/payloadset-plugin.mjs +11 -10
- package/dist/neutral/payloadset-plugin.mjs.map +2 -2
- package/dist/neutral/sentinel-abstract.mjs +4 -3
- package/dist/neutral/sentinel-abstract.mjs.map +2 -2
- package/dist/neutral/sentinel-memory.mjs +12 -7
- package/dist/neutral/sentinel-memory.mjs.map +2 -2
- package/dist/neutral/witness-abstract.mjs +4 -3
- package/dist/neutral/witness-abstract.mjs.map +2 -2
- package/dist/node/modules/archivist-abstract/AbstractArchivist.d.ts.map +1 -1
- package/dist/node/modules/archivist-generic/Archivist.d.ts.map +1 -1
- package/dist/node/modules/archivist-memory/MemoryDriver.d.ts.map +1 -1
- package/dist/node/modules/archivist-model/lib/getBoundWitness.d.ts.map +1 -1
- package/dist/node/modules/archivist-model/lib/hydrateBoundWitness.d.ts.map +1 -1
- package/dist/node/modules/archivist-view/ViewArchivist.d.ts.map +1 -1
- package/dist/node/modules/boundwitness-loader/Loader.d.ts.map +1 -1
- package/dist/node/modules/bridge-abstract/AbstractBridge.d.ts.map +1 -1
- package/dist/node/modules/bridge-abstract/AbstractModuleProxy/AbstractModuleProxy.d.ts.map +1 -1
- package/dist/node/modules/bridge-http/HttpBridge.d.ts.map +1 -1
- package/dist/node/modules/bridge-http/ModuleProxy/ModuleProxy.d.ts.map +1 -1
- package/dist/node/modules/bridge-wrapper/BridgeWrapper.d.ts.map +1 -1
- package/dist/node/modules/diviner-boundwitness/MemoryBoundWitnessDiviner.d.ts.map +1 -1
- package/dist/node/modules/diviner-payload-generic/Diviner.d.ts.map +1 -1
- package/dist/node/modules/manifest-wrapper/Wrapper.d.ts.map +1 -1
- package/dist/node/modules/manifest-wrapper/WrapperEx.d.ts.map +1 -1
- package/dist/node/modules/module-abstract/AbstractModule.d.ts +0 -1
- package/dist/node/modules/module-abstract/AbstractModule.d.ts.map +1 -1
- package/dist/node/modules/module-abstract/AbstractModuleInstance.d.ts.map +1 -1
- package/dist/node/modules/module-abstract/QueryValidator/ModuleConfigQueryValidator.d.ts.map +1 -1
- package/dist/node/modules/module-model/QueryableModule/IsQueryableModuleFactory.d.ts.map +1 -1
- package/dist/node/modules/module-resolver/CompositeModuleResolver.d.ts.map +1 -1
- package/dist/node/modules/module-resolver/ResolveHelper/ResolveHelper.d.ts.map +1 -1
- package/dist/node/modules/module-resolver/ResolveHelper/resolveAll.d.ts.map +1 -1
- package/dist/node/modules/module-resolver/ResolveHelper/resolveLocalNameToAddress.d.ts.map +1 -1
- package/dist/node/modules/module-resolver/ResolveHelper/resolvePathToAddress.d.ts.map +1 -1
- package/dist/node/modules/module-resolver/SimpleModuleResolver.d.ts.map +1 -1
- package/dist/node/modules/module-wrapper/ModuleWrapper.d.ts.map +1 -1
- package/dist/node/modules/node-abstract/AbstractNode.d.ts.map +1 -1
- package/dist/node/modules/node-memory/MemoryNode.d.ts.map +1 -1
- package/dist/node/modules/node-memory/NodeHelper/flatAttachToExistingNode.d.ts.map +1 -1
- package/dist/node/modules/node-view/ViewNode.d.ts.map +1 -1
- package/dist/node/modules/node-wrapper/NodeWrapper.d.ts.map +1 -1
- package/dist/node/modules/payloadset-plugin/Resolver.d.ts.map +1 -1
- package/dist/node/modules/sentinel-abstract/AbstractSentinel.d.ts.map +1 -1
- package/dist/node/modules/sentinel-memory/MemorySentinel.d.ts.map +1 -1
- package/dist/node/modules/sentinel-memory/SentinelRunner.d.ts.map +1 -1
- package/dist/node/modules/witness-abstract/AbstractWitness.d.ts.map +1 -1
- package/package.json +11 -11
|
@@ -35,7 +35,8 @@ var MemoryNode = class extends AbstractNode {
|
|
|
35
35
|
);
|
|
36
36
|
}
|
|
37
37
|
async certifyHandler(id) {
|
|
38
|
-
const
|
|
38
|
+
const publicChildren = await this.publicChildren();
|
|
39
|
+
const child = publicChildren.find((child2) => child2.modName === id || child2.address === id);
|
|
39
40
|
if (child) {
|
|
40
41
|
return {
|
|
41
42
|
address: child.address,
|
|
@@ -106,7 +107,7 @@ var MemoryNode = class extends AbstractNode {
|
|
|
106
107
|
mod.upResolver.addResolver?.(this.privateResolver);
|
|
107
108
|
mod.upResolver.addResolver?.(this.downResolver);
|
|
108
109
|
mod.upResolver.addResolver?.(this.upResolver);
|
|
109
|
-
if (external) {
|
|
110
|
+
if (external === true) {
|
|
110
111
|
this._attachedPublicModules.add(mod.address);
|
|
111
112
|
this.downResolver.addResolver(mod.downResolver);
|
|
112
113
|
} else {
|
|
@@ -116,7 +117,7 @@ var MemoryNode = class extends AbstractNode {
|
|
|
116
117
|
mod.addParent(this);
|
|
117
118
|
const args = { mod, name: mod.modName };
|
|
118
119
|
await this.emit("moduleAttached", args);
|
|
119
|
-
if (isNodeModule(mod)
|
|
120
|
+
if (external === true && isNodeModule(mod)) {
|
|
120
121
|
const attachedListener = async (args2) => await this.emit("moduleAttached", args2);
|
|
121
122
|
const detachedListener = async (args2) => await this.emit("moduleDetached", args2);
|
|
122
123
|
mod.on("moduleAttached", attachedListener);
|
|
@@ -215,7 +216,8 @@ import { asNodeInstance } from "#node-model";
|
|
|
215
216
|
import { assertEx as assertEx2, exists as exists2 } from "@ariestools/sdk";
|
|
216
217
|
import { asAttachableModuleInstance } from "#module-model";
|
|
217
218
|
var flatAttachAllToExistingNode = async (source, destination) => {
|
|
218
|
-
const
|
|
219
|
+
const publicChildren = await source.publicChildren();
|
|
220
|
+
const children = publicChildren.map((child) => asAttachableModuleInstance(child)).filter(exists2);
|
|
219
221
|
await Promise.all(
|
|
220
222
|
children.map(async (child) => {
|
|
221
223
|
await destination.register?.(child);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/modules/node-memory/MemoryNode.ts", "../../src/modules/node-memory/NodeHelper/index.ts", "../../src/modules/node-memory/NodeHelper/attachToExistingNode.ts", "../../src/modules/node-memory/NodeHelper/flatAttachToExistingNode.ts", "../../src/modules/node-memory/NodeHelper/attachToNewNode.ts", "../../src/modules/node-memory/NodeHelper/flatAttachToNewNode.ts"],
|
|
4
|
-
"sourcesContent": ["import type { EventListener, Promisable } from '@ariestools/sdk'\nimport {\n assertEx,\n exists, isAddress, isDefined,\n} from '@ariestools/sdk'\nimport type { XyoAddress, XyoQuantAddress } from '@xyo-network/sdk-protocol'\nimport { Mutex } from 'async-mutex'\n\nimport {\n type AnyConfigSchema,\n type AttachableModuleInstance,\n creatableModule,\n type ModuleIdentifier,\n type ModuleInstance,\n type QueryableModule,\n} from '#module-model'\nimport { AbstractNode } from '#node-abstract'\nimport type {\n ChildCertificationFields,\n NodeConfig, NodeInstanceParams,\n NodeModuleEventData,\n} from '#node-model'\nimport { isNodeModule } from '#node-model'\n\nexport type MemoryNodeParams = NodeInstanceParams<AnyConfigSchema<NodeConfig>>\n\n@creatableModule()\nexport class MemoryNode<TParams extends MemoryNodeParams = MemoryNodeParams, TEventData extends NodeModuleEventData = NodeModuleEventData>\n extends AbstractNode<TParams, TEventData> {\n protected registeredModuleMap: Partial<Record<XyoAddress, AttachableModuleInstance>> = {}\n\n private _attachMutex = new Mutex()\n\n private _attachedPrivateModules = new Set<XyoAddress>()\n private _attachedPublicModules = new Set<XyoAddress>()\n\n async attachHandler(id: ModuleIdentifier, external?: boolean): Promise<(Lowercase<string> & {\n readonly __hex: true\n } & {\n readonly __address: true\n }) | XyoQuantAddress> {\n await this.startedAsync('warn', true)\n return assertEx(\n isAddress(id) ? await this.attachUsingAddress(id, external) : await this.attachUsingName(id, external),\n () => `Unable to locate module [${id}]`,\n )\n }\n\n async certifyHandler(id: ModuleIdentifier): Promise<ChildCertificationFields> {\n const child = (await this.publicChildren()).find(child => child.modName === id || child.address === id)\n if (child) {\n return { address: child.address, expiration: Date.now() + 1000 * 60 * 10 /* 10 minutes */ }\n }\n throw new Error(`Unable to certify child module [${id}]`)\n }\n\n async detachHandler(id: ModuleIdentifier): Promise<(Lowercase<string> & {\n readonly __hex: true\n } & {\n readonly __address: true\n }) | XyoQuantAddress | undefined> {\n return isAddress(id) ? await this.detachUsingAddress(id) : await this.detachUsingName(id)\n }\n\n override async privateChildren(): Promise<ModuleInstance[]> {\n return [...(await this.attachedPrivateModules()), ...this.params.privateChildren ?? []]\n }\n\n override async publicChildren(): Promise<ModuleInstance[]> {\n return [...(await this.attachedPublicModules()), ...this.params.publicChildren ?? []]\n }\n\n async register(mod: AttachableModuleInstance): Promise<void> {\n this.started('warn')\n if (Object.hasOwn(this.registeredModuleMap, mod.address)) {\n if (this.registeredModuleMap[mod.address] === mod) {\n this.logger?.warn(`Module already registered at that address[${mod.address}]|${mod.id}|[${mod.config.schema}]`)\n } else {\n throw new Error(`Other module already registered at that address[${mod.address}]|${mod.id}|[${mod.config.schema}]`)\n }\n }\n this.registeredModuleMap[mod.address] = mod\n const args = { mod, name: mod.modName }\n await this.emit('moduleRegistered', args)\n }\n\n registeredHandler(): Promisable<XyoAddress[]> {\n return Promise.resolve(\n (Object.keys(this.registeredModuleMap) as XyoAddress[]).map((key) => {\n return key\n }),\n )\n }\n\n registeredModules(): AttachableModuleInstance[] {\n return Object.values(this.registeredModuleMap).map((value) => {\n return value\n }).filter(exists)\n }\n\n async unregister(mod: ModuleInstance): Promise<ModuleInstance> {\n // try to detach if it is attached\n try {\n await this.detach(mod.address)\n } catch {\n // Detach is best-effort during unregister.\n }\n delete this.registeredModuleMap[mod.address]\n const args = { mod, name: mod.modName }\n await this.emit('moduleUnregistered', args)\n return this\n }\n\n protected async attachUsingAddress(address: XyoAddress, external?: boolean): Promise<(Lowercase<string> & {\n readonly __hex: true\n } & {\n readonly __address: true\n }) | XyoQuantAddress> {\n return await this._attachMutex.runExclusive(async () => {\n const existingModule = await this.resolve(address)\n if (existingModule) {\n this.logger?.warn(`MemoryNode: Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`)\n }\n const mod = assertEx(this.registeredModuleMap[address], () => `No Module Registered at address [${address}]`)\n\n if (this._attachedPublicModules.has(mod.address)) {\n this.logger?.warn(`Module [${mod.modName}] already attached at [${address}] (public)`)\n }\n if (this._attachedPrivateModules.has(mod.address)) {\n this.logger?.warn(`Module [${mod.modName}] already attached at [${address}] (private)`)\n }\n\n const notificationList = await this.getModulesToNotifyAbout(mod)\n\n // give it private access\n mod.upResolver.addResolver?.(this.privateResolver)\n\n // give it public access\n mod.upResolver.addResolver?.(this.downResolver)\n\n // give it outside access\n mod.upResolver.addResolver?.(this.upResolver)\n\n if (external) {\n // expose it externally\n this._attachedPublicModules.add(mod.address)\n this.downResolver.addResolver(mod.downResolver)\n } else {\n this._attachedPrivateModules.add(mod.address)\n this.privateResolver.addResolver(mod.downResolver)\n }\n\n mod.addParent(this)\n\n const args = { mod, name: mod.modName }\n await this.emit('moduleAttached', args)\n\n if (isNodeModule(mod) && external) {\n const attachedListener: EventListener<TEventData['moduleAttached']> = async (args: TEventData['moduleAttached']) =>\n await this.emit('moduleAttached', args)\n\n const detachedListener: EventListener<TEventData['moduleDetached']> = async (args: TEventData['moduleDetached']) =>\n await this.emit('moduleDetached', args)\n\n mod.on('moduleAttached', attachedListener as EventListener)\n mod.on('moduleDetached', detachedListener as EventListener)\n }\n\n await this.notifyOfExistingModulesAttached(notificationList)\n\n return address\n })\n }\n\n protected async detachUsingAddress(address: XyoAddress): Promise<(Lowercase<string> & {\n readonly __hex: true\n } & {\n readonly __address: true\n }) | XyoQuantAddress> {\n const mod = assertEx(this.registeredModuleMap[address], () => `No Module Registered at address [${address}]`)\n\n const isAttachedPublic = this._attachedPublicModules.has(mod.address)\n const isAttachedPrivate = this._attachedPrivateModules.has(mod.address)\n\n assertEx(isAttachedPublic || isAttachedPrivate, () => `Module [${mod.modName}] not attached at [${address}]`)\n\n // remove inside access\n mod.upResolver?.removeResolver?.(this.privateResolver)\n\n // remove outside access\n mod.upResolver?.removeResolver?.(this.upResolver)\n\n // remove external exposure\n this.downResolver.removeResolver(mod.downResolver)\n\n mod.removeParent(this.address)\n\n if (isAttachedPublic) {\n this._attachedPublicModules.delete(mod.address)\n }\n\n if (isAttachedPrivate) {\n this._attachedPrivateModules.delete(mod.address)\n }\n\n const args = { mod, name: mod.modName }\n await this.emit('moduleDetached', args)\n\n // notify of all sub node children detach\n if (isNodeModule(mod)) {\n const notificationList = await this.getModulesToNotifyAbout(mod)\n await this.notifyOfExistingModulesDetached(notificationList)\n }\n return address\n }\n\n protected override startHandler(): Promise<void> {\n return super.startHandler()\n }\n\n private async attachUsingName(name: string, external?: boolean) {\n const address = this.registeredModuleAddressFromName(name)\n if (isDefined(address)) {\n return await this.attachUsingAddress(address, external)\n }\n }\n\n private async detachUsingName(name: string) {\n const address = this.registeredModuleAddressFromName(name)\n if (isDefined(address)) {\n return await this.detachUsingAddress(address)\n }\n }\n\n private async getModulesToNotifyAbout(node: ModuleInstance) {\n const notifiedAddresses: string[] = []\n // send attach events for all existing attached modules\n const childModules = await node.resolve('*', { direction: 'down' })\n return (\n childModules.map((child) => {\n // don't report self\n if (node.address === child.address) {\n return\n }\n\n // prevent loop\n if (notifiedAddresses.includes(child.address)) {\n return\n }\n\n notifiedAddresses.push(child.address)\n\n return child\n })\n ).filter(exists)\n }\n\n private async notifyOfExistingModulesAttached(childModules: QueryableModule[]) {\n await Promise.all(\n childModules.map(async (child) => {\n const args = { mod: child, name: child.modName }\n await this.emit('moduleAttached', args)\n }),\n )\n }\n\n private async notifyOfExistingModulesDetached(childModules: QueryableModule[]) {\n await Promise.all(\n childModules.map(async (child) => {\n const args = { mod: child, name: child.modName }\n await this.emit('moduleDetached', args)\n }),\n )\n }\n\n private registeredModuleAddressFromName(name: string) {\n return Object.values(this.registeredModuleMap).find((value) => {\n return value?.modName === name\n })?.address\n }\n}\n", "import type { ModuleIdentifier, ModuleInstance } from '#module-model'\nimport { NodeHelper } from '#node-abstract'\nimport type { NodeInstance } from '#node-model'\n\nimport type { MemoryNodeParams } from '../MemoryNode.ts'\nimport { attachToExistingNode } from './attachToExistingNode.ts'\nimport { attachToNewNode } from './attachToNewNode.ts'\nimport {\n flatAttachAllToExistingNode, flatAttachChildToExistingNode, flatAttachToExistingNode,\n} from './flatAttachToExistingNode.ts'\nimport { flatAttachToNewNode } from './flatAttachToNewNode.ts'\n\nexport const MemoryNodeHelper: {\n attachToExistingNode: (source: NodeInstance, id: ModuleIdentifier, destination: NodeInstance) => Promise<NodeInstance>\n attachToNewNode: (source: NodeInstance, id: ModuleIdentifier, destinationParams?: MemoryNodeParams) => Promise<NodeInstance>\n attachedPrivateModules: (node: NodeInstance, maxDepth?: number) => Promise<ModuleInstance[]>\n attachedPublicModules: (node: NodeInstance, maxDepth?: number) => Promise<ModuleInstance[]>\n flatAttachAllToExistingNode: (source: NodeInstance, destination: NodeInstance) => Promise<NodeInstance>\n flatAttachChildToExistingNode: (source: NodeInstance, id: ModuleIdentifier, destination: NodeInstance) => Promise<NodeInstance>\n flatAttachToExistingNode: (source: NodeInstance, id: ModuleIdentifier, destination: NodeInstance) => Promise<NodeInstance>\n flatAttachToNewNode: (source: NodeInstance, id: ModuleIdentifier, destinationParams: MemoryNodeParams) => Promise<NodeInstance>\n} = {\n ...NodeHelper,\n attachToExistingNode,\n attachToNewNode,\n flatAttachAllToExistingNode,\n flatAttachChildToExistingNode,\n flatAttachToExistingNode,\n flatAttachToNewNode,\n}\n", "import { assertEx } from '@ariestools/sdk'\n\nimport type { ModuleIdentifier } from '#module-model'\nimport type { NodeInstance } from '#node-model'\nimport { asNodeInstance } from '#node-model'\n\nimport { MemoryNode } from '../MemoryNode.ts'\nimport { flatAttachToExistingNode } from './flatAttachToExistingNode.ts'\n\nexport const attachToExistingNode = async (source: NodeInstance, id: ModuleIdentifier, destination: NodeInstance): Promise<NodeInstance> => {\n const parts = id.split(':')\n const first = assertEx(parts.shift(), () => 'missing first part')\n if (parts.length === 0) {\n // this is an immediate child/children\n return await flatAttachToExistingNode(source, first, destination)\n }\n // all parts that are not the last should be nodes, build them and nest\n const firstModule = await source.resolve(first)\n const firstNode = asNodeInstance(firstModule, () => 'first part is not a node', { required: true })\n const newNode = await MemoryNode.create({ config: firstNode.config })\n await destination.register?.(newNode)\n await destination.attach(newNode.address, true)\n await attachToExistingNode(firstNode, parts.join(':'), newNode)\n return destination\n}\n", "import { assertEx, exists } from '@ariestools/sdk'\n\nimport type { ModuleIdentifier } from '#module-model'\nimport { asAttachableModuleInstance } from '#module-model'\nimport type { NodeInstance } from '#node-model'\n\nexport const flatAttachAllToExistingNode = async (source: NodeInstance, destination: NodeInstance): Promise<NodeInstance> => {\n const children = (await source.publicChildren()).map(child => asAttachableModuleInstance(child)).filter(exists)\n await Promise.all(\n children.map(async (child) => {\n await destination.register?.(child)\n await destination.attach(child.address, true)\n }),\n )\n return destination\n}\n\nexport const flatAttachChildToExistingNode = async (source: NodeInstance, id: ModuleIdentifier, destination: NodeInstance): Promise<NodeInstance> => {\n assertEx(id !== '*', () => '* is not a single child')\n const child = assertEx(await source.resolve(id), () => `Module ${id} not found`)\n const attachableChild = asAttachableModuleInstance(child, () => `Module ${id} is not attachable`, { required: true })\n await destination.register?.(attachableChild)\n await destination.attach(child.address, true)\n return destination\n}\n\nexport const flatAttachToExistingNode = async (source: NodeInstance, id: ModuleIdentifier, destination: NodeInstance): Promise<NodeInstance> => {\n return id === '*' ? await flatAttachAllToExistingNode(source, destination) : flatAttachChildToExistingNode(source, id, destination)\n}\n", "import type { CreatableName } from '@ariestools/sdk'\n\nimport type { ModuleIdentifier } from '#module-model'\nimport type { NodeInstance } from '#node-model'\nimport { NodeConfigSchema } from '#node-model'\n\nimport type { MemoryNodeParams } from '../MemoryNode.ts'\nimport { MemoryNode } from '../MemoryNode.ts'\nimport { attachToExistingNode } from './attachToExistingNode.ts'\n\nconst DEFAULT_NODE_PARAMS = { config: { schema: NodeConfigSchema }, name: 'MemoryNode' as CreatableName }\n\nexport const attachToNewNode = async (\n source: NodeInstance,\n id: ModuleIdentifier,\n destinationParams: MemoryNodeParams = DEFAULT_NODE_PARAMS,\n): Promise<NodeInstance> => {\n const destination = await MemoryNode.create(destinationParams)\n return await attachToExistingNode(source, id, destination)\n}\n", "import type { ModuleIdentifier } from '#module-model'\nimport type { NodeInstance } from '#node-model'\n\nimport type { MemoryNodeParams } from '../MemoryNode.ts'\nimport { MemoryNode } from '../MemoryNode.ts'\nimport { flatAttachToExistingNode } from './flatAttachToExistingNode.ts'\n\nexport const flatAttachToNewNode = async (\n source: NodeInstance,\n id: ModuleIdentifier,\n destinationParams: MemoryNodeParams,\n): Promise<NodeInstance> => {\n const destination = await MemoryNode.create(destinationParams)\n return await flatAttachToExistingNode(source, id, destination)\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;AACA;AAAA,EACE;AAAA,EACA;AAAA,EAAQ;AAAA,EAAW;AAAA,OACd;AAEP,SAAS,aAAa;AAEtB;AAAA,EAGE;AAAA,OAIK;AACP,SAAS,oBAAoB;AAM7B,SAAS,oBAAoB;AAKtB,IAAM,aAAN,cACG,aAAkC;AAAA,EAChC,sBAA6E,CAAC;AAAA,EAEhF,eAAe,IAAI,MAAM;AAAA,EAEzB,0BAA0B,oBAAI,IAAgB;AAAA,EAC9C,yBAAyB,oBAAI,IAAgB;AAAA,EAErD,MAAM,cAAc,IAAsB,UAIpB;AACpB,UAAM,KAAK,aAAa,QAAQ,IAAI;AACpC,WAAO;AAAA,MACL,UAAU,EAAE,IAAI,MAAM,KAAK,mBAAmB,IAAI,QAAQ,IAAI,MAAM,KAAK,gBAAgB,IAAI,QAAQ;AAAA,MACrG,MAAM,4BAA4B,EAAE;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,IAAyD;AAC5E,UAAM,
|
|
4
|
+
"sourcesContent": ["import type { EventListener, Promisable } from '@ariestools/sdk'\nimport {\n assertEx,\n exists, isAddress, isDefined,\n} from '@ariestools/sdk'\nimport type { XyoAddress, XyoQuantAddress } from '@xyo-network/sdk-protocol'\nimport { Mutex } from 'async-mutex'\n\nimport {\n type AnyConfigSchema,\n type AttachableModuleInstance,\n creatableModule,\n type ModuleIdentifier,\n type ModuleInstance,\n type QueryableModule,\n} from '#module-model'\nimport { AbstractNode } from '#node-abstract'\nimport type {\n ChildCertificationFields,\n NodeConfig, NodeInstanceParams,\n NodeModuleEventData,\n} from '#node-model'\nimport { isNodeModule } from '#node-model'\n\nexport type MemoryNodeParams = NodeInstanceParams<AnyConfigSchema<NodeConfig>>\n\n@creatableModule()\nexport class MemoryNode<TParams extends MemoryNodeParams = MemoryNodeParams, TEventData extends NodeModuleEventData = NodeModuleEventData>\n extends AbstractNode<TParams, TEventData> {\n protected registeredModuleMap: Partial<Record<XyoAddress, AttachableModuleInstance>> = {}\n\n private _attachMutex = new Mutex()\n\n private _attachedPrivateModules = new Set<XyoAddress>()\n private _attachedPublicModules = new Set<XyoAddress>()\n\n async attachHandler(id: ModuleIdentifier, external?: boolean): Promise<(Lowercase<string> & {\n readonly __hex: true\n } & {\n readonly __address: true\n }) | XyoQuantAddress> {\n await this.startedAsync('warn', true)\n return assertEx(\n isAddress(id) ? await this.attachUsingAddress(id, external) : await this.attachUsingName(id, external),\n () => `Unable to locate module [${id}]`,\n )\n }\n\n async certifyHandler(id: ModuleIdentifier): Promise<ChildCertificationFields> {\n const publicChildren = await this.publicChildren()\n const child = publicChildren.find(child => child.modName === id || child.address === id)\n if (child) {\n return { address: child.address, expiration: Date.now() + 1000 * 60 * 10 /* 10 minutes */ }\n }\n throw new Error(`Unable to certify child module [${id}]`)\n }\n\n async detachHandler(id: ModuleIdentifier): Promise<(Lowercase<string> & {\n readonly __hex: true\n } & {\n readonly __address: true\n }) | XyoQuantAddress | undefined> {\n return isAddress(id) ? await this.detachUsingAddress(id) : await this.detachUsingName(id)\n }\n\n override async privateChildren(): Promise<ModuleInstance[]> {\n return [...(await this.attachedPrivateModules()), ...this.params.privateChildren ?? []]\n }\n\n override async publicChildren(): Promise<ModuleInstance[]> {\n return [...(await this.attachedPublicModules()), ...this.params.publicChildren ?? []]\n }\n\n async register(mod: AttachableModuleInstance): Promise<void> {\n this.started('warn')\n if (Object.hasOwn(this.registeredModuleMap, mod.address)) {\n if (this.registeredModuleMap[mod.address] === mod) {\n this.logger?.warn(`Module already registered at that address[${mod.address}]|${mod.id}|[${mod.config.schema}]`)\n } else {\n throw new Error(`Other module already registered at that address[${mod.address}]|${mod.id}|[${mod.config.schema}]`)\n }\n }\n this.registeredModuleMap[mod.address] = mod\n const args = { mod, name: mod.modName }\n await this.emit('moduleRegistered', args)\n }\n\n registeredHandler(): Promisable<XyoAddress[]> {\n return Promise.resolve(\n (Object.keys(this.registeredModuleMap) as XyoAddress[]).map((key) => {\n return key\n }),\n )\n }\n\n registeredModules(): AttachableModuleInstance[] {\n return Object.values(this.registeredModuleMap).map((value) => {\n return value\n }).filter(exists)\n }\n\n async unregister(mod: ModuleInstance): Promise<ModuleInstance> {\n // try to detach if it is attached\n try {\n await this.detach(mod.address)\n } catch {\n // Detach is best-effort during unregister.\n }\n delete this.registeredModuleMap[mod.address]\n const args = { mod, name: mod.modName }\n await this.emit('moduleUnregistered', args)\n return this\n }\n\n protected async attachUsingAddress(address: XyoAddress, external?: boolean): Promise<(Lowercase<string> & {\n readonly __hex: true\n } & {\n readonly __address: true\n }) | XyoQuantAddress> {\n return await this._attachMutex.runExclusive(async () => {\n const existingModule = await this.resolve(address)\n if (existingModule) {\n this.logger?.warn(`MemoryNode: Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`)\n }\n const mod = assertEx(this.registeredModuleMap[address], () => `No Module Registered at address [${address}]`)\n\n if (this._attachedPublicModules.has(mod.address)) {\n this.logger?.warn(`Module [${mod.modName}] already attached at [${address}] (public)`)\n }\n if (this._attachedPrivateModules.has(mod.address)) {\n this.logger?.warn(`Module [${mod.modName}] already attached at [${address}] (private)`)\n }\n\n const notificationList = await this.getModulesToNotifyAbout(mod)\n\n // give it private access\n mod.upResolver.addResolver?.(this.privateResolver)\n\n // give it public access\n mod.upResolver.addResolver?.(this.downResolver)\n\n // give it outside access\n mod.upResolver.addResolver?.(this.upResolver)\n\n if (external === true) {\n // expose it externally\n this._attachedPublicModules.add(mod.address)\n this.downResolver.addResolver(mod.downResolver)\n } else {\n this._attachedPrivateModules.add(mod.address)\n this.privateResolver.addResolver(mod.downResolver)\n }\n\n mod.addParent(this)\n\n const args = { mod, name: mod.modName }\n await this.emit('moduleAttached', args)\n\n if (external === true && isNodeModule(mod)) {\n const attachedListener: EventListener<TEventData['moduleAttached']> = async (args: TEventData['moduleAttached']) =>\n await this.emit('moduleAttached', args)\n\n const detachedListener: EventListener<TEventData['moduleDetached']> = async (args: TEventData['moduleDetached']) =>\n await this.emit('moduleDetached', args)\n\n mod.on('moduleAttached', attachedListener as EventListener)\n mod.on('moduleDetached', detachedListener as EventListener)\n }\n\n await this.notifyOfExistingModulesAttached(notificationList)\n\n return address\n })\n }\n\n protected async detachUsingAddress(address: XyoAddress): Promise<(Lowercase<string> & {\n readonly __hex: true\n } & {\n readonly __address: true\n }) | XyoQuantAddress> {\n const mod = assertEx(this.registeredModuleMap[address], () => `No Module Registered at address [${address}]`)\n\n const isAttachedPublic = this._attachedPublicModules.has(mod.address)\n const isAttachedPrivate = this._attachedPrivateModules.has(mod.address)\n\n assertEx(isAttachedPublic || isAttachedPrivate, () => `Module [${mod.modName}] not attached at [${address}]`)\n\n // remove inside access\n mod.upResolver?.removeResolver?.(this.privateResolver)\n\n // remove outside access\n mod.upResolver?.removeResolver?.(this.upResolver)\n\n // remove external exposure\n this.downResolver.removeResolver(mod.downResolver)\n\n mod.removeParent(this.address)\n\n if (isAttachedPublic) {\n this._attachedPublicModules.delete(mod.address)\n }\n\n if (isAttachedPrivate) {\n this._attachedPrivateModules.delete(mod.address)\n }\n\n const args = { mod, name: mod.modName }\n await this.emit('moduleDetached', args)\n\n // notify of all sub node children detach\n if (isNodeModule(mod)) {\n const notificationList = await this.getModulesToNotifyAbout(mod)\n await this.notifyOfExistingModulesDetached(notificationList)\n }\n return address\n }\n\n protected override startHandler(): Promise<void> {\n return super.startHandler()\n }\n\n private async attachUsingName(name: string, external?: boolean) {\n const address = this.registeredModuleAddressFromName(name)\n if (isDefined(address)) {\n return await this.attachUsingAddress(address, external)\n }\n }\n\n private async detachUsingName(name: string) {\n const address = this.registeredModuleAddressFromName(name)\n if (isDefined(address)) {\n return await this.detachUsingAddress(address)\n }\n }\n\n private async getModulesToNotifyAbout(node: ModuleInstance) {\n const notifiedAddresses: string[] = []\n // send attach events for all existing attached modules\n const childModules = await node.resolve('*', { direction: 'down' })\n return (\n childModules.map((child) => {\n // don't report self\n if (node.address === child.address) {\n return\n }\n\n // prevent loop\n if (notifiedAddresses.includes(child.address)) {\n return\n }\n\n notifiedAddresses.push(child.address)\n\n return child\n })\n ).filter(exists)\n }\n\n private async notifyOfExistingModulesAttached(childModules: QueryableModule[]) {\n await Promise.all(\n childModules.map(async (child) => {\n const args = { mod: child, name: child.modName }\n await this.emit('moduleAttached', args)\n }),\n )\n }\n\n private async notifyOfExistingModulesDetached(childModules: QueryableModule[]) {\n await Promise.all(\n childModules.map(async (child) => {\n const args = { mod: child, name: child.modName }\n await this.emit('moduleDetached', args)\n }),\n )\n }\n\n private registeredModuleAddressFromName(name: string) {\n return Object.values(this.registeredModuleMap).find((value) => {\n return value?.modName === name\n })?.address\n }\n}\n", "import type { ModuleIdentifier, ModuleInstance } from '#module-model'\nimport { NodeHelper } from '#node-abstract'\nimport type { NodeInstance } from '#node-model'\n\nimport type { MemoryNodeParams } from '../MemoryNode.ts'\nimport { attachToExistingNode } from './attachToExistingNode.ts'\nimport { attachToNewNode } from './attachToNewNode.ts'\nimport {\n flatAttachAllToExistingNode, flatAttachChildToExistingNode, flatAttachToExistingNode,\n} from './flatAttachToExistingNode.ts'\nimport { flatAttachToNewNode } from './flatAttachToNewNode.ts'\n\nexport const MemoryNodeHelper: {\n attachToExistingNode: (source: NodeInstance, id: ModuleIdentifier, destination: NodeInstance) => Promise<NodeInstance>\n attachToNewNode: (source: NodeInstance, id: ModuleIdentifier, destinationParams?: MemoryNodeParams) => Promise<NodeInstance>\n attachedPrivateModules: (node: NodeInstance, maxDepth?: number) => Promise<ModuleInstance[]>\n attachedPublicModules: (node: NodeInstance, maxDepth?: number) => Promise<ModuleInstance[]>\n flatAttachAllToExistingNode: (source: NodeInstance, destination: NodeInstance) => Promise<NodeInstance>\n flatAttachChildToExistingNode: (source: NodeInstance, id: ModuleIdentifier, destination: NodeInstance) => Promise<NodeInstance>\n flatAttachToExistingNode: (source: NodeInstance, id: ModuleIdentifier, destination: NodeInstance) => Promise<NodeInstance>\n flatAttachToNewNode: (source: NodeInstance, id: ModuleIdentifier, destinationParams: MemoryNodeParams) => Promise<NodeInstance>\n} = {\n ...NodeHelper,\n attachToExistingNode,\n attachToNewNode,\n flatAttachAllToExistingNode,\n flatAttachChildToExistingNode,\n flatAttachToExistingNode,\n flatAttachToNewNode,\n}\n", "import { assertEx } from '@ariestools/sdk'\n\nimport type { ModuleIdentifier } from '#module-model'\nimport type { NodeInstance } from '#node-model'\nimport { asNodeInstance } from '#node-model'\n\nimport { MemoryNode } from '../MemoryNode.ts'\nimport { flatAttachToExistingNode } from './flatAttachToExistingNode.ts'\n\nexport const attachToExistingNode = async (source: NodeInstance, id: ModuleIdentifier, destination: NodeInstance): Promise<NodeInstance> => {\n const parts = id.split(':')\n const first = assertEx(parts.shift(), () => 'missing first part')\n if (parts.length === 0) {\n // this is an immediate child/children\n return await flatAttachToExistingNode(source, first, destination)\n }\n // all parts that are not the last should be nodes, build them and nest\n const firstModule = await source.resolve(first)\n const firstNode = asNodeInstance(firstModule, () => 'first part is not a node', { required: true })\n const newNode = await MemoryNode.create({ config: firstNode.config })\n await destination.register?.(newNode)\n await destination.attach(newNode.address, true)\n await attachToExistingNode(firstNode, parts.join(':'), newNode)\n return destination\n}\n", "import { assertEx, exists } from '@ariestools/sdk'\n\nimport type { ModuleIdentifier } from '#module-model'\nimport { asAttachableModuleInstance } from '#module-model'\nimport type { NodeInstance } from '#node-model'\n\nexport const flatAttachAllToExistingNode = async (source: NodeInstance, destination: NodeInstance): Promise<NodeInstance> => {\n const publicChildren = await source.publicChildren()\n const children = publicChildren.map(child => asAttachableModuleInstance(child)).filter(exists)\n await Promise.all(\n children.map(async (child) => {\n await destination.register?.(child)\n await destination.attach(child.address, true)\n }),\n )\n return destination\n}\n\nexport const flatAttachChildToExistingNode = async (source: NodeInstance, id: ModuleIdentifier, destination: NodeInstance): Promise<NodeInstance> => {\n assertEx(id !== '*', () => '* is not a single child')\n const child = assertEx(await source.resolve(id), () => `Module ${id} not found`)\n const attachableChild = asAttachableModuleInstance(child, () => `Module ${id} is not attachable`, { required: true })\n await destination.register?.(attachableChild)\n await destination.attach(child.address, true)\n return destination\n}\n\nexport const flatAttachToExistingNode = async (source: NodeInstance, id: ModuleIdentifier, destination: NodeInstance): Promise<NodeInstance> => {\n return id === '*' ? await flatAttachAllToExistingNode(source, destination) : flatAttachChildToExistingNode(source, id, destination)\n}\n", "import type { CreatableName } from '@ariestools/sdk'\n\nimport type { ModuleIdentifier } from '#module-model'\nimport type { NodeInstance } from '#node-model'\nimport { NodeConfigSchema } from '#node-model'\n\nimport type { MemoryNodeParams } from '../MemoryNode.ts'\nimport { MemoryNode } from '../MemoryNode.ts'\nimport { attachToExistingNode } from './attachToExistingNode.ts'\n\nconst DEFAULT_NODE_PARAMS = { config: { schema: NodeConfigSchema }, name: 'MemoryNode' as CreatableName }\n\nexport const attachToNewNode = async (\n source: NodeInstance,\n id: ModuleIdentifier,\n destinationParams: MemoryNodeParams = DEFAULT_NODE_PARAMS,\n): Promise<NodeInstance> => {\n const destination = await MemoryNode.create(destinationParams)\n return await attachToExistingNode(source, id, destination)\n}\n", "import type { ModuleIdentifier } from '#module-model'\nimport type { NodeInstance } from '#node-model'\n\nimport type { MemoryNodeParams } from '../MemoryNode.ts'\nimport { MemoryNode } from '../MemoryNode.ts'\nimport { flatAttachToExistingNode } from './flatAttachToExistingNode.ts'\n\nexport const flatAttachToNewNode = async (\n source: NodeInstance,\n id: ModuleIdentifier,\n destinationParams: MemoryNodeParams,\n): Promise<NodeInstance> => {\n const destination = await MemoryNode.create(destinationParams)\n return await flatAttachToExistingNode(source, id, destination)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["child", "args", "assertEx", "assertEx", "exists", "assertEx"]
|
|
7
7
|
}
|
|
@@ -97,7 +97,8 @@ var ViewNode = class extends MemoryNode {
|
|
|
97
97
|
return address;
|
|
98
98
|
}
|
|
99
99
|
async attachedPublicModules() {
|
|
100
|
-
|
|
100
|
+
const mods = await this._limitedResolver.resolve("*");
|
|
101
|
+
return mods.filter((mod) => mod.address !== this.address);
|
|
101
102
|
}
|
|
102
103
|
async detachUsingAddress(address) {
|
|
103
104
|
const mod = assertEx(await this.downResolver.resolve(address), () => `Module [${address}] not found in down resolver`);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/modules/node-view/ViewNode.ts"],
|
|
4
|
-
"sourcesContent": ["import type { EventListener } from '@ariestools/sdk'\nimport {\n assertEx, zodAsFactory, zodIsFactory, zodToFactory,\n} from '@ariestools/sdk'\nimport {\n asSchema, type Schema, type XyoAddress, type XyoQuantAddress,\n} from '@xyo-network/sdk-protocol'\nimport { Mutex } from 'async-mutex'\nimport * as z from 'zod/mini'\n\nimport type {\n AnyConfigSchema,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n} from '#module-model'\nimport { creatableModule, ModuleLimitationViewLabel } from '#module-model'\nimport { SimpleModuleResolver } from '#module-resolver'\nimport { MemoryNode, MemoryNodeHelper } from '#node-memory'\nimport type {\n AttachableNodeInstance,\n NodeConfig,\n NodeModuleEventData,\n NodeParams,\n} from '#node-model'\nimport {\n asNodeInstance,\n isNodeModule,\n NodeAttachQuerySchema,\n NodeConfigZod,\n NodeDetachQuerySchema,\n NodeRegisteredQuerySchema,\n} from '#node-model'\n\nexport const ViewNodeConfigSchema: 'network.xyo.node.view.config' & {\n readonly __schema: true\n} = asSchema('network.xyo.node.view.config', true)\nexport type ViewNodeConfigSchema = typeof ViewNodeConfigSchema\n\nexport const ViewNodeConfigZod: z.ZodMiniObject<\n Omit<(typeof NodeConfigZod)['shape'], 'schema'> & {\n ids: z.ZodMiniArray<z.ZodMiniCustom<ModuleIdentifier, ModuleIdentifier>>\n schema: z.ZodMiniLiteral<ViewNodeConfigSchema>\n source: z.ZodMiniCustom<ModuleIdentifier, ModuleIdentifier>\n },\n z.core.$strip\n> = z.extend(NodeConfigZod, {\n ids: z.array(z.custom<ModuleIdentifier>()),\n schema: z.literal(ViewNodeConfigSchema),\n source: z.custom<ModuleIdentifier>(),\n})\n\nexport type ViewNodeConfigBase = z.infer<typeof ViewNodeConfigZod>\n\nexport const isViewNodeConfig: ReturnType<typeof zodIsFactory<ViewNodeConfigBase>> = zodIsFactory(ViewNodeConfigZod)\nexport const asViewNodeConfig: ReturnType<typeof zodAsFactory<ViewNodeConfigBase>> = zodAsFactory(ViewNodeConfigZod, 'asViewNodeConfig')\nexport const toViewNodeConfig: ReturnType<typeof zodToFactory<ViewNodeConfigBase>> = zodToFactory(ViewNodeConfigZod, 'toViewNodeConfig')\n\nexport type ViewNodeConfig = NodeConfig<\n {\n ids: ModuleIdentifier[]\n source: ModuleIdentifier\n },\n ViewNodeConfigSchema\n>\n\nexport type ViewNodeParams = NodeParams<AnyConfigSchema<ViewNodeConfig>>\n\n@creatableModule()\nexport class ViewNode<TParams extends ViewNodeParams = ViewNodeParams, TEventData extends NodeModuleEventData = NodeModuleEventData>\n extends MemoryNode<TParams, TEventData>\n implements AttachableNodeInstance<TParams, TEventData> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, ViewNodeConfigSchema]\n static override readonly defaultConfigSchema: Schema = ViewNodeConfigSchema\n static override readonly labels: {\n ModuleLimitationLabelName: string\n } = { ...ModuleLimitationViewLabel }\n\n private _buildMutex = new Mutex()\n private _built = false\n private _limitedResolver = new SimpleModuleResolver({ root: this })\n\n get ids(): ModuleIdentifier[] | undefined {\n return this.config.ids\n }\n\n override get queries(): Schema[] {\n const disallowedQueries = new Set<Schema>([NodeAttachQuerySchema, NodeDetachQuerySchema, NodeRegisteredQuerySchema])\n const queries: Schema[] = [...super.queries]\n return queries.filter(query => !disallowedQueries.has(query))\n }\n\n get source(): ModuleIdentifier | undefined {\n return this.config.source\n }\n\n /** @deprecated do not pass undefined. If trying to get all, pass '*' */\n override async resolve(): Promise<ModuleInstance[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleIdentifier = '*',\n _options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n if (!this._built) {\n await this.build()\n }\n const mods = await this._limitedResolver.resolve('*')\n if (idOrFilter === '*') {\n return mods as unknown as T[]\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const mod = mods.find(mod => mod.modName === idOrFilter || mod.address === idOrFilter)\n return mod as unknown as T\n }\n }\n }\n\n protected override async attachUsingAddress(address: XyoAddress): Promise<(Lowercase<string> & {\n readonly __hex: true\n } & {\n readonly __address: true\n }) | XyoQuantAddress> {\n const attached = await this.attached()\n const mods = this.registeredModules().filter(mod => attached.includes(mod.address))\n const existingModule = mods.find(mod => mod.address === address)\n if (existingModule) {\n this.logger?.warn(`ViewNode: Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`)\n }\n const mod = assertEx(this.registeredModuleMap[address], () => `Module [${address}] not found in registered mods`)\n\n mod.addParent(this)\n\n const args = { mod, name: mod.modName }\n await this.emit('moduleAttached', args)\n\n this._limitedResolver.add(mod)\n\n if (isNodeModule(mod)) {\n const attachedListener: EventListener<TEventData['moduleAttached']> = async (args: TEventData['moduleAttached']) =>\n await this.emit('moduleAttached', args)\n\n const detachedListener: EventListener<TEventData['moduleDetached']> = async (args: TEventData['moduleDetached']) =>\n await this.emit('moduleDetached', args)\n\n mod.on('moduleAttached', attachedListener)\n mod.on('moduleDetached', detachedListener)\n }\n\n return address\n }\n\n protected override async attachedPublicModules(): Promise<ModuleInstance[]> {\n
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import type { EventListener } from '@ariestools/sdk'\nimport {\n assertEx, zodAsFactory, zodIsFactory, zodToFactory,\n} from '@ariestools/sdk'\nimport {\n asSchema, type Schema, type XyoAddress, type XyoQuantAddress,\n} from '@xyo-network/sdk-protocol'\nimport { Mutex } from 'async-mutex'\nimport * as z from 'zod/mini'\n\nimport type {\n AnyConfigSchema,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n} from '#module-model'\nimport { creatableModule, ModuleLimitationViewLabel } from '#module-model'\nimport { SimpleModuleResolver } from '#module-resolver'\nimport { MemoryNode, MemoryNodeHelper } from '#node-memory'\nimport type {\n AttachableNodeInstance,\n NodeConfig,\n NodeModuleEventData,\n NodeParams,\n} from '#node-model'\nimport {\n asNodeInstance,\n isNodeModule,\n NodeAttachQuerySchema,\n NodeConfigZod,\n NodeDetachQuerySchema,\n NodeRegisteredQuerySchema,\n} from '#node-model'\n\nexport const ViewNodeConfigSchema: 'network.xyo.node.view.config' & {\n readonly __schema: true\n} = asSchema('network.xyo.node.view.config', true)\nexport type ViewNodeConfigSchema = typeof ViewNodeConfigSchema\n\nexport const ViewNodeConfigZod: z.ZodMiniObject<\n Omit<(typeof NodeConfigZod)['shape'], 'schema'> & {\n ids: z.ZodMiniArray<z.ZodMiniCustom<ModuleIdentifier, ModuleIdentifier>>\n schema: z.ZodMiniLiteral<ViewNodeConfigSchema>\n source: z.ZodMiniCustom<ModuleIdentifier, ModuleIdentifier>\n },\n z.core.$strip\n> = z.extend(NodeConfigZod, {\n ids: z.array(z.custom<ModuleIdentifier>()),\n schema: z.literal(ViewNodeConfigSchema),\n source: z.custom<ModuleIdentifier>(),\n})\n\nexport type ViewNodeConfigBase = z.infer<typeof ViewNodeConfigZod>\n\nexport const isViewNodeConfig: ReturnType<typeof zodIsFactory<ViewNodeConfigBase>> = zodIsFactory(ViewNodeConfigZod)\nexport const asViewNodeConfig: ReturnType<typeof zodAsFactory<ViewNodeConfigBase>> = zodAsFactory(ViewNodeConfigZod, 'asViewNodeConfig')\nexport const toViewNodeConfig: ReturnType<typeof zodToFactory<ViewNodeConfigBase>> = zodToFactory(ViewNodeConfigZod, 'toViewNodeConfig')\n\nexport type ViewNodeConfig = NodeConfig<\n {\n ids: ModuleIdentifier[]\n source: ModuleIdentifier\n },\n ViewNodeConfigSchema\n>\n\nexport type ViewNodeParams = NodeParams<AnyConfigSchema<ViewNodeConfig>>\n\n@creatableModule()\nexport class ViewNode<TParams extends ViewNodeParams = ViewNodeParams, TEventData extends NodeModuleEventData = NodeModuleEventData>\n extends MemoryNode<TParams, TEventData>\n implements AttachableNodeInstance<TParams, TEventData> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, ViewNodeConfigSchema]\n static override readonly defaultConfigSchema: Schema = ViewNodeConfigSchema\n static override readonly labels: {\n ModuleLimitationLabelName: string\n } = { ...ModuleLimitationViewLabel }\n\n private _buildMutex = new Mutex()\n private _built = false\n private _limitedResolver = new SimpleModuleResolver({ root: this })\n\n get ids(): ModuleIdentifier[] | undefined {\n return this.config.ids\n }\n\n override get queries(): Schema[] {\n const disallowedQueries = new Set<Schema>([NodeAttachQuerySchema, NodeDetachQuerySchema, NodeRegisteredQuerySchema])\n const queries: Schema[] = [...super.queries]\n return queries.filter(query => !disallowedQueries.has(query))\n }\n\n get source(): ModuleIdentifier | undefined {\n return this.config.source\n }\n\n /** @deprecated do not pass undefined. If trying to get all, pass '*' */\n override async resolve(): Promise<ModuleInstance[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleIdentifier = '*',\n _options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n if (!this._built) {\n await this.build()\n }\n const mods = await this._limitedResolver.resolve('*')\n if (idOrFilter === '*') {\n return mods as unknown as T[]\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const mod = mods.find(mod => mod.modName === idOrFilter || mod.address === idOrFilter)\n return mod as unknown as T\n }\n }\n }\n\n protected override async attachUsingAddress(address: XyoAddress): Promise<(Lowercase<string> & {\n readonly __hex: true\n } & {\n readonly __address: true\n }) | XyoQuantAddress> {\n const attached = await this.attached()\n const mods = this.registeredModules().filter(mod => attached.includes(mod.address))\n const existingModule = mods.find(mod => mod.address === address)\n if (existingModule) {\n this.logger?.warn(`ViewNode: Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`)\n }\n const mod = assertEx(this.registeredModuleMap[address], () => `Module [${address}] not found in registered mods`)\n\n mod.addParent(this)\n\n const args = { mod, name: mod.modName }\n await this.emit('moduleAttached', args)\n\n this._limitedResolver.add(mod)\n\n if (isNodeModule(mod)) {\n const attachedListener: EventListener<TEventData['moduleAttached']> = async (args: TEventData['moduleAttached']) =>\n await this.emit('moduleAttached', args)\n\n const detachedListener: EventListener<TEventData['moduleDetached']> = async (args: TEventData['moduleDetached']) =>\n await this.emit('moduleDetached', args)\n\n mod.on('moduleAttached', attachedListener)\n mod.on('moduleDetached', detachedListener)\n }\n\n return address\n }\n\n protected override async attachedPublicModules(): Promise<ModuleInstance[]> {\n const mods = await this._limitedResolver.resolve('*')\n return mods.filter(mod => mod.address !== this.address)\n }\n\n protected override async detachUsingAddress(address: XyoAddress): Promise<(Lowercase<string> & {\n readonly __hex: true\n } & {\n readonly __address: true\n }) | XyoQuantAddress> {\n const mod = assertEx(await this.downResolver.resolve(address), () => `Module [${address}] not found in down resolver`)\n this._limitedResolver.remove(mod.address)\n return address\n }\n\n protected override async startHandler(): Promise<void> {\n await super.startHandler()\n await this.build()\n }\n\n private async build() {\n if (this._buildMutex.isLocked()) {\n // throw new Error('ViewNode is already building, please wait for it to finish before calling build again')\n return\n }\n return await this._buildMutex.runExclusive(async () => {\n if (this._built) {\n return\n }\n\n const source = this.source === undefined ? undefined : asNodeInstance(await super.resolve(this.source))\n if (source) {\n await Promise.all(\n this.ids?.map(async (id) => {\n await MemoryNodeHelper.attachToExistingNode(source, id, this)\n }) ?? [],\n )\n this._built = true\n }\n })\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["mod", "args"]
|
|
7
7
|
}
|
|
@@ -38,7 +38,8 @@ var NodeWrapper = class extends ModuleWrapper {
|
|
|
38
38
|
id,
|
|
39
39
|
schema: NodeAttachQuerySchema
|
|
40
40
|
};
|
|
41
|
-
const
|
|
41
|
+
const results = await this.sendQuery(queryPayload);
|
|
42
|
+
const payloads = results.filter(isPayloadOfSchemaType(AddressSchema));
|
|
42
43
|
return payloads.pop()?.address;
|
|
43
44
|
}
|
|
44
45
|
async attachQuery(id, external, account) {
|
|
@@ -53,7 +54,8 @@ var NodeWrapper = class extends ModuleWrapper {
|
|
|
53
54
|
return await this._attachedMutex.runExclusive(async () => {
|
|
54
55
|
if (this._attached === void 0) {
|
|
55
56
|
const queryPayload = { schema: NodeAttachedQuerySchema };
|
|
56
|
-
const
|
|
57
|
+
const results = await this.sendQuery(queryPayload);
|
|
58
|
+
const payloads = results.filter(isPayloadOfSchemaType(AddressSchema));
|
|
57
59
|
this._attached = payloads.map((p) => p.address);
|
|
58
60
|
}
|
|
59
61
|
return this._attached;
|
|
@@ -65,7 +67,8 @@ var NodeWrapper = class extends ModuleWrapper {
|
|
|
65
67
|
}
|
|
66
68
|
async certify(id) {
|
|
67
69
|
const queryPayload = { id, schema: NodeCertifyQuerySchema };
|
|
68
|
-
const
|
|
70
|
+
const results = await this.sendQuery(queryPayload);
|
|
71
|
+
const payloads = results.filter(isPayloadOfSchemaType(ChildCertificationSchema));
|
|
69
72
|
return payloads.pop();
|
|
70
73
|
}
|
|
71
74
|
async certifyQuery(id, account) {
|
|
@@ -74,7 +77,8 @@ var NodeWrapper = class extends ModuleWrapper {
|
|
|
74
77
|
}
|
|
75
78
|
async detach(id) {
|
|
76
79
|
const queryPayload = { id, schema: NodeDetachQuerySchema };
|
|
77
|
-
const
|
|
80
|
+
const results = await this.sendQuery(queryPayload);
|
|
81
|
+
const payloads = results.filter(isPayloadOfSchemaType(AddressSchema));
|
|
78
82
|
return payloads.pop()?.address;
|
|
79
83
|
}
|
|
80
84
|
async detachQuery(id, account) {
|
|
@@ -82,13 +86,18 @@ var NodeWrapper = class extends ModuleWrapper {
|
|
|
82
86
|
return await this.sendQueryRaw(queryPayload, [], account);
|
|
83
87
|
}
|
|
84
88
|
async manifest(maxDepth) {
|
|
85
|
-
const queryPayload = { schema: ModuleManifestQuerySchema
|
|
86
|
-
|
|
89
|
+
const queryPayload = { schema: ModuleManifestQuerySchema };
|
|
90
|
+
if (maxDepth !== void 0 && maxDepth !== 0 && !Number.isNaN(maxDepth)) {
|
|
91
|
+
queryPayload.maxDepth = maxDepth;
|
|
92
|
+
}
|
|
93
|
+
const results = await this.sendQuery(queryPayload);
|
|
94
|
+
const payloads = results.filter(isPayloadOfSchemaType(NodeManifestPayloadSchema));
|
|
87
95
|
return payloads.pop();
|
|
88
96
|
}
|
|
89
97
|
async registered() {
|
|
90
98
|
const queryPayload = { schema: NodeRegisteredQuerySchema };
|
|
91
|
-
const
|
|
99
|
+
const results = await this.sendQuery(queryPayload);
|
|
100
|
+
const payloads = results.filter(isPayloadOfSchemaType(AddressSchema));
|
|
92
101
|
return payloads.map((p) => p.address);
|
|
93
102
|
}
|
|
94
103
|
async registeredQuery(account) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/modules/node-wrapper/NodeWrapper.ts"],
|
|
4
|
-
"sourcesContent": ["import type { TypeCheck } from '@ariestools/sdk'\nimport type {\n AccountInstance, NodeManifestPayload, XyoAddress,\n} from '@xyo-network/sdk-protocol'\nimport { isPayloadOfSchemaType, NodeManifestPayloadSchema } from '@xyo-network/sdk-protocol'\nimport { Mutex } from 'async-mutex'\n\nimport type {\n AddressPayload,\n AnyConfigSchema,\n InstanceTypeCheck,\n ModuleIdentifier,\n ModuleManifestQuery,\n ModuleQueryResult,\n} from '#module-model'\nimport {\n AddressSchema,\n ModuleManifestQuerySchema,\n} from '#module-model'\nimport { constructableModuleWrapper, ModuleWrapper } from '#module-wrapper'\nimport type {\n ChildCertification,\n ChildCertificationFields,\n NodeAttachedQuery,\n NodeAttachQuery,\n NodeCertifyQuery,\n NodeConfig,\n NodeDetachQuery,\n NodeInstance,\n NodeModule,\n NodeModuleEventData,\n NodeParams,\n NodeRegisteredQuery,\n} from '#node-model'\nimport {\n ChildCertificationSchema,\n isNodeInstance,\n isNodeModule,\n NodeAttachedQuerySchema,\n NodeAttachQuerySchema,\n NodeCertifyQuerySchema,\n NodeDetachQuerySchema,\n NodeRegisteredQuerySchema,\n} from '#node-model'\n\n@constructableModuleWrapper()\nexport class NodeWrapper<TWrappedModule extends NodeModule = NodeModule>\n extends ModuleWrapper<TWrappedModule>\n implements NodeInstance<TWrappedModule['params']> {\n static override readonly instanceIdentityCheck: InstanceTypeCheck<NodeInstance> = isNodeInstance\n static override readonly moduleIdentityCheck: TypeCheck<NodeModule<NodeParams<AnyConfigSchema<NodeConfig>>, NodeModuleEventData>> = isNodeModule\n static override readonly requiredQueries: string[] = [NodeAttachQuerySchema, ...ModuleWrapper.requiredQueries]\n\n protected _attached?: XyoAddress[]\n protected _attachedMutex: Mutex = new Mutex()\n\n async attach(id: ModuleIdentifier, external?: boolean): Promise<XyoAddress | undefined> {\n const queryPayload: NodeAttachQuery = {\n external, id, schema: NodeAttachQuerySchema,\n }\n const
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;AAIA,SAAS,uBAAuB,iCAAiC;AACjE,SAAS,aAAa;AAUtB;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,4BAA4B,qBAAqB;AAe1D;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGA,IAAM,cAAN,cACG,cAC0C;AAAA,EAKxC;AAAA,EACA,iBAAwB,IAAI,MAAM;AAAA,EAE5C,MAAM,OAAO,IAAsB,UAAqD;AACtF,UAAM,eAAgC;AAAA,MACpC;AAAA,MAAU;AAAA,MAAI,QAAQ;AAAA,IACxB;AACA,UAAM,
|
|
4
|
+
"sourcesContent": ["import type { TypeCheck } from '@ariestools/sdk'\nimport type {\n AccountInstance, NodeManifestPayload, XyoAddress,\n} from '@xyo-network/sdk-protocol'\nimport { isPayloadOfSchemaType, NodeManifestPayloadSchema } from '@xyo-network/sdk-protocol'\nimport { Mutex } from 'async-mutex'\n\nimport type {\n AddressPayload,\n AnyConfigSchema,\n InstanceTypeCheck,\n ModuleIdentifier,\n ModuleManifestQuery,\n ModuleQueryResult,\n} from '#module-model'\nimport {\n AddressSchema,\n ModuleManifestQuerySchema,\n} from '#module-model'\nimport { constructableModuleWrapper, ModuleWrapper } from '#module-wrapper'\nimport type {\n ChildCertification,\n ChildCertificationFields,\n NodeAttachedQuery,\n NodeAttachQuery,\n NodeCertifyQuery,\n NodeConfig,\n NodeDetachQuery,\n NodeInstance,\n NodeModule,\n NodeModuleEventData,\n NodeParams,\n NodeRegisteredQuery,\n} from '#node-model'\nimport {\n ChildCertificationSchema,\n isNodeInstance,\n isNodeModule,\n NodeAttachedQuerySchema,\n NodeAttachQuerySchema,\n NodeCertifyQuerySchema,\n NodeDetachQuerySchema,\n NodeRegisteredQuerySchema,\n} from '#node-model'\n\n@constructableModuleWrapper()\nexport class NodeWrapper<TWrappedModule extends NodeModule = NodeModule>\n extends ModuleWrapper<TWrappedModule>\n implements NodeInstance<TWrappedModule['params']> {\n static override readonly instanceIdentityCheck: InstanceTypeCheck<NodeInstance> = isNodeInstance\n static override readonly moduleIdentityCheck: TypeCheck<NodeModule<NodeParams<AnyConfigSchema<NodeConfig>>, NodeModuleEventData>> = isNodeModule\n static override readonly requiredQueries: string[] = [NodeAttachQuerySchema, ...ModuleWrapper.requiredQueries]\n\n protected _attached?: XyoAddress[]\n protected _attachedMutex: Mutex = new Mutex()\n\n async attach(id: ModuleIdentifier, external?: boolean): Promise<XyoAddress | undefined> {\n const queryPayload: NodeAttachQuery = {\n external, id, schema: NodeAttachQuerySchema,\n }\n const results = await this.sendQuery(queryPayload)\n const payloads = results.filter(isPayloadOfSchemaType<AddressPayload>(AddressSchema))\n return payloads.pop()?.address\n }\n\n async attachQuery(id: ModuleIdentifier, external?: boolean, account?: AccountInstance): Promise<ModuleQueryResult<AddressPayload>> {\n const queryPayload: NodeAttachQuery = {\n external, id, schema: NodeAttachQuerySchema,\n }\n return await this.sendQueryRaw(queryPayload, [], account)\n }\n\n async attached(): Promise<XyoAddress[]> {\n return await this._attachedMutex.runExclusive(async () => {\n if (this._attached === undefined) {\n const queryPayload: NodeAttachedQuery = { schema: NodeAttachedQuerySchema }\n const results = await this.sendQuery(queryPayload)\n const payloads = results.filter(isPayloadOfSchemaType<AddressPayload>(AddressSchema))\n this._attached = payloads.map(p => p.address)\n }\n return this._attached\n })\n }\n\n async attachedQuery(account?: AccountInstance): Promise<ModuleQueryResult<AddressPayload>> {\n const queryPayload: NodeAttachedQuery = { schema: NodeAttachedQuerySchema }\n return await this.sendQueryRaw(queryPayload, [], account)\n }\n\n async certify(id: ModuleIdentifier): Promise<ChildCertificationFields | undefined> {\n const queryPayload: NodeCertifyQuery = { id, schema: NodeCertifyQuerySchema }\n const results = await this.sendQuery(queryPayload)\n const payloads = results.filter(isPayloadOfSchemaType<ChildCertification>(ChildCertificationSchema))\n return payloads.pop()\n }\n\n async certifyQuery(id: ModuleIdentifier, account?: AccountInstance): Promise<ModuleQueryResult<ChildCertification>> {\n const queryPayload: NodeCertifyQuery = { id, schema: NodeCertifyQuerySchema }\n return await this.sendQueryRaw(queryPayload, [], account)\n }\n\n async detach(id: ModuleIdentifier): Promise<XyoAddress | undefined> {\n const queryPayload: NodeDetachQuery = { id, schema: NodeDetachQuerySchema }\n const results = await this.sendQuery(queryPayload)\n const payloads = results.filter(isPayloadOfSchemaType<AddressPayload>(AddressSchema))\n return payloads.pop()?.address\n }\n\n async detachQuery(id: ModuleIdentifier, account?: AccountInstance): Promise<ModuleQueryResult<AddressPayload>> {\n const queryPayload: NodeDetachQuery = { id, schema: NodeDetachQuerySchema }\n return await this.sendQueryRaw(queryPayload, [], account)\n }\n\n override async manifest(maxDepth?: number): Promise<NodeManifestPayload> {\n const queryPayload: ModuleManifestQuery = { schema: ModuleManifestQuerySchema }\n if (maxDepth !== undefined && maxDepth !== 0 && !Number.isNaN(maxDepth)) {\n queryPayload.maxDepth = maxDepth\n }\n const results = await this.sendQuery(queryPayload)\n const payloads = results.filter(isPayloadOfSchemaType<NodeManifestPayload>(NodeManifestPayloadSchema))\n return payloads.pop()!\n }\n\n async registered(): Promise<XyoAddress[]> {\n const queryPayload: NodeRegisteredQuery = { schema: NodeRegisteredQuerySchema }\n const results = await this.sendQuery(queryPayload)\n const payloads = results.filter(isPayloadOfSchemaType<AddressPayload>(AddressSchema))\n return payloads.map(p => p.address)\n }\n\n async registeredQuery(account?: AccountInstance): Promise<ModuleQueryResult<AddressPayload>> {\n const queryPayload: NodeRegisteredQuery = { schema: NodeRegisteredQuerySchema }\n return await this.sendQueryRaw(queryPayload, [], account)\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -39,11 +39,12 @@ var PayloadSetPluginResolver = class {
|
|
|
39
39
|
_params = {};
|
|
40
40
|
_plugins = {};
|
|
41
41
|
constructor(plugins) {
|
|
42
|
-
|
|
42
|
+
const initialPlugins = plugins ?? [];
|
|
43
|
+
for (const plugin of initialPlugins) forget(this.register(plugin));
|
|
43
44
|
}
|
|
44
45
|
async diviner(set) {
|
|
45
|
-
const
|
|
46
|
-
return await tryAsPayloadSetDivinerPlugin(this._plugins[
|
|
46
|
+
const hashSet = typeof set === "string" ? set : await PayloadBuilder.dataHash(set);
|
|
47
|
+
return await tryAsPayloadSetDivinerPlugin(this._plugins[hashSet])?.diviner?.(this._params[hashSet]);
|
|
47
48
|
}
|
|
48
49
|
diviners() {
|
|
49
50
|
return Object.values(this._plugins).filter(isPayloadSetDivinerPlugin);
|
|
@@ -55,21 +56,21 @@ var PayloadSetPluginResolver = class {
|
|
|
55
56
|
return Object.values(this._plugins);
|
|
56
57
|
}
|
|
57
58
|
async register(plugin, params) {
|
|
58
|
-
const
|
|
59
|
-
this._plugins[
|
|
60
|
-
this._params[
|
|
59
|
+
const hashSet = await PayloadBuilder.dataHash(plugin.set);
|
|
60
|
+
this._plugins[hashSet] = plugin;
|
|
61
|
+
this._params[hashSet] = params;
|
|
61
62
|
return this;
|
|
62
63
|
}
|
|
63
64
|
async resolve(set) {
|
|
64
|
-
const
|
|
65
|
-
return isString(
|
|
65
|
+
const hashSet = typeof set === "string" ? set : set ? await PayloadBuilder.dataHash(set) : void 0;
|
|
66
|
+
return isString(hashSet) ? this._plugins[hashSet] : void 0;
|
|
66
67
|
}
|
|
67
68
|
sets() {
|
|
68
69
|
return Object.values(this._plugins).map((value) => value.set);
|
|
69
70
|
}
|
|
70
71
|
async witness(set) {
|
|
71
|
-
const
|
|
72
|
-
return await tryAsPayloadSetWitnessPlugin(this._plugins[
|
|
72
|
+
const hashSet = typeof set === "string" ? set : await PayloadBuilder.dataHash(set);
|
|
73
|
+
return await tryAsPayloadSetWitnessPlugin(this._plugins[hashSet])?.witness?.(this._params[hashSet]);
|
|
73
74
|
}
|
|
74
75
|
witnesses() {
|
|
75
76
|
return Object.values(this._plugins).filter(isPayloadSetWitnessPlugin);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/modules/payloadset-plugin/createPlugin.ts", "../../src/modules/payloadset-plugin/Plugin.ts", "../../src/modules/payloadset-plugin/Resolver.ts"],
|
|
4
|
-
"sourcesContent": ["import type { PayloadSetPayload } from '@xyo-network/sdk-protocol'\n\nimport type { DivinerModule } from '#diviner-model'\nimport type { WitnessModule } from '#witness-model'\n\nimport type {\n PayloadSetDivinerPlugin, PayloadSetDualPlugin, PayloadSetWitnessPlugin,\n} from './Plugin.ts'\n\nexport const createPayloadSetDualPlugin = <TWitness extends WitnessModule = WitnessModule, TDiviner extends DivinerModule = DivinerModule>(\n set: PayloadSetPayload,\n plugin: Omit<PayloadSetDualPlugin<TWitness, TDiviner>, 'set'>,\n): PayloadSetDualPlugin<TWitness, TDiviner> => {\n return {\n ...plugin,\n set,\n }\n}\n\nexport const createPayloadSetWitnessPlugin = <TModule extends WitnessModule = WitnessModule>(\n set: PayloadSetPayload,\n plugin: Omit<PayloadSetWitnessPlugin<TModule>, 'set'>,\n): PayloadSetWitnessPlugin<TModule> => {\n return {\n ...plugin,\n set,\n }\n}\n\nexport const createPayloadSetDivinerPlugin = <TModule extends DivinerModule = DivinerModule>(\n set: PayloadSetPayload,\n plugin: Omit<PayloadSetDivinerPlugin<TModule>, 'set'>,\n): PayloadSetDivinerPlugin<TModule> => {\n return {\n ...plugin,\n set,\n }\n}\n", "import type { Promisable, Validator } from '@ariestools/sdk'\nimport type {\n PayloadSetPayload, QueryBoundWitness, QueryBoundWitnessWrapper,\n} from '@xyo-network/sdk-protocol'\n\nimport type { DivinerModule } from '#diviner-model'\nimport type { WitnessModule } from '#witness-model'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type PayloadSetPluginFunc = () => PayloadSetPlugin<any>\n\nexport interface PayloadSetDivinerField<TDiviner extends DivinerModule = DivinerModule> {\n diviner: (params: TDiviner['params']) => Promisable<TDiviner>\n params?: TDiviner['params']\n}\n\nexport interface PayloadSetWitnessField<TWitness extends WitnessModule = WitnessModule> {\n params?: TWitness['params']\n witness: (params: TWitness['params']) => Promisable<TWitness>\n}\n\nexport interface PayloadSetPluginShared {\n set: PayloadSetPayload\n validate?: (boundwitness: QueryBoundWitness) => Validator<QueryBoundWitness>\n wrap?: (boundwitness: QueryBoundWitness) => QueryBoundWitnessWrapper\n}\n\nexport type PayloadSetWitnessPlugin<TWitness extends WitnessModule = WitnessModule> = PayloadSetPluginShared & PayloadSetWitnessField<TWitness>\n\nexport type PayloadSetDivinerPlugin<TDiviner extends DivinerModule = DivinerModule> = PayloadSetPluginShared & PayloadSetDivinerField<TDiviner>\n\nexport type PayloadSetDualPlugin<\n TWitness extends WitnessModule = WitnessModule,\n TDiviner extends DivinerModule = DivinerModule,\n> = PayloadSetWitnessPlugin<TWitness> & PayloadSetDivinerPlugin<TDiviner>\n\nexport type PayloadSetPlugin<TModule extends WitnessModule | DivinerModule = WitnessModule | DivinerModule>\n = TModule extends WitnessModule ? PayloadSetWitnessPlugin<TModule>\n : TModule extends DivinerModule ? PayloadSetDivinerPlugin<TModule>\n : never\n\nexport const isPayloadSetWitnessPlugin = (plugin: PayloadSetPlugin): plugin is PayloadSetWitnessPlugin => {\n return (plugin as PayloadSetWitnessPlugin)?.witness != undefined\n}\n\nexport const tryAsPayloadSetWitnessPlugin = (payloadSetPlugin: PayloadSetPlugin): PayloadSetWitnessPlugin | undefined => {\n return isPayloadSetWitnessPlugin(payloadSetPlugin) ? payloadSetPlugin : undefined\n}\n\nexport const isPayloadSetDivinerPlugin = (plugin: PayloadSetPlugin): plugin is PayloadSetDivinerPlugin => {\n return (plugin as PayloadSetDivinerPlugin)?.diviner != undefined\n}\n\nexport const tryAsPayloadSetDivinerPlugin = (payloadSetPlugin: PayloadSetPlugin): PayloadSetDivinerPlugin | undefined => {\n return isPayloadSetDivinerPlugin(payloadSetPlugin) ? payloadSetPlugin : undefined\n}\n", "import { forget, isString } from '@ariestools/sdk'\nimport type { PayloadSetPayload } from '@xyo-network/sdk-protocol'\nimport { PayloadBuilder } from '@xyo-network/sdk-protocol'\n\nimport type { DivinerModule, DivinerParams } from '#diviner-model'\nimport type { WitnessModule, WitnessParams } from '#witness-model'\n\nimport type {\n PayloadSetDivinerPlugin,\n PayloadSetPlugin,\n PayloadSetWitnessPlugin,\n} from './Plugin.ts'\nimport {\n isPayloadSetDivinerPlugin,\n isPayloadSetWitnessPlugin,\n tryAsPayloadSetDivinerPlugin,\n tryAsPayloadSetWitnessPlugin,\n} from './Plugin.ts'\n\nexport class PayloadSetPluginResolver {\n protected _params: Record<string, PayloadSetPlugin['params'] | undefined> = {}\n protected _plugins: Record<string, PayloadSetPlugin> = {}\n\n constructor(\n /** @param plugins The initial set of plugins */\n plugins?: PayloadSetPlugin[],\n ) {\n
|
|
5
|
-
"mappings": ";AASO,IAAM,6BAA6B,CACxC,KACA,WAC6C;AAC7C,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;AAEO,IAAM,gCAAgC,CAC3C,KACA,WACqC;AACrC,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;AAEO,IAAM,gCAAgC,CAC3C,KACA,WACqC;AACrC,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;;;ACIO,IAAM,4BAA4B,CAAC,WAAgE;AACxG,SAAQ,QAAoC,WAAW;AACzD;AAEO,IAAM,+BAA+B,CAAC,qBAA4E;AACvH,SAAO,0BAA0B,gBAAgB,IAAI,mBAAmB;AAC1E;AAEO,IAAM,4BAA4B,CAAC,WAAgE;AACxG,SAAQ,QAAoC,WAAW;AACzD;AAEO,IAAM,+BAA+B,CAAC,qBAA4E;AACvH,SAAO,0BAA0B,gBAAgB,IAAI,mBAAmB;AAC1E;;;ACvDA,SAAS,QAAQ,gBAAgB;AAEjC,SAAS,sBAAsB;AAiBxB,IAAM,2BAAN,MAA+B;AAAA,EAC1B,UAAkE,CAAC;AAAA,EACnE,WAA6C,CAAC;AAAA,EAExD,YAEE,SACA;AACA,
|
|
4
|
+
"sourcesContent": ["import type { PayloadSetPayload } from '@xyo-network/sdk-protocol'\n\nimport type { DivinerModule } from '#diviner-model'\nimport type { WitnessModule } from '#witness-model'\n\nimport type {\n PayloadSetDivinerPlugin, PayloadSetDualPlugin, PayloadSetWitnessPlugin,\n} from './Plugin.ts'\n\nexport const createPayloadSetDualPlugin = <TWitness extends WitnessModule = WitnessModule, TDiviner extends DivinerModule = DivinerModule>(\n set: PayloadSetPayload,\n plugin: Omit<PayloadSetDualPlugin<TWitness, TDiviner>, 'set'>,\n): PayloadSetDualPlugin<TWitness, TDiviner> => {\n return {\n ...plugin,\n set,\n }\n}\n\nexport const createPayloadSetWitnessPlugin = <TModule extends WitnessModule = WitnessModule>(\n set: PayloadSetPayload,\n plugin: Omit<PayloadSetWitnessPlugin<TModule>, 'set'>,\n): PayloadSetWitnessPlugin<TModule> => {\n return {\n ...plugin,\n set,\n }\n}\n\nexport const createPayloadSetDivinerPlugin = <TModule extends DivinerModule = DivinerModule>(\n set: PayloadSetPayload,\n plugin: Omit<PayloadSetDivinerPlugin<TModule>, 'set'>,\n): PayloadSetDivinerPlugin<TModule> => {\n return {\n ...plugin,\n set,\n }\n}\n", "import type { Promisable, Validator } from '@ariestools/sdk'\nimport type {\n PayloadSetPayload, QueryBoundWitness, QueryBoundWitnessWrapper,\n} from '@xyo-network/sdk-protocol'\n\nimport type { DivinerModule } from '#diviner-model'\nimport type { WitnessModule } from '#witness-model'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type PayloadSetPluginFunc = () => PayloadSetPlugin<any>\n\nexport interface PayloadSetDivinerField<TDiviner extends DivinerModule = DivinerModule> {\n diviner: (params: TDiviner['params']) => Promisable<TDiviner>\n params?: TDiviner['params']\n}\n\nexport interface PayloadSetWitnessField<TWitness extends WitnessModule = WitnessModule> {\n params?: TWitness['params']\n witness: (params: TWitness['params']) => Promisable<TWitness>\n}\n\nexport interface PayloadSetPluginShared {\n set: PayloadSetPayload\n validate?: (boundwitness: QueryBoundWitness) => Validator<QueryBoundWitness>\n wrap?: (boundwitness: QueryBoundWitness) => QueryBoundWitnessWrapper\n}\n\nexport type PayloadSetWitnessPlugin<TWitness extends WitnessModule = WitnessModule> = PayloadSetPluginShared & PayloadSetWitnessField<TWitness>\n\nexport type PayloadSetDivinerPlugin<TDiviner extends DivinerModule = DivinerModule> = PayloadSetPluginShared & PayloadSetDivinerField<TDiviner>\n\nexport type PayloadSetDualPlugin<\n TWitness extends WitnessModule = WitnessModule,\n TDiviner extends DivinerModule = DivinerModule,\n> = PayloadSetWitnessPlugin<TWitness> & PayloadSetDivinerPlugin<TDiviner>\n\nexport type PayloadSetPlugin<TModule extends WitnessModule | DivinerModule = WitnessModule | DivinerModule>\n = TModule extends WitnessModule ? PayloadSetWitnessPlugin<TModule>\n : TModule extends DivinerModule ? PayloadSetDivinerPlugin<TModule>\n : never\n\nexport const isPayloadSetWitnessPlugin = (plugin: PayloadSetPlugin): plugin is PayloadSetWitnessPlugin => {\n return (plugin as PayloadSetWitnessPlugin)?.witness != undefined\n}\n\nexport const tryAsPayloadSetWitnessPlugin = (payloadSetPlugin: PayloadSetPlugin): PayloadSetWitnessPlugin | undefined => {\n return isPayloadSetWitnessPlugin(payloadSetPlugin) ? payloadSetPlugin : undefined\n}\n\nexport const isPayloadSetDivinerPlugin = (plugin: PayloadSetPlugin): plugin is PayloadSetDivinerPlugin => {\n return (plugin as PayloadSetDivinerPlugin)?.diviner != undefined\n}\n\nexport const tryAsPayloadSetDivinerPlugin = (payloadSetPlugin: PayloadSetPlugin): PayloadSetDivinerPlugin | undefined => {\n return isPayloadSetDivinerPlugin(payloadSetPlugin) ? payloadSetPlugin : undefined\n}\n", "import { forget, isString } from '@ariestools/sdk'\nimport type { PayloadSetPayload } from '@xyo-network/sdk-protocol'\nimport { PayloadBuilder } from '@xyo-network/sdk-protocol'\n\nimport type { DivinerModule, DivinerParams } from '#diviner-model'\nimport type { WitnessModule, WitnessParams } from '#witness-model'\n\nimport type {\n PayloadSetDivinerPlugin,\n PayloadSetPlugin,\n PayloadSetWitnessPlugin,\n} from './Plugin.ts'\nimport {\n isPayloadSetDivinerPlugin,\n isPayloadSetWitnessPlugin,\n tryAsPayloadSetDivinerPlugin,\n tryAsPayloadSetWitnessPlugin,\n} from './Plugin.ts'\n\nexport class PayloadSetPluginResolver {\n protected _params: Record<string, PayloadSetPlugin['params'] | undefined> = {}\n protected _plugins: Record<string, PayloadSetPlugin> = {}\n\n constructor(\n /** @param plugins The initial set of plugins */\n plugins?: PayloadSetPlugin[],\n ) {\n const initialPlugins = plugins ?? []\n for (const plugin of initialPlugins) forget(this.register(plugin))\n }\n\n async diviner(set: PayloadSetPayload): Promise<DivinerModule | undefined>\n async diviner(set: string): Promise<DivinerModule | undefined>\n async diviner(set: string | PayloadSetPayload): Promise<DivinerModule | undefined> {\n const hashSet = typeof set === 'string' ? set : await PayloadBuilder.dataHash(set)\n return await tryAsPayloadSetDivinerPlugin(this._plugins[hashSet])?.diviner?.(this._params[hashSet] as DivinerParams)\n }\n\n diviners(): PayloadSetDivinerPlugin[] {\n return Object.values(this._plugins).filter(isPayloadSetDivinerPlugin)\n }\n\n params(): (PayloadSetPlugin['params'] | undefined)[] {\n return Object.values(this._params)\n }\n\n plugins(): PayloadSetPlugin[] {\n return Object.values(this._plugins)\n }\n\n async register<TModule extends WitnessModule | DivinerModule>(plugin: PayloadSetPlugin<TModule>, params?: TModule['params']): Promise<this> {\n const hashSet = await PayloadBuilder.dataHash(plugin.set)\n this._plugins[hashSet] = plugin\n this._params[hashSet] = params\n return this\n }\n\n async resolve(set?: PayloadSetPayload): Promise<PayloadSetPlugin | undefined>\n async resolve(set?: string): Promise<PayloadSetPlugin | undefined>\n async resolve(set?: string | PayloadSetPayload): Promise<PayloadSetPlugin | undefined> {\n const hashSet\n = typeof set === 'string'\n ? set\n : set\n ? await PayloadBuilder.dataHash(set)\n : undefined\n return isString(hashSet) ? this._plugins[hashSet] : undefined\n }\n\n sets(): PayloadSetPayload[] {\n return Object.values(this._plugins).map(value => value.set)\n }\n\n async witness(set: PayloadSetPayload): Promise<WitnessModule | undefined>\n async witness(set: string): Promise<WitnessModule | undefined>\n async witness(set: string | PayloadSetPayload): Promise<WitnessModule | undefined> {\n const hashSet = typeof set === 'string' ? set : await PayloadBuilder.dataHash(set)\n return await tryAsPayloadSetWitnessPlugin(this._plugins[hashSet])?.witness?.(this._params[hashSet] as WitnessParams)\n }\n\n witnesses(): PayloadSetWitnessPlugin[] {\n return Object.values(this._plugins).filter(isPayloadSetWitnessPlugin)\n }\n}\n"],
|
|
5
|
+
"mappings": ";AASO,IAAM,6BAA6B,CACxC,KACA,WAC6C;AAC7C,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;AAEO,IAAM,gCAAgC,CAC3C,KACA,WACqC;AACrC,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;AAEO,IAAM,gCAAgC,CAC3C,KACA,WACqC;AACrC,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;;;ACIO,IAAM,4BAA4B,CAAC,WAAgE;AACxG,SAAQ,QAAoC,WAAW;AACzD;AAEO,IAAM,+BAA+B,CAAC,qBAA4E;AACvH,SAAO,0BAA0B,gBAAgB,IAAI,mBAAmB;AAC1E;AAEO,IAAM,4BAA4B,CAAC,WAAgE;AACxG,SAAQ,QAAoC,WAAW;AACzD;AAEO,IAAM,+BAA+B,CAAC,qBAA4E;AACvH,SAAO,0BAA0B,gBAAgB,IAAI,mBAAmB;AAC1E;;;ACvDA,SAAS,QAAQ,gBAAgB;AAEjC,SAAS,sBAAsB;AAiBxB,IAAM,2BAAN,MAA+B;AAAA,EAC1B,UAAkE,CAAC;AAAA,EACnE,WAA6C,CAAC;AAAA,EAExD,YAEE,SACA;AACA,UAAM,iBAAiB,WAAW,CAAC;AACnC,eAAW,UAAU,eAAgB,QAAO,KAAK,SAAS,MAAM,CAAC;AAAA,EACnE;AAAA,EAIA,MAAM,QAAQ,KAAqE;AACjF,UAAM,UAAU,OAAO,QAAQ,WAAW,MAAM,MAAM,eAAe,SAAS,GAAG;AACjF,WAAO,MAAM,6BAA6B,KAAK,SAAS,OAAO,CAAC,GAAG,UAAU,KAAK,QAAQ,OAAO,CAAkB;AAAA,EACrH;AAAA,EAEA,WAAsC;AACpC,WAAO,OAAO,OAAO,KAAK,QAAQ,EAAE,OAAO,yBAAyB;AAAA,EACtE;AAAA,EAEA,SAAqD;AACnD,WAAO,OAAO,OAAO,KAAK,OAAO;AAAA,EACnC;AAAA,EAEA,UAA8B;AAC5B,WAAO,OAAO,OAAO,KAAK,QAAQ;AAAA,EACpC;AAAA,EAEA,MAAM,SAAwD,QAAmC,QAA2C;AAC1I,UAAM,UAAU,MAAM,eAAe,SAAS,OAAO,GAAG;AACxD,SAAK,SAAS,OAAO,IAAI;AACzB,SAAK,QAAQ,OAAO,IAAI;AACxB,WAAO;AAAA,EACT;AAAA,EAIA,MAAM,QAAQ,KAAyE;AACrF,UAAM,UACF,OAAO,QAAQ,WACb,MACA,MACE,MAAM,eAAe,SAAS,GAAG,IACjC;AACR,WAAO,SAAS,OAAO,IAAI,KAAK,SAAS,OAAO,IAAI;AAAA,EACtD;AAAA,EAEA,OAA4B;AAC1B,WAAO,OAAO,OAAO,KAAK,QAAQ,EAAE,IAAI,WAAS,MAAM,GAAG;AAAA,EAC5D;AAAA,EAIA,MAAM,QAAQ,KAAqE;AACjF,UAAM,UAAU,OAAO,QAAQ,WAAW,MAAM,MAAM,eAAe,SAAS,GAAG;AACjF,WAAO,MAAM,6BAA6B,KAAK,SAAS,OAAO,CAAC,GAAG,UAAU,KAAK,QAAQ,OAAO,CAAkB;AAAA,EACrH;AAAA,EAEA,YAAuC;AACrC,WAAO,OAAO,OAAO,KAAK,QAAQ,EAAE,OAAO,yBAAyB;AAAA,EACtE;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -17,7 +17,7 @@ var AbstractSentinel = class extends AbstractModuleInstance {
|
|
|
17
17
|
history = [];
|
|
18
18
|
_jobPromise;
|
|
19
19
|
get jobPromise() {
|
|
20
|
-
this._jobPromise
|
|
20
|
+
this._jobPromise ??= this.generateJob();
|
|
21
21
|
return this._jobPromise;
|
|
22
22
|
}
|
|
23
23
|
get queries() {
|
|
@@ -34,7 +34,7 @@ var AbstractSentinel = class extends AbstractModuleInstance {
|
|
|
34
34
|
this.isSupportedQuery(SentinelReportQuerySchema, "report");
|
|
35
35
|
return await this.spanAsync("report", async () => {
|
|
36
36
|
const reportPromise = (async () => {
|
|
37
|
-
if (this.reentrancy?.scope === "global" && this.reentrancy?.action === "skip" && this.globalReentrancyMutex?.isLocked()) {
|
|
37
|
+
if (this.reentrancy?.scope === "global" && this.reentrancy?.action === "skip" && this.globalReentrancyMutex?.isLocked() === true) {
|
|
38
38
|
console.warn(`Skipping report for ${this.id} due to global reentrancy lock`);
|
|
39
39
|
return [];
|
|
40
40
|
}
|
|
@@ -43,7 +43,8 @@ var AbstractSentinel = class extends AbstractModuleInstance {
|
|
|
43
43
|
await this.emit("reportStart", { inPayloads, mod: this });
|
|
44
44
|
const payloads = await this.reportHandler(inPayloads);
|
|
45
45
|
const boundWitnessBuilder = new BoundWitnessBuilder();
|
|
46
|
-
const
|
|
46
|
+
const built = await boundWitnessBuilder.payloads(payloads).signer(this.account).build();
|
|
47
|
+
const result = built.flat();
|
|
47
48
|
if (this.config.archiving) {
|
|
48
49
|
forget(this.storeToArchivists(result), { name: `AbstractSentinel.report.storeArchivist [${this.id}]` });
|
|
49
50
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/modules/sentinel-abstract/AbstractSentinel.ts"],
|
|
4
|
-
"sourcesContent": ["import { assertEx, forget } from '@ariestools/sdk'\nimport type {\n AccountInstance, BoundWitness, Payload, QueryBoundWitness, Schema,\n} from '@xyo-network/sdk-protocol'\nimport {\n BoundWitnessBuilder, isBoundWitness, PayloadBuilder, QueryBoundWitnessWrapper,\n} from '@xyo-network/sdk-protocol'\n\nimport { AbstractModuleInstance } from '#module-abstract'\nimport type {\n ModuleConfig, ModuleQueryHandlerResult, ModuleQueryResult,\n} from '#module-model'\nimport type {\n AttachableSentinelInstance,\n CustomSentinelInstance,\n ResolvedTask,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueries,\n SentinelReportQuery,\n} from '#sentinel-model'\nimport {\n SentinelConfigSchema,\n SentinelReportQuerySchema,\n} from '#sentinel-model'\n\nexport abstract class AbstractSentinel<\n TParams extends SentinelParams = SentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n>\n extends AbstractModuleInstance<TParams, TEventData>\n implements CustomSentinelInstance<TParams, TEventData>, AttachableSentinelInstance<TParams, TEventData> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, SentinelConfigSchema]\n static override readonly defaultConfigSchema: Schema = SentinelConfigSchema\n history: BoundWitness[] = []\n private _jobPromise?: Promise<SentinelJob>\n\n get jobPromise(): Promise<SentinelJob> {\n this._jobPromise
|
|
5
|
-
"mappings": ";AAAA,SAAS,UAAU,cAAc;AAIjC;AAAA,EACE;AAAA,EAAqB;AAAA,EAAgB;AAAA,EAAgB;AAAA,OAChD;AAEP,SAAS,8BAA8B;AAevC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEA,IAAe,mBAAf,cAIG,uBACgG;AAAA,EACxG,OAAyB,gBAA0B,CAAC,GAAG,MAAM,eAAe,oBAAoB;AAAA,EAChG,OAAyB,sBAA8B;AAAA,EACvD,UAA0B,CAAC;AAAA,EACnB;AAAA,EAER,IAAI,aAAmC;AACrC,SAAK,
|
|
4
|
+
"sourcesContent": ["import { assertEx, forget } from '@ariestools/sdk'\nimport type {\n AccountInstance, BoundWitness, Payload, QueryBoundWitness, Schema,\n} from '@xyo-network/sdk-protocol'\nimport {\n BoundWitnessBuilder, isBoundWitness, PayloadBuilder, QueryBoundWitnessWrapper,\n} from '@xyo-network/sdk-protocol'\n\nimport { AbstractModuleInstance } from '#module-abstract'\nimport type {\n ModuleConfig, ModuleQueryHandlerResult, ModuleQueryResult,\n} from '#module-model'\nimport type {\n AttachableSentinelInstance,\n CustomSentinelInstance,\n ResolvedTask,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueries,\n SentinelReportQuery,\n} from '#sentinel-model'\nimport {\n SentinelConfigSchema,\n SentinelReportQuerySchema,\n} from '#sentinel-model'\n\nexport abstract class AbstractSentinel<\n TParams extends SentinelParams = SentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n>\n extends AbstractModuleInstance<TParams, TEventData>\n implements CustomSentinelInstance<TParams, TEventData>, AttachableSentinelInstance<TParams, TEventData> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, SentinelConfigSchema]\n static override readonly defaultConfigSchema: Schema = SentinelConfigSchema\n history: BoundWitness[] = []\n private _jobPromise?: Promise<SentinelJob>\n\n get jobPromise(): Promise<SentinelJob> {\n this._jobPromise ??= this.generateJob()\n return this._jobPromise\n }\n\n override get queries(): Schema[] {\n return [SentinelReportQuerySchema, ...super.queries]\n }\n\n get synchronous(): boolean {\n return this.config.synchronous ?? true\n }\n\n get throwErrors(): boolean {\n return this.config.throwErrors ?? true\n }\n\n async report(inPayloads?: Payload[]): Promise<Payload[]> {\n this._noOverride('report')\n this.isSupportedQuery(SentinelReportQuerySchema, 'report')\n return await this.spanAsync('report', async () => {\n const reportPromise = (async () => {\n if (this.reentrancy?.scope === 'global' && this.reentrancy?.action === 'skip' && this.globalReentrancyMutex?.isLocked() === true) {\n console.warn(`Skipping report for ${this.id} due to global reentrancy lock`)\n return []\n }\n try {\n await this.globalReentrancyMutex?.acquire()\n await this.emit('reportStart', { inPayloads, mod: this })\n const payloads = await this.reportHandler(inPayloads)\n\n // create boundwitness\n const boundWitnessBuilder = new BoundWitnessBuilder()\n const built = await boundWitnessBuilder.payloads(payloads).signer(this.account).build()\n const result = built.flat()\n\n if (this.config.archiving) {\n forget(this.storeToArchivists(result), { name: `AbstractSentinel.report.storeArchivist [${this.id}]` })\n }\n\n await this.emitReportEnd(inPayloads, result)\n return result\n } finally {\n this.globalReentrancyMutex?.release()\n }\n }\n )()\n if (this.synchronous) {\n return await reportPromise\n }\n forget(reportPromise, { name: `AbstractSentinel.report [${this.id}]` })\n return []\n }, { timeBudgetLimit: 200 })\n }\n\n async reportQuery(payloads?: Payload[], account?: AccountInstance): Promise<ModuleQueryResult> {\n this._noOverride('reportQuery')\n const queryPayload: SentinelReportQuery = { schema: SentinelReportQuerySchema }\n return await this.sendQueryRaw(queryPayload, payloads, account)\n }\n\n protected async emitReportEnd(inPayloads?: Payload[], payloads?: Payload[]): Promise<void> {\n const boundwitnesses = payloads?.filter(isBoundWitness) ?? []\n const outPayloads = payloads?.filter(payload => !isBoundWitness(payload)) ?? []\n const boundwitness = boundwitnesses.find(bw => bw.addresses.includes(this.address))\n await this.emit('reportEnd', {\n boundwitness, inPayloads, mod: this, outPayloads,\n })\n }\n\n protected async generateJob(): Promise<SentinelJob> {\n const job: SentinelJob = { tasks: [] }\n let tasks: ResolvedTask[] = await Promise.all(\n (this.config.tasks ?? []).map(async task => ({\n input: task.input ?? false,\n mod: assertEx(await this.resolve(task.mod), () => `Unable to resolve task module [${task.mod}]`),\n })),\n )\n while (tasks.length > 0) {\n const previousTasks = job.tasks.at(-1) ?? []\n const newListCandidates\n // add all tasks that either require no previous input or have the previous input module already added\n = tasks.filter((task) => {\n const input = task.input\n if (input === undefined) {\n return true\n }\n if (typeof input === 'boolean') {\n return true\n }\n if (typeof input === 'string') {\n return previousTasks.some(prevTask => prevTask.mod.address === input || prevTask.mod.modName === input)\n }\n if (Array.isArray(input)) {\n return previousTasks.some(\n prevTask => input.includes(prevTask.mod.address) || input.includes(prevTask.mod.modName ?? prevTask.mod.address),\n )\n }\n return false\n })\n // remove any tasks that have inputs that are in the current list or the remaining tasks\n const newList = newListCandidates.filter((taskCandidate) => {\n const input = taskCandidate.input\n return !(\n Array.isArray(input)\n && tasks.some(\n remainingTask => input.includes(remainingTask.mod.address) || input.includes(remainingTask.mod.modName ?? remainingTask.mod.address),\n )\n )\n })\n assertEx(newList.length > 0, () => `Unable to generateJob [${tasks.length}]`)\n job.tasks.push(newList)\n // remove the tasks we just added\n tasks = tasks.filter(task => !newList.includes(task))\n }\n return job\n }\n\n protected override async queryHandler<T extends QueryBoundWitness = QueryBoundWitness, TConfig extends ModuleConfig = ModuleConfig>(\n query: T,\n payloads?: Payload[],\n queryConfig?: TConfig,\n ): Promise<ModuleQueryHandlerResult> {\n const wrapper = QueryBoundWitnessWrapper.parseQuery<SentinelQueries>(query, payloads)\n const queryPayload = await wrapper.getQuery()\n assertEx(await this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n switch (queryPayload.schema) {\n case SentinelReportQuerySchema: {\n resultPayloads.push(...(await this.report(payloads)))\n break\n }\n default: {\n return super.queryHandler(query, payloads)\n }\n }\n return PayloadBuilder.omitPrivateStorageMeta(resultPayloads)\n }\n\n abstract reportHandler(payloads?: Payload[]): Promise<Payload[]>\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -106,12 +106,16 @@ var SentinelRunner = class extends Base {
|
|
|
106
106
|
return this._automations;
|
|
107
107
|
}
|
|
108
108
|
get next() {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
109
|
+
const automations = Object.values(this._automations);
|
|
110
|
+
let result;
|
|
111
|
+
for (const automation of automations) {
|
|
112
|
+
if (isSentinelIntervalAutomation(automation) && isSentinelIntervalAutomation(result)) {
|
|
113
|
+
result = (automation.start ?? Infinity) < (result?.start ?? Infinity) ? automation : result;
|
|
114
|
+
} else {
|
|
115
|
+
result = automation;
|
|
112
116
|
}
|
|
113
|
-
|
|
114
|
-
|
|
117
|
+
}
|
|
118
|
+
return result;
|
|
115
119
|
}
|
|
116
120
|
async add(automation, restart = true) {
|
|
117
121
|
const hash = await PayloadBuilder.dataHash(automation);
|
|
@@ -228,7 +232,8 @@ var MemorySentinel = class extends AbstractSentinel {
|
|
|
228
232
|
}
|
|
229
233
|
async inputAddresses(input) {
|
|
230
234
|
if (Array.isArray(input)) {
|
|
231
|
-
|
|
235
|
+
const allAddresses = await Promise.all(input.map(async (inputItem) => await this.inputAddresses(inputItem)));
|
|
236
|
+
return allAddresses.flat();
|
|
232
237
|
}
|
|
233
238
|
const resolved = await this.resolve(input);
|
|
234
239
|
return resolved ? [resolved.address] : [];
|
|
@@ -303,7 +308,7 @@ var MemorySentinel = class extends AbstractSentinel {
|
|
|
303
308
|
const fulfilledResults = results.filter(fulfilled);
|
|
304
309
|
for (const result of fulfilledResults) {
|
|
305
310
|
const [address, payloads] = result.value;
|
|
306
|
-
finalResult[address]
|
|
311
|
+
finalResult[address] ??= [];
|
|
307
312
|
finalResult[address].push(...payloads);
|
|
308
313
|
}
|
|
309
314
|
if (this.throwErrors) {
|