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

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