{
  "version": 3,
  "sources": ["../../src/modules/boundwitness-loader/Loader.ts"],
  "sourcesContent": ["import type { BaseParams, Hash } from '@ariestools/sdk'\nimport { Base, exists } from '@ariestools/sdk'\nimport type { Payload } from '@xyo-network/sdk-protocol'\nimport {\n  asBoundWitness, Huri, isAnyPayload,\n} from '@xyo-network/sdk-protocol'\nimport { Mutex } from 'async-mutex'\n\nimport { MemoryArchivist } from '#archivist-memory'\nimport type { ArchivistInstance } from '#archivist-model'\n\nexport interface PayloadWorkingSet {\n  archivists?: ArchivistInstance[]\n  huriEndpoints?: string[]\n  payloads?: Payload[]\n}\n\nexport interface BoundWitnessLoaderParams extends BaseParams {\n  cache?: ArchivistInstance\n  workingSet: PayloadWorkingSet\n}\n\nexport class BoundWitnessLoader extends Base<BoundWitnessLoaderParams> {\n  private _cache?: ArchivistInstance\n  private _createCacheMutex = new Mutex()\n\n  async load(hash: Hash | Hash[]): Promise<Payload[]> {\n    if (Array.isArray(hash)) {\n      return (await Promise.all(hash.map(h => this.load(h)))).flat()\n    }\n    const bw = asBoundWitness(await this.getPayload(hash))\n    if (bw) {\n      const payloads = (await Promise.all(bw.payload_hashes.map(hash => this.getPayload(hash)))).filter(exists)\n      return [bw, ...payloads]\n    }\n    return []\n  }\n\n  private async getCache() {\n    return await this._createCacheMutex.runExclusive(async () => {\n      this._cache = this._cache ?? this.params.cache ?? (await MemoryArchivist.create({ account: 'random' }))\n      if (this.params.workingSet.payloads) await this._cache.insert(this.params.workingSet.payloads)\n      return this._cache\n    })\n  }\n\n  private async getPayload(hash: Hash): Promise<Payload | undefined> {\n    const cache = await this.getCache()\n    const payloadFromCache = (await cache.get([hash])).at(0)\n    if (isAnyPayload(payloadFromCache)) {\n      return payloadFromCache\n    }\n\n    for (const archivist of this.params.workingSet.archivists ?? []) {\n      const payloadFromArchivist = await archivist.get([hash])\n      if (isAnyPayload(payloadFromArchivist)) {\n        await cache.insert([payloadFromArchivist])\n        return payloadFromArchivist\n      }\n    }\n\n    for (const huriEndpoint of this.params.workingSet.huriEndpoints ?? []) {\n      const payloadFromHuri = await new Huri(hash, { archivistUri: huriEndpoint }).fetch()\n      if (isAnyPayload(payloadFromHuri)) {\n        await cache.insert([payloadFromHuri])\n        return payloadFromHuri\n      }\n    }\n  }\n}\n"],
  "mappings": ";AACA,SAAS,MAAM,cAAc;AAE7B;AAAA,EACE;AAAA,EAAgB;AAAA,EAAM;AAAA,OACjB;AACP,SAAS,aAAa;AAEtB,SAAS,uBAAuB;AAczB,IAAM,qBAAN,cAAiC,KAA+B;AAAA,EAC7D;AAAA,EACA,oBAAoB,IAAI,MAAM;AAAA,EAEtC,MAAM,KAAK,MAAyC;AAClD,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,cAAQ,MAAM,QAAQ,IAAI,KAAK,IAAI,OAAK,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK;AAAA,IAC/D;AACA,UAAM,KAAK,eAAe,MAAM,KAAK,WAAW,IAAI,CAAC;AACrD,QAAI,IAAI;AACN,YAAM,YAAY,MAAM,QAAQ,IAAI,GAAG,eAAe,IAAI,CAAAA,UAAQ,KAAK,WAAWA,KAAI,CAAC,CAAC,GAAG,OAAO,MAAM;AACxG,aAAO,CAAC,IAAI,GAAG,QAAQ;AAAA,IACzB;AACA,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAc,WAAW;AACvB,WAAO,MAAM,KAAK,kBAAkB,aAAa,YAAY;AAC3D,WAAK,SAAS,KAAK,UAAU,KAAK,OAAO,SAAU,MAAM,gBAAgB,OAAO,EAAE,SAAS,SAAS,CAAC;AACrG,UAAI,KAAK,OAAO,WAAW,SAAU,OAAM,KAAK,OAAO,OAAO,KAAK,OAAO,WAAW,QAAQ;AAC7F,aAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,WAAW,MAA0C;AACjE,UAAM,QAAQ,MAAM,KAAK,SAAS;AAClC,UAAM,oBAAoB,MAAM,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;AACvD,QAAI,aAAa,gBAAgB,GAAG;AAClC,aAAO;AAAA,IACT;AAEA,eAAW,aAAa,KAAK,OAAO,WAAW,cAAc,CAAC,GAAG;AAC/D,YAAM,uBAAuB,MAAM,UAAU,IAAI,CAAC,IAAI,CAAC;AACvD,UAAI,aAAa,oBAAoB,GAAG;AACtC,cAAM,MAAM,OAAO,CAAC,oBAAoB,CAAC;AACzC,eAAO;AAAA,MACT;AAAA,IACF;AAEA,eAAW,gBAAgB,KAAK,OAAO,WAAW,iBAAiB,CAAC,GAAG;AACrE,YAAM,kBAAkB,MAAM,IAAI,KAAK,MAAM,EAAE,cAAc,aAAa,CAAC,EAAE,MAAM;AACnF,UAAI,aAAa,eAAe,GAAG;AACjC,cAAM,MAAM,OAAO,CAAC,eAAe,CAAC;AACpC,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;",
  "names": ["hash"]
}
