@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/node/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 });
|
|
@@ -34,11 +35,14 @@ var import_hash = require("@xyo-network/hash");
|
|
|
34
35
|
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
|
-
var
|
|
38
|
+
var _AbstractArchivist = class _AbstractArchivist extends import_module_abstract.AbstractModuleInstance {
|
|
38
39
|
_lastInsertedPayload;
|
|
39
40
|
_parents;
|
|
40
41
|
get queries() {
|
|
41
|
-
return [
|
|
42
|
+
return [
|
|
43
|
+
import_archivist_model.ArchivistGetQuerySchema,
|
|
44
|
+
...super.queries
|
|
45
|
+
];
|
|
42
46
|
}
|
|
43
47
|
get requireAllParents() {
|
|
44
48
|
return this.config.requireAllParents ?? false;
|
|
@@ -115,14 +119,18 @@ var AbstractArchivist = class extends import_module_abstract.AbstractModuleInsta
|
|
|
115
119
|
const emitEvents = (config == null ? void 0 : config.emitEvents) ?? true;
|
|
116
120
|
const deletedHashes = await this.deleteHandler(hashes);
|
|
117
121
|
if (emitEvents) {
|
|
118
|
-
await this.emit("deleted", {
|
|
122
|
+
await this.emit("deleted", {
|
|
123
|
+
hashes: deletedHashes,
|
|
124
|
+
module: this
|
|
125
|
+
});
|
|
119
126
|
}
|
|
120
127
|
return deletedHashes;
|
|
121
128
|
}
|
|
122
129
|
async getFromParent(hashes, archivist) {
|
|
123
|
-
const foundPairs = (await Promise.all(
|
|
124
|
-
|
|
125
|
-
|
|
130
|
+
const foundPairs = (await Promise.all((await archivist.get(hashes)).map(async (payload) => [
|
|
131
|
+
await import_hash.PayloadHasher.hashAsync(payload),
|
|
132
|
+
payload
|
|
133
|
+
]))).filter(([hash]) => {
|
|
126
134
|
const askedFor = hashes.includes(hash);
|
|
127
135
|
if (!askedFor) {
|
|
128
136
|
console.warn(`Parent returned payload with hash not asked for: ${hash}`);
|
|
@@ -132,21 +140,32 @@ var AbstractArchivist = class extends import_module_abstract.AbstractModuleInsta
|
|
|
132
140
|
const foundHashes = new Set(foundPairs.map(([hash]) => hash));
|
|
133
141
|
const foundPayloads = foundPairs.map(([, payload]) => payload);
|
|
134
142
|
const notfound = hashes.filter((hash) => !foundHashes.has(hash));
|
|
135
|
-
return [
|
|
143
|
+
return [
|
|
144
|
+
foundPayloads,
|
|
145
|
+
notfound
|
|
146
|
+
];
|
|
136
147
|
}
|
|
137
148
|
async getFromParents(hashes) {
|
|
138
149
|
var _a;
|
|
139
150
|
const parents = Object.values(((_a = await this.parents()) == null ? void 0 : _a.read) ?? {});
|
|
140
|
-
let remainingHashes = [
|
|
151
|
+
let remainingHashes = [
|
|
152
|
+
...hashes
|
|
153
|
+
];
|
|
141
154
|
let parentIndex = 0;
|
|
142
155
|
let result = [];
|
|
143
156
|
while (parentIndex < parents.length && remainingHashes.length > 0) {
|
|
144
157
|
const [found, notfound] = await this.getFromParent(remainingHashes, parents[parentIndex]);
|
|
145
|
-
result = [
|
|
158
|
+
result = [
|
|
159
|
+
...result,
|
|
160
|
+
...found
|
|
161
|
+
];
|
|
146
162
|
remainingHashes = notfound;
|
|
147
163
|
parentIndex++;
|
|
148
164
|
}
|
|
149
|
-
return [
|
|
165
|
+
return [
|
|
166
|
+
result,
|
|
167
|
+
remainingHashes
|
|
168
|
+
];
|
|
150
169
|
}
|
|
151
170
|
getHandler(_hashes) {
|
|
152
171
|
throw new Error("Not implemented");
|
|
@@ -154,27 +173,35 @@ var AbstractArchivist = class extends import_module_abstract.AbstractModuleInsta
|
|
|
154
173
|
async getWithConfig(hashes, config) {
|
|
155
174
|
const emitEvents = (config == null ? void 0 : config.emitEvents) ?? true;
|
|
156
175
|
const map = await import_payload_wrapper.PayloadWrapper.toMap(await this.getHandler(hashes));
|
|
157
|
-
const { foundPayloads, notfoundHashes } = hashes.reduce(
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
if (found) {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
}
|
|
176
|
+
const { foundPayloads, notfoundHashes } = hashes.reduce((prev, hash) => {
|
|
177
|
+
const found = map[hash];
|
|
178
|
+
if (found) {
|
|
179
|
+
if (found.schema === import_boundwitness_model.BoundWitnessSchema) {
|
|
180
|
+
prev.foundPayloads.push({
|
|
181
|
+
...import_hash.PayloadHasher.hashFields(found),
|
|
182
|
+
_signatures: found._signatures
|
|
183
|
+
});
|
|
166
184
|
} else {
|
|
167
|
-
prev.
|
|
185
|
+
prev.foundPayloads.push({
|
|
186
|
+
...import_hash.PayloadHasher.hashFields(found)
|
|
187
|
+
});
|
|
168
188
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
189
|
+
} else {
|
|
190
|
+
prev.notfoundHashes.push(hash);
|
|
191
|
+
}
|
|
192
|
+
return prev;
|
|
193
|
+
}, {
|
|
194
|
+
foundPayloads: [],
|
|
195
|
+
notfoundHashes: []
|
|
196
|
+
});
|
|
173
197
|
const [parentFoundPayloads] = await this.getFromParents(notfoundHashes);
|
|
174
198
|
if (this.storeParentReads) {
|
|
175
199
|
await this.insertWithConfig(parentFoundPayloads);
|
|
176
200
|
}
|
|
177
|
-
return [
|
|
201
|
+
return [
|
|
202
|
+
...foundPayloads,
|
|
203
|
+
...parentFoundPayloads
|
|
204
|
+
];
|
|
178
205
|
}
|
|
179
206
|
head() {
|
|
180
207
|
return this._lastInsertedPayload;
|
|
@@ -190,7 +217,10 @@ var AbstractArchivist = class extends import_module_abstract.AbstractModuleInsta
|
|
|
190
217
|
await this.writeToParents(insertedPayloads);
|
|
191
218
|
}
|
|
192
219
|
if (emitEvents) {
|
|
193
|
-
await this.emit("inserted", {
|
|
220
|
+
await this.emit("inserted", {
|
|
221
|
+
module: this,
|
|
222
|
+
payloads: insertedPayloads
|
|
223
|
+
});
|
|
194
224
|
}
|
|
195
225
|
return insertedPayloads;
|
|
196
226
|
}
|
|
@@ -210,7 +240,9 @@ var AbstractArchivist = class extends import_module_abstract.AbstractModuleInsta
|
|
|
210
240
|
(0, import_assert.assertEx)(this.queryable(query, payloads, queryConfig));
|
|
211
241
|
const resultPayloads = [];
|
|
212
242
|
if (this.config.storeQueries) {
|
|
213
|
-
await this.insertHandler([
|
|
243
|
+
await this.insertHandler([
|
|
244
|
+
query
|
|
245
|
+
]);
|
|
214
246
|
}
|
|
215
247
|
switch (queryPayload.schema) {
|
|
216
248
|
case import_archivist_model.ArchivistAllQuerySchema: {
|
|
@@ -227,7 +259,9 @@ var AbstractArchivist = class extends import_module_abstract.AbstractModuleInsta
|
|
|
227
259
|
}
|
|
228
260
|
case import_archivist_model.ArchivistDeleteQuerySchema: {
|
|
229
261
|
const resultPayload = {
|
|
230
|
-
hashes: [
|
|
262
|
+
hashes: [
|
|
263
|
+
...await this.deleteWithConfig(queryPayload.hashes)
|
|
264
|
+
],
|
|
231
265
|
schema: import_archivist_model.ArchivistDeleteQuerySchema
|
|
232
266
|
};
|
|
233
267
|
resultPayloads.push(resultPayload);
|
|
@@ -263,33 +297,33 @@ var AbstractArchivist = class extends import_module_abstract.AbstractModuleInsta
|
|
|
263
297
|
}
|
|
264
298
|
async writeToParents(payloads) {
|
|
265
299
|
const parents = await this.parents();
|
|
266
|
-
return (0, import_lodash.compact)(
|
|
267
|
-
await
|
|
268
|
-
|
|
269
|
-
return parent ? await this.writeToParent(parent, payloads) : void 0;
|
|
270
|
-
})
|
|
271
|
-
)
|
|
272
|
-
).flat();
|
|
300
|
+
return (0, import_lodash.compact)(await Promise.all(Object.values(parents.write ?? {}).map(async (parent) => {
|
|
301
|
+
return parent ? await this.writeToParent(parent, payloads) : void 0;
|
|
302
|
+
}))).flat();
|
|
273
303
|
}
|
|
274
304
|
async resolveArchivists(archivists = []) {
|
|
275
|
-
const archivistModules = [
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
);
|
|
305
|
+
const archivistModules = [
|
|
306
|
+
...await this.resolve({
|
|
307
|
+
address: archivists
|
|
308
|
+
}),
|
|
309
|
+
...await this.resolve({
|
|
310
|
+
name: archivists
|
|
311
|
+
})
|
|
312
|
+
].filter(import_module_model.duplicateModules);
|
|
313
|
+
(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)))}]`);
|
|
284
314
|
return archivistModules.reduce((prev, module2) => {
|
|
285
315
|
prev[module2.address] = (0, import_archivist_model.asArchivistInstance)(module2, () => {
|
|
286
|
-
(0, import_archivist_model.isArchivistInstance)(module2, {
|
|
316
|
+
(0, import_archivist_model.isArchivistInstance)(module2, {
|
|
317
|
+
log: console
|
|
318
|
+
});
|
|
287
319
|
return `Unable to cast resolved module to an archivist: [${module2.address}, ${module2.config.name}, ${module2.config.schema})}]`;
|
|
288
320
|
});
|
|
289
321
|
return prev;
|
|
290
322
|
}, {});
|
|
291
323
|
}
|
|
292
324
|
};
|
|
325
|
+
__name(_AbstractArchivist, "AbstractArchivist");
|
|
326
|
+
var AbstractArchivist = _AbstractArchivist;
|
|
293
327
|
// Annotate the CommonJS export names for ESM import in node:
|
|
294
328
|
0 && (module.exports = {
|
|
295
329
|
AbstractArchivist
|
package/dist/node/index.cjs.map
CHANGED
|
@@ -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/node/index.js
CHANGED
|
@@ -1,27 +1,24 @@
|
|
|
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";
|
|
17
11
|
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
|
-
var
|
|
14
|
+
var _AbstractArchivist = class _AbstractArchivist extends AbstractModuleInstance {
|
|
21
15
|
_lastInsertedPayload;
|
|
22
16
|
_parents;
|
|
23
17
|
get queries() {
|
|
24
|
-
return [
|
|
18
|
+
return [
|
|
19
|
+
ArchivistGetQuerySchema,
|
|
20
|
+
...super.queries
|
|
21
|
+
];
|
|
25
22
|
}
|
|
26
23
|
get requireAllParents() {
|
|
27
24
|
return this.config.requireAllParents ?? false;
|
|
@@ -98,14 +95,18 @@ var AbstractArchivist = class extends AbstractModuleInstance {
|
|
|
98
95
|
const emitEvents = (config == null ? void 0 : config.emitEvents) ?? true;
|
|
99
96
|
const deletedHashes = await this.deleteHandler(hashes);
|
|
100
97
|
if (emitEvents) {
|
|
101
|
-
await this.emit("deleted", {
|
|
98
|
+
await this.emit("deleted", {
|
|
99
|
+
hashes: deletedHashes,
|
|
100
|
+
module: this
|
|
101
|
+
});
|
|
102
102
|
}
|
|
103
103
|
return deletedHashes;
|
|
104
104
|
}
|
|
105
105
|
async getFromParent(hashes, archivist) {
|
|
106
|
-
const foundPairs = (await Promise.all(
|
|
107
|
-
|
|
108
|
-
|
|
106
|
+
const foundPairs = (await Promise.all((await archivist.get(hashes)).map(async (payload) => [
|
|
107
|
+
await PayloadHasher.hashAsync(payload),
|
|
108
|
+
payload
|
|
109
|
+
]))).filter(([hash]) => {
|
|
109
110
|
const askedFor = hashes.includes(hash);
|
|
110
111
|
if (!askedFor) {
|
|
111
112
|
console.warn(`Parent returned payload with hash not asked for: ${hash}`);
|
|
@@ -115,21 +116,32 @@ var AbstractArchivist = class extends AbstractModuleInstance {
|
|
|
115
116
|
const foundHashes = new Set(foundPairs.map(([hash]) => hash));
|
|
116
117
|
const foundPayloads = foundPairs.map(([, payload]) => payload);
|
|
117
118
|
const notfound = hashes.filter((hash) => !foundHashes.has(hash));
|
|
118
|
-
return [
|
|
119
|
+
return [
|
|
120
|
+
foundPayloads,
|
|
121
|
+
notfound
|
|
122
|
+
];
|
|
119
123
|
}
|
|
120
124
|
async getFromParents(hashes) {
|
|
121
125
|
var _a;
|
|
122
126
|
const parents = Object.values(((_a = await this.parents()) == null ? void 0 : _a.read) ?? {});
|
|
123
|
-
let remainingHashes = [
|
|
127
|
+
let remainingHashes = [
|
|
128
|
+
...hashes
|
|
129
|
+
];
|
|
124
130
|
let parentIndex = 0;
|
|
125
131
|
let result = [];
|
|
126
132
|
while (parentIndex < parents.length && remainingHashes.length > 0) {
|
|
127
133
|
const [found, notfound] = await this.getFromParent(remainingHashes, parents[parentIndex]);
|
|
128
|
-
result = [
|
|
134
|
+
result = [
|
|
135
|
+
...result,
|
|
136
|
+
...found
|
|
137
|
+
];
|
|
129
138
|
remainingHashes = notfound;
|
|
130
139
|
parentIndex++;
|
|
131
140
|
}
|
|
132
|
-
return [
|
|
141
|
+
return [
|
|
142
|
+
result,
|
|
143
|
+
remainingHashes
|
|
144
|
+
];
|
|
133
145
|
}
|
|
134
146
|
getHandler(_hashes) {
|
|
135
147
|
throw new Error("Not implemented");
|
|
@@ -137,27 +149,35 @@ var AbstractArchivist = class extends AbstractModuleInstance {
|
|
|
137
149
|
async getWithConfig(hashes, config) {
|
|
138
150
|
const emitEvents = (config == null ? void 0 : config.emitEvents) ?? true;
|
|
139
151
|
const map = await PayloadWrapper.toMap(await this.getHandler(hashes));
|
|
140
|
-
const { foundPayloads, notfoundHashes } = hashes.reduce(
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
if (found) {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
}
|
|
152
|
+
const { foundPayloads, notfoundHashes } = hashes.reduce((prev, hash) => {
|
|
153
|
+
const found = map[hash];
|
|
154
|
+
if (found) {
|
|
155
|
+
if (found.schema === BoundWitnessSchema) {
|
|
156
|
+
prev.foundPayloads.push({
|
|
157
|
+
...PayloadHasher.hashFields(found),
|
|
158
|
+
_signatures: found._signatures
|
|
159
|
+
});
|
|
149
160
|
} else {
|
|
150
|
-
prev.
|
|
161
|
+
prev.foundPayloads.push({
|
|
162
|
+
...PayloadHasher.hashFields(found)
|
|
163
|
+
});
|
|
151
164
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
165
|
+
} else {
|
|
166
|
+
prev.notfoundHashes.push(hash);
|
|
167
|
+
}
|
|
168
|
+
return prev;
|
|
169
|
+
}, {
|
|
170
|
+
foundPayloads: [],
|
|
171
|
+
notfoundHashes: []
|
|
172
|
+
});
|
|
156
173
|
const [parentFoundPayloads] = await this.getFromParents(notfoundHashes);
|
|
157
174
|
if (this.storeParentReads) {
|
|
158
175
|
await this.insertWithConfig(parentFoundPayloads);
|
|
159
176
|
}
|
|
160
|
-
return [
|
|
177
|
+
return [
|
|
178
|
+
...foundPayloads,
|
|
179
|
+
...parentFoundPayloads
|
|
180
|
+
];
|
|
161
181
|
}
|
|
162
182
|
head() {
|
|
163
183
|
return this._lastInsertedPayload;
|
|
@@ -173,7 +193,10 @@ var AbstractArchivist = class extends AbstractModuleInstance {
|
|
|
173
193
|
await this.writeToParents(insertedPayloads);
|
|
174
194
|
}
|
|
175
195
|
if (emitEvents) {
|
|
176
|
-
await this.emit("inserted", {
|
|
196
|
+
await this.emit("inserted", {
|
|
197
|
+
module: this,
|
|
198
|
+
payloads: insertedPayloads
|
|
199
|
+
});
|
|
177
200
|
}
|
|
178
201
|
return insertedPayloads;
|
|
179
202
|
}
|
|
@@ -193,7 +216,9 @@ var AbstractArchivist = class extends AbstractModuleInstance {
|
|
|
193
216
|
assertEx(this.queryable(query, payloads, queryConfig));
|
|
194
217
|
const resultPayloads = [];
|
|
195
218
|
if (this.config.storeQueries) {
|
|
196
|
-
await this.insertHandler([
|
|
219
|
+
await this.insertHandler([
|
|
220
|
+
query
|
|
221
|
+
]);
|
|
197
222
|
}
|
|
198
223
|
switch (queryPayload.schema) {
|
|
199
224
|
case ArchivistAllQuerySchema: {
|
|
@@ -210,7 +235,9 @@ var AbstractArchivist = class extends AbstractModuleInstance {
|
|
|
210
235
|
}
|
|
211
236
|
case ArchivistDeleteQuerySchema: {
|
|
212
237
|
const resultPayload = {
|
|
213
|
-
hashes: [
|
|
238
|
+
hashes: [
|
|
239
|
+
...await this.deleteWithConfig(queryPayload.hashes)
|
|
240
|
+
],
|
|
214
241
|
schema: ArchivistDeleteQuerySchema
|
|
215
242
|
};
|
|
216
243
|
resultPayloads.push(resultPayload);
|
|
@@ -246,33 +273,33 @@ var AbstractArchivist = class extends AbstractModuleInstance {
|
|
|
246
273
|
}
|
|
247
274
|
async writeToParents(payloads) {
|
|
248
275
|
const parents = await this.parents();
|
|
249
|
-
return compact(
|
|
250
|
-
await
|
|
251
|
-
|
|
252
|
-
return parent ? await this.writeToParent(parent, payloads) : void 0;
|
|
253
|
-
})
|
|
254
|
-
)
|
|
255
|
-
).flat();
|
|
276
|
+
return compact(await Promise.all(Object.values(parents.write ?? {}).map(async (parent) => {
|
|
277
|
+
return parent ? await this.writeToParent(parent, payloads) : void 0;
|
|
278
|
+
}))).flat();
|
|
256
279
|
}
|
|
257
280
|
async resolveArchivists(archivists = []) {
|
|
258
|
-
const archivistModules = [
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
);
|
|
281
|
+
const archivistModules = [
|
|
282
|
+
...await this.resolve({
|
|
283
|
+
address: archivists
|
|
284
|
+
}),
|
|
285
|
+
...await this.resolve({
|
|
286
|
+
name: archivists
|
|
287
|
+
})
|
|
288
|
+
].filter(duplicateModules);
|
|
289
|
+
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)))}]`);
|
|
267
290
|
return archivistModules.reduce((prev, module) => {
|
|
268
291
|
prev[module.address] = asArchivistInstance(module, () => {
|
|
269
|
-
isArchivistInstance(module, {
|
|
292
|
+
isArchivistInstance(module, {
|
|
293
|
+
log: console
|
|
294
|
+
});
|
|
270
295
|
return `Unable to cast resolved module to an archivist: [${module.address}, ${module.config.name}, ${module.config.schema})}]`;
|
|
271
296
|
});
|
|
272
297
|
return prev;
|
|
273
298
|
}, {});
|
|
274
299
|
}
|
|
275
300
|
};
|
|
301
|
+
__name(_AbstractArchivist, "AbstractArchivist");
|
|
302
|
+
var AbstractArchivist = _AbstractArchivist;
|
|
276
303
|
export {
|
|
277
304
|
AbstractArchivist
|
|
278
305
|
};
|