{
  "version": 3,
  "sources": ["../../src/modules/witness-abstract/AbstractWitness.ts"],
  "sourcesContent": ["import type { Promisable } from '@ariestools/sdk'\nimport { assertEx, isAddress } from '@ariestools/sdk'\nimport type {\n  AccountInstance, Payload, QueryBoundWitness,\n  Schema, WithoutPrivateStorageMeta,\n} from '@xyo-network/sdk-protocol'\nimport { PayloadBuilder, QueryBoundWitnessWrapper } from '@xyo-network/sdk-protocol'\n\nimport type {\n  ArchivistConfig, ArchivistInstance, ArchivistModuleEventData, ArchivistParams,\n} from '#archivist-model'\nimport { AbstractModuleInstance } from '#module-abstract'\nimport type {\n  AnyConfigSchema,\n  ModuleConfig, ModuleQueryHandlerResult, ModuleQueryResult,\n} from '#module-model'\nimport type {\n  CustomWitnessInstance,\n  WitnessInstance,\n  WitnessModuleEventData,\n  WitnessObserveQuery,\n  WitnessParams,\n  WitnessQueries,\n} from '#witness-model'\nimport {\n  WitnessConfigSchema,\n  WitnessObserveQuerySchema,\n} from '#witness-model'\n\nexport abstract class AbstractWitness<\n  TParams extends WitnessParams = WitnessParams,\n  TIn extends Payload = Payload,\n  TOut extends Payload = Payload,\n  TEventData extends WitnessModuleEventData<WitnessInstance<TParams, TIn, TOut>, TIn, TOut> = WitnessModuleEventData<\n    WitnessInstance<TParams, TIn, TOut>,\n    TIn,\n    TOut\n  >,\n>\n  extends AbstractModuleInstance<TParams, TEventData>\n  implements CustomWitnessInstance<TParams, TIn, TOut, TEventData> {\n  static override readonly configSchemas: Schema[] = [...super.configSchemas, WitnessConfigSchema]\n  static override readonly defaultConfigSchema: Schema = WitnessConfigSchema\n\n  private _archivistInstance: ArchivistInstance | undefined\n\n  override get queries(): Schema[] {\n    return [WitnessObserveQuerySchema, ...super.queries]\n  }\n\n  async getArchivistInstance(): Promise<ArchivistInstance<ArchivistParams<AnyConfigSchema<ArchivistConfig>>, ArchivistModuleEventData, Payload> | undefined> {\n    const archivistAddress = this.archivist\n    this._archivistInstance = this._archivistInstance ?? (isAddress(archivistAddress) ? await this.resolve(archivistAddress) : undefined)\n    return this._archivistInstance\n  }\n\n  /** @function observe The main entry point for a witness.  Do not override this function.  Implement/override observeHandler for custom functionality */\n  async observe(inPayloads?: TIn[]): Promise<(WithoutPrivateStorageMeta<TOut>)[]> {\n    this._noOverride('observe')\n    this.isSupportedQuery(WitnessObserveQuerySchema, 'observe')\n    return await this.spanAsync('observe', async () => {\n      if (this.reentrancy?.scope === 'global' && this.reentrancy.action === 'skip' && this.globalReentrancyMutex?.isLocked()) {\n        return []\n      }\n      try {\n        return await this.busy(async () => {\n          await this.globalReentrancyMutex?.acquire()\n          this._noOverride('observe')\n          await this.startedAsync('throw')\n          await this.emit('observeStart', { inPayloads, mod: this })\n          const outPayloads = assertEx(await this.observeHandler(inPayloads), () => 'Trying to witness nothing')\n          // assertEx(outPayloads.length > 0, 'Trying to witness empty list')\n          for (const payload of outPayloads ?? []) assertEx(payload.schema, () => 'observe: Missing Schema')\n\n          const archivist = await this.getArchivistInstance()\n          if (archivist) {\n            await archivist.insert(outPayloads)\n          }\n\n          await this.emit('observeEnd', {\n            inPayloads, mod: this, outPayloads,\n          })\n\n          return PayloadBuilder.omitPrivateStorageMeta<TOut>(outPayloads)\n        })\n      } finally {\n        this.globalReentrancyMutex?.release()\n      }\n    }, { timeBudgetLimit: 200 })\n  }\n\n  async observeQuery(payloads?: TIn[], account?: AccountInstance): Promise<ModuleQueryResult<TOut>> {\n    this._noOverride('observeQuery')\n    const queryPayload: WitnessObserveQuery = { schema: WitnessObserveQuerySchema }\n    return await this.sendQueryRaw(queryPayload, payloads, account)\n  }\n\n  /** @function queryHandler Calls observe for an observe query.  Override to support additional queries. */\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<WitnessQueries>(query, payloads)\n    const queryPayload = await wrapper.getQuery()\n    assertEx(await this.queryable(query, payloads, queryConfig))\n    const resultPayloads: Payload[] = []\n    // Remove the query payload from the arguments passed to us so we don't observe it\n    const filteredObservation = (await PayloadBuilder.filterExclude(payloads, query.query)) as TIn[]\n    switch (queryPayload.schema) {\n      case WitnessObserveQuerySchema: {\n        const observePayloads = await this.observe(filteredObservation)\n        resultPayloads.push(...observePayloads)\n        break\n      }\n      default: {\n        return super.queryHandler(query, payloads)\n      }\n    }\n    return PayloadBuilder.omitPrivateStorageMeta(resultPayloads)\n  }\n\n  /** @function observeHandler Implement or override to add custom functionality to a witness */\n  protected abstract observeHandler(payloads?: TIn[]): Promisable<TOut[]>\n}\n"],
  "mappings": ";AACA,SAAS,UAAU,iBAAiB;AAKpC,SAAS,gBAAgB,gCAAgC;AAKzD,SAAS,8BAA8B;AAavC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEA,IAAe,kBAAf,cAUG,uBACyD;AAAA,EACjE,OAAyB,gBAA0B,CAAC,GAAG,MAAM,eAAe,mBAAmB;AAAA,EAC/F,OAAyB,sBAA8B;AAAA,EAE/C;AAAA,EAER,IAAa,UAAoB;AAC/B,WAAO,CAAC,2BAA2B,GAAG,MAAM,OAAO;AAAA,EACrD;AAAA,EAEA,MAAM,uBAAqJ;AACzJ,UAAM,mBAAmB,KAAK;AAC9B,SAAK,qBAAqB,KAAK,uBAAuB,UAAU,gBAAgB,IAAI,MAAM,KAAK,QAAQ,gBAAgB,IAAI;AAC3H,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,MAAM,QAAQ,YAAkE;AAC9E,SAAK,YAAY,SAAS;AAC1B,SAAK,iBAAiB,2BAA2B,SAAS;AAC1D,WAAO,MAAM,KAAK,UAAU,WAAW,YAAY;AACjD,UAAI,KAAK,YAAY,UAAU,YAAY,KAAK,WAAW,WAAW,UAAU,KAAK,uBAAuB,SAAS,GAAG;AACtH,eAAO,CAAC;AAAA,MACV;AACA,UAAI;AACF,eAAO,MAAM,KAAK,KAAK,YAAY;AACjC,gBAAM,KAAK,uBAAuB,QAAQ;AAC1C,eAAK,YAAY,SAAS;AAC1B,gBAAM,KAAK,aAAa,OAAO;AAC/B,gBAAM,KAAK,KAAK,gBAAgB,EAAE,YAAY,KAAK,KAAK,CAAC;AACzD,gBAAM,cAAc,SAAS,MAAM,KAAK,eAAe,UAAU,GAAG,MAAM,2BAA2B;AAErG,qBAAW,WAAW,eAAe,CAAC,EAAG,UAAS,QAAQ,QAAQ,MAAM,yBAAyB;AAEjG,gBAAM,YAAY,MAAM,KAAK,qBAAqB;AAClD,cAAI,WAAW;AACb,kBAAM,UAAU,OAAO,WAAW;AAAA,UACpC;AAEA,gBAAM,KAAK,KAAK,cAAc;AAAA,YAC5B;AAAA,YAAY,KAAK;AAAA,YAAM;AAAA,UACzB,CAAC;AAED,iBAAO,eAAe,uBAA6B,WAAW;AAAA,QAChE,CAAC;AAAA,MACH,UAAE;AACA,aAAK,uBAAuB,QAAQ;AAAA,MACtC;AAAA,IACF,GAAG,EAAE,iBAAiB,IAAI,CAAC;AAAA,EAC7B;AAAA,EAEA,MAAM,aAAa,UAAkB,SAA6D;AAChG,SAAK,YAAY,cAAc;AAC/B,UAAM,eAAoC,EAAE,QAAQ,0BAA0B;AAC9E,WAAO,MAAM,KAAK,aAAa,cAAc,UAAU,OAAO;AAAA,EAChE;AAAA;AAAA,EAGA,MAAyB,aACvB,OACA,UACA,aACmC;AACnC,UAAM,UAAU,yBAAyB,WAA2B,OAAO,QAAQ;AACnF,UAAM,eAAe,MAAM,QAAQ,SAAS;AAC5C,aAAS,MAAM,KAAK,UAAU,OAAO,UAAU,WAAW,CAAC;AAC3D,UAAM,iBAA4B,CAAC;AAEnC,UAAM,sBAAuB,MAAM,eAAe,cAAc,UAAU,MAAM,KAAK;AACrF,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK,2BAA2B;AAC9B,cAAM,kBAAkB,MAAM,KAAK,QAAQ,mBAAmB;AAC9D,uBAAe,KAAK,GAAG,eAAe;AACtC;AAAA,MACF;AAAA,MACA,SAAS;AACP,eAAO,MAAM,aAAa,OAAO,QAAQ;AAAA,MAC3C;AAAA,IACF;AACA,WAAO,eAAe,uBAAuB,cAAc;AAAA,EAC7D;AAIF;",
  "names": []
}
