@xyo-network/archivist-memory 2.107.1 → 2.107.4

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 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/MemoryArchivist.ts"],"sourcesContent":["export * from './MemoryArchivist'\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Hash } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { EmptyObject, WithAdditional } from '@xylabs/object'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta, WithStorageMeta } 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 { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadWithMeta, Schema, 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<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{\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 = compact(this.cache.dump().map(([, item]) => item.value))\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', { 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.parentArchivists()).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 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 compact(\n 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 }),\n )\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 { limit, offset, order } = 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":["src_exports","__export","MemoryArchivist","MemoryArchivistConfigSchema","__toCommonJS","import_assert","import_exists","import_lodash","import_promise","import_archivist_abstract","import_archivist_model","import_module_model","import_payload_builder","import_lru_cache","MemoryArchivistConfigSchema","MemoryArchivist","AbstractArchivist","configSchemas","defaultConfigSchema","_cache","_dataHashIndex","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","ArchivistNextQuerySchema","cache","LRUCache","max","dataHashIndex","config","allHandler","all","compact","dump","map","item","value","sortByStorageMeta","payload","removeStorageMeta","clearHandler","clear","emit","module","commitHandler","payloads","assertEx","settled","Promise","allSettled","Object","values","parentArchivists","commit","parent","queryPayload","schema","query","bindQuery","filter","fulfilled","result","deleteHandler","hashes","deletedHashes","key","includes","$hash","delete","exists","rebuildDataHashIndex","getHandler","hash","resolvedHash","get","Error","insertHandler","insertedPayloads","PayloadBuilder","hashPairs","stamp","index","insertPayloadIntoCache","nextHandler","options","limit","offset","order","reverse","allPairs","startIndex","findIndex","slice","undefined","withMeta","addStorageMeta","set","pairs"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/MemoryArchivist.ts"],"sourcesContent":["export * from './MemoryArchivist'\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Hash } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { EmptyObject, WithAdditional } from '@xylabs/object'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta, WithStorageMeta } 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 { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadWithMeta, Schema, 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<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{\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 = compact(this.cache.dump().map(([, item]) => item.value))\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', { 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.parentArchivists()).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 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 compact(\n 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 }),\n )\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 { limit, offset, order } = 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":["MemoryArchivistConfigSchema","MemoryArchivist","AbstractArchivist","configSchemas","defaultConfigSchema","_cache","_dataHashIndex","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","ArchivistNextQuerySchema","cache","LRUCache","max","dataHashIndex","config","allHandler","all","compact","dump","map","item","value","sortByStorageMeta","payload","removeStorageMeta","clearHandler","clear","emit","module","commitHandler","payloads","assertEx","settled","Promise","allSettled","Object","values","parentArchivists","commit","parent","queryPayload","schema","query","bindQuery","filter","fulfilled","result","deleteHandler","hashes","deletedHashes","key","includes","$hash","delete","exists","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,2 +1,144 @@
1
- var H=Object.defineProperty;var d=(c,t)=>H(c,"name",{value:t,configurable:!0});import{assertEx as v}from"@xylabs/assert";import{exists as g}from"@xylabs/exists";import{compact as h}from"@xylabs/lodash";import{fulfilled as w}from"@xylabs/promise";import{AbstractArchivist as I,addStorageMeta as S,removeStorageMeta as m,sortByStorageMeta as _}from"@xyo-network/archivist-abstract";import{ArchivistAllQuerySchema as P,ArchivistClearQuerySchema as A,ArchivistCommitQuerySchema as b,ArchivistDeleteQuerySchema as C,ArchivistInsertQuerySchema as f,ArchivistNextQuerySchema as Q}from"@xyo-network/archivist-model";import{creatableModule as M}from"@xyo-network/module-model";import{PayloadBuilder as p}from"@xyo-network/payload-builder";import{LRUCache as u}from"lru-cache";function y(c,t,e,a){var r=arguments.length,s=r<3?t:a===null?a=Object.getOwnPropertyDescriptor(t,e):a,i;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(c,t,e,a);else for(var n=c.length-1;n>=0;n--)(i=c[n])&&(s=(r<3?i(s):r>3?i(t,e,s):i(t,e))||s);return r>3&&s&&Object.defineProperty(t,e,s),s}d(y,"_ts_decorate");var x="network.xyo.archivist.memory.config",o=class extends I{static{d(this,"MemoryArchivist")}static configSchemas=[...super.configSchemas,x];static defaultConfigSchema=x;_cache;_dataHashIndex;get queries(){return[P,C,A,f,b,Q,...super.queries]}get cache(){return this._cache=this._cache??new u({max:this.max}),this._cache}get dataHashIndex(){return this._dataHashIndex=this._dataHashIndex??new u({max:this.max}),this._dataHashIndex}get max(){return this.config?.max??1e4}allHandler(){let t=h(this.cache.dump().map(([,e])=>e.value));return _(t).map(e=>m(e))}clearHandler(){return this.cache.clear(),this.dataHashIndex.clear(),this.emit("cleared",{module:this})}async commitHandler(){let t=v(await this.allHandler(),()=>"Nothing to commit"),e=await Promise.allSettled(h(Object.values((await this.parentArchivists()).commit??[])?.map(async a=>{let r={schema:f},s=await this.bindQuery(r,t);return(await a?.query(s[0],s[1]))?.[0]})));return await this.clearHandler(),h(e.filter(w).map(a=>a.value))}deleteHandler(t){let e=this.cache.dump().map(([a,r])=>{if(t.includes(a)||t.includes(r.value.$hash))return this.cache.delete(a),a}).filter(g);return this.rebuildDataHashIndex(),e}getHandler(t){return h(t.map(e=>{let a=this.dataHashIndex.get(e)??e,r=this.cache.get(a);if(a!==e&&!r)throw new Error("Missing referenced payload");return m(r)}))}async insertHandler(t){let a=(await p.hashPairs(t,{stamp:!1})).map(([r,s],i)=>this.cache.get(s)??this.insertPayloadIntoCache(r,s,i));return m(a)}async nextHandler(t){let{limit:e,offset:a,order:r}=t??{},s=await this.allHandler();r==="desc"&&(s=s.reverse());let i=await p.hashPairs(s),n=a?i.findIndex(([,l])=>l===a)+1:0;return i.slice(n,e?n+e:void 0).map(([l])=>l)}insertPayloadIntoCache(t,e,a=0){let r=S(t,a);return this.cache.set(e,r),this.dataHashIndex.set(r.$hash,e),r}rebuildDataHashIndex(){this._dataHashIndex=new u({max:this.max});let t=this.cache.dump();for(let[e,a]of t)this.dataHashIndex.set(a.value.$hash,e)}};o=y([M()],o);export{o as MemoryArchivist,x as MemoryArchivistConfigSchema};
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/MemoryArchivist.ts
5
+ import { assertEx } from "@xylabs/assert";
6
+ import { exists } from "@xylabs/exists";
7
+ import { compact } from "@xylabs/lodash";
8
+ import { fulfilled } from "@xylabs/promise";
9
+ import { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta } from "@xyo-network/archivist-abstract";
10
+ import { ArchivistAllQuerySchema, ArchivistClearQuerySchema, ArchivistCommitQuerySchema, ArchivistDeleteQuerySchema, ArchivistInsertQuerySchema, ArchivistNextQuerySchema } from "@xyo-network/archivist-model";
11
+ import { creatableModule } from "@xyo-network/module-model";
12
+ import { PayloadBuilder } from "@xyo-network/payload-builder";
13
+ import { LRUCache } from "lru-cache";
14
+ function _ts_decorate(decorators, target, key, desc) {
15
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
16
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
17
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
18
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
19
+ }
20
+ __name(_ts_decorate, "_ts_decorate");
21
+ var MemoryArchivistConfigSchema = "network.xyo.archivist.memory.config";
22
+ var MemoryArchivist = class extends AbstractArchivist {
23
+ static {
24
+ __name(this, "MemoryArchivist");
25
+ }
26
+ static configSchemas = [
27
+ ...super.configSchemas,
28
+ MemoryArchivistConfigSchema
29
+ ];
30
+ static defaultConfigSchema = MemoryArchivistConfigSchema;
31
+ _cache;
32
+ _dataHashIndex;
33
+ get queries() {
34
+ return [
35
+ ArchivistAllQuerySchema,
36
+ ArchivistDeleteQuerySchema,
37
+ ArchivistClearQuerySchema,
38
+ ArchivistInsertQuerySchema,
39
+ ArchivistCommitQuerySchema,
40
+ ArchivistNextQuerySchema,
41
+ ...super.queries
42
+ ];
43
+ }
44
+ get cache() {
45
+ this._cache = this._cache ?? new LRUCache({
46
+ max: this.max
47
+ });
48
+ return this._cache;
49
+ }
50
+ get dataHashIndex() {
51
+ this._dataHashIndex = this._dataHashIndex ?? new LRUCache({
52
+ max: this.max
53
+ });
54
+ return this._dataHashIndex;
55
+ }
56
+ get max() {
57
+ return this.config?.max ?? 1e4;
58
+ }
59
+ allHandler() {
60
+ const all = compact(this.cache.dump().map(([, item]) => item.value));
61
+ return sortByStorageMeta(all).map((payload) => removeStorageMeta(payload));
62
+ }
63
+ clearHandler() {
64
+ this.cache.clear();
65
+ this.dataHashIndex.clear();
66
+ return this.emit("cleared", {
67
+ module: this
68
+ });
69
+ }
70
+ async commitHandler() {
71
+ const payloads = assertEx(await this.allHandler(), () => "Nothing to commit");
72
+ const settled = await Promise.allSettled(compact(Object.values((await this.parentArchivists()).commit ?? [])?.map(async (parent) => {
73
+ const queryPayload = {
74
+ schema: ArchivistInsertQuerySchema
75
+ };
76
+ const query = await this.bindQuery(queryPayload, payloads);
77
+ return (await parent?.query(query[0], query[1]))?.[0];
78
+ })));
79
+ await this.clearHandler();
80
+ return compact(settled.filter(fulfilled).map((result) => result.value));
81
+ }
82
+ deleteHandler(hashes) {
83
+ const deletedHashes = this.cache.dump().map(([key, item]) => {
84
+ if (hashes.includes(key) || hashes.includes(item.value.$hash)) {
85
+ this.cache.delete(key);
86
+ return key;
87
+ }
88
+ }).filter(exists);
89
+ this.rebuildDataHashIndex();
90
+ return deletedHashes;
91
+ }
92
+ getHandler(hashes) {
93
+ return compact(hashes.map((hash) => {
94
+ const resolvedHash = this.dataHashIndex.get(hash) ?? hash;
95
+ const result = this.cache.get(resolvedHash);
96
+ if (resolvedHash !== hash && !result) {
97
+ throw new Error("Missing referenced payload");
98
+ }
99
+ return removeStorageMeta(result);
100
+ }));
101
+ }
102
+ async insertHandler(payloads) {
103
+ const pairs = await PayloadBuilder.hashPairs(payloads, {
104
+ stamp: false
105
+ });
106
+ const insertedPayloads = pairs.map(([payload, hash], index) => {
107
+ return this.cache.get(hash) ?? this.insertPayloadIntoCache(payload, hash, index);
108
+ });
109
+ return removeStorageMeta(insertedPayloads);
110
+ }
111
+ async nextHandler(options) {
112
+ const { limit, offset, order } = options ?? {};
113
+ let all = await this.allHandler();
114
+ if (order === "desc") {
115
+ all = all.reverse();
116
+ }
117
+ const allPairs = await PayloadBuilder.hashPairs(all);
118
+ const startIndex = offset ? allPairs.findIndex(([, hash]) => hash === offset) + 1 : 0;
119
+ return allPairs.slice(startIndex, limit ? startIndex + limit : void 0).map(([payload]) => payload);
120
+ }
121
+ insertPayloadIntoCache(payload, hash, index = 0) {
122
+ const withMeta = addStorageMeta(payload, index);
123
+ this.cache.set(hash, withMeta);
124
+ this.dataHashIndex.set(withMeta.$hash, hash);
125
+ return withMeta;
126
+ }
127
+ rebuildDataHashIndex() {
128
+ this._dataHashIndex = new LRUCache({
129
+ max: this.max
130
+ });
131
+ const pairs = this.cache.dump();
132
+ for (const [hash, payload] of pairs) {
133
+ this.dataHashIndex.set(payload.value.$hash, hash);
134
+ }
135
+ }
136
+ };
137
+ MemoryArchivist = _ts_decorate([
138
+ creatableModule()
139
+ ], MemoryArchivist);
140
+ export {
141
+ MemoryArchivist,
142
+ MemoryArchivistConfigSchema
143
+ };
2
144
  //# sourceMappingURL=index.js.map
