@xyo-network/archivist-mongodb 5.1.22 → 5.1.24
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.
- package/dist/node/index.mjs.map +1 -1
- package/package.json +25 -22
- package/src/ArchivistV2.ts +1 -1
- package/dist/node/lib/spec/validByType.spec.d.ts +0 -2
- package/dist/node/lib/spec/validByType.spec.d.ts.map +0 -1
- package/dist/node/spec/Archivist.spec.d.ts +0 -2
- package/dist/node/spec/Archivist.spec.d.ts.map +0 -1
- package/dist/node/spec/ArchivistV2.spec.d.ts +0 -2
- package/dist/node/spec/ArchivistV2.spec.d.ts.map +0 -1
- package/src/lib/spec/validByType.spec.ts +0 -91
- package/src/spec/Archivist.spec.ts +0 -159
- package/src/spec/ArchivistV2.spec.ts +0 -125
package/dist/node/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Archivist.ts","../../src/lib/validByType.ts","../../src/ArchivistV2.ts","../../src/index.ts"],"sourcesContent":["import { exists } from '@xylabs/exists'\nimport type { Hash } from '@xylabs/hex'\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 { exists } from '@xylabs/exists'\nimport type { Hash } from '@xylabs/hex'\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 { 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: string[] = [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 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 // NOTE: 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","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 { exists } from '@xylabs/exists'\nimport type { Hash } from '@xylabs/hex'\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 { exists } from '@xylabs/exists'\nimport type { Hash } from '@xylabs/hex'\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 { 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: string[] = [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 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","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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/archivist-mongodb",
|
|
3
|
-
"version": "5.1.
|
|
3
|
+
"version": "5.1.24",
|
|
4
4
|
"description": "Primary SDK for using XYO Protocol 2.0",
|
|
5
5
|
"homepage": "https://xyo.network",
|
|
6
6
|
"bugs": {
|
|
@@ -33,35 +33,38 @@
|
|
|
33
33
|
"types": "dist/node/index.d.ts",
|
|
34
34
|
"files": [
|
|
35
35
|
"dist",
|
|
36
|
-
"src"
|
|
36
|
+
"src",
|
|
37
|
+
"!**/*.bench.*",
|
|
38
|
+
"!**/*.spec.*",
|
|
39
|
+
"!**/*.test.*"
|
|
37
40
|
],
|
|
38
41
|
"dependencies": {
|
|
39
|
-
"@xylabs/exists": "~5.0.
|
|
40
|
-
"@xylabs/hex": "~5.0.
|
|
41
|
-
"@xyo-network/archivist-abstract": "~5.1.
|
|
42
|
-
"@xyo-network/archivist-model": "~5.1.
|
|
43
|
-
"@xyo-network/archivist-model-mongodb": "~5.1.
|
|
44
|
-
"@xyo-network/boundwitness-model": "~5.1.
|
|
45
|
-
"@xyo-network/boundwitness-wrapper": "~5.1.
|
|
46
|
-
"@xyo-network/module-abstract-mongodb": "~5.1.
|
|
47
|
-
"@xyo-network/payload-model": "~5.1.
|
|
48
|
-
"@xyo-network/payload-mongodb": "~5.1.
|
|
49
|
-
"@xyo-network/payload-wrapper": "~5.1.
|
|
42
|
+
"@xylabs/exists": "~5.0.37",
|
|
43
|
+
"@xylabs/hex": "~5.0.37",
|
|
44
|
+
"@xyo-network/archivist-abstract": "~5.1.24",
|
|
45
|
+
"@xyo-network/archivist-model": "~5.1.24",
|
|
46
|
+
"@xyo-network/archivist-model-mongodb": "~5.1.24",
|
|
47
|
+
"@xyo-network/boundwitness-model": "~5.1.24",
|
|
48
|
+
"@xyo-network/boundwitness-wrapper": "~5.1.24",
|
|
49
|
+
"@xyo-network/module-abstract-mongodb": "~5.1.24",
|
|
50
|
+
"@xyo-network/payload-model": "~5.1.24",
|
|
51
|
+
"@xyo-network/payload-mongodb": "~5.1.24",
|
|
52
|
+
"@xyo-network/payload-wrapper": "~5.1.24",
|
|
50
53
|
"mongodb": "~6.20.0"
|
|
51
54
|
},
|
|
52
55
|
"devDependencies": {
|
|
53
|
-
"@xylabs/delay": "~5.0.
|
|
54
|
-
"@xylabs/mongo": "~5.0.
|
|
56
|
+
"@xylabs/delay": "~5.0.37",
|
|
57
|
+
"@xylabs/mongo": "~5.0.37",
|
|
55
58
|
"@xylabs/ts-scripts-yarn3": "~7.2.8",
|
|
56
59
|
"@xylabs/tsconfig": "~7.2.8",
|
|
57
|
-
"@xylabs/vitest-extended": "~5.0.
|
|
58
|
-
"@xyo-network/account": "~5.1.
|
|
59
|
-
"@xyo-network/archivist-acceptance-tests": "~5.1.
|
|
60
|
-
"@xyo-network/archivist-wrapper": "~5.1.
|
|
61
|
-
"@xyo-network/boundwitness-builder": "~5.1.
|
|
62
|
-
"@xyo-network/payload-builder": "~5.1.
|
|
60
|
+
"@xylabs/vitest-extended": "~5.0.37",
|
|
61
|
+
"@xyo-network/account": "~5.1.24",
|
|
62
|
+
"@xyo-network/archivist-acceptance-tests": "~5.1.24",
|
|
63
|
+
"@xyo-network/archivist-wrapper": "~5.1.24",
|
|
64
|
+
"@xyo-network/boundwitness-builder": "~5.1.24",
|
|
65
|
+
"@xyo-network/payload-builder": "~5.1.24",
|
|
63
66
|
"typescript": "~5.9.3",
|
|
64
|
-
"vitest": "~4.0.
|
|
67
|
+
"vitest": "~4.0.10"
|
|
65
68
|
},
|
|
66
69
|
"engines": {
|
|
67
70
|
"node": ">=16"
|
package/src/ArchivistV2.ts
CHANGED
|
@@ -72,7 +72,7 @@ export class MongoDBArchivistV2 extends MongoDBArchivistBaseV2 {
|
|
|
72
72
|
if (!payloadsResult.acknowledged) throw new Error('MongoDBArchivist: Error inserting Payloads')
|
|
73
73
|
} catch (error) {
|
|
74
74
|
const mongoError = error as MongoError
|
|
75
|
-
//
|
|
75
|
+
// Intentional coercive equality since Mongo error codes are
|
|
76
76
|
// of type string | number
|
|
77
77
|
if (mongoError?.code != MONGODB_DUPLICATE_KEY_ERROR) throw error
|
|
78
78
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validByType.spec.d.ts","sourceRoot":"","sources":["../../../../src/lib/spec/validByType.spec.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Archivist.spec.d.ts","sourceRoot":"","sources":["../../../src/spec/Archivist.spec.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ArchivistV2.spec.d.ts","sourceRoot":"","sources":["../../../src/spec/ArchivistV2.spec.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAA"}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import '@xylabs/vitest-extended'
|
|
2
|
-
|
|
3
|
-
import { Account } from '@xyo-network/account'
|
|
4
|
-
import type { ArchivistInsertQuery } from '@xyo-network/archivist-model'
|
|
5
|
-
import { ArchivistInsertQuerySchema } from '@xyo-network/archivist-model'
|
|
6
|
-
import { BoundWitnessBuilder, QueryBoundWitnessBuilder } from '@xyo-network/boundwitness-builder'
|
|
7
|
-
import type { BoundWitness } from '@xyo-network/boundwitness-model'
|
|
8
|
-
import { PayloadBuilder } from '@xyo-network/payload-builder'
|
|
9
|
-
import type { Payload } from '@xyo-network/payload-model'
|
|
10
|
-
import type { PayloadWithMongoMeta } from '@xyo-network/payload-mongodb'
|
|
11
|
-
import {
|
|
12
|
-
beforeAll, describe, expect, it,
|
|
13
|
-
} from 'vitest'
|
|
14
|
-
|
|
15
|
-
import { validByType } from '../validByType.js'
|
|
16
|
-
|
|
17
|
-
type DebugPayloadWithMongoMeta = Partial<PayloadWithMongoMeta<{ nonce: string; schema: string }>> & { schema: string }
|
|
18
|
-
|
|
19
|
-
describe('validByType', () => {
|
|
20
|
-
const account = Account.random()
|
|
21
|
-
describe('QueryBoundWitness with Payloads & nested BoundWitnesses', () => {
|
|
22
|
-
let result: [BoundWitness[], Payload[]]
|
|
23
|
-
beforeAll(async () => {
|
|
24
|
-
const payload1 = new PayloadBuilder<DebugPayloadWithMongoMeta>({ schema: 'network.xyo.debug' }).fields({ nonce: '1' }).build()
|
|
25
|
-
const payload2 = new PayloadBuilder<DebugPayloadWithMongoMeta>({ schema: 'network.xyo.debug' }).fields({ nonce: '2' }).build()
|
|
26
|
-
const [innerBw] = await (new BoundWitnessBuilder().signer(await account).payload(payload2)).build()
|
|
27
|
-
const outer = await (new BoundWitnessBuilder().signer(await account).payloads([payload1, innerBw as Payload])).build()
|
|
28
|
-
const queryPayload: ArchivistInsertQuery = { schema: ArchivistInsertQuerySchema }
|
|
29
|
-
const query = await (new QueryBoundWitnessBuilder().signer(await account).query(queryPayload)).build()
|
|
30
|
-
const values = await PayloadBuilder.addStorageMeta([query[0], outer[0], innerBw as Payload, payload1, payload2])
|
|
31
|
-
result = await validByType(values)
|
|
32
|
-
})
|
|
33
|
-
it('extracts the BoundWitnesses', () => {
|
|
34
|
-
expect(result).toBeArray()
|
|
35
|
-
expect(result?.[0]).toBeArrayOfSize(3)
|
|
36
|
-
})
|
|
37
|
-
it('extracts the Payloads', () => {
|
|
38
|
-
expect(result?.[1]).toBeArrayOfSize(2)
|
|
39
|
-
})
|
|
40
|
-
})
|
|
41
|
-
describe('BoundWitness with Payloads & nested BoundWitnesses', () => {
|
|
42
|
-
let result: [BoundWitness[], Payload[]]
|
|
43
|
-
beforeAll(async () => {
|
|
44
|
-
const payload1 = new PayloadBuilder<DebugPayloadWithMongoMeta>({ schema: 'network.xyo.debug' }).fields({ nonce: '1' }).build()
|
|
45
|
-
const payload2 = new PayloadBuilder<DebugPayloadWithMongoMeta>({ schema: 'network.xyo.debug' }).fields({ nonce: '2' }).build()
|
|
46
|
-
const [innerBw] = await (new BoundWitnessBuilder().signer(await account).payload(payload2)).build()
|
|
47
|
-
const outer = await (new BoundWitnessBuilder().signer(await account).payloads([payload1, innerBw as Payload])).build()
|
|
48
|
-
const values = await PayloadBuilder.addStorageMeta([outer[0], innerBw as Payload, payload1, payload2])
|
|
49
|
-
result = await validByType(values)
|
|
50
|
-
})
|
|
51
|
-
it('extracts the BoundWitnesses', () => {
|
|
52
|
-
expect(result).toBeArray()
|
|
53
|
-
expect(result?.[0]).toBeArrayOfSize(2)
|
|
54
|
-
})
|
|
55
|
-
it('extracts the Payloads', () => {
|
|
56
|
-
expect(result?.[1]).toBeArrayOfSize(2)
|
|
57
|
-
})
|
|
58
|
-
})
|
|
59
|
-
describe('BoundWitness with Payloads', () => {
|
|
60
|
-
let result: [BoundWitness[], Payload[]]
|
|
61
|
-
beforeAll(async () => {
|
|
62
|
-
const payload1 = new PayloadBuilder<DebugPayloadWithMongoMeta>({ schema: 'network.xyo.debug' }).fields({ nonce: '1' }).build()
|
|
63
|
-
const payload2 = new PayloadBuilder<DebugPayloadWithMongoMeta>({ schema: 'network.xyo.debug' }).fields({ nonce: '2' }).build()
|
|
64
|
-
const outer = await new BoundWitnessBuilder().signer(await account).payloads([payload1, payload2]).build()
|
|
65
|
-
const values = await PayloadBuilder.addStorageMeta([outer[0], payload1, payload2])
|
|
66
|
-
result = await validByType(values)
|
|
67
|
-
})
|
|
68
|
-
it('extracts the BoundWitnesses', () => {
|
|
69
|
-
expect(result).toBeArray()
|
|
70
|
-
expect(result?.[0]).toBeArrayOfSize(1)
|
|
71
|
-
})
|
|
72
|
-
it('extracts the Payloads', () => {
|
|
73
|
-
expect(result?.[1]).toBeArrayOfSize(2)
|
|
74
|
-
})
|
|
75
|
-
})
|
|
76
|
-
describe('BoundWitness without Payloads', () => {
|
|
77
|
-
let result: [BoundWitness[], Payload[]]
|
|
78
|
-
beforeAll(async () => {
|
|
79
|
-
const outer = await new BoundWitnessBuilder().signer(await account).build()
|
|
80
|
-
const values = await PayloadBuilder.addStorageMeta([outer[0]])
|
|
81
|
-
result = await validByType(values)
|
|
82
|
-
})
|
|
83
|
-
it('extracts the BoundWitnesses', () => {
|
|
84
|
-
expect(result).toBeArray()
|
|
85
|
-
expect(result?.[0]).toBeArrayOfSize(1)
|
|
86
|
-
})
|
|
87
|
-
it('extracts the Payloads', () => {
|
|
88
|
-
expect(result?.[1]).toBeArrayOfSize(0)
|
|
89
|
-
})
|
|
90
|
-
})
|
|
91
|
-
})
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
import '@xylabs/vitest-extended'
|
|
2
|
-
|
|
3
|
-
import { delay } from '@xylabs/delay'
|
|
4
|
-
import type { BaseMongoSdkConfig } from '@xylabs/mongo'
|
|
5
|
-
import { Account } from '@xyo-network/account'
|
|
6
|
-
import type { ArchivistNextOptions } from '@xyo-network/archivist-model'
|
|
7
|
-
import { ArchivistWrapper } from '@xyo-network/archivist-wrapper'
|
|
8
|
-
import { BoundWitnessBuilder } from '@xyo-network/boundwitness-builder'
|
|
9
|
-
import { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'
|
|
10
|
-
import { COLLECTIONS, hasMongoDBConfig } from '@xyo-network/module-abstract-mongodb'
|
|
11
|
-
import { PayloadBuilder } from '@xyo-network/payload-builder'
|
|
12
|
-
import type { PayloadWrapperBase } from '@xyo-network/payload-wrapper'
|
|
13
|
-
import { PayloadWrapper } from '@xyo-network/payload-wrapper'
|
|
14
|
-
import {
|
|
15
|
-
beforeAll,
|
|
16
|
-
describe, expect, it,
|
|
17
|
-
} from 'vitest'
|
|
18
|
-
|
|
19
|
-
import { MongoDBArchivist } from '../Archivist.js'
|
|
20
|
-
|
|
21
|
-
type TestDataGetter<T> = () => T
|
|
22
|
-
|
|
23
|
-
describe.runIf(hasMongoDBConfig())('Archivist', () => {
|
|
24
|
-
const boundWitnessesConfig: BaseMongoSdkConfig = { collection: COLLECTIONS.BoundWitnesses }
|
|
25
|
-
const payloadsConfig: BaseMongoSdkConfig = { collection: COLLECTIONS.Payloads }
|
|
26
|
-
|
|
27
|
-
const payloadWrappers: PayloadWrapper[] = []
|
|
28
|
-
const boundWitnessWrappers: BoundWitnessWrapper[] = []
|
|
29
|
-
let archivist: ArchivistWrapper
|
|
30
|
-
beforeAll(async () => {
|
|
31
|
-
boundWitnessesConfig.dbConnectionString = process.env.MONGO_CONNECTION_STRING
|
|
32
|
-
payloadsConfig.dbConnectionString = process.env.MONGO_CONNECTION_STRING
|
|
33
|
-
|
|
34
|
-
const mod = await MongoDBArchivist.create({
|
|
35
|
-
account: 'random',
|
|
36
|
-
boundWitnessSdkConfig: boundWitnessesConfig,
|
|
37
|
-
config: { schema: MongoDBArchivist.defaultConfigSchema },
|
|
38
|
-
payloadSdkConfig: payloadsConfig,
|
|
39
|
-
})
|
|
40
|
-
archivist = new ArchivistWrapper({ mod: mod, account: await Account.random() })
|
|
41
|
-
const payload1 = { nonce: Date.now(), schema: 'network.xyo.debug' }
|
|
42
|
-
await delay(2)
|
|
43
|
-
const payload2 = { nonce: Date.now(), schema: 'network.xyo.test' }
|
|
44
|
-
await delay(2)
|
|
45
|
-
const payload3 = { nonce: Date.now(), schema: 'network.xyo.debug' }
|
|
46
|
-
await delay(2)
|
|
47
|
-
const payload4 = { nonce: Date.now(), schema: 'network.xyo.test' }
|
|
48
|
-
await delay(2)
|
|
49
|
-
const payloadWrapper1 = PayloadWrapper.wrap(payload1)
|
|
50
|
-
const payloadWrapper2 = PayloadWrapper.wrap(payload2)
|
|
51
|
-
const payloadWrapper3 = PayloadWrapper.wrap(payload3)
|
|
52
|
-
const payloadWrapper4 = PayloadWrapper.wrap(payload4)
|
|
53
|
-
payloadWrappers.push(payloadWrapper1, payloadWrapper2, payloadWrapper3, payloadWrapper4)
|
|
54
|
-
const signer = await Account.random()
|
|
55
|
-
const boundWitness1 = (await new BoundWitnessBuilder().payload(payloadWrapper1.payload).signer(signer).build())[0]
|
|
56
|
-
await delay(2)
|
|
57
|
-
const boundWitness2 = (await new BoundWitnessBuilder().payload(payloadWrapper2.payload).signer(signer).build())[0]
|
|
58
|
-
await delay(2)
|
|
59
|
-
const boundWitness3 = (
|
|
60
|
-
await new BoundWitnessBuilder().payloads([payloadWrapper3.payload, payloadWrapper4.payload]).signer(signer).build()
|
|
61
|
-
)[0]
|
|
62
|
-
const boundWitnessWrapper1 = BoundWitnessWrapper.parse(boundWitness1, [payload1])
|
|
63
|
-
const boundWitnessWrapper2 = BoundWitnessWrapper.parse(boundWitness2, [payload2])
|
|
64
|
-
const boundWitnessWrapper3 = BoundWitnessWrapper.parse(boundWitness3, [payload3, payload4])
|
|
65
|
-
boundWitnessWrappers.push(boundWitnessWrapper1, boundWitnessWrapper2, boundWitnessWrapper3)
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
describe('discover', () => {
|
|
69
|
-
it('discovers module', async () => {
|
|
70
|
-
const result = await archivist.state()
|
|
71
|
-
expect(result).toBeArray()
|
|
72
|
-
expect(result.length).toBeGreaterThan(0)
|
|
73
|
-
})
|
|
74
|
-
})
|
|
75
|
-
describe('insert', () => {
|
|
76
|
-
const cases: [string, TestDataGetter<PayloadWrapperBase[]>][] = [
|
|
77
|
-
['inserts single payload', () => [payloadWrappers[0]]],
|
|
78
|
-
['inserts multiple payloads', () => [payloadWrappers[1], payloadWrappers[2]]],
|
|
79
|
-
['inserts single boundwitness', () => [boundWitnessWrappers[0]]],
|
|
80
|
-
['inserts multiple boundwitness', () => [boundWitnessWrappers[1], boundWitnessWrappers[2]]],
|
|
81
|
-
]
|
|
82
|
-
it.each(cases)('%s', async (_title, getData) => {
|
|
83
|
-
const payloads = getData()
|
|
84
|
-
const results = await archivist.insert(payloads.map(w => w.payload))
|
|
85
|
-
expect(results).toBeArrayOfSize(payloads.length)
|
|
86
|
-
for (const [i, result] of results.entries()) {
|
|
87
|
-
const payload = payloads[i]
|
|
88
|
-
expect(await PayloadBuilder.dataHash(result)).toEqual(await payload.dataHash())
|
|
89
|
-
expect(await PayloadBuilder.dataHash(result)).toEqual(await PayloadBuilder.dataHash(payload.payload))
|
|
90
|
-
expect(await PayloadBuilder.hash(result)).toEqual(await PayloadBuilder.hash(payload.payload))
|
|
91
|
-
expect(PayloadBuilder.omitStorageMeta(result)).toEqual(payload.payload)
|
|
92
|
-
}
|
|
93
|
-
})
|
|
94
|
-
})
|
|
95
|
-
describe('get', () => {
|
|
96
|
-
const cases: [string, TestDataGetter<PayloadWrapperBase[]>][] = [
|
|
97
|
-
['gets single payload', () => [payloadWrappers[0]]],
|
|
98
|
-
['gets multiple payloads', () => [payloadWrappers[1], payloadWrappers[2]]],
|
|
99
|
-
['gets single boundwitness', () => [boundWitnessWrappers[0]]],
|
|
100
|
-
['gets multiple boundwitness', () => [boundWitnessWrappers[1], boundWitnessWrappers[2]]],
|
|
101
|
-
]
|
|
102
|
-
it.each(cases)('%s', async (_title, getData) => {
|
|
103
|
-
const payloads = getData()
|
|
104
|
-
const results = await archivist.get(await Promise.all(payloads.map(p => p.hash())))
|
|
105
|
-
for (const [i, result] of results.entries()) {
|
|
106
|
-
const payload = payloads[i]
|
|
107
|
-
expect(await PayloadBuilder.dataHash(result)).toEqual(await payload.dataHash())
|
|
108
|
-
expect(await PayloadBuilder.dataHash(result)).toEqual(await PayloadBuilder.dataHash(payload.payload))
|
|
109
|
-
expect(await PayloadBuilder.hash(result)).toEqual(await PayloadBuilder.hash(payload.payload))
|
|
110
|
-
expect(PayloadBuilder.omitStorageMeta(result)).toEqual(payload.payload)
|
|
111
|
-
}
|
|
112
|
-
})
|
|
113
|
-
})
|
|
114
|
-
// NOTE: Skipped because memory DB re-used by all tests
|
|
115
|
-
// causing these tests to be non-deterministic and fail
|
|
116
|
-
describe.skip('next', () => {
|
|
117
|
-
const payloads: BoundWitnessWrapper | PayloadWrapper[] = []
|
|
118
|
-
beforeAll(async () => {
|
|
119
|
-
for (let i = 0; i < 10; i++) {
|
|
120
|
-
const payload1 = { nonce: Date.now(), schema: 'network.xyo.debug' }
|
|
121
|
-
const payloadWrapper1 = PayloadWrapper.wrap(payload1)
|
|
122
|
-
await delay(2)
|
|
123
|
-
const payload2 = { nonce: Date.now(), schema: 'network.xyo.test' }
|
|
124
|
-
const payloadWrapper2 = PayloadWrapper.wrap(payload2)
|
|
125
|
-
await delay(2)
|
|
126
|
-
const signer = await Account.random()
|
|
127
|
-
const boundWitness = (await new BoundWitnessBuilder()
|
|
128
|
-
.payloads([payloadWrapper1, payloadWrapper2].map(p => p.payload))
|
|
129
|
-
.signer(signer)
|
|
130
|
-
.build())[0]
|
|
131
|
-
const boundWitnessWrapper = BoundWitnessWrapper.parse(boundWitness, [payload1, payload2])
|
|
132
|
-
await archivist.insert([boundWitnessWrapper.payload])
|
|
133
|
-
await delay(2)
|
|
134
|
-
await archivist.insert([payloadWrapper1.payload])
|
|
135
|
-
await delay(2)
|
|
136
|
-
await archivist.insert([payloadWrapper2.payload])
|
|
137
|
-
await delay(2)
|
|
138
|
-
payloads.push(boundWitnessWrapper, payloadWrapper1, payloadWrapper2)
|
|
139
|
-
}
|
|
140
|
-
})
|
|
141
|
-
describe('desc', () => {
|
|
142
|
-
describe('with no offset', () => {
|
|
143
|
-
it('returns payloads from the last one inserted in descending order', async () => {
|
|
144
|
-
const expected = payloads
|
|
145
|
-
const options: ArchivistNextOptions = { limit: expected.length, order: 'desc' }
|
|
146
|
-
const results = await archivist.next(options)
|
|
147
|
-
expect(results).toBeArrayOfSize(expected.length)
|
|
148
|
-
for (const [i, result] of results.toReversed().entries()) {
|
|
149
|
-
const payload = expected[i]
|
|
150
|
-
expect(await PayloadBuilder.dataHash(result)).toEqual(await payload.dataHash())
|
|
151
|
-
expect(await PayloadBuilder.dataHash(result)).toEqual(await PayloadBuilder.dataHash(payload.payload))
|
|
152
|
-
expect(await PayloadBuilder.hash(result)).toEqual(await PayloadBuilder.hash(payload.payload))
|
|
153
|
-
expect(result).toEqual(payload.payload)
|
|
154
|
-
}
|
|
155
|
-
})
|
|
156
|
-
})
|
|
157
|
-
})
|
|
158
|
-
})
|
|
159
|
-
})
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import '@xylabs/vitest-extended'
|
|
2
|
-
|
|
3
|
-
import { delay } from '@xylabs/delay'
|
|
4
|
-
import type { BaseMongoSdkConfig } from '@xylabs/mongo'
|
|
5
|
-
import { Account } from '@xyo-network/account'
|
|
6
|
-
import { generateArchivistNextTests } from '@xyo-network/archivist-acceptance-tests'
|
|
7
|
-
import { ArchivistWrapper } from '@xyo-network/archivist-wrapper'
|
|
8
|
-
import { BoundWitnessBuilder } from '@xyo-network/boundwitness-builder'
|
|
9
|
-
import type { BoundWitness } from '@xyo-network/boundwitness-model'
|
|
10
|
-
import { hasMongoDBConfig } from '@xyo-network/module-abstract-mongodb'
|
|
11
|
-
import { PayloadBuilder } from '@xyo-network/payload-builder'
|
|
12
|
-
import type { Payload } from '@xyo-network/payload-model'
|
|
13
|
-
import {
|
|
14
|
-
beforeAll,
|
|
15
|
-
describe, expect, it,
|
|
16
|
-
} from 'vitest'
|
|
17
|
-
|
|
18
|
-
import { MongoDBArchivistV2 } from '../ArchivistV2.ts'
|
|
19
|
-
|
|
20
|
-
type TestDataGetter<T> = () => T
|
|
21
|
-
|
|
22
|
-
describe.runIf(hasMongoDBConfig())('ArchivistV2', () => {
|
|
23
|
-
const payloadsConfig: BaseMongoSdkConfig = { collection: 'test' }
|
|
24
|
-
const payloads: Payload[] = []
|
|
25
|
-
const boundWitnesses: BoundWitness[] = []
|
|
26
|
-
let archivist: ArchivistWrapper
|
|
27
|
-
beforeAll(async () => {
|
|
28
|
-
payloadsConfig.dbConnectionString = process.env.MONGO_CONNECTION_STRING
|
|
29
|
-
const mod = await MongoDBArchivistV2.create({
|
|
30
|
-
account: 'random',
|
|
31
|
-
config: { schema: MongoDBArchivistV2.defaultConfigSchema },
|
|
32
|
-
payloadSdkConfig: payloadsConfig,
|
|
33
|
-
})
|
|
34
|
-
await mod.start()
|
|
35
|
-
archivist = new ArchivistWrapper({ mod: mod, account: await Account.random() })
|
|
36
|
-
const payload1: Payload = new PayloadBuilder({ schema: 'network.xyo.debug' }).fields({ nonce: Date.now() }).build()
|
|
37
|
-
await delay(2)
|
|
38
|
-
const payload2: Payload = new PayloadBuilder({ schema: 'network.xyo.test' }).fields({ nonce: Date.now() }).build()
|
|
39
|
-
await delay(2)
|
|
40
|
-
const payload3: Payload = new PayloadBuilder({ schema: 'network.xyo.debug' }).fields({ nonce: Date.now() }).build()
|
|
41
|
-
await delay(2)
|
|
42
|
-
const payload4: Payload = new PayloadBuilder({ schema: 'network.xyo.test' }).fields({ nonce: Date.now() }).build()
|
|
43
|
-
await delay(2)
|
|
44
|
-
payloads.push(payload1, payload2, payload3, payload4)
|
|
45
|
-
const signer = await Account.random()
|
|
46
|
-
const boundWitness1 = (await new BoundWitnessBuilder().payload(payload1).signer(signer).build())[0]
|
|
47
|
-
await delay(2)
|
|
48
|
-
const boundWitness2 = (await new BoundWitnessBuilder().payload(payload2).signer(signer).build())[0]
|
|
49
|
-
await delay(2)
|
|
50
|
-
const boundWitness3 = (
|
|
51
|
-
await new BoundWitnessBuilder().payloads([payload3, payload4]).signer(signer).build()
|
|
52
|
-
)[0]
|
|
53
|
-
boundWitnesses.push(boundWitness1, boundWitness2, boundWitness3)
|
|
54
|
-
}, 1_000_000)
|
|
55
|
-
|
|
56
|
-
describe('discover', () => {
|
|
57
|
-
it('discovers module', async () => {
|
|
58
|
-
const result = await archivist.state()
|
|
59
|
-
expect(result).toBeArray()
|
|
60
|
-
expect(result.length).toBeGreaterThan(0)
|
|
61
|
-
})
|
|
62
|
-
})
|
|
63
|
-
describe('insert', () => {
|
|
64
|
-
const cases: [string, TestDataGetter<Payload[]>][] = [
|
|
65
|
-
['inserts single payload', () => [payloads[0]]],
|
|
66
|
-
['inserts multiple payloads', () => [payloads[1], payloads[2]]],
|
|
67
|
-
['inserts single boundwitness', () => [boundWitnesses[0]]],
|
|
68
|
-
['inserts multiple boundwitness', () => [boundWitnesses[1], boundWitnesses[2]]],
|
|
69
|
-
]
|
|
70
|
-
it.each(cases)('%s', async (_title, getData) => {
|
|
71
|
-
const payloads = getData()
|
|
72
|
-
const results = await archivist.insert(payloads)
|
|
73
|
-
expect(results).toBeArrayOfSize(payloads.length)
|
|
74
|
-
for (const [i, result] of results.entries()) {
|
|
75
|
-
const payload = payloads[i]
|
|
76
|
-
expect(await PayloadBuilder.dataHash(result)).toEqual(await PayloadBuilder.dataHash(payload))
|
|
77
|
-
expect(await PayloadBuilder.hash(result)).toEqual(await PayloadBuilder.hash(payload))
|
|
78
|
-
expect(PayloadBuilder.omitStorageMeta(result)).toEqual(payload)
|
|
79
|
-
}
|
|
80
|
-
})
|
|
81
|
-
})
|
|
82
|
-
describe('insert (duplicates)', () => {
|
|
83
|
-
const cases: [string, TestDataGetter<Payload[]>][] = [
|
|
84
|
-
['inserts single payload', () => [payloads[0]]],
|
|
85
|
-
['inserts multiple payloads', () => [payloads[1], payloads[2]]],
|
|
86
|
-
['inserts single boundwitness', () => [boundWitnesses[0]]],
|
|
87
|
-
['inserts multiple boundwitness', () => [boundWitnesses[1], boundWitnesses[2]]],
|
|
88
|
-
]
|
|
89
|
-
it.each(cases)('%s', async (_title, getData) => {
|
|
90
|
-
const payloads = getData()
|
|
91
|
-
const results = await archivist.insert(payloads)
|
|
92
|
-
expect(results).toBeArrayOfSize(0)
|
|
93
|
-
for (const [i, result] of results.entries()) {
|
|
94
|
-
const payload = payloads[i]
|
|
95
|
-
expect(await PayloadBuilder.dataHash(result)).toEqual(await PayloadBuilder.dataHash(payload))
|
|
96
|
-
expect(await PayloadBuilder.hash(result)).toEqual(await PayloadBuilder.hash(payload))
|
|
97
|
-
expect(PayloadBuilder.omitStorageMeta(result)).toEqual(payload)
|
|
98
|
-
}
|
|
99
|
-
})
|
|
100
|
-
})
|
|
101
|
-
describe('get', () => {
|
|
102
|
-
const cases: [string, TestDataGetter<Payload[]>][] = [
|
|
103
|
-
['gets single payload', () => [payloads[0]]],
|
|
104
|
-
['gets multiple payloads', () => [payloads[1], payloads[2]]],
|
|
105
|
-
['gets single boundwitness', () => [boundWitnesses[0]]],
|
|
106
|
-
['gets multiple boundwitness', () => [boundWitnesses[1], boundWitnesses[2]]],
|
|
107
|
-
]
|
|
108
|
-
it.each(cases)('%s', async (_title, getData) => {
|
|
109
|
-
const payloads = getData()
|
|
110
|
-
const hashes = await PayloadBuilder.hashes(payloads)
|
|
111
|
-
const results = await archivist.get(hashes)
|
|
112
|
-
expect(results).toBeArrayOfSize(payloads.length)
|
|
113
|
-
for (const [i, result] of results.entries()) {
|
|
114
|
-
const payload = payloads[i]
|
|
115
|
-
expect(PayloadBuilder.omitStorageMeta(result)).toEqual(payload)
|
|
116
|
-
expect(await PayloadBuilder.dataHash(result)).toEqual(await PayloadBuilder.dataHash(payload))
|
|
117
|
-
expect(await PayloadBuilder.hash(result)).toEqual(await PayloadBuilder.hash(payload))
|
|
118
|
-
expect(PayloadBuilder.omitStorageMeta(result)).toEqual(payload)
|
|
119
|
-
}
|
|
120
|
-
})
|
|
121
|
-
})
|
|
122
|
-
generateArchivistNextTests(() => {
|
|
123
|
-
return Promise.resolve(archivist)
|
|
124
|
-
})
|
|
125
|
-
})
|