@xyo-network/archivist-abstract 2.84.10 → 2.84.12

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.
@@ -41,7 +41,7 @@ var AbstractArchivist = class extends import_module_abstract.AbstractModuleInsta
41
41
  return [import_archivist_model.ArchivistGetQuerySchema, ...super.queries];
42
42
  }
43
43
  get requireAllParents() {
44
- return this.config.requireAllParents ?? true;
44
+ return this.config.requireAllParents ?? false;
45
45
  }
46
46
  get _queryAccountPaths() {
47
47
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/AbstractArchivist.ts"],"sourcesContent":["export * from './AbstractArchivist'\n","import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable, PromisableArray } from '@xylabs/promise'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistDeleteQuery,\n ArchivistDeleteQuerySchema,\n ArchivistGetQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n ArchivistParams,\n ArchivistQuery,\n ArchivistQueryBase,\n asArchivistInstance,\n isArchivistInstance,\n} from '@xyo-network/archivist-model'\nimport { QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, BoundWitnessSchema, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { duplicateModules, ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport interface ActionConfig {\n emitEvents?: boolean\n}\n\nexport interface InsertConfig extends ActionConfig {\n writeToParents?: boolean\n}\n\nexport interface ArchivistParentInstances {\n commit?: Record<string, ArchivistInstance>\n read?: Record<string, ArchivistInstance>\n write?: Record<string, ArchivistInstance>\n}\n\nexport abstract class AbstractArchivist<\n TParams extends ArchivistParams = ArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements ArchivistInstance<TParams>\n{\n private _lastInsertedPayload: Payload | undefined\n private _parents?: ArchivistParentInstances\n\n override get queries(): string[] {\n return [ArchivistGetQuerySchema, ...super.queries]\n }\n\n get requireAllParents() {\n return this.config.requireAllParents ?? true\n }\n\n protected override get _queryAccountPaths(): Record<ArchivistQueryBase['schema'], string> {\n return {\n 'network.xyo.query.archivist.all': '1/1',\n 'network.xyo.query.archivist.clear': '1/2',\n 'network.xyo.query.archivist.commit': '1/3',\n 'network.xyo.query.archivist.delete': '1/4',\n 'network.xyo.query.archivist.get': '1/5',\n 'network.xyo.query.archivist.insert': '1/6',\n }\n }\n\n protected get storeParentReads() {\n return !!this.config?.storeParentReads\n }\n\n all(): PromisableArray<Payload> {\n this._noOverride('all')\n return this.busy(async () => {\n await this.started('throw')\n return await this.allHandler()\n })\n }\n\n clear(): Promisable<void> {\n this._noOverride('clear')\n return this.busy(async () => {\n await this.started('throw')\n return await this.clearHandler()\n })\n }\n\n commit(): Promisable<BoundWitness[]> {\n this._noOverride('commit')\n return this.busy(async () => {\n await this.started('throw')\n return await this.commitHandler()\n })\n }\n\n async delete(hashes: string[]): Promise<string[]> {\n this._noOverride('delete')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.deleteWithConfig(hashes)\n })\n }\n\n async get(hashes: string[]): Promise<Payload[]> {\n this._noOverride('get')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.getWithConfig(hashes)\n })\n }\n\n async insert(payloads: Payload[]): Promise<Payload[]> {\n this._noOverride('insert')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.insertWithConfig(payloads)\n })\n }\n\n protected allHandler(): PromisableArray<Payload> {\n throw new Error('Not implemented')\n }\n\n protected clearHandler(): Promisable<void> {\n throw new Error('Not implemented')\n }\n\n protected commitHandler(): Promisable<BoundWitness[]> {\n throw new Error('Not implemented')\n }\n\n protected deleteHandler(_hashes: string[]): PromisableArray<string> {\n throw new Error('Not implemented')\n }\n\n protected async deleteWithConfig(hashes: string[], config?: ActionConfig): Promise<string[]> {\n const emitEvents = config?.emitEvents ?? true\n\n const deletedHashes = await this.deleteHandler(hashes)\n\n if (emitEvents) {\n await this.emit('deleted', { hashes: deletedHashes, module: this })\n }\n\n return deletedHashes\n }\n\n protected async getFromParent(hashes: string[], archivist: ArchivistInstance): Promise<[Payload[], string[]]> {\n const foundPairs = (\n await Promise.all(\n (await archivist.get(hashes)).map<Promise<[string, Payload]>>(async (payload) => [await PayloadHasher.hashAsync(payload), payload]),\n )\n ).filter(([hash]) => {\n const askedFor = hashes.includes(hash)\n if (!askedFor) {\n console.warn(`Parent returned payload with hash not asked for: ${hash}`)\n //throw Error(`Parent returned payload with hash not asked for: ${hash}`)\n }\n return askedFor\n })\n\n const foundHashes = new Set(foundPairs.map(([hash]) => hash))\n const foundPayloads = foundPairs.map(([, payload]) => payload)\n\n const notfound = hashes.filter((hash) => !foundHashes.has(hash))\n return [foundPayloads, notfound]\n }\n\n protected async getFromParents(hashes: string[]): Promise<[Payload[], string[]]> {\n const parents = Object.values((await this.parents())?.read ?? {})\n let remainingHashes = [...hashes]\n let parentIndex = 0\n let result: Payload[] = []\n\n //intentionally doing this serially\n while (parentIndex < parents.length && remainingHashes.length > 0) {\n const [found, notfound] = await this.getFromParent(remainingHashes, parents[parentIndex])\n result = [...result, ...found]\n remainingHashes = notfound\n parentIndex++\n }\n return [result, remainingHashes]\n }\n\n protected getHandler(_hashes: string[]): Promisable<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async getWithConfig(hashes: string[], config?: InsertConfig): Promise<Payload[]> {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const emitEvents = config?.emitEvents ?? true\n const map = await PayloadWrapper.toMap(await this.getHandler(hashes))\n\n // eslint-disable-next-line unicorn/no-array-reduce\n const { foundPayloads, notfoundHashes } = hashes.reduce<{ foundPayloads: Payload[]; notfoundHashes: string[] }>(\n (prev, hash) => {\n const found = map[hash]\n if (found) {\n //TODO: Find a better way to scrub meta data without scrubbing _signatures\n if (found.schema === BoundWitnessSchema) {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found), _signatures: (found as BoundWitness)._signatures } as BoundWitness)\n } else {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found) } as Payload)\n }\n } else {\n prev.notfoundHashes.push(hash)\n }\n return prev\n },\n { foundPayloads: [], notfoundHashes: [] },\n )\n\n const [parentFoundPayloads] = await this.getFromParents(notfoundHashes)\n\n if (this.storeParentReads) {\n await this.insertWithConfig(parentFoundPayloads)\n }\n return [...foundPayloads, ...parentFoundPayloads]\n }\n\n protected head(): Promisable<Payload | undefined> {\n return this._lastInsertedPayload\n }\n\n protected insertHandler(_payloads: Payload[]): Promise<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async insertWithConfig(payloads: Payload[], config?: InsertConfig): Promise<Payload[]> {\n const emitEvents = config?.emitEvents ?? true\n const writeToParents = config?.writeToParents ?? true\n\n const insertedPayloads = await this.insertHandler(payloads)\n\n if (writeToParents) {\n await this.writeToParents(insertedPayloads)\n }\n if (emitEvents) {\n await this.emit('inserted', { module: this, payloads: insertedPayloads })\n }\n\n return insertedPayloads\n }\n\n protected async parents() {\n this._parents = this._parents ?? {\n commit: await this.resolveArchivists(this.config?.parents?.commit),\n read: await this.resolveArchivists(this.config?.parents?.read),\n write: await this.resolveArchivists(this.config?.parents?.write),\n }\n return assertEx(this._parents)\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 wrappedQuery = QueryBoundWitnessWrapper.parseQuery<ArchivistQuery>(query, payloads)\n const queryPayload = await wrappedQuery.getQuery()\n assertEx(this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n if (this.config.storeQueries) {\n await this.insertHandler([query])\n }\n\n switch (queryPayload.schema) {\n case ArchivistAllQuerySchema: {\n resultPayloads.push(...(await this.allHandler()))\n break\n }\n case ArchivistClearQuerySchema: {\n await this.clearHandler()\n break\n }\n case ArchivistCommitQuerySchema: {\n resultPayloads.push(...(await this.commitHandler()))\n break\n }\n case ArchivistDeleteQuerySchema: {\n const resultPayload: ArchivistDeleteQuery = {\n hashes: [...(await this.deleteWithConfig(queryPayload.hashes))],\n schema: ArchivistDeleteQuerySchema,\n }\n resultPayloads.push(resultPayload)\n break\n }\n case ArchivistGetQuerySchema: {\n if (queryPayload.hashes?.length) {\n resultPayloads.push(...(await this.getWithConfig(queryPayload.hashes)))\n } else {\n const head = await this.head()\n if (head) resultPayloads.push(head)\n }\n break\n }\n case ArchivistInsertQuerySchema: {\n const payloads = await wrappedQuery.getPayloads()\n assertEx(await wrappedQuery.getPayloads(), `Missing payloads: ${JSON.stringify(wrappedQuery.payload(), null, 2)}`)\n const resolvedPayloads = await PayloadWrapper.filterExclude(payloads, await wrappedQuery.hashAsync())\n assertEx(resolvedPayloads.length === payloads.length, `Could not find some passed hashes [${resolvedPayloads.length} != ${payloads.length}]`)\n resultPayloads.push(...(await this.insertWithConfig(payloads)))\n // NOTE: There isn't an exact equivalence between what we get and what we store. Once\n // we move to returning only inserted Payloads(/hash) instead of a BoundWitness, we\n // can grab the actual last one\n this._lastInsertedPayload = resolvedPayloads.at(-1)\n break\n }\n default: {\n return await super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n protected async writeToParent(parent: ArchivistInstance, payloads: Payload[]) {\n return await parent.insert(payloads)\n }\n\n protected async writeToParents(payloads: Payload[]): Promise<Payload[]> {\n const parents = await this.parents()\n return compact(\n await Promise.all(\n Object.values(parents.write ?? {}).map(async (parent) => {\n return parent ? await this.writeToParent(parent, payloads) : undefined\n }),\n ),\n ).flat()\n }\n\n private async resolveArchivists(archivists: string[] = []) {\n const archivistModules = [...(await this.resolve({ address: archivists })), ...(await this.resolve({ name: archivists }))].filter(\n duplicateModules,\n )\n\n assertEx(\n !this.requireAllParents || archivistModules.length === archivists.length,\n `Failed to find some archivists (set allRequired to false if ok): [${archivists.filter((archivist) =>\n archivistModules.map((module) => !(module.address === archivist || module.config.name === archivist)),\n )}]`,\n )\n\n // eslint-disable-next-line unicorn/no-array-reduce\n return archivistModules.reduce<Record<string, ArchivistInstance>>((prev, module) => {\n prev[module.address] = asArchivistInstance(module, () => {\n isArchivistInstance(module, { log: console })\n return `Unable to cast resolved module to an archivist: [${module.address}, ${module.config.name}, ${module.config.schema})}]`\n })\n\n return prev\n }, {})\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,oBAAyB;AACzB,oBAAwB;AAExB,6BAeO;AACP,kCAAyC;AACzC,gCAAoE;AACpE,kBAA8B;AAC9B,6BAAuC;AACvC,0BAAyE;AAEzE,6BAA+B;AAgBxB,IAAe,oBAAf,cAIG,8CAEV;AAAA,EACU;AAAA,EACA;AAAA,EAER,IAAa,UAAoB;AAC/B,WAAO,CAAC,gDAAyB,GAAG,MAAM,OAAO;AAAA,EACnD;AAAA,EAEA,IAAI,oBAAoB;AACtB,WAAO,KAAK,OAAO,qBAAqB;AAAA,EAC1C;AAAA,EAEA,IAAuB,qBAAmE;AACxF,WAAO;AAAA,MACL,mCAAmC;AAAA,MACnC,qCAAqC;AAAA,MACrC,sCAAsC;AAAA,MACtC,sCAAsC;AAAA,MACtC,mCAAmC;AAAA,MACnC,sCAAsC;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,IAAc,mBAAmB;AAC/B,WAAO,CAAC,CAAC,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEA,MAAgC;AAC9B,SAAK,YAAY,KAAK;AACtB,WAAO,KAAK,KAAK,YAAY;AAC3B,YAAM,KAAK,QAAQ,OAAO;AAC1B,aAAO,MAAM,KAAK,WAAW;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA,EAEA,QAA0B;AACxB,SAAK,YAAY,OAAO;AACxB,WAAO,KAAK,KAAK,YAAY;AAC3B,YAAM,KAAK,QAAQ,OAAO;AAC1B,aAAO,MAAM,KAAK,aAAa;AAAA,IACjC,CAAC;AAAA,EACH;AAAA,EAEA,SAAqC;AACnC,SAAK,YAAY,QAAQ;AACzB,WAAO,KAAK,KAAK,YAAY;AAC3B,YAAM,KAAK,QAAQ,OAAO;AAC1B,aAAO,MAAM,KAAK,cAAc;AAAA,IAClC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,QAAqC;AAChD,SAAK,YAAY,QAAQ;AACzB,WAAO,MAAM,KAAK,KAAK,YAAY;AACjC,YAAM,KAAK,QAAQ,OAAO;AAC1B,aAAO,MAAM,KAAK,iBAAiB,MAAM;AAAA,IAC3C,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,IAAI,QAAsC;AAC9C,SAAK,YAAY,KAAK;AACtB,WAAO,MAAM,KAAK,KAAK,YAAY;AACjC,YAAM,KAAK,QAAQ,OAAO;AAC1B,aAAO,MAAM,KAAK,cAAc,MAAM;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,UAAyC;AACpD,SAAK,YAAY,QAAQ;AACzB,WAAO,MAAM,KAAK,KAAK,YAAY;AACjC,YAAM,KAAK,QAAQ,OAAO;AAC1B,aAAO,MAAM,KAAK,iBAAiB,QAAQ;AAAA,IAC7C,CAAC;AAAA,EACH;AAAA,EAEU,aAAuC;AAC/C,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAAA,EAEU,eAAiC;AACzC,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAAA,EAEU,gBAA4C;AACpD,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAAA,EAEU,cAAc,SAA4C;AAClE,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAAA,EAEA,MAAgB,iBAAiB,QAAkB,QAA0C;AAC3F,UAAM,aAAa,QAAQ,cAAc;AAEzC,UAAM,gBAAgB,MAAM,KAAK,cAAc,MAAM;AAErD,QAAI,YAAY;AACd,YAAM,KAAK,KAAK,WAAW,EAAE,QAAQ,eAAe,QAAQ,KAAK,CAAC;AAAA,IACpE;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAgB,cAAc,QAAkB,WAA8D;AAC5G,UAAM,cACJ,MAAM,QAAQ;AAAA,OACX,MAAM,UAAU,IAAI,MAAM,GAAG,IAAgC,OAAO,YAAY,CAAC,MAAM,0BAAc,UAAU,OAAO,GAAG,OAAO,CAAC;AAAA,IACpI,GACA,OAAO,CAAC,CAAC,IAAI,MAAM;AACnB,YAAM,WAAW,OAAO,SAAS,IAAI;AACrC,UAAI,CAAC,UAAU;AACb,gBAAQ,KAAK,oDAAoD,IAAI,EAAE;AAAA,MAEzE;AACA,aAAO;AAAA,IACT,CAAC;AAED,UAAM,cAAc,IAAI,IAAI,WAAW,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC;AAC5D,UAAM,gBAAgB,WAAW,IAAI,CAAC,CAAC,EAAE,OAAO,MAAM,OAAO;AAE7D,UAAM,WAAW,OAAO,OAAO,CAAC,SAAS,CAAC,YAAY,IAAI,IAAI,CAAC;AAC/D,WAAO,CAAC,eAAe,QAAQ;AAAA,EACjC;AAAA,EAEA,MAAgB,eAAe,QAAkD;AAC/E,UAAM,UAAU,OAAO,QAAQ,MAAM,KAAK,QAAQ,IAAI,QAAQ,CAAC,CAAC;AAChE,QAAI,kBAAkB,CAAC,GAAG,MAAM;AAChC,QAAI,cAAc;AAClB,QAAI,SAAoB,CAAC;AAGzB,WAAO,cAAc,QAAQ,UAAU,gBAAgB,SAAS,GAAG;AACjE,YAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,KAAK,cAAc,iBAAiB,QAAQ,WAAW,CAAC;AACxF,eAAS,CAAC,GAAG,QAAQ,GAAG,KAAK;AAC7B,wBAAkB;AAClB;AAAA,IACF;AACA,WAAO,CAAC,QAAQ,eAAe;AAAA,EACjC;AAAA,EAEU,WAAW,SAA0C;AAC7D,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAAA,EAEA,MAAgB,cAAc,QAAkB,QAA2C;AAEzF,UAAM,aAAa,QAAQ,cAAc;AACzC,UAAM,MAAM,MAAM,sCAAe,MAAM,MAAM,KAAK,WAAW,MAAM,CAAC;AAGpE,UAAM,EAAE,eAAe,eAAe,IAAI,OAAO;AAAA,MAC/C,CAAC,MAAM,SAAS;AACd,cAAM,QAAQ,IAAI,IAAI;AACtB,YAAI,OAAO;AAET,cAAI,MAAM,WAAW,8CAAoB;AACvC,iBAAK,cAAc,KAAK,EAAE,GAAG,0BAAc,WAAW,KAAK,GAAG,aAAc,MAAuB,YAAY,CAAiB;AAAA,UAClI,OAAO;AACL,iBAAK,cAAc,KAAK,EAAE,GAAG,0BAAc,WAAW,KAAK,EAAE,CAAY;AAAA,UAC3E;AAAA,QACF,OAAO;AACL,eAAK,eAAe,KAAK,IAAI;AAAA,QAC/B;AACA,eAAO;AAAA,MACT;AAAA,MACA,EAAE,eAAe,CAAC,GAAG,gBAAgB,CAAC,EAAE;AAAA,IAC1C;AAEA,UAAM,CAAC,mBAAmB,IAAI,MAAM,KAAK,eAAe,cAAc;AAEtE,QAAI,KAAK,kBAAkB;AACzB,YAAM,KAAK,iBAAiB,mBAAmB;AAAA,IACjD;AACA,WAAO,CAAC,GAAG,eAAe,GAAG,mBAAmB;AAAA,EAClD;AAAA,EAEU,OAAwC;AAChD,WAAO,KAAK;AAAA,EACd;AAAA,EAEU,cAAc,WAA0C;AAChE,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAAA,EAEA,MAAgB,iBAAiB,UAAqB,QAA2C;AAC/F,UAAM,aAAa,QAAQ,cAAc;AACzC,UAAM,iBAAiB,QAAQ,kBAAkB;AAEjD,UAAM,mBAAmB,MAAM,KAAK,cAAc,QAAQ;AAE1D,QAAI,gBAAgB;AAClB,YAAM,KAAK,eAAe,gBAAgB;AAAA,IAC5C;AACA,QAAI,YAAY;AACd,YAAM,KAAK,KAAK,YAAY,EAAE,QAAQ,MAAM,UAAU,iBAAiB,CAAC;AAAA,IAC1E;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAgB,UAAU;AACxB,SAAK,WAAW,KAAK,YAAY;AAAA,MAC/B,QAAQ,MAAM,KAAK,kBAAkB,KAAK,QAAQ,SAAS,MAAM;AAAA,MACjE,MAAM,MAAM,KAAK,kBAAkB,KAAK,QAAQ,SAAS,IAAI;AAAA,MAC7D,OAAO,MAAM,KAAK,kBAAkB,KAAK,QAAQ,SAAS,KAAK;AAAA,IACjE;AACA,eAAO,wBAAS,KAAK,QAAQ;AAAA,EAC/B;AAAA,EAEA,MAAyB,aACvB,OACA,UACA,aACmC;AACnC,UAAM,eAAe,qDAAyB,WAA2B,OAAO,QAAQ;AACxF,UAAM,eAAe,MAAM,aAAa,SAAS;AACjD,gCAAS,KAAK,UAAU,OAAO,UAAU,WAAW,CAAC;AACrD,UAAM,iBAA4B,CAAC;AACnC,QAAI,KAAK,OAAO,cAAc;AAC5B,YAAM,KAAK,cAAc,CAAC,KAAK,CAAC;AAAA,IAClC;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK,gDAAyB;AAC5B,uBAAe,KAAK,GAAI,MAAM,KAAK,WAAW,CAAE;AAChD;AAAA,MACF;AAAA,MACA,KAAK,kDAA2B;AAC9B,cAAM,KAAK,aAAa;AACxB;AAAA,MACF;AAAA,MACA,KAAK,mDAA4B;AAC/B,uBAAe,KAAK,GAAI,MAAM,KAAK,cAAc,CAAE;AACnD;AAAA,MACF;AAAA,MACA,KAAK,mDAA4B;AAC/B,cAAM,gBAAsC;AAAA,UAC1C,QAAQ,CAAC,GAAI,MAAM,KAAK,iBAAiB,aAAa,MAAM,CAAE;AAAA,UAC9D,QAAQ;AAAA,QACV;AACA,uBAAe,KAAK,aAAa;AACjC;AAAA,MACF;AAAA,MACA,KAAK,gDAAyB;AAC5B,YAAI,aAAa,QAAQ,QAAQ;AAC/B,yBAAe,KAAK,GAAI,MAAM,KAAK,cAAc,aAAa,MAAM,CAAE;AAAA,QACxE,OAAO;AACL,gBAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,cAAI;AAAM,2BAAe,KAAK,IAAI;AAAA,QACpC;AACA;AAAA,MACF;AAAA,MACA,KAAK,mDAA4B;AAC/B,cAAMA,YAAW,MAAM,aAAa,YAAY;AAChD,oCAAS,MAAM,aAAa,YAAY,GAAG,qBAAqB,KAAK,UAAU,aAAa,QAAQ,GAAG,MAAM,CAAC,CAAC,EAAE;AACjH,cAAM,mBAAmB,MAAM,sCAAe,cAAcA,WAAU,MAAM,aAAa,UAAU,CAAC;AACpG,oCAAS,iBAAiB,WAAWA,UAAS,QAAQ,sCAAsC,iBAAiB,MAAM,OAAOA,UAAS,MAAM,GAAG;AAC5I,uBAAe,KAAK,GAAI,MAAM,KAAK,iBAAiBA,SAAQ,CAAE;AAI9D,aAAK,uBAAuB,iBAAiB,GAAG,EAAE;AAClD;AAAA,MACF;AAAA,MACA,SAAS;AACP,eAAO,MAAM,MAAM,aAAa,OAAO,QAAQ;AAAA,MACjD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAgB,cAAc,QAA2B,UAAqB;AAC5E,WAAO,MAAM,OAAO,OAAO,QAAQ;AAAA,EACrC;AAAA,EAEA,MAAgB,eAAe,UAAyC;AACtE,UAAM,UAAU,MAAM,KAAK,QAAQ;AACnC,eAAO;AAAA,MACL,MAAM,QAAQ;AAAA,QACZ,OAAO,OAAO,QAAQ,SAAS,CAAC,CAAC,EAAE,IAAI,OAAO,WAAW;AACvD,iBAAO,SAAS,MAAM,KAAK,cAAc,QAAQ,QAAQ,IAAI;AAAA,QAC/D,CAAC;AAAA,MACH;AAAA,IACF,EAAE,KAAK;AAAA,EACT;AAAA,EAEA,MAAc,kBAAkB,aAAuB,CAAC,GAAG;AACzD,UAAM,mBAAmB,CAAC,GAAI,MAAM,KAAK,QAAQ,EAAE,SAAS,WAAW,CAAC,GAAI,GAAI,MAAM,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC,CAAE,EAAE;AAAA,MACzH;AAAA,IACF;AAEA;AAAA,MACE,CAAC,KAAK,qBAAqB,iBAAiB,WAAW,WAAW;AAAA,MAClE,qEAAqE,WAAW;AAAA,QAAO,CAAC,cACtF,iBAAiB,IAAI,CAACC,YAAW,EAAEA,QAAO,YAAY,aAAaA,QAAO,OAAO,SAAS,UAAU;AAAA,MACtG,CAAC;AAAA,IACH;AAGA,WAAO,iBAAiB,OAA0C,CAAC,MAAMA,YAAW;AAClF,WAAKA,QAAO,OAAO,QAAI,4CAAoBA,SAAQ,MAAM;AACvD,wDAAoBA,SAAQ,EAAE,KAAK,QAAQ,CAAC;AAC5C,eAAO,oDAAoDA,QAAO,OAAO,KAAKA,QAAO,OAAO,IAAI,KAAKA,QAAO,OAAO,MAAM;AAAA,MAC3H,CAAC;AAED,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAAA,EACP;AACF;","names":["payloads","module"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/AbstractArchivist.ts"],"sourcesContent":["export * from './AbstractArchivist'\n","import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable, PromisableArray } from '@xylabs/promise'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistDeleteQuery,\n ArchivistDeleteQuerySchema,\n ArchivistGetQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n ArchivistParams,\n ArchivistQuery,\n ArchivistQueryBase,\n asArchivistInstance,\n isArchivistInstance,\n} from '@xyo-network/archivist-model'\nimport { QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, BoundWitnessSchema, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { duplicateModules, ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport interface ActionConfig {\n emitEvents?: boolean\n}\n\nexport interface InsertConfig extends ActionConfig {\n writeToParents?: boolean\n}\n\nexport interface ArchivistParentInstances {\n commit?: Record<string, ArchivistInstance>\n read?: Record<string, ArchivistInstance>\n write?: Record<string, ArchivistInstance>\n}\n\nexport abstract class AbstractArchivist<\n TParams extends ArchivistParams = ArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements ArchivistInstance<TParams>\n{\n private _lastInsertedPayload: Payload | undefined\n private _parents?: ArchivistParentInstances\n\n override get queries(): string[] {\n return [ArchivistGetQuerySchema, ...super.queries]\n }\n\n get requireAllParents() {\n return this.config.requireAllParents ?? false\n }\n\n protected override get _queryAccountPaths(): Record<ArchivistQueryBase['schema'], string> {\n return {\n 'network.xyo.query.archivist.all': '1/1',\n 'network.xyo.query.archivist.clear': '1/2',\n 'network.xyo.query.archivist.commit': '1/3',\n 'network.xyo.query.archivist.delete': '1/4',\n 'network.xyo.query.archivist.get': '1/5',\n 'network.xyo.query.archivist.insert': '1/6',\n }\n }\n\n protected get storeParentReads() {\n return !!this.config?.storeParentReads\n }\n\n all(): PromisableArray<Payload> {\n this._noOverride('all')\n return this.busy(async () => {\n await this.started('throw')\n return await this.allHandler()\n })\n }\n\n clear(): Promisable<void> {\n this._noOverride('clear')\n return this.busy(async () => {\n await this.started('throw')\n return await this.clearHandler()\n })\n }\n\n commit(): Promisable<BoundWitness[]> {\n this._noOverride('commit')\n return this.busy(async () => {\n await this.started('throw')\n return await this.commitHandler()\n })\n }\n\n async delete(hashes: string[]): Promise<string[]> {\n this._noOverride('delete')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.deleteWithConfig(hashes)\n })\n }\n\n async get(hashes: string[]): Promise<Payload[]> {\n this._noOverride('get')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.getWithConfig(hashes)\n })\n }\n\n async insert(payloads: Payload[]): Promise<Payload[]> {\n this._noOverride('insert')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.insertWithConfig(payloads)\n })\n }\n\n protected allHandler(): PromisableArray<Payload> {\n throw new Error('Not implemented')\n }\n\n protected clearHandler(): Promisable<void> {\n throw new Error('Not implemented')\n }\n\n protected commitHandler(): Promisable<BoundWitness[]> {\n throw new Error('Not implemented')\n }\n\n protected deleteHandler(_hashes: string[]): PromisableArray<string> {\n throw new Error('Not implemented')\n }\n\n protected async deleteWithConfig(hashes: string[], config?: ActionConfig): Promise<string[]> {\n const emitEvents = config?.emitEvents ?? true\n\n const deletedHashes = await this.deleteHandler(hashes)\n\n if (emitEvents) {\n await this.emit('deleted', { hashes: deletedHashes, module: this })\n }\n\n return deletedHashes\n }\n\n protected async getFromParent(hashes: string[], archivist: ArchivistInstance): Promise<[Payload[], string[]]> {\n const foundPairs = (\n await Promise.all(\n (await archivist.get(hashes)).map<Promise<[string, Payload]>>(async (payload) => [await PayloadHasher.hashAsync(payload), payload]),\n )\n ).filter(([hash]) => {\n const askedFor = hashes.includes(hash)\n if (!askedFor) {\n console.warn(`Parent returned payload with hash not asked for: ${hash}`)\n //throw Error(`Parent returned payload with hash not asked for: ${hash}`)\n }\n return askedFor\n })\n\n const foundHashes = new Set(foundPairs.map(([hash]) => hash))\n const foundPayloads = foundPairs.map(([, payload]) => payload)\n\n const notfound = hashes.filter((hash) => !foundHashes.has(hash))\n return [foundPayloads, notfound]\n }\n\n protected async getFromParents(hashes: string[]): Promise<[Payload[], string[]]> {\n const parents = Object.values((await this.parents())?.read ?? {})\n let remainingHashes = [...hashes]\n let parentIndex = 0\n let result: Payload[] = []\n\n //intentionally doing this serially\n while (parentIndex < parents.length && remainingHashes.length > 0) {\n const [found, notfound] = await this.getFromParent(remainingHashes, parents[parentIndex])\n result = [...result, ...found]\n remainingHashes = notfound\n parentIndex++\n }\n return [result, remainingHashes]\n }\n\n protected getHandler(_hashes: string[]): Promisable<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async getWithConfig(hashes: string[], config?: InsertConfig): Promise<Payload[]> {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const emitEvents = config?.emitEvents ?? true\n const map = await PayloadWrapper.toMap(await this.getHandler(hashes))\n\n // eslint-disable-next-line unicorn/no-array-reduce\n const { foundPayloads, notfoundHashes } = hashes.reduce<{ foundPayloads: Payload[]; notfoundHashes: string[] }>(\n (prev, hash) => {\n const found = map[hash]\n if (found) {\n //TODO: Find a better way to scrub meta data without scrubbing _signatures\n if (found.schema === BoundWitnessSchema) {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found), _signatures: (found as BoundWitness)._signatures } as BoundWitness)\n } else {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found) } as Payload)\n }\n } else {\n prev.notfoundHashes.push(hash)\n }\n return prev\n },\n { foundPayloads: [], notfoundHashes: [] },\n )\n\n const [parentFoundPayloads] = await this.getFromParents(notfoundHashes)\n\n if (this.storeParentReads) {\n await this.insertWithConfig(parentFoundPayloads)\n }\n return [...foundPayloads, ...parentFoundPayloads]\n }\n\n protected head(): Promisable<Payload | undefined> {\n return this._lastInsertedPayload\n }\n\n protected insertHandler(_payloads: Payload[]): Promise<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async insertWithConfig(payloads: Payload[], config?: InsertConfig): Promise<Payload[]> {\n const emitEvents = config?.emitEvents ?? true\n const writeToParents = config?.writeToParents ?? true\n\n const insertedPayloads = await this.insertHandler(payloads)\n\n if (writeToParents) {\n await this.writeToParents(insertedPayloads)\n }\n if (emitEvents) {\n await this.emit('inserted', { module: this, payloads: insertedPayloads })\n }\n\n return insertedPayloads\n }\n\n protected async parents() {\n this._parents = this._parents ?? {\n commit: await this.resolveArchivists(this.config?.parents?.commit),\n read: await this.resolveArchivists(this.config?.parents?.read),\n write: await this.resolveArchivists(this.config?.parents?.write),\n }\n return assertEx(this._parents)\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 wrappedQuery = QueryBoundWitnessWrapper.parseQuery<ArchivistQuery>(query, payloads)\n const queryPayload = await wrappedQuery.getQuery()\n assertEx(this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n if (this.config.storeQueries) {\n await this.insertHandler([query])\n }\n\n switch (queryPayload.schema) {\n case ArchivistAllQuerySchema: {\n resultPayloads.push(...(await this.allHandler()))\n break\n }\n case ArchivistClearQuerySchema: {\n await this.clearHandler()\n break\n }\n case ArchivistCommitQuerySchema: {\n resultPayloads.push(...(await this.commitHandler()))\n break\n }\n case ArchivistDeleteQuerySchema: {\n const resultPayload: ArchivistDeleteQuery = {\n hashes: [...(await this.deleteWithConfig(queryPayload.hashes))],\n schema: ArchivistDeleteQuerySchema,\n }\n resultPayloads.push(resultPayload)\n break\n }\n case ArchivistGetQuerySchema: {\n if (queryPayload.hashes?.length) {\n resultPayloads.push(...(await this.getWithConfig(queryPayload.hashes)))\n } else {\n const head = await this.head()\n if (head) resultPayloads.push(head)\n }\n break\n }\n case ArchivistInsertQuerySchema: {\n const payloads = await wrappedQuery.getPayloads()\n assertEx(await wrappedQuery.getPayloads(), `Missing payloads: ${JSON.stringify(wrappedQuery.payload(), null, 2)}`)\n const resolvedPayloads = await PayloadWrapper.filterExclude(payloads, await wrappedQuery.hashAsync())\n assertEx(resolvedPayloads.length === payloads.length, `Could not find some passed hashes [${resolvedPayloads.length} != ${payloads.length}]`)\n resultPayloads.push(...(await this.insertWithConfig(payloads)))\n // NOTE: There isn't an exact equivalence between what we get and what we store. Once\n // we move to returning only inserted Payloads(/hash) instead of a BoundWitness, we\n // can grab the actual last one\n this._lastInsertedPayload = resolvedPayloads.at(-1)\n break\n }\n default: {\n return await super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n protected async writeToParent(parent: ArchivistInstance, payloads: Payload[]) {\n return await parent.insert(payloads)\n }\n\n protected async writeToParents(payloads: Payload[]): Promise<Payload[]> {\n const parents = await this.parents()\n return compact(\n await Promise.all(\n Object.values(parents.write ?? {}).map(async (parent) => {\n return parent ? await this.writeToParent(parent, payloads) : undefined\n }),\n ),\n ).flat()\n }\n\n private async resolveArchivists(archivists: string[] = []) {\n const archivistModules = [...(await this.resolve({ address: archivists })), ...(await this.resolve({ name: archivists }))].filter(\n duplicateModules,\n )\n\n assertEx(\n !this.requireAllParents || archivistModules.length === archivists.length,\n `Failed to find some archivists (set allRequired to false if ok): [${archivists.filter((archivist) =>\n archivistModules.map((module) => !(module.address === archivist || module.config.name === archivist)),\n )}]`,\n )\n\n // eslint-disable-next-line unicorn/no-array-reduce\n return archivistModules.reduce<Record<string, ArchivistInstance>>((prev, module) => {\n prev[module.address] = asArchivistInstance(module, () => {\n isArchivistInstance(module, { log: console })\n return `Unable to cast resolved module to an archivist: [${module.address}, ${module.config.name}, ${module.config.schema})}]`\n })\n\n return prev\n }, {})\n }\n}\n"],"mappings":"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","names":["payloads","module"]}
@@ -24,7 +24,7 @@ var AbstractArchivist = class extends AbstractModuleInstance {
24
24
  return [ArchivistGetQuerySchema, ...super.queries];
25
25
  }
26
26
  get requireAllParents() {
27
- return this.config.requireAllParents ?? true;
27
+ return this.config.requireAllParents ?? false;
28
28
  }
29
29
  get _queryAccountPaths() {
30
30
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/AbstractArchivist.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable, PromisableArray } from '@xylabs/promise'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistDeleteQuery,\n ArchivistDeleteQuerySchema,\n ArchivistGetQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n ArchivistParams,\n ArchivistQuery,\n ArchivistQueryBase,\n asArchivistInstance,\n isArchivistInstance,\n} from '@xyo-network/archivist-model'\nimport { QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, BoundWitnessSchema, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { duplicateModules, ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport interface ActionConfig {\n emitEvents?: boolean\n}\n\nexport interface InsertConfig extends ActionConfig {\n writeToParents?: boolean\n}\n\nexport interface ArchivistParentInstances {\n commit?: Record<string, ArchivistInstance>\n read?: Record<string, ArchivistInstance>\n write?: Record<string, ArchivistInstance>\n}\n\nexport abstract class AbstractArchivist<\n TParams extends ArchivistParams = ArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements ArchivistInstance<TParams>\n{\n private _lastInsertedPayload: Payload | undefined\n private _parents?: ArchivistParentInstances\n\n override get queries(): string[] {\n return [ArchivistGetQuerySchema, ...super.queries]\n }\n\n get requireAllParents() {\n return this.config.requireAllParents ?? true\n }\n\n protected override get _queryAccountPaths(): Record<ArchivistQueryBase['schema'], string> {\n return {\n 'network.xyo.query.archivist.all': '1/1',\n 'network.xyo.query.archivist.clear': '1/2',\n 'network.xyo.query.archivist.commit': '1/3',\n 'network.xyo.query.archivist.delete': '1/4',\n 'network.xyo.query.archivist.get': '1/5',\n 'network.xyo.query.archivist.insert': '1/6',\n }\n }\n\n protected get storeParentReads() {\n return !!this.config?.storeParentReads\n }\n\n all(): PromisableArray<Payload> {\n this._noOverride('all')\n return this.busy(async () => {\n await this.started('throw')\n return await this.allHandler()\n })\n }\n\n clear(): Promisable<void> {\n this._noOverride('clear')\n return this.busy(async () => {\n await this.started('throw')\n return await this.clearHandler()\n })\n }\n\n commit(): Promisable<BoundWitness[]> {\n this._noOverride('commit')\n return this.busy(async () => {\n await this.started('throw')\n return await this.commitHandler()\n })\n }\n\n async delete(hashes: string[]): Promise<string[]> {\n this._noOverride('delete')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.deleteWithConfig(hashes)\n })\n }\n\n async get(hashes: string[]): Promise<Payload[]> {\n this._noOverride('get')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.getWithConfig(hashes)\n })\n }\n\n async insert(payloads: Payload[]): Promise<Payload[]> {\n this._noOverride('insert')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.insertWithConfig(payloads)\n })\n }\n\n protected allHandler(): PromisableArray<Payload> {\n throw new Error('Not implemented')\n }\n\n protected clearHandler(): Promisable<void> {\n throw new Error('Not implemented')\n }\n\n protected commitHandler(): Promisable<BoundWitness[]> {\n throw new Error('Not implemented')\n }\n\n protected deleteHandler(_hashes: string[]): PromisableArray<string> {\n throw new Error('Not implemented')\n }\n\n protected async deleteWithConfig(hashes: string[], config?: ActionConfig): Promise<string[]> {\n const emitEvents = config?.emitEvents ?? true\n\n const deletedHashes = await this.deleteHandler(hashes)\n\n if (emitEvents) {\n await this.emit('deleted', { hashes: deletedHashes, module: this })\n }\n\n return deletedHashes\n }\n\n protected async getFromParent(hashes: string[], archivist: ArchivistInstance): Promise<[Payload[], string[]]> {\n const foundPairs = (\n await Promise.all(\n (await archivist.get(hashes)).map<Promise<[string, Payload]>>(async (payload) => [await PayloadHasher.hashAsync(payload), payload]),\n )\n ).filter(([hash]) => {\n const askedFor = hashes.includes(hash)\n if (!askedFor) {\n console.warn(`Parent returned payload with hash not asked for: ${hash}`)\n //throw Error(`Parent returned payload with hash not asked for: ${hash}`)\n }\n return askedFor\n })\n\n const foundHashes = new Set(foundPairs.map(([hash]) => hash))\n const foundPayloads = foundPairs.map(([, payload]) => payload)\n\n const notfound = hashes.filter((hash) => !foundHashes.has(hash))\n return [foundPayloads, notfound]\n }\n\n protected async getFromParents(hashes: string[]): Promise<[Payload[], string[]]> {\n const parents = Object.values((await this.parents())?.read ?? {})\n let remainingHashes = [...hashes]\n let parentIndex = 0\n let result: Payload[] = []\n\n //intentionally doing this serially\n while (parentIndex < parents.length && remainingHashes.length > 0) {\n const [found, notfound] = await this.getFromParent(remainingHashes, parents[parentIndex])\n result = [...result, ...found]\n remainingHashes = notfound\n parentIndex++\n }\n return [result, remainingHashes]\n }\n\n protected getHandler(_hashes: string[]): Promisable<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async getWithConfig(hashes: string[], config?: InsertConfig): Promise<Payload[]> {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const emitEvents = config?.emitEvents ?? true\n const map = await PayloadWrapper.toMap(await this.getHandler(hashes))\n\n // eslint-disable-next-line unicorn/no-array-reduce\n const { foundPayloads, notfoundHashes } = hashes.reduce<{ foundPayloads: Payload[]; notfoundHashes: string[] }>(\n (prev, hash) => {\n const found = map[hash]\n if (found) {\n //TODO: Find a better way to scrub meta data without scrubbing _signatures\n if (found.schema === BoundWitnessSchema) {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found), _signatures: (found as BoundWitness)._signatures } as BoundWitness)\n } else {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found) } as Payload)\n }\n } else {\n prev.notfoundHashes.push(hash)\n }\n return prev\n },\n { foundPayloads: [], notfoundHashes: [] },\n )\n\n const [parentFoundPayloads] = await this.getFromParents(notfoundHashes)\n\n if (this.storeParentReads) {\n await this.insertWithConfig(parentFoundPayloads)\n }\n return [...foundPayloads, ...parentFoundPayloads]\n }\n\n protected head(): Promisable<Payload | undefined> {\n return this._lastInsertedPayload\n }\n\n protected insertHandler(_payloads: Payload[]): Promise<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async insertWithConfig(payloads: Payload[], config?: InsertConfig): Promise<Payload[]> {\n const emitEvents = config?.emitEvents ?? true\n const writeToParents = config?.writeToParents ?? true\n\n const insertedPayloads = await this.insertHandler(payloads)\n\n if (writeToParents) {\n await this.writeToParents(insertedPayloads)\n }\n if (emitEvents) {\n await this.emit('inserted', { module: this, payloads: insertedPayloads })\n }\n\n return insertedPayloads\n }\n\n protected async parents() {\n this._parents = this._parents ?? {\n commit: await this.resolveArchivists(this.config?.parents?.commit),\n read: await this.resolveArchivists(this.config?.parents?.read),\n write: await this.resolveArchivists(this.config?.parents?.write),\n }\n return assertEx(this._parents)\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 wrappedQuery = QueryBoundWitnessWrapper.parseQuery<ArchivistQuery>(query, payloads)\n const queryPayload = await wrappedQuery.getQuery()\n assertEx(this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n if (this.config.storeQueries) {\n await this.insertHandler([query])\n }\n\n switch (queryPayload.schema) {\n case ArchivistAllQuerySchema: {\n resultPayloads.push(...(await this.allHandler()))\n break\n }\n case ArchivistClearQuerySchema: {\n await this.clearHandler()\n break\n }\n case ArchivistCommitQuerySchema: {\n resultPayloads.push(...(await this.commitHandler()))\n break\n }\n case ArchivistDeleteQuerySchema: {\n const resultPayload: ArchivistDeleteQuery = {\n hashes: [...(await this.deleteWithConfig(queryPayload.hashes))],\n schema: ArchivistDeleteQuerySchema,\n }\n resultPayloads.push(resultPayload)\n break\n }\n case ArchivistGetQuerySchema: {\n if (queryPayload.hashes?.length) {\n resultPayloads.push(...(await this.getWithConfig(queryPayload.hashes)))\n } else {\n const head = await this.head()\n if (head) resultPayloads.push(head)\n }\n break\n }\n case ArchivistInsertQuerySchema: {\n const payloads = await wrappedQuery.getPayloads()\n assertEx(await wrappedQuery.getPayloads(), `Missing payloads: ${JSON.stringify(wrappedQuery.payload(), null, 2)}`)\n const resolvedPayloads = await PayloadWrapper.filterExclude(payloads, await wrappedQuery.hashAsync())\n assertEx(resolvedPayloads.length === payloads.length, `Could not find some passed hashes [${resolvedPayloads.length} != ${payloads.length}]`)\n resultPayloads.push(...(await this.insertWithConfig(payloads)))\n // NOTE: There isn't an exact equivalence between what we get and what we store. Once\n // we move to returning only inserted Payloads(/hash) instead of a BoundWitness, we\n // can grab the actual last one\n this._lastInsertedPayload = resolvedPayloads.at(-1)\n break\n }\n default: {\n return await super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n protected async writeToParent(parent: ArchivistInstance, payloads: Payload[]) {\n return await parent.insert(payloads)\n }\n\n protected async writeToParents(payloads: Payload[]): Promise<Payload[]> {\n const parents = await this.parents()\n return compact(\n await Promise.all(\n Object.values(parents.write ?? {}).map(async (parent) => {\n return parent ? await this.writeToParent(parent, payloads) : undefined\n }),\n ),\n ).flat()\n }\n\n private async resolveArchivists(archivists: string[] = []) {\n const archivistModules = [...(await this.resolve({ address: archivists })), ...(await this.resolve({ name: archivists }))].filter(\n duplicateModules,\n )\n\n assertEx(\n !this.requireAllParents || archivistModules.length === archivists.length,\n `Failed to find some archivists (set allRequired to false if ok): [${archivists.filter((archivist) =>\n archivistModules.map((module) => !(module.address === archivist || module.config.name === archivist)),\n )}]`,\n )\n\n // eslint-disable-next-line unicorn/no-array-reduce\n return archivistModules.reduce<Record<string, ArchivistInstance>>((prev, module) => {\n prev[module.address] = asArchivistInstance(module, () => {\n isArchivistInstance(module, { log: console })\n return `Unable to cast resolved module to an archivist: [${module.address}, ${module.config.name}, ${module.config.schema})}]`\n })\n\n return prev\n }, {})\n }\n}\n"],"mappings":"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","names":["payloads"]}
1
+ {"version":3,"sources":["../../src/AbstractArchivist.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable, PromisableArray } from '@xylabs/promise'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistDeleteQuery,\n ArchivistDeleteQuerySchema,\n ArchivistGetQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n ArchivistParams,\n ArchivistQuery,\n ArchivistQueryBase,\n asArchivistInstance,\n isArchivistInstance,\n} from '@xyo-network/archivist-model'\nimport { QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, BoundWitnessSchema, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { duplicateModules, ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport interface ActionConfig {\n emitEvents?: boolean\n}\n\nexport interface InsertConfig extends ActionConfig {\n writeToParents?: boolean\n}\n\nexport interface ArchivistParentInstances {\n commit?: Record<string, ArchivistInstance>\n read?: Record<string, ArchivistInstance>\n write?: Record<string, ArchivistInstance>\n}\n\nexport abstract class AbstractArchivist<\n TParams extends ArchivistParams = ArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements ArchivistInstance<TParams>\n{\n private _lastInsertedPayload: Payload | undefined\n private _parents?: ArchivistParentInstances\n\n override get queries(): string[] {\n return [ArchivistGetQuerySchema, ...super.queries]\n }\n\n get requireAllParents() {\n return this.config.requireAllParents ?? false\n }\n\n protected override get _queryAccountPaths(): Record<ArchivistQueryBase['schema'], string> {\n return {\n 'network.xyo.query.archivist.all': '1/1',\n 'network.xyo.query.archivist.clear': '1/2',\n 'network.xyo.query.archivist.commit': '1/3',\n 'network.xyo.query.archivist.delete': '1/4',\n 'network.xyo.query.archivist.get': '1/5',\n 'network.xyo.query.archivist.insert': '1/6',\n }\n }\n\n protected get storeParentReads() {\n return !!this.config?.storeParentReads\n }\n\n all(): PromisableArray<Payload> {\n this._noOverride('all')\n return this.busy(async () => {\n await this.started('throw')\n return await this.allHandler()\n })\n }\n\n clear(): Promisable<void> {\n this._noOverride('clear')\n return this.busy(async () => {\n await this.started('throw')\n return await this.clearHandler()\n })\n }\n\n commit(): Promisable<BoundWitness[]> {\n this._noOverride('commit')\n return this.busy(async () => {\n await this.started('throw')\n return await this.commitHandler()\n })\n }\n\n async delete(hashes: string[]): Promise<string[]> {\n this._noOverride('delete')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.deleteWithConfig(hashes)\n })\n }\n\n async get(hashes: string[]): Promise<Payload[]> {\n this._noOverride('get')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.getWithConfig(hashes)\n })\n }\n\n async insert(payloads: Payload[]): Promise<Payload[]> {\n this._noOverride('insert')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.insertWithConfig(payloads)\n })\n }\n\n protected allHandler(): PromisableArray<Payload> {\n throw new Error('Not implemented')\n }\n\n protected clearHandler(): Promisable<void> {\n throw new Error('Not implemented')\n }\n\n protected commitHandler(): Promisable<BoundWitness[]> {\n throw new Error('Not implemented')\n }\n\n protected deleteHandler(_hashes: string[]): PromisableArray<string> {\n throw new Error('Not implemented')\n }\n\n protected async deleteWithConfig(hashes: string[], config?: ActionConfig): Promise<string[]> {\n const emitEvents = config?.emitEvents ?? true\n\n const deletedHashes = await this.deleteHandler(hashes)\n\n if (emitEvents) {\n await this.emit('deleted', { hashes: deletedHashes, module: this })\n }\n\n return deletedHashes\n }\n\n protected async getFromParent(hashes: string[], archivist: ArchivistInstance): Promise<[Payload[], string[]]> {\n const foundPairs = (\n await Promise.all(\n (await archivist.get(hashes)).map<Promise<[string, Payload]>>(async (payload) => [await PayloadHasher.hashAsync(payload), payload]),\n )\n ).filter(([hash]) => {\n const askedFor = hashes.includes(hash)\n if (!askedFor) {\n console.warn(`Parent returned payload with hash not asked for: ${hash}`)\n //throw Error(`Parent returned payload with hash not asked for: ${hash}`)\n }\n return askedFor\n })\n\n const foundHashes = new Set(foundPairs.map(([hash]) => hash))\n const foundPayloads = foundPairs.map(([, payload]) => payload)\n\n const notfound = hashes.filter((hash) => !foundHashes.has(hash))\n return [foundPayloads, notfound]\n }\n\n protected async getFromParents(hashes: string[]): Promise<[Payload[], string[]]> {\n const parents = Object.values((await this.parents())?.read ?? {})\n let remainingHashes = [...hashes]\n let parentIndex = 0\n let result: Payload[] = []\n\n //intentionally doing this serially\n while (parentIndex < parents.length && remainingHashes.length > 0) {\n const [found, notfound] = await this.getFromParent(remainingHashes, parents[parentIndex])\n result = [...result, ...found]\n remainingHashes = notfound\n parentIndex++\n }\n return [result, remainingHashes]\n }\n\n protected getHandler(_hashes: string[]): Promisable<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async getWithConfig(hashes: string[], config?: InsertConfig): Promise<Payload[]> {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const emitEvents = config?.emitEvents ?? true\n const map = await PayloadWrapper.toMap(await this.getHandler(hashes))\n\n // eslint-disable-next-line unicorn/no-array-reduce\n const { foundPayloads, notfoundHashes } = hashes.reduce<{ foundPayloads: Payload[]; notfoundHashes: string[] }>(\n (prev, hash) => {\n const found = map[hash]\n if (found) {\n //TODO: Find a better way to scrub meta data without scrubbing _signatures\n if (found.schema === BoundWitnessSchema) {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found), _signatures: (found as BoundWitness)._signatures } as BoundWitness)\n } else {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found) } as Payload)\n }\n } else {\n prev.notfoundHashes.push(hash)\n }\n return prev\n },\n { foundPayloads: [], notfoundHashes: [] },\n )\n\n const [parentFoundPayloads] = await this.getFromParents(notfoundHashes)\n\n if (this.storeParentReads) {\n await this.insertWithConfig(parentFoundPayloads)\n }\n return [...foundPayloads, ...parentFoundPayloads]\n }\n\n protected head(): Promisable<Payload | undefined> {\n return this._lastInsertedPayload\n }\n\n protected insertHandler(_payloads: Payload[]): Promise<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async insertWithConfig(payloads: Payload[], config?: InsertConfig): Promise<Payload[]> {\n const emitEvents = config?.emitEvents ?? true\n const writeToParents = config?.writeToParents ?? true\n\n const insertedPayloads = await this.insertHandler(payloads)\n\n if (writeToParents) {\n await this.writeToParents(insertedPayloads)\n }\n if (emitEvents) {\n await this.emit('inserted', { module: this, payloads: insertedPayloads })\n }\n\n return insertedPayloads\n }\n\n protected async parents() {\n this._parents = this._parents ?? {\n commit: await this.resolveArchivists(this.config?.parents?.commit),\n read: await this.resolveArchivists(this.config?.parents?.read),\n write: await this.resolveArchivists(this.config?.parents?.write),\n }\n return assertEx(this._parents)\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 wrappedQuery = QueryBoundWitnessWrapper.parseQuery<ArchivistQuery>(query, payloads)\n const queryPayload = await wrappedQuery.getQuery()\n assertEx(this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n if (this.config.storeQueries) {\n await this.insertHandler([query])\n }\n\n switch (queryPayload.schema) {\n case ArchivistAllQuerySchema: {\n resultPayloads.push(...(await this.allHandler()))\n break\n }\n case ArchivistClearQuerySchema: {\n await this.clearHandler()\n break\n }\n case ArchivistCommitQuerySchema: {\n resultPayloads.push(...(await this.commitHandler()))\n break\n }\n case ArchivistDeleteQuerySchema: {\n const resultPayload: ArchivistDeleteQuery = {\n hashes: [...(await this.deleteWithConfig(queryPayload.hashes))],\n schema: ArchivistDeleteQuerySchema,\n }\n resultPayloads.push(resultPayload)\n break\n }\n case ArchivistGetQuerySchema: {\n if (queryPayload.hashes?.length) {\n resultPayloads.push(...(await this.getWithConfig(queryPayload.hashes)))\n } else {\n const head = await this.head()\n if (head) resultPayloads.push(head)\n }\n break\n }\n case ArchivistInsertQuerySchema: {\n const payloads = await wrappedQuery.getPayloads()\n assertEx(await wrappedQuery.getPayloads(), `Missing payloads: ${JSON.stringify(wrappedQuery.payload(), null, 2)}`)\n const resolvedPayloads = await PayloadWrapper.filterExclude(payloads, await wrappedQuery.hashAsync())\n assertEx(resolvedPayloads.length === payloads.length, `Could not find some passed hashes [${resolvedPayloads.length} != ${payloads.length}]`)\n resultPayloads.push(...(await this.insertWithConfig(payloads)))\n // NOTE: There isn't an exact equivalence between what we get and what we store. Once\n // we move to returning only inserted Payloads(/hash) instead of a BoundWitness, we\n // can grab the actual last one\n this._lastInsertedPayload = resolvedPayloads.at(-1)\n break\n }\n default: {\n return await super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n protected async writeToParent(parent: ArchivistInstance, payloads: Payload[]) {\n return await parent.insert(payloads)\n }\n\n protected async writeToParents(payloads: Payload[]): Promise<Payload[]> {\n const parents = await this.parents()\n return compact(\n await Promise.all(\n Object.values(parents.write ?? {}).map(async (parent) => {\n return parent ? await this.writeToParent(parent, payloads) : undefined\n }),\n ),\n ).flat()\n }\n\n private async resolveArchivists(archivists: string[] = []) {\n const archivistModules = [...(await this.resolve({ address: archivists })), ...(await this.resolve({ name: archivists }))].filter(\n duplicateModules,\n )\n\n assertEx(\n !this.requireAllParents || archivistModules.length === archivists.length,\n `Failed to find some archivists (set allRequired to false if ok): [${archivists.filter((archivist) =>\n archivistModules.map((module) => !(module.address === archivist || module.config.name === archivist)),\n )}]`,\n )\n\n // eslint-disable-next-line unicorn/no-array-reduce\n return archivistModules.reduce<Record<string, ArchivistInstance>>((prev, module) => {\n prev[module.address] = asArchivistInstance(module, () => {\n isArchivistInstance(module, { log: console })\n return `Unable to cast resolved module to an archivist: [${module.address}, ${module.config.name}, ${module.config.schema})}]`\n })\n\n return prev\n }, {})\n }\n}\n"],"mappings":"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","names":["payloads"]}
@@ -41,7 +41,7 @@ var AbstractArchivist = class extends import_module_abstract.AbstractModuleInsta
41
41
  return [import_archivist_model.ArchivistGetQuerySchema, ...super.queries];
42
42
  }
43
43
  get requireAllParents() {
44
- return this.config.requireAllParents ?? true;
44
+ return this.config.requireAllParents ?? false;
45
45
  }
46
46
  get _queryAccountPaths() {
47
47
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/AbstractArchivist.ts"],"sourcesContent":["export * from './AbstractArchivist'\n","import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable, PromisableArray } from '@xylabs/promise'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistDeleteQuery,\n ArchivistDeleteQuerySchema,\n ArchivistGetQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n ArchivistParams,\n ArchivistQuery,\n ArchivistQueryBase,\n asArchivistInstance,\n isArchivistInstance,\n} from '@xyo-network/archivist-model'\nimport { QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, BoundWitnessSchema, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { duplicateModules, ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport interface ActionConfig {\n emitEvents?: boolean\n}\n\nexport interface InsertConfig extends ActionConfig {\n writeToParents?: boolean\n}\n\nexport interface ArchivistParentInstances {\n commit?: Record<string, ArchivistInstance>\n read?: Record<string, ArchivistInstance>\n write?: Record<string, ArchivistInstance>\n}\n\nexport abstract class AbstractArchivist<\n TParams extends ArchivistParams = ArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements ArchivistInstance<TParams>\n{\n private _lastInsertedPayload: Payload | undefined\n private _parents?: ArchivistParentInstances\n\n override get queries(): string[] {\n return [ArchivistGetQuerySchema, ...super.queries]\n }\n\n get requireAllParents() {\n return this.config.requireAllParents ?? true\n }\n\n protected override get _queryAccountPaths(): Record<ArchivistQueryBase['schema'], string> {\n return {\n 'network.xyo.query.archivist.all': '1/1',\n 'network.xyo.query.archivist.clear': '1/2',\n 'network.xyo.query.archivist.commit': '1/3',\n 'network.xyo.query.archivist.delete': '1/4',\n 'network.xyo.query.archivist.get': '1/5',\n 'network.xyo.query.archivist.insert': '1/6',\n }\n }\n\n protected get storeParentReads() {\n return !!this.config?.storeParentReads\n }\n\n all(): PromisableArray<Payload> {\n this._noOverride('all')\n return this.busy(async () => {\n await this.started('throw')\n return await this.allHandler()\n })\n }\n\n clear(): Promisable<void> {\n this._noOverride('clear')\n return this.busy(async () => {\n await this.started('throw')\n return await this.clearHandler()\n })\n }\n\n commit(): Promisable<BoundWitness[]> {\n this._noOverride('commit')\n return this.busy(async () => {\n await this.started('throw')\n return await this.commitHandler()\n })\n }\n\n async delete(hashes: string[]): Promise<string[]> {\n this._noOverride('delete')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.deleteWithConfig(hashes)\n })\n }\n\n async get(hashes: string[]): Promise<Payload[]> {\n this._noOverride('get')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.getWithConfig(hashes)\n })\n }\n\n async insert(payloads: Payload[]): Promise<Payload[]> {\n this._noOverride('insert')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.insertWithConfig(payloads)\n })\n }\n\n protected allHandler(): PromisableArray<Payload> {\n throw new Error('Not implemented')\n }\n\n protected clearHandler(): Promisable<void> {\n throw new Error('Not implemented')\n }\n\n protected commitHandler(): Promisable<BoundWitness[]> {\n throw new Error('Not implemented')\n }\n\n protected deleteHandler(_hashes: string[]): PromisableArray<string> {\n throw new Error('Not implemented')\n }\n\n protected async deleteWithConfig(hashes: string[], config?: ActionConfig): Promise<string[]> {\n const emitEvents = config?.emitEvents ?? true\n\n const deletedHashes = await this.deleteHandler(hashes)\n\n if (emitEvents) {\n await this.emit('deleted', { hashes: deletedHashes, module: this })\n }\n\n return deletedHashes\n }\n\n protected async getFromParent(hashes: string[], archivist: ArchivistInstance): Promise<[Payload[], string[]]> {\n const foundPairs = (\n await Promise.all(\n (await archivist.get(hashes)).map<Promise<[string, Payload]>>(async (payload) => [await PayloadHasher.hashAsync(payload), payload]),\n )\n ).filter(([hash]) => {\n const askedFor = hashes.includes(hash)\n if (!askedFor) {\n console.warn(`Parent returned payload with hash not asked for: ${hash}`)\n //throw Error(`Parent returned payload with hash not asked for: ${hash}`)\n }\n return askedFor\n })\n\n const foundHashes = new Set(foundPairs.map(([hash]) => hash))\n const foundPayloads = foundPairs.map(([, payload]) => payload)\n\n const notfound = hashes.filter((hash) => !foundHashes.has(hash))\n return [foundPayloads, notfound]\n }\n\n protected async getFromParents(hashes: string[]): Promise<[Payload[], string[]]> {\n const parents = Object.values((await this.parents())?.read ?? {})\n let remainingHashes = [...hashes]\n let parentIndex = 0\n let result: Payload[] = []\n\n //intentionally doing this serially\n while (parentIndex < parents.length && remainingHashes.length > 0) {\n const [found, notfound] = await this.getFromParent(remainingHashes, parents[parentIndex])\n result = [...result, ...found]\n remainingHashes = notfound\n parentIndex++\n }\n return [result, remainingHashes]\n }\n\n protected getHandler(_hashes: string[]): Promisable<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async getWithConfig(hashes: string[], config?: InsertConfig): Promise<Payload[]> {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const emitEvents = config?.emitEvents ?? true\n const map = await PayloadWrapper.toMap(await this.getHandler(hashes))\n\n // eslint-disable-next-line unicorn/no-array-reduce\n const { foundPayloads, notfoundHashes } = hashes.reduce<{ foundPayloads: Payload[]; notfoundHashes: string[] }>(\n (prev, hash) => {\n const found = map[hash]\n if (found) {\n //TODO: Find a better way to scrub meta data without scrubbing _signatures\n if (found.schema === BoundWitnessSchema) {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found), _signatures: (found as BoundWitness)._signatures } as BoundWitness)\n } else {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found) } as Payload)\n }\n } else {\n prev.notfoundHashes.push(hash)\n }\n return prev\n },\n { foundPayloads: [], notfoundHashes: [] },\n )\n\n const [parentFoundPayloads] = await this.getFromParents(notfoundHashes)\n\n if (this.storeParentReads) {\n await this.insertWithConfig(parentFoundPayloads)\n }\n return [...foundPayloads, ...parentFoundPayloads]\n }\n\n protected head(): Promisable<Payload | undefined> {\n return this._lastInsertedPayload\n }\n\n protected insertHandler(_payloads: Payload[]): Promise<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async insertWithConfig(payloads: Payload[], config?: InsertConfig): Promise<Payload[]> {\n const emitEvents = config?.emitEvents ?? true\n const writeToParents = config?.writeToParents ?? true\n\n const insertedPayloads = await this.insertHandler(payloads)\n\n if (writeToParents) {\n await this.writeToParents(insertedPayloads)\n }\n if (emitEvents) {\n await this.emit('inserted', { module: this, payloads: insertedPayloads })\n }\n\n return insertedPayloads\n }\n\n protected async parents() {\n this._parents = this._parents ?? {\n commit: await this.resolveArchivists(this.config?.parents?.commit),\n read: await this.resolveArchivists(this.config?.parents?.read),\n write: await this.resolveArchivists(this.config?.parents?.write),\n }\n return assertEx(this._parents)\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 wrappedQuery = QueryBoundWitnessWrapper.parseQuery<ArchivistQuery>(query, payloads)\n const queryPayload = await wrappedQuery.getQuery()\n assertEx(this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n if (this.config.storeQueries) {\n await this.insertHandler([query])\n }\n\n switch (queryPayload.schema) {\n case ArchivistAllQuerySchema: {\n resultPayloads.push(...(await this.allHandler()))\n break\n }\n case ArchivistClearQuerySchema: {\n await this.clearHandler()\n break\n }\n case ArchivistCommitQuerySchema: {\n resultPayloads.push(...(await this.commitHandler()))\n break\n }\n case ArchivistDeleteQuerySchema: {\n const resultPayload: ArchivistDeleteQuery = {\n hashes: [...(await this.deleteWithConfig(queryPayload.hashes))],\n schema: ArchivistDeleteQuerySchema,\n }\n resultPayloads.push(resultPayload)\n break\n }\n case ArchivistGetQuerySchema: {\n if (queryPayload.hashes?.length) {\n resultPayloads.push(...(await this.getWithConfig(queryPayload.hashes)))\n } else {\n const head = await this.head()\n if (head) resultPayloads.push(head)\n }\n break\n }\n case ArchivistInsertQuerySchema: {\n const payloads = await wrappedQuery.getPayloads()\n assertEx(await wrappedQuery.getPayloads(), `Missing payloads: ${JSON.stringify(wrappedQuery.payload(), null, 2)}`)\n const resolvedPayloads = await PayloadWrapper.filterExclude(payloads, await wrappedQuery.hashAsync())\n assertEx(resolvedPayloads.length === payloads.length, `Could not find some passed hashes [${resolvedPayloads.length} != ${payloads.length}]`)\n resultPayloads.push(...(await this.insertWithConfig(payloads)))\n // NOTE: There isn't an exact equivalence between what we get and what we store. Once\n // we move to returning only inserted Payloads(/hash) instead of a BoundWitness, we\n // can grab the actual last one\n this._lastInsertedPayload = resolvedPayloads.at(-1)\n break\n }\n default: {\n return await super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n protected async writeToParent(parent: ArchivistInstance, payloads: Payload[]) {\n return await parent.insert(payloads)\n }\n\n protected async writeToParents(payloads: Payload[]): Promise<Payload[]> {\n const parents = await this.parents()\n return compact(\n await Promise.all(\n Object.values(parents.write ?? {}).map(async (parent) => {\n return parent ? await this.writeToParent(parent, payloads) : undefined\n }),\n ),\n ).flat()\n }\n\n private async resolveArchivists(archivists: string[] = []) {\n const archivistModules = [...(await this.resolve({ address: archivists })), ...(await this.resolve({ name: archivists }))].filter(\n duplicateModules,\n )\n\n assertEx(\n !this.requireAllParents || archivistModules.length === archivists.length,\n `Failed to find some archivists (set allRequired to false if ok): [${archivists.filter((archivist) =>\n archivistModules.map((module) => !(module.address === archivist || module.config.name === archivist)),\n )}]`,\n )\n\n // eslint-disable-next-line unicorn/no-array-reduce\n return archivistModules.reduce<Record<string, ArchivistInstance>>((prev, module) => {\n prev[module.address] = asArchivistInstance(module, () => {\n isArchivistInstance(module, { log: console })\n return `Unable to cast resolved module to an archivist: [${module.address}, ${module.config.name}, ${module.config.schema})}]`\n })\n\n return prev\n }, {})\n }\n}\n"],"mappings":"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","names":["payloads","module"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/AbstractArchivist.ts"],"sourcesContent":["export * from './AbstractArchivist'\n","import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable, PromisableArray } from '@xylabs/promise'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistDeleteQuery,\n ArchivistDeleteQuerySchema,\n ArchivistGetQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n ArchivistParams,\n ArchivistQuery,\n ArchivistQueryBase,\n asArchivistInstance,\n isArchivistInstance,\n} from '@xyo-network/archivist-model'\nimport { QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, BoundWitnessSchema, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { duplicateModules, ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport interface ActionConfig {\n emitEvents?: boolean\n}\n\nexport interface InsertConfig extends ActionConfig {\n writeToParents?: boolean\n}\n\nexport interface ArchivistParentInstances {\n commit?: Record<string, ArchivistInstance>\n read?: Record<string, ArchivistInstance>\n write?: Record<string, ArchivistInstance>\n}\n\nexport abstract class AbstractArchivist<\n TParams extends ArchivistParams = ArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements ArchivistInstance<TParams>\n{\n private _lastInsertedPayload: Payload | undefined\n private _parents?: ArchivistParentInstances\n\n override get queries(): string[] {\n return [ArchivistGetQuerySchema, ...super.queries]\n }\n\n get requireAllParents() {\n return this.config.requireAllParents ?? false\n }\n\n protected override get _queryAccountPaths(): Record<ArchivistQueryBase['schema'], string> {\n return {\n 'network.xyo.query.archivist.all': '1/1',\n 'network.xyo.query.archivist.clear': '1/2',\n 'network.xyo.query.archivist.commit': '1/3',\n 'network.xyo.query.archivist.delete': '1/4',\n 'network.xyo.query.archivist.get': '1/5',\n 'network.xyo.query.archivist.insert': '1/6',\n }\n }\n\n protected get storeParentReads() {\n return !!this.config?.storeParentReads\n }\n\n all(): PromisableArray<Payload> {\n this._noOverride('all')\n return this.busy(async () => {\n await this.started('throw')\n return await this.allHandler()\n })\n }\n\n clear(): Promisable<void> {\n this._noOverride('clear')\n return this.busy(async () => {\n await this.started('throw')\n return await this.clearHandler()\n })\n }\n\n commit(): Promisable<BoundWitness[]> {\n this._noOverride('commit')\n return this.busy(async () => {\n await this.started('throw')\n return await this.commitHandler()\n })\n }\n\n async delete(hashes: string[]): Promise<string[]> {\n this._noOverride('delete')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.deleteWithConfig(hashes)\n })\n }\n\n async get(hashes: string[]): Promise<Payload[]> {\n this._noOverride('get')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.getWithConfig(hashes)\n })\n }\n\n async insert(payloads: Payload[]): Promise<Payload[]> {\n this._noOverride('insert')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.insertWithConfig(payloads)\n })\n }\n\n protected allHandler(): PromisableArray<Payload> {\n throw new Error('Not implemented')\n }\n\n protected clearHandler(): Promisable<void> {\n throw new Error('Not implemented')\n }\n\n protected commitHandler(): Promisable<BoundWitness[]> {\n throw new Error('Not implemented')\n }\n\n protected deleteHandler(_hashes: string[]): PromisableArray<string> {\n throw new Error('Not implemented')\n }\n\n protected async deleteWithConfig(hashes: string[], config?: ActionConfig): Promise<string[]> {\n const emitEvents = config?.emitEvents ?? true\n\n const deletedHashes = await this.deleteHandler(hashes)\n\n if (emitEvents) {\n await this.emit('deleted', { hashes: deletedHashes, module: this })\n }\n\n return deletedHashes\n }\n\n protected async getFromParent(hashes: string[], archivist: ArchivistInstance): Promise<[Payload[], string[]]> {\n const foundPairs = (\n await Promise.all(\n (await archivist.get(hashes)).map<Promise<[string, Payload]>>(async (payload) => [await PayloadHasher.hashAsync(payload), payload]),\n )\n ).filter(([hash]) => {\n const askedFor = hashes.includes(hash)\n if (!askedFor) {\n console.warn(`Parent returned payload with hash not asked for: ${hash}`)\n //throw Error(`Parent returned payload with hash not asked for: ${hash}`)\n }\n return askedFor\n })\n\n const foundHashes = new Set(foundPairs.map(([hash]) => hash))\n const foundPayloads = foundPairs.map(([, payload]) => payload)\n\n const notfound = hashes.filter((hash) => !foundHashes.has(hash))\n return [foundPayloads, notfound]\n }\n\n protected async getFromParents(hashes: string[]): Promise<[Payload[], string[]]> {\n const parents = Object.values((await this.parents())?.read ?? {})\n let remainingHashes = [...hashes]\n let parentIndex = 0\n let result: Payload[] = []\n\n //intentionally doing this serially\n while (parentIndex < parents.length && remainingHashes.length > 0) {\n const [found, notfound] = await this.getFromParent(remainingHashes, parents[parentIndex])\n result = [...result, ...found]\n remainingHashes = notfound\n parentIndex++\n }\n return [result, remainingHashes]\n }\n\n protected getHandler(_hashes: string[]): Promisable<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async getWithConfig(hashes: string[], config?: InsertConfig): Promise<Payload[]> {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const emitEvents = config?.emitEvents ?? true\n const map = await PayloadWrapper.toMap(await this.getHandler(hashes))\n\n // eslint-disable-next-line unicorn/no-array-reduce\n const { foundPayloads, notfoundHashes } = hashes.reduce<{ foundPayloads: Payload[]; notfoundHashes: string[] }>(\n (prev, hash) => {\n const found = map[hash]\n if (found) {\n //TODO: Find a better way to scrub meta data without scrubbing _signatures\n if (found.schema === BoundWitnessSchema) {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found), _signatures: (found as BoundWitness)._signatures } as BoundWitness)\n } else {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found) } as Payload)\n }\n } else {\n prev.notfoundHashes.push(hash)\n }\n return prev\n },\n { foundPayloads: [], notfoundHashes: [] },\n )\n\n const [parentFoundPayloads] = await this.getFromParents(notfoundHashes)\n\n if (this.storeParentReads) {\n await this.insertWithConfig(parentFoundPayloads)\n }\n return [...foundPayloads, ...parentFoundPayloads]\n }\n\n protected head(): Promisable<Payload | undefined> {\n return this._lastInsertedPayload\n }\n\n protected insertHandler(_payloads: Payload[]): Promise<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async insertWithConfig(payloads: Payload[], config?: InsertConfig): Promise<Payload[]> {\n const emitEvents = config?.emitEvents ?? true\n const writeToParents = config?.writeToParents ?? true\n\n const insertedPayloads = await this.insertHandler(payloads)\n\n if (writeToParents) {\n await this.writeToParents(insertedPayloads)\n }\n if (emitEvents) {\n await this.emit('inserted', { module: this, payloads: insertedPayloads })\n }\n\n return insertedPayloads\n }\n\n protected async parents() {\n this._parents = this._parents ?? {\n commit: await this.resolveArchivists(this.config?.parents?.commit),\n read: await this.resolveArchivists(this.config?.parents?.read),\n write: await this.resolveArchivists(this.config?.parents?.write),\n }\n return assertEx(this._parents)\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 wrappedQuery = QueryBoundWitnessWrapper.parseQuery<ArchivistQuery>(query, payloads)\n const queryPayload = await wrappedQuery.getQuery()\n assertEx(this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n if (this.config.storeQueries) {\n await this.insertHandler([query])\n }\n\n switch (queryPayload.schema) {\n case ArchivistAllQuerySchema: {\n resultPayloads.push(...(await this.allHandler()))\n break\n }\n case ArchivistClearQuerySchema: {\n await this.clearHandler()\n break\n }\n case ArchivistCommitQuerySchema: {\n resultPayloads.push(...(await this.commitHandler()))\n break\n }\n case ArchivistDeleteQuerySchema: {\n const resultPayload: ArchivistDeleteQuery = {\n hashes: [...(await this.deleteWithConfig(queryPayload.hashes))],\n schema: ArchivistDeleteQuerySchema,\n }\n resultPayloads.push(resultPayload)\n break\n }\n case ArchivistGetQuerySchema: {\n if (queryPayload.hashes?.length) {\n resultPayloads.push(...(await this.getWithConfig(queryPayload.hashes)))\n } else {\n const head = await this.head()\n if (head) resultPayloads.push(head)\n }\n break\n }\n case ArchivistInsertQuerySchema: {\n const payloads = await wrappedQuery.getPayloads()\n assertEx(await wrappedQuery.getPayloads(), `Missing payloads: ${JSON.stringify(wrappedQuery.payload(), null, 2)}`)\n const resolvedPayloads = await PayloadWrapper.filterExclude(payloads, await wrappedQuery.hashAsync())\n assertEx(resolvedPayloads.length === payloads.length, `Could not find some passed hashes [${resolvedPayloads.length} != ${payloads.length}]`)\n resultPayloads.push(...(await this.insertWithConfig(payloads)))\n // NOTE: There isn't an exact equivalence between what we get and what we store. Once\n // we move to returning only inserted Payloads(/hash) instead of a BoundWitness, we\n // can grab the actual last one\n this._lastInsertedPayload = resolvedPayloads.at(-1)\n break\n }\n default: {\n return await super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n protected async writeToParent(parent: ArchivistInstance, payloads: Payload[]) {\n return await parent.insert(payloads)\n }\n\n protected async writeToParents(payloads: Payload[]): Promise<Payload[]> {\n const parents = await this.parents()\n return compact(\n await Promise.all(\n Object.values(parents.write ?? {}).map(async (parent) => {\n return parent ? await this.writeToParent(parent, payloads) : undefined\n }),\n ),\n ).flat()\n }\n\n private async resolveArchivists(archivists: string[] = []) {\n const archivistModules = [...(await this.resolve({ address: archivists })), ...(await this.resolve({ name: archivists }))].filter(\n duplicateModules,\n )\n\n assertEx(\n !this.requireAllParents || archivistModules.length === archivists.length,\n `Failed to find some archivists (set allRequired to false if ok): [${archivists.filter((archivist) =>\n archivistModules.map((module) => !(module.address === archivist || module.config.name === archivist)),\n )}]`,\n )\n\n // eslint-disable-next-line unicorn/no-array-reduce\n return archivistModules.reduce<Record<string, ArchivistInstance>>((prev, module) => {\n prev[module.address] = asArchivistInstance(module, () => {\n isArchivistInstance(module, { log: console })\n return `Unable to cast resolved module to an archivist: [${module.address}, ${module.config.name}, ${module.config.schema})}]`\n })\n\n return prev\n }, {})\n }\n}\n"],"mappings":"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","names":["payloads","module"]}
@@ -24,7 +24,7 @@ var AbstractArchivist = class extends AbstractModuleInstance {
24
24
  return [ArchivistGetQuerySchema, ...super.queries];
25
25
  }
26
26
  get requireAllParents() {
27
- return this.config.requireAllParents ?? true;
27
+ return this.config.requireAllParents ?? false;
28
28
  }
29
29
  get _queryAccountPaths() {
30
30
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/AbstractArchivist.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable, PromisableArray } from '@xylabs/promise'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistDeleteQuery,\n ArchivistDeleteQuerySchema,\n ArchivistGetQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n ArchivistParams,\n ArchivistQuery,\n ArchivistQueryBase,\n asArchivistInstance,\n isArchivistInstance,\n} from '@xyo-network/archivist-model'\nimport { QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, BoundWitnessSchema, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { duplicateModules, ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport interface ActionConfig {\n emitEvents?: boolean\n}\n\nexport interface InsertConfig extends ActionConfig {\n writeToParents?: boolean\n}\n\nexport interface ArchivistParentInstances {\n commit?: Record<string, ArchivistInstance>\n read?: Record<string, ArchivistInstance>\n write?: Record<string, ArchivistInstance>\n}\n\nexport abstract class AbstractArchivist<\n TParams extends ArchivistParams = ArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements ArchivistInstance<TParams>\n{\n private _lastInsertedPayload: Payload | undefined\n private _parents?: ArchivistParentInstances\n\n override get queries(): string[] {\n return [ArchivistGetQuerySchema, ...super.queries]\n }\n\n get requireAllParents() {\n return this.config.requireAllParents ?? true\n }\n\n protected override get _queryAccountPaths(): Record<ArchivistQueryBase['schema'], string> {\n return {\n 'network.xyo.query.archivist.all': '1/1',\n 'network.xyo.query.archivist.clear': '1/2',\n 'network.xyo.query.archivist.commit': '1/3',\n 'network.xyo.query.archivist.delete': '1/4',\n 'network.xyo.query.archivist.get': '1/5',\n 'network.xyo.query.archivist.insert': '1/6',\n }\n }\n\n protected get storeParentReads() {\n return !!this.config?.storeParentReads\n }\n\n all(): PromisableArray<Payload> {\n this._noOverride('all')\n return this.busy(async () => {\n await this.started('throw')\n return await this.allHandler()\n })\n }\n\n clear(): Promisable<void> {\n this._noOverride('clear')\n return this.busy(async () => {\n await this.started('throw')\n return await this.clearHandler()\n })\n }\n\n commit(): Promisable<BoundWitness[]> {\n this._noOverride('commit')\n return this.busy(async () => {\n await this.started('throw')\n return await this.commitHandler()\n })\n }\n\n async delete(hashes: string[]): Promise<string[]> {\n this._noOverride('delete')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.deleteWithConfig(hashes)\n })\n }\n\n async get(hashes: string[]): Promise<Payload[]> {\n this._noOverride('get')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.getWithConfig(hashes)\n })\n }\n\n async insert(payloads: Payload[]): Promise<Payload[]> {\n this._noOverride('insert')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.insertWithConfig(payloads)\n })\n }\n\n protected allHandler(): PromisableArray<Payload> {\n throw new Error('Not implemented')\n }\n\n protected clearHandler(): Promisable<void> {\n throw new Error('Not implemented')\n }\n\n protected commitHandler(): Promisable<BoundWitness[]> {\n throw new Error('Not implemented')\n }\n\n protected deleteHandler(_hashes: string[]): PromisableArray<string> {\n throw new Error('Not implemented')\n }\n\n protected async deleteWithConfig(hashes: string[], config?: ActionConfig): Promise<string[]> {\n const emitEvents = config?.emitEvents ?? true\n\n const deletedHashes = await this.deleteHandler(hashes)\n\n if (emitEvents) {\n await this.emit('deleted', { hashes: deletedHashes, module: this })\n }\n\n return deletedHashes\n }\n\n protected async getFromParent(hashes: string[], archivist: ArchivistInstance): Promise<[Payload[], string[]]> {\n const foundPairs = (\n await Promise.all(\n (await archivist.get(hashes)).map<Promise<[string, Payload]>>(async (payload) => [await PayloadHasher.hashAsync(payload), payload]),\n )\n ).filter(([hash]) => {\n const askedFor = hashes.includes(hash)\n if (!askedFor) {\n console.warn(`Parent returned payload with hash not asked for: ${hash}`)\n //throw Error(`Parent returned payload with hash not asked for: ${hash}`)\n }\n return askedFor\n })\n\n const foundHashes = new Set(foundPairs.map(([hash]) => hash))\n const foundPayloads = foundPairs.map(([, payload]) => payload)\n\n const notfound = hashes.filter((hash) => !foundHashes.has(hash))\n return [foundPayloads, notfound]\n }\n\n protected async getFromParents(hashes: string[]): Promise<[Payload[], string[]]> {\n const parents = Object.values((await this.parents())?.read ?? {})\n let remainingHashes = [...hashes]\n let parentIndex = 0\n let result: Payload[] = []\n\n //intentionally doing this serially\n while (parentIndex < parents.length && remainingHashes.length > 0) {\n const [found, notfound] = await this.getFromParent(remainingHashes, parents[parentIndex])\n result = [...result, ...found]\n remainingHashes = notfound\n parentIndex++\n }\n return [result, remainingHashes]\n }\n\n protected getHandler(_hashes: string[]): Promisable<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async getWithConfig(hashes: string[], config?: InsertConfig): Promise<Payload[]> {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const emitEvents = config?.emitEvents ?? true\n const map = await PayloadWrapper.toMap(await this.getHandler(hashes))\n\n // eslint-disable-next-line unicorn/no-array-reduce\n const { foundPayloads, notfoundHashes } = hashes.reduce<{ foundPayloads: Payload[]; notfoundHashes: string[] }>(\n (prev, hash) => {\n const found = map[hash]\n if (found) {\n //TODO: Find a better way to scrub meta data without scrubbing _signatures\n if (found.schema === BoundWitnessSchema) {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found), _signatures: (found as BoundWitness)._signatures } as BoundWitness)\n } else {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found) } as Payload)\n }\n } else {\n prev.notfoundHashes.push(hash)\n }\n return prev\n },\n { foundPayloads: [], notfoundHashes: [] },\n )\n\n const [parentFoundPayloads] = await this.getFromParents(notfoundHashes)\n\n if (this.storeParentReads) {\n await this.insertWithConfig(parentFoundPayloads)\n }\n return [...foundPayloads, ...parentFoundPayloads]\n }\n\n protected head(): Promisable<Payload | undefined> {\n return this._lastInsertedPayload\n }\n\n protected insertHandler(_payloads: Payload[]): Promise<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async insertWithConfig(payloads: Payload[], config?: InsertConfig): Promise<Payload[]> {\n const emitEvents = config?.emitEvents ?? true\n const writeToParents = config?.writeToParents ?? true\n\n const insertedPayloads = await this.insertHandler(payloads)\n\n if (writeToParents) {\n await this.writeToParents(insertedPayloads)\n }\n if (emitEvents) {\n await this.emit('inserted', { module: this, payloads: insertedPayloads })\n }\n\n return insertedPayloads\n }\n\n protected async parents() {\n this._parents = this._parents ?? {\n commit: await this.resolveArchivists(this.config?.parents?.commit),\n read: await this.resolveArchivists(this.config?.parents?.read),\n write: await this.resolveArchivists(this.config?.parents?.write),\n }\n return assertEx(this._parents)\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 wrappedQuery = QueryBoundWitnessWrapper.parseQuery<ArchivistQuery>(query, payloads)\n const queryPayload = await wrappedQuery.getQuery()\n assertEx(this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n if (this.config.storeQueries) {\n await this.insertHandler([query])\n }\n\n switch (queryPayload.schema) {\n case ArchivistAllQuerySchema: {\n resultPayloads.push(...(await this.allHandler()))\n break\n }\n case ArchivistClearQuerySchema: {\n await this.clearHandler()\n break\n }\n case ArchivistCommitQuerySchema: {\n resultPayloads.push(...(await this.commitHandler()))\n break\n }\n case ArchivistDeleteQuerySchema: {\n const resultPayload: ArchivistDeleteQuery = {\n hashes: [...(await this.deleteWithConfig(queryPayload.hashes))],\n schema: ArchivistDeleteQuerySchema,\n }\n resultPayloads.push(resultPayload)\n break\n }\n case ArchivistGetQuerySchema: {\n if (queryPayload.hashes?.length) {\n resultPayloads.push(...(await this.getWithConfig(queryPayload.hashes)))\n } else {\n const head = await this.head()\n if (head) resultPayloads.push(head)\n }\n break\n }\n case ArchivistInsertQuerySchema: {\n const payloads = await wrappedQuery.getPayloads()\n assertEx(await wrappedQuery.getPayloads(), `Missing payloads: ${JSON.stringify(wrappedQuery.payload(), null, 2)}`)\n const resolvedPayloads = await PayloadWrapper.filterExclude(payloads, await wrappedQuery.hashAsync())\n assertEx(resolvedPayloads.length === payloads.length, `Could not find some passed hashes [${resolvedPayloads.length} != ${payloads.length}]`)\n resultPayloads.push(...(await this.insertWithConfig(payloads)))\n // NOTE: There isn't an exact equivalence between what we get and what we store. Once\n // we move to returning only inserted Payloads(/hash) instead of a BoundWitness, we\n // can grab the actual last one\n this._lastInsertedPayload = resolvedPayloads.at(-1)\n break\n }\n default: {\n return await super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n protected async writeToParent(parent: ArchivistInstance, payloads: Payload[]) {\n return await parent.insert(payloads)\n }\n\n protected async writeToParents(payloads: Payload[]): Promise<Payload[]> {\n const parents = await this.parents()\n return compact(\n await Promise.all(\n Object.values(parents.write ?? {}).map(async (parent) => {\n return parent ? await this.writeToParent(parent, payloads) : undefined\n }),\n ),\n ).flat()\n }\n\n private async resolveArchivists(archivists: string[] = []) {\n const archivistModules = [...(await this.resolve({ address: archivists })), ...(await this.resolve({ name: archivists }))].filter(\n duplicateModules,\n )\n\n assertEx(\n !this.requireAllParents || archivistModules.length === archivists.length,\n `Failed to find some archivists (set allRequired to false if ok): [${archivists.filter((archivist) =>\n archivistModules.map((module) => !(module.address === archivist || module.config.name === archivist)),\n )}]`,\n )\n\n // eslint-disable-next-line unicorn/no-array-reduce\n return archivistModules.reduce<Record<string, ArchivistInstance>>((prev, module) => {\n prev[module.address] = asArchivistInstance(module, () => {\n isArchivistInstance(module, { log: console })\n return `Unable to cast resolved module to an archivist: [${module.address}, ${module.config.name}, ${module.config.schema})}]`\n })\n\n return prev\n }, {})\n }\n}\n"],"mappings":"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","names":["payloads"]}
1
+ {"version":3,"sources":["../../src/AbstractArchivist.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable, PromisableArray } from '@xylabs/promise'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistDeleteQuery,\n ArchivistDeleteQuerySchema,\n ArchivistGetQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n ArchivistParams,\n ArchivistQuery,\n ArchivistQueryBase,\n asArchivistInstance,\n isArchivistInstance,\n} from '@xyo-network/archivist-model'\nimport { QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, BoundWitnessSchema, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { duplicateModules, ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport interface ActionConfig {\n emitEvents?: boolean\n}\n\nexport interface InsertConfig extends ActionConfig {\n writeToParents?: boolean\n}\n\nexport interface ArchivistParentInstances {\n commit?: Record<string, ArchivistInstance>\n read?: Record<string, ArchivistInstance>\n write?: Record<string, ArchivistInstance>\n}\n\nexport abstract class AbstractArchivist<\n TParams extends ArchivistParams = ArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements ArchivistInstance<TParams>\n{\n private _lastInsertedPayload: Payload | undefined\n private _parents?: ArchivistParentInstances\n\n override get queries(): string[] {\n return [ArchivistGetQuerySchema, ...super.queries]\n }\n\n get requireAllParents() {\n return this.config.requireAllParents ?? false\n }\n\n protected override get _queryAccountPaths(): Record<ArchivistQueryBase['schema'], string> {\n return {\n 'network.xyo.query.archivist.all': '1/1',\n 'network.xyo.query.archivist.clear': '1/2',\n 'network.xyo.query.archivist.commit': '1/3',\n 'network.xyo.query.archivist.delete': '1/4',\n 'network.xyo.query.archivist.get': '1/5',\n 'network.xyo.query.archivist.insert': '1/6',\n }\n }\n\n protected get storeParentReads() {\n return !!this.config?.storeParentReads\n }\n\n all(): PromisableArray<Payload> {\n this._noOverride('all')\n return this.busy(async () => {\n await this.started('throw')\n return await this.allHandler()\n })\n }\n\n clear(): Promisable<void> {\n this._noOverride('clear')\n return this.busy(async () => {\n await this.started('throw')\n return await this.clearHandler()\n })\n }\n\n commit(): Promisable<BoundWitness[]> {\n this._noOverride('commit')\n return this.busy(async () => {\n await this.started('throw')\n return await this.commitHandler()\n })\n }\n\n async delete(hashes: string[]): Promise<string[]> {\n this._noOverride('delete')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.deleteWithConfig(hashes)\n })\n }\n\n async get(hashes: string[]): Promise<Payload[]> {\n this._noOverride('get')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.getWithConfig(hashes)\n })\n }\n\n async insert(payloads: Payload[]): Promise<Payload[]> {\n this._noOverride('insert')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.insertWithConfig(payloads)\n })\n }\n\n protected allHandler(): PromisableArray<Payload> {\n throw new Error('Not implemented')\n }\n\n protected clearHandler(): Promisable<void> {\n throw new Error('Not implemented')\n }\n\n protected commitHandler(): Promisable<BoundWitness[]> {\n throw new Error('Not implemented')\n }\n\n protected deleteHandler(_hashes: string[]): PromisableArray<string> {\n throw new Error('Not implemented')\n }\n\n protected async deleteWithConfig(hashes: string[], config?: ActionConfig): Promise<string[]> {\n const emitEvents = config?.emitEvents ?? true\n\n const deletedHashes = await this.deleteHandler(hashes)\n\n if (emitEvents) {\n await this.emit('deleted', { hashes: deletedHashes, module: this })\n }\n\n return deletedHashes\n }\n\n protected async getFromParent(hashes: string[], archivist: ArchivistInstance): Promise<[Payload[], string[]]> {\n const foundPairs = (\n await Promise.all(\n (await archivist.get(hashes)).map<Promise<[string, Payload]>>(async (payload) => [await PayloadHasher.hashAsync(payload), payload]),\n )\n ).filter(([hash]) => {\n const askedFor = hashes.includes(hash)\n if (!askedFor) {\n console.warn(`Parent returned payload with hash not asked for: ${hash}`)\n //throw Error(`Parent returned payload with hash not asked for: ${hash}`)\n }\n return askedFor\n })\n\n const foundHashes = new Set(foundPairs.map(([hash]) => hash))\n const foundPayloads = foundPairs.map(([, payload]) => payload)\n\n const notfound = hashes.filter((hash) => !foundHashes.has(hash))\n return [foundPayloads, notfound]\n }\n\n protected async getFromParents(hashes: string[]): Promise<[Payload[], string[]]> {\n const parents = Object.values((await this.parents())?.read ?? {})\n let remainingHashes = [...hashes]\n let parentIndex = 0\n let result: Payload[] = []\n\n //intentionally doing this serially\n while (parentIndex < parents.length && remainingHashes.length > 0) {\n const [found, notfound] = await this.getFromParent(remainingHashes, parents[parentIndex])\n result = [...result, ...found]\n remainingHashes = notfound\n parentIndex++\n }\n return [result, remainingHashes]\n }\n\n protected getHandler(_hashes: string[]): Promisable<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async getWithConfig(hashes: string[], config?: InsertConfig): Promise<Payload[]> {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const emitEvents = config?.emitEvents ?? true\n const map = await PayloadWrapper.toMap(await this.getHandler(hashes))\n\n // eslint-disable-next-line unicorn/no-array-reduce\n const { foundPayloads, notfoundHashes } = hashes.reduce<{ foundPayloads: Payload[]; notfoundHashes: string[] }>(\n (prev, hash) => {\n const found = map[hash]\n if (found) {\n //TODO: Find a better way to scrub meta data without scrubbing _signatures\n if (found.schema === BoundWitnessSchema) {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found), _signatures: (found as BoundWitness)._signatures } as BoundWitness)\n } else {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found) } as Payload)\n }\n } else {\n prev.notfoundHashes.push(hash)\n }\n return prev\n },\n { foundPayloads: [], notfoundHashes: [] },\n )\n\n const [parentFoundPayloads] = await this.getFromParents(notfoundHashes)\n\n if (this.storeParentReads) {\n await this.insertWithConfig(parentFoundPayloads)\n }\n return [...foundPayloads, ...parentFoundPayloads]\n }\n\n protected head(): Promisable<Payload | undefined> {\n return this._lastInsertedPayload\n }\n\n protected insertHandler(_payloads: Payload[]): Promise<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async insertWithConfig(payloads: Payload[], config?: InsertConfig): Promise<Payload[]> {\n const emitEvents = config?.emitEvents ?? true\n const writeToParents = config?.writeToParents ?? true\n\n const insertedPayloads = await this.insertHandler(payloads)\n\n if (writeToParents) {\n await this.writeToParents(insertedPayloads)\n }\n if (emitEvents) {\n await this.emit('inserted', { module: this, payloads: insertedPayloads })\n }\n\n return insertedPayloads\n }\n\n protected async parents() {\n this._parents = this._parents ?? {\n commit: await this.resolveArchivists(this.config?.parents?.commit),\n read: await this.resolveArchivists(this.config?.parents?.read),\n write: await this.resolveArchivists(this.config?.parents?.write),\n }\n return assertEx(this._parents)\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 wrappedQuery = QueryBoundWitnessWrapper.parseQuery<ArchivistQuery>(query, payloads)\n const queryPayload = await wrappedQuery.getQuery()\n assertEx(this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n if (this.config.storeQueries) {\n await this.insertHandler([query])\n }\n\n switch (queryPayload.schema) {\n case ArchivistAllQuerySchema: {\n resultPayloads.push(...(await this.allHandler()))\n break\n }\n case ArchivistClearQuerySchema: {\n await this.clearHandler()\n break\n }\n case ArchivistCommitQuerySchema: {\n resultPayloads.push(...(await this.commitHandler()))\n break\n }\n case ArchivistDeleteQuerySchema: {\n const resultPayload: ArchivistDeleteQuery = {\n hashes: [...(await this.deleteWithConfig(queryPayload.hashes))],\n schema: ArchivistDeleteQuerySchema,\n }\n resultPayloads.push(resultPayload)\n break\n }\n case ArchivistGetQuerySchema: {\n if (queryPayload.hashes?.length) {\n resultPayloads.push(...(await this.getWithConfig(queryPayload.hashes)))\n } else {\n const head = await this.head()\n if (head) resultPayloads.push(head)\n }\n break\n }\n case ArchivistInsertQuerySchema: {\n const payloads = await wrappedQuery.getPayloads()\n assertEx(await wrappedQuery.getPayloads(), `Missing payloads: ${JSON.stringify(wrappedQuery.payload(), null, 2)}`)\n const resolvedPayloads = await PayloadWrapper.filterExclude(payloads, await wrappedQuery.hashAsync())\n assertEx(resolvedPayloads.length === payloads.length, `Could not find some passed hashes [${resolvedPayloads.length} != ${payloads.length}]`)\n resultPayloads.push(...(await this.insertWithConfig(payloads)))\n // NOTE: There isn't an exact equivalence between what we get and what we store. Once\n // we move to returning only inserted Payloads(/hash) instead of a BoundWitness, we\n // can grab the actual last one\n this._lastInsertedPayload = resolvedPayloads.at(-1)\n break\n }\n default: {\n return await super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n protected async writeToParent(parent: ArchivistInstance, payloads: Payload[]) {\n return await parent.insert(payloads)\n }\n\n protected async writeToParents(payloads: Payload[]): Promise<Payload[]> {\n const parents = await this.parents()\n return compact(\n await Promise.all(\n Object.values(parents.write ?? {}).map(async (parent) => {\n return parent ? await this.writeToParent(parent, payloads) : undefined\n }),\n ),\n ).flat()\n }\n\n private async resolveArchivists(archivists: string[] = []) {\n const archivistModules = [...(await this.resolve({ address: archivists })), ...(await this.resolve({ name: archivists }))].filter(\n duplicateModules,\n )\n\n assertEx(\n !this.requireAllParents || archivistModules.length === archivists.length,\n `Failed to find some archivists (set allRequired to false if ok): [${archivists.filter((archivist) =>\n archivistModules.map((module) => !(module.address === archivist || module.config.name === archivist)),\n )}]`,\n )\n\n // eslint-disable-next-line unicorn/no-array-reduce\n return archivistModules.reduce<Record<string, ArchivistInstance>>((prev, module) => {\n prev[module.address] = asArchivistInstance(module, () => {\n isArchivistInstance(module, { log: console })\n return `Unable to cast resolved module to an archivist: [${module.address}, ${module.config.name}, ${module.config.schema})}]`\n })\n\n return prev\n }, {})\n }\n}\n"],"mappings":"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","names":["payloads"]}
package/package.json CHANGED
@@ -13,14 +13,14 @@
13
13
  "@xylabs/assert": "^2.13.20",
14
14
  "@xylabs/lodash": "^2.13.20",
15
15
  "@xylabs/promise": "^2.13.20",
16
- "@xyo-network/archivist-model": "~2.84.10",
17
- "@xyo-network/boundwitness-builder": "~2.84.10",
18
- "@xyo-network/boundwitness-model": "~2.84.10",
19
- "@xyo-network/hash": "~2.84.10",
20
- "@xyo-network/module-abstract": "~2.84.10",
21
- "@xyo-network/module-model": "~2.84.10",
22
- "@xyo-network/payload-model": "~2.84.10",
23
- "@xyo-network/payload-wrapper": "~2.84.10"
16
+ "@xyo-network/archivist-model": "~2.84.12",
17
+ "@xyo-network/boundwitness-builder": "~2.84.12",
18
+ "@xyo-network/boundwitness-model": "~2.84.12",
19
+ "@xyo-network/hash": "~2.84.12",
20
+ "@xyo-network/module-abstract": "~2.84.12",
21
+ "@xyo-network/module-model": "~2.84.12",
22
+ "@xyo-network/payload-model": "~2.84.12",
23
+ "@xyo-network/payload-wrapper": "~2.84.12"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@xylabs/ts-scripts-yarn3": "^3.2.25",
@@ -66,6 +66,6 @@
66
66
  },
67
67
  "sideEffects": false,
68
68
  "types": "dist/node/index.d.ts",
69
- "version": "2.84.10",
69
+ "version": "2.84.12",
70
70
  "type": "module"
71
71
  }
@@ -54,7 +54,7 @@ export abstract class AbstractArchivist<
54
54
  }
55
55
 
56
56
  get requireAllParents() {
57
- return this.config.requireAllParents ?? true
57
+ return this.config.requireAllParents ?? false
58
58
  }
59
59
 
60
60
  protected override get _queryAccountPaths(): Record<ArchivistQueryBase['schema'], string> {