@xyo-network/archivist-memory 3.6.0-rc.1 → 3.6.0-rc.11

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, WithStorageMeta } from '@xyo-network/archivist-abstract';
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, Schema } from '@xyo-network/payload-model';
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,18 +19,19 @@ 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<{
23
- schema: string;
24
- } & import("@xyo-network/payload-model").PayloadFields>, unknown>;
22
+ protected get cache(): LRUCache<Lowercase<string>, WithStorageMeta<import("@xylabs/object").DeepRestrictToStringKeys<{
23
+ schema: Schema;
24
+ }>>, unknown>;
25
25
  protected get dataHashIndex(): LRUCache<Lowercase<string>, Lowercase<string>, unknown>;
26
26
  protected get max(): number;
27
- protected allHandler(): Promisable<Payload[]>;
27
+ private static findIndexFromCursor;
28
+ protected allHandler(): Promisable<WithStorageMeta<Payload>[]>;
28
29
  protected clearHandler(): void | Promise<void>;
29
30
  protected commitHandler(): Promise<BoundWitness[]>;
30
31
  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
+ protected getHandler(hashes: Hash[]): Promisable<WithStorageMeta<Payload>[]>;
33
+ protected insertHandler(payloads: Payload[]): Promise<WithStorageMeta<Payload>[]>;
34
+ protected nextHandler(options?: ArchivistNextOptions): Promise<WithStorageMeta<Payload>[]>;
34
35
  private insertPayloadIntoCache;
35
36
  private rebuildDataHashIndex;
36
37
  }
@@ -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,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACpF,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,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAC5D,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;YAQtB,oBAAoB;CAQnC"}
1
+ {"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAO,MAAM,aAAa,CAAA;AACvC,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;;kBAGlB;IAED,SAAS,KAAK,aAAa,4DAG1B;IAED,SAAS,KAAK,GAAG,WAEhB;IAED,OAAO,CAAC,MAAM,CAAC,mBAAmB;cAQf,UAAU,IAAI,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;cAIpD,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,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;cAW5D,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;cASvE,WAAW,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;YAe3F,sBAAsB;IAOpC,OAAO,CAAC,oBAAoB;CAO7B"}
@@ -55,9 +55,17 @@ var MemoryArchivist = class _MemoryArchivist extends AbstractArchivist {
55
55
  get max() {
56
56
  return this.config?.max ?? 1e4;
57
57
  }
58
+ static findIndexFromCursor(payloads, cursor) {
59
+ const index = payloads.findIndex(({ _sequence }) => _sequence === cursor);
60
+ if (index === -1) {
61
+ return Infinity;
62
+ }
63
+ return index;
64
+ }
58
65
  allHandler() {
59
- const all = this.cache.dump().map(([, item]) => item.value).filter(exists);
60
- return _MemoryArchivist.sortByStorageMeta(all).map((payload) => _MemoryArchivist.removeStorageMeta(payload));
66
+ return [
67
+ ...this.cache.values()
68
+ ].filter(exists).sort(PayloadBuilder.compareStorageMeta);
61
69
  }
62
70
  clearHandler() {
63
71
  this.cache.clear();
@@ -86,7 +94,7 @@ var MemoryArchivist = class _MemoryArchivist extends AbstractArchivist {
86
94
  return key;
87
95
  }
88
96
  }))).filter(exists);
89
- await this.rebuildDataHashIndex();
97
+ this.rebuildDataHashIndex();
90
98
  return deletedHashes;
91
99
  }
92
100
  getHandler(hashes) {
@@ -96,41 +104,39 @@ var MemoryArchivist = class _MemoryArchivist extends AbstractArchivist {
96
104
  if (resolvedHash !== hash && !result) {
97
105
  throw new Error("Missing referenced payload");
98
106
  }
99
- return _MemoryArchivist.removeStorageMeta(result);
107
+ return result;
100
108
  }).filter(exists);
101
109
  }
