@xyo-network/archivist-mongodb 5.3.22 → 5.3.25

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.
@@ -17,10 +17,10 @@ declare const MongoDBArchivistBase: (abstract new (...args: any[]) => {
17
17
  id: string;
18
18
  modName?: import("@xyo-network/module-model").ModuleName;
19
19
  params: import("@xyo-network/module-model-mongodb").MongoDBModuleParams;
20
- previousHash: () => import("@xylabs/promise").Promisable<string | undefined>;
20
+ previousHash: () => import("@xylabs/sdk-js").Promisable<string | undefined>;
21
21
  queries: string[];
22
- query: <T extends import("@xyo-network/boundwitness-model").QueryBoundWitness = import("@xyo-network/boundwitness-model").QueryBoundWitness, TConf extends import("@xyo-network/module-model").ModuleConfig = import("@xyo-network/module-model").ModuleConfig>(query: T, payloads?: import("@xyo-network/payload-model").Payload[], queryConfig?: TConf) => import("@xylabs/promise").Promisable<import("@xyo-network/module-model").ModuleQueryResult>;
23
- queryable: <T extends import("@xyo-network/boundwitness-model").QueryBoundWitness = import("@xyo-network/boundwitness-model").QueryBoundWitness, TConf_1 extends import("@xyo-network/module-model").ModuleConfig = import("@xyo-network/module-model").ModuleConfig>(query: T, payloads?: import("@xyo-network/payload-model").Payload[], queryConfig?: TConf_1) => import("@xylabs/promise").Promisable<boolean>;
22
+ query: <T extends import("@xyo-network/boundwitness-model").QueryBoundWitness = import("@xyo-network/boundwitness-model").QueryBoundWitness, TConf extends import("@xyo-network/module-model").ModuleConfig = import("@xyo-network/module-model").ModuleConfig>(query: T, payloads?: import("@xyo-network/payload-model").Payload[], queryConfig?: TConf) => import("@xylabs/sdk-js").Promisable<import("@xyo-network/module-model").ModuleQueryResult>;
23
+ queryable: <T extends import("@xyo-network/boundwitness-model").QueryBoundWitness = import("@xyo-network/boundwitness-model").QueryBoundWitness, TConf_1 extends import("@xyo-network/module-model").ModuleConfig = import("@xyo-network/module-model").ModuleConfig>(query: T, payloads?: import("@xyo-network/payload-model").Payload[], queryConfig?: TConf_1) => import("@xylabs/sdk-js").Promisable<boolean>;
24
24
  eventData: import("@xyo-network/module-model").ModuleEventData<object>;
25
25
  name: import("@xylabs/sdk-js").CreatableName;
26
26
  start: () => Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"Archivist.d.ts","sourceRoot":"","sources":["../../src/Archivist.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AAE1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAKxE,OAAO,KAAK,EACV,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAC3C,MAAM,4BAA4B,CAAA;AACnC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAMxE,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;;sRAsBe,CAAC,6DAEhC,CAAA;4RAca,CAAC,6DAClB,CAAF;;;;;;;;;;;;;;;;4BAvC8D,CAAA;AAElE,qBAAa,gBAAiB,SAAQ,oBAAoB;IACxD,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAyD;IACzG,gBAAyB,mBAAmB,EAAE,MAAM,CAA+B;IAE1E,OAAO;;SAA2E;IAE3F;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,kBAAkB,SAAS;cAE9B,aAAa,CAAC,IAAI,EAAE,IAAI;cAoBxB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ;cAU3B,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;cA6B/D,aAAa,CAAC,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;cAmBxF,WAAW,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;cAkEhF,YAAY;CAItC"}
1
+ {"version":3,"file":"Archivist.d.ts","sourceRoot":"","sources":["../../src/Archivist.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AAE1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAKxE,OAAO,KAAK,EACV,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAC3C,MAAM,4BAA4B,CAAA;AACnC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAMxE,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;;sRAsBc,CAAC,6DAE/B,CAAD;4RAcY,CAAC,6DAChB,CAAJ;;;;;;;;;;;;;;;;4BAvCgE,CAAA;AAElE,qBAAa,gBAAiB,SAAQ,oBAAoB;IACxD,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAyD;IACzG,gBAAyB,mBAAmB,EAAE,MAAM,CAA+B;IAE1E,OAAO;;SAA2E;IAE3F;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,kBAAkB,SAAS;cAE9B,aAAa,CAAC,IAAI,EAAE,IAAI;cAoBxB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ;cAU3B,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;cA6B/D,aAAa,CAAC,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;cAmBxF,WAAW,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;cAkEhF,YAAY;CAItC"}
@@ -14,10 +14,10 @@ declare const MongoDBArchivistBaseV2: (abstract new (...args: any[]) => {
14
14
  id: string;
15
15
  modName?: import("@xyo-network/module-model").ModuleName;
16
16
  params: import("@xyo-network/module-model-mongodb").MongoDBModuleParamsV2<import("@xyo-network/module-model").AnyConfigSchema<import("@xyo-network/module-model-mongodb").MongoDBModuleConfigV2>>;
17
- previousHash: () => import("@xylabs/promise").Promisable<string | undefined>;
17
+ previousHash: () => import("@xylabs/sdk-js").Promisable<string | undefined>;
18
18
  queries: string[];
19
- query: <T extends import("@xyo-network/boundwitness-model").QueryBoundWitness = import("@xyo-network/boundwitness-model").QueryBoundWitness, TConf extends import("@xyo-network/module-model").ModuleConfig = import("@xyo-network/module-model").ModuleConfig>(query: T, payloads?: import("@xyo-network/payload-model").Payload[], queryConfig?: TConf) => import("@xylabs/promise").Promisable<import("@xyo-network/module-model").ModuleQueryResult>;
20
- queryable: <T extends import("@xyo-network/boundwitness-model").QueryBoundWitness = import("@xyo-network/boundwitness-model").QueryBoundWitness, TConf_1 extends import("@xyo-network/module-model").ModuleConfig = import("@xyo-network/module-model").ModuleConfig>(query: T, payloads?: import("@xyo-network/payload-model").Payload[], queryConfig?: TConf_1) => import("@xylabs/promise").Promisable<boolean>;
19
+ query: <T extends import("@xyo-network/boundwitness-model").QueryBoundWitness = import("@xyo-network/boundwitness-model").QueryBoundWitness, TConf extends import("@xyo-network/module-model").ModuleConfig = import("@xyo-network/module-model").ModuleConfig>(query: T, payloads?: import("@xyo-network/payload-model").Payload[], queryConfig?: TConf) => import("@xylabs/sdk-js").Promisable<import("@xyo-network/module-model").ModuleQueryResult>;
20
+ queryable: <T extends import("@xyo-network/boundwitness-model").QueryBoundWitness = import("@xyo-network/boundwitness-model").QueryBoundWitness, TConf_1 extends import("@xyo-network/module-model").ModuleConfig = import("@xyo-network/module-model").ModuleConfig>(query: T, payloads?: import("@xyo-network/payload-model").Payload[], queryConfig?: TConf_1) => import("@xylabs/sdk-js").Promisable<boolean>;
21
21
  eventData: import("@xyo-network/module-model").ModuleEventData<object>;
22
22
  name: import("@xylabs/sdk-js").CreatableName;
23
23
  start: () => Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"ArchivistV2.d.ts","sourceRoot":"","sources":["../../src/ArchivistV2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AAE1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAOxE,OAAO,EACL,KAAK,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EACxC,KAAK,eAAe,EACrB,MAAM,4BAA4B,CAAA;AACnC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAIxE,QAAA,MAAM,sBAAsB;;;;;;;;;;;;;sRAeb,CAAC,6DAA6D,CAAC;4RAWnE,CAAA,6DACiD,CAAA;;;;;;;;;;;;;;;;4BA3BU,CAAA;AAItE,qBAAa,kBAAmB,SAAQ,sBAAsB;IAC5D,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAyD;IACzG,gBAAyB,mBAAmB,EAAE,MAAM,CAA+B;IAEnF,SAAkB,OAAO,EAAE,MAAM,EAAE,CAA2E;IAE9G;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,kBAAkB,SAAS;cAErB,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;cAO3E,aAAa,CAAC,IAAI,EAAE,IAAI;cAYxB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ;cAO3B,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;cAiB/D,aAAa,CAAC,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;cAgBxF,WAAW,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;cAwDhF,YAAY;CAItC;AAED,qBAAa,2BAA4B,SAAQ,kBAAkB;IACjE,SAAkB,OAAO,EAAE,MAAM,EAAE,CAMlC;CACF"}
1
+ {"version":3,"file":"ArchivistV2.d.ts","sourceRoot":"","sources":["../../src/ArchivistV2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AAE1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAOxE,OAAO,EACL,KAAK,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EACxC,KAAK,eAAe,EACrB,MAAM,4BAA4B,CAAA;AACnC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAIxE,QAAA,MAAM,sBAAsB;;;;;;;;;;;;;sRAed,CAAC,6DAA6D,CAAC;4RAWrE,CAAC,6DACgD,CAAC;;;;;;;;;;;;;;;;4BA3BY,CAAA;AAItE,qBAAa,kBAAmB,SAAQ,sBAAsB;IAC5D,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAyD;IACzG,gBAAyB,mBAAmB,EAAE,MAAM,CAA+B;IAEnF,SAAkB,OAAO,EAAE,MAAM,EAAE,CAA2E;IAE9G;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,kBAAkB,SAAS;cAErB,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;cAO3E,aAAa,CAAC,IAAI,EAAE,IAAI;cAYxB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ;cAO3B,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;cAiB/D,aAAa,CAAC,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;cAgBxF,WAAW,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;cAwDhF,YAAY;CAItC;AAED,qBAAa,2BAA4B,SAAQ,kBAAkB;IACjE,SAAkB,OAAO,EAAE,MAAM,EAAE,CAMlC;CACF"}
@@ -1,4 +1,4 @@
1
- export * from './Archivist.js';
1
+ export * from './Archivist.ts';
2
2
  export * from './ArchivistV2.ts';
3
3
  export * from '@xyo-network/archivist-model-mongodb';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Archivist.ts","../../src/lib/validByType.ts","../../src/ArchivistV2.ts","../../src/index.ts"],"sourcesContent":["import type { Hash } from '@xylabs/sdk-js'\nimport { exists } from '@xylabs/sdk-js'\nimport { AbstractArchivist } from '@xyo-network/archivist-abstract'\nimport type { ArchivistNextOptions } from '@xyo-network/archivist-model'\nimport { ArchivistInsertQuerySchema, ArchivistNextQuerySchema } from '@xyo-network/archivist-model'\nimport { MongoDBArchivistConfigSchema } from '@xyo-network/archivist-model-mongodb'\nimport type { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { MongoDBModuleMixin } from '@xyo-network/module-abstract-mongodb'\nimport type {\n Payload, Schema, Sequence, WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport type { PayloadWithMongoMeta } from '@xyo-network/payload-mongodb'\nimport { fromDbRepresentation, toDbRepresentation } from '@xyo-network/payload-mongodb'\nimport { ObjectId } from 'mongodb'\n\nimport { validByType } from './lib/index.js'\n\nconst MongoDBArchivistBase = MongoDBModuleMixin(AbstractArchivist)\n\nexport class MongoDBArchivist extends MongoDBArchivistBase {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, MongoDBArchivistConfigSchema]\n static override readonly defaultConfigSchema: Schema = MongoDBArchivistConfigSchema\n\n override queries = [ArchivistInsertQuerySchema, ArchivistNextQuerySchema, ...super.queries]\n\n /**\n * The amount of time to allow the aggregate query to execute\n */\n protected readonly aggregateTimeoutMs = 10_000\n\n protected async findOneByHash(hash: Hash) {\n const dataPayload = (await this.payloads.findOne({ _$hash: hash }))\n if (dataPayload) {\n return dataPayload\n } else {\n const dataBw = (await this.boundWitnesses.findOne({ _$hash: hash }))\n if (dataBw) {\n return dataBw\n } else {\n const payload = (await this.payloads.findOne({ _hash: hash }))\n if (payload) {\n return payload\n } else {\n const bw = (await this.boundWitnesses.findOne({ _hash: hash }))\n return bw ?? undefined\n }\n }\n }\n }\n\n protected async findOneBySequence(sequence: Sequence) {\n const dataPayload = (await this.payloads.findOne({ _sequence: sequence }))\n if (dataPayload) {\n return dataPayload\n } else {\n const dataBw = (await this.boundWitnesses.findOne({ _sequence: sequence }))\n return dataBw\n }\n }\n\n protected override async getHandler(hashes: Hash[]): Promise<WithStorageMeta<Payload>[]> {\n let remainingHashes = [...hashes]\n\n const dataPayloads: WithStorageMeta<Payload>[] = (await Promise.all(remainingHashes.map(_dataHash => this.payloads.findOne({ _dataHash })))).filter(exists)\n const dataPayloadsHashes = new Set(dataPayloads.map(payload => payload._dataHash))\n remainingHashes = remainingHashes.filter(hash => !dataPayloadsHashes.has(hash))\n\n const dataBws: WithStorageMeta<BoundWitness>[] = (await Promise.all(remainingHashes.map(\n _dataHash => this.boundWitnesses.findOne({ _dataHash }),\n ))).filter(exists)\n\n const dataBwsHashes = new Set(dataBws.map(payload => payload._dataHash))\n remainingHashes = remainingHashes.filter(hash => !dataBwsHashes.has(hash))\n\n const payloads: WithStorageMeta<Payload>[] = (await Promise.all(remainingHashes.map(_hash => this.payloads.findOne({ _hash })))).filter(exists)\n const payloadsHashes = new Set(payloads.map(payload => payload._hash))\n remainingHashes = remainingHashes.filter(hash => !payloadsHashes.has(hash))\n\n const bws: WithStorageMeta<BoundWitness>[] = (await Promise.all(remainingHashes.map(_hash => this.boundWitnesses.findOne({ _hash })))).filter(exists)\n const bwsHashes = new Set(bws.map(payload => payload._hash))\n // eslint-disable-next-line sonarjs/no-dead-store\n remainingHashes = remainingHashes.filter(hash => !bwsHashes.has(hash))\n\n const foundPayloads = [...dataPayloads, ...dataBws, ...payloads, ...bws] as PayloadWithMongoMeta<Payload>[]\n const result = foundPayloads.map(fromDbRepresentation)\n // console.log(`getHandler: ${JSON.stringify(hashes, null, 2)}:${JSON.stringify(result, null, 2)}`)\n return result\n }\n\n protected override async insertHandler(payloads: WithStorageMeta<Payload>[]): Promise<WithStorageMeta<Payload>[]> {\n const [bw, p] = await validByType(payloads)\n const payloadsWithExternalMeta = p.map(value => toDbRepresentation(value))\n if (payloadsWithExternalMeta.length > 0) {\n const payloadsResult = await this.payloads.insertMany(payloadsWithExternalMeta)\n if (!payloadsResult.acknowledged || payloadsResult.insertedCount !== payloadsWithExternalMeta.length)\n throw new Error('MongoDBArchivist: Error inserting Payloads')\n }\n\n const boundWitnessesWithExternalMeta = bw.map(value => toDbRepresentation(value))\n if (boundWitnessesWithExternalMeta.length > 0) {\n const boundWitnessesResult = await this.boundWitnesses.insertMany(boundWitnessesWithExternalMeta)\n if (!boundWitnessesResult.acknowledged || boundWitnessesResult.insertedCount !== boundWitnessesWithExternalMeta.length)\n throw new Error('MongoDBArchivist: Error inserting BoundWitnesses')\n }\n\n return [...boundWitnessesWithExternalMeta, ...payloadsWithExternalMeta].map(fromDbRepresentation)\n }\n\n protected override async nextHandler(options?: ArchivistNextOptions): Promise<WithStorageMeta<Payload>[]> {\n // Sanitize inputs and set defaults\n let {\n limit, cursor, order, open,\n } = options ?? { limit: 10, order: 'desc' }\n\n if (!limit) limit = 10\n if (limit > 100) limit = 100\n\n if (order != 'asc') order = 'desc'\n\n let id: ObjectId | undefined\n if (cursor) {\n const payload = await this.findOneBySequence(cursor)\n // TODO: Should we throw an error if the requested payload is not found?\n if (payload) id = payload._id\n } else {\n id = order === 'asc'\n // If ascending, start from the beginning of time\n ? ObjectId.createFromTime(0)\n // If descending, start from now (plus a bit more in the future to ensure\n // them most recent ObjectIds are included)\n : ObjectId.createFromTime((Date.now() + 10_000) / 1000)\n }\n if (!id) return []\n\n // Create aggregate criteria\n const sort = order === 'asc' ? 1 : -1\n // TODO: How to handle random component of ID across multiple collections\n // to ensure we don't skip some payloads\n const match = order === 'asc' ? (open ? { _id: { $gte: id } } : { _id: { $gt: id } }) : (open ? { _id: { $lte: id } } : { _id: { $lt: id } })\n\n // Run the aggregate query\n const foundPayloads = await this.payloads.useCollection((collection) => {\n return collection\n .aggregate<PayloadWithMongoMeta>([\n // Pre-filter payloads collection\n { $match: match },\n // Sort payloads by _id\n { $sort: { _id: sort } },\n // Limit payloads to the first N payloads\n { $limit: limit },\n // Combine with filtered boundWitnesses collection\n {\n $unionWith: {\n coll: this.boundWitnessSdkConfig.collection,\n pipeline: [\n { $match: match }, // Pre-filter boundWitnesses\n { $sort: { _id: sort } }, // Sort boundWitnesses by _id\n { $limit: limit }, // Limit boundWitnesses to the first N boundWitnesses\n ],\n },\n },\n // Sort the combined result by _id\n { $sort: { _id: sort } },\n // Limit the final result to N documents\n { $limit: limit },\n ])\n .maxTimeMS(this.aggregateTimeoutMs)\n .toArray()\n })\n\n // Convert from DB representation to Payloads\n return foundPayloads.map(fromDbRepresentation)\n }\n\n protected override async startHandler() {\n await super.startHandler()\n await this.ensureIndexes()\n }\n}\n","import type { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { isBoundWitness, isQueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessWrapper, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport const validByType = async (payloads: WithStorageMeta<Payload>[] = []) => {\n const results: [WithStorageMeta<BoundWitness>[], WithStorageMeta<Payload>[]] = [[], []]\n await Promise.all(\n payloads.map(async (payload) => {\n if (isBoundWitness(payload)) {\n const wrapper = isQueryBoundWitness(payload) ? QueryBoundWitnessWrapper : BoundWitnessWrapper\n const bw = wrapper.parse(payload)\n if (await bw.getValid()) {\n results[0].push(payload)\n } else {\n const errors = await bw.getErrors()\n console.log(`validByType.Error: ${JSON.stringify(errors, null, 2)}`)\n }\n } else {\n const payloadWrapper = PayloadWrapper.wrap(payload)\n if (await payloadWrapper.getValid()) {\n results[1].push(payload)\n }\n }\n }),\n )\n return results\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport { exists } from '@xylabs/sdk-js'\nimport { AbstractArchivist } from '@xyo-network/archivist-abstract'\nimport type { ArchivistNextOptions } from '@xyo-network/archivist-model'\nimport {\n ArchivistDeleteQuerySchema, ArchivistGetQuerySchema, ArchivistInsertQuerySchema, ArchivistNextQuerySchema,\n} from '@xyo-network/archivist-model'\nimport { MongoDBArchivistConfigSchema } from '@xyo-network/archivist-model-mongodb'\nimport { DefaultModuleQueries } from '@xyo-network/module-abstract'\nimport { MongoDBModuleMixinV2 } from '@xyo-network/module-abstract-mongodb'\nimport {\n type Payload, type Schema, type Sequence, SequenceConstants,\n type WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport type { PayloadWithMongoMeta } from '@xyo-network/payload-mongodb'\nimport { fromDbRepresentation, toDbRepresentation } from '@xyo-network/payload-mongodb'\nimport type { MongoError } from 'mongodb'\n\nconst MongoDBArchivistBaseV2 = MongoDBModuleMixinV2(AbstractArchivist)\n\nconst MONGODB_DUPLICATE_KEY_ERROR = 11_000\n\nexport class MongoDBArchivistV2 extends MongoDBArchivistBaseV2 {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, MongoDBArchivistConfigSchema]\n static override readonly defaultConfigSchema: Schema = MongoDBArchivistConfigSchema\n\n override readonly queries: Schema[] = [ArchivistInsertQuerySchema, ArchivistNextQuerySchema, ...super.queries]\n\n /**\n * The amount of time to allow the aggregate query to execute\n */\n protected readonly aggregateTimeoutMs = 10_000\n\n protected override async deleteHandler(hashes: Hash[]): Promise<WithStorageMeta<Payload>[]> {\n const payloads = await this.getHandler(hashes)\n const foundHashes = payloads.map(p => p._hash)\n await this.payloads.deleteMany({ _hash: { $in: foundHashes } })\n return payloads\n }\n\n protected async findOneByHash(hash: Hash) {\n const dataPayload = (await this.payloads.findOne({ _$hash: hash }))\n if (dataPayload) {\n return dataPayload\n } else {\n const payload = (await this.payloads.findOne({ _hash: hash }))\n if (payload) {\n return payload\n }\n }\n }\n\n protected async findOneBySequence(sequence: Sequence) {\n const dataPayload = (await this.payloads.findOne({ _sequence: sequence }))\n if (dataPayload) {\n return dataPayload\n }\n }\n\n protected override async getHandler(hashes: Hash[]): Promise<WithStorageMeta<Payload>[]> {\n let remainingHashes = [...hashes]\n\n const dataPayloads: WithStorageMeta<Payload>[] = (await Promise.all(remainingHashes.map(_dataHash => this.payloads.findOne({ _dataHash })))).filter(exists)\n const dataPayloadsHashes = new Set(dataPayloads.map(payload => payload._dataHash))\n remainingHashes = remainingHashes.filter(hash => !dataPayloadsHashes.has(hash))\n\n const payloads: WithStorageMeta<Payload>[] = (await Promise.all(remainingHashes.map(_hash => this.payloads.findOne({ _hash })))).filter(exists)\n const payloadsHashes = new Set(payloads.map(payload => payload._hash))\n // eslint-disable-next-line sonarjs/no-dead-store\n remainingHashes = remainingHashes.filter(hash => !payloadsHashes.has(hash))\n\n const foundPayloads = [...dataPayloads, ...payloads] as PayloadWithMongoMeta<Payload>[]\n const result = foundPayloads.map(fromDbRepresentation)\n return result\n }\n\n protected override async insertHandler(payloads: WithStorageMeta<Payload>[]): Promise<WithStorageMeta<Payload>[]> {\n const payloadsWithExternalMeta = payloads.map(value => toDbRepresentation(value))\n if (payloadsWithExternalMeta.length > 0) {\n try {\n const payloadsResult = await this.payloads.insertMany(payloadsWithExternalMeta, { ordered: false })\n if (!payloadsResult.acknowledged) throw new Error('MongoDBArchivist: Error inserting Payloads')\n } catch (error) {\n const mongoError = error as MongoError\n // Intentional coercive equality since Mongo error codes are\n // of type string | number\n if (mongoError?.code != MONGODB_DUPLICATE_KEY_ERROR) throw error\n }\n }\n return [...payloadsWithExternalMeta].map(fromDbRepresentation)\n }\n\n protected override async nextHandler(options?: ArchivistNextOptions): Promise<WithStorageMeta<Payload>[]> {\n // Sanitize inputs and set defaults\n let {\n limit, cursor, order, open = true,\n } = options ?? { limit: 10, order: 'desc' }\n\n if (!limit) limit = 10\n if (limit > 100) limit = 100\n\n if (order != 'asc') order = 'desc'\n\n let sequence: Sequence | undefined\n if (cursor) {\n const payload = await this.findOneBySequence(cursor)\n // TODO: Should we throw an error if the requested payload is not found?\n if (payload) sequence = payload._sequence\n } else {\n sequence = order === 'asc'\n // If ascending, start from the beginning of time\n ? SequenceConstants.minLocalSequence\n // If descending, start from now (plus a bit more in the future to ensure\n // them most recent ObjectIds are included)\n : SequenceConstants.maxLocalSequence\n }\n if (!sequence) return []\n\n // Create find criteria\n const sort = order === 'asc' ? 1 : -1\n\n const match = order === 'asc'\n ? (open\n ? { _sequence: { $gt: sequence } }\n : { _sequence: { $gte: sequence } })\n : (open\n ? { _sequence: { $lt: sequence } }\n : { _sequence: { $lte: sequence } })\n\n // Run the aggregate query\n const foundPayloads = await this.payloads.useCollection((collection) => {\n return collection\n .aggregate<PayloadWithMongoMeta>([\n // Pre-filter payloads collection\n { $match: match },\n // Sort payloads by _sequence\n { $sort: { _sequence: sort } },\n // Limit payloads to the first N payloads\n { $limit: limit },\n ])\n .maxTimeMS(this.aggregateTimeoutMs)\n .toArray()\n })\n\n // Convert from DB representation to Payloads\n return foundPayloads.map(fromDbRepresentation)\n }\n\n protected override async startHandler() {\n await super.startHandler()\n await this.ensureCollection()\n }\n}\n\nexport class MongoDBArchivistV2Deletable extends MongoDBArchivistV2 {\n override readonly queries: Schema[] = [\n ArchivistDeleteQuerySchema,\n ArchivistGetQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistNextQuerySchema,\n ...DefaultModuleQueries,\n ]\n}\n","export * from './Archivist.js'\nexport * from './ArchivistV2.ts'\nexport * from '@xyo-network/archivist-model-mongodb'\n"],"mappings":"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","names":["exists","AbstractArchivist","ArchivistInsertQuerySchema","ArchivistNextQuerySchema","MongoDBArchivistConfigSchema","fromDbRepresentation","toDbRepresentation"]}
1
+ {"version":3,"sources":["../../src/Archivist.ts","../../src/lib/validByType.ts","../../src/ArchivistV2.ts","../../src/index.ts"],"sourcesContent":["import type { Hash } from '@xylabs/sdk-js'\nimport { exists } from '@xylabs/sdk-js'\nimport { AbstractArchivist } from '@xyo-network/archivist-abstract'\nimport type { ArchivistNextOptions } from '@xyo-network/archivist-model'\nimport { ArchivistInsertQuerySchema, ArchivistNextQuerySchema } from '@xyo-network/archivist-model'\nimport { MongoDBArchivistConfigSchema } from '@xyo-network/archivist-model-mongodb'\nimport type { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { MongoDBModuleMixin } from '@xyo-network/module-abstract-mongodb'\nimport type {\n Payload, Schema, Sequence, WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport type { PayloadWithMongoMeta } from '@xyo-network/payload-mongodb'\nimport { fromDbRepresentation, toDbRepresentation } from '@xyo-network/payload-mongodb'\nimport { ObjectId } from 'mongodb'\n\nimport { validByType } from './lib/index.ts'\n\nconst MongoDBArchivistBase = MongoDBModuleMixin(AbstractArchivist)\n\nexport class MongoDBArchivist extends MongoDBArchivistBase {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, MongoDBArchivistConfigSchema]\n static override readonly defaultConfigSchema: Schema = MongoDBArchivistConfigSchema\n\n override queries = [ArchivistInsertQuerySchema, ArchivistNextQuerySchema, ...super.queries]\n\n /**\n * The amount of time to allow the aggregate query to execute\n */\n protected readonly aggregateTimeoutMs = 10_000\n\n protected async findOneByHash(hash: Hash) {\n const dataPayload = (await this.payloads.findOne({ _$hash: hash }))\n if (dataPayload) {\n return dataPayload\n } else {\n const dataBw = (await this.boundWitnesses.findOne({ _$hash: hash }))\n if (dataBw) {\n return dataBw\n } else {\n const payload = (await this.payloads.findOne({ _hash: hash }))\n if (payload) {\n return payload\n } else {\n const bw = (await this.boundWitnesses.findOne({ _hash: hash }))\n return bw ?? undefined\n }\n }\n }\n }\n\n protected async findOneBySequence(sequence: Sequence) {\n const dataPayload = (await this.payloads.findOne({ _sequence: sequence }))\n if (dataPayload) {\n return dataPayload\n } else {\n const dataBw = (await this.boundWitnesses.findOne({ _sequence: sequence }))\n return dataBw\n }\n }\n\n protected override async getHandler(hashes: Hash[]): Promise<WithStorageMeta<Payload>[]> {\n let remainingHashes = [...hashes]\n\n const dataPayloads: WithStorageMeta<Payload>[] = (await Promise.all(remainingHashes.map(_dataHash => this.payloads.findOne({ _dataHash })))).filter(exists)\n const dataPayloadsHashes = new Set(dataPayloads.map(payload => payload._dataHash))\n remainingHashes = remainingHashes.filter(hash => !dataPayloadsHashes.has(hash))\n\n const dataBws: WithStorageMeta<BoundWitness>[] = (await Promise.all(remainingHashes.map(\n _dataHash => this.boundWitnesses.findOne({ _dataHash }),\n ))).filter(exists)\n\n const dataBwsHashes = new Set(dataBws.map(payload => payload._dataHash))\n remainingHashes = remainingHashes.filter(hash => !dataBwsHashes.has(hash))\n\n const payloads: WithStorageMeta<Payload>[] = (await Promise.all(remainingHashes.map(_hash => this.payloads.findOne({ _hash })))).filter(exists)\n const payloadsHashes = new Set(payloads.map(payload => payload._hash))\n remainingHashes = remainingHashes.filter(hash => !payloadsHashes.has(hash))\n\n const bws: WithStorageMeta<BoundWitness>[] = (await Promise.all(remainingHashes.map(_hash => this.boundWitnesses.findOne({ _hash })))).filter(exists)\n const bwsHashes = new Set(bws.map(payload => payload._hash))\n // eslint-disable-next-line sonarjs/no-dead-store\n remainingHashes = remainingHashes.filter(hash => !bwsHashes.has(hash))\n\n const foundPayloads = [...dataPayloads, ...dataBws, ...payloads, ...bws] as PayloadWithMongoMeta<Payload>[]\n const result = foundPayloads.map(fromDbRepresentation)\n // console.log(`getHandler: ${JSON.stringify(hashes, null, 2)}:${JSON.stringify(result, null, 2)}`)\n return result\n }\n\n protected override async insertHandler(payloads: WithStorageMeta<Payload>[]): Promise<WithStorageMeta<Payload>[]> {\n const [bw, p] = await validByType(payloads)\n const payloadsWithExternalMeta = p.map(value => toDbRepresentation(value))\n if (payloadsWithExternalMeta.length > 0) {\n const payloadsResult = await this.payloads.insertMany(payloadsWithExternalMeta)\n if (!payloadsResult.acknowledged || payloadsResult.insertedCount !== payloadsWithExternalMeta.length)\n throw new Error('MongoDBArchivist: Error inserting Payloads')\n }\n\n const boundWitnessesWithExternalMeta = bw.map(value => toDbRepresentation(value))\n if (boundWitnessesWithExternalMeta.length > 0) {\n const boundWitnessesResult = await this.boundWitnesses.insertMany(boundWitnessesWithExternalMeta)\n if (!boundWitnessesResult.acknowledged || boundWitnessesResult.insertedCount !== boundWitnessesWithExternalMeta.length)\n throw new Error('MongoDBArchivist: Error inserting BoundWitnesses')\n }\n\n return [...boundWitnessesWithExternalMeta, ...payloadsWithExternalMeta].map(fromDbRepresentation)\n }\n\n protected override async nextHandler(options?: ArchivistNextOptions): Promise<WithStorageMeta<Payload>[]> {\n // Sanitize inputs and set defaults\n let {\n limit, cursor, order, open,\n } = options ?? { limit: 10, order: 'desc' }\n\n if (!limit) limit = 10\n if (limit > 100) limit = 100\n\n if (order != 'asc') order = 'desc'\n\n let id: ObjectId | undefined\n if (cursor) {\n const payload = await this.findOneBySequence(cursor)\n // TODO: Should we throw an error if the requested payload is not found?\n if (payload) id = payload._id\n } else {\n id = order === 'asc'\n // If ascending, start from the beginning of time\n ? ObjectId.createFromTime(0)\n // If descending, start from now (plus a bit more in the future to ensure\n // them most recent ObjectIds are included)\n : ObjectId.createFromTime((Date.now() + 10_000) / 1000)\n }\n if (!id) return []\n\n // Create aggregate criteria\n const sort = order === 'asc' ? 1 : -1\n // TODO: How to handle random component of ID across multiple collections\n // to ensure we don't skip some payloads\n const match = order === 'asc' ? (open ? { _id: { $gte: id } } : { _id: { $gt: id } }) : (open ? { _id: { $lte: id } } : { _id: { $lt: id } })\n\n // Run the aggregate query\n const foundPayloads = await this.payloads.useCollection((collection) => {\n return collection\n .aggregate<PayloadWithMongoMeta>([\n // Pre-filter payloads collection\n { $match: match },\n // Sort payloads by _id\n { $sort: { _id: sort } },\n // Limit payloads to the first N payloads\n { $limit: limit },\n // Combine with filtered boundWitnesses collection\n {\n $unionWith: {\n coll: this.boundWitnessSdkConfig.collection,\n pipeline: [\n { $match: match }, // Pre-filter boundWitnesses\n { $sort: { _id: sort } }, // Sort boundWitnesses by _id\n { $limit: limit }, // Limit boundWitnesses to the first N boundWitnesses\n ],\n },\n },\n // Sort the combined result by _id\n { $sort: { _id: sort } },\n // Limit the final result to N documents\n { $limit: limit },\n ])\n .maxTimeMS(this.aggregateTimeoutMs)\n .toArray()\n })\n\n // Convert from DB representation to Payloads\n return foundPayloads.map(fromDbRepresentation)\n }\n\n protected override async startHandler() {\n await super.startHandler()\n await this.ensureIndexes()\n }\n}\n","import type { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { isBoundWitness, isQueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessWrapper, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport const validByType = async (payloads: WithStorageMeta<Payload>[] = []) => {\n const results: [WithStorageMeta<BoundWitness>[], WithStorageMeta<Payload>[]] = [[], []]\n await Promise.all(\n payloads.map(async (payload) => {\n if (isBoundWitness(payload)) {\n const wrapper = isQueryBoundWitness(payload) ? QueryBoundWitnessWrapper : BoundWitnessWrapper\n const bw = wrapper.parse(payload)\n if (await bw.getValid()) {\n results[0].push(payload)\n } else {\n const errors = await bw.getErrors()\n console.log(`validByType.Error: ${JSON.stringify(errors, null, 2)}`)\n }\n } else {\n const payloadWrapper = PayloadWrapper.wrap(payload)\n if (await payloadWrapper.getValid()) {\n results[1].push(payload)\n }\n }\n }),\n )\n return results\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport { exists } from '@xylabs/sdk-js'\nimport { AbstractArchivist } from '@xyo-network/archivist-abstract'\nimport type { ArchivistNextOptions } from '@xyo-network/archivist-model'\nimport {\n ArchivistDeleteQuerySchema, ArchivistGetQuerySchema, ArchivistInsertQuerySchema, ArchivistNextQuerySchema,\n} from '@xyo-network/archivist-model'\nimport { MongoDBArchivistConfigSchema } from '@xyo-network/archivist-model-mongodb'\nimport { DefaultModuleQueries } from '@xyo-network/module-abstract'\nimport { MongoDBModuleMixinV2 } from '@xyo-network/module-abstract-mongodb'\nimport {\n type Payload, type Schema, type Sequence, SequenceConstants,\n type WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport type { PayloadWithMongoMeta } from '@xyo-network/payload-mongodb'\nimport { fromDbRepresentation, toDbRepresentation } from '@xyo-network/payload-mongodb'\nimport type { MongoError } from 'mongodb'\n\nconst MongoDBArchivistBaseV2 = MongoDBModuleMixinV2(AbstractArchivist)\n\nconst MONGODB_DUPLICATE_KEY_ERROR = 11_000\n\nexport class MongoDBArchivistV2 extends MongoDBArchivistBaseV2 {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, MongoDBArchivistConfigSchema]\n static override readonly defaultConfigSchema: Schema = MongoDBArchivistConfigSchema\n\n override readonly queries: Schema[] = [ArchivistInsertQuerySchema, ArchivistNextQuerySchema, ...super.queries]\n\n /**\n * The amount of time to allow the aggregate query to execute\n */\n protected readonly aggregateTimeoutMs = 10_000\n\n protected override async deleteHandler(hashes: Hash[]): Promise<WithStorageMeta<Payload>[]> {\n const payloads = await this.getHandler(hashes)\n const foundHashes = payloads.map(p => p._hash)\n await this.payloads.deleteMany({ _hash: { $in: foundHashes } })\n return payloads\n }\n\n protected async findOneByHash(hash: Hash) {\n const dataPayload = (await this.payloads.findOne({ _$hash: hash }))\n if (dataPayload) {\n return dataPayload\n } else {\n const payload = (await this.payloads.findOne({ _hash: hash }))\n if (payload) {\n return payload\n }\n }\n }\n\n protected async findOneBySequence(sequence: Sequence) {\n const dataPayload = (await this.payloads.findOne({ _sequence: sequence }))\n if (dataPayload) {\n return dataPayload\n }\n }\n\n protected override async getHandler(hashes: Hash[]): Promise<WithStorageMeta<Payload>[]> {\n let remainingHashes = [...hashes]\n\n const dataPayloads: WithStorageMeta<Payload>[] = (await Promise.all(remainingHashes.map(_dataHash => this.payloads.findOne({ _dataHash })))).filter(exists)\n const dataPayloadsHashes = new Set(dataPayloads.map(payload => payload._dataHash))\n remainingHashes = remainingHashes.filter(hash => !dataPayloadsHashes.has(hash))\n\n const payloads: WithStorageMeta<Payload>[] = (await Promise.all(remainingHashes.map(_hash => this.payloads.findOne({ _hash })))).filter(exists)\n const payloadsHashes = new Set(payloads.map(payload => payload._hash))\n // eslint-disable-next-line sonarjs/no-dead-store\n remainingHashes = remainingHashes.filter(hash => !payloadsHashes.has(hash))\n\n const foundPayloads = [...dataPayloads, ...payloads] as PayloadWithMongoMeta<Payload>[]\n const result = foundPayloads.map(fromDbRepresentation)\n return result\n }\n\n protected override async insertHandler(payloads: WithStorageMeta<Payload>[]): Promise<WithStorageMeta<Payload>[]> {\n const payloadsWithExternalMeta = payloads.map(value => toDbRepresentation(value))\n if (payloadsWithExternalMeta.length > 0) {\n try {\n const payloadsResult = await this.payloads.insertMany(payloadsWithExternalMeta, { ordered: false })\n if (!payloadsResult.acknowledged) throw new Error('MongoDBArchivist: Error inserting Payloads')\n } catch (error) {\n const mongoError = error as MongoError\n // Intentional coercive equality since Mongo error codes are\n // of type string | number\n if (mongoError?.code != MONGODB_DUPLICATE_KEY_ERROR) throw error\n }\n }\n return [...payloadsWithExternalMeta].map(fromDbRepresentation)\n }\n\n protected override async nextHandler(options?: ArchivistNextOptions): Promise<WithStorageMeta<Payload>[]> {\n // Sanitize inputs and set defaults\n let {\n limit, cursor, order, open = true,\n } = options ?? { limit: 10, order: 'desc' }\n\n if (!limit) limit = 10\n if (limit > 100) limit = 100\n\n if (order != 'asc') order = 'desc'\n\n let sequence: Sequence | undefined\n if (cursor) {\n const payload = await this.findOneBySequence(cursor)\n // TODO: Should we throw an error if the requested payload is not found?\n if (payload) sequence = payload._sequence\n } else {\n sequence = order === 'asc'\n // If ascending, start from the beginning of time\n ? SequenceConstants.minLocalSequence\n // If descending, start from now (plus a bit more in the future to ensure\n // them most recent ObjectIds are included)\n : SequenceConstants.maxLocalSequence\n }\n if (!sequence) return []\n\n // Create find criteria\n const sort = order === 'asc' ? 1 : -1\n\n const match = order === 'asc'\n ? (open\n ? { _sequence: { $gt: sequence } }\n : { _sequence: { $gte: sequence } })\n : (open\n ? { _sequence: { $lt: sequence } }\n : { _sequence: { $lte: sequence } })\n\n // Run the aggregate query\n const foundPayloads = await this.payloads.useCollection((collection) => {\n return collection\n .aggregate<PayloadWithMongoMeta>([\n // Pre-filter payloads collection\n { $match: match },\n // Sort payloads by _sequence\n { $sort: { _sequence: sort } },\n // Limit payloads to the first N payloads\n { $limit: limit },\n ])\n .maxTimeMS(this.aggregateTimeoutMs)\n .toArray()\n })\n\n // Convert from DB representation to Payloads\n return foundPayloads.map(fromDbRepresentation)\n }\n\n protected override async startHandler() {\n await super.startHandler()\n await this.ensureCollection()\n }\n}\n\nexport class MongoDBArchivistV2Deletable extends MongoDBArchivistV2 {\n override readonly queries: Schema[] = [\n ArchivistDeleteQuerySchema,\n ArchivistGetQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistNextQuerySchema,\n ...DefaultModuleQueries,\n ]\n}\n","export * from './Archivist.ts'\nexport * from './ArchivistV2.ts'\nexport * from '@xyo-network/archivist-model-mongodb'\n"],"mappings":"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","names":["exists","AbstractArchivist","ArchivistInsertQuerySchema","ArchivistNextQuerySchema","MongoDBArchivistConfigSchema","fromDbRepresentation","toDbRepresentation"]}
@@ -1,2 +1,2 @@
1
- export * from './validByType.js';
1
+ export * from './validByType.ts';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -8,15 +8,15 @@ export declare const validByType: (payloads?: WithStorageMeta<Payload>[]) => Pro
8
8
  } & {
9
9
  readonly __address: true;
10
10
  })[];
11
- payload_hashes: import("@xylabs/hex").BrandedHash[];
11
+ payload_hashes: import("@xylabs/sdk-js").BrandedHash[];
12
12
  payload_schemas: import("@xyo-network/payload-model").BrandedSchema<string>[];
13
- previous_hashes: (import("@xylabs/hex").BrandedHash | null)[];
14
- $signatures: (import("@xylabs/hex").BrandedHex | null)[];
13
+ previous_hashes: (import("@xylabs/sdk-js").BrandedHash | null)[];
14
+ $signatures: (import("@xylabs/sdk-js").BrandedHex | null)[];
15
15
  $destination?: (Lowercase<string> & {
16
16
  readonly __hex: true;
17
17
  } & {
18
18
  readonly __address: true;
19
19
  }) | undefined;
20
- $sourceQuery?: import("@xylabs/hex").BrandedHash | undefined;
20
+ $sourceQuery?: import("@xylabs/sdk-js").BrandedHash | undefined;
21
21
  }>[], WithStorageMeta<Payload>[]]>;
22
22
  //# sourceMappingURL=validByType.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/archivist-mongodb",
3
- "version": "5.3.22",
3
+ "version": "5.3.25",
4
4
  "description": "Primary SDK for using XYO Protocol 2.0",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -33,62 +33,58 @@
33
33
  "types": "dist/node/index.d.ts",
34
34
  "files": [
35
35
  "dist",
36
- "src",
37
36
  "!**/*.bench.*",
38
37
  "!**/*.spec.*",
39
38
  "!**/*.test.*",
40
39
  "README.md"
41
40
  ],
42
41
  "dependencies": {
43
- "@xyo-network/archivist-abstract": "~5.3.22",
44
- "@xyo-network/archivist-model": "~5.3.22",
45
- "@xyo-network/archivist-model-mongodb": "~5.3.22",
46
- "@xyo-network/boundwitness-model": "~5.3.22",
47
- "@xyo-network/boundwitness-wrapper": "~5.3.22",
48
- "@xyo-network/module-abstract": "~5.3.22",
49
- "@xyo-network/module-abstract-mongodb": "~5.3.22",
50
- "@xyo-network/payload-model": "~5.3.22",
51
- "@xyo-network/payload-mongodb": "~5.3.22",
52
- "@xyo-network/payload-wrapper": "~5.3.22"
42
+ "@xyo-network/archivist-abstract": "~5.3.25",
43
+ "@xyo-network/archivist-model": "~5.3.25",
44
+ "@xyo-network/archivist-model-mongodb": "~5.3.25",
45
+ "@xyo-network/boundwitness-wrapper": "~5.3.25",
46
+ "@xyo-network/boundwitness-model": "~5.3.25",
47
+ "@xyo-network/module-abstract": "~5.3.25",
48
+ "@xyo-network/module-abstract-mongodb": "~5.3.25",
49
+ "@xyo-network/payload-model": "~5.3.25",
50
+ "@xyo-network/payload-mongodb": "~5.3.25",
51
+ "@xyo-network/payload-wrapper": "~5.3.25"
53
52
  },
54
53
  "devDependencies": {
55
54
  "@opentelemetry/api": "^1.9.1",
56
55
  "@types/node": "^25.5.0",
57
- "@xylabs/mongo": "~5.0.91",
58
- "@xylabs/sdk-js": "^5.0.91",
59
- "@xylabs/ts-scripts-common": "~7.6.8",
60
- "@xylabs/ts-scripts-yarn3": "~7.6.8",
61
- "@xylabs/tsconfig": "~7.6.8",
62
- "@xylabs/vitest-extended": "~5.0.91",
63
- "@xyo-network/account": "~5.3.22",
64
- "@xyo-network/archivist-abstract": "~5.3.22",
65
- "@xyo-network/archivist-acceptance-tests": "~5.3.22",
66
- "@xyo-network/archivist-model": "~5.3.22",
67
- "@xyo-network/archivist-model-mongodb": "~5.3.22",
68
- "@xyo-network/archivist-wrapper": "~5.3.22",
69
- "@xyo-network/boundwitness-builder": "~5.3.22",
70
- "@xyo-network/boundwitness-model": "~5.3.22",
71
- "@xyo-network/boundwitness-wrapper": "~5.3.22",
72
- "@xyo-network/module-abstract": "~5.3.22",
73
- "@xyo-network/module-abstract-mongodb": "~5.3.22",
74
- "@xyo-network/module-model": "~5.3.22",
75
- "@xyo-network/payload-builder": "~5.3.22",
76
- "@xyo-network/payload-model": "~5.3.22",
77
- "@xyo-network/payload-mongodb": "~5.3.22",
78
- "@xyo-network/payload-wrapper": "~5.3.22",
56
+ "@xylabs/mongo": "~5.0.93",
57
+ "@xylabs/sdk-js": "^5.0.93",
58
+ "@xylabs/ts-scripts-common": "~7.6.16",
59
+ "@xylabs/ts-scripts-pnpm": "~7.6.16",
60
+ "@xylabs/tsconfig": "~7.6.16",
61
+ "@xylabs/vitest-extended": "~5.0.93",
79
62
  "acorn": "^8.16.0",
80
63
  "axios": "^1.14.0",
81
- "cosmiconfig": "^9.0.1",
82
- "esbuild": "^0.27.4",
83
- "eslint": "^10.1.0",
64
+ "esbuild": "^0.28.0",
84
65
  "ethers": "^6.16.0",
85
66
  "mongodb": "~7.1.1",
86
- "rollup": "^4.60.1",
87
67
  "tslib": "^2.8.1",
88
68
  "typescript": "~5.9.3",
89
69
  "vite": "^8.0.3",
90
70
  "vitest": "~4.1.2",
91
- "zod": "^4.3.6"
71
+ "zod": "^4.3.6",
72
+ "@xyo-network/archivist-abstract": "~5.3.25",
73
+ "@xyo-network/account": "~5.3.25",
74
+ "@xyo-network/archivist-acceptance-tests": "~5.3.25",
75
+ "@xyo-network/archivist-model-mongodb": "~5.3.25",
76
+ "@xyo-network/archivist-model": "~5.3.25",
77
+ "@xyo-network/boundwitness-model": "~5.3.25",
78
+ "@xyo-network/archivist-wrapper": "~5.3.25",
79
+ "@xyo-network/boundwitness-wrapper": "~5.3.25",
80
+ "@xyo-network/boundwitness-builder": "~5.3.25",
81
+ "@xyo-network/module-abstract-mongodb": "~5.3.25",
82
+ "@xyo-network/module-abstract": "~5.3.25",
83
+ "@xyo-network/payload-model": "~5.3.25",
84
+ "@xyo-network/payload-builder": "~5.3.25",
85
+ "@xyo-network/module-model": "~5.3.25",
86
+ "@xyo-network/payload-mongodb": "~5.3.25",
87
+ "@xyo-network/payload-wrapper": "~5.3.25"
92
88
  },
93
89
  "peerDependencies": {
94
90
  "@xylabs/sdk-js": "^5",
@@ -103,4 +99,4 @@
103
99
  "publishConfig": {
104
100
  "access": "public"
105
101
  }
106
- }
102
+ }
package/src/Archivist.ts DELETED
@@ -1,179 +0,0 @@
1
- import type { Hash } from '@xylabs/sdk-js'
2
- import { exists } from '@xylabs/sdk-js'
3
- import { AbstractArchivist } from '@xyo-network/archivist-abstract'
4
- import type { ArchivistNextOptions } from '@xyo-network/archivist-model'
5
- import { ArchivistInsertQuerySchema, ArchivistNextQuerySchema } from '@xyo-network/archivist-model'
6
- import { MongoDBArchivistConfigSchema } from '@xyo-network/archivist-model-mongodb'
7
- import type { BoundWitness } from '@xyo-network/boundwitness-model'
8
- import { MongoDBModuleMixin } from '@xyo-network/module-abstract-mongodb'
9
- import type {
10
- Payload, Schema, Sequence, WithStorageMeta,
11
- } from '@xyo-network/payload-model'
12
- import type { PayloadWithMongoMeta } from '@xyo-network/payload-mongodb'
13
- import { fromDbRepresentation, toDbRepresentation } from '@xyo-network/payload-mongodb'
14
- import { ObjectId } from 'mongodb'
15
-
16
- import { validByType } from './lib/index.js'
17
-
18
- const MongoDBArchivistBase = MongoDBModuleMixin(AbstractArchivist)
19
-
20
- export class MongoDBArchivist extends MongoDBArchivistBase {
21
- static override readonly configSchemas: Schema[] = [...super.configSchemas, MongoDBArchivistConfigSchema]
22
- static override readonly defaultConfigSchema: Schema = MongoDBArchivistConfigSchema
23
-
24
- override queries = [ArchivistInsertQuerySchema, ArchivistNextQuerySchema, ...super.queries]
25
-
26
- /**
27
- * The amount of time to allow the aggregate query to execute
28
- */
29
- protected readonly aggregateTimeoutMs = 10_000
30
-
31
- protected async findOneByHash(hash: Hash) {
32
- const dataPayload = (await this.payloads.findOne({ _$hash: hash }))
33
- if (dataPayload) {
34
- return dataPayload
35
- } else {
36
- const dataBw = (await this.boundWitnesses.findOne({ _$hash: hash }))
37
- if (dataBw) {
38
- return dataBw
39
- } else {
40
- const payload = (await this.payloads.findOne({ _hash: hash }))
41
- if (payload) {
42
- return payload
43
- } else {
44
- const bw = (await this.boundWitnesses.findOne({ _hash: hash }))
45
- return bw ?? undefined
46
- }
47
- }
48
- }
49
- }
50
-
51
- protected async findOneBySequence(sequence: Sequence) {
52
- const dataPayload = (await this.payloads.findOne({ _sequence: sequence }))
53
- if (dataPayload) {
54
- return dataPayload
55
- } else {
56
- const dataBw = (await this.boundWitnesses.findOne({ _sequence: sequence }))
57
- return dataBw
58
- }
59
- }
60
-
61
- protected override async getHandler(hashes: Hash[]): Promise<WithStorageMeta<Payload>[]> {
62
- let remainingHashes = [...hashes]
63
-
64
- const dataPayloads: WithStorageMeta<Payload>[] = (await Promise.all(remainingHashes.map(_dataHash => this.payloads.findOne({ _dataHash })))).filter(exists)
65
- const dataPayloadsHashes = new Set(dataPayloads.map(payload => payload._dataHash))
66
- remainingHashes = remainingHashes.filter(hash => !dataPayloadsHashes.has(hash))
67
-
68
- const dataBws: WithStorageMeta<BoundWitness>[] = (await Promise.all(remainingHashes.map(
69
- _dataHash => this.boundWitnesses.findOne({ _dataHash }),
70
- ))).filter(exists)
71
-
72
- const dataBwsHashes = new Set(dataBws.map(payload => payload._dataHash))
73
- remainingHashes = remainingHashes.filter(hash => !dataBwsHashes.has(hash))
74
-
75
- const payloads: WithStorageMeta<Payload>[] = (await Promise.all(remainingHashes.map(_hash => this.payloads.findOne({ _hash })))).filter(exists)
76
- const payloadsHashes = new Set(payloads.map(payload => payload._hash))
77
- remainingHashes = remainingHashes.filter(hash => !payloadsHashes.has(hash))
78
-
79
- const bws: WithStorageMeta<BoundWitness>[] = (await Promise.all(remainingHashes.map(_hash => this.boundWitnesses.findOne({ _hash })))).filter(exists)
80
- const bwsHashes = new Set(bws.map(payload => payload._hash))
81
- // eslint-disable-next-line sonarjs/no-dead-store
82
- remainingHashes = remainingHashes.filter(hash => !bwsHashes.has(hash))
83
-
84
- const foundPayloads = [...dataPayloads, ...dataBws, ...payloads, ...bws] as PayloadWithMongoMeta<Payload>[]
85
- const result = foundPayloads.map(fromDbRepresentation)
86
- // console.log(`getHandler: ${JSON.stringify(hashes, null, 2)}:${JSON.stringify(result, null, 2)}`)
87
- return result
88
- }
89
-
90
- protected override async insertHandler(payloads: WithStorageMeta<Payload>[]): Promise<WithStorageMeta<Payload>[]> {
91
- const [bw, p] = await validByType(payloads)
92
- const payloadsWithExternalMeta = p.map(value => toDbRepresentation(value))
93
- if (payloadsWithExternalMeta.length > 0) {
94
- const payloadsResult = await this.payloads.insertMany(payloadsWithExternalMeta)
95
- if (!payloadsResult.acknowledged || payloadsResult.insertedCount !== payloadsWithExternalMeta.length)
96
- throw new Error('MongoDBArchivist: Error inserting Payloads')
97
- }
98
-
99
- const boundWitnessesWithExternalMeta = bw.map(value => toDbRepresentation(value))
100
- if (boundWitnessesWithExternalMeta.length > 0) {
101
- const boundWitnessesResult = await this.boundWitnesses.insertMany(boundWitnessesWithExternalMeta)
102
- if (!boundWitnessesResult.acknowledged || boundWitnessesResult.insertedCount !== boundWitnessesWithExternalMeta.length)
103
- throw new Error('MongoDBArchivist: Error inserting BoundWitnesses')
104
- }
105
-
106
- return [...boundWitnessesWithExternalMeta, ...payloadsWithExternalMeta].map(fromDbRepresentation)
107
- }
108
-
109
- protected override async nextHandler(options?: ArchivistNextOptions): Promise<WithStorageMeta<Payload>[]> {
110
- // Sanitize inputs and set defaults
111
- let {
112
- limit, cursor, order, open,
113
- } = options ?? { limit: 10, order: 'desc' }
114
-
115
- if (!limit) limit = 10
116
- if (limit > 100) limit = 100
117
-
118
- if (order != 'asc') order = 'desc'
119
-
120
- let id: ObjectId | undefined
121
- if (cursor) {
122
- const payload = await this.findOneBySequence(cursor)
123
- // TODO: Should we throw an error if the requested payload is not found?
124
- if (payload) id = payload._id
125
- } else {
126
- id = order === 'asc'
127
- // If ascending, start from the beginning of time
128
- ? ObjectId.createFromTime(0)
129
- // If descending, start from now (plus a bit more in the future to ensure
130
- // them most recent ObjectIds are included)
131
- : ObjectId.createFromTime((Date.now() + 10_000) / 1000)
132
- }
133
- if (!id) return []
134
-
135
- // Create aggregate criteria
136
- const sort = order === 'asc' ? 1 : -1
137
- // TODO: How to handle random component of ID across multiple collections
138
- // to ensure we don't skip some payloads
139
- const match = order === 'asc' ? (open ? { _id: { $gte: id } } : { _id: { $gt: id } }) : (open ? { _id: { $lte: id } } : { _id: { $lt: id } })
140
-
141
- // Run the aggregate query
142
- const foundPayloads = await this.payloads.useCollection((collection) => {
143
- return collection
144
- .aggregate<PayloadWithMongoMeta>([
145
- // Pre-filter payloads collection
146
- { $match: match },
147
- // Sort payloads by _id
148
- { $sort: { _id: sort } },
149
- // Limit payloads to the first N payloads
150
- { $limit: limit },
151
- // Combine with filtered boundWitnesses collection
152
- {
153
- $unionWith: {
154
- coll: this.boundWitnessSdkConfig.collection,
155
- pipeline: [
156
- { $match: match }, // Pre-filter boundWitnesses
157
- { $sort: { _id: sort } }, // Sort boundWitnesses by _id
158
- { $limit: limit }, // Limit boundWitnesses to the first N boundWitnesses
159
- ],
160
- },
161
- },
162
- // Sort the combined result by _id
163
- { $sort: { _id: sort } },
164
- // Limit the final result to N documents
165
- { $limit: limit },
166
- ])
167
- .maxTimeMS(this.aggregateTimeoutMs)
168
- .toArray()
169
- })
170
-
171
- // Convert from DB representation to Payloads
172
- return foundPayloads.map(fromDbRepresentation)
173
- }
174
-
175
- protected override async startHandler() {
176
- await super.startHandler()
177
- await this.ensureIndexes()
178
- }
179
- }
@@ -1,163 +0,0 @@
1
- import type { Hash } from '@xylabs/sdk-js'
2
- import { exists } from '@xylabs/sdk-js'
3
- import { AbstractArchivist } from '@xyo-network/archivist-abstract'
4
- import type { ArchivistNextOptions } from '@xyo-network/archivist-model'
5
- import {
6
- ArchivistDeleteQuerySchema, ArchivistGetQuerySchema, ArchivistInsertQuerySchema, ArchivistNextQuerySchema,
7
- } from '@xyo-network/archivist-model'
8
- import { MongoDBArchivistConfigSchema } from '@xyo-network/archivist-model-mongodb'
9
- import { DefaultModuleQueries } from '@xyo-network/module-abstract'
10
- import { MongoDBModuleMixinV2 } from '@xyo-network/module-abstract-mongodb'
11
- import {
12
- type Payload, type Schema, type Sequence, SequenceConstants,
13
- type WithStorageMeta,
14
- } from '@xyo-network/payload-model'
15
- import type { PayloadWithMongoMeta } from '@xyo-network/payload-mongodb'
16
- import { fromDbRepresentation, toDbRepresentation } from '@xyo-network/payload-mongodb'
17
- import type { MongoError } from 'mongodb'
18
-
19
- const MongoDBArchivistBaseV2 = MongoDBModuleMixinV2(AbstractArchivist)
20
-
21
- const MONGODB_DUPLICATE_KEY_ERROR = 11_000
22
-
23
- export class MongoDBArchivistV2 extends MongoDBArchivistBaseV2 {
24
- static override readonly configSchemas: Schema[] = [...super.configSchemas, MongoDBArchivistConfigSchema]
25
- static override readonly defaultConfigSchema: Schema = MongoDBArchivistConfigSchema
26
-
27
- override readonly queries: Schema[] = [ArchivistInsertQuerySchema, ArchivistNextQuerySchema, ...super.queries]
28
-
29
- /**
30
- * The amount of time to allow the aggregate query to execute
31
- */
32
- protected readonly aggregateTimeoutMs = 10_000
33
-
34
- protected override async deleteHandler(hashes: Hash[]): Promise<WithStorageMeta<Payload>[]> {
35
- const payloads = await this.getHandler(hashes)
36
- const foundHashes = payloads.map(p => p._hash)
37
- await this.payloads.deleteMany({ _hash: { $in: foundHashes } })
38
- return payloads
39
- }
40
-
41
- protected async findOneByHash(hash: Hash) {
42
- const dataPayload = (await this.payloads.findOne({ _$hash: hash }))
43
- if (dataPayload) {
44
- return dataPayload
45
- } else {
46
- const payload = (await this.payloads.findOne({ _hash: hash }))
47
- if (payload) {
48
- return payload
49
- }
50
- }
51
- }
52
-
53
- protected async findOneBySequence(sequence: Sequence) {
54
- const dataPayload = (await this.payloads.findOne({ _sequence: sequence }))
55
- if (dataPayload) {
56
- return dataPayload
57
- }
58
- }
59
-
60
- protected override async getHandler(hashes: Hash[]): Promise<WithStorageMeta<Payload>[]> {
61
- let remainingHashes = [...hashes]
62
-
63
- const dataPayloads: WithStorageMeta<Payload>[] = (await Promise.all(remainingHashes.map(_dataHash => this.payloads.findOne({ _dataHash })))).filter(exists)
64
- const dataPayloadsHashes = new Set(dataPayloads.map(payload => payload._dataHash))
65
- remainingHashes = remainingHashes.filter(hash => !dataPayloadsHashes.has(hash))
66
-
67
- const payloads: WithStorageMeta<Payload>[] = (await Promise.all(remainingHashes.map(_hash => this.payloads.findOne({ _hash })))).filter(exists)
68
- const payloadsHashes = new Set(payloads.map(payload => payload._hash))
69
- // eslint-disable-next-line sonarjs/no-dead-store
70
- remainingHashes = remainingHashes.filter(hash => !payloadsHashes.has(hash))
71
-
72
- const foundPayloads = [...dataPayloads, ...payloads] as PayloadWithMongoMeta<Payload>[]
73
- const result = foundPayloads.map(fromDbRepresentation)
74
- return result
75
- }
76
-
77
- protected override async insertHandler(payloads: WithStorageMeta<Payload>[]): Promise<WithStorageMeta<Payload>[]> {
78
- const payloadsWithExternalMeta = payloads.map(value => toDbRepresentation(value))
79
- if (payloadsWithExternalMeta.length > 0) {
80
- try {
81
- const payloadsResult = await this.payloads.insertMany(payloadsWithExternalMeta, { ordered: false })
82
- if (!payloadsResult.acknowledged) throw new Error('MongoDBArchivist: Error inserting Payloads')
83
- } catch (error) {
84
- const mongoError = error as MongoError
85
- // Intentional coercive equality since Mongo error codes are
86
- // of type string | number
87
- if (mongoError?.code != MONGODB_DUPLICATE_KEY_ERROR) throw error
88
- }
89
- }
90
- return [...payloadsWithExternalMeta].map(fromDbRepresentation)
91
- }
92
-
93
- protected override async nextHandler(options?: ArchivistNextOptions): Promise<WithStorageMeta<Payload>[]> {
94
- // Sanitize inputs and set defaults
95
- let {
96
- limit, cursor, order, open = true,
97
- } = options ?? { limit: 10, order: 'desc' }
98
-
99
- if (!limit) limit = 10
100
- if (limit > 100) limit = 100
101
-
102
- if (order != 'asc') order = 'desc'
103
-
104
- let sequence: Sequence | undefined
105
- if (cursor) {
106
- const payload = await this.findOneBySequence(cursor)
107
- // TODO: Should we throw an error if the requested payload is not found?
108
- if (payload) sequence = payload._sequence
109
- } else {
110
- sequence = order === 'asc'
111
- // If ascending, start from the beginning of time
112
- ? SequenceConstants.minLocalSequence
113
- // If descending, start from now (plus a bit more in the future to ensure
114
- // them most recent ObjectIds are included)
115
- : SequenceConstants.maxLocalSequence
116
- }
117
- if (!sequence) return []
118
-
119
- // Create find criteria
120
- const sort = order === 'asc' ? 1 : -1
121
-
122
- const match = order === 'asc'
123
- ? (open
124
- ? { _sequence: { $gt: sequence } }
125
- : { _sequence: { $gte: sequence } })
126
- : (open
127
- ? { _sequence: { $lt: sequence } }
128
- : { _sequence: { $lte: sequence } })
129
-
130
- // Run the aggregate query
131
- const foundPayloads = await this.payloads.useCollection((collection) => {
132
- return collection
133
- .aggregate<PayloadWithMongoMeta>([
134
- // Pre-filter payloads collection
135
- { $match: match },
136
- // Sort payloads by _sequence
137
- { $sort: { _sequence: sort } },
138
- // Limit payloads to the first N payloads
139
- { $limit: limit },
140
- ])
141
- .maxTimeMS(this.aggregateTimeoutMs)
142
- .toArray()
143
- })
144
-
145
- // Convert from DB representation to Payloads
146
- return foundPayloads.map(fromDbRepresentation)
147
- }
148
-
149
- protected override async startHandler() {
150
- await super.startHandler()
151
- await this.ensureCollection()
152
- }
153
- }
154
-
155
- export class MongoDBArchivistV2Deletable extends MongoDBArchivistV2 {
156
- override readonly queries: Schema[] = [
157
- ArchivistDeleteQuerySchema,
158
- ArchivistGetQuerySchema,
159
- ArchivistInsertQuerySchema,
160
- ArchivistNextQuerySchema,
161
- ...DefaultModuleQueries,
162
- ]
163
- }
package/src/index.ts DELETED
@@ -1,3 +0,0 @@
1
- export * from './Archivist.js'
2
- export * from './ArchivistV2.ts'
3
- export * from '@xyo-network/archivist-model-mongodb'
package/src/lib/index.ts DELETED
@@ -1 +0,0 @@
1
- export * from './validByType.js'
@@ -1,29 +0,0 @@
1
- import type { BoundWitness } from '@xyo-network/boundwitness-model'
2
- import { isBoundWitness, isQueryBoundWitness } from '@xyo-network/boundwitness-model'
3
- import { BoundWitnessWrapper, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'
4
- import type { Payload, WithStorageMeta } from '@xyo-network/payload-model'
5
- import { PayloadWrapper } from '@xyo-network/payload-wrapper'
6
-
7
- export const validByType = async (payloads: WithStorageMeta<Payload>[] = []) => {
8
- const results: [WithStorageMeta<BoundWitness>[], WithStorageMeta<Payload>[]] = [[], []]
9
- await Promise.all(
10
- payloads.map(async (payload) => {
11
- if (isBoundWitness(payload)) {
12
- const wrapper = isQueryBoundWitness(payload) ? QueryBoundWitnessWrapper : BoundWitnessWrapper
13
- const bw = wrapper.parse(payload)
14
- if (await bw.getValid()) {
15
- results[0].push(payload)
16
- } else {
17
- const errors = await bw.getErrors()
18
- console.log(`validByType.Error: ${JSON.stringify(errors, null, 2)}`)
19
- }
20
- } else {
21
- const payloadWrapper = PayloadWrapper.wrap(payload)
22
- if (await payloadWrapper.getValid()) {
23
- results[1].push(payload)
24
- }
25
- }
26
- }),
27
- )
28
- return results
29
- }