{
  "version": 3,
  "sources": ["../../src/modules/module-wrapper/ModuleWrapper.ts"],
  "sourcesContent": ["import type {\n  CreatableName, EventAnyListener, EventEmitter, EventListener, EventUnsubscribeFunction, Logger,\n  Promisable,\n} from '@ariestools/sdk'\nimport {\n  assertEx,\n  Base,\n  exists,\n  isDefined, PromiseEx,\n} from '@ariestools/sdk'\nimport type {\n  AccountInstance, ModuleError, ModuleManifestPayload,\n  Payload, Query, QueryBoundWitness, XyoAddress,\n  XyoQuantAddress,\n} from '@xyo-network/sdk-protocol'\nimport {\n  BoundWitnessWrapper, ModuleErrorSchema, QueryBoundWitnessBuilder,\n} from '@xyo-network/sdk-protocol'\nimport { LRUCache } from 'lru-cache'\n\nimport type {\n  AddressPreviousHashPayload,\n  AnyConfigSchema,\n  AttachableModuleInstance,\n  InstanceTypeCheck,\n  ModuleAddressQuery,\n  ModuleConfig,\n  ModuleEventData,\n  ModuleFilterOptions,\n  ModuleIdentifier,\n  ModuleInstance,\n  ModuleManifestQuery,\n  ModuleQueryResult,\n  ModuleResolverInstance,\n  ModuleStateQuery,\n  ModuleStatus,\n  QueryableModule,\n  QueryableModuleParams,\n  QueryableModuleTypeCheck,\n} from '#module-model'\nimport {\n  AddressPreviousHashSchema,\n  asAttachableModuleInstance,\n  asModuleInstance,\n  duplicateModules,\n  isModuleInstance,\n  isQueryableModule,\n  ModuleAddressQuerySchema,\n  ModuleManifestQuerySchema,\n  ModuleStateQuerySchema,\n  ObjectResolverPriority,\n} from '#module-model'\n\nimport type { ModuleWrapperParams } from './models.ts'\n\nexport interface ConstructableModuleWrapper<TWrapper extends ModuleWrapper> {\n  defaultLogger?: Logger\n  instanceIdentityCheck: InstanceTypeCheck\n  moduleIdentityCheck: QueryableModuleTypeCheck\n  requiredQueries: string[]\n  new (params: ModuleWrapperParams<TWrapper['mod']>): TWrapper\n\n  canWrap(mod: QueryableModule | undefined): boolean\n\n  is<TModuleWrapper extends ModuleWrapper>(\n    this: ConstructableModuleWrapper<TModuleWrapper>,\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    wrapper?: any,\n  ): wrapper is TModuleWrapper\n\n  tryWrap<TModuleWrapper extends ModuleWrapper>(\n    this: ConstructableModuleWrapper<TModuleWrapper>,\n    mod: QueryableModule | undefined,\n    account: AccountInstance,\n    checkIdentity?: boolean,\n  ): TModuleWrapper | undefined\n\n  wrap<TModuleWrapper extends ModuleWrapper>(\n    this: ConstructableModuleWrapper<TModuleWrapper>,\n    mod: QueryableModule | undefined,\n    account: AccountInstance,\n    checkIdentity?: boolean,\n  ): TModuleWrapper\n}\n\nexport function constructableModuleWrapper<TWrapper extends ModuleWrapper>() {\n  return <U extends ConstructableModuleWrapper<TWrapper>>(constructor: U): void => {\n    // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n    constructor\n  }\n}\n\n@constructableModuleWrapper()\nexport class ModuleWrapper<TWrappedModule extends QueryableModule = QueryableModule>\n  extends Base<Exclude<Omit<TWrappedModule['params'], 'config'> & { config: Exclude<TWrappedModule['params']['config'], undefined> }, undefined>>\n  implements AttachableModuleInstance<TWrappedModule['params'], TWrappedModule['eventData']> {\n  static readonly instanceIdentityCheck: InstanceTypeCheck = isModuleInstance\n  static readonly moduleIdentityCheck: QueryableModuleTypeCheck = isQueryableModule\n  static readonly requiredQueries: string[] = [ModuleStateQuerySchema]\n\n  eventData = {} as TWrappedModule['eventData']\n\n  protected readonly cachedCalls: LRUCache<string, Payload[], unknown> = new LRUCache<string, Payload[]>({\n    max: 1000, ttl: 1000 * 60, ttlAutopurge: true,\n  })\n\n  protected readonly wrapperParams: ModuleWrapperParams<TWrappedModule>\n\n  private _parents: ModuleInstance[] = []\n  private _status: ModuleStatus = 'wrapped'\n\n  constructor(params: ModuleWrapperParams<TWrappedModule>) {\n    const mutatedWrapperParams = { ...params } as ModuleWrapperParams<TWrappedModule>\n    const mutatedParams = { ...params.mod.params, config: { ...params.mod.params.config } } as Exclude<\n      Omit<TWrappedModule['params'], 'config'> & { config: Exclude<TWrappedModule['params']['config'], undefined> },\n      undefined\n    >\n\n    // set the root params to the wrapped mod params\n    super(mutatedParams)\n\n    this.wrapperParams = mutatedWrapperParams\n  }\n\n  get account(): AccountInstance {\n    return this.wrapperParams.account\n  }\n\n  get additionalSigners(): AccountInstance[] {\n    return this.wrapperParams.additionalSigners ?? []\n  }\n\n  get address(): (Lowercase<string> & {\n    readonly __hex: true\n  } & {\n    readonly __address: true\n  }) | XyoQuantAddress {\n    return this.mod.address\n  }\n\n  get config() {\n    return this.mod.config as Exclude<TWrappedModule['params']['config'], undefined>\n  }\n\n  get downResolver(): ModuleResolverInstance {\n    // Should we be allowing this?\n    const instance: AttachableModuleInstance | undefined = asAttachableModuleInstance(this.mod)\n    if (instance) {\n      return instance.downResolver\n    }\n    throw new Error('Unsupported')\n  }\n\n  get id(): string {\n    return this.mod.id\n  }\n\n  get mod(): TWrappedModule {\n    return this.wrapperParams.mod\n  }\n\n  get modName(): string | undefined {\n    return this.mod.modName\n  }\n\n  get name() {\n    return 'ModuleWrapper' as CreatableName\n  }\n\n  get priority(): 1 {\n    return ObjectResolverPriority.Low\n  }\n\n  get privateResolver(): ModuleResolverInstance {\n    // Should we be allowing this?\n    const instance = asAttachableModuleInstance(this.mod)\n    if (instance) {\n      return instance.privateResolver\n    }\n    throw new Error('Unsupported')\n  }\n\n  get queries(): string[] {\n    return this.mod.queries\n  }\n\n  get upResolver(): ModuleResolverInstance {\n    // Should we be allowing this?\n    const instance = asAttachableModuleInstance(this.mod)\n    if (instance) {\n      return instance.upResolver\n    }\n    throw new Error('Unsupported')\n  }\n\n  // Getter/setter adjacency conflicts with the class member-ordering rule here.\n  // eslint-disable-next-line @typescript-eslint/member-ordering\n  get status() {\n    return this._status\n  }\n\n  protected set status(value: ModuleStatus) {\n    this._status = value\n  }\n\n  /** Narrowed view of `mod` typed against the wrapped module's actual `eventData` so generic event method calls type-check across the constraint boundary. */\n  // eslint-disable-next-line @typescript-eslint/member-ordering\n  protected get modEvents(): EventEmitter<TWrappedModule['eventData']> {\n    return this.wrapperParams.mod\n  }\n\n  static canWrap(mod?: QueryableModule): mod is QueryableModule<QueryableModuleParams<AnyConfigSchema<ModuleConfig>>, ModuleEventData<object>> {\n    return !!mod && this.moduleIdentityCheck(mod)\n  }\n\n  static hasRequiredQueries(mod: QueryableModule): boolean {\n    return this.missingRequiredQueries(mod).length === 0\n  }\n\n  static is<TModuleWrapper extends ModuleWrapper>(\n    this: ConstructableModuleWrapper<TModuleWrapper>,\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    wrapper: any,\n  ): wrapper is TModuleWrapper {\n    return wrapper instanceof this\n  }\n\n  static missingRequiredQueries(mod: QueryableModule): string[] {\n    const modQueries = mod.queries\n    return (\n      this.requiredQueries.map((query) => {\n        return modQueries.includes(query) ? null : query\n      })\n    ).filter(exists)\n  }\n\n  static tryWrap<TModuleWrapper extends ModuleWrapper>(\n    this: ConstructableModuleWrapper<TModuleWrapper>,\n    mod: QueryableModule | undefined,\n    account: AccountInstance,\n    checkIdentity = true,\n  ): TModuleWrapper | undefined {\n    if (!checkIdentity || this.canWrap(mod)) {\n      return new this({ account, mod: mod as TModuleWrapper['mod'] })\n    }\n  }\n\n  static with<TModuleWrapper extends ModuleWrapper, R extends Promisable<void> = void>(\n    this: ConstructableModuleWrapper<TModuleWrapper>,\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    mod: any,\n\n    closure: (mod: TModuleWrapper) => R,\n  ): R | undefined {\n    return this.is(mod) ? closure(mod) : undefined\n  }\n\n  static wrap<TModuleWrapper extends ModuleWrapper>(\n    this: ConstructableModuleWrapper<TModuleWrapper>,\n    mod: QueryableModule | undefined,\n    account: AccountInstance,\n    checkIdentity = true,\n  ): TModuleWrapper {\n    assertEx(!checkIdentity || (mod && this.moduleIdentityCheck(mod)), () => `Passed mod failed identity check: ${mod?.config?.schema}`)\n    return assertEx(this.tryWrap(mod, account, checkIdentity), () => 'Unable to wrap mod as ModuleWrapper')\n  }\n\n  addParent(mod: ModuleInstance): void {\n    const hasExistingEntry = this._parents.some(parent => parent.address === mod.address)\n    if (!hasExistingEntry) {\n      this._parents.push(mod)\n    }\n  }\n\n  async addressPreviousHash(): Promise<AddressPreviousHashPayload> {\n    const queryPayload: ModuleAddressQuery = { schema: ModuleAddressQuerySchema }\n    return assertEx(\n      (await this.sendQuery(queryPayload)).find(payload => payload.schema === AddressPreviousHashSchema) as AddressPreviousHashPayload,\n      () => 'Result did not include correct payload',\n    )\n  }\n\n  clearListeners(eventNames: Parameters<TWrappedModule['clearListeners']>[0]): void {\n    return this.mod.clearListeners(eventNames)\n  }\n\n  emit<TEventName extends keyof TWrappedModule['eventData']>(\n    eventName: TEventName,\n    eventArgs: TWrappedModule['eventData'][TEventName],\n  ): Promise<void> {\n    return this.modEvents.emit(eventName, eventArgs)\n  }\n\n  emitSerial<TEventName extends keyof TWrappedModule['eventData']>(\n    eventName: TEventName,\n    eventArgs: TWrappedModule['eventData'][TEventName],\n  ): Promise<void> {\n    return this.modEvents.emitSerial(eventName, eventArgs)\n  }\n\n  listenerCount(eventNames: Parameters<TWrappedModule['listenerCount']>[0]): number {\n    return this.mod.listenerCount(eventNames)\n  }\n\n  async manifest(maxDepth?: number): Promise<ModuleManifestPayload> {\n    const queryPayload: ModuleManifestQuery = { schema: ModuleManifestQuerySchema, ...(maxDepth === undefined ? {} : { maxDepth }) }\n    return (await this.sendQuery(queryPayload))[0] as ModuleManifestPayload\n  }\n\n  async manifestQuery(account: AccountInstance, maxDepth?: number): Promise<ModuleQueryResult<ModuleManifestPayload>> {\n    const queryPayload: ModuleManifestQuery = { schema: ModuleManifestQuerySchema, ...(maxDepth === undefined ? {} : { maxDepth }) }\n    return await this.sendQueryRaw(queryPayload, undefined, account)\n  }\n\n  async moduleAddress(): Promise<AddressPreviousHashPayload[]> {\n    const queryPayload: ModuleAddressQuery = { schema: ModuleAddressQuerySchema }\n    return (await this.sendQuery(queryPayload))\n  }\n\n  off<TEventName extends keyof TWrappedModule['eventData']>(\n    eventNames: TEventName,\n    listener: EventListener<TWrappedModule['eventData'][TEventName]>,\n  ): void {\n    return this.modEvents.off(eventNames, listener)\n  }\n\n  offAny(listener: EventAnyListener): void {\n    return this.mod.offAny(listener)\n  }\n\n  on<TEventName extends keyof TWrappedModule['eventData']>(eventNames: TEventName, listener: EventListener<TWrappedModule['eventData'][TEventName]>): EventUnsubscribeFunction {\n    return this.modEvents.on(eventNames, listener)\n  }\n\n  onAny(listener: EventAnyListener): EventUnsubscribeFunction {\n    return this.mod.onAny(listener)\n  }\n\n  once<TEventName extends keyof TWrappedModule['eventData']>(\n    eventName: TEventName,\n    listener: EventListener<TWrappedModule['eventData'][TEventName]>,\n  ): EventUnsubscribeFunction {\n    return this.modEvents.once(eventName, listener)\n  }\n\n  parents(): Promisable<ModuleInstance[]> {\n    return this._parents\n  }\n\n  async previousHash(): Promise<string | undefined> {\n    const queryPayload: ModuleAddressQuery = { schema: ModuleAddressQuerySchema }\n    return ((await this.sendQuery(queryPayload)).pop() as AddressPreviousHashPayload).previousHash\n  }\n\n  async previousHashQuery(account?: AccountInstance): Promise<ModuleQueryResult<AddressPreviousHashPayload>> {\n    const queryPayload: ModuleAddressQuery = { schema: ModuleAddressQuerySchema }\n    return await this.sendQueryRaw(queryPayload, undefined, account)\n  }\n\n  async privateChildren(): Promise<ModuleInstance[]> {\n    if (isModuleInstance(this.mod)) {\n      return await this.mod.privateChildren()\n    }\n    return []\n  }\n\n  async publicChildren(): Promise<ModuleInstance[]> {\n    if (isModuleInstance(this.mod)) {\n      return await this.mod.publicChildren()\n    }\n    return []\n  }\n\n  async query<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads?: Payload[]): Promise<ModuleQueryResult> {\n    return await this.mod.query(query, payloads)\n  }\n\n  queryable<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads?: Payload[]): Promisable<boolean> {\n    return this.mod.queryable(query, payloads)\n  }\n\n  removeParent(address: XyoAddress): void {\n    this._parents = this._parents.filter(item => item.address !== address)\n  }\n\n  /** @deprecated do not pass undefined.  If trying to get all, pass '*' */\n  async resolve<T extends ModuleInstance = ModuleInstance>(): Promise<T[]>\n  async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n  async resolve<T extends ModuleInstance = ModuleInstance>(\n    id: ModuleIdentifier,\n    options?: ModuleFilterOptions<T>,\n  ): Promise<ModuleInstance>\n  async resolve<T extends ModuleInstance = ModuleInstance>(\n    id: ModuleIdentifier = '*',\n    options?: ModuleFilterOptions<T>,\n  ): Promise<T | T[] | undefined> {\n    const instance = asModuleInstance(this.mod)\n    if (instance?.resolve) {\n      if (id === '*') {\n        return await instance.resolve<T>('*', options)\n      }\n      switch (typeof id) {\n        case 'string': {\n          return await instance.resolve<T>(id, options)\n        }\n        default: {\n          return\n        }\n      }\n    }\n    return typeof id === 'string' && id !== '*' ? undefined : []\n  }\n\n  async resolvePrivate<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n  async resolvePrivate<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n  async resolvePrivate<T extends ModuleInstance = ModuleInstance>(\n    id: ModuleIdentifier,\n    _options?: ModuleFilterOptions<T>,\n  ): Promise<T | T[] | undefined> {\n    if (id === '*') return []\n  }\n\n  async siblings(): Promise<ModuleInstance[]> {\n    // eslint-disable-next-line @typescript-eslint/await-thenable\n    return (await Promise.all((await this.parents()).map(parent => parent.publicChildren()))).flat().filter(duplicateModules)\n  }\n\n  start(): Promise<boolean> {\n    throw new Error('Cannot start a wrapped module')\n  }\n\n  async state(): Promise<Payload[]> {\n    const cachedResult = this.cachedCalls.get('state')\n    if (cachedResult) {\n      return cachedResult\n    }\n    const queryPayload: ModuleStateQuery = { schema: ModuleStateQuerySchema }\n    const result = await this.sendQuery(queryPayload)\n    this.cachedCalls.set('state', result)\n    return result\n  }\n\n  async stateQuery(_account: AccountInstance): Promise<ModuleQueryResult> {\n    const queryPayload: ModuleStateQuery = { schema: ModuleStateQuerySchema }\n    return await this.sendQueryRaw(queryPayload)\n  }\n\n  stop(): Promise<boolean> {\n    throw new Error('Cannot stop a wrapped module')\n  }\n\n  protected bindQuery<T extends Query>(\n    query: T,\n    payloads?: Payload[],\n    account: AccountInstance = this.account,\n    additionalSigners: AccountInstance[] = this.additionalSigners,\n  ): PromiseEx<[QueryBoundWitness, Payload[], ModuleError[]], AccountInstance> {\n    // eslint-disable-next-line @typescript-eslint/no-misused-promises\n    return new PromiseEx<[QueryBoundWitness, Payload[], ModuleError[]], AccountInstance>(async (resolve) => {\n      const result = await this.bindQueryInternal(query, payloads, account, additionalSigners)\n      resolve?.(result)\n      return result\n    }, account)\n  }\n\n  protected async bindQueryInternal<T extends Query>(\n    query: T,\n    payloads?: Payload[],\n    account: AccountInstance = this.account,\n    additionalSigners: AccountInstance[] = this.additionalSigners,\n  ): Promise<[QueryBoundWitness, Payload[], ModuleError[]]> {\n    const builder = new QueryBoundWitnessBuilder().payloads(payloads).query(query)\n    const accounts = [account, ...additionalSigners].filter(exists)\n    return await (accounts.length > 0 ? builder.signers(accounts) : builder).build()\n  }\n\n  protected filterErrors([bw, payloads]: ModuleQueryResult): ModuleError[] {\n    const wrapper = BoundWitnessWrapper.wrap(bw, payloads)\n    return wrapper.payloadsBySchema<ModuleError>(ModuleErrorSchema)\n  }\n\n  protected async sendQuery<T extends Query, P extends Payload = Payload, R extends Payload = Payload>(\n    queryPayload: T,\n    payloads?: P[],\n  ): Promise<R[]> {\n    const queryResults = await this.sendQueryRaw(queryPayload, payloads)\n    const [, resultPayloads, errors] = queryResults\n\n    /* TODO: Figure out what to do with the returning BW.  Should we store them in a queue in case the caller wants to see them? */\n\n    if (isDefined(errors) && errors.length > 0) {\n      /* TODO: Figure out how to rollup multiple Errors */\n      throw new Error(JSON.stringify(errors[0]))\n    }\n\n    return resultPayloads as R[]\n  }\n\n  protected async sendQueryRaw<T extends Query, P extends Payload = Payload, R extends Payload = Payload>(\n    queryPayload: T,\n    payloads?: P[],\n    account?: AccountInstance,\n  ): Promise<ModuleQueryResult<R>> {\n    // Bind them\n    const query = await this.bindQuery(queryPayload, payloads, account)\n\n    // Send them off\n    return (await this.query(query[0], query[1])) as ModuleQueryResult<R>\n  }\n}\n"],
  "mappings": "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",
  "names": []
}