@@ -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 { compact } from '@xylabs/lodash'\nimport { EmptyObject, WithAdditional } from '@xylabs/object'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta, WithStorageMeta } 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 { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadWithMeta, Schema, 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<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{\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 = compact(this.cache.dump().map(([, item]) => item.value))\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', { 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.parentArchivists()).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 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 compact(\n 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 }),\n )\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 { limit, offset, order } = 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","compact","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","compact","dump","map","item","value","sortByStorageMeta","payload","removeStorageMeta","clearHandler","clear","emit","module","commitHandler","payloads","assertEx","settled","Promise","allSettled","Object","values","parentArchivists","commit","parent","queryPayload","schema","query","bindQuery","filter","fulfilled","result","deleteHandler","hashes","deletedHashes","key","includes","$hash","delete","exists","rebuildDataHashIndex","getHandler","hash","resolvedHash","get","Error","insertHandler","insertedPayloads","PayloadBuilder","hashPairs","stamp","index","insertPayloadIntoCache","nextHandler","options","limit","offset","order","reverse","allPairs","startIndex","findIndex","slice","undefined","withMeta","addStorageMeta","set","pairs"]}
1
+ {"version":3,"sources":["../../src/MemoryArchivist.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Hash } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { EmptyObject, WithAdditional } from '@xylabs/object'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta, WithStorageMeta } 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 { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadWithMeta, Schema, 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<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{\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 = compact(this.cache.dump().map(([, item]) => item.value))\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', { 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.parentArchivists()).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 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 compact(\n 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 }),\n )\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 { limit, offset, order } = 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","compact","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","compact","dump","map","item","value","sortByStorageMeta","payload","removeStorageMeta","clearHandler","clear","emit","module","commitHandler","payloads","assertEx","settled","Promise","allSettled","Object","values","parentArchivists","commit","parent","queryPayload","schema","query","bindQuery","filter","fulfilled","result","deleteHandler","hashes","deletedHashes","key","includes","$hash","delete","exists","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,2 +1,177 @@
1
- "use strict";var d=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var Q=Object.getPrototypeOf,_=Object.prototype.hasOwnProperty;var q=Reflect.get;var A=(s,e,t)=>e in s?d(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t;var x=(s,e)=>d(s,"name",{value:e,configurable:!0});var j=(s,e)=>{for(var t in e)d(s,t,{get:e[t],enumerable:!0})},D=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of C(e))!_.call(s,a)&&a!==t&&d(s,a,{get:()=>e[a],enumerable:!(r=b(e,a))||r.enumerable});return s};var O=s=>D(d({},"__esModule",{value:!0}),s);var H=(s,e,t)=>A(s,typeof e!="symbol"?e+"":e,t);var w=(s,e,t)=>q(Q(s),t,e);var $={};j($,{MemoryArchivist:()=>u,MemoryArchivistConfigSchema:()=>y});module.exports=O($);var I=require("@xylabs/assert"),v=require("@xylabs/exists"),m=require("@xylabs/lodash"),S=require("@xylabs/promise"),h=require("@xyo-network/archivist-abstract"),c=require("@xyo-network/archivist-model"),P=require("@xyo-network/module-model"),g=require("@xyo-network/payload-builder"),f=require("lru-cache");function R(s,e,t,r){var a=arguments.length,i=a<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,n;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(s,e,t,r);else for(var o=s.length-1;o>=0;o--)(n=s[o])&&(i=(a<3?n(i):a>3?n(e,t,i):n(e,t))||i);return a>3&&i&&Object.defineProperty(e,t,i),i}x(R,"_ts_decorate");var y="network.xyo.archivist.memory.config",l=class l extends h.AbstractArchivist{_cache;_dataHashIndex;get queries(){return[c.ArchivistAllQuerySchema,c.ArchivistDeleteQuerySchema,c.ArchivistClearQuerySchema,c.ArchivistInsertQuerySchema,c.ArchivistCommitQuerySchema,c.ArchivistNextQuerySchema,...super.queries]}get cache(){return this._cache=this._cache??new f.LRUCache({max:this.max}),this._cache}get dataHashIndex(){return this._dataHashIndex=this._dataHashIndex??new f.LRUCache({max:this.max}),this._dataHashIndex}get max(){var e;return((e=this.config)==null?void 0:e.max)??1e4}allHandler(){let e=(0,m.compact)(this.cache.dump().map(([,t])=>t.value));return(0,h.sortByStorageMeta)(e).map(t=>(0,h.removeStorageMeta)(t))}clearHandler(){return this.cache.clear(),this.dataHashIndex.clear(),this.emit("cleared",{module:this})}async commitHandler(){var r;let e=(0,I.assertEx)(await this.allHandler(),()=>"Nothing to commit"),t=await Promise.allSettled((0,m.compact)((r=Object.values((await this.parentArchivists()).commit??[]))==null?void 0:r.map(async a=>{var o;let i={schema:c.ArchivistInsertQuerySchema},n=await this.bindQuery(i,e);return(o=await(a==null?void 0:a.query(n[0],n[1])))==null?void 0:o[0]})));return await this.clearHandler(),(0,m.compact)(t.filter(S.fulfilled).map(a=>a.value))}deleteHandler(e){let t=this.cache.dump().map(([r,a])=>{if(e.includes(r)||e.includes(a.value.$hash))return this.cache.delete(r),r}).filter(v.exists);return this.rebuildDataHashIndex(),t}getHandler(e){return(0,m.compact)(e.map(t=>{let r=this.dataHashIndex.get(t)??t,a=this.cache.get(r);if(r!==t&&!a)throw new Error("Missing referenced payload");return(0,h.removeStorageMeta)(a)}))}async insertHandler(e){let r=(await g.PayloadBuilder.hashPairs(e,{stamp:!1})).map(([a,i],n)=>this.cache.get(i)??this.insertPayloadIntoCache(a,i,n));return(0,h.removeStorageMeta)(r)}async nextHandler(e){let{limit:t,offset:r,order:a}=e??{},i=await this.allHandler();a==="desc"&&(i=i.reverse());let n=await g.PayloadBuilder.hashPairs(i),o=r?n.findIndex(([,p])=>p===r)+1:0;return n.slice(o,t?o+t:void 0).map(([p])=>p)}insertPayloadIntoCache(e,t,r=0){let a=(0,h.addStorageMeta)(e,r);return this.cache.set(t,a),this.dataHashIndex.set(a.$hash,t),a}rebuildDataHashIndex(){this._dataHashIndex=new f.LRUCache({max:this.max});let e=this.cache.dump();for(let[t,r]of e)this.dataHashIndex.set(r.value.$hash,t)}};x(l,"MemoryArchivist"),H(l,"configSchemas",[...w(l,l,"configSchemas"),y]),H(l,"defaultConfigSchema",y);var u=l;u=R([(0,P.creatableModule)()],u);0&&(module.exports={MemoryArchivist,MemoryArchivistConfigSchema});
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __reflectGet = Reflect.get;
8
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
9
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
10
+ var __export = (target, all) => {
11
+ for (var name in all)
12
+ __defProp(target, name, { get: all[name], enumerable: true });
13
+ };
14
+ var __copyProps = (to, from, except, desc) => {
15
+ if (from && typeof from === "object" || typeof from === "function") {
16
+ for (let key of __getOwnPropNames(from))
17
+ if (!__hasOwnProp.call(to, key) && key !== except)
18
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
19
+ }
20
+ return to;
21
+ };
22
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
23
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
24
+ var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
25
+
26
+ // src/index.ts
27
+ var src_exports = {};
28
+ __export(src_exports, {
29
+ MemoryArchivist: () => MemoryArchivist,
30
+ MemoryArchivistConfigSchema: () => MemoryArchivistConfigSchema
31
+ });
32
+ module.exports = __toCommonJS(src_exports);
33
+
34
+ // src/MemoryArchivist.ts
35
+ var import_assert = require("@xylabs/assert");
36
+ var import_exists = require("@xylabs/exists");
37
+ var import_lodash = require("@xylabs/lodash");
38
+ var import_promise = require("@xylabs/promise");
39
+ var import_archivist_abstract = require("@xyo-network/archivist-abstract");
40
+ var import_archivist_model = require("@xyo-network/archivist-model");
41
+ var import_module_model = require("@xyo-network/module-model");
42
+ var import_payload_builder = require("@xyo-network/payload-builder");
43
+ var import_lru_cache = require("lru-cache");
44
+ function _ts_decorate(decorators, target, key, desc) {
45
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
46
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
47
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
48
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
49
+ }
50
+ __name(_ts_decorate, "_ts_decorate");
51
+ var MemoryArchivistConfigSchema = "network.xyo.archivist.memory.config";
52
+ var _MemoryArchivist = class _MemoryArchivist extends import_archivist_abstract.AbstractArchivist {
53
+ _cache;
54
+ _dataHashIndex;
55
+ get queries() {
56
+ return [
57
+ import_archivist_model.ArchivistAllQuerySchema,
58
+ import_archivist_model.ArchivistDeleteQuerySchema,
59
+ import_archivist_model.ArchivistClearQuerySchema,
60
+ import_archivist_model.ArchivistInsertQuerySchema,
61
+ import_archivist_model.ArchivistCommitQuerySchema,
62
+ import_archivist_model.ArchivistNextQuerySchema,
63
+ ...super.queries
64
+ ];
65
+ }
66
+ get cache() {
67
+ this._cache = this._cache ?? new import_lru_cache.LRUCache({
68
+ max: this.max
69
+ });
70
+ return this._cache;
71
+ }
72
+ get dataHashIndex() {
73
+ this._dataHashIndex = this._dataHashIndex ?? new import_lru_cache.LRUCache({
74
+ max: this.max
75
+ });
76
+ return this._dataHashIndex;
77
+ }
78
+ get max() {
79
+ var _a;
80
+ return ((_a = this.config) == null ? void 0 : _a.max) ?? 1e4;
81
+ }
82
+ allHandler() {
83
+ const all = (0, import_lodash.compact)(this.cache.dump().map(([, item]) => item.value));
84
+ return (0, import_archivist_abstract.sortByStorageMeta)(all).map((payload) => (0, import_archivist_abstract.removeStorageMeta)(payload));
85
+ }
86
+ clearHandler() {
87
+ this.cache.clear();
88
+ this.dataHashIndex.clear();
89
+ return this.emit("cleared", {
90
+ module: this
91
+ });
92
+ }
93
+ async commitHandler() {
94
+ var _a;
95
+ const payloads = (0, import_assert.assertEx)(await this.allHandler(), () => "Nothing to commit");
96
+ const settled = await Promise.allSettled((0, import_lodash.compact)((_a = Object.values((await this.parentArchivists()).commit ?? [])) == null ? void 0 : _a.map(async (parent) => {
97
+ var _a2;
98
+ const queryPayload = {
99
+ schema: import_archivist_model.ArchivistInsertQuerySchema
100
+ };
101
+ const query = await this.bindQuery(queryPayload, payloads);
102
+ return (_a2 = await (parent == null ? void 0 : parent.query(query[0], query[1]))) == null ? void 0 : _a2[0];
103
+ })));
104
+ await this.clearHandler();
105
+ return (0, import_lodash.compact)(settled.filter(import_promise.fulfilled).map((result) => result.value));
106
+ }
107
+ deleteHandler(hashes) {
108
+ const deletedHashes = this.cache.dump().map(([key, item]) => {
109
+ if (hashes.includes(key) || hashes.includes(item.value.$hash)) {
110
+ this.cache.delete(key);
111
+ return key;
112
+ }
113
+ }).filter(import_exists.exists);
114
+ this.rebuildDataHashIndex();
115
+ return deletedHashes;
116
+ }
117
+ getHandler(hashes) {
118
+ return (0, import_lodash.compact)(hashes.map((hash) => {
119
+ const resolvedHash = this.dataHashIndex.get(hash) ?? hash;
120
+ const result = this.cache.get(resolvedHash);
121
+ if (resolvedHash !== hash && !result) {
122
+ throw new Error("Missing referenced payload");
123
+ }
124
+ return (0, import_archivist_abstract.removeStorageMeta)(result);
125
+ }));
126
+ }
127
+ async insertHandler(payloads) {
128
+ const pairs = await import_payload_builder.PayloadBuilder.hashPairs(payloads, {
129
+ stamp: false
130
+ });
131
+ const insertedPayloads = pairs.map(([payload, hash], index) => {
132
+ return this.cache.get(hash) ?? this.insertPayloadIntoCache(payload, hash, index);
133
+ });
134
+ return (0, import_archivist_abstract.removeStorageMeta)(insertedPayloads);
135
+ }
136
+ async nextHandler(options) {
137
+ const { limit, offset, order } = options ?? {};
138
+ let all = await this.allHandler();
139
+ if (order === "desc") {
140
+ all = all.reverse();
141
+ }
142
+ const allPairs = await import_payload_builder.PayloadBuilder.hashPairs(all);
143
+ const startIndex = offset ? allPairs.findIndex(([, hash]) => hash === offset) + 1 : 0;
144
+ return allPairs.slice(startIndex, limit ? startIndex + limit : void 0).map(([payload]) => payload);
145
+ }
146
+ insertPayloadIntoCache(payload, hash, index = 0) {
147
+ const withMeta = (0, import_archivist_abstract.addStorageMeta)(payload, index);
148
+ this.cache.set(hash, withMeta);
149
+ this.dataHashIndex.set(withMeta.$hash, hash);
150
+ return withMeta;
151
+ }
152
+ rebuildDataHashIndex() {
153
+ this._dataHashIndex = new import_lru_cache.LRUCache({
154
+ max: this.max
155
+ });
156
+ const pairs = this.cache.dump();
157
+ for (const [hash, payload] of pairs) {
158
+ this.dataHashIndex.set(payload.value.$hash, hash);
159
+ }
160
+ }
161
+ };
162
+ __name(_MemoryArchivist, "MemoryArchivist");
163
+ __publicField(_MemoryArchivist, "configSchemas", [
164
+ ...__superGet(_MemoryArchivist, _MemoryArchivist, "configSchemas"),
165
+ MemoryArchivistConfigSchema
166
+ ]);
167
+ __publicField(_MemoryArchivist, "defaultConfigSchema", MemoryArchivistConfigSchema);
168
+ var MemoryArchivist = _MemoryArchivist;
169
+ MemoryArchivist = _ts_decorate([
170
+ (0, import_module_model.creatableModule)()
171
+ ], MemoryArchivist);
172
+ // Annotate the CommonJS export names for ESM import in node:
173
+ 0 && (module.exports = {
174
+ MemoryArchivist,
175
+ MemoryArchivistConfigSchema
176
+ });
2
177
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/MemoryArchivist.ts"],"sourcesContent":["export * from './MemoryArchivist'\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Hash } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { EmptyObject, WithAdditional } from '@xylabs/object'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta, WithStorageMeta } 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 { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadWithMeta, Schema, 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<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{\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 = compact(this.cache.dump().map(([, item]) => item.value))\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', { 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.parentArchivists()).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 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 compact(\n 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 }),\n )\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 { limit, offset, order } = 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":["src_exports","__export","MemoryArchivist","MemoryArchivistConfigSchema","__toCommonJS","import_assert","import_exists","import_lodash","import_promise","import_archivist_abstract","import_archivist_model","import_module_model","import_payload_builder","import_lru_cache","MemoryArchivistConfigSchema","MemoryArchivist","AbstractArchivist","_cache","_dataHashIndex","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","ArchivistNextQuerySchema","cache","LRUCache","max","dataHashIndex","_a","config","allHandler","all","compact","dump","map","item","value","sortByStorageMeta","payload","removeStorageMeta","clearHandler","clear","emit","module","commitHandler","payloads","assertEx","settled","Promise","allSettled","Object","values","parentArchivists","commit","parent","queryPayload","schema","query","bindQuery","filter","fulfilled","result","deleteHandler","hashes","deletedHashes","key","includes","$hash","delete","exists","rebuildDataHashIndex","getHandler","hash","resolvedHash","get","Error","insertHandler","insertedPayloads","PayloadBuilder","hashPairs","stamp","index","insertPayloadIntoCache","nextHandler","options","limit","offset","order","reverse","allPairs","startIndex","findIndex","slice","undefined","withMeta","addStorageMeta","set","pairs","__publicField","configSchemas","__superGet","_MemoryArchivist","defaultConfigSchema"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/MemoryArchivist.ts"],"sourcesContent":["export * from './MemoryArchivist'\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Hash } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { EmptyObject, WithAdditional } from '@xylabs/object'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta, WithStorageMeta } 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 { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadWithMeta, Schema, 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<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{\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 = compact(this.cache.dump().map(([, item]) => item.value))\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', { 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.parentArchivists()).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 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 compact(\n 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 }),\n )\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 { limit, offset, order } = 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":["MemoryArchivistConfigSchema","MemoryArchivist","AbstractArchivist","_cache","_dataHashIndex","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","ArchivistNextQuerySchema","cache","LRUCache","max","dataHashIndex","config","allHandler","all","compact","dump","map","item","value","sortByStorageMeta","payload","removeStorageMeta","clearHandler","clear","emit","module","commitHandler","payloads","assertEx","settled","Promise","allSettled","Object","values","parentArchivists","commit","parent","queryPayload","schema","query","bindQuery","_a","filter","fulfilled","result","deleteHandler","hashes","deletedHashes","key","includes","$hash","delete","exists","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","configSchemas","defaultConfigSchema"]}