@xyo-network/archivist-abstract 2.84.18 → 2.85.0
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/index.cjs +79 -44
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +82 -54
- package/dist/browser/index.js.map +1 -1
- package/dist/node/index.cjs +79 -45
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +82 -55
- package/dist/node/index.js.map +1 -1
- package/package.json +9 -9
package/dist/browser/index.cjs
CHANGED
|
@@ -3,6 +3,7 @@ var __defProp = Object.defineProperty;
|
|
|
3
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
6
7
|
var __export = (target, all) => {
|
|
7
8
|
for (var name in all)
|
|
8
9
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -35,10 +36,16 @@ var import_module_abstract = require("@xyo-network/module-abstract");
|
|
|
35
36
|
var import_module_model = require("@xyo-network/module-model");
|
|
36
37
|
var import_payload_wrapper = require("@xyo-network/payload-wrapper");
|
|
37
38
|
var AbstractArchivist = class extends import_module_abstract.AbstractModuleInstance {
|
|
39
|
+
static {
|
|
40
|
+
__name(this, "AbstractArchivist");
|
|
41
|
+
}
|
|
38
42
|
_lastInsertedPayload;
|
|
39
43
|
_parents;
|
|
40
44
|
get queries() {
|
|
41
|
-
return [
|
|
45
|
+
return [
|
|
46
|
+
import_archivist_model.ArchivistGetQuerySchema,
|
|
47
|
+
...super.queries
|
|
48
|
+
];
|
|
42
49
|
}
|
|
43
50
|
get requireAllParents() {
|
|
44
51
|
return this.config.requireAllParents ?? false;
|
|
@@ -114,14 +121,18 @@ var AbstractArchivist = class extends import_module_abstract.AbstractModuleInsta
|
|
|
114
121
|
const emitEvents = config?.emitEvents ?? true;
|
|
115
122
|
const deletedHashes = await this.deleteHandler(hashes);
|
|
116
123
|
if (emitEvents) {
|
|
117
|
-
await this.emit("deleted", {
|
|
124
|
+
await this.emit("deleted", {
|
|
125
|
+
hashes: deletedHashes,
|
|
126
|
+
module: this
|
|
127
|
+
});
|
|
118
128
|
}
|
|
119
129
|
return deletedHashes;
|
|
120
130
|
}
|
|
121
131
|
async getFromParent(hashes, archivist) {
|
|
122
|
-
const foundPairs = (await Promise.all(
|
|
123
|
-
|
|
124
|
-
|
|
132
|
+
const foundPairs = (await Promise.all((await archivist.get(hashes)).map(async (payload) => [
|
|
133
|
+
await import_hash.PayloadHasher.hashAsync(payload),
|
|
134
|
+
payload
|
|
135
|
+
]))).filter(([hash]) => {
|
|
125
136
|
const askedFor = hashes.includes(hash);
|
|
126
137
|
if (!askedFor) {
|
|
127
138
|
console.warn(`Parent returned payload with hash not asked for: ${hash}`);
|
|
@@ -131,20 +142,31 @@ var AbstractArchivist = class extends import_module_abstract.AbstractModuleInsta
|
|
|
131
142
|
const foundHashes = new Set(foundPairs.map(([hash]) => hash));
|
|
132
143
|
const foundPayloads = foundPairs.map(([, payload]) => payload);
|
|
133
144
|
const notfound = hashes.filter((hash) => !foundHashes.has(hash));
|
|
134
|
-
return [
|
|
145
|
+
return [
|
|
146
|
+
foundPayloads,
|
|
147
|
+
notfound
|
|
148
|
+
];
|
|
135
149
|
}
|
|
136
150
|
async getFromParents(hashes) {
|
|
137
151
|
const parents = Object.values((await this.parents())?.read ?? {});
|
|
138
|
-
let remainingHashes = [
|
|
152
|
+
let remainingHashes = [
|
|
153
|
+
...hashes
|
|
154
|
+
];
|
|
139
155
|
let parentIndex = 0;
|
|
140
156
|
let result = [];
|
|
141
157
|
while (parentIndex < parents.length && remainingHashes.length > 0) {
|
|
142
158
|
const [found, notfound] = await this.getFromParent(remainingHashes, parents[parentIndex]);
|
|
143
|
-
result = [
|
|
159
|
+
result = [
|
|
160
|
+
...result,
|
|
161
|
+
...found
|
|
162
|
+
];
|
|
144
163
|
remainingHashes = notfound;
|
|
145
164
|
parentIndex++;
|
|
146
165
|
}
|
|
147
|
-
return [
|
|
166
|
+
return [
|
|
167
|
+
result,
|
|
168
|
+
remainingHashes
|
|
169
|
+
];
|
|
148
170
|
}
|
|
149
171
|
getHandler(_hashes) {
|
|
150
172
|
throw new Error("Not implemented");
|
|
@@ -152,27 +174,35 @@ var AbstractArchivist = class extends import_module_abstract.AbstractModuleInsta
|
|
|
152
174
|
async getWithConfig(hashes, config) {
|
|
153
175
|
const emitEvents = config?.emitEvents ?? true;
|
|
154
176
|
const map = await import_payload_wrapper.PayloadWrapper.toMap(await this.getHandler(hashes));
|
|
155
|
-
const { foundPayloads, notfoundHashes } = hashes.reduce(
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
if (found) {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
}
|
|
177
|
+
const { foundPayloads, notfoundHashes } = hashes.reduce((prev, hash) => {
|
|
178
|
+
const found = map[hash];
|
|
179
|
+
if (found) {
|
|
180
|
+
if (found.schema === import_boundwitness_model.BoundWitnessSchema) {
|
|
181
|
+
prev.foundPayloads.push({
|
|
182
|
+
...import_hash.PayloadHasher.hashFields(found),
|
|
183
|
+
_signatures: found._signatures
|
|
184
|
+
});
|
|
164
185
|
} else {
|
|
165
|
-
prev.
|
|
186
|
+
prev.foundPayloads.push({
|
|
187
|
+
...import_hash.PayloadHasher.hashFields(found)
|
|
188
|
+
});
|
|
166
189
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
190
|
+
} else {
|
|
191
|
+
prev.notfoundHashes.push(hash);
|
|
192
|
+
}
|
|
193
|
+
return prev;
|
|
194
|
+
}, {
|
|
195
|
+
foundPayloads: [],
|
|
196
|
+
notfoundHashes: []
|
|
197
|
+
});
|
|
171
198
|
const [parentFoundPayloads] = await this.getFromParents(notfoundHashes);
|
|
172
199
|
if (this.storeParentReads) {
|
|
173
200
|
await this.insertWithConfig(parentFoundPayloads);
|
|
174
201
|
}
|
|
175
|
-
return [
|
|
202
|
+
return [
|
|
203
|
+
...foundPayloads,
|
|
204
|
+
...parentFoundPayloads
|
|
205
|
+
];
|
|
176
206
|
}
|
|
177
207
|
head() {
|
|
178
208
|
return this._lastInsertedPayload;
|
|
@@ -188,7 +218,10 @@ var AbstractArchivist = class extends import_module_abstract.AbstractModuleInsta
|
|
|
188
218
|
await this.writeToParents(insertedPayloads);
|
|
189
219
|
}
|
|
190
220
|
if (emitEvents) {
|
|
191
|
-
await this.emit("inserted", {
|
|
221
|
+
await this.emit("inserted", {
|
|
222
|
+
module: this,
|
|
223
|
+
payloads: insertedPayloads
|
|
224
|
+
});
|
|
192
225
|
}
|
|
193
226
|
return insertedPayloads;
|
|
194
227
|
}
|
|
@@ -206,7 +239,9 @@ var AbstractArchivist = class extends import_module_abstract.AbstractModuleInsta
|
|
|
206
239
|
(0, import_assert.assertEx)(this.queryable(query, payloads, queryConfig));
|
|
207
240
|
const resultPayloads = [];
|
|
208
241
|
if (this.config.storeQueries) {
|
|
209
|
-
await this.insertHandler([
|
|
242
|
+
await this.insertHandler([
|
|
243
|
+
query
|
|
244
|
+
]);
|
|
210
245
|
}
|
|
211
246
|
switch (queryPayload.schema) {
|
|
212
247
|
case import_archivist_model.ArchivistAllQuerySchema: {
|
|
@@ -223,7 +258,9 @@ var AbstractArchivist = class extends import_module_abstract.AbstractModuleInsta
|
|
|
223
258
|
}
|
|
224
259
|
case import_archivist_model.ArchivistDeleteQuerySchema: {
|
|
225
260
|
const resultPayload = {
|
|
226
|
-
hashes: [
|
|
261
|
+
hashes: [
|
|
262
|
+
...await this.deleteWithConfig(queryPayload.hashes)
|
|
263
|
+
],
|
|
227
264
|
schema: import_archivist_model.ArchivistDeleteQuerySchema
|
|
228
265
|
};
|
|
229
266
|
resultPayloads.push(resultPayload);
|
|
@@ -259,27 +296,25 @@ var AbstractArchivist = class extends import_module_abstract.AbstractModuleInsta
|
|
|
259
296
|
}
|
|
260
297
|
async writeToParents(payloads) {
|
|
261
298
|
const parents = await this.parents();
|
|
262
|
-
return (0, import_lodash.compact)(
|
|
263
|
-
await
|
|
264
|
-
|
|
265
|
-
return parent ? await this.writeToParent(parent, payloads) : void 0;
|
|
266
|
-
})
|
|
267
|
-
)
|
|
268
|
-
).flat();
|
|
299
|
+
return (0, import_lodash.compact)(await Promise.all(Object.values(parents.write ?? {}).map(async (parent) => {
|
|
300
|
+
return parent ? await this.writeToParent(parent, payloads) : void 0;
|
|
301
|
+
}))).flat();
|
|
269
302
|
}
|
|
270
303
|
async resolveArchivists(archivists = []) {
|
|
271
|
-
const archivistModules = [
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
);
|
|
304
|
+
const archivistModules = [
|
|
305
|
+
...await this.resolve({
|
|
306
|
+
address: archivists
|
|
307
|
+
}),
|
|
308
|
+
...await this.resolve({
|
|
309
|
+
name: archivists
|
|
310
|
+
})
|
|
311
|
+
].filter(import_module_model.duplicateModules);
|
|
312
|
+
(0, import_assert.assertEx)(!this.requireAllParents || archivistModules.length === archivists.length, `Failed to find some archivists (set allRequired to false if ok): [${archivists.filter((archivist) => archivistModules.map((module2) => !(module2.address === archivist || module2.config.name === archivist)))}]`);
|
|
280
313
|
return archivistModules.reduce((prev, module2) => {
|
|
281
314
|
prev[module2.address] = (0, import_archivist_model.asArchivistInstance)(module2, () => {
|
|
282
|
-
(0, import_archivist_model.isArchivistInstance)(module2, {
|
|
315
|
+
(0, import_archivist_model.isArchivistInstance)(module2, {
|
|
316
|
+
log: console
|
|
317
|
+
});
|
|
283
318
|
return `Unable to cast resolved module to an archivist: [${module2.address}, ${module2.config.name}, ${module2.config.schema})}]`;
|
|
284
319
|
});
|
|
285
320
|
return prev;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/AbstractArchivist.ts"],"sourcesContent":["export * from './AbstractArchivist'\n","import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable, PromisableArray } from '@xylabs/promise'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistDeleteQuery,\n ArchivistDeleteQuerySchema,\n ArchivistGetQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n ArchivistParams,\n ArchivistQuery,\n ArchivistQueryBase,\n asArchivistInstance,\n isArchivistInstance,\n} from '@xyo-network/archivist-model'\nimport { QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, BoundWitnessSchema, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { duplicateModules, ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport interface ActionConfig {\n emitEvents?: boolean\n}\n\nexport interface InsertConfig extends ActionConfig {\n writeToParents?: boolean\n}\n\nexport interface ArchivistParentInstances {\n commit?: Record<string, ArchivistInstance>\n read?: Record<string, ArchivistInstance>\n write?: Record<string, ArchivistInstance>\n}\n\nexport abstract class AbstractArchivist<\n TParams extends ArchivistParams = ArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements ArchivistInstance<TParams>\n{\n private _lastInsertedPayload: Payload | undefined\n private _parents?: ArchivistParentInstances\n\n override get queries(): string[] {\n return [ArchivistGetQuerySchema, ...super.queries]\n }\n\n get requireAllParents() {\n return this.config.requireAllParents ?? false\n }\n\n protected override get _queryAccountPaths(): Record<ArchivistQueryBase['schema'], string> {\n return {\n 'network.xyo.query.archivist.all': '1/1',\n 'network.xyo.query.archivist.clear': '1/2',\n 'network.xyo.query.archivist.commit': '1/3',\n 'network.xyo.query.archivist.delete': '1/4',\n 'network.xyo.query.archivist.get': '1/5',\n 'network.xyo.query.archivist.insert': '1/6',\n }\n }\n\n protected get storeParentReads() {\n return !!this.config?.storeParentReads\n }\n\n all(): PromisableArray<Payload> {\n this._noOverride('all')\n return this.busy(async () => {\n await this.started('throw')\n return await this.allHandler()\n })\n }\n\n clear(): Promisable<void> {\n this._noOverride('clear')\n return this.busy(async () => {\n await this.started('throw')\n return await this.clearHandler()\n })\n }\n\n commit(): Promisable<BoundWitness[]> {\n this._noOverride('commit')\n return this.busy(async () => {\n await this.started('throw')\n return await this.commitHandler()\n })\n }\n\n async delete(hashes: string[]): Promise<string[]> {\n this._noOverride('delete')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.deleteWithConfig(hashes)\n })\n }\n\n async get(hashes: string[]): Promise<Payload[]> {\n this._noOverride('get')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.getWithConfig(hashes)\n })\n }\n\n async insert(payloads: Payload[]): Promise<Payload[]> {\n this._noOverride('insert')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.insertWithConfig(payloads)\n })\n }\n\n protected allHandler(): PromisableArray<Payload> {\n throw new Error('Not implemented')\n }\n\n protected clearHandler(): Promisable<void> {\n throw new Error('Not implemented')\n }\n\n protected commitHandler(): Promisable<BoundWitness[]> {\n throw new Error('Not implemented')\n }\n\n protected deleteHandler(_hashes: string[]): PromisableArray<string> {\n throw new Error('Not implemented')\n }\n\n protected async deleteWithConfig(hashes: string[], config?: ActionConfig): Promise<string[]> {\n const emitEvents = config?.emitEvents ?? true\n\n const deletedHashes = await this.deleteHandler(hashes)\n\n if (emitEvents) {\n await this.emit('deleted', { hashes: deletedHashes, module: this })\n }\n\n return deletedHashes\n }\n\n protected async getFromParent(hashes: string[], archivist: ArchivistInstance): Promise<[Payload[], string[]]> {\n const foundPairs = (\n await Promise.all(\n (await archivist.get(hashes)).map<Promise<[string, Payload]>>(async (payload) => [await PayloadHasher.hashAsync(payload), payload]),\n )\n ).filter(([hash]) => {\n const askedFor = hashes.includes(hash)\n if (!askedFor) {\n console.warn(`Parent returned payload with hash not asked for: ${hash}`)\n //throw Error(`Parent returned payload with hash not asked for: ${hash}`)\n }\n return askedFor\n })\n\n const foundHashes = new Set(foundPairs.map(([hash]) => hash))\n const foundPayloads = foundPairs.map(([, payload]) => payload)\n\n const notfound = hashes.filter((hash) => !foundHashes.has(hash))\n return [foundPayloads, notfound]\n }\n\n protected async getFromParents(hashes: string[]): Promise<[Payload[], string[]]> {\n const parents = Object.values((await this.parents())?.read ?? {})\n let remainingHashes = [...hashes]\n let parentIndex = 0\n let result: Payload[] = []\n\n //intentionally doing this serially\n while (parentIndex < parents.length && remainingHashes.length > 0) {\n const [found, notfound] = await this.getFromParent(remainingHashes, parents[parentIndex])\n result = [...result, ...found]\n remainingHashes = notfound\n parentIndex++\n }\n return [result, remainingHashes]\n }\n\n protected getHandler(_hashes: string[]): Promisable<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async getWithConfig(hashes: string[], config?: InsertConfig): Promise<Payload[]> {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const emitEvents = config?.emitEvents ?? true\n const map = await PayloadWrapper.toMap(await this.getHandler(hashes))\n\n // eslint-disable-next-line unicorn/no-array-reduce\n const { foundPayloads, notfoundHashes } = hashes.reduce<{ foundPayloads: Payload[]; notfoundHashes: string[] }>(\n (prev, hash) => {\n const found = map[hash]\n if (found) {\n //TODO: Find a better way to scrub meta data without scrubbing _signatures\n if (found.schema === BoundWitnessSchema) {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found), _signatures: (found as BoundWitness)._signatures } as BoundWitness)\n } else {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found) } as Payload)\n }\n } else {\n prev.notfoundHashes.push(hash)\n }\n return prev\n },\n { foundPayloads: [], notfoundHashes: [] },\n )\n\n const [parentFoundPayloads] = await this.getFromParents(notfoundHashes)\n\n if (this.storeParentReads) {\n await this.insertWithConfig(parentFoundPayloads)\n }\n return [...foundPayloads, ...parentFoundPayloads]\n }\n\n protected head(): Promisable<Payload | undefined> {\n return this._lastInsertedPayload\n }\n\n protected insertHandler(_payloads: Payload[]): Promise<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async insertWithConfig(payloads: Payload[], config?: InsertConfig): Promise<Payload[]> {\n const emitEvents = config?.emitEvents ?? true\n const writeToParents = config?.writeToParents ?? true\n\n const insertedPayloads = await this.insertHandler(payloads)\n\n if (writeToParents) {\n await this.writeToParents(insertedPayloads)\n }\n if (emitEvents) {\n await this.emit('inserted', { module: this, payloads: insertedPayloads })\n }\n\n return insertedPayloads\n }\n\n protected async parents() {\n this._parents = this._parents ?? {\n commit: await this.resolveArchivists(this.config?.parents?.commit),\n read: await this.resolveArchivists(this.config?.parents?.read),\n write: await this.resolveArchivists(this.config?.parents?.write),\n }\n return assertEx(this._parents)\n }\n\n protected override async queryHandler<T extends QueryBoundWitness = QueryBoundWitness, TConfig extends ModuleConfig = ModuleConfig>(\n query: T,\n payloads?: Payload[],\n queryConfig?: TConfig,\n ): Promise<ModuleQueryHandlerResult> {\n const wrappedQuery = QueryBoundWitnessWrapper.parseQuery<ArchivistQuery>(query, payloads)\n const queryPayload = await wrappedQuery.getQuery()\n assertEx(this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n if (this.config.storeQueries) {\n await this.insertHandler([query])\n }\n\n switch (queryPayload.schema) {\n case ArchivistAllQuerySchema: {\n resultPayloads.push(...(await this.allHandler()))\n break\n }\n case ArchivistClearQuerySchema: {\n await this.clearHandler()\n break\n }\n case ArchivistCommitQuerySchema: {\n resultPayloads.push(...(await this.commitHandler()))\n break\n }\n case ArchivistDeleteQuerySchema: {\n const resultPayload: ArchivistDeleteQuery = {\n hashes: [...(await this.deleteWithConfig(queryPayload.hashes))],\n schema: ArchivistDeleteQuerySchema,\n }\n resultPayloads.push(resultPayload)\n break\n }\n case ArchivistGetQuerySchema: {\n if (queryPayload.hashes?.length) {\n resultPayloads.push(...(await this.getWithConfig(queryPayload.hashes)))\n } else {\n const head = await this.head()\n if (head) resultPayloads.push(head)\n }\n break\n }\n case ArchivistInsertQuerySchema: {\n const payloads = await wrappedQuery.getPayloads()\n assertEx(await wrappedQuery.getPayloads(), `Missing payloads: ${JSON.stringify(wrappedQuery.payload(), null, 2)}`)\n const resolvedPayloads = await PayloadWrapper.filterExclude(payloads, await wrappedQuery.hashAsync())\n assertEx(resolvedPayloads.length === payloads.length, `Could not find some passed hashes [${resolvedPayloads.length} != ${payloads.length}]`)\n resultPayloads.push(...(await this.insertWithConfig(payloads)))\n // NOTE: There isn't an exact equivalence between what we get and what we store. Once\n // we move to returning only inserted Payloads(/hash) instead of a BoundWitness, we\n // can grab the actual last one\n this._lastInsertedPayload = resolvedPayloads.at(-1)\n break\n }\n default: {\n return await super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n protected async writeToParent(parent: ArchivistInstance, payloads: Payload[]) {\n return await parent.insert(payloads)\n }\n\n protected async writeToParents(payloads: Payload[]): Promise<Payload[]> {\n const parents = await this.parents()\n return compact(\n await Promise.all(\n Object.values(parents.write ?? {}).map(async (parent) => {\n return parent ? await this.writeToParent(parent, payloads) : undefined\n }),\n ),\n ).flat()\n }\n\n private async resolveArchivists(archivists: string[] = []) {\n const archivistModules = [...(await this.resolve({ address: archivists })), ...(await this.resolve({ name: archivists }))].filter(\n duplicateModules,\n )\n\n assertEx(\n !this.requireAllParents || archivistModules.length === archivists.length,\n `Failed to find some archivists (set allRequired to false if ok): [${archivists.filter((archivist) =>\n archivistModules.map((module) => !(module.address === archivist || module.config.name === archivist)),\n )}]`,\n )\n\n // eslint-disable-next-line unicorn/no-array-reduce\n return archivistModules.reduce<Record<string, ArchivistInstance>>((prev, module) => {\n prev[module.address] = asArchivistInstance(module, () => {\n isArchivistInstance(module, { log: console })\n return `Unable to cast resolved module to an archivist: [${module.address}, ${module.config.name}, ${module.config.schema})}]`\n })\n\n return prev\n }, {})\n }\n}\n"],"mappings":"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","names":["payloads","module"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/AbstractArchivist.ts"],"sourcesContent":["export * from './AbstractArchivist'\n","import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable, PromisableArray } from '@xylabs/promise'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistDeleteQuery,\n ArchivistDeleteQuerySchema,\n ArchivistGetQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n ArchivistParams,\n ArchivistQuery,\n ArchivistQueryBase,\n asArchivistInstance,\n isArchivistInstance,\n} from '@xyo-network/archivist-model'\nimport { QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, BoundWitnessSchema, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { duplicateModules, ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport interface ActionConfig {\n emitEvents?: boolean\n}\n\nexport interface InsertConfig extends ActionConfig {\n writeToParents?: boolean\n}\n\nexport interface ArchivistParentInstances {\n commit?: Record<string, ArchivistInstance>\n read?: Record<string, ArchivistInstance>\n write?: Record<string, ArchivistInstance>\n}\n\nexport abstract class AbstractArchivist<\n TParams extends ArchivistParams = ArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements ArchivistInstance<TParams>\n{\n private _lastInsertedPayload: Payload | undefined\n private _parents?: ArchivistParentInstances\n\n override get queries(): string[] {\n return [ArchivistGetQuerySchema, ...super.queries]\n }\n\n get requireAllParents() {\n return this.config.requireAllParents ?? false\n }\n\n protected override get _queryAccountPaths(): Record<ArchivistQueryBase['schema'], string> {\n return {\n 'network.xyo.query.archivist.all': '1/1',\n 'network.xyo.query.archivist.clear': '1/2',\n 'network.xyo.query.archivist.commit': '1/3',\n 'network.xyo.query.archivist.delete': '1/4',\n 'network.xyo.query.archivist.get': '1/5',\n 'network.xyo.query.archivist.insert': '1/6',\n }\n }\n\n protected get storeParentReads() {\n return !!this.config?.storeParentReads\n }\n\n all(): PromisableArray<Payload> {\n this._noOverride('all')\n return this.busy(async () => {\n await this.started('throw')\n return await this.allHandler()\n })\n }\n\n clear(): Promisable<void> {\n this._noOverride('clear')\n return this.busy(async () => {\n await this.started('throw')\n return await this.clearHandler()\n })\n }\n\n commit(): Promisable<BoundWitness[]> {\n this._noOverride('commit')\n return this.busy(async () => {\n await this.started('throw')\n return await this.commitHandler()\n })\n }\n\n async delete(hashes: string[]): Promise<string[]> {\n this._noOverride('delete')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.deleteWithConfig(hashes)\n })\n }\n\n async get(hashes: string[]): Promise<Payload[]> {\n this._noOverride('get')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.getWithConfig(hashes)\n })\n }\n\n async insert(payloads: Payload[]): Promise<Payload[]> {\n this._noOverride('insert')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.insertWithConfig(payloads)\n })\n }\n\n protected allHandler(): PromisableArray<Payload> {\n throw new Error('Not implemented')\n }\n\n protected clearHandler(): Promisable<void> {\n throw new Error('Not implemented')\n }\n\n protected commitHandler(): Promisable<BoundWitness[]> {\n throw new Error('Not implemented')\n }\n\n protected deleteHandler(_hashes: string[]): PromisableArray<string> {\n throw new Error('Not implemented')\n }\n\n protected async deleteWithConfig(hashes: string[], config?: ActionConfig): Promise<string[]> {\n const emitEvents = config?.emitEvents ?? true\n\n const deletedHashes = await this.deleteHandler(hashes)\n\n if (emitEvents) {\n await this.emit('deleted', { hashes: deletedHashes, module: this })\n }\n\n return deletedHashes\n }\n\n protected async getFromParent(hashes: string[], archivist: ArchivistInstance): Promise<[Payload[], string[]]> {\n const foundPairs = (\n await Promise.all(\n (await archivist.get(hashes)).map<Promise<[string, Payload]>>(async (payload) => [await PayloadHasher.hashAsync(payload), payload]),\n )\n ).filter(([hash]) => {\n const askedFor = hashes.includes(hash)\n if (!askedFor) {\n console.warn(`Parent returned payload with hash not asked for: ${hash}`)\n //throw Error(`Parent returned payload with hash not asked for: ${hash}`)\n }\n return askedFor\n })\n\n const foundHashes = new Set(foundPairs.map(([hash]) => hash))\n const foundPayloads = foundPairs.map(([, payload]) => payload)\n\n const notfound = hashes.filter((hash) => !foundHashes.has(hash))\n return [foundPayloads, notfound]\n }\n\n protected async getFromParents(hashes: string[]): Promise<[Payload[], string[]]> {\n const parents = Object.values((await this.parents())?.read ?? {})\n let remainingHashes = [...hashes]\n let parentIndex = 0\n let result: Payload[] = []\n\n //intentionally doing this serially\n while (parentIndex < parents.length && remainingHashes.length > 0) {\n const [found, notfound] = await this.getFromParent(remainingHashes, parents[parentIndex])\n result = [...result, ...found]\n remainingHashes = notfound\n parentIndex++\n }\n return [result, remainingHashes]\n }\n\n protected getHandler(_hashes: string[]): Promisable<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async getWithConfig(hashes: string[], config?: InsertConfig): Promise<Payload[]> {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const emitEvents = config?.emitEvents ?? true\n const map = await PayloadWrapper.toMap(await this.getHandler(hashes))\n\n // eslint-disable-next-line unicorn/no-array-reduce\n const { foundPayloads, notfoundHashes } = hashes.reduce<{ foundPayloads: Payload[]; notfoundHashes: string[] }>(\n (prev, hash) => {\n const found = map[hash]\n if (found) {\n //TODO: Find a better way to scrub meta data without scrubbing _signatures\n if (found.schema === BoundWitnessSchema) {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found), _signatures: (found as BoundWitness)._signatures } as BoundWitness)\n } else {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found) } as Payload)\n }\n } else {\n prev.notfoundHashes.push(hash)\n }\n return prev\n },\n { foundPayloads: [], notfoundHashes: [] },\n )\n\n const [parentFoundPayloads] = await this.getFromParents(notfoundHashes)\n\n if (this.storeParentReads) {\n await this.insertWithConfig(parentFoundPayloads)\n }\n return [...foundPayloads, ...parentFoundPayloads]\n }\n\n protected head(): Promisable<Payload | undefined> {\n return this._lastInsertedPayload\n }\n\n protected insertHandler(_payloads: Payload[]): Promise<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async insertWithConfig(payloads: Payload[], config?: InsertConfig): Promise<Payload[]> {\n const emitEvents = config?.emitEvents ?? true\n const writeToParents = config?.writeToParents ?? true\n\n const insertedPayloads = await this.insertHandler(payloads)\n\n if (writeToParents) {\n await this.writeToParents(insertedPayloads)\n }\n if (emitEvents) {\n await this.emit('inserted', { module: this, payloads: insertedPayloads })\n }\n\n return insertedPayloads\n }\n\n protected async parents() {\n this._parents = this._parents ?? {\n commit: await this.resolveArchivists(this.config?.parents?.commit),\n read: await this.resolveArchivists(this.config?.parents?.read),\n write: await this.resolveArchivists(this.config?.parents?.write),\n }\n return assertEx(this._parents)\n }\n\n protected override async queryHandler<T extends QueryBoundWitness = QueryBoundWitness, TConfig extends ModuleConfig = ModuleConfig>(\n query: T,\n payloads?: Payload[],\n queryConfig?: TConfig,\n ): Promise<ModuleQueryHandlerResult> {\n const wrappedQuery = QueryBoundWitnessWrapper.parseQuery<ArchivistQuery>(query, payloads)\n const queryPayload = await wrappedQuery.getQuery()\n assertEx(this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n if (this.config.storeQueries) {\n await this.insertHandler([query])\n }\n\n switch (queryPayload.schema) {\n case ArchivistAllQuerySchema: {\n resultPayloads.push(...(await this.allHandler()))\n break\n }\n case ArchivistClearQuerySchema: {\n await this.clearHandler()\n break\n }\n case ArchivistCommitQuerySchema: {\n resultPayloads.push(...(await this.commitHandler()))\n break\n }\n case ArchivistDeleteQuerySchema: {\n const resultPayload: ArchivistDeleteQuery = {\n hashes: [...(await this.deleteWithConfig(queryPayload.hashes))],\n schema: ArchivistDeleteQuerySchema,\n }\n resultPayloads.push(resultPayload)\n break\n }\n case ArchivistGetQuerySchema: {\n if (queryPayload.hashes?.length) {\n resultPayloads.push(...(await this.getWithConfig(queryPayload.hashes)))\n } else {\n const head = await this.head()\n if (head) resultPayloads.push(head)\n }\n break\n }\n case ArchivistInsertQuerySchema: {\n const payloads = await wrappedQuery.getPayloads()\n assertEx(await wrappedQuery.getPayloads(), `Missing payloads: ${JSON.stringify(wrappedQuery.payload(), null, 2)}`)\n const resolvedPayloads = await PayloadWrapper.filterExclude(payloads, await wrappedQuery.hashAsync())\n assertEx(resolvedPayloads.length === payloads.length, `Could not find some passed hashes [${resolvedPayloads.length} != ${payloads.length}]`)\n resultPayloads.push(...(await this.insertWithConfig(payloads)))\n // NOTE: There isn't an exact equivalence between what we get and what we store. Once\n // we move to returning only inserted Payloads(/hash) instead of a BoundWitness, we\n // can grab the actual last one\n this._lastInsertedPayload = resolvedPayloads.at(-1)\n break\n }\n default: {\n return await super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n protected async writeToParent(parent: ArchivistInstance, payloads: Payload[]) {\n return await parent.insert(payloads)\n }\n\n protected async writeToParents(payloads: Payload[]): Promise<Payload[]> {\n const parents = await this.parents()\n return compact(\n await Promise.all(\n Object.values(parents.write ?? {}).map(async (parent) => {\n return parent ? await this.writeToParent(parent, payloads) : undefined\n }),\n ),\n ).flat()\n }\n\n private async resolveArchivists(archivists: string[] = []) {\n const archivistModules = [...(await this.resolve({ address: archivists })), ...(await this.resolve({ name: archivists }))].filter(\n duplicateModules,\n )\n\n assertEx(\n !this.requireAllParents || archivistModules.length === archivists.length,\n `Failed to find some archivists (set allRequired to false if ok): [${archivists.filter((archivist) =>\n archivistModules.map((module) => !(module.address === archivist || module.config.name === archivist)),\n )}]`,\n )\n\n // eslint-disable-next-line unicorn/no-array-reduce\n return archivistModules.reduce<Record<string, ArchivistInstance>>((prev, module) => {\n prev[module.address] = asArchivistInstance(module, () => {\n isArchivistInstance(module, { log: console })\n return `Unable to cast resolved module to an archivist: [${module.address}, ${module.config.name}, ${module.config.schema})}]`\n })\n\n return prev\n }, {})\n }\n}\n"],"mappings":"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","names":["AbstractArchivist","AbstractModuleInstance","_lastInsertedPayload","_parents","queries","ArchivistGetQuerySchema","requireAllParents","config","_queryAccountPaths","storeParentReads","all","_noOverride","busy","started","allHandler","clear","clearHandler","commit","commitHandler","delete","hashes","deleteWithConfig","get","getWithConfig","insert","payloads","insertWithConfig","Error","deleteHandler","_hashes","emitEvents","deletedHashes","emit","module","getFromParent","archivist","foundPairs","Promise","map","payload","PayloadHasher","hashAsync","filter","hash","askedFor","includes","console","warn","foundHashes","Set","foundPayloads","notfound","has","getFromParents","parents","Object","values","read","remainingHashes","parentIndex","result","length","found","getHandler","PayloadWrapper","toMap","notfoundHashes","reduce","prev","schema","BoundWitnessSchema","push","hashFields","_signatures","parentFoundPayloads","head","insertHandler","_payloads","writeToParents","insertedPayloads","resolveArchivists","write","assertEx","queryHandler","query","queryConfig","wrappedQuery","QueryBoundWitnessWrapper","parseQuery","queryPayload","getQuery","queryable","resultPayloads","storeQueries","ArchivistAllQuerySchema","ArchivistClearQuerySchema","ArchivistCommitQuerySchema","ArchivistDeleteQuerySchema","resultPayload","ArchivistInsertQuerySchema","getPayloads","JSON","stringify","resolvedPayloads","filterExclude","at","writeToParent","parent","compact","undefined","flat","archivists","archivistModules","resolve","address","name","duplicateModules","asArchivistInstance","isArchivistInstance","log"]}
|
package/dist/browser/index.js
CHANGED
|
@@ -1,16 +1,10 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
|
|
1
4
|
// src/AbstractArchivist.ts
|
|
2
5
|
import { assertEx } from "@xylabs/assert";
|
|
3
6
|
import { compact } from "@xylabs/lodash";
|
|
4
|
-
import {
|
|
5
|
-
ArchivistAllQuerySchema,
|
|
6
|
-
ArchivistClearQuerySchema,
|
|
7
|
-
ArchivistCommitQuerySchema,
|
|
8
|
-
ArchivistDeleteQuerySchema,
|
|
9
|
-
ArchivistGetQuerySchema,
|
|
10
|
-
ArchivistInsertQuerySchema,
|
|
11
|
-
asArchivistInstance,
|
|
12
|
-
isArchivistInstance
|
|
13
|
-
} from "@xyo-network/archivist-model";
|
|
7
|
+
import { ArchivistAllQuerySchema, ArchivistClearQuerySchema, ArchivistCommitQuerySchema, ArchivistDeleteQuerySchema, ArchivistGetQuerySchema, ArchivistInsertQuerySchema, asArchivistInstance, isArchivistInstance } from "@xyo-network/archivist-model";
|
|
14
8
|
import { QueryBoundWitnessWrapper } from "@xyo-network/boundwitness-builder";
|
|
15
9
|
import { BoundWitnessSchema } from "@xyo-network/boundwitness-model";
|
|
16
10
|
import { PayloadHasher } from "@xyo-network/hash";
|
|
@@ -18,10 +12,16 @@ import { AbstractModuleInstance } from "@xyo-network/module-abstract";
|
|
|
18
12
|
import { duplicateModules } from "@xyo-network/module-model";
|
|
19
13
|
import { PayloadWrapper } from "@xyo-network/payload-wrapper";
|
|
20
14
|
var AbstractArchivist = class extends AbstractModuleInstance {
|
|
15
|
+
static {
|
|
16
|
+
__name(this, "AbstractArchivist");
|
|
17
|
+
}
|
|
21
18
|
_lastInsertedPayload;
|
|
22
19
|
_parents;
|
|
23
20
|
get queries() {
|
|
24
|
-
return [
|
|
21
|
+
return [
|
|
22
|
+
ArchivistGetQuerySchema,
|
|
23
|
+
...super.queries
|
|
24
|
+
];
|
|
25
25
|
}
|
|
26
26
|
get requireAllParents() {
|
|
27
27
|
return this.config.requireAllParents ?? false;
|
|
@@ -97,14 +97,18 @@ var AbstractArchivist = class extends AbstractModuleInstance {
|
|
|
97
97
|
const emitEvents = config?.emitEvents ?? true;
|
|
98
98
|
const deletedHashes = await this.deleteHandler(hashes);
|
|
99
99
|
if (emitEvents) {
|
|
100
|
-
await this.emit("deleted", {
|
|
100
|
+
await this.emit("deleted", {
|
|
101
|
+
hashes: deletedHashes,
|
|
102
|
+
module: this
|
|
103
|
+
});
|
|
101
104
|
}
|
|
102
105
|
return deletedHashes;
|
|
103
106
|
}
|
|
104
107
|
async getFromParent(hashes, archivist) {
|
|
105
|
-
const foundPairs = (await Promise.all(
|
|
106
|
-
|
|
107
|
-
|
|
108
|
+
const foundPairs = (await Promise.all((await archivist.get(hashes)).map(async (payload) => [
|
|
109
|
+
await PayloadHasher.hashAsync(payload),
|
|
110
|
+
payload
|
|
111
|
+
]))).filter(([hash]) => {
|
|
108
112
|
const askedFor = hashes.includes(hash);
|
|
109
113
|
if (!askedFor) {
|
|
110
114
|
console.warn(`Parent returned payload with hash not asked for: ${hash}`);
|
|
@@ -114,20 +118,31 @@ var AbstractArchivist = class extends AbstractModuleInstance {
|
|
|
114
118
|
const foundHashes = new Set(foundPairs.map(([hash]) => hash));
|
|
115
119
|
const foundPayloads = foundPairs.map(([, payload]) => payload);
|
|
116
120
|
const notfound = hashes.filter((hash) => !foundHashes.has(hash));
|
|
117
|
-
return [
|
|
121
|
+
return [
|
|
122
|
+
foundPayloads,
|
|
123
|
+
notfound
|
|
124
|
+
];
|
|
118
125
|
}
|
|
119
126
|
async getFromParents(hashes) {
|
|
120
127
|
const parents = Object.values((await this.parents())?.read ?? {});
|
|
121
|
-
let remainingHashes = [
|
|
128
|
+
let remainingHashes = [
|
|
129
|
+
...hashes
|
|
130
|
+
];
|
|
122
131
|
let parentIndex = 0;
|
|
123
132
|
let result = [];
|
|
124
133
|
while (parentIndex < parents.length && remainingHashes.length > 0) {
|
|
125
134
|
const [found, notfound] = await this.getFromParent(remainingHashes, parents[parentIndex]);
|
|
126
|
-
result = [
|
|
135
|
+
result = [
|
|
136
|
+
...result,
|
|
137
|
+
...found
|
|
138
|
+
];
|
|
127
139
|
remainingHashes = notfound;
|
|
128
140
|
parentIndex++;
|
|
129
141
|
}
|
|
130
|
-
return [
|
|
142
|
+
return [
|
|
143
|
+
result,
|
|
144
|
+
remainingHashes
|
|
145
|
+
];
|
|
131
146
|
}
|
|
132
147
|
getHandler(_hashes) {
|
|
133
148
|
throw new Error("Not implemented");
|
|
@@ -135,27 +150,35 @@ var AbstractArchivist = class extends AbstractModuleInstance {
|
|
|
135
150
|
async getWithConfig(hashes, config) {
|
|
136
151
|
const emitEvents = config?.emitEvents ?? true;
|
|
137
152
|
const map = await PayloadWrapper.toMap(await this.getHandler(hashes));
|
|
138
|
-
const { foundPayloads, notfoundHashes } = hashes.reduce(
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
if (found) {
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
}
|
|
153
|
+
const { foundPayloads, notfoundHashes } = hashes.reduce((prev, hash) => {
|
|
154
|
+
const found = map[hash];
|
|
155
|
+
if (found) {
|
|
156
|
+
if (found.schema === BoundWitnessSchema) {
|
|
157
|
+
prev.foundPayloads.push({
|
|
158
|
+
...PayloadHasher.hashFields(found),
|
|
159
|
+
_signatures: found._signatures
|
|
160
|
+
});
|
|
147
161
|
} else {
|
|
148
|
-
prev.
|
|
162
|
+
prev.foundPayloads.push({
|
|
163
|
+
...PayloadHasher.hashFields(found)
|
|
164
|
+
});
|
|
149
165
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
166
|
+
} else {
|
|
167
|
+
prev.notfoundHashes.push(hash);
|
|
168
|
+
}
|
|
169
|
+
return prev;
|
|
170
|
+
}, {
|
|
171
|
+
foundPayloads: [],
|
|
172
|
+
notfoundHashes: []
|
|
173
|
+
});
|
|
154
174
|
const [parentFoundPayloads] = await this.getFromParents(notfoundHashes);
|
|
155
175
|
if (this.storeParentReads) {
|
|
156
176
|
await this.insertWithConfig(parentFoundPayloads);
|
|
157
177
|
}
|
|
158
|
-
return [
|
|
178
|
+
return [
|
|
179
|
+
...foundPayloads,
|
|
180
|
+
...parentFoundPayloads
|
|
181
|
+
];
|
|
159
182
|
}
|
|
160
183
|
head() {
|
|
161
184
|
return this._lastInsertedPayload;
|
|
@@ -171,7 +194,10 @@ var AbstractArchivist = class extends AbstractModuleInstance {
|
|
|
171
194
|
await this.writeToParents(insertedPayloads);
|
|
172
195
|
}
|
|
173
196
|
if (emitEvents) {
|
|
174
|
-
await this.emit("inserted", {
|
|
197
|
+
await this.emit("inserted", {
|
|
198
|
+
module: this,
|
|
199
|
+
payloads: insertedPayloads
|
|
200
|
+
});
|
|
175
201
|
}
|
|
176
202
|
return insertedPayloads;
|
|
177
203
|
}
|
|
@@ -189,7 +215,9 @@ var AbstractArchivist = class extends AbstractModuleInstance {
|
|
|
189
215
|
assertEx(this.queryable(query, payloads, queryConfig));
|
|
190
216
|
const resultPayloads = [];
|
|
191
217
|
if (this.config.storeQueries) {
|
|
192
|
-
await this.insertHandler([
|
|
218
|
+
await this.insertHandler([
|
|
219
|
+
query
|
|
220
|
+
]);
|
|
193
221
|
}
|
|
194
222
|
switch (queryPayload.schema) {
|
|
195
223
|
case ArchivistAllQuerySchema: {
|
|
@@ -206,7 +234,9 @@ var AbstractArchivist = class extends AbstractModuleInstance {
|
|
|
206
234
|
}
|
|
207
235
|
case ArchivistDeleteQuerySchema: {
|
|
208
236
|
const resultPayload = {
|
|
209
|
-
hashes: [
|
|
237
|
+
hashes: [
|
|
238
|
+
...await this.deleteWithConfig(queryPayload.hashes)
|
|
239
|
+
],
|
|
210
240
|
schema: ArchivistDeleteQuerySchema
|
|
211
241
|
};
|
|
212
242
|
resultPayloads.push(resultPayload);
|
|
@@ -242,27 +272,25 @@ var AbstractArchivist = class extends AbstractModuleInstance {
|
|
|
242
272
|
}
|
|
243
273
|
async writeToParents(payloads) {
|
|
244
274
|
const parents = await this.parents();
|
|
245
|
-
return compact(
|
|
246
|
-
await
|
|
247
|
-
|
|
248
|
-
return parent ? await this.writeToParent(parent, payloads) : void 0;
|
|
249
|
-
})
|
|
250
|
-
)
|
|
251
|
-
).flat();
|
|
275
|
+
return compact(await Promise.all(Object.values(parents.write ?? {}).map(async (parent) => {
|
|
276
|
+
return parent ? await this.writeToParent(parent, payloads) : void 0;
|
|
277
|
+
}))).flat();
|
|
252
278
|
}
|
|
253
279
|
async resolveArchivists(archivists = []) {
|
|
254
|
-
const archivistModules = [
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
);
|
|
280
|
+
const archivistModules = [
|
|
281
|
+
...await this.resolve({
|
|
282
|
+
address: archivists
|
|
283
|
+
}),
|
|
284
|
+
...await this.resolve({
|
|
285
|
+
name: archivists
|
|
286
|
+
})
|
|
287
|
+
].filter(duplicateModules);
|
|
288
|
+
assertEx(!this.requireAllParents || archivistModules.length === archivists.length, `Failed to find some archivists (set allRequired to false if ok): [${archivists.filter((archivist) => archivistModules.map((module) => !(module.address === archivist || module.config.name === archivist)))}]`);
|
|
263
289
|
return archivistModules.reduce((prev, module) => {
|
|
264
290
|
prev[module.address] = asArchivistInstance(module, () => {
|
|
265
|
-
isArchivistInstance(module, {
|
|
291
|
+
isArchivistInstance(module, {
|
|
292
|
+
log: console
|
|
293
|
+
});
|
|
266
294
|
return `Unable to cast resolved module to an archivist: [${module.address}, ${module.config.name}, ${module.config.schema})}]`;
|
|
267
295
|
});
|
|
268
296
|
return prev;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/AbstractArchivist.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable, PromisableArray } from '@xylabs/promise'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistDeleteQuery,\n ArchivistDeleteQuerySchema,\n ArchivistGetQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n ArchivistParams,\n ArchivistQuery,\n ArchivistQueryBase,\n asArchivistInstance,\n isArchivistInstance,\n} from '@xyo-network/archivist-model'\nimport { QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, BoundWitnessSchema, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { duplicateModules, ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport interface ActionConfig {\n emitEvents?: boolean\n}\n\nexport interface InsertConfig extends ActionConfig {\n writeToParents?: boolean\n}\n\nexport interface ArchivistParentInstances {\n commit?: Record<string, ArchivistInstance>\n read?: Record<string, ArchivistInstance>\n write?: Record<string, ArchivistInstance>\n}\n\nexport abstract class AbstractArchivist<\n TParams extends ArchivistParams = ArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements ArchivistInstance<TParams>\n{\n private _lastInsertedPayload: Payload | undefined\n private _parents?: ArchivistParentInstances\n\n override get queries(): string[] {\n return [ArchivistGetQuerySchema, ...super.queries]\n }\n\n get requireAllParents() {\n return this.config.requireAllParents ?? false\n }\n\n protected override get _queryAccountPaths(): Record<ArchivistQueryBase['schema'], string> {\n return {\n 'network.xyo.query.archivist.all': '1/1',\n 'network.xyo.query.archivist.clear': '1/2',\n 'network.xyo.query.archivist.commit': '1/3',\n 'network.xyo.query.archivist.delete': '1/4',\n 'network.xyo.query.archivist.get': '1/5',\n 'network.xyo.query.archivist.insert': '1/6',\n }\n }\n\n protected get storeParentReads() {\n return !!this.config?.storeParentReads\n }\n\n all(): PromisableArray<Payload> {\n this._noOverride('all')\n return this.busy(async () => {\n await this.started('throw')\n return await this.allHandler()\n })\n }\n\n clear(): Promisable<void> {\n this._noOverride('clear')\n return this.busy(async () => {\n await this.started('throw')\n return await this.clearHandler()\n })\n }\n\n commit(): Promisable<BoundWitness[]> {\n this._noOverride('commit')\n return this.busy(async () => {\n await this.started('throw')\n return await this.commitHandler()\n })\n }\n\n async delete(hashes: string[]): Promise<string[]> {\n this._noOverride('delete')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.deleteWithConfig(hashes)\n })\n }\n\n async get(hashes: string[]): Promise<Payload[]> {\n this._noOverride('get')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.getWithConfig(hashes)\n })\n }\n\n async insert(payloads: Payload[]): Promise<Payload[]> {\n this._noOverride('insert')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.insertWithConfig(payloads)\n })\n }\n\n protected allHandler(): PromisableArray<Payload> {\n throw new Error('Not implemented')\n }\n\n protected clearHandler(): Promisable<void> {\n throw new Error('Not implemented')\n }\n\n protected commitHandler(): Promisable<BoundWitness[]> {\n throw new Error('Not implemented')\n }\n\n protected deleteHandler(_hashes: string[]): PromisableArray<string> {\n throw new Error('Not implemented')\n }\n\n protected async deleteWithConfig(hashes: string[], config?: ActionConfig): Promise<string[]> {\n const emitEvents = config?.emitEvents ?? true\n\n const deletedHashes = await this.deleteHandler(hashes)\n\n if (emitEvents) {\n await this.emit('deleted', { hashes: deletedHashes, module: this })\n }\n\n return deletedHashes\n }\n\n protected async getFromParent(hashes: string[], archivist: ArchivistInstance): Promise<[Payload[], string[]]> {\n const foundPairs = (\n await Promise.all(\n (await archivist.get(hashes)).map<Promise<[string, Payload]>>(async (payload) => [await PayloadHasher.hashAsync(payload), payload]),\n )\n ).filter(([hash]) => {\n const askedFor = hashes.includes(hash)\n if (!askedFor) {\n console.warn(`Parent returned payload with hash not asked for: ${hash}`)\n //throw Error(`Parent returned payload with hash not asked for: ${hash}`)\n }\n return askedFor\n })\n\n const foundHashes = new Set(foundPairs.map(([hash]) => hash))\n const foundPayloads = foundPairs.map(([, payload]) => payload)\n\n const notfound = hashes.filter((hash) => !foundHashes.has(hash))\n return [foundPayloads, notfound]\n }\n\n protected async getFromParents(hashes: string[]): Promise<[Payload[], string[]]> {\n const parents = Object.values((await this.parents())?.read ?? {})\n let remainingHashes = [...hashes]\n let parentIndex = 0\n let result: Payload[] = []\n\n //intentionally doing this serially\n while (parentIndex < parents.length && remainingHashes.length > 0) {\n const [found, notfound] = await this.getFromParent(remainingHashes, parents[parentIndex])\n result = [...result, ...found]\n remainingHashes = notfound\n parentIndex++\n }\n return [result, remainingHashes]\n }\n\n protected getHandler(_hashes: string[]): Promisable<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async getWithConfig(hashes: string[], config?: InsertConfig): Promise<Payload[]> {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const emitEvents = config?.emitEvents ?? true\n const map = await PayloadWrapper.toMap(await this.getHandler(hashes))\n\n // eslint-disable-next-line unicorn/no-array-reduce\n const { foundPayloads, notfoundHashes } = hashes.reduce<{ foundPayloads: Payload[]; notfoundHashes: string[] }>(\n (prev, hash) => {\n const found = map[hash]\n if (found) {\n //TODO: Find a better way to scrub meta data without scrubbing _signatures\n if (found.schema === BoundWitnessSchema) {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found), _signatures: (found as BoundWitness)._signatures } as BoundWitness)\n } else {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found) } as Payload)\n }\n } else {\n prev.notfoundHashes.push(hash)\n }\n return prev\n },\n { foundPayloads: [], notfoundHashes: [] },\n )\n\n const [parentFoundPayloads] = await this.getFromParents(notfoundHashes)\n\n if (this.storeParentReads) {\n await this.insertWithConfig(parentFoundPayloads)\n }\n return [...foundPayloads, ...parentFoundPayloads]\n }\n\n protected head(): Promisable<Payload | undefined> {\n return this._lastInsertedPayload\n }\n\n protected insertHandler(_payloads: Payload[]): Promise<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async insertWithConfig(payloads: Payload[], config?: InsertConfig): Promise<Payload[]> {\n const emitEvents = config?.emitEvents ?? true\n const writeToParents = config?.writeToParents ?? true\n\n const insertedPayloads = await this.insertHandler(payloads)\n\n if (writeToParents) {\n await this.writeToParents(insertedPayloads)\n }\n if (emitEvents) {\n await this.emit('inserted', { module: this, payloads: insertedPayloads })\n }\n\n return insertedPayloads\n }\n\n protected async parents() {\n this._parents = this._parents ?? {\n commit: await this.resolveArchivists(this.config?.parents?.commit),\n read: await this.resolveArchivists(this.config?.parents?.read),\n write: await this.resolveArchivists(this.config?.parents?.write),\n }\n return assertEx(this._parents)\n }\n\n protected override async queryHandler<T extends QueryBoundWitness = QueryBoundWitness, TConfig extends ModuleConfig = ModuleConfig>(\n query: T,\n payloads?: Payload[],\n queryConfig?: TConfig,\n ): Promise<ModuleQueryHandlerResult> {\n const wrappedQuery = QueryBoundWitnessWrapper.parseQuery<ArchivistQuery>(query, payloads)\n const queryPayload = await wrappedQuery.getQuery()\n assertEx(this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n if (this.config.storeQueries) {\n await this.insertHandler([query])\n }\n\n switch (queryPayload.schema) {\n case ArchivistAllQuerySchema: {\n resultPayloads.push(...(await this.allHandler()))\n break\n }\n case ArchivistClearQuerySchema: {\n await this.clearHandler()\n break\n }\n case ArchivistCommitQuerySchema: {\n resultPayloads.push(...(await this.commitHandler()))\n break\n }\n case ArchivistDeleteQuerySchema: {\n const resultPayload: ArchivistDeleteQuery = {\n hashes: [...(await this.deleteWithConfig(queryPayload.hashes))],\n schema: ArchivistDeleteQuerySchema,\n }\n resultPayloads.push(resultPayload)\n break\n }\n case ArchivistGetQuerySchema: {\n if (queryPayload.hashes?.length) {\n resultPayloads.push(...(await this.getWithConfig(queryPayload.hashes)))\n } else {\n const head = await this.head()\n if (head) resultPayloads.push(head)\n }\n break\n }\n case ArchivistInsertQuerySchema: {\n const payloads = await wrappedQuery.getPayloads()\n assertEx(await wrappedQuery.getPayloads(), `Missing payloads: ${JSON.stringify(wrappedQuery.payload(), null, 2)}`)\n const resolvedPayloads = await PayloadWrapper.filterExclude(payloads, await wrappedQuery.hashAsync())\n assertEx(resolvedPayloads.length === payloads.length, `Could not find some passed hashes [${resolvedPayloads.length} != ${payloads.length}]`)\n resultPayloads.push(...(await this.insertWithConfig(payloads)))\n // NOTE: There isn't an exact equivalence between what we get and what we store. Once\n // we move to returning only inserted Payloads(/hash) instead of a BoundWitness, we\n // can grab the actual last one\n this._lastInsertedPayload = resolvedPayloads.at(-1)\n break\n }\n default: {\n return await super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n protected async writeToParent(parent: ArchivistInstance, payloads: Payload[]) {\n return await parent.insert(payloads)\n }\n\n protected async writeToParents(payloads: Payload[]): Promise<Payload[]> {\n const parents = await this.parents()\n return compact(\n await Promise.all(\n Object.values(parents.write ?? {}).map(async (parent) => {\n return parent ? await this.writeToParent(parent, payloads) : undefined\n }),\n ),\n ).flat()\n }\n\n private async resolveArchivists(archivists: string[] = []) {\n const archivistModules = [...(await this.resolve({ address: archivists })), ...(await this.resolve({ name: archivists }))].filter(\n duplicateModules,\n )\n\n assertEx(\n !this.requireAllParents || archivistModules.length === archivists.length,\n `Failed to find some archivists (set allRequired to false if ok): [${archivists.filter((archivist) =>\n archivistModules.map((module) => !(module.address === archivist || module.config.name === archivist)),\n )}]`,\n )\n\n // eslint-disable-next-line unicorn/no-array-reduce\n return archivistModules.reduce<Record<string, ArchivistInstance>>((prev, module) => {\n prev[module.address] = asArchivistInstance(module, () => {\n isArchivistInstance(module, { log: console })\n return `Unable to cast resolved module to an archivist: [${module.address}, ${module.config.name}, ${module.config.schema})}]`\n })\n\n return prev\n }, {})\n }\n}\n"],"mappings":"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","names":["payloads"]}
|
|
1
|
+
{"version":3,"sources":["../../src/AbstractArchivist.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { Promisable, PromisableArray } from '@xylabs/promise'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistDeleteQuery,\n ArchivistDeleteQuerySchema,\n ArchivistGetQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n ArchivistParams,\n ArchivistQuery,\n ArchivistQueryBase,\n asArchivistInstance,\n isArchivistInstance,\n} from '@xyo-network/archivist-model'\nimport { QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, BoundWitnessSchema, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { duplicateModules, ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport interface ActionConfig {\n emitEvents?: boolean\n}\n\nexport interface InsertConfig extends ActionConfig {\n writeToParents?: boolean\n}\n\nexport interface ArchivistParentInstances {\n commit?: Record<string, ArchivistInstance>\n read?: Record<string, ArchivistInstance>\n write?: Record<string, ArchivistInstance>\n}\n\nexport abstract class AbstractArchivist<\n TParams extends ArchivistParams = ArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements ArchivistInstance<TParams>\n{\n private _lastInsertedPayload: Payload | undefined\n private _parents?: ArchivistParentInstances\n\n override get queries(): string[] {\n return [ArchivistGetQuerySchema, ...super.queries]\n }\n\n get requireAllParents() {\n return this.config.requireAllParents ?? false\n }\n\n protected override get _queryAccountPaths(): Record<ArchivistQueryBase['schema'], string> {\n return {\n 'network.xyo.query.archivist.all': '1/1',\n 'network.xyo.query.archivist.clear': '1/2',\n 'network.xyo.query.archivist.commit': '1/3',\n 'network.xyo.query.archivist.delete': '1/4',\n 'network.xyo.query.archivist.get': '1/5',\n 'network.xyo.query.archivist.insert': '1/6',\n }\n }\n\n protected get storeParentReads() {\n return !!this.config?.storeParentReads\n }\n\n all(): PromisableArray<Payload> {\n this._noOverride('all')\n return this.busy(async () => {\n await this.started('throw')\n return await this.allHandler()\n })\n }\n\n clear(): Promisable<void> {\n this._noOverride('clear')\n return this.busy(async () => {\n await this.started('throw')\n return await this.clearHandler()\n })\n }\n\n commit(): Promisable<BoundWitness[]> {\n this._noOverride('commit')\n return this.busy(async () => {\n await this.started('throw')\n return await this.commitHandler()\n })\n }\n\n async delete(hashes: string[]): Promise<string[]> {\n this._noOverride('delete')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.deleteWithConfig(hashes)\n })\n }\n\n async get(hashes: string[]): Promise<Payload[]> {\n this._noOverride('get')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.getWithConfig(hashes)\n })\n }\n\n async insert(payloads: Payload[]): Promise<Payload[]> {\n this._noOverride('insert')\n return await this.busy(async () => {\n await this.started('throw')\n return await this.insertWithConfig(payloads)\n })\n }\n\n protected allHandler(): PromisableArray<Payload> {\n throw new Error('Not implemented')\n }\n\n protected clearHandler(): Promisable<void> {\n throw new Error('Not implemented')\n }\n\n protected commitHandler(): Promisable<BoundWitness[]> {\n throw new Error('Not implemented')\n }\n\n protected deleteHandler(_hashes: string[]): PromisableArray<string> {\n throw new Error('Not implemented')\n }\n\n protected async deleteWithConfig(hashes: string[], config?: ActionConfig): Promise<string[]> {\n const emitEvents = config?.emitEvents ?? true\n\n const deletedHashes = await this.deleteHandler(hashes)\n\n if (emitEvents) {\n await this.emit('deleted', { hashes: deletedHashes, module: this })\n }\n\n return deletedHashes\n }\n\n protected async getFromParent(hashes: string[], archivist: ArchivistInstance): Promise<[Payload[], string[]]> {\n const foundPairs = (\n await Promise.all(\n (await archivist.get(hashes)).map<Promise<[string, Payload]>>(async (payload) => [await PayloadHasher.hashAsync(payload), payload]),\n )\n ).filter(([hash]) => {\n const askedFor = hashes.includes(hash)\n if (!askedFor) {\n console.warn(`Parent returned payload with hash not asked for: ${hash}`)\n //throw Error(`Parent returned payload with hash not asked for: ${hash}`)\n }\n return askedFor\n })\n\n const foundHashes = new Set(foundPairs.map(([hash]) => hash))\n const foundPayloads = foundPairs.map(([, payload]) => payload)\n\n const notfound = hashes.filter((hash) => !foundHashes.has(hash))\n return [foundPayloads, notfound]\n }\n\n protected async getFromParents(hashes: string[]): Promise<[Payload[], string[]]> {\n const parents = Object.values((await this.parents())?.read ?? {})\n let remainingHashes = [...hashes]\n let parentIndex = 0\n let result: Payload[] = []\n\n //intentionally doing this serially\n while (parentIndex < parents.length && remainingHashes.length > 0) {\n const [found, notfound] = await this.getFromParent(remainingHashes, parents[parentIndex])\n result = [...result, ...found]\n remainingHashes = notfound\n parentIndex++\n }\n return [result, remainingHashes]\n }\n\n protected getHandler(_hashes: string[]): Promisable<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async getWithConfig(hashes: string[], config?: InsertConfig): Promise<Payload[]> {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const emitEvents = config?.emitEvents ?? true\n const map = await PayloadWrapper.toMap(await this.getHandler(hashes))\n\n // eslint-disable-next-line unicorn/no-array-reduce\n const { foundPayloads, notfoundHashes } = hashes.reduce<{ foundPayloads: Payload[]; notfoundHashes: string[] }>(\n (prev, hash) => {\n const found = map[hash]\n if (found) {\n //TODO: Find a better way to scrub meta data without scrubbing _signatures\n if (found.schema === BoundWitnessSchema) {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found), _signatures: (found as BoundWitness)._signatures } as BoundWitness)\n } else {\n prev.foundPayloads.push({ ...PayloadHasher.hashFields(found) } as Payload)\n }\n } else {\n prev.notfoundHashes.push(hash)\n }\n return prev\n },\n { foundPayloads: [], notfoundHashes: [] },\n )\n\n const [parentFoundPayloads] = await this.getFromParents(notfoundHashes)\n\n if (this.storeParentReads) {\n await this.insertWithConfig(parentFoundPayloads)\n }\n return [...foundPayloads, ...parentFoundPayloads]\n }\n\n protected head(): Promisable<Payload | undefined> {\n return this._lastInsertedPayload\n }\n\n protected insertHandler(_payloads: Payload[]): Promise<Payload[]> {\n throw new Error('Not implemented')\n }\n\n protected async insertWithConfig(payloads: Payload[], config?: InsertConfig): Promise<Payload[]> {\n const emitEvents = config?.emitEvents ?? true\n const writeToParents = config?.writeToParents ?? true\n\n const insertedPayloads = await this.insertHandler(payloads)\n\n if (writeToParents) {\n await this.writeToParents(insertedPayloads)\n }\n if (emitEvents) {\n await this.emit('inserted', { module: this, payloads: insertedPayloads })\n }\n\n return insertedPayloads\n }\n\n protected async parents() {\n this._parents = this._parents ?? {\n commit: await this.resolveArchivists(this.config?.parents?.commit),\n read: await this.resolveArchivists(this.config?.parents?.read),\n write: await this.resolveArchivists(this.config?.parents?.write),\n }\n return assertEx(this._parents)\n }\n\n protected override async queryHandler<T extends QueryBoundWitness = QueryBoundWitness, TConfig extends ModuleConfig = ModuleConfig>(\n query: T,\n payloads?: Payload[],\n queryConfig?: TConfig,\n ): Promise<ModuleQueryHandlerResult> {\n const wrappedQuery = QueryBoundWitnessWrapper.parseQuery<ArchivistQuery>(query, payloads)\n const queryPayload = await wrappedQuery.getQuery()\n assertEx(this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n if (this.config.storeQueries) {\n await this.insertHandler([query])\n }\n\n switch (queryPayload.schema) {\n case ArchivistAllQuerySchema: {\n resultPayloads.push(...(await this.allHandler()))\n break\n }\n case ArchivistClearQuerySchema: {\n await this.clearHandler()\n break\n }\n case ArchivistCommitQuerySchema: {\n resultPayloads.push(...(await this.commitHandler()))\n break\n }\n case ArchivistDeleteQuerySchema: {\n const resultPayload: ArchivistDeleteQuery = {\n hashes: [...(await this.deleteWithConfig(queryPayload.hashes))],\n schema: ArchivistDeleteQuerySchema,\n }\n resultPayloads.push(resultPayload)\n break\n }\n case ArchivistGetQuerySchema: {\n if (queryPayload.hashes?.length) {\n resultPayloads.push(...(await this.getWithConfig(queryPayload.hashes)))\n } else {\n const head = await this.head()\n if (head) resultPayloads.push(head)\n }\n break\n }\n case ArchivistInsertQuerySchema: {\n const payloads = await wrappedQuery.getPayloads()\n assertEx(await wrappedQuery.getPayloads(), `Missing payloads: ${JSON.stringify(wrappedQuery.payload(), null, 2)}`)\n const resolvedPayloads = await PayloadWrapper.filterExclude(payloads, await wrappedQuery.hashAsync())\n assertEx(resolvedPayloads.length === payloads.length, `Could not find some passed hashes [${resolvedPayloads.length} != ${payloads.length}]`)\n resultPayloads.push(...(await this.insertWithConfig(payloads)))\n // NOTE: There isn't an exact equivalence between what we get and what we store. Once\n // we move to returning only inserted Payloads(/hash) instead of a BoundWitness, we\n // can grab the actual last one\n this._lastInsertedPayload = resolvedPayloads.at(-1)\n break\n }\n default: {\n return await super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n protected async writeToParent(parent: ArchivistInstance, payloads: Payload[]) {\n return await parent.insert(payloads)\n }\n\n protected async writeToParents(payloads: Payload[]): Promise<Payload[]> {\n const parents = await this.parents()\n return compact(\n await Promise.all(\n Object.values(parents.write ?? {}).map(async (parent) => {\n return parent ? await this.writeToParent(parent, payloads) : undefined\n }),\n ),\n ).flat()\n }\n\n private async resolveArchivists(archivists: string[] = []) {\n const archivistModules = [...(await this.resolve({ address: archivists })), ...(await this.resolve({ name: archivists }))].filter(\n duplicateModules,\n )\n\n assertEx(\n !this.requireAllParents || archivistModules.length === archivists.length,\n `Failed to find some archivists (set allRequired to false if ok): [${archivists.filter((archivist) =>\n archivistModules.map((module) => !(module.address === archivist || module.config.name === archivist)),\n )}]`,\n )\n\n // eslint-disable-next-line unicorn/no-array-reduce\n return archivistModules.reduce<Record<string, ArchivistInstance>>((prev, module) => {\n prev[module.address] = asArchivistInstance(module, () => {\n isArchivistInstance(module, { log: console })\n return `Unable to cast resolved module to an archivist: [${module.address}, ${module.config.name}, ${module.config.schema})}]`\n })\n\n return prev\n }, {})\n }\n}\n"],"mappings":"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","names":["assertEx","compact","ArchivistAllQuerySchema","ArchivistClearQuerySchema","ArchivistCommitQuerySchema","ArchivistDeleteQuerySchema","ArchivistGetQuerySchema","ArchivistInsertQuerySchema","asArchivistInstance","isArchivistInstance","QueryBoundWitnessWrapper","BoundWitnessSchema","PayloadHasher","AbstractModuleInstance","duplicateModules","PayloadWrapper","AbstractArchivist","AbstractModuleInstance","_lastInsertedPayload","_parents","queries","ArchivistGetQuerySchema","requireAllParents","config","_queryAccountPaths","storeParentReads","all","_noOverride","busy","started","allHandler","clear","clearHandler","commit","commitHandler","delete","hashes","deleteWithConfig","get","getWithConfig","insert","payloads","insertWithConfig","Error","deleteHandler","_hashes","emitEvents","deletedHashes","emit","module","getFromParent","archivist","foundPairs","Promise","map","payload","PayloadHasher","hashAsync","filter","hash","askedFor","includes","console","warn","foundHashes","Set","foundPayloads","notfound","has","getFromParents","parents","Object","values","read","remainingHashes","parentIndex","result","length","found","getHandler","PayloadWrapper","toMap","notfoundHashes","reduce","prev","schema","BoundWitnessSchema","push","hashFields","_signatures","parentFoundPayloads","head","insertHandler","_payloads","writeToParents","insertedPayloads","resolveArchivists","write","assertEx","queryHandler","query","queryConfig","wrappedQuery","QueryBoundWitnessWrapper","parseQuery","queryPayload","getQuery","queryable","resultPayloads","storeQueries","ArchivistAllQuerySchema","ArchivistClearQuerySchema","ArchivistCommitQuerySchema","ArchivistDeleteQuerySchema","resultPayload","ArchivistInsertQuerySchema","getPayloads","JSON","stringify","resolvedPayloads","filterExclude","at","writeToParent","parent","compact","undefined","flat","archivists","archivistModules","resolve","address","name","duplicateModules","asArchivistInstance","isArchivistInstance","log"]}
|