@xyo-network/archivist-mongodb 3.1.5 → 3.1.7
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/browser/Archivist.d.ts +7 -0
- package/dist/browser/Archivist.d.ts.map +1 -1
- package/dist/browser/index.mjs +118 -9
- package/dist/browser/index.mjs.map +1 -1
- package/dist/neutral/Archivist.d.ts +7 -0
- package/dist/neutral/Archivist.d.ts.map +1 -1
- package/dist/neutral/index.mjs +118 -9
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/node/Archivist.d.ts +7 -0
- package/dist/node/Archivist.d.ts.map +1 -1
- package/dist/node/index.mjs +118 -9
- package/dist/node/index.mjs.map +1 -1
- package/package.json +24 -21
- package/src/Archivist.ts +99 -6
- package/src/lib/validByType.ts +2 -2
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Hash } from '@xylabs/hex';
|
|
2
2
|
import { AbstractArchivist } from '@xyo-network/archivist-abstract';
|
|
3
|
+
import type { ArchivistNextOptions } from '@xyo-network/archivist-model';
|
|
3
4
|
import type { Payload, Schema, WithMeta } from '@xyo-network/payload-model';
|
|
4
5
|
import type { PayloadWithMongoMeta } from '@xyo-network/payload-mongodb';
|
|
5
6
|
declare const MongoDBArchivistBase: (abstract new (...args: any[]) => {
|
|
@@ -67,9 +68,15 @@ export declare class MongoDBArchivist extends MongoDBArchivistBase {
|
|
|
67
68
|
static readonly configSchemas: Schema[];
|
|
68
69
|
static readonly defaultConfigSchema: Schema;
|
|
69
70
|
readonly queries: string[];
|
|
71
|
+
/**
|
|
72
|
+
* The amount of time to allow the aggregate query to execute
|
|
73
|
+
*/
|
|
74
|
+
protected readonly aggregateTimeoutMs = 10000;
|
|
70
75
|
head(): Promise<Payload | undefined>;
|
|
76
|
+
protected findOneByHash(hash: Hash): Promise<import("mongodb").WithId<PayloadWithMongoMeta> | undefined>;
|
|
71
77
|
protected getHandler(hashes: Hash[]): Promise<WithMeta<Payload>[]>;
|
|
72
78
|
protected insertHandler(payloads: Payload[]): Promise<WithMeta<Payload>[]>;
|
|
79
|
+
protected nextHandler(options?: ArchivistNextOptions): Promise<WithMeta<Payload>[]>;
|
|
73
80
|
protected startHandler(): Promise<boolean>;
|
|
74
81
|
}
|
|
75
82
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Archivist.d.ts","sourceRoot":"","sources":["../../src/Archivist.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"Archivist.d.ts","sourceRoot":"","sources":["../../src/Archivist.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AACvC,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,EAC1B,MAAM,4BAA4B,CAAA;AACnC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAOxE,QAAA,MAAM,oBAAoB;;;;;8BA6CsC,8BAA8B;;;;oBAMzF,aAAa;;+CA7CqE,+BAEnF;0CAGQ,+BAA8B;uBAGtC,mCAA+B;;;;;;;qBAuCnB,2BAA2B;;yBA7DT,4BACR;;mCACkB,4BAA4B;;uBACb,4BAClC,wBAEZ,4BAA4B,8BAEhB,2BAA2B,iCAEnC,2BAA2B,8BAC/B,4BAA4B,wBAAwB,4BAA4B,8BAC9E,2BAA2B,iCAAiC,2BAE5D;iCAAsD,CAAC,iBAAiB,+BAEnF;4BAED,CAAH,iBACY,+BAA8B;2BAGtC,mCAA+B;;;;;;;8CAMd,2BAErB;;wCAC8D,+BAC5C,6CAGV,+BAA6B;0BAE3B,8BACE;mCAC0B,+BAA+B,6CAE7D,+BAKC;;+BAeoG,iBACxG;;6BACqB,iCAAiC,6BAE/C,iCAAiC,0CAA0C,2BAA2B,wBAAwB,2BAC1H,kCAAkC,CAAC,SAAS,4BAC3D,wBAAwB,CAAC,mBAAmB,iBAAiB,oBAAoB,2BAC7E;iCAGgC,iCAAiC,6BACjE,iCAAiC,4CACH,2BAA0B,wBAAwB,2BAA2B,kCAChF,CAAC,SAAS,4BACnB,wBAAwB,CAAC,qBAAqB,iBACrE;yBAAgD,iBAAiB;wBACzD,iBAAa;sBAA6C,2BAEjD;4CAAuE,2BAA2B,0CAC/E,2BAC1B;yCAA8E,2BAC7E,oEAAoE,2BAA2B;+CAItG,2BAAsB,oEAAoE,2BAA2B;2CAGrC,2BAC5E,0CAEF,2BAAqB;wCAIvB,2BAAyB,mFAKxB,4BACU,uBAAuB,2BAC5B;4BACJ,4BAA4B;uCAGM,2BAC7B,mFAC+C,4BACvD,uBAAuB,2BACzB,gDAAgD,4BAE1C;2BAGF,4BAA4B,4BACb,4BAA2B;yCACT,2BAClB,mEAEb,4BACJ,uBAAuB,2BAA2B,gDAE7C,4BAAmB;;;4BApHuC,CAAA;AAElE,qBAAa,gBAAiB,SAAQ,oBAAoB;IACxD,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;IAE/B,IAAI,IAAI,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;cAKnC,aAAa,CAAC,IAAI,EAAE,IAAI;cAoBf,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;cAyBxD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;cAkBhE,WAAW,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;cAkEzE,YAAY;CAKtC"}
|
package/dist/browser/index.mjs
CHANGED
|
@@ -4,12 +4,13 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
|
|
|
4
4
|
// src/Archivist.ts
|
|
5
5
|
import { exists } from "@xylabs/exists";
|
|
6
6
|
import { AbstractArchivist } from "@xyo-network/archivist-abstract";
|
|
7
|
-
import { ArchivistInsertQuerySchema } from "@xyo-network/archivist-model";
|
|
7
|
+
import { ArchivistInsertQuerySchema, ArchivistNextQuerySchema } from "@xyo-network/archivist-model";
|
|
8
8
|
import { MongoDBArchivistConfigSchema } from "@xyo-network/archivist-model-mongodb";
|
|
9
9
|
import { MongoDBModuleMixin } from "@xyo-network/module-abstract-mongodb";
|
|
10
10
|
import { PayloadBuilder } from "@xyo-network/payload-builder";
|
|
11
11
|
import { fromDbRepresentation, toDbRepresentation } from "@xyo-network/payload-mongodb";
|
|
12
12
|
import { PayloadWrapper as PayloadWrapper2 } from "@xyo-network/payload-wrapper";
|
|
13
|
+
import { ObjectId } from "mongodb";
|
|
13
14
|
|
|
14
15
|
// src/lib/validByType.ts
|
|
15
16
|
import { isBoundWitness, isQueryBoundWitness } from "@xyo-network/boundwitness-model";
|
|
@@ -25,7 +26,7 @@ var validByType = /* @__PURE__ */ __name(async (payloads = []) => {
|
|
|
25
26
|
const wrapper = isQueryBoundWitness(payload) ? QueryBoundWitnessWrapper : BoundWitnessWrapper;
|
|
26
27
|
const bw = wrapper.parse(payload);
|
|
27
28
|
if (await bw.getValid()) {
|
|
28
|
-
results[0].push(
|
|
29
|
+
results[0].push(payload);
|
|
29
30
|
} else {
|
|
30
31
|
const errors = await bw.getErrors();
|
|
31
32
|
console.log(`validByType.Error: ${JSON.stringify(errors, null, 2)}`);
|
|
@@ -33,7 +34,7 @@ var validByType = /* @__PURE__ */ __name(async (payloads = []) => {
|
|
|
33
34
|
} else {
|
|
34
35
|
const payloadWrapper = PayloadWrapper.wrap(payload);
|
|
35
36
|
if (await payloadWrapper.getValid()) {
|
|
36
|
-
results[1].push(
|
|
37
|
+
results[1].push(payload);
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
40
|
return;
|
|
@@ -54,14 +55,47 @@ var MongoDBArchivist = class extends MongoDBArchivistBase {
|
|
|
54
55
|
static defaultConfigSchema = MongoDBArchivistConfigSchema;
|
|
55
56
|
queries = [
|
|
56
57
|
ArchivistInsertQuerySchema,
|
|
58
|
+
ArchivistNextQuerySchema,
|
|
57
59
|
...super.queries
|
|
58
60
|
];
|
|
61
|
+
/**
|
|
62
|
+
* The amount of time to allow the aggregate query to execute
|
|
63
|
+
*/
|
|
64
|
+
aggregateTimeoutMs = 1e4;
|
|
59
65
|
async head() {
|
|
60
|
-
const head = await
|
|
61
|
-
|
|
62
|
-
|
|
66
|
+
const head = await this.next({
|
|
67
|
+
limit: 1,
|
|
68
|
+
order: "desc"
|
|
69
|
+
});
|
|
63
70
|
return head[0] ? PayloadWrapper2.wrap(head[0]).payload : void 0;
|
|
64
71
|
}
|
|
72
|
+
async findOneByHash(hash) {
|
|
73
|
+
const dataPayload = await this.payloads.findOne({
|
|
74
|
+
_$hash: hash
|
|
75
|
+
});
|
|
76
|
+
if (dataPayload) {
|
|
77
|
+
return dataPayload;
|
|
78
|
+
} else {
|
|
79
|
+
const dataBw = await this.boundWitnesses.findOne({
|
|
80
|
+
_$hash: hash
|
|
81
|
+
});
|
|
82
|
+
if (dataBw) {
|
|
83
|
+
return dataBw;
|
|
84
|
+
} else {
|
|
85
|
+
const payload = await this.payloads.findOne({
|
|
86
|
+
_hash: hash
|
|
87
|
+
});
|
|
88
|
+
if (payload) {
|
|
89
|
+
return payload;
|
|
90
|
+
} else {
|
|
91
|
+
const bw = await this.boundWitnesses.findOne({
|
|
92
|
+
_hash: hash
|
|
93
|
+
});
|
|
94
|
+
return bw ?? void 0;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
65
99
|
async getHandler(hashes) {
|
|
66
100
|
let remainingHashes = [
|
|
67
101
|
...hashes
|
|
@@ -100,17 +134,92 @@ var MongoDBArchivist = class extends MongoDBArchivistBase {
|
|
|
100
134
|
const payloadsWithExternalMeta = await Promise.all(p.map((value, index) => toDbRepresentation(value, index)));
|
|
101
135
|
if (payloadsWithExternalMeta.length > 0) {
|
|
102
136
|
const payloadsResult = await this.payloads.insertMany(payloadsWithExternalMeta);
|
|
103
|
-
if (!payloadsResult.acknowledged || payloadsResult.insertedCount !== payloadsWithExternalMeta.length) throw new Error("
|
|
137
|
+
if (!payloadsResult.acknowledged || payloadsResult.insertedCount !== payloadsWithExternalMeta.length) throw new Error("MongoDBArchivist: Error inserting Payloads");
|
|
104
138
|
}
|
|
105
139
|
const boundWitnessesWithExternalMeta = await Promise.all(bw.map((value, index) => toDbRepresentation(value, index)));
|
|
106
140
|
if (boundWitnessesWithExternalMeta.length > 0) {
|
|
107
141
|
const boundWitnessesResult = await this.boundWitnesses.insertMany(boundWitnessesWithExternalMeta);
|
|
108
|
-
if (!boundWitnessesResult.acknowledged || boundWitnessesResult.insertedCount !== boundWitnessesWithExternalMeta.length) throw new Error("
|
|
142
|
+
if (!boundWitnessesResult.acknowledged || boundWitnessesResult.insertedCount !== boundWitnessesWithExternalMeta.length) throw new Error("MongoDBArchivist: Error inserting BoundWitnesses");
|
|
109
143
|
}
|
|
110
144
|
return await PayloadBuilder.build([
|
|
111
145
|
...boundWitnessesWithExternalMeta,
|
|
112
146
|
...payloadsWithExternalMeta
|
|
113
|
-
]);
|
|
147
|
+
].map(fromDbRepresentation));
|
|
148
|
+
}
|
|
149
|
+
async nextHandler(options) {
|
|
150
|
+
let { limit, offset, order } = options ?? {
|
|
151
|
+
limit: 10,
|
|
152
|
+
order: "desc"
|
|
153
|
+
};
|
|
154
|
+
if (!limit) limit = 10;
|
|
155
|
+
if (limit > 100) limit = 100;
|
|
156
|
+
if (order != "asc") order = "desc";
|
|
157
|
+
let id;
|
|
158
|
+
if (offset) {
|
|
159
|
+
const payload = await this.findOneByHash(offset);
|
|
160
|
+
if (payload) id = payload._id;
|
|
161
|
+
} else {
|
|
162
|
+
id = order === "asc" ? ObjectId.createFromTime(0) : ObjectId.createFromTime((Date.now() + 1e4) / 1e3);
|
|
163
|
+
}
|
|
164
|
+
if (!id) return [];
|
|
165
|
+
const sort = order === "asc" ? 1 : -1;
|
|
166
|
+
const match = order === "asc" ? {
|
|
167
|
+
_id: {
|
|
168
|
+
$gt: id
|
|
169
|
+
}
|
|
170
|
+
} : {
|
|
171
|
+
_id: {
|
|
172
|
+
$lt: id
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
const foundPayloads = await this.payloads.useCollection((collection) => {
|
|
176
|
+
return collection.aggregate([
|
|
177
|
+
// Pre-filter payloads collection
|
|
178
|
+
{
|
|
179
|
+
$match: match
|
|
180
|
+
},
|
|
181
|
+
// Sort payloads by _id
|
|
182
|
+
{
|
|
183
|
+
$sort: {
|
|
184
|
+
_id: sort
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
// Limit payloads to the first N payloads
|
|
188
|
+
{
|
|
189
|
+
$limit: limit
|
|
190
|
+
},
|
|
191
|
+
// Combine with filtered boundWitnesses collection
|
|
192
|
+
{
|
|
193
|
+
$unionWith: {
|
|
194
|
+
coll: this.boundWitnessSdkConfig.collection,
|
|
195
|
+
pipeline: [
|
|
196
|
+
{
|
|
197
|
+
$match: match
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
$sort: {
|
|
201
|
+
_id: sort
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
$limit: limit
|
|
206
|
+
}
|
|
207
|
+
]
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
// Sort the combined result by _id
|
|
211
|
+
{
|
|
212
|
+
$sort: {
|
|
213
|
+
_id: sort
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
// Limit the final result to N documents
|
|
217
|
+
{
|
|
218
|
+
$limit: limit
|
|
219
|
+
}
|
|
220
|
+
]).maxTimeMS(this.aggregateTimeoutMs).toArray();
|
|
221
|
+
});
|
|
222
|
+
return await PayloadBuilder.build(foundPayloads.map(fromDbRepresentation));
|
|
114
223
|
}
|
|
115
224
|
async startHandler() {
|
|
116
225
|
await super.startHandler();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Archivist.ts","../../src/lib/validByType.ts","../../src/index.ts"],"sourcesContent":["import { exists } from '@xylabs/exists'\nimport type { Hash } from '@xylabs/hex'\nimport { AbstractArchivist } from '@xyo-network/archivist-abstract'\nimport { ArchivistInsertQuerySchema } from '@xyo-network/archivist-model'\nimport { MongoDBArchivistConfigSchema } from '@xyo-network/archivist-model-mongodb'\nimport { MongoDBModuleMixin } from '@xyo-network/module-abstract-mongodb'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n Payload, Schema, WithMeta,\n} from '@xyo-network/payload-model'\nimport type { PayloadWithMongoMeta } from '@xyo-network/payload-mongodb'\nimport { fromDbRepresentation, toDbRepresentation } from '@xyo-network/payload-mongodb'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\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 readonly queries: string[] = [ArchivistInsertQuerySchema, ...super.queries]\n\n override async head(): Promise<Payload | undefined> {\n const head = await (await this.payloads.find({})).sort({ _timestamp: -1 }).limit(1).toArray()\n return head[0] ? PayloadWrapper.wrap(head[0]).payload : undefined\n }\n\n protected override async getHandler(hashes: Hash[]): Promise<WithMeta<Payload>[]> {\n let remainingHashes = [...hashes]\n\n const dataPayloads = (await Promise.all(remainingHashes.map(_$hash => this.payloads.findOne({ _$hash })))).filter(exists)\n const dataPayloadsHashes = new Set(dataPayloads.map(payload => payload._$hash))\n remainingHashes = remainingHashes.filter(hash => !dataPayloadsHashes.has(hash))\n\n const dataBws = (await Promise.all(remainingHashes.map(_$hash => this.boundWitnesses.findOne({ _$hash })))).filter(exists)\n const dataBwsHashes = new Set(dataBws.map(payload => payload._$hash))\n remainingHashes = remainingHashes.filter(hash => !dataBwsHashes.has(hash))\n\n const payloads = (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 = (await Promise.all(remainingHashes.map(_hash => this.boundWitnesses.findOne({ _hash })))).filter(exists)\n const bwsHashes = new Set(bws.map(payload => payload._hash))\n remainingHashes = remainingHashes.filter(hash => !bwsHashes.has(hash))\n\n const foundPayloads = [...dataPayloads, ...dataBws, ...payloads, ...bws] as PayloadWithMongoMeta<Payload & { _$hash: Hash; _$meta?: unknown }>[]\n const result = await PayloadBuilder.build(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: Payload[]): Promise<WithMeta<Payload>[]> {\n const [bw, p] = await validByType(payloads)\n const payloadsWithExternalMeta = await Promise.all(p.map((value, index) => toDbRepresentation(value, index)))\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('MongoDBDeterministicArchivist: Error inserting Payloads')\n }\n const boundWitnessesWithExternalMeta = await Promise.all(bw.map((value, index) => toDbRepresentation(value, index)))\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('MongoDBDeterministicArchivist: Error inserting BoundWitnesses')\n }\n\n return await PayloadBuilder.build([...boundWitnessesWithExternalMeta, ...payloadsWithExternalMeta])\n }\n\n protected override async startHandler() {\n await super.startHandler()\n await this.ensureIndexes()\n return true\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 } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport const validByType = async (payloads: Payload[] = []) => {\n const results: [BoundWitness[], 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(bw.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(payloadWrapper.payload)\n }\n }\n return\n }),\n )\n return results\n}\n","export * from './Archivist.js'\nexport * from '@xyo-network/archivist-model-mongodb'\n"],"mappings":"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","names":["exists","AbstractArchivist","ArchivistInsertQuerySchema","MongoDBArchivistConfigSchema","MongoDBModuleMixin","PayloadBuilder","fromDbRepresentation","toDbRepresentation","PayloadWrapper","isBoundWitness","isQueryBoundWitness","BoundWitnessWrapper","QueryBoundWitnessWrapper","PayloadWrapper","validByType","payloads","results","Promise","all","map","payload","isBoundWitness","wrapper","isQueryBoundWitness","QueryBoundWitnessWrapper","BoundWitnessWrapper","bw","parse","getValid","push","errors","getErrors","console","log","JSON","stringify","payloadWrapper","PayloadWrapper","wrap","MongoDBArchivistBase","MongoDBModuleMixin","AbstractArchivist","MongoDBArchivist","configSchemas","MongoDBArchivistConfigSchema","defaultConfigSchema","queries","ArchivistInsertQuerySchema","head","payloads","find","sort","_timestamp","limit","toArray","PayloadWrapper","wrap","payload","undefined","getHandler","hashes","remainingHashes","dataPayloads","Promise","all","map","_$hash","findOne","filter","exists","dataPayloadsHashes","Set","hash","has","dataBws","boundWitnesses","dataBwsHashes","_hash","payloadsHashes","bws","bwsHashes","foundPayloads","result","PayloadBuilder","build","fromDbRepresentation","insertHandler","bw","p","validByType","payloadsWithExternalMeta","value","index","toDbRepresentation","length","payloadsResult","insertMany","acknowledged","insertedCount","Error","boundWitnessesWithExternalMeta","boundWitnessesResult","startHandler","ensureIndexes"]}
|
|
1
|
+
{"version":3,"sources":["../../src/Archivist.ts","../../src/lib/validByType.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 { MongoDBModuleMixin } from '@xyo-network/module-abstract-mongodb'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n Payload, Schema, WithMeta,\n} from '@xyo-network/payload-model'\nimport type { PayloadWithMongoMeta } from '@xyo-network/payload-mongodb'\nimport { fromDbRepresentation, toDbRepresentation } from '@xyo-network/payload-mongodb'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\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 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 override async head(): Promise<Payload | undefined> {\n const head = await this.next({ limit: 1, order: 'desc' })\n return head[0] ? PayloadWrapper.wrap(head[0]).payload : undefined\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 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 override async getHandler(hashes: Hash[]): Promise<WithMeta<Payload>[]> {\n let remainingHashes = [...hashes]\n\n const dataPayloads = (await Promise.all(remainingHashes.map(_$hash => this.payloads.findOne({ _$hash })))).filter(exists)\n const dataPayloadsHashes = new Set(dataPayloads.map(payload => payload._$hash))\n remainingHashes = remainingHashes.filter(hash => !dataPayloadsHashes.has(hash))\n\n const dataBws = (await Promise.all(remainingHashes.map(_$hash => this.boundWitnesses.findOne({ _$hash })))).filter(exists)\n const dataBwsHashes = new Set(dataBws.map(payload => payload._$hash))\n remainingHashes = remainingHashes.filter(hash => !dataBwsHashes.has(hash))\n\n const payloads = (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 = (await Promise.all(remainingHashes.map(_hash => this.boundWitnesses.findOne({ _hash })))).filter(exists)\n const bwsHashes = new Set(bws.map(payload => payload._hash))\n remainingHashes = remainingHashes.filter(hash => !bwsHashes.has(hash))\n\n const foundPayloads = [...dataPayloads, ...dataBws, ...payloads, ...bws] as PayloadWithMongoMeta<Payload & { _$hash: Hash; _$meta?: unknown }>[]\n const result = await PayloadBuilder.build(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: Payload[]): Promise<WithMeta<Payload>[]> {\n const [bw, p] = await validByType(payloads)\n const payloadsWithExternalMeta = await Promise.all(p.map((value, index) => toDbRepresentation(value, index)))\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 const boundWitnessesWithExternalMeta = await Promise.all(bw.map((value, index) => toDbRepresentation(value, index)))\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 await PayloadBuilder.build([...boundWitnessesWithExternalMeta, ...payloadsWithExternalMeta].map(fromDbRepresentation))\n }\n\n protected override async nextHandler(options?: ArchivistNextOptions): Promise<WithMeta<Payload>[]> {\n // Sanitize inputs and set defaults\n let {\n limit, offset, order,\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 (offset) {\n const payload = await this.findOneByHash(offset)\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' ? { _id: { $gt: 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 await PayloadBuilder.build(foundPayloads.map(fromDbRepresentation))\n }\n\n protected override async startHandler() {\n await super.startHandler()\n await this.ensureIndexes()\n return true\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 } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport const validByType = async (payloads: Payload[] = []) => {\n const results: [BoundWitness[], 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 return\n }),\n )\n return results\n}\n","export * from './Archivist.js'\nexport * from '@xyo-network/archivist-model-mongodb'\n"],"mappings":"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","names":["exists","AbstractArchivist","ArchivistInsertQuerySchema","ArchivistNextQuerySchema","MongoDBArchivistConfigSchema","MongoDBModuleMixin","PayloadBuilder","fromDbRepresentation","toDbRepresentation","PayloadWrapper","ObjectId","isBoundWitness","isQueryBoundWitness","BoundWitnessWrapper","QueryBoundWitnessWrapper","PayloadWrapper","validByType","payloads","results","Promise","all","map","payload","isBoundWitness","wrapper","isQueryBoundWitness","QueryBoundWitnessWrapper","BoundWitnessWrapper","bw","parse","getValid","push","errors","getErrors","console","log","JSON","stringify","payloadWrapper","PayloadWrapper","wrap","MongoDBArchivistBase","MongoDBModuleMixin","AbstractArchivist","MongoDBArchivist","configSchemas","MongoDBArchivistConfigSchema","defaultConfigSchema","queries","ArchivistInsertQuerySchema","ArchivistNextQuerySchema","aggregateTimeoutMs","head","next","limit","order","PayloadWrapper","wrap","payload","undefined","findOneByHash","hash","dataPayload","payloads","findOne","_$hash","dataBw","boundWitnesses","_hash","bw","getHandler","hashes","remainingHashes","dataPayloads","Promise","all","map","filter","exists","dataPayloadsHashes","Set","has","dataBws","dataBwsHashes","payloadsHashes","bws","bwsHashes","foundPayloads","result","PayloadBuilder","build","fromDbRepresentation","insertHandler","p","validByType","payloadsWithExternalMeta","value","index","toDbRepresentation","length","payloadsResult","insertMany","acknowledged","insertedCount","Error","boundWitnessesWithExternalMeta","boundWitnessesResult","nextHandler","options","offset","id","_id","ObjectId","createFromTime","Date","now","sort","match","$gt","$lt","useCollection","collection","aggregate","$match","$sort","$limit","$unionWith","coll","boundWitnessSdkConfig","pipeline","maxTimeMS","toArray","startHandler","ensureIndexes"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Hash } from '@xylabs/hex';
|
|
2
2
|
import { AbstractArchivist } from '@xyo-network/archivist-abstract';
|
|
3
|
+
import type { ArchivistNextOptions } from '@xyo-network/archivist-model';
|
|
3
4
|
import type { Payload, Schema, WithMeta } from '@xyo-network/payload-model';
|
|
4
5
|
import type { PayloadWithMongoMeta } from '@xyo-network/payload-mongodb';
|
|
5
6
|
declare const MongoDBArchivistBase: (abstract new (...args: any[]) => {
|
|
@@ -67,9 +68,15 @@ export declare class MongoDBArchivist extends MongoDBArchivistBase {
|
|
|
67
68
|
static readonly configSchemas: Schema[];
|
|
68
69
|
static readonly defaultConfigSchema: Schema;
|
|
69
70
|
readonly queries: string[];
|
|
71
|
+
/**
|
|
72
|
+
* The amount of time to allow the aggregate query to execute
|
|
73
|
+
*/
|
|
74
|
+
protected readonly aggregateTimeoutMs = 10000;
|
|
70
75
|
head(): Promise<Payload | undefined>;
|
|
76
|
+
protected findOneByHash(hash: Hash): Promise<import("mongodb").WithId<PayloadWithMongoMeta> | undefined>;
|
|
71
77
|
protected getHandler(hashes: Hash[]): Promise<WithMeta<Payload>[]>;
|
|
72
78
|
protected insertHandler(payloads: Payload[]): Promise<WithMeta<Payload>[]>;
|
|
79
|
+
protected nextHandler(options?: ArchivistNextOptions): Promise<WithMeta<Payload>[]>;
|
|
73
80
|
protected startHandler(): Promise<boolean>;
|
|
74
81
|
}
|
|
75
82
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Archivist.d.ts","sourceRoot":"","sources":["../../src/Archivist.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"Archivist.d.ts","sourceRoot":"","sources":["../../src/Archivist.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AACvC,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,EAC1B,MAAM,4BAA4B,CAAA;AACnC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAOxE,QAAA,MAAM,oBAAoB;;;;;8BA6CsC,8BAA8B;;;;oBAMzF,aAAa;;+CA7CqE,+BAEnF;0CAGQ,+BAA8B;uBAGtC,mCAA+B;;;;;;;qBAuCnB,2BAA2B;;yBA7DT,4BACR;;mCACkB,4BAA4B;;uBACb,4BAClC,wBAEZ,4BAA4B,8BAEhB,2BAA2B,iCAEnC,2BAA2B,8BAC/B,4BAA4B,wBAAwB,4BAA4B,8BAC9E,2BAA2B,iCAAiC,2BAE5D;iCAAsD,CAAC,iBAAiB,+BAEnF;4BAED,CAAH,iBACY,+BAA8B;2BAGtC,mCAA+B;;;;;;;8CAMd,2BAErB;;wCAC8D,+BAC5C,6CAGV,+BAA6B;0BAE3B,8BACE;mCAC0B,+BAA+B,6CAE7D,+BAKC;;+BAeoG,iBACxG;;6BACqB,iCAAiC,6BAE/C,iCAAiC,0CAA0C,2BAA2B,wBAAwB,2BAC1H,kCAAkC,CAAC,SAAS,4BAC3D,wBAAwB,CAAC,mBAAmB,iBAAiB,oBAAoB,2BAC7E;iCAGgC,iCAAiC,6BACjE,iCAAiC,4CACH,2BAA0B,wBAAwB,2BAA2B,kCAChF,CAAC,SAAS,4BACnB,wBAAwB,CAAC,qBAAqB,iBACrE;yBAAgD,iBAAiB;wBACzD,iBAAa;sBAA6C,2BAEjD;4CAAuE,2BAA2B,0CAC/E,2BAC1B;yCAA8E,2BAC7E,oEAAoE,2BAA2B;+CAItG,2BAAsB,oEAAoE,2BAA2B;2CAGrC,2BAC5E,0CAEF,2BAAqB;wCAIvB,2BAAyB,mFAKxB,4BACU,uBAAuB,2BAC5B;4BACJ,4BAA4B;uCAGM,2BAC7B,mFAC+C,4BACvD,uBAAuB,2BACzB,gDAAgD,4BAE1C;2BAGF,4BAA4B,4BACb,4BAA2B;yCACT,2BAClB,mEAEb,4BACJ,uBAAuB,2BAA2B,gDAE7C,4BAAmB;;;4BApHuC,CAAA;AAElE,qBAAa,gBAAiB,SAAQ,oBAAoB;IACxD,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;IAE/B,IAAI,IAAI,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;cAKnC,aAAa,CAAC,IAAI,EAAE,IAAI;cAoBf,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;cAyBxD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;cAkBhE,WAAW,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;cAkEzE,YAAY;CAKtC"}
|
package/dist/neutral/index.mjs
CHANGED
|
@@ -4,12 +4,13 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
|
|
|
4
4
|
// src/Archivist.ts
|
|
5
5
|
import { exists } from "@xylabs/exists";
|
|
6
6
|
import { AbstractArchivist } from "@xyo-network/archivist-abstract";
|
|
7
|
-
import { ArchivistInsertQuerySchema } from "@xyo-network/archivist-model";
|
|
7
|
+
import { ArchivistInsertQuerySchema, ArchivistNextQuerySchema } from "@xyo-network/archivist-model";
|
|
8
8
|
import { MongoDBArchivistConfigSchema } from "@xyo-network/archivist-model-mongodb";
|
|
9
9
|
import { MongoDBModuleMixin } from "@xyo-network/module-abstract-mongodb";
|
|
10
10
|
import { PayloadBuilder } from "@xyo-network/payload-builder";
|
|
11
11
|
import { fromDbRepresentation, toDbRepresentation } from "@xyo-network/payload-mongodb";
|
|
12
12
|
import { PayloadWrapper as PayloadWrapper2 } from "@xyo-network/payload-wrapper";
|
|
13
|
+
import { ObjectId } from "mongodb";
|
|
13
14
|
|
|
14
15
|
// src/lib/validByType.ts
|
|
15
16
|
import { isBoundWitness, isQueryBoundWitness } from "@xyo-network/boundwitness-model";
|
|
@@ -25,7 +26,7 @@ var validByType = /* @__PURE__ */ __name(async (payloads = []) => {
|
|
|
25
26
|
const wrapper = isQueryBoundWitness(payload) ? QueryBoundWitnessWrapper : BoundWitnessWrapper;
|
|
26
27
|
const bw = wrapper.parse(payload);
|
|
27
28
|
if (await bw.getValid()) {
|
|
28
|
-
results[0].push(
|
|
29
|
+
results[0].push(payload);
|
|
29
30
|
} else {
|
|
30
31
|
const errors = await bw.getErrors();
|
|
31
32
|
console.log(`validByType.Error: ${JSON.stringify(errors, null, 2)}`);
|
|
@@ -33,7 +34,7 @@ var validByType = /* @__PURE__ */ __name(async (payloads = []) => {
|
|
|
33
34
|
} else {
|
|
34
35
|
const payloadWrapper = PayloadWrapper.wrap(payload);
|
|
35
36
|
if (await payloadWrapper.getValid()) {
|
|
36
|
-
results[1].push(
|
|
37
|
+
results[1].push(payload);
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
40
|
return;
|
|
@@ -54,14 +55,47 @@ var MongoDBArchivist = class extends MongoDBArchivistBase {
|
|
|
54
55
|
static defaultConfigSchema = MongoDBArchivistConfigSchema;
|
|
55
56
|
queries = [
|
|
56
57
|
ArchivistInsertQuerySchema,
|
|
58
|
+
ArchivistNextQuerySchema,
|
|
57
59
|
...super.queries
|
|
58
60
|
];
|
|
61
|
+
/**
|
|
62
|
+
* The amount of time to allow the aggregate query to execute
|
|
63
|
+
*/
|
|
64
|
+
aggregateTimeoutMs = 1e4;
|
|
59
65
|
async head() {
|
|
60
|
-
const head = await
|
|
61
|
-
|
|
62
|
-
|
|
66
|
+
const head = await this.next({
|
|
67
|
+
limit: 1,
|
|
68
|
+
order: "desc"
|
|
69
|
+
});
|
|
63
70
|
return head[0] ? PayloadWrapper2.wrap(head[0]).payload : void 0;
|
|
64
71
|
}
|
|
72
|
+
async findOneByHash(hash) {
|
|
73
|
+
const dataPayload = await this.payloads.findOne({
|
|
74
|
+
_$hash: hash
|
|
75
|
+
});
|
|
76
|
+
if (dataPayload) {
|
|
77
|
+
return dataPayload;
|
|
78
|
+
} else {
|
|
79
|
+
const dataBw = await this.boundWitnesses.findOne({
|
|
80
|
+
_$hash: hash
|
|
81
|
+
});
|
|
82
|
+
if (dataBw) {
|
|
83
|
+
return dataBw;
|
|
84
|
+
} else {
|
|
85
|
+
const payload = await this.payloads.findOne({
|
|
86
|
+
_hash: hash
|
|
87
|
+
});
|
|
88
|
+
if (payload) {
|
|
89
|
+
return payload;
|
|
90
|
+
} else {
|
|
91
|
+
const bw = await this.boundWitnesses.findOne({
|
|
92
|
+
_hash: hash
|
|
93
|
+
});
|
|
94
|
+
return bw ?? void 0;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
65
99
|
async getHandler(hashes) {
|
|
66
100
|
let remainingHashes = [
|
|
67
101
|
...hashes
|
|
@@ -100,17 +134,92 @@ var MongoDBArchivist = class extends MongoDBArchivistBase {
|
|
|
100
134
|
const payloadsWithExternalMeta = await Promise.all(p.map((value, index) => toDbRepresentation(value, index)));
|
|
101
135
|
if (payloadsWithExternalMeta.length > 0) {
|
|
102
136
|
const payloadsResult = await this.payloads.insertMany(payloadsWithExternalMeta);
|
|
103
|
-
if (!payloadsResult.acknowledged || payloadsResult.insertedCount !== payloadsWithExternalMeta.length) throw new Error("
|
|
137
|
+
if (!payloadsResult.acknowledged || payloadsResult.insertedCount !== payloadsWithExternalMeta.length) throw new Error("MongoDBArchivist: Error inserting Payloads");
|
|
104
138
|
}
|
|
105
139
|
const boundWitnessesWithExternalMeta = await Promise.all(bw.map((value, index) => toDbRepresentation(value, index)));
|
|
106
140
|
if (boundWitnessesWithExternalMeta.length > 0) {
|
|
107
141
|
const boundWitnessesResult = await this.boundWitnesses.insertMany(boundWitnessesWithExternalMeta);
|
|
108
|
-
if (!boundWitnessesResult.acknowledged || boundWitnessesResult.insertedCount !== boundWitnessesWithExternalMeta.length) throw new Error("
|
|
142
|
+
if (!boundWitnessesResult.acknowledged || boundWitnessesResult.insertedCount !== boundWitnessesWithExternalMeta.length) throw new Error("MongoDBArchivist: Error inserting BoundWitnesses");
|
|
109
143
|
}
|
|
110
144
|
return await PayloadBuilder.build([
|
|
111
145
|
...boundWitnessesWithExternalMeta,
|
|
112
146
|
...payloadsWithExternalMeta
|
|
113
|
-
]);
|
|
147
|
+
].map(fromDbRepresentation));
|
|
148
|
+
}
|
|
149
|
+
async nextHandler(options) {
|
|
150
|
+
let { limit, offset, order } = options ?? {
|
|
151
|
+
limit: 10,
|
|
152
|
+
order: "desc"
|
|
153
|
+
};
|
|
154
|
+
if (!limit) limit = 10;
|
|
155
|
+
if (limit > 100) limit = 100;
|
|
156
|
+
if (order != "asc") order = "desc";
|
|
157
|
+
let id;
|
|
158
|
+
if (offset) {
|
|
159
|
+
const payload = await this.findOneByHash(offset);
|
|
160
|
+
if (payload) id = payload._id;
|
|
161
|
+
} else {
|
|
162
|
+
id = order === "asc" ? ObjectId.createFromTime(0) : ObjectId.createFromTime((Date.now() + 1e4) / 1e3);
|
|
163
|
+
}
|
|
164
|
+
if (!id) return [];
|
|
165
|
+
const sort = order === "asc" ? 1 : -1;
|
|
166
|
+
const match = order === "asc" ? {
|
|
167
|
+
_id: {
|
|
168
|
+
$gt: id
|
|
169
|
+
}
|
|
170
|
+
} : {
|
|
171
|
+
_id: {
|
|
172
|
+
$lt: id
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
const foundPayloads = await this.payloads.useCollection((collection) => {
|
|
176
|
+
return collection.aggregate([
|
|
177
|
+
// Pre-filter payloads collection
|
|
178
|
+
{
|
|
179
|
+
$match: match
|
|
180
|
+
},
|
|
181
|
+
// Sort payloads by _id
|
|
182
|
+
{
|
|
183
|
+
$sort: {
|
|
184
|
+
_id: sort
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
// Limit payloads to the first N payloads
|
|
188
|
+
{
|
|
189
|
+
$limit: limit
|
|
190
|
+
},
|
|
191
|
+
// Combine with filtered boundWitnesses collection
|
|
192
|
+
{
|
|
193
|
+
$unionWith: {
|
|
194
|
+
coll: this.boundWitnessSdkConfig.collection,
|
|
195
|
+
pipeline: [
|
|
196
|
+
{
|
|
197
|
+
$match: match
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
$sort: {
|
|
201
|
+
_id: sort
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
$limit: limit
|
|
206
|
+
}
|
|
207
|
+
]
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
// Sort the combined result by _id
|
|
211
|
+
{
|
|
212
|
+
$sort: {
|
|
213
|
+
_id: sort
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
// Limit the final result to N documents
|
|
217
|
+
{
|
|
218
|
+
$limit: limit
|
|
219
|
+
}
|
|
220
|
+
]).maxTimeMS(this.aggregateTimeoutMs).toArray();
|
|
221
|
+
});
|
|
222
|
+
return await PayloadBuilder.build(foundPayloads.map(fromDbRepresentation));
|
|
114
223
|
}
|
|
115
224
|
async startHandler() {
|
|
116
225
|
await super.startHandler();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Archivist.ts","../../src/lib/validByType.ts","../../src/index.ts"],"sourcesContent":["import { exists } from '@xylabs/exists'\nimport type { Hash } from '@xylabs/hex'\nimport { AbstractArchivist } from '@xyo-network/archivist-abstract'\nimport { ArchivistInsertQuerySchema } from '@xyo-network/archivist-model'\nimport { MongoDBArchivistConfigSchema } from '@xyo-network/archivist-model-mongodb'\nimport { MongoDBModuleMixin } from '@xyo-network/module-abstract-mongodb'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n Payload, Schema, WithMeta,\n} from '@xyo-network/payload-model'\nimport type { PayloadWithMongoMeta } from '@xyo-network/payload-mongodb'\nimport { fromDbRepresentation, toDbRepresentation } from '@xyo-network/payload-mongodb'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\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 readonly queries: string[] = [ArchivistInsertQuerySchema, ...super.queries]\n\n override async head(): Promise<Payload | undefined> {\n const head = await (await this.payloads.find({})).sort({ _timestamp: -1 }).limit(1).toArray()\n return head[0] ? PayloadWrapper.wrap(head[0]).payload : undefined\n }\n\n protected override async getHandler(hashes: Hash[]): Promise<WithMeta<Payload>[]> {\n let remainingHashes = [...hashes]\n\n const dataPayloads = (await Promise.all(remainingHashes.map(_$hash => this.payloads.findOne({ _$hash })))).filter(exists)\n const dataPayloadsHashes = new Set(dataPayloads.map(payload => payload._$hash))\n remainingHashes = remainingHashes.filter(hash => !dataPayloadsHashes.has(hash))\n\n const dataBws = (await Promise.all(remainingHashes.map(_$hash => this.boundWitnesses.findOne({ _$hash })))).filter(exists)\n const dataBwsHashes = new Set(dataBws.map(payload => payload._$hash))\n remainingHashes = remainingHashes.filter(hash => !dataBwsHashes.has(hash))\n\n const payloads = (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 = (await Promise.all(remainingHashes.map(_hash => this.boundWitnesses.findOne({ _hash })))).filter(exists)\n const bwsHashes = new Set(bws.map(payload => payload._hash))\n remainingHashes = remainingHashes.filter(hash => !bwsHashes.has(hash))\n\n const foundPayloads = [...dataPayloads, ...dataBws, ...payloads, ...bws] as PayloadWithMongoMeta<Payload & { _$hash: Hash; _$meta?: unknown }>[]\n const result = await PayloadBuilder.build(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: Payload[]): Promise<WithMeta<Payload>[]> {\n const [bw, p] = await validByType(payloads)\n const payloadsWithExternalMeta = await Promise.all(p.map((value, index) => toDbRepresentation(value, index)))\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('MongoDBDeterministicArchivist: Error inserting Payloads')\n }\n const boundWitnessesWithExternalMeta = await Promise.all(bw.map((value, index) => toDbRepresentation(value, index)))\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('MongoDBDeterministicArchivist: Error inserting BoundWitnesses')\n }\n\n return await PayloadBuilder.build([...boundWitnessesWithExternalMeta, ...payloadsWithExternalMeta])\n }\n\n protected override async startHandler() {\n await super.startHandler()\n await this.ensureIndexes()\n return true\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 } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport const validByType = async (payloads: Payload[] = []) => {\n const results: [BoundWitness[], 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(bw.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(payloadWrapper.payload)\n }\n }\n return\n }),\n )\n return results\n}\n","export * from './Archivist.js'\nexport * from '@xyo-network/archivist-model-mongodb'\n"],"mappings":"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","names":["exists","AbstractArchivist","ArchivistInsertQuerySchema","MongoDBArchivistConfigSchema","MongoDBModuleMixin","PayloadBuilder","fromDbRepresentation","toDbRepresentation","PayloadWrapper","isBoundWitness","isQueryBoundWitness","BoundWitnessWrapper","QueryBoundWitnessWrapper","PayloadWrapper","validByType","payloads","results","Promise","all","map","payload","isBoundWitness","wrapper","isQueryBoundWitness","QueryBoundWitnessWrapper","BoundWitnessWrapper","bw","parse","getValid","push","errors","getErrors","console","log","JSON","stringify","payloadWrapper","PayloadWrapper","wrap","MongoDBArchivistBase","MongoDBModuleMixin","AbstractArchivist","MongoDBArchivist","configSchemas","MongoDBArchivistConfigSchema","defaultConfigSchema","queries","ArchivistInsertQuerySchema","head","payloads","find","sort","_timestamp","limit","toArray","PayloadWrapper","wrap","payload","undefined","getHandler","hashes","remainingHashes","dataPayloads","Promise","all","map","_$hash","findOne","filter","exists","dataPayloadsHashes","Set","hash","has","dataBws","boundWitnesses","dataBwsHashes","_hash","payloadsHashes","bws","bwsHashes","foundPayloads","result","PayloadBuilder","build","fromDbRepresentation","insertHandler","bw","p","validByType","payloadsWithExternalMeta","value","index","toDbRepresentation","length","payloadsResult","insertMany","acknowledged","insertedCount","Error","boundWitnessesWithExternalMeta","boundWitnessesResult","startHandler","ensureIndexes"]}
|
|
1
|
+
{"version":3,"sources":["../../src/Archivist.ts","../../src/lib/validByType.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 { MongoDBModuleMixin } from '@xyo-network/module-abstract-mongodb'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n Payload, Schema, WithMeta,\n} from '@xyo-network/payload-model'\nimport type { PayloadWithMongoMeta } from '@xyo-network/payload-mongodb'\nimport { fromDbRepresentation, toDbRepresentation } from '@xyo-network/payload-mongodb'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\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 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 override async head(): Promise<Payload | undefined> {\n const head = await this.next({ limit: 1, order: 'desc' })\n return head[0] ? PayloadWrapper.wrap(head[0]).payload : undefined\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 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 override async getHandler(hashes: Hash[]): Promise<WithMeta<Payload>[]> {\n let remainingHashes = [...hashes]\n\n const dataPayloads = (await Promise.all(remainingHashes.map(_$hash => this.payloads.findOne({ _$hash })))).filter(exists)\n const dataPayloadsHashes = new Set(dataPayloads.map(payload => payload._$hash))\n remainingHashes = remainingHashes.filter(hash => !dataPayloadsHashes.has(hash))\n\n const dataBws = (await Promise.all(remainingHashes.map(_$hash => this.boundWitnesses.findOne({ _$hash })))).filter(exists)\n const dataBwsHashes = new Set(dataBws.map(payload => payload._$hash))\n remainingHashes = remainingHashes.filter(hash => !dataBwsHashes.has(hash))\n\n const payloads = (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 = (await Promise.all(remainingHashes.map(_hash => this.boundWitnesses.findOne({ _hash })))).filter(exists)\n const bwsHashes = new Set(bws.map(payload => payload._hash))\n remainingHashes = remainingHashes.filter(hash => !bwsHashes.has(hash))\n\n const foundPayloads = [...dataPayloads, ...dataBws, ...payloads, ...bws] as PayloadWithMongoMeta<Payload & { _$hash: Hash; _$meta?: unknown }>[]\n const result = await PayloadBuilder.build(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: Payload[]): Promise<WithMeta<Payload>[]> {\n const [bw, p] = await validByType(payloads)\n const payloadsWithExternalMeta = await Promise.all(p.map((value, index) => toDbRepresentation(value, index)))\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 const boundWitnessesWithExternalMeta = await Promise.all(bw.map((value, index) => toDbRepresentation(value, index)))\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 await PayloadBuilder.build([...boundWitnessesWithExternalMeta, ...payloadsWithExternalMeta].map(fromDbRepresentation))\n }\n\n protected override async nextHandler(options?: ArchivistNextOptions): Promise<WithMeta<Payload>[]> {\n // Sanitize inputs and set defaults\n let {\n limit, offset, order,\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 (offset) {\n const payload = await this.findOneByHash(offset)\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' ? { _id: { $gt: 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 await PayloadBuilder.build(foundPayloads.map(fromDbRepresentation))\n }\n\n protected override async startHandler() {\n await super.startHandler()\n await this.ensureIndexes()\n return true\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 } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport const validByType = async (payloads: Payload[] = []) => {\n const results: [BoundWitness[], 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 return\n }),\n )\n return results\n}\n","export * from './Archivist.js'\nexport * from '@xyo-network/archivist-model-mongodb'\n"],"mappings":"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","names":["exists","AbstractArchivist","ArchivistInsertQuerySchema","ArchivistNextQuerySchema","MongoDBArchivistConfigSchema","MongoDBModuleMixin","PayloadBuilder","fromDbRepresentation","toDbRepresentation","PayloadWrapper","ObjectId","isBoundWitness","isQueryBoundWitness","BoundWitnessWrapper","QueryBoundWitnessWrapper","PayloadWrapper","validByType","payloads","results","Promise","all","map","payload","isBoundWitness","wrapper","isQueryBoundWitness","QueryBoundWitnessWrapper","BoundWitnessWrapper","bw","parse","getValid","push","errors","getErrors","console","log","JSON","stringify","payloadWrapper","PayloadWrapper","wrap","MongoDBArchivistBase","MongoDBModuleMixin","AbstractArchivist","MongoDBArchivist","configSchemas","MongoDBArchivistConfigSchema","defaultConfigSchema","queries","ArchivistInsertQuerySchema","ArchivistNextQuerySchema","aggregateTimeoutMs","head","next","limit","order","PayloadWrapper","wrap","payload","undefined","findOneByHash","hash","dataPayload","payloads","findOne","_$hash","dataBw","boundWitnesses","_hash","bw","getHandler","hashes","remainingHashes","dataPayloads","Promise","all","map","filter","exists","dataPayloadsHashes","Set","has","dataBws","dataBwsHashes","payloadsHashes","bws","bwsHashes","foundPayloads","result","PayloadBuilder","build","fromDbRepresentation","insertHandler","p","validByType","payloadsWithExternalMeta","value","index","toDbRepresentation","length","payloadsResult","insertMany","acknowledged","insertedCount","Error","boundWitnessesWithExternalMeta","boundWitnessesResult","nextHandler","options","offset","id","_id","ObjectId","createFromTime","Date","now","sort","match","$gt","$lt","useCollection","collection","aggregate","$match","$sort","$limit","$unionWith","coll","boundWitnessSdkConfig","pipeline","maxTimeMS","toArray","startHandler","ensureIndexes"]}
|
package/dist/node/Archivist.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Hash } from '@xylabs/hex';
|
|
2
2
|
import { AbstractArchivist } from '@xyo-network/archivist-abstract';
|
|
3
|
+
import type { ArchivistNextOptions } from '@xyo-network/archivist-model';
|
|
3
4
|
import type { Payload, Schema, WithMeta } from '@xyo-network/payload-model';
|
|
4
5
|
import type { PayloadWithMongoMeta } from '@xyo-network/payload-mongodb';
|
|
5
6
|
declare const MongoDBArchivistBase: (abstract new (...args: any[]) => {
|
|
@@ -67,9 +68,15 @@ export declare class MongoDBArchivist extends MongoDBArchivistBase {
|
|
|
67
68
|
static readonly configSchemas: Schema[];
|
|
68
69
|
static readonly defaultConfigSchema: Schema;
|
|
69
70
|
readonly queries: string[];
|
|
71
|
+
/**
|
|
72
|
+
* The amount of time to allow the aggregate query to execute
|
|
73
|
+
*/
|
|
74
|
+
protected readonly aggregateTimeoutMs = 10000;
|
|
70
75
|
head(): Promise<Payload | undefined>;
|
|
76
|
+
protected findOneByHash(hash: Hash): Promise<import("mongodb").WithId<PayloadWithMongoMeta> | undefined>;
|
|
71
77
|
protected getHandler(hashes: Hash[]): Promise<WithMeta<Payload>[]>;
|
|
72
78
|
protected insertHandler(payloads: Payload[]): Promise<WithMeta<Payload>[]>;
|
|
79
|
+
protected nextHandler(options?: ArchivistNextOptions): Promise<WithMeta<Payload>[]>;
|
|
73
80
|
protected startHandler(): Promise<boolean>;
|
|
74
81
|
}
|
|
75
82
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Archivist.d.ts","sourceRoot":"","sources":["../../src/Archivist.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"Archivist.d.ts","sourceRoot":"","sources":["../../src/Archivist.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AACvC,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,EAC1B,MAAM,4BAA4B,CAAA;AACnC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAOxE,QAAA,MAAM,oBAAoB;;;;;8BA6CsC,8BAA8B;;;;oBAMzF,aAAa;;+CA7CqE,+BAEnF;0CAGQ,+BAA8B;uBAGtC,mCAA+B;;;;;;;qBAuCnB,2BAA2B;;yBA7DT,4BACR;;mCACkB,4BAA4B;;uBACb,4BAClC,wBAEZ,4BAA4B,8BAEhB,2BAA2B,iCAEnC,2BAA2B,8BAC/B,4BAA4B,wBAAwB,4BAA4B,8BAC9E,2BAA2B,iCAAiC,2BAE5D;iCAAsD,CAAC,iBAAiB,+BAEnF;4BAED,CAAH,iBACY,+BAA8B;2BAGtC,mCAA+B;;;;;;;8CAMd,2BAErB;;wCAC8D,+BAC5C,6CAGV,+BAA6B;0BAE3B,8BACE;mCAC0B,+BAA+B,6CAE7D,+BAKC;;+BAeoG,iBACxG;;6BACqB,iCAAiC,6BAE/C,iCAAiC,0CAA0C,2BAA2B,wBAAwB,2BAC1H,kCAAkC,CAAC,SAAS,4BAC3D,wBAAwB,CAAC,mBAAmB,iBAAiB,oBAAoB,2BAC7E;iCAGgC,iCAAiC,6BACjE,iCAAiC,4CACH,2BAA0B,wBAAwB,2BAA2B,kCAChF,CAAC,SAAS,4BACnB,wBAAwB,CAAC,qBAAqB,iBACrE;yBAAgD,iBAAiB;wBACzD,iBAAa;sBAA6C,2BAEjD;4CAAuE,2BAA2B,0CAC/E,2BAC1B;yCAA8E,2BAC7E,oEAAoE,2BAA2B;+CAItG,2BAAsB,oEAAoE,2BAA2B;2CAGrC,2BAC5E,0CAEF,2BAAqB;wCAIvB,2BAAyB,mFAKxB,4BACU,uBAAuB,2BAC5B;4BACJ,4BAA4B;uCAGM,2BAC7B,mFAC+C,4BACvD,uBAAuB,2BACzB,gDAAgD,4BAE1C;2BAGF,4BAA4B,4BACb,4BAA2B;yCACT,2BAClB,mEAEb,4BACJ,uBAAuB,2BAA2B,gDAE7C,4BAAmB;;;4BApHuC,CAAA;AAElE,qBAAa,gBAAiB,SAAQ,oBAAoB;IACxD,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;IAE/B,IAAI,IAAI,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;cAKnC,aAAa,CAAC,IAAI,EAAE,IAAI;cAoBf,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;cAyBxD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;cAkBhE,WAAW,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;cAkEzE,YAAY;CAKtC"}
|
package/dist/node/index.mjs
CHANGED
|
@@ -4,12 +4,13 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
|
|
|
4
4
|
// src/Archivist.ts
|
|
5
5
|
import { exists } from "@xylabs/exists";
|
|
6
6
|
import { AbstractArchivist } from "@xyo-network/archivist-abstract";
|
|
7
|
-
import { ArchivistInsertQuerySchema } from "@xyo-network/archivist-model";
|
|
7
|
+
import { ArchivistInsertQuerySchema, ArchivistNextQuerySchema } from "@xyo-network/archivist-model";
|
|
8
8
|
import { MongoDBArchivistConfigSchema } from "@xyo-network/archivist-model-mongodb";
|
|
9
9
|
import { MongoDBModuleMixin } from "@xyo-network/module-abstract-mongodb";
|
|
10
10
|
import { PayloadBuilder } from "@xyo-network/payload-builder";
|
|
11
11
|
import { fromDbRepresentation, toDbRepresentation } from "@xyo-network/payload-mongodb";
|
|
12
12
|
import { PayloadWrapper as PayloadWrapper2 } from "@xyo-network/payload-wrapper";
|
|
13
|
+
import { ObjectId } from "mongodb";
|
|
13
14
|
|
|
14
15
|
// src/lib/validByType.ts
|
|
15
16
|
import { isBoundWitness, isQueryBoundWitness } from "@xyo-network/boundwitness-model";
|
|
@@ -25,7 +26,7 @@ var validByType = /* @__PURE__ */ __name(async (payloads = []) => {
|
|
|
25
26
|
const wrapper = isQueryBoundWitness(payload) ? QueryBoundWitnessWrapper : BoundWitnessWrapper;
|
|
26
27
|
const bw = wrapper.parse(payload);
|
|
27
28
|
if (await bw.getValid()) {
|
|
28
|
-
results[0].push(
|
|
29
|
+
results[0].push(payload);
|
|
29
30
|
} else {
|
|
30
31
|
const errors = await bw.getErrors();
|
|
31
32
|
console.log(`validByType.Error: ${JSON.stringify(errors, null, 2)}`);
|
|
@@ -33,7 +34,7 @@ var validByType = /* @__PURE__ */ __name(async (payloads = []) => {
|
|
|
33
34
|
} else {
|
|
34
35
|
const payloadWrapper = PayloadWrapper.wrap(payload);
|
|
35
36
|
if (await payloadWrapper.getValid()) {
|
|
36
|
-
results[1].push(
|
|
37
|
+
results[1].push(payload);
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
40
|
return;
|
|
@@ -54,14 +55,47 @@ var MongoDBArchivist = class extends MongoDBArchivistBase {
|
|
|
54
55
|
static defaultConfigSchema = MongoDBArchivistConfigSchema;
|
|
55
56
|
queries = [
|
|
56
57
|
ArchivistInsertQuerySchema,
|
|
58
|
+
ArchivistNextQuerySchema,
|
|
57
59
|
...super.queries
|
|
58
60
|
];
|
|
61
|
+
/**
|
|
62
|
+
* The amount of time to allow the aggregate query to execute
|
|
63
|
+
*/
|
|
64
|
+
aggregateTimeoutMs = 1e4;
|
|
59
65
|
async head() {
|
|
60
|
-
const head = await
|
|
61
|
-
|
|
62
|
-
|
|
66
|
+
const head = await this.next({
|
|
67
|
+
limit: 1,
|
|
68
|
+
order: "desc"
|
|
69
|
+
});
|
|
63
70
|
return head[0] ? PayloadWrapper2.wrap(head[0]).payload : void 0;
|
|
64
71
|
}
|
|
72
|
+
async findOneByHash(hash) {
|
|
73
|
+
const dataPayload = await this.payloads.findOne({
|
|
74
|
+
_$hash: hash
|
|
75
|
+
});
|
|
76
|
+
if (dataPayload) {
|
|
77
|
+
return dataPayload;
|
|
78
|
+
} else {
|
|
79
|
+
const dataBw = await this.boundWitnesses.findOne({
|
|
80
|
+
_$hash: hash
|
|
81
|
+
});
|
|
82
|
+
if (dataBw) {
|
|
83
|
+
return dataBw;
|
|
84
|
+
} else {
|
|
85
|
+
const payload = await this.payloads.findOne({
|
|
86
|
+
_hash: hash
|
|
87
|
+
});
|
|
88
|
+
if (payload) {
|
|
89
|
+
return payload;
|
|
90
|
+
} else {
|
|
91
|
+
const bw = await this.boundWitnesses.findOne({
|
|
92
|
+
_hash: hash
|
|
93
|
+
});
|
|
94
|
+
return bw ?? void 0;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
65
99
|
async getHandler(hashes) {
|
|
66
100
|
let remainingHashes = [
|
|
67
101
|
...hashes
|
|
@@ -100,17 +134,92 @@ var MongoDBArchivist = class extends MongoDBArchivistBase {
|
|
|
100
134
|
const payloadsWithExternalMeta = await Promise.all(p.map((value, index) => toDbRepresentation(value, index)));
|
|
101
135
|
if (payloadsWithExternalMeta.length > 0) {
|
|
102
136
|
const payloadsResult = await this.payloads.insertMany(payloadsWithExternalMeta);
|
|
103
|
-
if (!payloadsResult.acknowledged || payloadsResult.insertedCount !== payloadsWithExternalMeta.length) throw new Error("
|
|
137
|
+
if (!payloadsResult.acknowledged || payloadsResult.insertedCount !== payloadsWithExternalMeta.length) throw new Error("MongoDBArchivist: Error inserting Payloads");
|
|
104
138
|
}
|
|
105
139
|
const boundWitnessesWithExternalMeta = await Promise.all(bw.map((value, index) => toDbRepresentation(value, index)));
|
|
106
140
|
if (boundWitnessesWithExternalMeta.length > 0) {
|
|
107
141
|
const boundWitnessesResult = await this.boundWitnesses.insertMany(boundWitnessesWithExternalMeta);
|
|
108
|
-
if (!boundWitnessesResult.acknowledged || boundWitnessesResult.insertedCount !== boundWitnessesWithExternalMeta.length) throw new Error("
|
|
142
|
+
if (!boundWitnessesResult.acknowledged || boundWitnessesResult.insertedCount !== boundWitnessesWithExternalMeta.length) throw new Error("MongoDBArchivist: Error inserting BoundWitnesses");
|
|
109
143
|
}
|
|
110
144
|
return await PayloadBuilder.build([
|
|
111
145
|
...boundWitnessesWithExternalMeta,
|
|
112
146
|
...payloadsWithExternalMeta
|
|
113
|
-
]);
|
|
147
|
+
].map(fromDbRepresentation));
|
|
148
|
+
}
|
|
149
|
+
async nextHandler(options) {
|
|
150
|
+
let { limit, offset, order } = options ?? {
|
|
151
|
+
limit: 10,
|
|
152
|
+
order: "desc"
|
|
153
|
+
};
|
|
154
|
+
if (!limit) limit = 10;
|
|
155
|
+
if (limit > 100) limit = 100;
|
|
156
|
+
if (order != "asc") order = "desc";
|
|
157
|
+
let id;
|
|
158
|
+
if (offset) {
|
|
159
|
+
const payload = await this.findOneByHash(offset);
|
|
160
|
+
if (payload) id = payload._id;
|
|
161
|
+
} else {
|
|
162
|
+
id = order === "asc" ? ObjectId.createFromTime(0) : ObjectId.createFromTime((Date.now() + 1e4) / 1e3);
|
|
163
|
+
}
|
|
164
|
+
if (!id) return [];
|
|
165
|
+
const sort = order === "asc" ? 1 : -1;
|
|
166
|
+
const match = order === "asc" ? {
|
|
167
|
+
_id: {
|
|
168
|
+
$gt: id
|
|
169
|
+
}
|
|
170
|
+
} : {
|
|
171
|
+
_id: {
|
|
172
|
+
$lt: id
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
const foundPayloads = await this.payloads.useCollection((collection) => {
|
|
176
|
+
return collection.aggregate([
|
|
177
|
+
// Pre-filter payloads collection
|
|
178
|
+
{
|
|
179
|
+
$match: match
|
|
180
|
+
},
|
|
181
|
+
// Sort payloads by _id
|
|
182
|
+
{
|
|
183
|
+
$sort: {
|
|
184
|
+
_id: sort
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
// Limit payloads to the first N payloads
|
|
188
|
+
{
|
|
189
|
+
$limit: limit
|
|
190
|
+
},
|
|
191
|
+
// Combine with filtered boundWitnesses collection
|
|
192
|
+
{
|
|
193
|
+
$unionWith: {
|
|
194
|
+
coll: this.boundWitnessSdkConfig.collection,
|
|
195
|
+
pipeline: [
|
|
196
|
+
{
|
|
197
|
+
$match: match
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
$sort: {
|
|
201
|
+
_id: sort
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
$limit: limit
|
|
206
|
+
}
|
|
207
|
+
]
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
// Sort the combined result by _id
|
|
211
|
+
{
|
|
212
|
+
$sort: {
|
|
213
|
+
_id: sort
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
// Limit the final result to N documents
|
|
217
|
+
{
|
|
218
|
+
$limit: limit
|
|
219
|
+
}
|
|
220
|
+
]).maxTimeMS(this.aggregateTimeoutMs).toArray();
|
|
221
|
+
});
|
|
222
|
+
return await PayloadBuilder.build(foundPayloads.map(fromDbRepresentation));
|
|
114
223
|
}
|
|
115
224
|
async startHandler() {
|
|
116
225
|
await super.startHandler();
|
package/dist/node/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Archivist.ts","../../src/lib/validByType.ts","../../src/index.ts"],"sourcesContent":["import { exists } from '@xylabs/exists'\nimport type { Hash } from '@xylabs/hex'\nimport { AbstractArchivist } from '@xyo-network/archivist-abstract'\nimport { ArchivistInsertQuerySchema } from '@xyo-network/archivist-model'\nimport { MongoDBArchivistConfigSchema } from '@xyo-network/archivist-model-mongodb'\nimport { MongoDBModuleMixin } from '@xyo-network/module-abstract-mongodb'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n Payload, Schema, WithMeta,\n} from '@xyo-network/payload-model'\nimport type { PayloadWithMongoMeta } from '@xyo-network/payload-mongodb'\nimport { fromDbRepresentation, toDbRepresentation } from '@xyo-network/payload-mongodb'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\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 readonly queries: string[] = [ArchivistInsertQuerySchema, ...super.queries]\n\n override async head(): Promise<Payload | undefined> {\n const head = await (await this.payloads.find({})).sort({ _timestamp: -1 }).limit(1).toArray()\n return head[0] ? PayloadWrapper.wrap(head[0]).payload : undefined\n }\n\n protected override async getHandler(hashes: Hash[]): Promise<WithMeta<Payload>[]> {\n let remainingHashes = [...hashes]\n\n const dataPayloads = (await Promise.all(remainingHashes.map(_$hash => this.payloads.findOne({ _$hash })))).filter(exists)\n const dataPayloadsHashes = new Set(dataPayloads.map(payload => payload._$hash))\n remainingHashes = remainingHashes.filter(hash => !dataPayloadsHashes.has(hash))\n\n const dataBws = (await Promise.all(remainingHashes.map(_$hash => this.boundWitnesses.findOne({ _$hash })))).filter(exists)\n const dataBwsHashes = new Set(dataBws.map(payload => payload._$hash))\n remainingHashes = remainingHashes.filter(hash => !dataBwsHashes.has(hash))\n\n const payloads = (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 = (await Promise.all(remainingHashes.map(_hash => this.boundWitnesses.findOne({ _hash })))).filter(exists)\n const bwsHashes = new Set(bws.map(payload => payload._hash))\n remainingHashes = remainingHashes.filter(hash => !bwsHashes.has(hash))\n\n const foundPayloads = [...dataPayloads, ...dataBws, ...payloads, ...bws] as PayloadWithMongoMeta<Payload & { _$hash: Hash; _$meta?: unknown }>[]\n const result = await PayloadBuilder.build(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: Payload[]): Promise<WithMeta<Payload>[]> {\n const [bw, p] = await validByType(payloads)\n const payloadsWithExternalMeta = await Promise.all(p.map((value, index) => toDbRepresentation(value, index)))\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('MongoDBDeterministicArchivist: Error inserting Payloads')\n }\n const boundWitnessesWithExternalMeta = await Promise.all(bw.map((value, index) => toDbRepresentation(value, index)))\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('MongoDBDeterministicArchivist: Error inserting BoundWitnesses')\n }\n\n return await PayloadBuilder.build([...boundWitnessesWithExternalMeta, ...payloadsWithExternalMeta])\n }\n\n protected override async startHandler() {\n await super.startHandler()\n await this.ensureIndexes()\n return true\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 } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport const validByType = async (payloads: Payload[] = []) => {\n const results: [BoundWitness[], 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(bw.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(payloadWrapper.payload)\n }\n }\n return\n }),\n )\n return results\n}\n","export * from './Archivist.js'\nexport * from '@xyo-network/archivist-model-mongodb'\n"],"mappings":"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","names":["exists","AbstractArchivist","ArchivistInsertQuerySchema","MongoDBArchivistConfigSchema","MongoDBModuleMixin","PayloadBuilder","fromDbRepresentation","toDbRepresentation","PayloadWrapper","isBoundWitness","isQueryBoundWitness","BoundWitnessWrapper","QueryBoundWitnessWrapper","PayloadWrapper","validByType","payloads","results","Promise","all","map","payload","isBoundWitness","wrapper","isQueryBoundWitness","QueryBoundWitnessWrapper","BoundWitnessWrapper","bw","parse","getValid","push","errors","getErrors","console","log","JSON","stringify","payloadWrapper","PayloadWrapper","wrap","MongoDBArchivistBase","MongoDBModuleMixin","AbstractArchivist","MongoDBArchivist","configSchemas","MongoDBArchivistConfigSchema","defaultConfigSchema","queries","ArchivistInsertQuerySchema","head","payloads","find","sort","_timestamp","limit","toArray","PayloadWrapper","wrap","payload","undefined","getHandler","hashes","remainingHashes","dataPayloads","Promise","all","map","_$hash","findOne","filter","exists","dataPayloadsHashes","Set","hash","has","dataBws","boundWitnesses","dataBwsHashes","_hash","payloadsHashes","bws","bwsHashes","foundPayloads","result","PayloadBuilder","build","fromDbRepresentation","insertHandler","bw","p","validByType","payloadsWithExternalMeta","value","index","toDbRepresentation","length","payloadsResult","insertMany","acknowledged","insertedCount","Error","boundWitnessesWithExternalMeta","boundWitnessesResult","startHandler","ensureIndexes"]}
|
|
1
|
+
{"version":3,"sources":["../../src/Archivist.ts","../../src/lib/validByType.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 { MongoDBModuleMixin } from '@xyo-network/module-abstract-mongodb'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n Payload, Schema, WithMeta,\n} from '@xyo-network/payload-model'\nimport type { PayloadWithMongoMeta } from '@xyo-network/payload-mongodb'\nimport { fromDbRepresentation, toDbRepresentation } from '@xyo-network/payload-mongodb'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\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 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 override async head(): Promise<Payload | undefined> {\n const head = await this.next({ limit: 1, order: 'desc' })\n return head[0] ? PayloadWrapper.wrap(head[0]).payload : undefined\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 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 override async getHandler(hashes: Hash[]): Promise<WithMeta<Payload>[]> {\n let remainingHashes = [...hashes]\n\n const dataPayloads = (await Promise.all(remainingHashes.map(_$hash => this.payloads.findOne({ _$hash })))).filter(exists)\n const dataPayloadsHashes = new Set(dataPayloads.map(payload => payload._$hash))\n remainingHashes = remainingHashes.filter(hash => !dataPayloadsHashes.has(hash))\n\n const dataBws = (await Promise.all(remainingHashes.map(_$hash => this.boundWitnesses.findOne({ _$hash })))).filter(exists)\n const dataBwsHashes = new Set(dataBws.map(payload => payload._$hash))\n remainingHashes = remainingHashes.filter(hash => !dataBwsHashes.has(hash))\n\n const payloads = (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 = (await Promise.all(remainingHashes.map(_hash => this.boundWitnesses.findOne({ _hash })))).filter(exists)\n const bwsHashes = new Set(bws.map(payload => payload._hash))\n remainingHashes = remainingHashes.filter(hash => !bwsHashes.has(hash))\n\n const foundPayloads = [...dataPayloads, ...dataBws, ...payloads, ...bws] as PayloadWithMongoMeta<Payload & { _$hash: Hash; _$meta?: unknown }>[]\n const result = await PayloadBuilder.build(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: Payload[]): Promise<WithMeta<Payload>[]> {\n const [bw, p] = await validByType(payloads)\n const payloadsWithExternalMeta = await Promise.all(p.map((value, index) => toDbRepresentation(value, index)))\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 const boundWitnessesWithExternalMeta = await Promise.all(bw.map((value, index) => toDbRepresentation(value, index)))\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 await PayloadBuilder.build([...boundWitnessesWithExternalMeta, ...payloadsWithExternalMeta].map(fromDbRepresentation))\n }\n\n protected override async nextHandler(options?: ArchivistNextOptions): Promise<WithMeta<Payload>[]> {\n // Sanitize inputs and set defaults\n let {\n limit, offset, order,\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 (offset) {\n const payload = await this.findOneByHash(offset)\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' ? { _id: { $gt: 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 await PayloadBuilder.build(foundPayloads.map(fromDbRepresentation))\n }\n\n protected override async startHandler() {\n await super.startHandler()\n await this.ensureIndexes()\n return true\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 } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport const validByType = async (payloads: Payload[] = []) => {\n const results: [BoundWitness[], 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 return\n }),\n )\n return results\n}\n","export * from './Archivist.js'\nexport * from '@xyo-network/archivist-model-mongodb'\n"],"mappings":"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","names":["exists","AbstractArchivist","ArchivistInsertQuerySchema","ArchivistNextQuerySchema","MongoDBArchivistConfigSchema","MongoDBModuleMixin","PayloadBuilder","fromDbRepresentation","toDbRepresentation","PayloadWrapper","ObjectId","isBoundWitness","isQueryBoundWitness","BoundWitnessWrapper","QueryBoundWitnessWrapper","PayloadWrapper","validByType","payloads","results","Promise","all","map","payload","isBoundWitness","wrapper","isQueryBoundWitness","QueryBoundWitnessWrapper","BoundWitnessWrapper","bw","parse","getValid","push","errors","getErrors","console","log","JSON","stringify","payloadWrapper","PayloadWrapper","wrap","MongoDBArchivistBase","MongoDBModuleMixin","AbstractArchivist","MongoDBArchivist","configSchemas","MongoDBArchivistConfigSchema","defaultConfigSchema","queries","ArchivistInsertQuerySchema","ArchivistNextQuerySchema","aggregateTimeoutMs","head","next","limit","order","PayloadWrapper","wrap","payload","undefined","findOneByHash","hash","dataPayload","payloads","findOne","_$hash","dataBw","boundWitnesses","_hash","bw","getHandler","hashes","remainingHashes","dataPayloads","Promise","all","map","filter","exists","dataPayloadsHashes","Set","has","dataBws","dataBwsHashes","payloadsHashes","bws","bwsHashes","foundPayloads","result","PayloadBuilder","build","fromDbRepresentation","insertHandler","p","validByType","payloadsWithExternalMeta","value","index","toDbRepresentation","length","payloadsResult","insertMany","acknowledged","insertedCount","Error","boundWitnessesWithExternalMeta","boundWitnessesResult","nextHandler","options","offset","id","_id","ObjectId","createFromTime","Date","now","sort","match","$gt","$lt","useCollection","collection","aggregate","$match","$sort","$limit","$unionWith","coll","boundWitnessSdkConfig","pipeline","maxTimeMS","toArray","startHandler","ensureIndexes"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/archivist-mongodb",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.7",
|
|
4
4
|
"description": "Primary SDK for using XYO Protocol 2.0",
|
|
5
5
|
"homepage": "https://xyo.network",
|
|
6
6
|
"bugs": {
|
|
@@ -37,32 +37,35 @@
|
|
|
37
37
|
"module": "dist/node/index.mjs",
|
|
38
38
|
"types": "dist/node/index.d.ts",
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@xylabs/exists": "^4.4.
|
|
41
|
-
"@xylabs/hex": "^4.4.
|
|
42
|
-
"@xyo-network/archivist-abstract": "^3.5.
|
|
43
|
-
"@xyo-network/archivist-model": "^3.5.
|
|
44
|
-
"@xyo-network/archivist-model-mongodb": "^3.1.
|
|
45
|
-
"@xyo-network/boundwitness-model": "^3.5.
|
|
46
|
-
"@xyo-network/boundwitness-wrapper": "^3.5.
|
|
47
|
-
"@xyo-network/module-abstract-mongodb": "^3.1.
|
|
48
|
-
"@xyo-network/payload-builder": "^3.5.
|
|
49
|
-
"@xyo-network/payload-model": "^3.5.
|
|
50
|
-
"@xyo-network/payload-mongodb": "^3.1.
|
|
51
|
-
"@xyo-network/payload-wrapper": "^3.5.
|
|
40
|
+
"@xylabs/exists": "^4.4.10",
|
|
41
|
+
"@xylabs/hex": "^4.4.10",
|
|
42
|
+
"@xyo-network/archivist-abstract": "^3.5.2",
|
|
43
|
+
"@xyo-network/archivist-model": "^3.5.2",
|
|
44
|
+
"@xyo-network/archivist-model-mongodb": "^3.1.7",
|
|
45
|
+
"@xyo-network/boundwitness-model": "^3.5.2",
|
|
46
|
+
"@xyo-network/boundwitness-wrapper": "^3.5.2",
|
|
47
|
+
"@xyo-network/module-abstract-mongodb": "^3.1.7",
|
|
48
|
+
"@xyo-network/payload-builder": "^3.5.2",
|
|
49
|
+
"@xyo-network/payload-model": "^3.5.2",
|
|
50
|
+
"@xyo-network/payload-mongodb": "^3.1.7",
|
|
51
|
+
"@xyo-network/payload-wrapper": "^3.5.2",
|
|
52
|
+
"mongodb": "~6.11.0"
|
|
52
53
|
},
|
|
53
54
|
"devDependencies": {
|
|
54
|
-
"@xylabs/
|
|
55
|
-
"@xylabs/
|
|
55
|
+
"@xylabs/assert": "^4.4.10",
|
|
56
|
+
"@xylabs/delay": "^4.4.10",
|
|
57
|
+
"@xylabs/jest-helpers": "^4.4.10",
|
|
56
58
|
"@xylabs/ts-scripts-yarn3": "^4.2.4",
|
|
57
59
|
"@xylabs/tsconfig": "^4.2.4",
|
|
58
|
-
"@
|
|
59
|
-
"@xyo-network/account
|
|
60
|
-
"@xyo-network/archivist-wrapper": "^3.5.
|
|
61
|
-
"@xyo-network/boundwitness-builder": "^3.5.
|
|
62
|
-
"@xyo-network/sdk-xyo-mongo-js": "^3.1.
|
|
60
|
+
"@xylabs/vitest-extended": "^4.4.10",
|
|
61
|
+
"@xyo-network/account": "^3.5.2",
|
|
62
|
+
"@xyo-network/archivist-wrapper": "^3.5.2",
|
|
63
|
+
"@xyo-network/boundwitness-builder": "^3.5.2",
|
|
64
|
+
"@xyo-network/sdk-xyo-mongo-js": "^3.1.7",
|
|
63
65
|
"fake-indexeddb": "^6.0.0",
|
|
64
66
|
"jest": "^29.7.0",
|
|
65
|
-
"typescript": "^5.7.2"
|
|
67
|
+
"typescript": "^5.7.2",
|
|
68
|
+
"vitest": "^2.1.8"
|
|
66
69
|
},
|
|
67
70
|
"publishConfig": {
|
|
68
71
|
"access": "public"
|
package/src/Archivist.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { exists } from '@xylabs/exists'
|
|
2
2
|
import type { Hash } from '@xylabs/hex'
|
|
3
3
|
import { AbstractArchivist } from '@xyo-network/archivist-abstract'
|
|
4
|
-
import {
|
|
4
|
+
import type { ArchivistNextOptions } from '@xyo-network/archivist-model'
|
|
5
|
+
import { ArchivistInsertQuerySchema, ArchivistNextQuerySchema } from '@xyo-network/archivist-model'
|
|
5
6
|
import { MongoDBArchivistConfigSchema } from '@xyo-network/archivist-model-mongodb'
|
|
6
7
|
import { MongoDBModuleMixin } from '@xyo-network/module-abstract-mongodb'
|
|
7
8
|
import { PayloadBuilder } from '@xyo-network/payload-builder'
|
|
@@ -11,6 +12,7 @@ import type {
|
|
|
11
12
|
import type { PayloadWithMongoMeta } from '@xyo-network/payload-mongodb'
|
|
12
13
|
import { fromDbRepresentation, toDbRepresentation } from '@xyo-network/payload-mongodb'
|
|
13
14
|
import { PayloadWrapper } from '@xyo-network/payload-wrapper'
|
|
15
|
+
import { ObjectId } from 'mongodb'
|
|
14
16
|
|
|
15
17
|
import { validByType } from './lib/index.js'
|
|
16
18
|
|
|
@@ -20,13 +22,38 @@ export class MongoDBArchivist extends MongoDBArchivistBase {
|
|
|
20
22
|
static override readonly configSchemas: Schema[] = [...super.configSchemas, MongoDBArchivistConfigSchema]
|
|
21
23
|
static override readonly defaultConfigSchema: Schema = MongoDBArchivistConfigSchema
|
|
22
24
|
|
|
23
|
-
override readonly queries: string[] = [ArchivistInsertQuerySchema, ...super.queries]
|
|
25
|
+
override readonly queries: string[] = [ArchivistInsertQuerySchema, ArchivistNextQuerySchema, ...super.queries]
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* The amount of time to allow the aggregate query to execute
|
|
29
|
+
*/
|
|
30
|
+
protected readonly aggregateTimeoutMs = 10_000
|
|
24
31
|
|
|
25
32
|
override async head(): Promise<Payload | undefined> {
|
|
26
|
-
const head = await
|
|
33
|
+
const head = await this.next({ limit: 1, order: 'desc' })
|
|
27
34
|
return head[0] ? PayloadWrapper.wrap(head[0]).payload : undefined
|
|
28
35
|
}
|
|
29
36
|
|
|
37
|
+
protected async findOneByHash(hash: Hash) {
|
|
38
|
+
const dataPayload = (await this.payloads.findOne({ _$hash: hash }))
|
|
39
|
+
if (dataPayload) {
|
|
40
|
+
return dataPayload
|
|
41
|
+
} else {
|
|
42
|
+
const dataBw = (await this.boundWitnesses.findOne({ _$hash: hash }))
|
|
43
|
+
if (dataBw) {
|
|
44
|
+
return dataBw
|
|
45
|
+
} else {
|
|
46
|
+
const payload = (await this.payloads.findOne({ _hash: hash }))
|
|
47
|
+
if (payload) {
|
|
48
|
+
return payload
|
|
49
|
+
} else {
|
|
50
|
+
const bw = (await this.boundWitnesses.findOne({ _hash: hash }))
|
|
51
|
+
return bw ?? undefined
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
30
57
|
protected override async getHandler(hashes: Hash[]): Promise<WithMeta<Payload>[]> {
|
|
31
58
|
let remainingHashes = [...hashes]
|
|
32
59
|
|
|
@@ -58,16 +85,82 @@ export class MongoDBArchivist extends MongoDBArchivistBase {
|
|
|
58
85
|
if (payloadsWithExternalMeta.length > 0) {
|
|
59
86
|
const payloadsResult = await this.payloads.insertMany(payloadsWithExternalMeta)
|
|
60
87
|
if (!payloadsResult.acknowledged || payloadsResult.insertedCount !== payloadsWithExternalMeta.length)
|
|
61
|
-
throw new Error('
|
|
88
|
+
throw new Error('MongoDBArchivist: Error inserting Payloads')
|
|
62
89
|
}
|
|
63
90
|
const boundWitnessesWithExternalMeta = await Promise.all(bw.map((value, index) => toDbRepresentation(value, index)))
|
|
64
91
|
if (boundWitnessesWithExternalMeta.length > 0) {
|
|
65
92
|
const boundWitnessesResult = await this.boundWitnesses.insertMany(boundWitnessesWithExternalMeta)
|
|
66
93
|
if (!boundWitnessesResult.acknowledged || boundWitnessesResult.insertedCount !== boundWitnessesWithExternalMeta.length)
|
|
67
|
-
throw new Error('
|
|
94
|
+
throw new Error('MongoDBArchivist: Error inserting BoundWitnesses')
|
|
68
95
|
}
|
|
69
96
|
|
|
70
|
-
return await PayloadBuilder.build([...boundWitnessesWithExternalMeta, ...payloadsWithExternalMeta])
|
|
97
|
+
return await PayloadBuilder.build([...boundWitnessesWithExternalMeta, ...payloadsWithExternalMeta].map(fromDbRepresentation))
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
protected override async nextHandler(options?: ArchivistNextOptions): Promise<WithMeta<Payload>[]> {
|
|
101
|
+
// Sanitize inputs and set defaults
|
|
102
|
+
let {
|
|
103
|
+
limit, offset, order,
|
|
104
|
+
} = options ?? { limit: 10, order: 'desc' }
|
|
105
|
+
|
|
106
|
+
if (!limit) limit = 10
|
|
107
|
+
if (limit > 100) limit = 100
|
|
108
|
+
|
|
109
|
+
if (order != 'asc') order = 'desc'
|
|
110
|
+
|
|
111
|
+
let id: ObjectId | undefined
|
|
112
|
+
if (offset) {
|
|
113
|
+
const payload = await this.findOneByHash(offset)
|
|
114
|
+
// TODO: Should we throw an error if the requested payload is not found?
|
|
115
|
+
if (payload) id = payload._id
|
|
116
|
+
} else {
|
|
117
|
+
id = order === 'asc'
|
|
118
|
+
// If ascending, start from the beginning of time
|
|
119
|
+
? ObjectId.createFromTime(0)
|
|
120
|
+
// If descending, start from now (plus a bit more in the future to ensure
|
|
121
|
+
// them most recent ObjectIds are included)
|
|
122
|
+
: ObjectId.createFromTime((Date.now() + 10_000) / 1000)
|
|
123
|
+
}
|
|
124
|
+
if (!id) return []
|
|
125
|
+
|
|
126
|
+
// Create aggregate criteria
|
|
127
|
+
const sort = order === 'asc' ? 1 : -1
|
|
128
|
+
// TODO: How to handle random component of ID across multiple collections
|
|
129
|
+
// to ensure we don't skip some payloads
|
|
130
|
+
const match = order === 'asc' ? { _id: { $gt: id } } : { _id: { $lt: id } }
|
|
131
|
+
|
|
132
|
+
// Run the aggregate query
|
|
133
|
+
const foundPayloads = await this.payloads.useCollection((collection) => {
|
|
134
|
+
return collection
|
|
135
|
+
.aggregate<PayloadWithMongoMeta>([
|
|
136
|
+
// Pre-filter payloads collection
|
|
137
|
+
{ $match: match },
|
|
138
|
+
// Sort payloads by _id
|
|
139
|
+
{ $sort: { _id: sort } },
|
|
140
|
+
// Limit payloads to the first N payloads
|
|
141
|
+
{ $limit: limit },
|
|
142
|
+
// Combine with filtered boundWitnesses collection
|
|
143
|
+
{
|
|
144
|
+
$unionWith: {
|
|
145
|
+
coll: this.boundWitnessSdkConfig.collection,
|
|
146
|
+
pipeline: [
|
|
147
|
+
{ $match: match }, // Pre-filter boundWitnesses
|
|
148
|
+
{ $sort: { _id: sort } }, // Sort boundWitnesses by _id
|
|
149
|
+
{ $limit: limit }, // Limit boundWitnesses to the first N boundWitnesses
|
|
150
|
+
],
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
// Sort the combined result by _id
|
|
154
|
+
{ $sort: { _id: sort } },
|
|
155
|
+
// Limit the final result to N documents
|
|
156
|
+
{ $limit: limit },
|
|
157
|
+
])
|
|
158
|
+
.maxTimeMS(this.aggregateTimeoutMs)
|
|
159
|
+
.toArray()
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
// Convert from DB representation to Payloads
|
|
163
|
+
return await PayloadBuilder.build(foundPayloads.map(fromDbRepresentation))
|
|
71
164
|
}
|
|
72
165
|
|
|
73
166
|
protected override async startHandler() {
|
package/src/lib/validByType.ts
CHANGED
|
@@ -12,7 +12,7 @@ export const validByType = async (payloads: Payload[] = []) => {
|
|
|
12
12
|
const wrapper = isQueryBoundWitness(payload) ? QueryBoundWitnessWrapper : BoundWitnessWrapper
|
|
13
13
|
const bw = wrapper.parse(payload)
|
|
14
14
|
if (await bw.getValid()) {
|
|
15
|
-
results[0].push(
|
|
15
|
+
results[0].push(payload)
|
|
16
16
|
} else {
|
|
17
17
|
const errors = await bw.getErrors()
|
|
18
18
|
console.log(`validByType.Error: ${JSON.stringify(errors, null, 2)}`)
|
|
@@ -20,7 +20,7 @@ export const validByType = async (payloads: Payload[] = []) => {
|
|
|
20
20
|
} else {
|
|
21
21
|
const payloadWrapper = PayloadWrapper.wrap(payload)
|
|
22
22
|
if (await payloadWrapper.getValid()) {
|
|
23
|
-
results[1].push(
|
|
23
|
+
results[1].push(payload)
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
return
|