@xyo-network/archivist-mongodb 2.83.0 → 2.84.0-rc.1
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.cts +15 -26
- package/dist/browser/Archivist.d.cts.map +1 -1
- package/dist/browser/Archivist.d.mts +15 -26
- package/dist/browser/Archivist.d.mts.map +1 -1
- package/dist/browser/Archivist.d.ts +15 -26
- package/dist/browser/Archivist.d.ts.map +1 -1
- package/dist/browser/index.cjs +68 -54
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +68 -54
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/lib/index.d.cts +1 -2
- package/dist/browser/lib/index.d.cts.map +1 -1
- package/dist/browser/lib/index.d.mts +1 -2
- package/dist/browser/lib/index.d.mts.map +1 -1
- package/dist/browser/lib/index.d.ts +1 -2
- package/dist/browser/lib/index.d.ts.map +1 -1
- package/dist/browser/lib/toPayloadWithMongoMeta.d.cts +5 -0
- package/dist/browser/lib/toPayloadWithMongoMeta.d.cts.map +1 -0
- package/dist/browser/lib/toPayloadWithMongoMeta.d.mts +5 -0
- package/dist/browser/lib/toPayloadWithMongoMeta.d.mts.map +1 -0
- package/dist/browser/lib/toPayloadWithMongoMeta.d.ts +5 -0
- package/dist/browser/lib/toPayloadWithMongoMeta.d.ts.map +1 -0
- package/dist/browser/lib/toReturnValue.d.cts +1 -2
- package/dist/browser/lib/toReturnValue.d.cts.map +1 -1
- package/dist/browser/lib/toReturnValue.d.mts +1 -2
- package/dist/browser/lib/toReturnValue.d.mts.map +1 -1
- package/dist/browser/lib/toReturnValue.d.ts +1 -2
- package/dist/browser/lib/toReturnValue.d.ts.map +1 -1
- package/dist/browser/lib/validByType.d.cts +3 -7
- package/dist/browser/lib/validByType.d.cts.map +1 -1
- package/dist/browser/lib/validByType.d.mts +3 -7
- package/dist/browser/lib/validByType.d.mts.map +1 -1
- package/dist/browser/lib/validByType.d.ts +3 -7
- package/dist/browser/lib/validByType.d.ts.map +1 -1
- package/dist/node/Archivist.d.cts +15 -26
- package/dist/node/Archivist.d.cts.map +1 -1
- package/dist/node/Archivist.d.mts +15 -26
- package/dist/node/Archivist.d.mts.map +1 -1
- package/dist/node/Archivist.d.ts +15 -26
- package/dist/node/Archivist.d.ts.map +1 -1
- package/dist/node/index.cjs +68 -54
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +68 -54
- package/dist/node/index.js.map +1 -1
- package/dist/node/lib/index.d.cts +1 -2
- package/dist/node/lib/index.d.cts.map +1 -1
- package/dist/node/lib/index.d.mts +1 -2
- package/dist/node/lib/index.d.mts.map +1 -1
- package/dist/node/lib/index.d.ts +1 -2
- package/dist/node/lib/index.d.ts.map +1 -1
- package/dist/node/lib/toPayloadWithMongoMeta.d.cts +5 -0
- package/dist/node/lib/toPayloadWithMongoMeta.d.cts.map +1 -0
- package/dist/node/lib/toPayloadWithMongoMeta.d.mts +5 -0
- package/dist/node/lib/toPayloadWithMongoMeta.d.mts.map +1 -0
- package/dist/node/lib/toPayloadWithMongoMeta.d.ts +5 -0
- package/dist/node/lib/toPayloadWithMongoMeta.d.ts.map +1 -0
- package/dist/node/lib/toReturnValue.d.cts +1 -2
- package/dist/node/lib/toReturnValue.d.cts.map +1 -1
- package/dist/node/lib/toReturnValue.d.mts +1 -2
- package/dist/node/lib/toReturnValue.d.mts.map +1 -1
- package/dist/node/lib/toReturnValue.d.ts +1 -2
- package/dist/node/lib/toReturnValue.d.ts.map +1 -1
- package/dist/node/lib/validByType.d.cts +3 -7
- package/dist/node/lib/validByType.d.cts.map +1 -1
- package/dist/node/lib/validByType.d.mts +3 -7
- package/dist/node/lib/validByType.d.mts.map +1 -1
- package/dist/node/lib/validByType.d.ts +3 -7
- package/dist/node/lib/validByType.d.ts.map +1 -1
- package/package.json +26 -23
- package/src/Archivist.ts +35 -19
- package/src/lib/index.ts +1 -2
- package/src/lib/toPayloadWithMongoMeta.ts +10 -0
- package/src/lib/toReturnValue.ts +3 -9
- package/src/lib/validByType.ts +10 -6
- package/dist/browser/lib/toBoundWitnessWithMeta.d.cts +0 -5
- package/dist/browser/lib/toBoundWitnessWithMeta.d.cts.map +0 -1
- package/dist/browser/lib/toBoundWitnessWithMeta.d.mts +0 -5
- package/dist/browser/lib/toBoundWitnessWithMeta.d.mts.map +0 -1
- package/dist/browser/lib/toBoundWitnessWithMeta.d.ts +0 -5
- package/dist/browser/lib/toBoundWitnessWithMeta.d.ts.map +0 -1
- package/dist/browser/lib/toPayloadWithMeta.d.cts +0 -4
- package/dist/browser/lib/toPayloadWithMeta.d.cts.map +0 -1
- package/dist/browser/lib/toPayloadWithMeta.d.mts +0 -4
- package/dist/browser/lib/toPayloadWithMeta.d.mts.map +0 -1
- package/dist/browser/lib/toPayloadWithMeta.d.ts +0 -4
- package/dist/browser/lib/toPayloadWithMeta.d.ts.map +0 -1
- package/dist/node/lib/toBoundWitnessWithMeta.d.cts +0 -5
- package/dist/node/lib/toBoundWitnessWithMeta.d.cts.map +0 -1
- package/dist/node/lib/toBoundWitnessWithMeta.d.mts +0 -5
- package/dist/node/lib/toBoundWitnessWithMeta.d.mts.map +0 -1
- package/dist/node/lib/toBoundWitnessWithMeta.d.ts +0 -5
- package/dist/node/lib/toBoundWitnessWithMeta.d.ts.map +0 -1
- package/dist/node/lib/toPayloadWithMeta.d.cts +0 -4
- package/dist/node/lib/toPayloadWithMeta.d.cts.map +0 -1
- package/dist/node/lib/toPayloadWithMeta.d.mts +0 -4
- package/dist/node/lib/toPayloadWithMeta.d.mts.map +0 -1
- package/dist/node/lib/toPayloadWithMeta.d.ts +0 -4
- package/dist/node/lib/toPayloadWithMeta.d.ts.map +0 -1
- package/src/lib/toBoundWitnessWithMeta.ts +0 -9
- package/src/lib/toPayloadWithMeta.ts +0 -6
package/dist/node/index.js
CHANGED
|
@@ -8,53 +8,38 @@ var __publicField = (obj, key, value) => {
|
|
|
8
8
|
|
|
9
9
|
// src/Archivist.ts
|
|
10
10
|
import { exists } from "@xylabs/exists";
|
|
11
|
-
import { fulfilledValues } from "@xylabs/promise";
|
|
12
11
|
import { AbstractArchivist } from "@xyo-network/archivist-abstract";
|
|
13
12
|
import { ArchivistConfigSchema, ArchivistInsertQuerySchema } from "@xyo-network/archivist-model";
|
|
14
13
|
import { MongoDBArchivistConfigSchema } from "@xyo-network/archivist-model-mongodb";
|
|
15
14
|
import { MongoDBModuleMixin } from "@xyo-network/module-abstract-mongodb";
|
|
16
|
-
import { PayloadWrapper as
|
|
17
|
-
|
|
18
|
-
// src/lib/toBoundWitnessWithMeta.ts
|
|
19
|
-
var toBoundWitnessWithMeta = /* @__PURE__ */ __name(async (wrapper) => {
|
|
20
|
-
const bw = wrapper.boundwitness;
|
|
21
|
-
return {
|
|
22
|
-
...bw,
|
|
23
|
-
_hash: await wrapper.hashAsync(),
|
|
24
|
-
_timestamp: Date.now()
|
|
25
|
-
};
|
|
26
|
-
}, "toBoundWitnessWithMeta");
|
|
15
|
+
import { PayloadWrapper as PayloadWrapper2 } from "@xyo-network/payload-wrapper";
|
|
27
16
|
|
|
28
|
-
// src/lib/
|
|
29
|
-
|
|
17
|
+
// src/lib/toPayloadWithMongoMeta.ts
|
|
18
|
+
import { PayloadBuilder } from "@xyo-network/payload-builder";
|
|
19
|
+
var toPayloadWithMongoMeta = /* @__PURE__ */ __name(async (payload) => {
|
|
20
|
+
const built = await PayloadBuilder.build(payload);
|
|
21
|
+
const _hash = await PayloadBuilder.hash(built);
|
|
22
|
+
const { $hash, $meta, ...fields } = built;
|
|
30
23
|
return {
|
|
31
|
-
...
|
|
32
|
-
|
|
24
|
+
...fields,
|
|
25
|
+
_$hash: $hash,
|
|
26
|
+
_$meta: $meta,
|
|
27
|
+
_hash,
|
|
33
28
|
_timestamp: Date.now()
|
|
34
29
|
};
|
|
35
|
-
}, "
|
|
30
|
+
}, "toPayloadWithMongoMeta");
|
|
36
31
|
|
|
37
32
|
// src/lib/toReturnValue.ts
|
|
38
|
-
import {
|
|
33
|
+
import { deepOmitPrefixedFields } from "@xyo-network/hash";
|
|
39
34
|
var toReturnValue = /* @__PURE__ */ __name((value) => {
|
|
40
|
-
|
|
41
|
-
if (_signatures) {
|
|
42
|
-
return {
|
|
43
|
-
...PayloadWrapper.wrap(value).body(),
|
|
44
|
-
_signatures
|
|
45
|
-
};
|
|
46
|
-
} else {
|
|
47
|
-
return {
|
|
48
|
-
...PayloadWrapper.wrap(value).body()
|
|
49
|
-
};
|
|
50
|
-
}
|
|
35
|
+
return deepOmitPrefixedFields(value, "_");
|
|
51
36
|
}, "toReturnValue");
|
|
52
37
|
|
|
53
38
|
// src/lib/validByType.ts
|
|
54
39
|
import { QueryBoundWitnessWrapper } from "@xyo-network/boundwitness-builder";
|
|
55
40
|
import { isBoundWitness, isQueryBoundWitness } from "@xyo-network/boundwitness-model";
|
|
56
41
|
import { BoundWitnessWrapper } from "@xyo-network/boundwitness-wrapper";
|
|
57
|
-
import { PayloadWrapper
|
|
42
|
+
import { PayloadWrapper } from "@xyo-network/payload-wrapper";
|
|
58
43
|
var validByType = /* @__PURE__ */ __name(async (payloads = []) => {
|
|
59
44
|
const results = [
|
|
60
45
|
[],
|
|
@@ -63,16 +48,20 @@ var validByType = /* @__PURE__ */ __name(async (payloads = []) => {
|
|
|
63
48
|
await Promise.all(payloads.map(async (payload) => {
|
|
64
49
|
if (isBoundWitness(payload)) {
|
|
65
50
|
const wrapper = isQueryBoundWitness(payload) ? QueryBoundWitnessWrapper : BoundWitnessWrapper;
|
|
66
|
-
const bw = wrapper.parse(payload);
|
|
51
|
+
const bw = await wrapper.parse(payload);
|
|
67
52
|
if (await bw.getValid()) {
|
|
68
|
-
results[0].push(bw);
|
|
53
|
+
results[0].push(bw.jsonPayload());
|
|
54
|
+
} else {
|
|
55
|
+
const errors = await bw.getErrors();
|
|
56
|
+
console.log(`validByType.Error: ${JSON.stringify(errors, null, 2)}`);
|
|
69
57
|
}
|
|
70
58
|
} else {
|
|
71
|
-
const payloadWrapper =
|
|
59
|
+
const payloadWrapper = await PayloadWrapper.wrap(payload);
|
|
72
60
|
if (await payloadWrapper.getValid()) {
|
|
73
|
-
results[1].push(payloadWrapper);
|
|
61
|
+
results[1].push(payloadWrapper.jsonPayload());
|
|
74
62
|
}
|
|
75
63
|
}
|
|
64
|
+
return;
|
|
76
65
|
}));
|
|
77
66
|
return results;
|
|
78
67
|
}, "validByType");
|
|
@@ -88,37 +77,62 @@ var _MongoDBArchivist = class _MongoDBArchivist extends MongoDBArchivistBase {
|
|
|
88
77
|
const head = await (await this.payloads.find({})).sort({
|
|
89
78
|
_timestamp: -1
|
|
90
79
|
}).limit(1).toArray();
|
|
91
|
-
return head[0] ?
|
|
80
|
+
return head[0] ? (await PayloadWrapper2.wrap(head[0])).jsonPayload() : void 0;
|
|
92
81
|
}
|
|
93
82
|
async getHandler(hashes) {
|
|
94
|
-
|
|
83
|
+
let remainingHashes = [
|
|
84
|
+
...hashes
|
|
85
|
+
];
|
|
86
|
+
const dataPayloads = (await Promise.all(remainingHashes.map((_$hash) => this.payloads.findOne({
|
|
87
|
+
_$hash
|
|
88
|
+
})))).filter(exists);
|
|
89
|
+
const dataPayloadsHashes = dataPayloads.map((payload) => payload._$hash);
|
|
90
|
+
remainingHashes = remainingHashes.filter((hash) => !dataPayloadsHashes.includes(hash));
|
|
91
|
+
const dataBws = (await Promise.all(remainingHashes.map((_$hash) => this.boundWitnesses.findOne({
|
|
92
|
+
_$hash
|
|
93
|
+
})))).filter(exists);
|
|
94
|
+
const dataBwsHashes = dataBws.map((payload) => payload._$hash);
|
|
95
|
+
remainingHashes = remainingHashes.filter((hash) => !dataBwsHashes.includes(hash));
|
|
96
|
+
const payloads = (await Promise.all(remainingHashes.map((_hash) => this.payloads.findOne({
|
|
95
97
|
_hash
|
|
96
|
-
}));
|
|
97
|
-
const
|
|
98
|
+
})))).filter(exists);
|
|
99
|
+
const payloadsHashes = payloads.map((payload) => payload._hash);
|
|
100
|
+
remainingHashes = remainingHashes.filter((hash) => !payloadsHashes.includes(hash));
|
|
101
|
+
const bws = (await Promise.all(remainingHashes.map((_hash) => this.boundWitnesses.findOne({
|
|
98
102
|
_hash
|
|
99
|
-
}));
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
103
|
+
})))).filter(exists);
|
|
104
|
+
const bwsHashes = bws.map((payload) => payload._hash);
|
|
105
|
+
remainingHashes = remainingHashes.filter((hash) => !bwsHashes.includes(hash));
|
|
106
|
+
const foundPayloads = [
|
|
107
|
+
...dataPayloads,
|
|
108
|
+
...dataBws,
|
|
109
|
+
...payloads,
|
|
110
|
+
...bws
|
|
111
|
+
];
|
|
112
|
+
return foundPayloads.map(({ _$hash, _$meta, ...other }) => ({
|
|
113
|
+
$hash: _$hash,
|
|
114
|
+
$meta: _$meta,
|
|
115
|
+
...other
|
|
116
|
+
})).map(toReturnValue);
|
|
106
117
|
}
|
|
107
118
|
async insertHandler(payloads) {
|
|
108
119
|
const [bw, p] = await validByType(payloads);
|
|
109
|
-
const
|
|
110
|
-
if (
|
|
111
|
-
const payloadsResult = await this.payloads.insertMany(
|
|
112
|
-
if (!payloadsResult.acknowledged || payloadsResult.insertedCount !==
|
|
120
|
+
const payloadsWithExternalMeta = await Promise.all(p.map((x) => toPayloadWithMongoMeta(x)));
|
|
121
|
+
if (payloadsWithExternalMeta.length) {
|
|
122
|
+
const payloadsResult = await this.payloads.insertMany(payloadsWithExternalMeta);
|
|
123
|
+
if (!payloadsResult.acknowledged || payloadsResult.insertedCount !== payloadsWithExternalMeta.length)
|
|
113
124
|
throw new Error("MongoDBDeterministicArchivist: Error inserting Payloads");
|
|
114
125
|
}
|
|
115
|
-
const
|
|
116
|
-
if (
|
|
117
|
-
const boundWitnessesResult = await this.boundWitnesses.insertMany(
|
|
118
|
-
if (!boundWitnessesResult.acknowledged || boundWitnessesResult.insertedCount !==
|
|
126
|
+
const boundWitnessesWithExternalMeta = await Promise.all(bw.map((x) => toPayloadWithMongoMeta(x)));
|
|
127
|
+
if (boundWitnessesWithExternalMeta.length) {
|
|
128
|
+
const boundWitnessesResult = await this.boundWitnesses.insertMany(boundWitnessesWithExternalMeta);
|
|
129
|
+
if (!boundWitnessesResult.acknowledged || boundWitnessesResult.insertedCount !== boundWitnessesWithExternalMeta.length)
|
|
119
130
|
throw new Error("MongoDBDeterministicArchivist: Error inserting BoundWitnesses");
|
|
120
131
|
}
|
|
121
|
-
return
|
|
132
|
+
return [
|
|
133
|
+
...boundWitnessesWithExternalMeta,
|
|
134
|
+
...payloadsWithExternalMeta
|
|
135
|
+
];
|
|
122
136
|
}
|
|
123
137
|
async startHandler() {
|
|
124
138
|
await super.startHandler();
|
package/dist/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Archivist.ts","../../src/lib/toBoundWitnessWithMeta.ts","../../src/lib/toPayloadWithMeta.ts","../../src/lib/toReturnValue.ts","../../src/lib/validByType.ts","../../src/index.ts"],"sourcesContent":["import { exists } from '@xylabs/exists'\nimport { fulfilledValues } from '@xylabs/promise'\nimport { AbstractArchivist } from '@xyo-network/archivist-abstract'\nimport { ArchivistConfigSchema, ArchivistInsertQuerySchema } from '@xyo-network/archivist-model'\nimport { MongoDBArchivistConfigSchema } from '@xyo-network/archivist-model-mongodb'\nimport { MongoDBModuleMixin } from '@xyo-network/module-abstract-mongodb'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PayloadWithPartialMeta } from '@xyo-network/payload-mongodb'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nimport { toBoundWitnessWithMeta, toPayloadWithMeta, toReturnValue, validByType } from './lib'\n\nconst MongoDBArchivistBase = MongoDBModuleMixin(AbstractArchivist)\n\nexport class MongoDBArchivist extends MongoDBArchivistBase {\n static override configSchemas = [MongoDBArchivistConfigSchema, ArchivistConfigSchema]\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]).body() : undefined\n }\n\n protected override async getHandler(hashes: string[]): Promise<Payload[]> {\n const payloads = hashes.map((_hash) => this.payloads.findOne({ _hash }))\n const bws = hashes.map((_hash) => this.boundWitnesses.findOne({ _hash }))\n const gets = await Promise.allSettled([payloads, bws].flat())\n const succeeded = gets.reduce<(PayloadWithPartialMeta | null)[]>(fulfilledValues, []) as Payload[]\n return succeeded.filter(exists).map(toReturnValue)\n }\n\n protected override async insertHandler(payloads?: Payload[]): Promise<Payload[]> {\n const [bw, p] = await validByType(payloads)\n const payloadsWithMeta = await Promise.all(p.map((x) => toPayloadWithMeta(x)))\n if (payloadsWithMeta.length) {\n const payloadsResult = await this.payloads.insertMany(payloadsWithMeta)\n if (!payloadsResult.acknowledged || payloadsResult.insertedCount !== payloadsWithMeta.length)\n throw new Error('MongoDBDeterministicArchivist: Error inserting Payloads')\n }\n const boundWitnesses = await Promise.all(bw.map((x) => toBoundWitnessWithMeta(x)))\n if (boundWitnesses.length) {\n const boundWitnessesResult = await this.boundWitnesses.insertMany(boundWitnesses)\n if (!boundWitnessesResult.acknowledged || boundWitnessesResult.insertedCount !== boundWitnesses.length)\n throw new Error('MongoDBDeterministicArchivist: Error inserting BoundWitnesses')\n }\n return payloads ?? []\n }\n\n protected override async startHandler() {\n await super.startHandler()\n await this.ensureIndexes()\n return true\n }\n}\n","import { QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { BoundWitnessWithMeta } from '@xyo-network/payload-mongodb'\n\nexport const toBoundWitnessWithMeta = async (wrapper: BoundWitnessWrapper | QueryBoundWitnessWrapper): Promise<BoundWitnessWithMeta> => {\n const bw = wrapper.boundwitness as BoundWitness\n return { ...bw, _hash: await wrapper.hashAsync(), _timestamp: Date.now() }\n}\n","import { PayloadWithMeta } from '@xyo-network/payload-mongodb'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport const toPayloadWithMeta = async (wrapper: PayloadWrapper): Promise<PayloadWithMeta> => {\n return { ...wrapper.payload(), _hash: await wrapper.hashAsync(), _timestamp: Date.now() }\n}\n","import { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport const toReturnValue = (value: Payload | BoundWitness): Payload => {\n const _signatures = (value as BoundWitness)?._signatures\n if (_signatures) {\n return { ...PayloadWrapper.wrap(value).body(), _signatures } as BoundWitness\n } else {\n return { ...PayloadWrapper.wrap(value).body() }\n }\n}\n","import { QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { isBoundWitness, isQueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport const validByType = async (payloads: Payload[] = []) => {\n const results: [BoundWitnessWrapper[], PayloadWrapper[]] = [[], []]\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)\n }\n } else {\n const payloadWrapper = PayloadWrapper.wrap(payload)\n if (await payloadWrapper.getValid()) {\n results[1].push(payloadWrapper)\n }\n }\n }),\n )\n return results\n}\n","export * from './Archivist'\nexport * from '@xyo-network/archivist-model-mongodb'\n"],"mappings":"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","names":["exists","fulfilledValues","AbstractArchivist","ArchivistConfigSchema","ArchivistInsertQuerySchema","MongoDBArchivistConfigSchema","MongoDBModuleMixin","PayloadWrapper","toBoundWitnessWithMeta","wrapper","bw","boundwitness","_hash","hashAsync","_timestamp","Date","now","toPayloadWithMeta","wrapper","payload","_hash","hashAsync","_timestamp","Date","now","PayloadWrapper","toReturnValue","value","_signatures","PayloadWrapper","wrap","body","QueryBoundWitnessWrapper","isBoundWitness","isQueryBoundWitness","BoundWitnessWrapper","PayloadWrapper","validByType","payloads","results","Promise","all","map","payload","isBoundWitness","wrapper","isQueryBoundWitness","QueryBoundWitnessWrapper","BoundWitnessWrapper","bw","parse","getValid","push","payloadWrapper","PayloadWrapper","wrap","MongoDBArchivistBase","MongoDBModuleMixin","AbstractArchivist","MongoDBArchivist","queries","ArchivistInsertQuerySchema","head","payloads","find","sort","_timestamp","limit","toArray","PayloadWrapper","wrap","body","undefined","getHandler","hashes","map","_hash","findOne","bws","boundWitnesses","gets","Promise","allSettled","flat","succeeded","reduce","fulfilledValues","filter","exists","toReturnValue","insertHandler","bw","p","validByType","payloadsWithMeta","all","x","toPayloadWithMeta","length","payloadsResult","insertMany","acknowledged","insertedCount","Error","toBoundWitnessWithMeta","boundWitnessesResult","startHandler","ensureIndexes","configSchemas","MongoDBArchivistConfigSchema","ArchivistConfigSchema"]}
|
|
1
|
+
{"version":3,"sources":["../../src/Archivist.ts","../../src/lib/toPayloadWithMongoMeta.ts","../../src/lib/toReturnValue.ts","../../src/lib/validByType.ts","../../src/index.ts"],"sourcesContent":["import { exists } from '@xylabs/exists'\nimport { Hash } from '@xylabs/hex'\nimport { AbstractArchivist } from '@xyo-network/archivist-abstract'\nimport { ArchivistConfigSchema, ArchivistInsertQuerySchema } from '@xyo-network/archivist-model'\nimport { MongoDBArchivistConfigSchema } from '@xyo-network/archivist-model-mongodb'\nimport { MongoDBModuleMixin } from '@xyo-network/module-abstract-mongodb'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PayloadWithMongoMeta } from '@xyo-network/payload-mongodb'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nimport { toPayloadWithMongoMeta, toReturnValue, validByType } from './lib'\n\nconst MongoDBArchivistBase = MongoDBModuleMixin(AbstractArchivist)\n\nexport class MongoDBArchivist extends MongoDBArchivistBase {\n static override configSchemas = [MongoDBArchivistConfigSchema, ArchivistConfigSchema]\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] ? (await PayloadWrapper.wrap(head[0])).jsonPayload() : undefined\n }\n\n protected override async getHandler(hashes: string[]): Promise<Payload[]> {\n let remainingHashes = [...hashes]\n\n const dataPayloads = (await Promise.all(remainingHashes.map((_$hash) => this.payloads.findOne({ _$hash })))).filter(exists)\n const dataPayloadsHashes = dataPayloads.map((payload) => payload._$hash)\n remainingHashes = remainingHashes.filter((hash) => !dataPayloadsHashes.includes(hash))\n\n const dataBws = (await Promise.all(remainingHashes.map((_$hash) => this.boundWitnesses.findOne({ _$hash })))).filter(exists)\n const dataBwsHashes = dataBws.map((payload) => payload._$hash)\n remainingHashes = remainingHashes.filter((hash) => !dataBwsHashes.includes(hash))\n\n const payloads = (await Promise.all(remainingHashes.map((_hash) => this.payloads.findOne({ _hash })))).filter(exists)\n const payloadsHashes = payloads.map((payload) => payload._hash)\n remainingHashes = remainingHashes.filter((hash) => !payloadsHashes.includes(hash))\n\n const bws = (await Promise.all(remainingHashes.map((_hash) => this.boundWitnesses.findOne({ _hash })))).filter(exists)\n const bwsHashes = bws.map((payload) => payload._hash)\n remainingHashes = remainingHashes.filter((hash) => !bwsHashes.includes(hash))\n\n const foundPayloads = [...dataPayloads, ...dataBws, ...payloads, ...bws] as PayloadWithMongoMeta<Payload & { _$hash: Hash; _$meta?: unknown }>[]\n return foundPayloads.map(({ _$hash, _$meta, ...other }) => ({ $hash: _$hash, $meta: _$meta, ...other })).map(toReturnValue)\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<Payload[]> {\n const [bw, p] = await validByType(payloads)\n const payloadsWithExternalMeta = await Promise.all(p.map((x) => toPayloadWithMongoMeta(x)))\n if (payloadsWithExternalMeta.length) {\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((x) => toPayloadWithMongoMeta(x)))\n if (boundWitnessesWithExternalMeta.length) {\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 [...boundWitnessesWithExternalMeta, ...payloadsWithExternalMeta]\n }\n\n protected override async startHandler() {\n await super.startHandler()\n await this.ensureIndexes()\n return true\n }\n}\n","import { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PayloadWithMongoMeta } from '@xyo-network/payload-mongodb'\n\nexport const toPayloadWithMongoMeta = async <T extends Payload>(payload: T): Promise<PayloadWithMongoMeta<T>> => {\n const built = await PayloadBuilder.build(payload)\n const _hash = await PayloadBuilder.hash(built)\n const { $hash, $meta, ...fields } = built\n return { ...fields, _$hash: $hash, _$meta: $meta, _hash, _timestamp: Date.now() } as PayloadWithMongoMeta<T>\n}\n","import { deepOmitPrefixedFields } from '@xyo-network/hash'\nimport { Payload } from '@xyo-network/payload-model'\n\nexport const toReturnValue = (value: Payload): Payload => {\n return deepOmitPrefixedFields(value, '_')\n}\n","import { QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, isBoundWitness, isQueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { 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 = await wrapper.parse(payload)\n if (await bw.getValid()) {\n results[0].push(bw.jsonPayload())\n } else {\n const errors = await bw.getErrors()\n console.log(`validByType.Error: ${JSON.stringify(errors, null, 2)}`)\n }\n } else {\n const payloadWrapper = await PayloadWrapper.wrap(payload)\n if (await payloadWrapper.getValid()) {\n results[1].push(payloadWrapper.jsonPayload())\n }\n }\n return\n }),\n )\n return results\n}\n","export * from './Archivist'\nexport * from '@xyo-network/archivist-model-mongodb'\n"],"mappings":"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","names":["exists","AbstractArchivist","ArchivistConfigSchema","ArchivistInsertQuerySchema","MongoDBArchivistConfigSchema","MongoDBModuleMixin","PayloadWrapper","PayloadBuilder","toPayloadWithMongoMeta","payload","built","PayloadBuilder","build","_hash","hash","$hash","$meta","fields","_$hash","_$meta","_timestamp","Date","now","deepOmitPrefixedFields","toReturnValue","value","deepOmitPrefixedFields","QueryBoundWitnessWrapper","isBoundWitness","isQueryBoundWitness","BoundWitnessWrapper","PayloadWrapper","validByType","payloads","results","Promise","all","map","payload","isBoundWitness","wrapper","isQueryBoundWitness","QueryBoundWitnessWrapper","BoundWitnessWrapper","bw","parse","getValid","push","jsonPayload","errors","getErrors","console","log","JSON","stringify","payloadWrapper","PayloadWrapper","wrap","MongoDBArchivistBase","MongoDBModuleMixin","AbstractArchivist","MongoDBArchivist","queries","ArchivistInsertQuerySchema","head","payloads","find","sort","_timestamp","limit","toArray","PayloadWrapper","wrap","jsonPayload","undefined","getHandler","hashes","remainingHashes","dataPayloads","Promise","all","map","_$hash","findOne","filter","exists","dataPayloadsHashes","payload","hash","includes","dataBws","boundWitnesses","dataBwsHashes","_hash","payloadsHashes","bws","bwsHashes","foundPayloads","_$meta","other","$hash","$meta","toReturnValue","insertHandler","bw","p","validByType","payloadsWithExternalMeta","x","toPayloadWithMongoMeta","length","payloadsResult","insertMany","acknowledged","insertedCount","Error","boundWitnessesWithExternalMeta","boundWitnessesResult","startHandler","ensureIndexes","configSchemas","MongoDBArchivistConfigSchema","ArchivistConfigSchema"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA"}
|
package/dist/node/lib/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toPayloadWithMongoMeta.d.ts","sourceRoot":"","sources":["../../../src/lib/toPayloadWithMongoMeta.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAEnE,eAAO,MAAM,sBAAsB;;2DAKlC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toPayloadWithMongoMeta.d.ts","sourceRoot":"","sources":["../../../src/lib/toPayloadWithMongoMeta.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAEnE,eAAO,MAAM,sBAAsB;;2DAKlC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toPayloadWithMongoMeta.d.ts","sourceRoot":"","sources":["../../../src/lib/toPayloadWithMongoMeta.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAEnE,eAAO,MAAM,sBAAsB;;2DAKlC,CAAA"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { BoundWitness } from '@xyo-network/boundwitness-model';
|
|
2
1
|
import { Payload } from '@xyo-network/payload-model';
|
|
3
|
-
export declare const toReturnValue: (value: Payload
|
|
2
|
+
export declare const toReturnValue: (value: Payload) => Payload;
|
|
4
3
|
//# sourceMappingURL=toReturnValue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toReturnValue.d.ts","sourceRoot":"","sources":["../../../src/lib/toReturnValue.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"toReturnValue.d.ts","sourceRoot":"","sources":["../../../src/lib/toReturnValue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAEpD,eAAO,MAAM,aAAa,UAAW,OAAO,KAAG,OAE9C,CAAA"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { BoundWitness } from '@xyo-network/boundwitness-model';
|
|
2
1
|
import { Payload } from '@xyo-network/payload-model';
|
|
3
|
-
export declare const toReturnValue: (value: Payload
|
|
2
|
+
export declare const toReturnValue: (value: Payload) => Payload;
|
|
4
3
|
//# sourceMappingURL=toReturnValue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toReturnValue.d.ts","sourceRoot":"","sources":["../../../src/lib/toReturnValue.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"toReturnValue.d.ts","sourceRoot":"","sources":["../../../src/lib/toReturnValue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAEpD,eAAO,MAAM,aAAa,UAAW,OAAO,KAAG,OAE9C,CAAA"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { BoundWitness } from '@xyo-network/boundwitness-model';
|
|
2
1
|
import { Payload } from '@xyo-network/payload-model';
|
|
3
|
-
export declare const toReturnValue: (value: Payload
|
|
2
|
+
export declare const toReturnValue: (value: Payload) => Payload;
|
|
4
3
|
//# sourceMappingURL=toReturnValue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toReturnValue.d.ts","sourceRoot":"","sources":["../../../src/lib/toReturnValue.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"toReturnValue.d.ts","sourceRoot":"","sources":["../../../src/lib/toReturnValue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAEpD,eAAO,MAAM,aAAa,UAAW,OAAO,KAAG,OAE9C,CAAA"}
|
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
import { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper';
|
|
2
1
|
import { Payload } from '@xyo-network/payload-model';
|
|
3
|
-
|
|
4
|
-
export declare const validByType: (payloads?: Payload[]) => Promise<[BoundWitnessWrapper<import("@xyo-network/payload-model").SchemaFields & object & import("@xyo-network/boundwitness-model").BoundWitnessFields & {
|
|
2
|
+
export declare const validByType: (payloads?: Payload[]) => Promise<[(import("@xyo-network/payload-model").SchemaFields & object & import("@xyo-network/boundwitness-model").BoundWitnessFields & {
|
|
5
3
|
schema: "network.xyo.boundwitness";
|
|
6
|
-
}, {
|
|
4
|
+
})[], ({
|
|
7
5
|
schema: string;
|
|
8
|
-
} & object
|
|
9
|
-
schema: string;
|
|
10
|
-
} & object>[]]>;
|
|
6
|
+
} & object)[]]>;
|
|
11
7
|
//# sourceMappingURL=validByType.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validByType.d.ts","sourceRoot":"","sources":["../../../src/lib/validByType.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validByType.d.ts","sourceRoot":"","sources":["../../../src/lib/validByType.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGpD,eAAO,MAAM,WAAW,cAAoB,OAAO,EAAE;;;;eAuBpD,CAAA"}
|
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
import { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper';
|
|
2
1
|
import { Payload } from '@xyo-network/payload-model';
|
|
3
|
-
|
|
4
|
-
export declare const validByType: (payloads?: Payload[]) => Promise<[BoundWitnessWrapper<import("@xyo-network/payload-model").SchemaFields & object & import("@xyo-network/boundwitness-model").BoundWitnessFields & {
|
|
2
|
+
export declare const validByType: (payloads?: Payload[]) => Promise<[(import("@xyo-network/payload-model").SchemaFields & object & import("@xyo-network/boundwitness-model").BoundWitnessFields & {
|
|
5
3
|
schema: "network.xyo.boundwitness";
|
|
6
|
-
}, {
|
|
4
|
+
})[], ({
|
|
7
5
|
schema: string;
|
|
8
|
-
} & object
|
|
9
|
-
schema: string;
|
|
10
|
-
} & object>[]]>;
|
|
6
|
+
} & object)[]]>;
|
|
11
7
|
//# sourceMappingURL=validByType.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validByType.d.ts","sourceRoot":"","sources":["../../../src/lib/validByType.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validByType.d.ts","sourceRoot":"","sources":["../../../src/lib/validByType.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGpD,eAAO,MAAM,WAAW,cAAoB,OAAO,EAAE;;;;eAuBpD,CAAA"}
|
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
import { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper';
|
|
2
1
|
import { Payload } from '@xyo-network/payload-model';
|
|
3
|
-
|
|
4
|
-
export declare const validByType: (payloads?: Payload[]) => Promise<[BoundWitnessWrapper<import("@xyo-network/payload-model").SchemaFields & object & import("@xyo-network/boundwitness-model").BoundWitnessFields & {
|
|
2
|
+
export declare const validByType: (payloads?: Payload[]) => Promise<[(import("@xyo-network/payload-model").SchemaFields & object & import("@xyo-network/boundwitness-model").BoundWitnessFields & {
|
|
5
3
|
schema: "network.xyo.boundwitness";
|
|
6
|
-
}, {
|
|
4
|
+
})[], ({
|
|
7
5
|
schema: string;
|
|
8
|
-
} & object
|
|
9
|
-
schema: string;
|
|
10
|
-
} & object>[]]>;
|
|
6
|
+
} & object)[]]>;
|
|
11
7
|
//# sourceMappingURL=validByType.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validByType.d.ts","sourceRoot":"","sources":["../../../src/lib/validByType.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validByType.d.ts","sourceRoot":"","sources":["../../../src/lib/validByType.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGpD,eAAO,MAAM,WAAW,cAAoB,OAAO,EAAE;;;;eAuBpD,CAAA"}
|
package/package.json
CHANGED
|
@@ -10,29 +10,31 @@
|
|
|
10
10
|
"url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js/issues"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@xylabs/exists": "^2.
|
|
14
|
-
"@xylabs/
|
|
15
|
-
"@xyo-network/archivist-abstract": "^2.
|
|
16
|
-
"@xyo-network/archivist-model": "^2.
|
|
17
|
-
"@xyo-network/archivist-model-mongodb": "~2.
|
|
18
|
-
"@xyo-network/boundwitness-builder": "^2.
|
|
19
|
-
"@xyo-network/boundwitness-model": "^2.
|
|
20
|
-
"@xyo-network/boundwitness-wrapper": "^2.
|
|
21
|
-
"@xyo-network/
|
|
22
|
-
"@xyo-network/
|
|
23
|
-
"@xyo-network/payload-
|
|
24
|
-
"@xyo-network/payload-
|
|
13
|
+
"@xylabs/exists": "^2.14.0",
|
|
14
|
+
"@xylabs/hex": "^2.14.0",
|
|
15
|
+
"@xyo-network/archivist-abstract": "^2.89.0-rc.12",
|
|
16
|
+
"@xyo-network/archivist-model": "^2.89.0-rc.12",
|
|
17
|
+
"@xyo-network/archivist-model-mongodb": "~2.84.0-rc.1",
|
|
18
|
+
"@xyo-network/boundwitness-builder": "^2.89.0-rc.12",
|
|
19
|
+
"@xyo-network/boundwitness-model": "^2.89.0-rc.12",
|
|
20
|
+
"@xyo-network/boundwitness-wrapper": "^2.89.0-rc.12",
|
|
21
|
+
"@xyo-network/hash": "^2.89.0-rc.12",
|
|
22
|
+
"@xyo-network/module-abstract-mongodb": "~2.84.0-rc.1",
|
|
23
|
+
"@xyo-network/payload-builder": "^2.89.0-rc.12",
|
|
24
|
+
"@xyo-network/payload-model": "^2.89.0-rc.12",
|
|
25
|
+
"@xyo-network/payload-mongodb": "~2.84.0-rc.1",
|
|
26
|
+
"@xyo-network/payload-wrapper": "^2.89.0-rc.12"
|
|
25
27
|
},
|
|
26
28
|
"devDependencies": {
|
|
27
|
-
"@xylabs/arraybuffer": "^2.
|
|
28
|
-
"@xylabs/jest-helpers": "^2.
|
|
29
|
-
"@xylabs/ts-scripts-yarn3": "^3.2.
|
|
30
|
-
"@xylabs/tsconfig": "^3.2.
|
|
31
|
-
"@xyo-network/account": "^2.
|
|
32
|
-
"@xyo-network/account-model": "^2.
|
|
33
|
-
"@xyo-network/archivist-wrapper": "^2.
|
|
34
|
-
"@xyo-network/payload-builder": "^2.
|
|
35
|
-
"@xyo-network/sdk-xyo-mongo-js": "~2.
|
|
29
|
+
"@xylabs/arraybuffer": "^2.14.0",
|
|
30
|
+
"@xylabs/jest-helpers": "^2.14.0",
|
|
31
|
+
"@xylabs/ts-scripts-yarn3": "^3.2.42",
|
|
32
|
+
"@xylabs/tsconfig": "^3.2.42",
|
|
33
|
+
"@xyo-network/account": "^2.89.0-rc.12",
|
|
34
|
+
"@xyo-network/account-model": "^2.89.0-rc.12",
|
|
35
|
+
"@xyo-network/archivist-wrapper": "^2.89.0-rc.12",
|
|
36
|
+
"@xyo-network/payload-builder": "^2.89.0-rc.12",
|
|
37
|
+
"@xyo-network/sdk-xyo-mongo-js": "~2.84.0-rc.1",
|
|
36
38
|
"fake-indexeddb": "^4.0.2",
|
|
37
39
|
"jest": "^29.7.0",
|
|
38
40
|
"typescript": "^5.3.3"
|
|
@@ -76,6 +78,7 @@
|
|
|
76
78
|
"url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
|
|
77
79
|
},
|
|
78
80
|
"sideEffects": false,
|
|
79
|
-
"version": "2.
|
|
80
|
-
"type": "module"
|
|
81
|
+
"version": "2.84.0-rc.1",
|
|
82
|
+
"type": "module",
|
|
83
|
+
"stableVersion": "2.83.0"
|
|
81
84
|
}
|
package/src/Archivist.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { exists } from '@xylabs/exists'
|
|
2
|
-
import {
|
|
2
|
+
import { Hash } from '@xylabs/hex'
|
|
3
3
|
import { AbstractArchivist } from '@xyo-network/archivist-abstract'
|
|
4
4
|
import { ArchivistConfigSchema, ArchivistInsertQuerySchema } from '@xyo-network/archivist-model'
|
|
5
5
|
import { MongoDBArchivistConfigSchema } from '@xyo-network/archivist-model-mongodb'
|
|
6
6
|
import { MongoDBModuleMixin } from '@xyo-network/module-abstract-mongodb'
|
|
7
7
|
import { Payload } from '@xyo-network/payload-model'
|
|
8
|
-
import {
|
|
8
|
+
import { PayloadWithMongoMeta } from '@xyo-network/payload-mongodb'
|
|
9
9
|
import { PayloadWrapper } from '@xyo-network/payload-wrapper'
|
|
10
10
|
|
|
11
|
-
import {
|
|
11
|
+
import { toPayloadWithMongoMeta, toReturnValue, validByType } from './lib'
|
|
12
12
|
|
|
13
13
|
const MongoDBArchivistBase = MongoDBModuleMixin(AbstractArchivist)
|
|
14
14
|
|
|
@@ -19,32 +19,48 @@ export class MongoDBArchivist extends MongoDBArchivistBase {
|
|
|
19
19
|
|
|
20
20
|
override async head(): Promise<Payload | undefined> {
|
|
21
21
|
const head = await (await this.payloads.find({})).sort({ _timestamp: -1 }).limit(1).toArray()
|
|
22
|
-
return head[0] ? PayloadWrapper.wrap(head[0]).
|
|
22
|
+
return head[0] ? (await PayloadWrapper.wrap(head[0])).jsonPayload() : undefined
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
protected override async getHandler(hashes: string[]): Promise<Payload[]> {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
const
|
|
30
|
-
|
|
26
|
+
let remainingHashes = [...hashes]
|
|
27
|
+
|
|
28
|
+
const dataPayloads = (await Promise.all(remainingHashes.map((_$hash) => this.payloads.findOne({ _$hash })))).filter(exists)
|
|
29
|
+
const dataPayloadsHashes = dataPayloads.map((payload) => payload._$hash)
|
|
30
|
+
remainingHashes = remainingHashes.filter((hash) => !dataPayloadsHashes.includes(hash))
|
|
31
|
+
|
|
32
|
+
const dataBws = (await Promise.all(remainingHashes.map((_$hash) => this.boundWitnesses.findOne({ _$hash })))).filter(exists)
|
|
33
|
+
const dataBwsHashes = dataBws.map((payload) => payload._$hash)
|
|
34
|
+
remainingHashes = remainingHashes.filter((hash) => !dataBwsHashes.includes(hash))
|
|
35
|
+
|
|
36
|
+
const payloads = (await Promise.all(remainingHashes.map((_hash) => this.payloads.findOne({ _hash })))).filter(exists)
|
|
37
|
+
const payloadsHashes = payloads.map((payload) => payload._hash)
|
|
38
|
+
remainingHashes = remainingHashes.filter((hash) => !payloadsHashes.includes(hash))
|
|
39
|
+
|
|
40
|
+
const bws = (await Promise.all(remainingHashes.map((_hash) => this.boundWitnesses.findOne({ _hash })))).filter(exists)
|
|
41
|
+
const bwsHashes = bws.map((payload) => payload._hash)
|
|
42
|
+
remainingHashes = remainingHashes.filter((hash) => !bwsHashes.includes(hash))
|
|
43
|
+
|
|
44
|
+
const foundPayloads = [...dataPayloads, ...dataBws, ...payloads, ...bws] as PayloadWithMongoMeta<Payload & { _$hash: Hash; _$meta?: unknown }>[]
|
|
45
|
+
return foundPayloads.map(({ _$hash, _$meta, ...other }) => ({ $hash: _$hash, $meta: _$meta, ...other })).map(toReturnValue)
|
|
31
46
|
}
|
|
32
47
|
|
|
33
|
-
protected override async insertHandler(payloads
|
|
48
|
+
protected override async insertHandler(payloads: Payload[]): Promise<Payload[]> {
|
|
34
49
|
const [bw, p] = await validByType(payloads)
|
|
35
|
-
const
|
|
36
|
-
if (
|
|
37
|
-
const payloadsResult = await this.payloads.insertMany(
|
|
38
|
-
if (!payloadsResult.acknowledged || payloadsResult.insertedCount !==
|
|
50
|
+
const payloadsWithExternalMeta = await Promise.all(p.map((x) => toPayloadWithMongoMeta(x)))
|
|
51
|
+
if (payloadsWithExternalMeta.length) {
|
|
52
|
+
const payloadsResult = await this.payloads.insertMany(payloadsWithExternalMeta)
|
|
53
|
+
if (!payloadsResult.acknowledged || payloadsResult.insertedCount !== payloadsWithExternalMeta.length)
|
|
39
54
|
throw new Error('MongoDBDeterministicArchivist: Error inserting Payloads')
|
|
40
55
|
}
|
|
41
|
-
const
|
|
42
|
-
if (
|
|
43
|
-
const boundWitnessesResult = await this.boundWitnesses.insertMany(
|
|
44
|
-
if (!boundWitnessesResult.acknowledged || boundWitnessesResult.insertedCount !==
|
|
56
|
+
const boundWitnessesWithExternalMeta = await Promise.all(bw.map((x) => toPayloadWithMongoMeta(x)))
|
|
57
|
+
if (boundWitnessesWithExternalMeta.length) {
|
|
58
|
+
const boundWitnessesResult = await this.boundWitnesses.insertMany(boundWitnessesWithExternalMeta)
|
|
59
|
+
if (!boundWitnessesResult.acknowledged || boundWitnessesResult.insertedCount !== boundWitnessesWithExternalMeta.length)
|
|
45
60
|
throw new Error('MongoDBDeterministicArchivist: Error inserting BoundWitnesses')
|
|
46
61
|
}
|
|
47
|
-
|
|
62
|
+
|
|
63
|
+
return [...boundWitnessesWithExternalMeta, ...payloadsWithExternalMeta]
|
|
48
64
|
}
|
|
49
65
|
|
|
50
66
|
protected override async startHandler() {
|
package/src/lib/index.ts
CHANGED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { PayloadBuilder } from '@xyo-network/payload-builder'
|
|
2
|
+
import { Payload } from '@xyo-network/payload-model'
|
|
3
|
+
import { PayloadWithMongoMeta } from '@xyo-network/payload-mongodb'
|
|
4
|
+
|
|
5
|
+
export const toPayloadWithMongoMeta = async <T extends Payload>(payload: T): Promise<PayloadWithMongoMeta<T>> => {
|
|
6
|
+
const built = await PayloadBuilder.build(payload)
|
|
7
|
+
const _hash = await PayloadBuilder.hash(built)
|
|
8
|
+
const { $hash, $meta, ...fields } = built
|
|
9
|
+
return { ...fields, _$hash: $hash, _$meta: $meta, _hash, _timestamp: Date.now() } as PayloadWithMongoMeta<T>
|
|
10
|
+
}
|
package/src/lib/toReturnValue.ts
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { deepOmitPrefixedFields } from '@xyo-network/hash'
|
|
2
2
|
import { Payload } from '@xyo-network/payload-model'
|
|
3
|
-
import { PayloadWrapper } from '@xyo-network/payload-wrapper'
|
|
4
3
|
|
|
5
|
-
export const toReturnValue = (value: Payload
|
|
6
|
-
|
|
7
|
-
if (_signatures) {
|
|
8
|
-
return { ...PayloadWrapper.wrap(value).body(), _signatures } as BoundWitness
|
|
9
|
-
} else {
|
|
10
|
-
return { ...PayloadWrapper.wrap(value).body() }
|
|
11
|
-
}
|
|
4
|
+
export const toReturnValue = (value: Payload): Payload => {
|
|
5
|
+
return deepOmitPrefixedFields(value, '_')
|
|
12
6
|
}
|