@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.
Files changed (131) hide show
  1. package/dist/neutral/api-location-diviner.mjs +1 -1
  2. package/dist/neutral/api-location-diviner.mjs.map +2 -2
  3. package/dist/neutral/archivist-abstract.mjs +30 -25
  4. package/dist/neutral/archivist-abstract.mjs.map +2 -2
  5. package/dist/neutral/archivist-generic.mjs +4 -2
  6. package/dist/neutral/archivist-generic.mjs.map +2 -2
  7. package/dist/neutral/archivist-memory.mjs +5 -4
  8. package/dist/neutral/archivist-memory.mjs.map +2 -2
  9. package/dist/neutral/archivist-model.mjs +10 -5
  10. package/dist/neutral/archivist-model.mjs.map +2 -2
  11. package/dist/neutral/archivist-view.mjs +5 -3
  12. package/dist/neutral/archivist-view.mjs.map +2 -2
  13. package/dist/neutral/boundwitness-loader.mjs +11 -6
  14. package/dist/neutral/boundwitness-loader.mjs.map +2 -2
  15. package/dist/neutral/bridge-abstract.mjs +39 -26
  16. package/dist/neutral/bridge-abstract.mjs.map +2 -2
  17. package/dist/neutral/bridge-http.mjs +19 -15
  18. package/dist/neutral/bridge-http.mjs.map +2 -2
  19. package/dist/neutral/bridge-wrapper.mjs +4 -2
  20. package/dist/neutral/bridge-wrapper.mjs.map +2 -2
  21. package/dist/neutral/diviner-abstract.mjs +2 -2
  22. package/dist/neutral/diviner-abstract.mjs.map +2 -2
  23. package/dist/neutral/diviner-boundwitness.memory.mjs +4 -5
  24. package/dist/neutral/diviner-boundwitness.memory.mjs.map +2 -2
  25. package/dist/neutral/diviner-boundwitness.mjs +4 -5
  26. package/dist/neutral/diviner-boundwitness.mjs.map +2 -2
  27. package/dist/neutral/diviner-payload-generic.mjs +13 -15
  28. package/dist/neutral/diviner-payload-generic.mjs.map +2 -2
  29. package/dist/neutral/manifest-wrapper.mjs +4 -2
  30. package/dist/neutral/manifest-wrapper.mjs.map +2 -2
  31. package/dist/neutral/module-abstract.mjs +43 -46
  32. package/dist/neutral/module-abstract.mjs.map +3 -3
  33. package/dist/neutral/module-model.mjs +18 -1
  34. package/dist/neutral/module-model.mjs.map +2 -2
  35. package/dist/neutral/module-resolver.mjs +59 -51
  36. package/dist/neutral/module-resolver.mjs.map +3 -3
  37. package/dist/neutral/module-wrapper.mjs +11 -6
  38. package/dist/neutral/module-wrapper.mjs.map +2 -2
  39. package/dist/neutral/modules/archivist-abstract/AbstractArchivist.d.ts.map +1 -1
  40. package/dist/neutral/modules/archivist-generic/Archivist.d.ts.map +1 -1
  41. package/dist/neutral/modules/archivist-memory/MemoryDriver.d.ts.map +1 -1
  42. package/dist/neutral/modules/archivist-model/lib/getBoundWitness.d.ts.map +1 -1
  43. package/dist/neutral/modules/archivist-model/lib/hydrateBoundWitness.d.ts.map +1 -1
  44. package/dist/neutral/modules/archivist-view/ViewArchivist.d.ts.map +1 -1
  45. package/dist/neutral/modules/boundwitness-loader/Loader.d.ts.map +1 -1
  46. package/dist/neutral/modules/bridge-abstract/AbstractBridge.d.ts.map +1 -1
  47. package/dist/neutral/modules/bridge-abstract/AbstractModuleProxy/AbstractModuleProxy.d.ts.map +1 -1
  48. package/dist/neutral/modules/bridge-http/HttpBridge.d.ts.map +1 -1
  49. package/dist/neutral/modules/bridge-http/ModuleProxy/ModuleProxy.d.ts.map +1 -1
  50. package/dist/neutral/modules/bridge-wrapper/BridgeWrapper.d.ts.map +1 -1
  51. package/dist/neutral/modules/diviner-boundwitness/MemoryBoundWitnessDiviner.d.ts.map +1 -1
  52. package/dist/neutral/modules/diviner-payload-generic/Diviner.d.ts.map +1 -1
  53. package/dist/neutral/modules/manifest-wrapper/Wrapper.d.ts.map +1 -1
  54. package/dist/neutral/modules/manifest-wrapper/WrapperEx.d.ts.map +1 -1
  55. package/dist/neutral/modules/module-abstract/AbstractModule.d.ts +0 -1
  56. package/dist/neutral/modules/module-abstract/AbstractModule.d.ts.map +1 -1
  57. package/dist/neutral/modules/module-abstract/AbstractModuleInstance.d.ts.map +1 -1
  58. package/dist/neutral/modules/module-abstract/QueryValidator/ModuleConfigQueryValidator.d.ts.map +1 -1
  59. package/dist/neutral/modules/module-model/QueryableModule/IsQueryableModuleFactory.d.ts.map +1 -1
  60. package/dist/neutral/modules/module-resolver/CompositeModuleResolver.d.ts.map +1 -1
  61. package/dist/neutral/modules/module-resolver/ResolveHelper/ResolveHelper.d.ts.map +1 -1
  62. package/dist/neutral/modules/module-resolver/ResolveHelper/resolveAll.d.ts.map +1 -1
  63. package/dist/neutral/modules/module-resolver/ResolveHelper/resolveLocalNameToAddress.d.ts.map +1 -1
  64. package/dist/neutral/modules/module-resolver/ResolveHelper/resolvePathToAddress.d.ts.map +1 -1
  65. package/dist/neutral/modules/module-resolver/SimpleModuleResolver.d.ts.map +1 -1
  66. package/dist/neutral/modules/module-wrapper/ModuleWrapper.d.ts.map +1 -1
  67. package/dist/neutral/modules/node-abstract/AbstractNode.d.ts.map +1 -1
  68. package/dist/neutral/modules/node-memory/MemoryNode.d.ts.map +1 -1
  69. package/dist/neutral/modules/node-memory/NodeHelper/flatAttachToExistingNode.d.ts.map +1 -1
  70. package/dist/neutral/modules/node-view/ViewNode.d.ts.map +1 -1
  71. package/dist/neutral/modules/node-wrapper/NodeWrapper.d.ts.map +1 -1
  72. package/dist/neutral/modules/payloadset-plugin/Resolver.d.ts.map +1 -1
  73. package/dist/neutral/modules/sentinel-abstract/AbstractSentinel.d.ts.map +1 -1
  74. package/dist/neutral/modules/sentinel-memory/MemorySentinel.d.ts.map +1 -1
  75. package/dist/neutral/modules/sentinel-memory/SentinelRunner.d.ts.map +1 -1
  76. package/dist/neutral/modules/witness-abstract/AbstractWitness.d.ts.map +1 -1
  77. package/dist/neutral/node-abstract.mjs +8 -4
  78. package/dist/neutral/node-abstract.mjs.map +2 -2
  79. package/dist/neutral/node-memory.mjs +6 -4
  80. package/dist/neutral/node-memory.mjs.map +2 -2
  81. package/dist/neutral/node-view.mjs +2 -1
  82. package/dist/neutral/node-view.mjs.map +2 -2
  83. package/dist/neutral/node-wrapper.mjs +16 -7
  84. package/dist/neutral/node-wrapper.mjs.map +2 -2
  85. package/dist/neutral/payloadset-plugin.mjs +11 -10
  86. package/dist/neutral/payloadset-plugin.mjs.map +2 -2
  87. package/dist/neutral/sentinel-abstract.mjs +4 -3
  88. package/dist/neutral/sentinel-abstract.mjs.map +2 -2
  89. package/dist/neutral/sentinel-memory.mjs +12 -7
  90. package/dist/neutral/sentinel-memory.mjs.map +2 -2
  91. package/dist/neutral/witness-abstract.mjs +4 -3
  92. package/dist/neutral/witness-abstract.mjs.map +2 -2
  93. package/dist/node/modules/archivist-abstract/AbstractArchivist.d.ts.map +1 -1
  94. package/dist/node/modules/archivist-generic/Archivist.d.ts.map +1 -1
  95. package/dist/node/modules/archivist-memory/MemoryDriver.d.ts.map +1 -1
  96. package/dist/node/modules/archivist-model/lib/getBoundWitness.d.ts.map +1 -1
  97. package/dist/node/modules/archivist-model/lib/hydrateBoundWitness.d.ts.map +1 -1
  98. package/dist/node/modules/archivist-view/ViewArchivist.d.ts.map +1 -1
  99. package/dist/node/modules/boundwitness-loader/Loader.d.ts.map +1 -1
  100. package/dist/node/modules/bridge-abstract/AbstractBridge.d.ts.map +1 -1
  101. package/dist/node/modules/bridge-abstract/AbstractModuleProxy/AbstractModuleProxy.d.ts.map +1 -1
  102. package/dist/node/modules/bridge-http/HttpBridge.d.ts.map +1 -1
  103. package/dist/node/modules/bridge-http/ModuleProxy/ModuleProxy.d.ts.map +1 -1
  104. package/dist/node/modules/bridge-wrapper/BridgeWrapper.d.ts.map +1 -1
  105. package/dist/node/modules/diviner-boundwitness/MemoryBoundWitnessDiviner.d.ts.map +1 -1
  106. package/dist/node/modules/diviner-payload-generic/Diviner.d.ts.map +1 -1
  107. package/dist/node/modules/manifest-wrapper/Wrapper.d.ts.map +1 -1
  108. package/dist/node/modules/manifest-wrapper/WrapperEx.d.ts.map +1 -1
  109. package/dist/node/modules/module-abstract/AbstractModule.d.ts +0 -1
  110. package/dist/node/modules/module-abstract/AbstractModule.d.ts.map +1 -1
  111. package/dist/node/modules/module-abstract/AbstractModuleInstance.d.ts.map +1 -1
  112. package/dist/node/modules/module-abstract/QueryValidator/ModuleConfigQueryValidator.d.ts.map +1 -1
  113. package/dist/node/modules/module-model/QueryableModule/IsQueryableModuleFactory.d.ts.map +1 -1
  114. package/dist/node/modules/module-resolver/CompositeModuleResolver.d.ts.map +1 -1
  115. package/dist/node/modules/module-resolver/ResolveHelper/ResolveHelper.d.ts.map +1 -1
  116. package/dist/node/modules/module-resolver/ResolveHelper/resolveAll.d.ts.map +1 -1
  117. package/dist/node/modules/module-resolver/ResolveHelper/resolveLocalNameToAddress.d.ts.map +1 -1
  118. package/dist/node/modules/module-resolver/ResolveHelper/resolvePathToAddress.d.ts.map +1 -1
  119. package/dist/node/modules/module-resolver/SimpleModuleResolver.d.ts.map +1 -1
  120. package/dist/node/modules/module-wrapper/ModuleWrapper.d.ts.map +1 -1
  121. package/dist/node/modules/node-abstract/AbstractNode.d.ts.map +1 -1
  122. package/dist/node/modules/node-memory/MemoryNode.d.ts.map +1 -1
  123. package/dist/node/modules/node-memory/NodeHelper/flatAttachToExistingNode.d.ts.map +1 -1
  124. package/dist/node/modules/node-view/ViewNode.d.ts.map +1 -1
  125. package/dist/node/modules/node-wrapper/NodeWrapper.d.ts.map +1 -1
  126. package/dist/node/modules/payloadset-plugin/Resolver.d.ts.map +1 -1
  127. package/dist/node/modules/sentinel-abstract/AbstractSentinel.d.ts.map +1 -1
  128. package/dist/node/modules/sentinel-memory/MemorySentinel.d.ts.map +1 -1
  129. package/dist/node/modules/sentinel-memory/SentinelRunner.d.ts.map +1 -1
  130. package/dist/node/modules/witness-abstract/AbstractWitness.d.ts.map +1 -1
  131. 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 child = (await this.publicChildren()).find((child2) => child2.modName === id || child2.address === id);
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) && external) {
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 children = (await source.publicChildren()).map((child) => asAttachableModuleInstance(child)).filter(exists2);
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": "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",
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
- return (await this._limitedResolver.resolve("*")).filter((mod) => mod.address !== this.address);
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 return (await this._limitedResolver.resolve('*')).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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",
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 payloads = (await this.sendQuery(queryPayload)).filter(isPayloadOfSchemaType(AddressSchema));
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 payloads = (await this.sendQuery(queryPayload)).filter(isPayloadOfSchemaType(AddressSchema));
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 payloads = (await this.sendQuery(queryPayload)).filter(isPayloadOfSchemaType(ChildCertificationSchema));
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 payloads = (await this.sendQuery(queryPayload)).filter(isPayloadOfSchemaType(AddressSchema));
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, ...maxDepth ? { maxDepth } : {} };
86
- const payloads = (await this.sendQuery(queryPayload)).filter(isPayloadOfSchemaType(NodeManifestPayloadSchema));
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 payloads = (await this.sendQuery(queryPayload)).filter(isPayloadOfSchemaType(AddressSchema));
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 payloads = (await this.sendQuery(queryPayload)).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 payloads = (await this.sendQuery(queryPayload)).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 payloads = (await this.sendQuery(queryPayload)).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 payloads = (await this.sendQuery(queryPayload)).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, ...(maxDepth ? { maxDepth } : {}) }\n const payloads = (await this.sendQuery(queryPayload)).filter(isPayloadOfSchemaType<NodeManifestPayload>(NodeManifestPayloadSchema))\n return payloads.pop()!\n }\n\n async registered(): Promise<XyoAddress[]> {\n const queryPayload: NodeRegisteredQuery = { schema: NodeRegisteredQuerySchema }\n const payloads = (await this.sendQuery(queryPayload)).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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",
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
- for (const plugin of plugins ?? []) forget(this.register(plugin));
42
+ const initialPlugins = plugins ?? [];
43
+ for (const plugin of initialPlugins) forget(this.register(plugin));
43
44
  }
