{
  "version": 3,
  "sources": ["../../src/modules/node-view/ViewNode.ts"],
  "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        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}\n"],
  "mappings": "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",
  "names": ["mod", "args"]
}
