@xyo-network/archivist-memory 3.5.2 → 3.6.0-rc.2
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.
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { Hash } from '@xylabs/hex';
|
|
2
2
|
import { EmptyObject, WithAdditional } from '@xylabs/object';
|
|
3
3
|
import { Promisable } from '@xylabs/promise';
|
|
4
|
-
import { AbstractArchivist
|
|
4
|
+
import { AbstractArchivist } from '@xyo-network/archivist-abstract';
|
|
5
5
|
import { ArchivistConfig, ArchivistModuleEventData, ArchivistNextOptions, AttachableArchivistInstance } from '@xyo-network/archivist-model';
|
|
6
6
|
import { BoundWitness } from '@xyo-network/boundwitness-model';
|
|
7
7
|
import { AnyConfigSchema, ModuleInstance, ModuleParams } from '@xyo-network/module-model';
|
|
8
|
-
import { Payload,
|
|
8
|
+
import { Payload, Schema, WithStorageMeta } from '@xyo-network/payload-model';
|
|
9
9
|
import { LRUCache } from 'lru-cache';
|
|
10
10
|
export type MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config';
|
|
11
11
|
export declare const MemoryArchivistConfigSchema: MemoryArchivistConfigSchema;
|
|
@@ -19,16 +19,18 @@ export declare class MemoryArchivist<TParams extends MemoryArchivistParams<AnyCo
|
|
|
19
19
|
private _cache?;
|
|
20
20
|
private _dataHashIndex?;
|
|
21
21
|
get queries(): string[];
|
|
22
|
-
protected get cache(): LRUCache<Lowercase<string>, WithStorageMeta<
|
|
22
|
+
protected get cache(): LRUCache<Lowercase<string>, WithStorageMeta<{
|
|
23
|
+
schema: string;
|
|
24
|
+
} & import("@xyo-network/payload-model").PayloadFields>, unknown>;
|
|
23
25
|
protected get dataHashIndex(): LRUCache<Lowercase<string>, Lowercase<string>, unknown>;
|
|
24
26
|
protected get max(): number;
|
|
25
|
-
protected allHandler(): Promisable<
|
|
27
|
+
protected allHandler(): Promisable<Payload[]>;
|
|
26
28
|
protected clearHandler(): void | Promise<void>;
|
|
27
|
-
protected commitHandler(): Promise<
|
|
28
|
-
protected deleteHandler(hashes: Hash[]):
|
|
29
|
-
protected getHandler(hashes: Hash[]): Promisable<
|
|
30
|
-
protected insertHandler(payloads: Payload[]): Promise<
|
|
31
|
-
protected nextHandler(options?: ArchivistNextOptions): Promise<
|
|
29
|
+
protected commitHandler(): Promise<BoundWitness[]>;
|
|
30
|
+
protected deleteHandler(hashes: Hash[]): Promise<Hash[]>;
|
|
31
|
+
protected getHandler(hashes: Hash[]): Promisable<Payload[]>;
|
|
32
|
+
protected insertHandler(payloads: Payload[]): Promise<Payload[]>;
|
|
33
|
+
protected nextHandler(options?: ArchivistNextOptions): Promise<Payload[]>;
|
|
32
34
|
private insertPayloadIntoCache;
|
|
33
35
|
private rebuildDataHashIndex;
|
|
34
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC5D,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,
|
|
1
|
+
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC5D,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,EAIL,eAAe,EAIf,wBAAwB,EACxB,oBAAoB,EAEpB,2BAA2B,EAC5B,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EACL,eAAe,EAAmB,cAAc,EAAE,YAAY,EAC/D,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,OAAO,EAAE,MAAM,EAAE,eAAe,EACjC,MAAM,4BAA4B,CAAA;AACnC,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,CAAC,OAAO,SAAS,OAAO,GAAG,WAAW,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO,SAAS,MAAM,GAAG,IAAI,GAAG,IAAI,IAAI,eAAe,CAC5I,cAAc,CACZ;IACE,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,EACD,OAAO,CACR,EACD,OAAO,SAAS,MAAM,GAAG,OAAO,GAAG,2BAA2B,GAAG,eAAe,CAAC,QAAQ,CAAC,CAC3F,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,CAC1B,OAAO,SAAS,qBAAqB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,GAAG,qBAAqB,EACrG,UAAU,SAAS,wBAAwB,GAAG,wBAAwB,CAEtE,SAAQ,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAC7C,YAAW,2BAA2B,EAAE,cAAc;IACtD,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAwD;IACxG,gBAAyB,mBAAmB,EAAE,MAAM,CAA8B;IAElF,OAAO,CAAC,MAAM,CAAC,CAA0C;IACzD,OAAO,CAAC,cAAc,CAAC,CAAsB;IAE7C,IAAa,OAAO,aAUnB;IAED,SAAS,KAAK,KAAK;;sEAGlB;IAED,SAAS,KAAK,aAAa,4DAG1B;IAED,SAAS,KAAK,GAAG,WAEhB;cAEkB,UAAU,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;cAKnC,YAAY,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;cAM9B,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;cAaxC,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;cAepD,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;cAW3C,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;cAStD,WAAW,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAa1E,sBAAsB;YAOtB,oBAAoB;CAQnC"}
|
package/dist/neutral/index.mjs
CHANGED
|
@@ -5,7 +5,7 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
|
|
|
5
5
|
import { assertEx } from "@xylabs/assert";
|
|
6
6
|
import { exists } from "@xylabs/exists";
|
|
7
7
|
import { fulfilled } from "@xylabs/promise";
|
|
8
|
-
import { AbstractArchivist
|
|
8
|
+
import { AbstractArchivist } from "@xyo-network/archivist-abstract";
|
|
9
9
|
import { ArchivistAllQuerySchema, ArchivistClearQuerySchema, ArchivistCommitQuerySchema, ArchivistDeleteQuerySchema, ArchivistInsertQuerySchema, ArchivistNextQuerySchema } from "@xyo-network/archivist-model";
|
|
10
10
|
import { creatableModule } from "@xyo-network/module-model";
|
|
11
11
|
import { PayloadBuilder } from "@xyo-network/payload-builder";
|
|
@@ -57,7 +57,7 @@ var MemoryArchivist = class extends AbstractArchivist {
|
|
|
57
57
|
}
|
|
58
58
|
allHandler() {
|
|
59
59
|
const all = this.cache.dump().map(([, item]) => item.value).filter(exists);
|
|
60
|
-
return sortByStorageMeta(all)
|
|
60
|
+
return PayloadBuilder.sortByStorageMeta(all);
|
|
61
61
|
}
|
|
62
62
|
clearHandler() {
|
|
63
63
|
this.cache.clear();
|
|
@@ -78,14 +78,15 @@ var MemoryArchivist = class extends AbstractArchivist {
|
|
|
78
78
|
await this.clearHandler();
|
|
79
79
|
return settled.filter(fulfilled).map((result) => result.value).filter(exists);
|
|
80
80
|
}
|
|
81
|
-
deleteHandler(hashes) {
|
|
82
|
-
const deletedHashes = this.cache.dump().map(([key, item]) => {
|
|
83
|
-
|
|
81
|
+
async deleteHandler(hashes) {
|
|
82
|
+
const deletedHashes = (await Promise.all(this.cache.dump().map(async ([key, item]) => {
|
|
83
|
+
const itemValueDataHash = await PayloadBuilder.dataHash(item.value);
|
|
84
|
+
if (hashes.includes(key) || hashes.includes(itemValueDataHash)) {
|
|
84
85
|
this.cache.delete(key);
|
|
85
86
|
return key;
|
|
86
87
|
}
|
|
87
|
-
}).filter(exists);
|
|
88
|
-
this.rebuildDataHashIndex();
|
|
88
|
+
}))).filter(exists);
|
|
89
|
+
await this.rebuildDataHashIndex();
|
|
89
90
|
return deletedHashes;
|
|
90
91
|
}
|
|
91
92
|
getHandler(hashes) {
|
|
@@ -95,17 +96,15 @@ var MemoryArchivist = class extends AbstractArchivist {
|
|
|
95
96
|
if (resolvedHash !== hash && !result) {
|
|
96
97
|
throw new Error("Missing referenced payload");
|
|
97
98
|
}
|
|
98
|
-
return
|
|
99
|
+
return result;
|
|
99
100
|
}).filter(exists);
|
|
100
101
|
}
|
|
101
102
|
async insertHandler(payloads) {
|
|
102
|
-
const pairs = await PayloadBuilder.hashPairs(payloads
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
});
|
|
108
|
-
return removeStorageMeta(insertedPayloads);
|
|
103
|
+
const pairs = await PayloadBuilder.hashPairs(payloads);
|
|
104
|
+
const insertedPayloads = await Promise.all(pairs.map(async ([payload, hash]) => {
|
|
105
|
+
return this.cache.get(hash) ?? await this.insertPayloadIntoCache(payload);
|
|
106
|
+
}));
|
|
107
|
+
return insertedPayloads;
|
|
109
108
|
}
|
|
110
109
|
async nextHandler(options) {
|
|
111
110
|
const { limit, offset, order } = options ?? {};
|
|
@@ -117,19 +116,20 @@ var MemoryArchivist = class extends AbstractArchivist {
|
|
|
117
116
|
const startIndex = offset ? allPairs.findIndex(([, hash]) => hash === offset) + 1 : 0;
|
|
118
117
|
return allPairs.slice(startIndex, limit ? startIndex + limit : void 0).map(([payload]) => payload);
|
|
119
118
|
}
|
|
120
|
-
insertPayloadIntoCache(payload
|
|
121
|
-
const withMeta = addStorageMeta(payload
|
|
122
|
-
this.cache.set(
|
|
123
|
-
this.dataHashIndex.set(withMeta
|
|
119
|
+
async insertPayloadIntoCache(payload) {
|
|
120
|
+
const withMeta = await PayloadBuilder.addStorageMeta(payload);
|
|
121
|
+
this.cache.set(withMeta._hash, withMeta);
|
|
122
|
+
this.dataHashIndex.set(withMeta._dataHash, withMeta._hash);
|
|
124
123
|
return withMeta;
|
|
125
124
|
}
|
|
126
|
-
rebuildDataHashIndex() {
|
|
125
|
+
async rebuildDataHashIndex() {
|
|
127
126
|
this._dataHashIndex = new LRUCache({
|
|
128
127
|
max: this.max
|
|
129
128
|
});
|
|
130
129
|
const pairs = this.cache.dump();
|
|
131
130
|
for (const [hash, payload] of pairs) {
|
|
132
|
-
|
|
131
|
+
const dataHash = await PayloadBuilder.dataHash(payload.value);
|
|
132
|
+
this.dataHashIndex.set(dataHash, hash);
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
135
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/MemoryArchivist.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Hash } from '@xylabs/hex'\nimport { EmptyObject, WithAdditional } from '@xylabs/object'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport {\n AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta, WithStorageMeta,\n} from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistConfig,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuery,\n ArchivistInsertQuerySchema,\n ArchivistModuleEventData,\n ArchivistNextOptions,\n ArchivistNextQuerySchema,\n AttachableArchivistInstance,\n} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport {\n AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams,\n} from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport {\n Payload, PayloadWithMeta, Schema, WithMeta,\n} 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<TConfig extends Payload | EmptyObject | void = void, TSchema extends Schema | void = void> = ArchivistConfig<\n WithAdditional<\n {\n max?: number\n },\n TConfig\n >,\n TSchema extends Schema ? TSchema : MemoryArchivistConfigSchema | ArchivistConfig['schema']\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 AttachableArchivistInstance, ModuleInstance {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, MemoryArchivistConfigSchema]\n static override readonly defaultConfigSchema: Schema = MemoryArchivistConfigSchema\n\n private _cache?: LRUCache<Hash, WithStorageMeta<PayloadWithMeta>>\n private _dataHashIndex?: LRUCache<Hash, Hash>\n\n override get queries() {\n return [\n ArchivistAllQuerySchema,\n ArchivistDeleteQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistNextQuerySchema,\n ...super.queries,\n ]\n }\n\n protected get cache() {\n this._cache = this._cache ?? new LRUCache<Hash, WithStorageMeta<PayloadWithMeta>>({ max: this.max })\n return this._cache\n }\n\n protected get dataHashIndex() {\n this._dataHashIndex = this._dataHashIndex ?? new LRUCache<Hash, Hash>({ max: this.max })\n return this._dataHashIndex\n }\n\n protected get max() {\n return this.config?.max ?? 10_000\n }\n\n protected override allHandler(): Promisable<PayloadWithMeta[]> {\n const all = this.cache.dump().map(([, item]) => item.value).filter(exists)\n return sortByStorageMeta(all).map(payload => removeStorageMeta(payload))\n }\n\n protected override clearHandler(): void | Promise<void> {\n this.cache.clear()\n this.dataHashIndex.clear()\n return this.emit('cleared', { mod: 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 Object.values((await this.parentArchivists()).commit ?? [])?.map(async (parent) => {\n const queryPayload: ArchivistInsertQuery = { schema: ArchivistInsertQuerySchema }\n const query = await this.bindQuery(queryPayload, payloads)\n return (await parent?.query(query[0], query[1]))?.[0]\n }).filter(exists),\n )\n await this.clearHandler()\n return settled.filter(fulfilled).map(result => result.value).filter(exists)\n }\n\n protected override deleteHandler(hashes: Hash[]): Promisable<Hash[]> {\n const deletedHashes: Hash[] = this.cache\n .dump()\n .map(([key, item]) => {\n if (hashes.includes(key) || hashes.includes(item.value.$hash)) {\n this.cache.delete(key)\n return key\n }\n })\n .filter(exists)\n this.rebuildDataHashIndex()\n return deletedHashes\n }\n\n protected override getHandler(hashes: Hash[]): Promisable<PayloadWithMeta[]> {\n return hashes.map((hash) => {\n const resolvedHash = this.dataHashIndex.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 }).filter(exists)\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]> {\n const pairs = await PayloadBuilder.hashPairs(payloads, { stamp: false })\n const insertedPayloads = pairs.map(([payload, hash], index) => {\n return this.cache.get(hash) ?? this.insertPayloadIntoCache(payload, hash, index)\n })\n\n return removeStorageMeta(insertedPayloads)\n }\n\n protected override async nextHandler(options?: ArchivistNextOptions): Promise<PayloadWithMeta[]> {\n const {\n limit, offset, order,\n } = options ?? {}\n let all = await this.allHandler()\n if (order === 'desc') {\n all = all.reverse()\n }\n const allPairs = await PayloadBuilder.hashPairs(all)\n const startIndex = offset ? allPairs.findIndex(([, hash]) => hash === offset) + 1 : 0\n return allPairs.slice(startIndex, limit ? startIndex + limit : undefined).map(([payload]) => payload)\n }\n\n private insertPayloadIntoCache(payload: PayloadWithMeta, hash: Hash, index = 0): WithStorageMeta<PayloadWithMeta> {\n const withMeta = addStorageMeta(payload, index)\n this.cache.set(hash, withMeta)\n this.dataHashIndex.set(withMeta.$hash, hash)\n return withMeta\n }\n\n private rebuildDataHashIndex() {\n this._dataHashIndex = new LRUCache<Hash, Hash>({ max: this.max })\n const pairs = this.cache.dump()\n for (const [hash, payload] of pairs) {\n this.dataHashIndex.set(payload.value.$hash, hash)\n }\n }\n}\n"],"mappings":"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","names":["assertEx","exists","fulfilled","AbstractArchivist","addStorageMeta","removeStorageMeta","sortByStorageMeta","ArchivistAllQuerySchema","ArchivistClearQuerySchema","ArchivistCommitQuerySchema","ArchivistDeleteQuerySchema","ArchivistInsertQuerySchema","ArchivistNextQuerySchema","creatableModule","PayloadBuilder","LRUCache","MemoryArchivistConfigSchema","MemoryArchivist","AbstractArchivist","configSchemas","defaultConfigSchema","_cache","_dataHashIndex","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","ArchivistNextQuerySchema","cache","LRUCache","max","dataHashIndex","config","allHandler","all","dump","map","item","value","filter","exists","sortByStorageMeta","payload","removeStorageMeta","clearHandler","clear","emit","mod","commitHandler","payloads","assertEx","settled","Promise","allSettled","Object","values","parentArchivists","commit","parent","queryPayload","schema","query","bindQuery","fulfilled","result","deleteHandler","hashes","deletedHashes","key","includes","$hash","delete","rebuildDataHashIndex","getHandler","hash","resolvedHash","get","Error","insertHandler","pairs","PayloadBuilder","hashPairs","stamp","insertedPayloads","index","insertPayloadIntoCache","nextHandler","options","limit","offset","order","reverse","allPairs","startIndex","findIndex","slice","undefined","withMeta","addStorageMeta","set"]}
|
|
1
|
+
{"version":3,"sources":["../../src/MemoryArchivist.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Hash } from '@xylabs/hex'\nimport { EmptyObject, WithAdditional } from '@xylabs/object'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist } from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistConfig,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuery,\n ArchivistInsertQuerySchema,\n ArchivistModuleEventData,\n ArchivistNextOptions,\n ArchivistNextQuerySchema,\n AttachableArchivistInstance,\n} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport {\n AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams,\n} from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport {\n Payload, Schema, WithStorageMeta,\n} 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<TConfig extends Payload | EmptyObject | void = void, TSchema extends Schema | void = void> = ArchivistConfig<\n WithAdditional<\n {\n max?: number\n },\n TConfig\n >,\n TSchema extends Schema ? TSchema : MemoryArchivistConfigSchema | ArchivistConfig['schema']\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 AttachableArchivistInstance, ModuleInstance {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, MemoryArchivistConfigSchema]\n static override readonly defaultConfigSchema: Schema = MemoryArchivistConfigSchema\n\n private _cache?: LRUCache<Hash, WithStorageMeta<Payload>>\n private _dataHashIndex?: LRUCache<Hash, Hash>\n\n override get queries() {\n return [\n ArchivistAllQuerySchema,\n ArchivistDeleteQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistNextQuerySchema,\n ...super.queries,\n ]\n }\n\n protected get cache() {\n this._cache = this._cache ?? new LRUCache<Hash, WithStorageMeta<Payload>>({ max: this.max })\n return this._cache\n }\n\n protected get dataHashIndex() {\n this._dataHashIndex = this._dataHashIndex ?? new LRUCache<Hash, Hash>({ max: this.max })\n return this._dataHashIndex\n }\n\n protected get max() {\n return this.config?.max ?? 10_000\n }\n\n protected override allHandler(): Promisable<Payload[]> {\n const all = this.cache.dump().map(([, item]) => item.value).filter(exists)\n return PayloadBuilder.sortByStorageMeta(all)\n }\n\n protected override clearHandler(): void | Promise<void> {\n this.cache.clear()\n this.dataHashIndex.clear()\n return this.emit('cleared', { mod: this })\n }\n\n protected override async commitHandler(): Promise<BoundWitness[]> {\n const payloads = assertEx(await this.allHandler(), () => 'Nothing to commit')\n const settled = await Promise.allSettled(\n Object.values((await this.parentArchivists()).commit ?? [])?.map(async (parent) => {\n const queryPayload: ArchivistInsertQuery = { schema: ArchivistInsertQuerySchema }\n const query = await this.bindQuery(queryPayload, payloads)\n return (await parent?.query(query[0], query[1]))?.[0]\n }).filter(exists),\n )\n await this.clearHandler()\n return settled.filter(fulfilled).map(result => result.value).filter(exists)\n }\n\n protected override async deleteHandler(hashes: Hash[]): Promise<Hash[]> {\n const deletedHashes: Hash[] = (await Promise.all(this.cache\n .dump()\n .map(async ([key, item]) => {\n const itemValueDataHash = await PayloadBuilder.dataHash(item.value)\n if (hashes.includes(key) || hashes.includes(itemValueDataHash)) {\n this.cache.delete(key)\n return key\n }\n })))\n .filter(exists)\n await this.rebuildDataHashIndex()\n return deletedHashes\n }\n\n protected override getHandler(hashes: Hash[]): Promisable<Payload[]> {\n return hashes.map((hash) => {\n const resolvedHash = this.dataHashIndex.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 result\n }).filter(exists)\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<Payload[]> {\n const pairs = await PayloadBuilder.hashPairs(payloads)\n const insertedPayloads = await Promise.all(pairs.map(async ([payload, hash]) => {\n return this.cache.get(hash) ?? await this.insertPayloadIntoCache(payload)\n }))\n\n return insertedPayloads\n }\n\n protected override async nextHandler(options?: ArchivistNextOptions): Promise<Payload[]> {\n const {\n limit, offset, order,\n } = options ?? {}\n let all = await this.allHandler()\n if (order === 'desc') {\n all = all.reverse()\n }\n const allPairs = await PayloadBuilder.hashPairs(all)\n const startIndex = offset ? allPairs.findIndex(([, hash]) => hash === offset) + 1 : 0\n return allPairs.slice(startIndex, limit ? startIndex + limit : undefined).map(([payload]) => payload)\n }\n\n private async insertPayloadIntoCache(payload: Payload): Promise<WithStorageMeta<Payload>> {\n const withMeta = await PayloadBuilder.addStorageMeta(payload)\n this.cache.set(withMeta._hash, withMeta)\n this.dataHashIndex.set(withMeta._dataHash, withMeta._hash)\n return withMeta\n }\n\n private async rebuildDataHashIndex() {\n this._dataHashIndex = new LRUCache<Hash, Hash>({ max: this.max })\n const pairs = this.cache.dump()\n for (const [hash, payload] of pairs) {\n const dataHash = await PayloadBuilder.dataHash(payload.value)\n this.dataHashIndex.set(dataHash, hash)\n }\n }\n}\n"],"mappings":"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","names":["assertEx","exists","fulfilled","AbstractArchivist","ArchivistAllQuerySchema","ArchivistClearQuerySchema","ArchivistCommitQuerySchema","ArchivistDeleteQuerySchema","ArchivistInsertQuerySchema","ArchivistNextQuerySchema","creatableModule","PayloadBuilder","LRUCache","MemoryArchivistConfigSchema","MemoryArchivist","AbstractArchivist","configSchemas","defaultConfigSchema","_cache","_dataHashIndex","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","ArchivistNextQuerySchema","cache","LRUCache","max","dataHashIndex","config","allHandler","all","dump","map","item","value","filter","exists","PayloadBuilder","sortByStorageMeta","clearHandler","clear","emit","mod","commitHandler","payloads","assertEx","settled","Promise","allSettled","Object","values","parentArchivists","commit","parent","queryPayload","schema","query","bindQuery","fulfilled","result","deleteHandler","hashes","deletedHashes","key","itemValueDataHash","dataHash","includes","delete","rebuildDataHashIndex","getHandler","hash","resolvedHash","get","Error","insertHandler","pairs","hashPairs","insertedPayloads","payload","insertPayloadIntoCache","nextHandler","options","limit","offset","order","reverse","allPairs","startIndex","findIndex","slice","undefined","withMeta","addStorageMeta","set","_hash","_dataHash"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/archivist-memory",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.6.0-rc.2",
|
|
4
4
|
"description": "Primary SDK for using XYO Protocol 2.0",
|
|
5
5
|
"homepage": "https://xyo.network",
|
|
6
6
|
"bugs": {
|
|
@@ -29,28 +29,29 @@
|
|
|
29
29
|
"module": "dist/neutral/index.mjs",
|
|
30
30
|
"types": "dist/neutral/index.d.ts",
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@xylabs/assert": "^4.4.
|
|
33
|
-
"@xylabs/exists": "^4.4.
|
|
34
|
-
"@xylabs/hex": "^4.4.
|
|
35
|
-
"@xylabs/object": "^4.4.
|
|
36
|
-
"@xylabs/promise": "^4.4.
|
|
37
|
-
"@xyo-network/archivist-abstract": "^3.
|
|
38
|
-
"@xyo-network/archivist-model": "^3.
|
|
39
|
-
"@xyo-network/boundwitness-model": "^3.
|
|
40
|
-
"@xyo-network/module-model": "^3.
|
|
41
|
-
"@xyo-network/payload-builder": "^3.
|
|
42
|
-
"@xyo-network/payload-model": "^3.
|
|
32
|
+
"@xylabs/assert": "^4.4.12",
|
|
33
|
+
"@xylabs/exists": "^4.4.12",
|
|
34
|
+
"@xylabs/hex": "^4.4.12",
|
|
35
|
+
"@xylabs/object": "^4.4.12",
|
|
36
|
+
"@xylabs/promise": "^4.4.12",
|
|
37
|
+
"@xyo-network/archivist-abstract": "^3.6.0-rc.2",
|
|
38
|
+
"@xyo-network/archivist-model": "^3.6.0-rc.2",
|
|
39
|
+
"@xyo-network/boundwitness-model": "^3.6.0-rc.2",
|
|
40
|
+
"@xyo-network/module-model": "^3.6.0-rc.2",
|
|
41
|
+
"@xyo-network/payload-builder": "^3.6.0-rc.2",
|
|
42
|
+
"@xyo-network/payload-model": "^3.6.0-rc.2",
|
|
43
43
|
"lru-cache": "^11.0.2"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@xylabs/ts-scripts-yarn3": "^4.2.4",
|
|
47
47
|
"@xylabs/tsconfig": "^4.2.4",
|
|
48
|
-
"@xylabs/vitest-extended": "^4.4.
|
|
49
|
-
"@xyo-network/account": "^3.
|
|
48
|
+
"@xylabs/vitest-extended": "^4.4.12",
|
|
49
|
+
"@xyo-network/account": "^3.6.0-rc.2",
|
|
50
50
|
"typescript": "^5.7.2",
|
|
51
|
-
"vitest": "^2.1.
|
|
51
|
+
"vitest": "^2.1.8"
|
|
52
52
|
},
|
|
53
53
|
"publishConfig": {
|
|
54
54
|
"access": "public"
|
|
55
|
-
}
|
|
55
|
+
},
|
|
56
|
+
"stableVersion": "3.5.2"
|
|
56
57
|
}
|
package/src/MemoryArchivist.ts
CHANGED
|
@@ -3,9 +3,7 @@ import { exists } from '@xylabs/exists'
|
|
|
3
3
|
import { Hash } from '@xylabs/hex'
|
|
4
4
|
import { EmptyObject, WithAdditional } from '@xylabs/object'
|
|
5
5
|
import { fulfilled, Promisable } from '@xylabs/promise'
|
|
6
|
-
import {
|
|
7
|
-
AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta, WithStorageMeta,
|
|
8
|
-
} from '@xyo-network/archivist-abstract'
|
|
6
|
+
import { AbstractArchivist } from '@xyo-network/archivist-abstract'
|
|
9
7
|
import {
|
|
10
8
|
ArchivistAllQuerySchema,
|
|
11
9
|
ArchivistClearQuerySchema,
|
|
@@ -25,7 +23,7 @@ import {
|
|
|
25
23
|
} from '@xyo-network/module-model'
|
|
26
24
|
import { PayloadBuilder } from '@xyo-network/payload-builder'
|
|
27
25
|
import {
|
|
28
|
-
Payload,
|
|
26
|
+
Payload, Schema, WithStorageMeta,
|
|
29
27
|
} from '@xyo-network/payload-model'
|
|
30
28
|
import { LRUCache } from 'lru-cache'
|
|
31
29
|
|
|
@@ -54,7 +52,7 @@ export class MemoryArchivist<
|
|
|
54
52
|
static override readonly configSchemas: Schema[] = [...super.configSchemas, MemoryArchivistConfigSchema]
|
|
55
53
|
static override readonly defaultConfigSchema: Schema = MemoryArchivistConfigSchema
|
|
56
54
|
|
|
57
|
-
private _cache?: LRUCache<Hash, WithStorageMeta<
|
|
55
|
+
private _cache?: LRUCache<Hash, WithStorageMeta<Payload>>
|
|
58
56
|
private _dataHashIndex?: LRUCache<Hash, Hash>
|
|
59
57
|
|
|
60
58
|
override get queries() {
|
|
@@ -70,7 +68,7 @@ export class MemoryArchivist<
|
|
|
70
68
|
}
|
|
71
69
|
|
|
72
70
|
protected get cache() {
|
|
73
|
-
this._cache = this._cache ?? new LRUCache<Hash, WithStorageMeta<
|
|
71
|
+
this._cache = this._cache ?? new LRUCache<Hash, WithStorageMeta<Payload>>({ max: this.max })
|
|
74
72
|
return this._cache
|
|
75
73
|
}
|
|
76
74
|
|
|
@@ -83,9 +81,9 @@ export class MemoryArchivist<
|
|
|
83
81
|
return this.config?.max ?? 10_000
|
|
84
82
|
}
|
|
85
83
|
|
|
86
|
-
protected override allHandler(): Promisable<
|
|
84
|
+
protected override allHandler(): Promisable<Payload[]> {
|
|
87
85
|
const all = this.cache.dump().map(([, item]) => item.value).filter(exists)
|
|
88
|
-
return sortByStorageMeta(all)
|
|
86
|
+
return PayloadBuilder.sortByStorageMeta(all)
|
|
89
87
|
}
|
|
90
88
|
|
|
91
89
|
protected override clearHandler(): void | Promise<void> {
|
|
@@ -94,7 +92,7 @@ export class MemoryArchivist<
|
|
|
94
92
|
return this.emit('cleared', { mod: this })
|
|
95
93
|
}
|
|
96
94
|
|
|
97
|
-
protected override async commitHandler(): Promise<
|
|
95
|
+
protected override async commitHandler(): Promise<BoundWitness[]> {
|
|
98
96
|
const payloads = assertEx(await this.allHandler(), () => 'Nothing to commit')
|
|
99
97
|
const settled = await Promise.allSettled(
|
|
100
98
|
Object.values((await this.parentArchivists()).commit ?? [])?.map(async (parent) => {
|
|
@@ -107,41 +105,42 @@ export class MemoryArchivist<
|
|
|
107
105
|
return settled.filter(fulfilled).map(result => result.value).filter(exists)
|
|
108
106
|
}
|
|
109
107
|
|
|
110
|
-
protected override deleteHandler(hashes: Hash[]):
|
|
111
|
-
const deletedHashes: Hash[] = this.cache
|
|
108
|
+
protected override async deleteHandler(hashes: Hash[]): Promise<Hash[]> {
|
|
109
|
+
const deletedHashes: Hash[] = (await Promise.all(this.cache
|
|
112
110
|
.dump()
|
|
113
|
-
.map(([key, item]) => {
|
|
114
|
-
|
|
111
|
+
.map(async ([key, item]) => {
|
|
112
|
+
const itemValueDataHash = await PayloadBuilder.dataHash(item.value)
|
|
113
|
+
if (hashes.includes(key) || hashes.includes(itemValueDataHash)) {
|
|
115
114
|
this.cache.delete(key)
|
|
116
115
|
return key
|
|
117
116
|
}
|
|
118
|
-
})
|
|
117
|
+
})))
|
|
119
118
|
.filter(exists)
|
|
120
|
-
this.rebuildDataHashIndex()
|
|
119
|
+
await this.rebuildDataHashIndex()
|
|
121
120
|
return deletedHashes
|
|
122
121
|
}
|
|
123
122
|
|
|
124
|
-
protected override getHandler(hashes: Hash[]): Promisable<
|
|
123
|
+
protected override getHandler(hashes: Hash[]): Promisable<Payload[]> {
|
|
125
124
|
return hashes.map((hash) => {
|
|
126
125
|
const resolvedHash = this.dataHashIndex.get(hash) ?? hash
|
|
127
126
|
const result = this.cache.get(resolvedHash)
|
|
128
127
|
if (resolvedHash !== hash && !result) {
|
|
129
128
|
throw new Error('Missing referenced payload')
|
|
130
129
|
}
|
|
131
|
-
return
|
|
130
|
+
return result
|
|
132
131
|
}).filter(exists)
|
|
133
132
|
}
|
|
134
133
|
|
|
135
|
-
protected override async insertHandler(payloads: Payload[]): Promise<
|
|
136
|
-
const pairs = await PayloadBuilder.hashPairs(payloads
|
|
137
|
-
const insertedPayloads = pairs.map(([payload, hash]
|
|
138
|
-
return this.cache.get(hash) ?? this.insertPayloadIntoCache(payload
|
|
139
|
-
})
|
|
134
|
+
protected override async insertHandler(payloads: Payload[]): Promise<Payload[]> {
|
|
135
|
+
const pairs = await PayloadBuilder.hashPairs(payloads)
|
|
136
|
+
const insertedPayloads = await Promise.all(pairs.map(async ([payload, hash]) => {
|
|
137
|
+
return this.cache.get(hash) ?? await this.insertPayloadIntoCache(payload)
|
|
138
|
+
}))
|
|
140
139
|
|
|
141
|
-
return
|
|
140
|
+
return insertedPayloads
|
|
142
141
|
}
|
|
143
142
|
|
|
144
|
-
protected override async nextHandler(options?: ArchivistNextOptions): Promise<
|
|
143
|
+
protected override async nextHandler(options?: ArchivistNextOptions): Promise<Payload[]> {
|
|
145
144
|
const {
|
|
146
145
|
limit, offset, order,
|
|
147
146
|
} = options ?? {}
|
|
@@ -154,18 +153,19 @@ export class MemoryArchivist<
|
|
|
154
153
|
return allPairs.slice(startIndex, limit ? startIndex + limit : undefined).map(([payload]) => payload)
|
|
155
154
|
}
|
|
156
155
|
|
|
157
|
-
private insertPayloadIntoCache(payload:
|
|
158
|
-
const withMeta = addStorageMeta(payload
|
|
159
|
-
this.cache.set(
|
|
160
|
-
this.dataHashIndex.set(withMeta
|
|
156
|
+
private async insertPayloadIntoCache(payload: Payload): Promise<WithStorageMeta<Payload>> {
|
|
157
|
+
const withMeta = await PayloadBuilder.addStorageMeta(payload)
|
|
158
|
+
this.cache.set(withMeta._hash, withMeta)
|
|
159
|
+
this.dataHashIndex.set(withMeta._dataHash, withMeta._hash)
|
|
161
160
|
return withMeta
|
|
162
161
|
}
|
|
163
162
|
|
|
164
|
-
private rebuildDataHashIndex() {
|
|
163
|
+
private async rebuildDataHashIndex() {
|
|
165
164
|
this._dataHashIndex = new LRUCache<Hash, Hash>({ max: this.max })
|
|
166
165
|
const pairs = this.cache.dump()
|
|
167
166
|
for (const [hash, payload] of pairs) {
|
|
168
|
-
|
|
167
|
+
const dataHash = await PayloadBuilder.dataHash(payload.value)
|
|
168
|
+
this.dataHashIndex.set(dataHash, hash)
|
|
169
169
|
}
|
|
170
170
|
}
|
|
171
171
|
}
|