44
45
  async diviner(set) {
45
- const setHash = typeof set === "string" ? set : await PayloadBuilder.dataHash(set);
46
- return await tryAsPayloadSetDivinerPlugin(this._plugins[setHash])?.diviner?.(this._params[setHash]);
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 setHash = await PayloadBuilder.dataHash(plugin.set);
59
- this._plugins[setHash] = plugin;
60
- this._params[setHash] = 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 setHash = typeof set === "string" ? set : set ? await PayloadBuilder.dataHash(set) : void 0;
65
- return isString(setHash) ? this._plugins[setHash] : void 0;
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 setHash = typeof set === "string" ? set : await PayloadBuilder.dataHash(set);
72
- return await tryAsPayloadSetWitnessPlugin(this._plugins[setHash])?.witness?.(this._params[setHash]);
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 for (const plugin of plugins ?? []) 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 setHash = typeof set === 'string' ? set : await PayloadBuilder.dataHash(set)\n return await tryAsPayloadSetDivinerPlugin(this._plugins[setHash])?.diviner?.(this._params[setHash] 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 setHash = await PayloadBuilder.dataHash(plugin.set)\n this._plugins[setHash] = plugin\n this._params[setHash] = 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 setHash\n = typeof set === 'string'\n ? set\n : set\n ? await PayloadBuilder.dataHash(set)\n : undefined\n return isString(setHash) ? this._plugins[setHash] : 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 setHash = typeof set === 'string' ? set : await PayloadBuilder.dataHash(set)\n return await tryAsPayloadSetWitnessPlugin(this._plugins[setHash])?.witness?.(this._params[setHash] 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,eAAW,UAAU,WAAW,CAAC,EAAG,QAAO,KAAK,SAAS,MAAM,CAAC;AAAA,EAClE;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;",
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 = this._jobPromise ?? this.generateJob();
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 result = (await boundWitnessBuilder.payloads(payloads).signer(this.account).build()).flat();
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 = 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()) {\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 result = (await boundWitnessBuilder.payloads(payloads).signer(this.account).build()).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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",
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
- return Object.values(this._automations).reduce((previous, current) => {
110
- if (isSentinelIntervalAutomation(current) && isSentinelIntervalAutomation(previous)) {
111
- return (current.start ?? Infinity) < (previous?.start ?? Infinity) ? current : previous;
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
- return current;
114
- }, void 0);
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
- return (await Promise.all(input.map(async (inputItem) => await this.inputAddresses(inputItem)))).flat();
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] = finalResult[address] ?? [];
311
+ finalResult[address] ??= [];
307
312
  finalResult[address].push(...payloads);
308
313
  }
309
314
  if (this.throwErrors) {