102
110
  async insertHandler(payloads) {
103
- const pairs = await PayloadBuilder.hashPairs(payloads);
104
- const insertedPayloads = await Promise.all(pairs.map(async ([payload, hash], index) => {
105
- return this.cache.get(hash) ?? await this.insertPayloadIntoCache(payload, hash, index);
111
+ const payloadsWithMeta = (await PayloadBuilder.addStorageMeta(payloads)).sort(PayloadBuilder.compareStorageMeta);
112
+ const insertedPayloads = await Promise.all(payloadsWithMeta.map(async (payload) => {
113
+ return this.cache.get(payload._hash) ?? await this.insertPayloadIntoCache(payload);
106
114
  }));
107
- return _MemoryArchivist.removeStorageMeta(insertedPayloads);
115
+ return insertedPayloads;
108
116
  }
109
117
  async nextHandler(options) {
110
- const { limit, offset, order } = options ?? {};
118
+ const { limit, cursor, order } = options ?? {};
111
119
  let all = await this.allHandler();
112
120
  if (order === "desc") {
113
121
  all = all.reverse();
114
122
  }
115
- const allPairs = await PayloadBuilder.hashPairs(all);
116
- const startIndex = offset ? allPairs.findIndex(([, hash]) => hash === offset) + 1 : 0;
117
- return allPairs.slice(startIndex, limit ? startIndex + limit : void 0).map(([payload]) => payload);
123
+ const startIndex = cursor ? _MemoryArchivist.findIndexFromCursor(all, cursor) + 1 : 0;
124
+ const result = all.slice(startIndex, limit ? startIndex + limit : void 0);
125
+ return result;
118
126
  }
119
- async insertPayloadIntoCache(payload, hash, index = 0) {
120
- const dataHash = await PayloadBuilder.dataHash(payload);
121
- const withMeta = await _MemoryArchivist.addSequencedStorageMeta(payload, index);
122
- this.cache.set(hash, withMeta);
123
- this.dataHashIndex.set(dataHash, hash);
127
+ async insertPayloadIntoCache(payload) {
128
+ const withMeta = await PayloadBuilder.addStorageMeta(payload);
129
+ this.cache.set(withMeta._hash, withMeta);
130
+ this.dataHashIndex.set(withMeta._dataHash, withMeta._hash);
124
131
  return withMeta;
125
132
  }
126
- async rebuildDataHashIndex() {
133
+ rebuildDataHashIndex() {
127
134
  this._dataHashIndex = new LRUCache({
128
135
  max: this.max
129
136
  });
130
- const pairs = this.cache.dump();
131
- for (const [hash, payload] of pairs) {
132
- const dataHash = await PayloadBuilder.dataHash(payload.value);
133
- this.dataHashIndex.set(dataHash, hash);
137
+ const payloads = this.cache.dump().map(([, item]) => item.value);
138
+ for (const payload of payloads) {
139
+ this.dataHashIndex.set(payload._dataHash, payload._hash);
134
140
  }
135
141
  }
136
142
  };
@@ -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 { AbstractArchivist, 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 {\n AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams,\n} from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, Schema } 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 MemoryArchivist.sortByStorageMeta(all).map(payload => MemoryArchivist.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<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 MemoryArchivist.removeStorageMeta(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], index) => {\n return this.cache.get(hash) ?? await this.insertPayloadIntoCache(payload, hash, index)\n }))\n\n return MemoryArchivist.removeStorageMeta(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, hash: Hash, index = 0): Promise<WithStorageMeta<Payload>> {\n const dataHash = await PayloadBuilder.dataHash(payload)\n const withMeta = await MemoryArchivist.addSequencedStorageMeta(payload, index)\n this.cache.set(hash, withMeta)\n this.dataHashIndex.set(dataHash, 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","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","itemValueDataHash","PayloadBuilder","dataHash","includes","delete","rebuildDataHashIndex","getHandler","hash","resolvedHash","get","Error","insertHandler","pairs","hashPairs","insertedPayloads","index","insertPayloadIntoCache","nextHandler","options","limit","offset","order","reverse","allPairs","startIndex","findIndex","slice","undefined","withMeta","addSequencedStorageMeta","set"]}
1
+ {"version":3,"sources":["../../src/MemoryArchivist.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Hash, Hex } 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 private static findIndexFromCursor(payloads: WithStorageMeta[], cursor: Hex) {\n const index = payloads.findIndex(({ _sequence }) => _sequence === cursor)\n if (index === -1) {\n return Infinity // move to the end\n }\n return index\n }\n\n protected override allHandler(): Promisable<WithStorageMeta<Payload>[]> {\n return [...this.cache.values()].filter(exists).sort(PayloadBuilder.compareStorageMeta)\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 this.rebuildDataHashIndex()\n return deletedHashes\n }\n\n protected override getHandler(hashes: Hash[]): Promisable<WithStorageMeta<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<WithStorageMeta<Payload>[]> {\n const payloadsWithMeta = (await PayloadBuilder.addStorageMeta(payloads)).sort(PayloadBuilder.compareStorageMeta)\n const insertedPayloads = await Promise.all(payloadsWithMeta.map(async (payload) => {\n return this.cache.get(payload._hash) ?? await this.insertPayloadIntoCache(payload)\n }))\n\n return insertedPayloads\n }\n\n protected override async nextHandler(options?: ArchivistNextOptions): Promise<WithStorageMeta<Payload>[]> {\n const {\n limit, cursor, order,\n } = options ?? {}\n let all = await this.allHandler()\n if (order === 'desc') {\n all = all.reverse()\n }\n const startIndex = cursor\n ? MemoryArchivist.findIndexFromCursor(all, cursor) + 1\n : 0\n const result = all.slice(startIndex, limit ? startIndex + limit : undefined)\n return result\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 rebuildDataHashIndex() {\n this._dataHashIndex = new LRUCache<Hash, Hash>({ max: this.max })\n const payloads = this.cache.dump().map(([, item]) => item.value)\n for (const payload of payloads) {\n this.dataHashIndex.set(payload._dataHash, payload._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","findIndexFromCursor","payloads","cursor","index","findIndex","_sequence","Infinity","allHandler","values","filter","exists","sort","PayloadBuilder","compareStorageMeta","clearHandler","clear","emit","mod","commitHandler","assertEx","settled","Promise","allSettled","Object","parentArchivists","commit","map","parent","queryPayload","schema","query","bindQuery","fulfilled","result","value","deleteHandler","hashes","deletedHashes","all","dump","key","item","itemValueDataHash","dataHash","includes","delete","rebuildDataHashIndex","getHandler","hash","resolvedHash","get","Error","insertHandler","payloadsWithMeta","addStorageMeta","insertedPayloads","payload","_hash","insertPayloadIntoCache","nextHandler","options","limit","order","reverse","startIndex","slice","undefined","withMeta","set","_dataHash"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/archivist-memory",
3
- "version": "3.6.0-rc.1",
3
+ "version": "3.6.0-rc.11",
4
4
  "description": "Primary SDK for using XYO Protocol 2.0",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -29,24 +29,25 @@
29
29
  "module": "dist/neutral/index.mjs",
30
30
  "types": "dist/neutral/index.d.ts",
31
31
  "dependencies": {
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.1",
38
- "@xyo-network/archivist-model": "^3.6.0-rc.1",
39
- "@xyo-network/boundwitness-model": "^3.6.0-rc.1",
40
- "@xyo-network/module-model": "^3.6.0-rc.1",
41
- "@xyo-network/payload-builder": "^3.6.0-rc.1",
42
- "@xyo-network/payload-model": "^3.6.0-rc.1",
32
+ "@xylabs/assert": "^4.4.24",
33
+ "@xylabs/exists": "^4.4.24",
34
+ "@xylabs/hex": "^4.4.24",
35
+ "@xylabs/object": "^4.4.24",
36
+ "@xylabs/promise": "^4.4.24",
37
+ "@xyo-network/archivist-abstract": "^3.6.0-rc.11",
38
+ "@xyo-network/archivist-model": "^3.6.0-rc.11",
39
+ "@xyo-network/boundwitness-model": "^3.6.0-rc.11",
40
+ "@xyo-network/module-model": "^3.6.0-rc.11",
41
+ "@xyo-network/payload-builder": "^3.6.0-rc.11",
42
+ "@xyo-network/payload-model": "^3.6.0-rc.11",
43
43
  "lru-cache": "^11.0.2"
44
44
  },
45
45
  "devDependencies": {
46
- "@xylabs/ts-scripts-yarn3": "^4.2.4",
47
- "@xylabs/tsconfig": "^4.2.4",
48
- "@xylabs/vitest-extended": "^4.4.12",
49
- "@xyo-network/account": "^3.6.0-rc.1",
46
+ "@xylabs/delay": "^4.4.24",
47
+ "@xylabs/ts-scripts-yarn3": "^4.2.6",
48
+ "@xylabs/tsconfig": "^4.2.6",
49
+ "@xylabs/vitest-extended": "^4.4.24",
50
+ "@xyo-network/account": "^3.6.0-rc.11",
50
51
  "typescript": "^5.7.2",
51
52
  "vitest": "^2.1.8"
52
53
  },
@@ -1,9 +1,9 @@
1
1
  import { assertEx } from '@xylabs/assert'
2
2
  import { exists } from '@xylabs/exists'
3
- import { Hash } from '@xylabs/hex'
3
+ import { Hash, Hex } from '@xylabs/hex'
4
4
  import { EmptyObject, WithAdditional } from '@xylabs/object'
5
5
  import { fulfilled, Promisable } from '@xylabs/promise'
6
- import { AbstractArchivist, WithStorageMeta } from '@xyo-network/archivist-abstract'
6
+ import { AbstractArchivist } from '@xyo-network/archivist-abstract'
7
7
  import {
8
8
  ArchivistAllQuerySchema,
9
9
  ArchivistClearQuerySchema,
@@ -22,7 +22,9 @@ import {
22
22
  AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams,
23
23
  } from '@xyo-network/module-model'
24
24
  import { PayloadBuilder } from '@xyo-network/payload-builder'
25
- import { Payload, Schema } from '@xyo-network/payload-model'
25
+ import {
26
+ Payload, Schema, WithStorageMeta,
27
+ } from '@xyo-network/payload-model'
26
28
  import { LRUCache } from 'lru-cache'
27
29
 
28
30
  export type MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config'
@@ -79,9 +81,16 @@ export class MemoryArchivist<
79
81
  return this.config?.max ?? 10_000
80
82
  }
81
83
 
82
- protected override allHandler(): Promisable<Payload[]> {
83
- const all = this.cache.dump().map(([, item]) => item.value).filter(exists)
84
- return MemoryArchivist.sortByStorageMeta(all).map(payload => MemoryArchivist.removeStorageMeta(payload))
84
+ private static findIndexFromCursor(payloads: WithStorageMeta[], cursor: Hex) {
85
+ const index = payloads.findIndex(({ _sequence }) => _sequence === cursor)
86
+ if (index === -1) {
87
+ return Infinity // move to the end
88
+ }
89
+ return index
90
+ }
91
+
92
+ protected override allHandler(): Promisable<WithStorageMeta<Payload>[]> {
93
+ return [...this.cache.values()].filter(exists).sort(PayloadBuilder.compareStorageMeta)
85
94
  }
86
95
 
87
96
  protected override clearHandler(): void | Promise<void> {
@@ -114,57 +123,57 @@ export class MemoryArchivist<
114
123
  }
115
124
  })))
116
125
  .filter(exists)
117
- await this.rebuildDataHashIndex()
126
+ this.rebuildDataHashIndex()
118
127
  return deletedHashes
119
128
  }
120
129
 
121
- protected override getHandler(hashes: Hash[]): Promisable<Payload[]> {
130
+ protected override getHandler(hashes: Hash[]): Promisable<WithStorageMeta<Payload>[]> {
122
131
  return hashes.map((hash) => {
123
132
  const resolvedHash = this.dataHashIndex.get(hash) ?? hash
124
133
  const result = this.cache.get(resolvedHash)
125
134
  if (resolvedHash !== hash && !result) {
126
135
  throw new Error('Missing referenced payload')
127
136
  }
128
- return MemoryArchivist.removeStorageMeta(result)
137
+ return result
129
138
  }).filter(exists)
130
139
  }
131
140
 
132
- protected override async insertHandler(payloads: Payload[]): Promise<Payload[]> {
133
- const pairs = await PayloadBuilder.hashPairs(payloads)
134
- const insertedPayloads = await Promise.all(pairs.map(async ([payload, hash], index) => {
135
- return this.cache.get(hash) ?? await this.insertPayloadIntoCache(payload, hash, index)
141
+ protected override async insertHandler(payloads: Payload[]): Promise<WithStorageMeta<Payload>[]> {
142
+ const payloadsWithMeta = (await PayloadBuilder.addStorageMeta(payloads)).sort(PayloadBuilder.compareStorageMeta)
143
+ const insertedPayloads = await Promise.all(payloadsWithMeta.map(async (payload) => {
144
+ return this.cache.get(payload._hash) ?? await this.insertPayloadIntoCache(payload)
136
145
  }))
137
146
 
138
- return MemoryArchivist.removeStorageMeta(insertedPayloads)
147
+ return insertedPayloads
139
148
  }
140
149
 
141
- protected override async nextHandler(options?: ArchivistNextOptions): Promise<Payload[]> {
150
+ protected override async nextHandler(options?: ArchivistNextOptions): Promise<WithStorageMeta<Payload>[]> {
142
151
  const {
143
- limit, offset, order,
152
+ limit, cursor, order,
144
153
  } = options ?? {}
145
154
  let all = await this.allHandler()
146
155
  if (order === 'desc') {
147
156
  all = all.reverse()
148
157
  }
149
- const allPairs = await PayloadBuilder.hashPairs(all)
150
- const startIndex = offset ? allPairs.findIndex(([, hash]) => hash === offset) + 1 : 0
151
- return allPairs.slice(startIndex, limit ? startIndex + limit : undefined).map(([payload]) => payload)
158
+ const startIndex = cursor
159
+ ? MemoryArchivist.findIndexFromCursor(all, cursor) + 1
160
+ : 0
161
+ const result = all.slice(startIndex, limit ? startIndex + limit : undefined)
162
+ return result
152
163
  }
153
164
 
154
- private async insertPayloadIntoCache(payload: Payload, hash: Hash, index = 0): Promise<WithStorageMeta<Payload>> {
155
- const dataHash = await PayloadBuilder.dataHash(payload)
156
- const withMeta = await MemoryArchivist.addSequencedStorageMeta(payload, index)
157
- this.cache.set(hash, withMeta)
158
- this.dataHashIndex.set(dataHash, hash)
165
+ private async insertPayloadIntoCache(payload: Payload): Promise<WithStorageMeta<Payload>> {
166
+ const withMeta = await PayloadBuilder.addStorageMeta(payload)
167
+ this.cache.set(withMeta._hash, withMeta)
168
+ this.dataHashIndex.set(withMeta._dataHash, withMeta._hash)
159
169
  return withMeta
160
170
  }
161
171
 
162
- private async rebuildDataHashIndex() {
172
+ private rebuildDataHashIndex() {
163
173
  this._dataHashIndex = new LRUCache<Hash, Hash>({ max: this.max })
164
- const pairs = this.cache.dump()
165
- for (const [hash, payload] of pairs) {
166
- const dataHash = await PayloadBuilder.dataHash(payload.value)
167
- this.dataHashIndex.set(dataHash, hash)
174
+ const payloads = this.cache.dump().map(([, item]) => item.value)
175
+ for (const payload of payloads) {
176
+ this.dataHashIndex.set(payload._dataHash, payload._hash)
168
177
  }
169
178
  }
170
179
  }