@xyo-network/archivist-memory 2.90.18 → 2.90.19
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/MemoryArchivist.d.cts.map +1 -1
- package/dist/browser/MemoryArchivist.d.mts.map +1 -1
- package/dist/browser/MemoryArchivist.d.ts.map +1 -1
- package/dist/browser/index.cjs +3 -24
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +1 -22
- package/dist/browser/index.js.map +1 -1
- package/dist/node/MemoryArchivist.d.cts.map +1 -1
- package/dist/node/MemoryArchivist.d.mts.map +1 -1
- package/dist/node/MemoryArchivist.d.ts.map +1 -1
- package/dist/node/index.cjs +3 -24
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +1 -22
- package/dist/node/index.js.map +1 -1
- package/package.json +8 -8
- package/src/MemoryArchivist.ts +1 -25
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAwD,MAAM,iCAAiC,CAAA;AACzH,OAAO,EAIL,eAAe,EAKf,iBAAiB,EACjB,wBAAwB,EACzB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAmB,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE1G,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,MAAM,MAAM,2BAA2B,GAAG,qCAAqC,CAAA;AAC/E,eAAO,MAAM,2BAA2B,EAAE,2BAAmE,CAAA;AAE7G,MAAM,MAAM,qBAAqB,GAAG,eAAe,CAAC;IAClD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,2BAA2B,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;CAChE,CAAC,CAAA;AAEF,KAAK,eAAe,CAAC,CAAC,SAAS,OAAO,IAAI,CAAC,GAAG;IAC5C,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,qBAAqB,CAAC,OAAO,SAAS,eAAe,CAAC,qBAAqB,CAAC,GAAG,eAAe,CAAC,qBAAqB,CAAC,IAC/H,YAAY,CAAC,OAAO,CAAC,CAAA;AACvB,qBACa,eAAe,CACxB,OAAO,SAAS,qBAAqB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,GAAG,qBAAqB,EACrG,UAAU,SAAS,wBAAwB,GAAG,wBAAwB,CAExE,SAAQ,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAC7C,YAAW,iBAAiB,EAAE,cAAc;IAE5C,OAAgB,aAAa,WAAuD;IAEpF,OAAO,CAAC,cAAc,CAAC,CAA0B;IACjD,OAAO,CAAC,MAAM,CAAC,CAAoD;IAEnE,IAAI,aAAa,sCAGhB;IAED,IAAI,KAAK,gEAGR;IAED,IAAI,GAAG,WAEN;IAED,IAAa,OAAO,aASnB;cAEwB,UAAU,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;cAK9C,YAAY,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;cAM9B,aAAa,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;cAiBlD,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;cAWtD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC;cAarD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAWvF,OAAO,CAAC,sBAAsB;CAM/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAwD,MAAM,iCAAiC,CAAA;AACzH,OAAO,EAIL,eAAe,EAKf,iBAAiB,EACjB,wBAAwB,EACzB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAmB,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE1G,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,MAAM,MAAM,2BAA2B,GAAG,qCAAqC,CAAA;AAC/E,eAAO,MAAM,2BAA2B,EAAE,2BAAmE,CAAA;AAE7G,MAAM,MAAM,qBAAqB,GAAG,eAAe,CAAC;IAClD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,2BAA2B,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;CAChE,CAAC,CAAA;AAEF,KAAK,eAAe,CAAC,CAAC,SAAS,OAAO,IAAI,CAAC,GAAG;IAC5C,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,qBAAqB,CAAC,OAAO,SAAS,eAAe,CAAC,qBAAqB,CAAC,GAAG,eAAe,CAAC,qBAAqB,CAAC,IAC/H,YAAY,CAAC,OAAO,CAAC,CAAA;AACvB,qBACa,eAAe,CACxB,OAAO,SAAS,qBAAqB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,GAAG,qBAAqB,EACrG,UAAU,SAAS,wBAAwB,GAAG,wBAAwB,CAExE,SAAQ,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAC7C,YAAW,iBAAiB,EAAE,cAAc;IAE5C,OAAgB,aAAa,WAAuD;IAEpF,OAAO,CAAC,cAAc,CAAC,CAA0B;IACjD,OAAO,CAAC,MAAM,CAAC,CAAoD;IAEnE,IAAI,aAAa,sCAGhB;IAED,IAAI,KAAK,gEAGR;IAED,IAAI,GAAG,WAEN;IAED,IAAa,OAAO,aASnB;cAEwB,UAAU,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;cAK9C,YAAY,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;cAM9B,aAAa,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;cAiBlD,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;cAWtD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC;cAarD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAWvF,OAAO,CAAC,sBAAsB;CAM/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAwD,MAAM,iCAAiC,CAAA;AACzH,OAAO,EAIL,eAAe,EAKf,iBAAiB,EACjB,wBAAwB,EACzB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAmB,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE1G,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,MAAM,MAAM,2BAA2B,GAAG,qCAAqC,CAAA;AAC/E,eAAO,MAAM,2BAA2B,EAAE,2BAAmE,CAAA;AAE7G,MAAM,MAAM,qBAAqB,GAAG,eAAe,CAAC;IAClD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,2BAA2B,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;CAChE,CAAC,CAAA;AAEF,KAAK,eAAe,CAAC,CAAC,SAAS,OAAO,IAAI,CAAC,GAAG;IAC5C,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,qBAAqB,CAAC,OAAO,SAAS,eAAe,CAAC,qBAAqB,CAAC,GAAG,eAAe,CAAC,qBAAqB,CAAC,IAC/H,YAAY,CAAC,OAAO,CAAC,CAAA;AACvB,qBACa,eAAe,CACxB,OAAO,SAAS,qBAAqB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,GAAG,qBAAqB,EACrG,UAAU,SAAS,wBAAwB,GAAG,wBAAwB,CAExE,SAAQ,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAC7C,YAAW,iBAAiB,EAAE,cAAc;IAE5C,OAAgB,aAAa,WAAuD;IAEpF,OAAO,CAAC,cAAc,CAAC,CAA0B;IACjD,OAAO,CAAC,MAAM,CAAC,CAAoD;IAEnE,IAAI,aAAa,sCAGhB;IAED,IAAI,KAAK,gEAGR;IAED,IAAI,GAAG,WAEN;IAED,IAAa,OAAO,aASnB;cAEwB,UAAU,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;cAK9C,YAAY,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;cAM9B,aAAa,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;cAiBlD,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;cAWtD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC;cAarD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAWvF,OAAO,CAAC,sBAAsB;CAM/B"}
|
package/dist/browser/index.cjs
CHANGED
|
@@ -47,27 +47,6 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
47
47
|
}
|
|
48
48
|
__name(_ts_decorate, "_ts_decorate");
|
|
49
49
|
var MemoryArchivistConfigSchema = "network.xyo.archivist.memory.config";
|
|
50
|
-
var maxSequenceIndex = 10000000000n;
|
|
51
|
-
var sequenceNumber = /* @__PURE__ */ __name((index) => {
|
|
52
|
-
(0, import_assert.assertEx)(index < maxSequenceIndex, () => `index may not be larger than ${maxSequenceIndex}`);
|
|
53
|
-
return BigInt(Date.now()) * maxSequenceIndex + BigInt(index);
|
|
54
|
-
}, "sequenceNumber");
|
|
55
|
-
var addStorageMeta = /* @__PURE__ */ __name((payload, index = 0) => {
|
|
56
|
-
return {
|
|
57
|
-
...payload,
|
|
58
|
-
_sequence: sequenceNumber(index)
|
|
59
|
-
};
|
|
60
|
-
}, "addStorageMeta");
|
|
61
|
-
var sortByStorageMeta = /* @__PURE__ */ __name((payloads) => {
|
|
62
|
-
return payloads.sort((a, b) => a._sequence < b._sequence ? -1 : a._sequence > b._sequence ? 1 : 0);
|
|
63
|
-
}, "sortByStorageMeta");
|
|
64
|
-
function removeStorageMeta(payload) {
|
|
65
|
-
if (!payload)
|
|
66
|
-
return;
|
|
67
|
-
const { _sequence, ...noMeta } = payload;
|
|
68
|
-
return noMeta;
|
|
69
|
-
}
|
|
70
|
-
__name(removeStorageMeta, "removeStorageMeta");
|
|
71
50
|
var MemoryArchivist = class extends import_archivist_abstract.AbstractArchivist {
|
|
72
51
|
static {
|
|
73
52
|
__name(this, "MemoryArchivist");
|
|
@@ -105,7 +84,7 @@ var MemoryArchivist = class extends import_archivist_abstract.AbstractArchivist
|
|
|
105
84
|
}
|
|
106
85
|
async allHandler() {
|
|
107
86
|
const all = (0, import_lodash.compact)(await Promise.all(this.cache.dump().map((value) => value[1].value)));
|
|
108
|
-
return sortByStorageMeta(all).map((payload) => removeStorageMeta(payload));
|
|
87
|
+
return (0, import_archivist_abstract.sortByStorageMeta)(all).map((payload) => (0, import_archivist_abstract.removeStorageMeta)(payload));
|
|
109
88
|
}
|
|
110
89
|
clearHandler() {
|
|
111
90
|
this.cache.clear();
|
|
@@ -139,7 +118,7 @@ var MemoryArchivist = class extends import_archivist_abstract.AbstractArchivist
|
|
|
139
118
|
if (resolvedHash !== hash && !result) {
|
|
140
119
|
throw new Error("Missing referenced payload");
|
|
141
120
|
}
|
|
142
|
-
return removeStorageMeta(result);
|
|
121
|
+
return (0, import_archivist_abstract.removeStorageMeta)(result);
|
|
143
122
|
}));
|
|
144
123
|
}
|
|
145
124
|
async insertHandler(payloads) {
|
|
@@ -150,7 +129,7 @@ var MemoryArchivist = class extends import_archivist_abstract.AbstractArchivist
|
|
|
150
129
|
return insertedPayloads;
|
|
151
130
|
}
|
|
152
131
|
insertPayloadIntoCache(payload, hash, index = 0) {
|
|
153
|
-
const withMeta = addStorageMeta(payload, index);
|
|
132
|
+
const withMeta = (0, import_archivist_abstract.addStorageMeta)(payload, index);
|
|
154
133
|
this.cache.set(hash, withMeta);
|
|
155
134
|
this.bodyHashIndex.set(withMeta.$hash, hash);
|
|
156
135
|
return payload;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/MemoryArchivist.ts"],"sourcesContent":["export * from './MemoryArchivist'\n","import { assertEx } from '@xylabs/assert'\nimport { Hash } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist } from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistConfig,\n ArchivistConfigSchema,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuery,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadWithMeta, WithMeta } from '@xyo-network/payload-model'\nimport { LRUCache } from 'lru-cache'\n\nexport type MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config'\nexport const MemoryArchivistConfigSchema: MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config'\n\nexport type MemoryArchivistConfig = ArchivistConfig<{\n max?: number\n schema: MemoryArchivistConfigSchema | ArchivistConfig['schema']\n}>\n\ntype WithStorageMeta<T extends Payload> = T & {\n _sequence: bigint\n}\n\nconst maxSequenceIndex = 10_000_000_000n\n\nconst sequenceNumber = (index: number) => {\n assertEx(index < maxSequenceIndex, () => `index may not be larger than ${maxSequenceIndex}`)\n return BigInt(Date.now()) * maxSequenceIndex + BigInt(index)\n}\n\nconst addStorageMeta = <T extends PayloadWithMeta>(payload: T, index = 0) => {\n return { ...payload, _sequence: sequenceNumber(index) } as WithStorageMeta<T>\n}\n\nconst sortByStorageMeta = <T extends PayloadWithMeta>(payloads: WithStorageMeta<T>[]) => {\n return payloads.sort((a, b) => (a._sequence < b._sequence ? -1 : a._sequence > b._sequence ? 1 : 0))\n}\n\nfunction removeStorageMeta<T extends PayloadWithMeta>(payload: WithStorageMeta<T>): T\nfunction removeStorageMeta<T extends PayloadWithMeta>(payload?: WithStorageMeta<T>): T | undefined\nfunction removeStorageMeta<T extends PayloadWithMeta>(payload?: WithStorageMeta<T>) {\n if (!payload) return\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { _sequence, ...noMeta } = payload as WithStorageMeta<T>\n return noMeta as T\n}\n\nexport type MemoryArchivistParams<TConfig extends AnyConfigSchema<MemoryArchivistConfig> = AnyConfigSchema<MemoryArchivistConfig>> =\n ModuleParams<TConfig>\n@creatableModule()\nexport class MemoryArchivist<\n TParams extends MemoryArchivistParams<AnyConfigSchema<MemoryArchivistConfig>> = MemoryArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n >\n extends AbstractArchivist<TParams, TEventData>\n implements ArchivistInstance, ModuleInstance\n{\n static override configSchemas = [MemoryArchivistConfigSchema, ArchivistConfigSchema]\n\n private _bodyHashIndex?: LRUCache<string, string>\n private _cache?: LRUCache<string, WithStorageMeta<PayloadWithMeta>>\n\n get bodyHashIndex() {\n this._bodyHashIndex = this._bodyHashIndex ?? new LRUCache<string, string>({ max: this.max })\n return this._bodyHashIndex\n }\n\n get cache() {\n this._cache = this._cache ?? new LRUCache<string, WithStorageMeta<PayloadWithMeta>>({ max: this.max })\n return this._cache\n }\n\n get max() {\n return this.config?.max ?? 10_000\n }\n\n override get queries() {\n return [\n ArchivistAllQuerySchema,\n ArchivistDeleteQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistCommitQuerySchema,\n ...super.queries,\n ]\n }\n\n protected override async allHandler(): Promise<PayloadWithMeta[]> {\n const all = compact(await Promise.all(this.cache.dump().map((value) => value[1].value)))\n return sortByStorageMeta(all).map((payload) => removeStorageMeta(payload))\n }\n\n protected override clearHandler(): void | Promise<void> {\n this.cache.clear()\n this.bodyHashIndex.clear()\n return this.emit('cleared', { module: this })\n }\n\n protected override async commitHandler(): Promise<WithMeta<BoundWitness>[]> {\n const payloads = assertEx(await this.allHandler(), 'Nothing to commit')\n const settled = await Promise.allSettled(\n compact(\n Object.values((await this.parents()).commit ?? [])?.map(async (parent) => {\n const queryPayload: ArchivistInsertQuery = {\n schema: ArchivistInsertQuerySchema,\n }\n const query = await this.bindQuery(queryPayload, payloads)\n return (await parent?.query(query[0], query[1]))?.[0]\n }),\n ),\n )\n await this.clearHandler()\n return compact(settled.filter(fulfilled).map((result) => result.value))\n }\n\n protected override async deleteHandler(hashes: Hash[]): Promise<string[]> {\n const deletedHashes = compact(\n await Promise.all(\n hashes.map((hash) => {\n return this.cache.delete(hash) ? hash : undefined\n }),\n ),\n )\n return deletedHashes\n }\n\n protected override getHandler(hashes: string[]): Promisable<PayloadWithMeta[]> {\n return compact(\n hashes.map((hash) => {\n const resolvedHash = this.bodyHashIndex.get(hash) ?? hash\n const result = this.cache.get(resolvedHash)\n if (resolvedHash !== hash && !result) {\n throw new Error('Missing referenced payload')\n }\n return removeStorageMeta(result)\n }),\n )\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]> {\n const pairs = await PayloadBuilder.hashPairs(payloads)\n const insertedPayloads = await Promise.all(\n pairs.map(([payload, hash]) => {\n return this.insertPayloadIntoCache(payload, hash)\n }),\n )\n\n return insertedPayloads\n }\n\n private insertPayloadIntoCache(payload: PayloadWithMeta, hash: string, index = 0): PayloadWithMeta {\n const withMeta = addStorageMeta(payload, index)\n this.cache.set(hash, withMeta)\n this.bodyHashIndex.set(withMeta.$hash, hash)\n return payload\n }\n}\n"],"mappings":"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","names":["MemoryArchivistConfigSchema","maxSequenceIndex","sequenceNumber","index","assertEx","BigInt","Date","now","addStorageMeta","payload","_sequence","sortByStorageMeta","payloads","sort","a","b","removeStorageMeta","noMeta","MemoryArchivist","AbstractArchivist","configSchemas","ArchivistConfigSchema","_bodyHashIndex","_cache","bodyHashIndex","LRUCache","max","cache","config","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","allHandler","all","compact","Promise","dump","map","value","clearHandler","clear","emit","module","commitHandler","settled","allSettled","Object","values","parents","commit","parent","queryPayload","schema","query","bindQuery","filter","fulfilled","result","deleteHandler","hashes","deletedHashes","hash","delete","undefined","getHandler","resolvedHash","get","Error","insertHandler","pairs","PayloadBuilder","hashPairs","insertedPayloads","insertPayloadIntoCache","withMeta","set","$hash","creatableModule"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/MemoryArchivist.ts"],"sourcesContent":["export * from './MemoryArchivist'\n","import { assertEx } from '@xylabs/assert'\nimport { Hash } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta } from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistConfig,\n ArchivistConfigSchema,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuery,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadWithMeta, WithMeta } from '@xyo-network/payload-model'\nimport { LRUCache } from 'lru-cache'\n\nexport type MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config'\nexport const MemoryArchivistConfigSchema: MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config'\n\nexport type MemoryArchivistConfig = ArchivistConfig<{\n max?: number\n schema: MemoryArchivistConfigSchema | ArchivistConfig['schema']\n}>\n\ntype WithStorageMeta<T extends Payload> = T & {\n _sequence: bigint\n}\n\nexport type MemoryArchivistParams<TConfig extends AnyConfigSchema<MemoryArchivistConfig> = AnyConfigSchema<MemoryArchivistConfig>> =\n ModuleParams<TConfig>\n@creatableModule()\nexport class MemoryArchivist<\n TParams extends MemoryArchivistParams<AnyConfigSchema<MemoryArchivistConfig>> = MemoryArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n >\n extends AbstractArchivist<TParams, TEventData>\n implements ArchivistInstance, ModuleInstance\n{\n static override configSchemas = [MemoryArchivistConfigSchema, ArchivistConfigSchema]\n\n private _bodyHashIndex?: LRUCache<string, string>\n private _cache?: LRUCache<string, WithStorageMeta<PayloadWithMeta>>\n\n get bodyHashIndex() {\n this._bodyHashIndex = this._bodyHashIndex ?? new LRUCache<string, string>({ max: this.max })\n return this._bodyHashIndex\n }\n\n get cache() {\n this._cache = this._cache ?? new LRUCache<string, WithStorageMeta<PayloadWithMeta>>({ max: this.max })\n return this._cache\n }\n\n get max() {\n return this.config?.max ?? 10_000\n }\n\n override get queries() {\n return [\n ArchivistAllQuerySchema,\n ArchivistDeleteQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistCommitQuerySchema,\n ...super.queries,\n ]\n }\n\n protected override async allHandler(): Promise<PayloadWithMeta[]> {\n const all = compact(await Promise.all(this.cache.dump().map((value) => value[1].value)))\n return sortByStorageMeta(all).map((payload) => removeStorageMeta(payload))\n }\n\n protected override clearHandler(): void | Promise<void> {\n this.cache.clear()\n this.bodyHashIndex.clear()\n return this.emit('cleared', { module: this })\n }\n\n protected override async commitHandler(): Promise<WithMeta<BoundWitness>[]> {\n const payloads = assertEx(await this.allHandler(), 'Nothing to commit')\n const settled = await Promise.allSettled(\n compact(\n Object.values((await this.parents()).commit ?? [])?.map(async (parent) => {\n const queryPayload: ArchivistInsertQuery = {\n schema: ArchivistInsertQuerySchema,\n }\n const query = await this.bindQuery(queryPayload, payloads)\n return (await parent?.query(query[0], query[1]))?.[0]\n }),\n ),\n )\n await this.clearHandler()\n return compact(settled.filter(fulfilled).map((result) => result.value))\n }\n\n protected override async deleteHandler(hashes: Hash[]): Promise<string[]> {\n const deletedHashes = compact(\n await Promise.all(\n hashes.map((hash) => {\n return this.cache.delete(hash) ? hash : undefined\n }),\n ),\n )\n return deletedHashes\n }\n\n protected override getHandler(hashes: string[]): Promisable<PayloadWithMeta[]> {\n return compact(\n hashes.map((hash) => {\n const resolvedHash = this.bodyHashIndex.get(hash) ?? hash\n const result = this.cache.get(resolvedHash)\n if (resolvedHash !== hash && !result) {\n throw new Error('Missing referenced payload')\n }\n return removeStorageMeta(result)\n }),\n )\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]> {\n const pairs = await PayloadBuilder.hashPairs(payloads)\n const insertedPayloads = await Promise.all(\n pairs.map(([payload, hash]) => {\n return this.insertPayloadIntoCache(payload, hash)\n }),\n )\n\n return insertedPayloads\n }\n\n private insertPayloadIntoCache(payload: PayloadWithMeta, hash: string, index = 0): PayloadWithMeta {\n const withMeta = addStorageMeta(payload, index)\n this.cache.set(hash, withMeta)\n this.bodyHashIndex.set(withMeta.$hash, hash)\n return payload\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;ACAA,oBAAyB;AAEzB,oBAAwB;AACxB,qBAAsC;AACtC,gCAAwF;AACxF,6BAWO;AAEP,0BAA+E;AAC/E,6BAA+B;AAE/B,uBAAyB;;;;;;;;;;;;AAGlB,IAAMA,8BAA2D;AAcjE,IAAMC,kBAAN,cAIGC,4CAAAA;SAAAA;;;EAGR,OAAgBC,gBAAgB;IAACH;IAA6BI;;EAEtDC;EACAC;EAER,IAAIC,gBAAgB;AAClB,SAAKF,iBAAiB,KAAKA,kBAAkB,IAAIG,0BAAyB;MAAEC,KAAK,KAAKA;IAAI,CAAA;AAC1F,WAAO,KAAKJ;EACd;EAEA,IAAIK,QAAQ;AACV,SAAKJ,SAAS,KAAKA,UAAU,IAAIE,0BAAmD;MAAEC,KAAK,KAAKA;IAAI,CAAA;AACpG,WAAO,KAAKH;EACd;EAEA,IAAIG,MAAM;AACR,WAAO,KAAKE,QAAQF,OAAO;EAC7B;EAEA,IAAaG,UAAU;AACrB,WAAO;MACLC;MACAC;MACAC;MACAC;MACAC;SACG,MAAML;;EAEb;EAEA,MAAyBM,aAAyC;AAChE,UAAMC,UAAMC,uBAAQ,MAAMC,QAAQF,IAAI,KAAKT,MAAMY,KAAI,EAAGC,IAAI,CAACC,UAAUA,MAAM,CAAA,EAAGA,KAAK,CAAA,CAAA;AACrF,eAAOC,6CAAkBN,GAAAA,EAAKI,IAAI,CAACG,gBAAYC,6CAAkBD,OAAAA,CAAAA;EACnE;EAEmBE,eAAqC;AACtD,SAAKlB,MAAMmB,MAAK;AAChB,SAAKtB,cAAcsB,MAAK;AACxB,WAAO,KAAKC,KAAK,WAAW;MAAEC,QAAQ;IAAK,CAAA;EAC7C;EAEA,MAAyBC,gBAAmD;AAC1E,UAAMC,eAAWC,wBAAS,MAAM,KAAKhB,WAAU,GAAI,mBAAA;AACnD,UAAMiB,UAAU,MAAMd,QAAQe,eAC5BhB,uBACEiB,OAAOC,QAAQ,MAAM,KAAKC,QAAO,GAAIC,UAAU,CAAA,CAAE,GAAGjB,IAAI,OAAOkB,WAAAA;AAC7D,YAAMC,eAAqC;QACzCC,QAAQ3B;MACV;AACA,YAAM4B,QAAQ,MAAM,KAAKC,UAAUH,cAAcT,QAAAA;AACjD,cAAQ,MAAMQ,QAAQG,MAAMA,MAAM,CAAA,GAAIA,MAAM,CAAA,CAAE,KAAK,CAAA;IACrD,CAAA,CAAA,CAAA;AAGJ,UAAM,KAAKhB,aAAY;AACvB,eAAOR,uBAAQe,QAAQW,OAAOC,wBAAAA,EAAWxB,IAAI,CAACyB,WAAWA,OAAOxB,KAAK,CAAA;EACvE;EAEA,MAAyByB,cAAcC,QAAmC;AACxE,UAAMC,oBAAgB/B,uBACpB,MAAMC,QAAQF,IACZ+B,OAAO3B,IAAI,CAAC6B,SAAAA;AACV,aAAO,KAAK1C,MAAM2C,OAAOD,IAAAA,IAAQA,OAAOE;IAC1C,CAAA,CAAA,CAAA;AAGJ,WAAOH;EACT;EAEmBI,WAAWL,QAAiD;AAC7E,eAAO9B,uBACL8B,OAAO3B,IAAI,CAAC6B,SAAAA;AACV,YAAMI,eAAe,KAAKjD,cAAckD,IAAIL,IAAAA,KAASA;AACrD,YAAMJ,SAAS,KAAKtC,MAAM+C,IAAID,YAAAA;AAC9B,UAAIA,iBAAiBJ,QAAQ,CAACJ,QAAQ;AACpC,cAAM,IAAIU,MAAM,4BAAA;MAClB;AACA,iBAAO/B,6CAAkBqB,MAAAA;IAC3B,CAAA,CAAA;EAEJ;EAEA,MAAyBW,cAAc1B,UAAiD;AACtF,UAAM2B,QAAQ,MAAMC,sCAAeC,UAAU7B,QAAAA;AAC7C,UAAM8B,mBAAmB,MAAM1C,QAAQF,IACrCyC,MAAMrC,IAAI,CAAC,CAACG,SAAS0B,IAAAA,MAAK;AACxB,aAAO,KAAKY,uBAAuBtC,SAAS0B,IAAAA;IAC9C,CAAA,CAAA;AAGF,WAAOW;EACT;EAEQC,uBAAuBtC,SAA0B0B,MAAca,QAAQ,GAAoB;AACjG,UAAMC,eAAWC,0CAAezC,SAASuC,KAAAA;AACzC,SAAKvD,MAAM0D,IAAIhB,MAAMc,QAAAA;AACrB,SAAK3D,cAAc6D,IAAIF,SAASG,OAAOjB,IAAAA;AACvC,WAAO1B;EACT;AACF;AA1GazB,kBAAAA,aAAAA;MADZqE,qCAAAA;GACYrE,eAAAA;","names":["MemoryArchivistConfigSchema","MemoryArchivist","AbstractArchivist","configSchemas","ArchivistConfigSchema","_bodyHashIndex","_cache","bodyHashIndex","LRUCache","max","cache","config","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","allHandler","all","compact","Promise","dump","map","value","sortByStorageMeta","payload","removeStorageMeta","clearHandler","clear","emit","module","commitHandler","payloads","assertEx","settled","allSettled","Object","values","parents","commit","parent","queryPayload","schema","query","bindQuery","filter","fulfilled","result","deleteHandler","hashes","deletedHashes","hash","delete","undefined","getHandler","resolvedHash","get","Error","insertHandler","pairs","PayloadBuilder","hashPairs","insertedPayloads","insertPayloadIntoCache","index","withMeta","addStorageMeta","set","$hash","creatableModule"]}
|
package/dist/browser/index.js
CHANGED
|
@@ -5,7 +5,7 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
|
|
|
5
5
|
import { assertEx } from "@xylabs/assert";
|
|
6
6
|
import { compact } from "@xylabs/lodash";
|
|
7
7
|
import { fulfilled } from "@xylabs/promise";
|
|
8
|
-
import { AbstractArchivist } from "@xyo-network/archivist-abstract";
|
|
8
|
+
import { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta } from "@xyo-network/archivist-abstract";
|
|
9
9
|
import { ArchivistAllQuerySchema, ArchivistClearQuerySchema, ArchivistCommitQuerySchema, ArchivistConfigSchema, ArchivistDeleteQuerySchema, ArchivistInsertQuerySchema } from "@xyo-network/archivist-model";
|
|
10
10
|
import { creatableModule } from "@xyo-network/module-model";
|
|
11
11
|
import { PayloadBuilder } from "@xyo-network/payload-builder";
|
|
@@ -22,27 +22,6 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
22
22
|
}
|
|
23
23
|
__name(_ts_decorate, "_ts_decorate");
|
|
24
24
|
var MemoryArchivistConfigSchema = "network.xyo.archivist.memory.config";
|
|
25
|
-
var maxSequenceIndex = 10000000000n;
|
|
26
|
-
var sequenceNumber = /* @__PURE__ */ __name((index) => {
|
|
27
|
-
assertEx(index < maxSequenceIndex, () => `index may not be larger than ${maxSequenceIndex}`);
|
|
28
|
-
return BigInt(Date.now()) * maxSequenceIndex + BigInt(index);
|
|
29
|
-
}, "sequenceNumber");
|
|
30
|
-
var addStorageMeta = /* @__PURE__ */ __name((payload, index = 0) => {
|
|
31
|
-
return {
|
|
32
|
-
...payload,
|
|
33
|
-
_sequence: sequenceNumber(index)
|
|
34
|
-
};
|
|
35
|
-
}, "addStorageMeta");
|
|
36
|
-
var sortByStorageMeta = /* @__PURE__ */ __name((payloads) => {
|
|
37
|
-
return payloads.sort((a, b) => a._sequence < b._sequence ? -1 : a._sequence > b._sequence ? 1 : 0);
|
|
38
|
-
}, "sortByStorageMeta");
|
|
39
|
-
function removeStorageMeta(payload) {
|
|
40
|
-
if (!payload)
|
|
41
|
-
return;
|
|
42
|
-
const { _sequence, ...noMeta } = payload;
|
|
43
|
-
return noMeta;
|
|
44
|
-
}
|
|
45
|
-
__name(removeStorageMeta, "removeStorageMeta");
|
|
46
25
|
var MemoryArchivist = class extends AbstractArchivist {
|
|
47
26
|
static {
|
|
48
27
|
__name(this, "MemoryArchivist");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/MemoryArchivist.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { Hash } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist } from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistConfig,\n ArchivistConfigSchema,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuery,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadWithMeta, WithMeta } from '@xyo-network/payload-model'\nimport { LRUCache } from 'lru-cache'\n\nexport type MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config'\nexport const MemoryArchivistConfigSchema: MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config'\n\nexport type MemoryArchivistConfig = ArchivistConfig<{\n max?: number\n schema: MemoryArchivistConfigSchema | ArchivistConfig['schema']\n}>\n\ntype WithStorageMeta<T extends Payload> = T & {\n _sequence: bigint\n}\n\nconst maxSequenceIndex = 10_000_000_000n\n\nconst sequenceNumber = (index: number) => {\n assertEx(index < maxSequenceIndex, () => `index may not be larger than ${maxSequenceIndex}`)\n return BigInt(Date.now()) * maxSequenceIndex + BigInt(index)\n}\n\nconst addStorageMeta = <T extends PayloadWithMeta>(payload: T, index = 0) => {\n return { ...payload, _sequence: sequenceNumber(index) } as WithStorageMeta<T>\n}\n\nconst sortByStorageMeta = <T extends PayloadWithMeta>(payloads: WithStorageMeta<T>[]) => {\n return payloads.sort((a, b) => (a._sequence < b._sequence ? -1 : a._sequence > b._sequence ? 1 : 0))\n}\n\nfunction removeStorageMeta<T extends PayloadWithMeta>(payload: WithStorageMeta<T>): T\nfunction removeStorageMeta<T extends PayloadWithMeta>(payload?: WithStorageMeta<T>): T | undefined\nfunction removeStorageMeta<T extends PayloadWithMeta>(payload?: WithStorageMeta<T>) {\n if (!payload) return\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { _sequence, ...noMeta } = payload as WithStorageMeta<T>\n return noMeta as T\n}\n\nexport type MemoryArchivistParams<TConfig extends AnyConfigSchema<MemoryArchivistConfig> = AnyConfigSchema<MemoryArchivistConfig>> =\n ModuleParams<TConfig>\n@creatableModule()\nexport class MemoryArchivist<\n TParams extends MemoryArchivistParams<AnyConfigSchema<MemoryArchivistConfig>> = MemoryArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n >\n extends AbstractArchivist<TParams, TEventData>\n implements ArchivistInstance, ModuleInstance\n{\n static override configSchemas = [MemoryArchivistConfigSchema, ArchivistConfigSchema]\n\n private _bodyHashIndex?: LRUCache<string, string>\n private _cache?: LRUCache<string, WithStorageMeta<PayloadWithMeta>>\n\n get bodyHashIndex() {\n this._bodyHashIndex = this._bodyHashIndex ?? new LRUCache<string, string>({ max: this.max })\n return this._bodyHashIndex\n }\n\n get cache() {\n this._cache = this._cache ?? new LRUCache<string, WithStorageMeta<PayloadWithMeta>>({ max: this.max })\n return this._cache\n }\n\n get max() {\n return this.config?.max ?? 10_000\n }\n\n override get queries() {\n return [\n ArchivistAllQuerySchema,\n ArchivistDeleteQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistCommitQuerySchema,\n ...super.queries,\n ]\n }\n\n protected override async allHandler(): Promise<PayloadWithMeta[]> {\n const all = compact(await Promise.all(this.cache.dump().map((value) => value[1].value)))\n return sortByStorageMeta(all).map((payload) => removeStorageMeta(payload))\n }\n\n protected override clearHandler(): void | Promise<void> {\n this.cache.clear()\n this.bodyHashIndex.clear()\n return this.emit('cleared', { module: this })\n }\n\n protected override async commitHandler(): Promise<WithMeta<BoundWitness>[]> {\n const payloads = assertEx(await this.allHandler(), 'Nothing to commit')\n const settled = await Promise.allSettled(\n compact(\n Object.values((await this.parents()).commit ?? [])?.map(async (parent) => {\n const queryPayload: ArchivistInsertQuery = {\n schema: ArchivistInsertQuerySchema,\n }\n const query = await this.bindQuery(queryPayload, payloads)\n return (await parent?.query(query[0], query[1]))?.[0]\n }),\n ),\n )\n await this.clearHandler()\n return compact(settled.filter(fulfilled).map((result) => result.value))\n }\n\n protected override async deleteHandler(hashes: Hash[]): Promise<string[]> {\n const deletedHashes = compact(\n await Promise.all(\n hashes.map((hash) => {\n return this.cache.delete(hash) ? hash : undefined\n }),\n ),\n )\n return deletedHashes\n }\n\n protected override getHandler(hashes: string[]): Promisable<PayloadWithMeta[]> {\n return compact(\n hashes.map((hash) => {\n const resolvedHash = this.bodyHashIndex.get(hash) ?? hash\n const result = this.cache.get(resolvedHash)\n if (resolvedHash !== hash && !result) {\n throw new Error('Missing referenced payload')\n }\n return removeStorageMeta(result)\n }),\n )\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]> {\n const pairs = await PayloadBuilder.hashPairs(payloads)\n const insertedPayloads = await Promise.all(\n pairs.map(([payload, hash]) => {\n return this.insertPayloadIntoCache(payload, hash)\n }),\n )\n\n return insertedPayloads\n }\n\n private insertPayloadIntoCache(payload: PayloadWithMeta, hash: string, index = 0): PayloadWithMeta {\n const withMeta = addStorageMeta(payload, index)\n this.cache.set(hash, withMeta)\n this.bodyHashIndex.set(withMeta.$hash, hash)\n return payload\n }\n}\n"],"mappings":"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","names":["assertEx","compact","fulfilled","AbstractArchivist","ArchivistAllQuerySchema","ArchivistClearQuerySchema","ArchivistCommitQuerySchema","ArchivistConfigSchema","ArchivistDeleteQuerySchema","ArchivistInsertQuerySchema","creatableModule","PayloadBuilder","LRUCache","MemoryArchivistConfigSchema","maxSequenceIndex","sequenceNumber","index","assertEx","BigInt","Date","now","addStorageMeta","payload","_sequence","sortByStorageMeta","payloads","sort","a","b","removeStorageMeta","noMeta","MemoryArchivist","AbstractArchivist","configSchemas","ArchivistConfigSchema","_bodyHashIndex","_cache","bodyHashIndex","LRUCache","max","cache","config","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","allHandler","all","compact","Promise","dump","map","value","clearHandler","clear","emit","module","commitHandler","settled","allSettled","Object","values","parents","commit","parent","queryPayload","schema","query","bindQuery","filter","fulfilled","result","deleteHandler","hashes","deletedHashes","hash","delete","undefined","getHandler","resolvedHash","get","Error","insertHandler","pairs","PayloadBuilder","hashPairs","insertedPayloads","insertPayloadIntoCache","withMeta","set","$hash","creatableModule"]}
|
|
1
|
+
{"version":3,"sources":["../../src/MemoryArchivist.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { Hash } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta } from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistConfig,\n ArchivistConfigSchema,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuery,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadWithMeta, WithMeta } from '@xyo-network/payload-model'\nimport { LRUCache } from 'lru-cache'\n\nexport type MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config'\nexport const MemoryArchivistConfigSchema: MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config'\n\nexport type MemoryArchivistConfig = ArchivistConfig<{\n max?: number\n schema: MemoryArchivistConfigSchema | ArchivistConfig['schema']\n}>\n\ntype WithStorageMeta<T extends Payload> = T & {\n _sequence: bigint\n}\n\nexport type MemoryArchivistParams<TConfig extends AnyConfigSchema<MemoryArchivistConfig> = AnyConfigSchema<MemoryArchivistConfig>> =\n ModuleParams<TConfig>\n@creatableModule()\nexport class MemoryArchivist<\n TParams extends MemoryArchivistParams<AnyConfigSchema<MemoryArchivistConfig>> = MemoryArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n >\n extends AbstractArchivist<TParams, TEventData>\n implements ArchivistInstance, ModuleInstance\n{\n static override configSchemas = [MemoryArchivistConfigSchema, ArchivistConfigSchema]\n\n private _bodyHashIndex?: LRUCache<string, string>\n private _cache?: LRUCache<string, WithStorageMeta<PayloadWithMeta>>\n\n get bodyHashIndex() {\n this._bodyHashIndex = this._bodyHashIndex ?? new LRUCache<string, string>({ max: this.max })\n return this._bodyHashIndex\n }\n\n get cache() {\n this._cache = this._cache ?? new LRUCache<string, WithStorageMeta<PayloadWithMeta>>({ max: this.max })\n return this._cache\n }\n\n get max() {\n return this.config?.max ?? 10_000\n }\n\n override get queries() {\n return [\n ArchivistAllQuerySchema,\n ArchivistDeleteQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistCommitQuerySchema,\n ...super.queries,\n ]\n }\n\n protected override async allHandler(): Promise<PayloadWithMeta[]> {\n const all = compact(await Promise.all(this.cache.dump().map((value) => value[1].value)))\n return sortByStorageMeta(all).map((payload) => removeStorageMeta(payload))\n }\n\n protected override clearHandler(): void | Promise<void> {\n this.cache.clear()\n this.bodyHashIndex.clear()\n return this.emit('cleared', { module: this })\n }\n\n protected override async commitHandler(): Promise<WithMeta<BoundWitness>[]> {\n const payloads = assertEx(await this.allHandler(), 'Nothing to commit')\n const settled = await Promise.allSettled(\n compact(\n Object.values((await this.parents()).commit ?? [])?.map(async (parent) => {\n const queryPayload: ArchivistInsertQuery = {\n schema: ArchivistInsertQuerySchema,\n }\n const query = await this.bindQuery(queryPayload, payloads)\n return (await parent?.query(query[0], query[1]))?.[0]\n }),\n ),\n )\n await this.clearHandler()\n return compact(settled.filter(fulfilled).map((result) => result.value))\n }\n\n protected override async deleteHandler(hashes: Hash[]): Promise<string[]> {\n const deletedHashes = compact(\n await Promise.all(\n hashes.map((hash) => {\n return this.cache.delete(hash) ? hash : undefined\n }),\n ),\n )\n return deletedHashes\n }\n\n protected override getHandler(hashes: string[]): Promisable<PayloadWithMeta[]> {\n return compact(\n hashes.map((hash) => {\n const resolvedHash = this.bodyHashIndex.get(hash) ?? hash\n const result = this.cache.get(resolvedHash)\n if (resolvedHash !== hash && !result) {\n throw new Error('Missing referenced payload')\n }\n return removeStorageMeta(result)\n }),\n )\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]> {\n const pairs = await PayloadBuilder.hashPairs(payloads)\n const insertedPayloads = await Promise.all(\n pairs.map(([payload, hash]) => {\n return this.insertPayloadIntoCache(payload, hash)\n }),\n )\n\n return insertedPayloads\n }\n\n private insertPayloadIntoCache(payload: PayloadWithMeta, hash: string, index = 0): PayloadWithMeta {\n const withMeta = addStorageMeta(payload, index)\n this.cache.set(hash, withMeta)\n this.bodyHashIndex.set(withMeta.$hash, hash)\n return payload\n }\n}\n"],"mappings":"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","names":["assertEx","compact","fulfilled","AbstractArchivist","addStorageMeta","removeStorageMeta","sortByStorageMeta","ArchivistAllQuerySchema","ArchivistClearQuerySchema","ArchivistCommitQuerySchema","ArchivistConfigSchema","ArchivistDeleteQuerySchema","ArchivistInsertQuerySchema","creatableModule","PayloadBuilder","LRUCache","MemoryArchivistConfigSchema","MemoryArchivist","AbstractArchivist","configSchemas","ArchivistConfigSchema","_bodyHashIndex","_cache","bodyHashIndex","LRUCache","max","cache","config","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","allHandler","all","compact","Promise","dump","map","value","sortByStorageMeta","payload","removeStorageMeta","clearHandler","clear","emit","module","commitHandler","payloads","assertEx","settled","allSettled","Object","values","parents","commit","parent","queryPayload","schema","query","bindQuery","filter","fulfilled","result","deleteHandler","hashes","deletedHashes","hash","delete","undefined","getHandler","resolvedHash","get","Error","insertHandler","pairs","PayloadBuilder","hashPairs","insertedPayloads","insertPayloadIntoCache","index","withMeta","addStorageMeta","set","$hash","creatableModule"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAwD,MAAM,iCAAiC,CAAA;AACzH,OAAO,EAIL,eAAe,EAKf,iBAAiB,EACjB,wBAAwB,EACzB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAmB,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE1G,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,MAAM,MAAM,2BAA2B,GAAG,qCAAqC,CAAA;AAC/E,eAAO,MAAM,2BAA2B,EAAE,2BAAmE,CAAA;AAE7G,MAAM,MAAM,qBAAqB,GAAG,eAAe,CAAC;IAClD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,2BAA2B,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;CAChE,CAAC,CAAA;AAEF,KAAK,eAAe,CAAC,CAAC,SAAS,OAAO,IAAI,CAAC,GAAG;IAC5C,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,qBAAqB,CAAC,OAAO,SAAS,eAAe,CAAC,qBAAqB,CAAC,GAAG,eAAe,CAAC,qBAAqB,CAAC,IAC/H,YAAY,CAAC,OAAO,CAAC,CAAA;AACvB,qBACa,eAAe,CACxB,OAAO,SAAS,qBAAqB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,GAAG,qBAAqB,EACrG,UAAU,SAAS,wBAAwB,GAAG,wBAAwB,CAExE,SAAQ,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAC7C,YAAW,iBAAiB,EAAE,cAAc;IAE5C,OAAgB,aAAa,WAAuD;IAEpF,OAAO,CAAC,cAAc,CAAC,CAA0B;IACjD,OAAO,CAAC,MAAM,CAAC,CAAoD;IAEnE,IAAI,aAAa,sCAGhB;IAED,IAAI,KAAK,gEAGR;IAED,IAAI,GAAG,WAEN;IAED,IAAa,OAAO,aASnB;cAEwB,UAAU,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;cAK9C,YAAY,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;cAM9B,aAAa,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;cAiBlD,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;cAWtD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC;cAarD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAWvF,OAAO,CAAC,sBAAsB;CAM/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAwD,MAAM,iCAAiC,CAAA;AACzH,OAAO,EAIL,eAAe,EAKf,iBAAiB,EACjB,wBAAwB,EACzB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAmB,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE1G,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,MAAM,MAAM,2BAA2B,GAAG,qCAAqC,CAAA;AAC/E,eAAO,MAAM,2BAA2B,EAAE,2BAAmE,CAAA;AAE7G,MAAM,MAAM,qBAAqB,GAAG,eAAe,CAAC;IAClD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,2BAA2B,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;CAChE,CAAC,CAAA;AAEF,KAAK,eAAe,CAAC,CAAC,SAAS,OAAO,IAAI,CAAC,GAAG;IAC5C,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,qBAAqB,CAAC,OAAO,SAAS,eAAe,CAAC,qBAAqB,CAAC,GAAG,eAAe,CAAC,qBAAqB,CAAC,IAC/H,YAAY,CAAC,OAAO,CAAC,CAAA;AACvB,qBACa,eAAe,CACxB,OAAO,SAAS,qBAAqB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,GAAG,qBAAqB,EACrG,UAAU,SAAS,wBAAwB,GAAG,wBAAwB,CAExE,SAAQ,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAC7C,YAAW,iBAAiB,EAAE,cAAc;IAE5C,OAAgB,aAAa,WAAuD;IAEpF,OAAO,CAAC,cAAc,CAAC,CAA0B;IACjD,OAAO,CAAC,MAAM,CAAC,CAAoD;IAEnE,IAAI,aAAa,sCAGhB;IAED,IAAI,KAAK,gEAGR;IAED,IAAI,GAAG,WAEN;IAED,IAAa,OAAO,aASnB;cAEwB,UAAU,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;cAK9C,YAAY,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;cAM9B,aAAa,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;cAiBlD,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;cAWtD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC;cAarD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAWvF,OAAO,CAAC,sBAAsB;CAM/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAwD,MAAM,iCAAiC,CAAA;AACzH,OAAO,EAIL,eAAe,EAKf,iBAAiB,EACjB,wBAAwB,EACzB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAmB,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE1G,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,MAAM,MAAM,2BAA2B,GAAG,qCAAqC,CAAA;AAC/E,eAAO,MAAM,2BAA2B,EAAE,2BAAmE,CAAA;AAE7G,MAAM,MAAM,qBAAqB,GAAG,eAAe,CAAC;IAClD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,2BAA2B,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;CAChE,CAAC,CAAA;AAEF,KAAK,eAAe,CAAC,CAAC,SAAS,OAAO,IAAI,CAAC,GAAG;IAC5C,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,qBAAqB,CAAC,OAAO,SAAS,eAAe,CAAC,qBAAqB,CAAC,GAAG,eAAe,CAAC,qBAAqB,CAAC,IAC/H,YAAY,CAAC,OAAO,CAAC,CAAA;AACvB,qBACa,eAAe,CACxB,OAAO,SAAS,qBAAqB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,GAAG,qBAAqB,EACrG,UAAU,SAAS,wBAAwB,GAAG,wBAAwB,CAExE,SAAQ,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAC7C,YAAW,iBAAiB,EAAE,cAAc;IAE5C,OAAgB,aAAa,WAAuD;IAEpF,OAAO,CAAC,cAAc,CAAC,CAA0B;IACjD,OAAO,CAAC,MAAM,CAAC,CAAoD;IAEnE,IAAI,aAAa,sCAGhB;IAED,IAAI,KAAK,gEAGR;IAED,IAAI,GAAG,WAEN;IAED,IAAa,OAAO,aASnB;cAEwB,UAAU,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;cAK9C,YAAY,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;cAM9B,aAAa,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;cAiBlD,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;cAWtD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC;cAarD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAWvF,OAAO,CAAC,sBAAsB;CAM/B"}
|
package/dist/node/index.cjs
CHANGED
|
@@ -52,27 +52,6 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
52
52
|
}
|
|
53
53
|
__name(_ts_decorate, "_ts_decorate");
|
|
54
54
|
var MemoryArchivistConfigSchema = "network.xyo.archivist.memory.config";
|
|
55
|
-
var maxSequenceIndex = 10000000000n;
|
|
56
|
-
var sequenceNumber = /* @__PURE__ */ __name((index) => {
|
|
57
|
-
(0, import_assert.assertEx)(index < maxSequenceIndex, () => `index may not be larger than ${maxSequenceIndex}`);
|
|
58
|
-
return BigInt(Date.now()) * maxSequenceIndex + BigInt(index);
|
|
59
|
-
}, "sequenceNumber");
|
|
60
|
-
var addStorageMeta = /* @__PURE__ */ __name((payload, index = 0) => {
|
|
61
|
-
return {
|
|
62
|
-
...payload,
|
|
63
|
-
_sequence: sequenceNumber(index)
|
|
64
|
-
};
|
|
65
|
-
}, "addStorageMeta");
|
|
66
|
-
var sortByStorageMeta = /* @__PURE__ */ __name((payloads) => {
|
|
67
|
-
return payloads.sort((a, b) => a._sequence < b._sequence ? -1 : a._sequence > b._sequence ? 1 : 0);
|
|
68
|
-
}, "sortByStorageMeta");
|
|
69
|
-
function removeStorageMeta(payload) {
|
|
70
|
-
if (!payload)
|
|
71
|
-
return;
|
|
72
|
-
const { _sequence, ...noMeta } = payload;
|
|
73
|
-
return noMeta;
|
|
74
|
-
}
|
|
75
|
-
__name(removeStorageMeta, "removeStorageMeta");
|
|
76
55
|
var _MemoryArchivist = class _MemoryArchivist extends import_archivist_abstract.AbstractArchivist {
|
|
77
56
|
_bodyHashIndex;
|
|
78
57
|
_cache;
|
|
@@ -104,7 +83,7 @@ var _MemoryArchivist = class _MemoryArchivist extends import_archivist_abstract.
|
|
|
104
83
|
}
|
|
105
84
|
async allHandler() {
|
|
106
85
|
const all = (0, import_lodash.compact)(await Promise.all(this.cache.dump().map((value) => value[1].value)));
|
|
107
|
-
return sortByStorageMeta(all).map((payload) => removeStorageMeta(payload));
|
|
86
|
+
return (0, import_archivist_abstract.sortByStorageMeta)(all).map((payload) => (0, import_archivist_abstract.removeStorageMeta)(payload));
|
|
108
87
|
}
|
|
109
88
|
clearHandler() {
|
|
110
89
|
this.cache.clear();
|
|
@@ -140,7 +119,7 @@ var _MemoryArchivist = class _MemoryArchivist extends import_archivist_abstract.
|
|
|
140
119
|
if (resolvedHash !== hash && !result) {
|
|
141
120
|
throw new Error("Missing referenced payload");
|
|
142
121
|
}
|
|
143
|
-
return removeStorageMeta(result);
|
|
122
|
+
return (0, import_archivist_abstract.removeStorageMeta)(result);
|
|
144
123
|
}));
|
|
145
124
|
}
|
|
146
125
|
async insertHandler(payloads) {
|
|
@@ -151,7 +130,7 @@ var _MemoryArchivist = class _MemoryArchivist extends import_archivist_abstract.
|
|
|
151
130
|
return insertedPayloads;
|
|
152
131
|
}
|
|
153
132
|
insertPayloadIntoCache(payload, hash, index = 0) {
|
|
154
|
-
const withMeta = addStorageMeta(payload, index);
|
|
133
|
+
const withMeta = (0, import_archivist_abstract.addStorageMeta)(payload, index);
|
|
155
134
|
this.cache.set(hash, withMeta);
|
|
156
135
|
this.bodyHashIndex.set(withMeta.$hash, hash);
|
|
157
136
|
return payload;
|
package/dist/node/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/MemoryArchivist.ts"],"sourcesContent":["export * from './MemoryArchivist'\n","import { assertEx } from '@xylabs/assert'\nimport { Hash } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist } from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistConfig,\n ArchivistConfigSchema,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuery,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadWithMeta, WithMeta } from '@xyo-network/payload-model'\nimport { LRUCache } from 'lru-cache'\n\nexport type MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config'\nexport const MemoryArchivistConfigSchema: MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config'\n\nexport type MemoryArchivistConfig = ArchivistConfig<{\n max?: number\n schema: MemoryArchivistConfigSchema | ArchivistConfig['schema']\n}>\n\ntype WithStorageMeta<T extends Payload> = T & {\n _sequence: bigint\n}\n\nconst maxSequenceIndex = 10_000_000_000n\n\nconst sequenceNumber = (index: number) => {\n assertEx(index < maxSequenceIndex, () => `index may not be larger than ${maxSequenceIndex}`)\n return BigInt(Date.now()) * maxSequenceIndex + BigInt(index)\n}\n\nconst addStorageMeta = <T extends PayloadWithMeta>(payload: T, index = 0) => {\n return { ...payload, _sequence: sequenceNumber(index) } as WithStorageMeta<T>\n}\n\nconst sortByStorageMeta = <T extends PayloadWithMeta>(payloads: WithStorageMeta<T>[]) => {\n return payloads.sort((a, b) => (a._sequence < b._sequence ? -1 : a._sequence > b._sequence ? 1 : 0))\n}\n\nfunction removeStorageMeta<T extends PayloadWithMeta>(payload: WithStorageMeta<T>): T\nfunction removeStorageMeta<T extends PayloadWithMeta>(payload?: WithStorageMeta<T>): T | undefined\nfunction removeStorageMeta<T extends PayloadWithMeta>(payload?: WithStorageMeta<T>) {\n if (!payload) return\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { _sequence, ...noMeta } = payload as WithStorageMeta<T>\n return noMeta as T\n}\n\nexport type MemoryArchivistParams<TConfig extends AnyConfigSchema<MemoryArchivistConfig> = AnyConfigSchema<MemoryArchivistConfig>> =\n ModuleParams<TConfig>\n@creatableModule()\nexport class MemoryArchivist<\n TParams extends MemoryArchivistParams<AnyConfigSchema<MemoryArchivistConfig>> = MemoryArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n >\n extends AbstractArchivist<TParams, TEventData>\n implements ArchivistInstance, ModuleInstance\n{\n static override configSchemas = [MemoryArchivistConfigSchema, ArchivistConfigSchema]\n\n private _bodyHashIndex?: LRUCache<string, string>\n private _cache?: LRUCache<string, WithStorageMeta<PayloadWithMeta>>\n\n get bodyHashIndex() {\n this._bodyHashIndex = this._bodyHashIndex ?? new LRUCache<string, string>({ max: this.max })\n return this._bodyHashIndex\n }\n\n get cache() {\n this._cache = this._cache ?? new LRUCache<string, WithStorageMeta<PayloadWithMeta>>({ max: this.max })\n return this._cache\n }\n\n get max() {\n return this.config?.max ?? 10_000\n }\n\n override get queries() {\n return [\n ArchivistAllQuerySchema,\n ArchivistDeleteQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistCommitQuerySchema,\n ...super.queries,\n ]\n }\n\n protected override async allHandler(): Promise<PayloadWithMeta[]> {\n const all = compact(await Promise.all(this.cache.dump().map((value) => value[1].value)))\n return sortByStorageMeta(all).map((payload) => removeStorageMeta(payload))\n }\n\n protected override clearHandler(): void | Promise<void> {\n this.cache.clear()\n this.bodyHashIndex.clear()\n return this.emit('cleared', { module: this })\n }\n\n protected override async commitHandler(): Promise<WithMeta<BoundWitness>[]> {\n const payloads = assertEx(await this.allHandler(), 'Nothing to commit')\n const settled = await Promise.allSettled(\n compact(\n Object.values((await this.parents()).commit ?? [])?.map(async (parent) => {\n const queryPayload: ArchivistInsertQuery = {\n schema: ArchivistInsertQuerySchema,\n }\n const query = await this.bindQuery(queryPayload, payloads)\n return (await parent?.query(query[0], query[1]))?.[0]\n }),\n ),\n )\n await this.clearHandler()\n return compact(settled.filter(fulfilled).map((result) => result.value))\n }\n\n protected override async deleteHandler(hashes: Hash[]): Promise<string[]> {\n const deletedHashes = compact(\n await Promise.all(\n hashes.map((hash) => {\n return this.cache.delete(hash) ? hash : undefined\n }),\n ),\n )\n return deletedHashes\n }\n\n protected override getHandler(hashes: string[]): Promisable<PayloadWithMeta[]> {\n return compact(\n hashes.map((hash) => {\n const resolvedHash = this.bodyHashIndex.get(hash) ?? hash\n const result = this.cache.get(resolvedHash)\n if (resolvedHash !== hash && !result) {\n throw new Error('Missing referenced payload')\n }\n return removeStorageMeta(result)\n }),\n )\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]> {\n const pairs = await PayloadBuilder.hashPairs(payloads)\n const insertedPayloads = await Promise.all(\n pairs.map(([payload, hash]) => {\n return this.insertPayloadIntoCache(payload, hash)\n }),\n )\n\n return insertedPayloads\n }\n\n private insertPayloadIntoCache(payload: PayloadWithMeta, hash: string, index = 0): PayloadWithMeta {\n const withMeta = addStorageMeta(payload, index)\n this.cache.set(hash, withMeta)\n this.bodyHashIndex.set(withMeta.$hash, hash)\n return payload\n }\n}\n"],"mappings":"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","names":["MemoryArchivistConfigSchema","maxSequenceIndex","sequenceNumber","index","assertEx","BigInt","Date","now","addStorageMeta","payload","_sequence","sortByStorageMeta","payloads","sort","a","b","removeStorageMeta","noMeta","MemoryArchivist","AbstractArchivist","_bodyHashIndex","_cache","bodyHashIndex","LRUCache","max","cache","config","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","allHandler","all","compact","Promise","dump","map","value","clearHandler","clear","emit","module","commitHandler","settled","allSettled","Object","values","parents","commit","parent","queryPayload","schema","query","bindQuery","_a","filter","fulfilled","result","deleteHandler","hashes","deletedHashes","hash","delete","undefined","getHandler","resolvedHash","get","Error","insertHandler","pairs","PayloadBuilder","hashPairs","insertedPayloads","insertPayloadIntoCache","withMeta","set","$hash","configSchemas","ArchivistConfigSchema","creatableModule"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/MemoryArchivist.ts"],"sourcesContent":["export * from './MemoryArchivist'\n","import { assertEx } from '@xylabs/assert'\nimport { Hash } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta } from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistConfig,\n ArchivistConfigSchema,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuery,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadWithMeta, WithMeta } from '@xyo-network/payload-model'\nimport { LRUCache } from 'lru-cache'\n\nexport type MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config'\nexport const MemoryArchivistConfigSchema: MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config'\n\nexport type MemoryArchivistConfig = ArchivistConfig<{\n max?: number\n schema: MemoryArchivistConfigSchema | ArchivistConfig['schema']\n}>\n\ntype WithStorageMeta<T extends Payload> = T & {\n _sequence: bigint\n}\n\nexport type MemoryArchivistParams<TConfig extends AnyConfigSchema<MemoryArchivistConfig> = AnyConfigSchema<MemoryArchivistConfig>> =\n ModuleParams<TConfig>\n@creatableModule()\nexport class MemoryArchivist<\n TParams extends MemoryArchivistParams<AnyConfigSchema<MemoryArchivistConfig>> = MemoryArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n >\n extends AbstractArchivist<TParams, TEventData>\n implements ArchivistInstance, ModuleInstance\n{\n static override configSchemas = [MemoryArchivistConfigSchema, ArchivistConfigSchema]\n\n private _bodyHashIndex?: LRUCache<string, string>\n private _cache?: LRUCache<string, WithStorageMeta<PayloadWithMeta>>\n\n get bodyHashIndex() {\n this._bodyHashIndex = this._bodyHashIndex ?? new LRUCache<string, string>({ max: this.max })\n return this._bodyHashIndex\n }\n\n get cache() {\n this._cache = this._cache ?? new LRUCache<string, WithStorageMeta<PayloadWithMeta>>({ max: this.max })\n return this._cache\n }\n\n get max() {\n return this.config?.max ?? 10_000\n }\n\n override get queries() {\n return [\n ArchivistAllQuerySchema,\n ArchivistDeleteQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistCommitQuerySchema,\n ...super.queries,\n ]\n }\n\n protected override async allHandler(): Promise<PayloadWithMeta[]> {\n const all = compact(await Promise.all(this.cache.dump().map((value) => value[1].value)))\n return sortByStorageMeta(all).map((payload) => removeStorageMeta(payload))\n }\n\n protected override clearHandler(): void | Promise<void> {\n this.cache.clear()\n this.bodyHashIndex.clear()\n return this.emit('cleared', { module: this })\n }\n\n protected override async commitHandler(): Promise<WithMeta<BoundWitness>[]> {\n const payloads = assertEx(await this.allHandler(), 'Nothing to commit')\n const settled = await Promise.allSettled(\n compact(\n Object.values((await this.parents()).commit ?? [])?.map(async (parent) => {\n const queryPayload: ArchivistInsertQuery = {\n schema: ArchivistInsertQuerySchema,\n }\n const query = await this.bindQuery(queryPayload, payloads)\n return (await parent?.query(query[0], query[1]))?.[0]\n }),\n ),\n )\n await this.clearHandler()\n return compact(settled.filter(fulfilled).map((result) => result.value))\n }\n\n protected override async deleteHandler(hashes: Hash[]): Promise<string[]> {\n const deletedHashes = compact(\n await Promise.all(\n hashes.map((hash) => {\n return this.cache.delete(hash) ? hash : undefined\n }),\n ),\n )\n return deletedHashes\n }\n\n protected override getHandler(hashes: string[]): Promisable<PayloadWithMeta[]> {\n return compact(\n hashes.map((hash) => {\n const resolvedHash = this.bodyHashIndex.get(hash) ?? hash\n const result = this.cache.get(resolvedHash)\n if (resolvedHash !== hash && !result) {\n throw new Error('Missing referenced payload')\n }\n return removeStorageMeta(result)\n }),\n )\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]> {\n const pairs = await PayloadBuilder.hashPairs(payloads)\n const insertedPayloads = await Promise.all(\n pairs.map(([payload, hash]) => {\n return this.insertPayloadIntoCache(payload, hash)\n }),\n )\n\n return insertedPayloads\n }\n\n private insertPayloadIntoCache(payload: PayloadWithMeta, hash: string, index = 0): PayloadWithMeta {\n const withMeta = addStorageMeta(payload, index)\n this.cache.set(hash, withMeta)\n this.bodyHashIndex.set(withMeta.$hash, hash)\n return payload\n }\n}\n"],"mappings":"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","names":["MemoryArchivistConfigSchema","MemoryArchivist","AbstractArchivist","_bodyHashIndex","_cache","bodyHashIndex","LRUCache","max","cache","config","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","allHandler","all","compact","Promise","dump","map","value","sortByStorageMeta","payload","removeStorageMeta","clearHandler","clear","emit","module","commitHandler","payloads","assertEx","settled","allSettled","Object","values","parents","commit","parent","queryPayload","schema","query","bindQuery","_a","filter","fulfilled","result","deleteHandler","hashes","deletedHashes","hash","delete","undefined","getHandler","resolvedHash","get","Error","insertHandler","pairs","PayloadBuilder","hashPairs","insertedPayloads","insertPayloadIntoCache","index","withMeta","addStorageMeta","set","$hash","configSchemas","ArchivistConfigSchema","creatableModule"]}
|
package/dist/node/index.js
CHANGED
|
@@ -10,7 +10,7 @@ var __publicField = (obj, key, value) => {
|
|
|
10
10
|
import { assertEx } from "@xylabs/assert";
|
|
11
11
|
import { compact } from "@xylabs/lodash";
|
|
12
12
|
import { fulfilled } from "@xylabs/promise";
|
|
13
|
-
import { AbstractArchivist } from "@xyo-network/archivist-abstract";
|
|
13
|
+
import { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta } from "@xyo-network/archivist-abstract";
|
|
14
14
|
import { ArchivistAllQuerySchema, ArchivistClearQuerySchema, ArchivistCommitQuerySchema, ArchivistConfigSchema, ArchivistDeleteQuerySchema, ArchivistInsertQuerySchema } from "@xyo-network/archivist-model";
|
|
15
15
|
import { creatableModule } from "@xyo-network/module-model";
|
|
16
16
|
import { PayloadBuilder } from "@xyo-network/payload-builder";
|
|
@@ -27,27 +27,6 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
27
27
|
}
|
|
28
28
|
__name(_ts_decorate, "_ts_decorate");
|
|
29
29
|
var MemoryArchivistConfigSchema = "network.xyo.archivist.memory.config";
|
|
30
|
-
var maxSequenceIndex = 10000000000n;
|
|
31
|
-
var sequenceNumber = /* @__PURE__ */ __name((index) => {
|
|
32
|
-
assertEx(index < maxSequenceIndex, () => `index may not be larger than ${maxSequenceIndex}`);
|
|
33
|
-
return BigInt(Date.now()) * maxSequenceIndex + BigInt(index);
|
|
34
|
-
}, "sequenceNumber");
|
|
35
|
-
var addStorageMeta = /* @__PURE__ */ __name((payload, index = 0) => {
|
|
36
|
-
return {
|
|
37
|
-
...payload,
|
|
38
|
-
_sequence: sequenceNumber(index)
|
|
39
|
-
};
|
|
40
|
-
}, "addStorageMeta");
|
|
41
|
-
var sortByStorageMeta = /* @__PURE__ */ __name((payloads) => {
|
|
42
|
-
return payloads.sort((a, b) => a._sequence < b._sequence ? -1 : a._sequence > b._sequence ? 1 : 0);
|
|
43
|
-
}, "sortByStorageMeta");
|
|
44
|
-
function removeStorageMeta(payload) {
|
|
45
|
-
if (!payload)
|
|
46
|
-
return;
|
|
47
|
-
const { _sequence, ...noMeta } = payload;
|
|
48
|
-
return noMeta;
|
|
49
|
-
}
|
|
50
|
-
__name(removeStorageMeta, "removeStorageMeta");
|
|
51
30
|
var _MemoryArchivist = class _MemoryArchivist extends AbstractArchivist {
|
|
52
31
|
_bodyHashIndex;
|
|
53
32
|
_cache;
|
package/dist/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/MemoryArchivist.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { Hash } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist } from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistConfig,\n ArchivistConfigSchema,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuery,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadWithMeta, WithMeta } from '@xyo-network/payload-model'\nimport { LRUCache } from 'lru-cache'\n\nexport type MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config'\nexport const MemoryArchivistConfigSchema: MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config'\n\nexport type MemoryArchivistConfig = ArchivistConfig<{\n max?: number\n schema: MemoryArchivistConfigSchema | ArchivistConfig['schema']\n}>\n\ntype WithStorageMeta<T extends Payload> = T & {\n _sequence: bigint\n}\n\nconst maxSequenceIndex = 10_000_000_000n\n\nconst sequenceNumber = (index: number) => {\n assertEx(index < maxSequenceIndex, () => `index may not be larger than ${maxSequenceIndex}`)\n return BigInt(Date.now()) * maxSequenceIndex + BigInt(index)\n}\n\nconst addStorageMeta = <T extends PayloadWithMeta>(payload: T, index = 0) => {\n return { ...payload, _sequence: sequenceNumber(index) } as WithStorageMeta<T>\n}\n\nconst sortByStorageMeta = <T extends PayloadWithMeta>(payloads: WithStorageMeta<T>[]) => {\n return payloads.sort((a, b) => (a._sequence < b._sequence ? -1 : a._sequence > b._sequence ? 1 : 0))\n}\n\nfunction removeStorageMeta<T extends PayloadWithMeta>(payload: WithStorageMeta<T>): T\nfunction removeStorageMeta<T extends PayloadWithMeta>(payload?: WithStorageMeta<T>): T | undefined\nfunction removeStorageMeta<T extends PayloadWithMeta>(payload?: WithStorageMeta<T>) {\n if (!payload) return\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { _sequence, ...noMeta } = payload as WithStorageMeta<T>\n return noMeta as T\n}\n\nexport type MemoryArchivistParams<TConfig extends AnyConfigSchema<MemoryArchivistConfig> = AnyConfigSchema<MemoryArchivistConfig>> =\n ModuleParams<TConfig>\n@creatableModule()\nexport class MemoryArchivist<\n TParams extends MemoryArchivistParams<AnyConfigSchema<MemoryArchivistConfig>> = MemoryArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n >\n extends AbstractArchivist<TParams, TEventData>\n implements ArchivistInstance, ModuleInstance\n{\n static override configSchemas = [MemoryArchivistConfigSchema, ArchivistConfigSchema]\n\n private _bodyHashIndex?: LRUCache<string, string>\n private _cache?: LRUCache<string, WithStorageMeta<PayloadWithMeta>>\n\n get bodyHashIndex() {\n this._bodyHashIndex = this._bodyHashIndex ?? new LRUCache<string, string>({ max: this.max })\n return this._bodyHashIndex\n }\n\n get cache() {\n this._cache = this._cache ?? new LRUCache<string, WithStorageMeta<PayloadWithMeta>>({ max: this.max })\n return this._cache\n }\n\n get max() {\n return this.config?.max ?? 10_000\n }\n\n override get queries() {\n return [\n ArchivistAllQuerySchema,\n ArchivistDeleteQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistCommitQuerySchema,\n ...super.queries,\n ]\n }\n\n protected override async allHandler(): Promise<PayloadWithMeta[]> {\n const all = compact(await Promise.all(this.cache.dump().map((value) => value[1].value)))\n return sortByStorageMeta(all).map((payload) => removeStorageMeta(payload))\n }\n\n protected override clearHandler(): void | Promise<void> {\n this.cache.clear()\n this.bodyHashIndex.clear()\n return this.emit('cleared', { module: this })\n }\n\n protected override async commitHandler(): Promise<WithMeta<BoundWitness>[]> {\n const payloads = assertEx(await this.allHandler(), 'Nothing to commit')\n const settled = await Promise.allSettled(\n compact(\n Object.values((await this.parents()).commit ?? [])?.map(async (parent) => {\n const queryPayload: ArchivistInsertQuery = {\n schema: ArchivistInsertQuerySchema,\n }\n const query = await this.bindQuery(queryPayload, payloads)\n return (await parent?.query(query[0], query[1]))?.[0]\n }),\n ),\n )\n await this.clearHandler()\n return compact(settled.filter(fulfilled).map((result) => result.value))\n }\n\n protected override async deleteHandler(hashes: Hash[]): Promise<string[]> {\n const deletedHashes = compact(\n await Promise.all(\n hashes.map((hash) => {\n return this.cache.delete(hash) ? hash : undefined\n }),\n ),\n )\n return deletedHashes\n }\n\n protected override getHandler(hashes: string[]): Promisable<PayloadWithMeta[]> {\n return compact(\n hashes.map((hash) => {\n const resolvedHash = this.bodyHashIndex.get(hash) ?? hash\n const result = this.cache.get(resolvedHash)\n if (resolvedHash !== hash && !result) {\n throw new Error('Missing referenced payload')\n }\n return removeStorageMeta(result)\n }),\n )\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]> {\n const pairs = await PayloadBuilder.hashPairs(payloads)\n const insertedPayloads = await Promise.all(\n pairs.map(([payload, hash]) => {\n return this.insertPayloadIntoCache(payload, hash)\n }),\n )\n\n return insertedPayloads\n }\n\n private insertPayloadIntoCache(payload: PayloadWithMeta, hash: string, index = 0): PayloadWithMeta {\n const withMeta = addStorageMeta(payload, index)\n this.cache.set(hash, withMeta)\n this.bodyHashIndex.set(withMeta.$hash, hash)\n return payload\n }\n}\n"],"mappings":"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","names":["assertEx","compact","fulfilled","AbstractArchivist","ArchivistAllQuerySchema","ArchivistClearQuerySchema","ArchivistCommitQuerySchema","ArchivistConfigSchema","ArchivistDeleteQuerySchema","ArchivistInsertQuerySchema","creatableModule","PayloadBuilder","LRUCache","MemoryArchivistConfigSchema","maxSequenceIndex","sequenceNumber","index","assertEx","BigInt","Date","now","addStorageMeta","payload","_sequence","sortByStorageMeta","payloads","sort","a","b","removeStorageMeta","noMeta","MemoryArchivist","AbstractArchivist","_bodyHashIndex","_cache","bodyHashIndex","LRUCache","max","cache","config","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","allHandler","all","compact","Promise","dump","map","value","clearHandler","clear","emit","module","commitHandler","settled","allSettled","Object","values","parents","commit","parent","queryPayload","schema","query","bindQuery","_a","filter","fulfilled","result","deleteHandler","hashes","deletedHashes","hash","delete","undefined","getHandler","resolvedHash","get","Error","insertHandler","pairs","PayloadBuilder","hashPairs","insertedPayloads","insertPayloadIntoCache","withMeta","set","$hash","configSchemas","ArchivistConfigSchema","creatableModule"]}
|
|
1
|
+
{"version":3,"sources":["../../src/MemoryArchivist.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { Hash } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta } from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistConfig,\n ArchivistConfigSchema,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuery,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadWithMeta, WithMeta } from '@xyo-network/payload-model'\nimport { LRUCache } from 'lru-cache'\n\nexport type MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config'\nexport const MemoryArchivistConfigSchema: MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config'\n\nexport type MemoryArchivistConfig = ArchivistConfig<{\n max?: number\n schema: MemoryArchivistConfigSchema | ArchivistConfig['schema']\n}>\n\ntype WithStorageMeta<T extends Payload> = T & {\n _sequence: bigint\n}\n\nexport type MemoryArchivistParams<TConfig extends AnyConfigSchema<MemoryArchivistConfig> = AnyConfigSchema<MemoryArchivistConfig>> =\n ModuleParams<TConfig>\n@creatableModule()\nexport class MemoryArchivist<\n TParams extends MemoryArchivistParams<AnyConfigSchema<MemoryArchivistConfig>> = MemoryArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n >\n extends AbstractArchivist<TParams, TEventData>\n implements ArchivistInstance, ModuleInstance\n{\n static override configSchemas = [MemoryArchivistConfigSchema, ArchivistConfigSchema]\n\n private _bodyHashIndex?: LRUCache<string, string>\n private _cache?: LRUCache<string, WithStorageMeta<PayloadWithMeta>>\n\n get bodyHashIndex() {\n this._bodyHashIndex = this._bodyHashIndex ?? new LRUCache<string, string>({ max: this.max })\n return this._bodyHashIndex\n }\n\n get cache() {\n this._cache = this._cache ?? new LRUCache<string, WithStorageMeta<PayloadWithMeta>>({ max: this.max })\n return this._cache\n }\n\n get max() {\n return this.config?.max ?? 10_000\n }\n\n override get queries() {\n return [\n ArchivistAllQuerySchema,\n ArchivistDeleteQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistCommitQuerySchema,\n ...super.queries,\n ]\n }\n\n protected override async allHandler(): Promise<PayloadWithMeta[]> {\n const all = compact(await Promise.all(this.cache.dump().map((value) => value[1].value)))\n return sortByStorageMeta(all).map((payload) => removeStorageMeta(payload))\n }\n\n protected override clearHandler(): void | Promise<void> {\n this.cache.clear()\n this.bodyHashIndex.clear()\n return this.emit('cleared', { module: this })\n }\n\n protected override async commitHandler(): Promise<WithMeta<BoundWitness>[]> {\n const payloads = assertEx(await this.allHandler(), 'Nothing to commit')\n const settled = await Promise.allSettled(\n compact(\n Object.values((await this.parents()).commit ?? [])?.map(async (parent) => {\n const queryPayload: ArchivistInsertQuery = {\n schema: ArchivistInsertQuerySchema,\n }\n const query = await this.bindQuery(queryPayload, payloads)\n return (await parent?.query(query[0], query[1]))?.[0]\n }),\n ),\n )\n await this.clearHandler()\n return compact(settled.filter(fulfilled).map((result) => result.value))\n }\n\n protected override async deleteHandler(hashes: Hash[]): Promise<string[]> {\n const deletedHashes = compact(\n await Promise.all(\n hashes.map((hash) => {\n return this.cache.delete(hash) ? hash : undefined\n }),\n ),\n )\n return deletedHashes\n }\n\n protected override getHandler(hashes: string[]): Promisable<PayloadWithMeta[]> {\n return compact(\n hashes.map((hash) => {\n const resolvedHash = this.bodyHashIndex.get(hash) ?? hash\n const result = this.cache.get(resolvedHash)\n if (resolvedHash !== hash && !result) {\n throw new Error('Missing referenced payload')\n }\n return removeStorageMeta(result)\n }),\n )\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]> {\n const pairs = await PayloadBuilder.hashPairs(payloads)\n const insertedPayloads = await Promise.all(\n pairs.map(([payload, hash]) => {\n return this.insertPayloadIntoCache(payload, hash)\n }),\n )\n\n return insertedPayloads\n }\n\n private insertPayloadIntoCache(payload: PayloadWithMeta, hash: string, index = 0): PayloadWithMeta {\n const withMeta = addStorageMeta(payload, index)\n this.cache.set(hash, withMeta)\n this.bodyHashIndex.set(withMeta.$hash, hash)\n return payload\n }\n}\n"],"mappings":"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","names":["assertEx","compact","fulfilled","AbstractArchivist","addStorageMeta","removeStorageMeta","sortByStorageMeta","ArchivistAllQuerySchema","ArchivistClearQuerySchema","ArchivistCommitQuerySchema","ArchivistConfigSchema","ArchivistDeleteQuerySchema","ArchivistInsertQuerySchema","creatableModule","PayloadBuilder","LRUCache","MemoryArchivistConfigSchema","MemoryArchivist","AbstractArchivist","_bodyHashIndex","_cache","bodyHashIndex","LRUCache","max","cache","config","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","allHandler","all","compact","Promise","dump","map","value","sortByStorageMeta","payload","removeStorageMeta","clearHandler","clear","emit","module","commitHandler","payloads","assertEx","settled","allSettled","Object","values","parents","commit","parent","queryPayload","schema","query","bindQuery","_a","filter","fulfilled","result","deleteHandler","hashes","deletedHashes","hash","delete","undefined","getHandler","resolvedHash","get","Error","insertHandler","pairs","PayloadBuilder","hashPairs","insertedPayloads","insertPayloadIntoCache","index","withMeta","addStorageMeta","set","$hash","configSchemas","ArchivistConfigSchema","creatableModule"]}
|
package/package.json
CHANGED
|
@@ -14,18 +14,18 @@
|
|
|
14
14
|
"@xylabs/hex": "^2.14.2",
|
|
15
15
|
"@xylabs/lodash": "^2.14.2",
|
|
16
16
|
"@xylabs/promise": "^2.14.2",
|
|
17
|
-
"@xyo-network/archivist-abstract": "~2.90.
|
|
18
|
-
"@xyo-network/archivist-model": "~2.90.
|
|
19
|
-
"@xyo-network/boundwitness-model": "~2.90.
|
|
20
|
-
"@xyo-network/module-model": "~2.90.
|
|
21
|
-
"@xyo-network/payload-builder": "~2.90.
|
|
22
|
-
"@xyo-network/payload-model": "~2.90.
|
|
17
|
+
"@xyo-network/archivist-abstract": "~2.90.19",
|
|
18
|
+
"@xyo-network/archivist-model": "~2.90.19",
|
|
19
|
+
"@xyo-network/boundwitness-model": "~2.90.19",
|
|
20
|
+
"@xyo-network/module-model": "~2.90.19",
|
|
21
|
+
"@xyo-network/payload-builder": "~2.90.19",
|
|
22
|
+
"@xyo-network/payload-model": "~2.90.19",
|
|
23
23
|
"lru-cache": "^10.2.0"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@xylabs/ts-scripts-yarn3": "^3.2.42",
|
|
27
27
|
"@xylabs/tsconfig": "^3.2.42",
|
|
28
|
-
"@xyo-network/account": "~2.90.
|
|
28
|
+
"@xyo-network/account": "~2.90.19",
|
|
29
29
|
"typescript": "^5.3.3"
|
|
30
30
|
},
|
|
31
31
|
"description": "Primary SDK for using XYO Protocol 2.0",
|
|
@@ -67,6 +67,6 @@
|
|
|
67
67
|
"url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
|
|
68
68
|
},
|
|
69
69
|
"sideEffects": false,
|
|
70
|
-
"version": "2.90.
|
|
70
|
+
"version": "2.90.19",
|
|
71
71
|
"type": "module"
|
|
72
72
|
}
|
package/src/MemoryArchivist.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { assertEx } from '@xylabs/assert'
|
|
|
2
2
|
import { Hash } from '@xylabs/hex'
|
|
3
3
|
import { compact } from '@xylabs/lodash'
|
|
4
4
|
import { fulfilled, Promisable } from '@xylabs/promise'
|
|
5
|
-
import { AbstractArchivist } from '@xyo-network/archivist-abstract'
|
|
5
|
+
import { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta } from '@xyo-network/archivist-abstract'
|
|
6
6
|
import {
|
|
7
7
|
ArchivistAllQuerySchema,
|
|
8
8
|
ArchivistClearQuerySchema,
|
|
@@ -33,30 +33,6 @@ type WithStorageMeta<T extends Payload> = T & {
|
|
|
33
33
|
_sequence: bigint
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
const maxSequenceIndex = 10_000_000_000n
|
|
37
|
-
|
|
38
|
-
const sequenceNumber = (index: number) => {
|
|
39
|
-
assertEx(index < maxSequenceIndex, () => `index may not be larger than ${maxSequenceIndex}`)
|
|
40
|
-
return BigInt(Date.now()) * maxSequenceIndex + BigInt(index)
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const addStorageMeta = <T extends PayloadWithMeta>(payload: T, index = 0) => {
|
|
44
|
-
return { ...payload, _sequence: sequenceNumber(index) } as WithStorageMeta<T>
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const sortByStorageMeta = <T extends PayloadWithMeta>(payloads: WithStorageMeta<T>[]) => {
|
|
48
|
-
return payloads.sort((a, b) => (a._sequence < b._sequence ? -1 : a._sequence > b._sequence ? 1 : 0))
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function removeStorageMeta<T extends PayloadWithMeta>(payload: WithStorageMeta<T>): T
|
|
52
|
-
function removeStorageMeta<T extends PayloadWithMeta>(payload?: WithStorageMeta<T>): T | undefined
|
|
53
|
-
function removeStorageMeta<T extends PayloadWithMeta>(payload?: WithStorageMeta<T>) {
|
|
54
|
-
if (!payload) return
|
|
55
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
56
|
-
const { _sequence, ...noMeta } = payload as WithStorageMeta<T>
|
|
57
|
-
return noMeta as T
|
|
58
|
-
}
|
|
59
|
-
|
|
60
36
|
export type MemoryArchivistParams<TConfig extends AnyConfigSchema<MemoryArchivistConfig> = AnyConfigSchema<MemoryArchivistConfig>> =
|
|
61
37
|
ModuleParams<TConfig>
|
|
62
38
|
@creatableModule()
|