@xyo-network/archivist-memory 3.5.2 → 3.6.0-rc.10

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, PayloadWithMeta, Schema, WithMeta } 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,16 +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<PayloadWithMeta>, unknown>;
22
+ protected get cache(): LRUCache<Lowercase<string>, WithStorageMeta<import("@xylabs/object").DeepRestrictToStringKeys<{
23
+ schema: Schema;
24
+ }>>, unknown>;
23
25
  protected get dataHashIndex(): LRUCache<Lowercase<string>, Lowercase<string>, unknown>;
24
26
  protected get max(): number;
25
- protected allHandler(): Promisable<PayloadWithMeta[]>;
27
+ private static findIndexFromCursor;
28
+ protected allHandler(): Promisable<WithStorageMeta<Payload>[]>;
26
29
  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[]>;
30
+ protected commitHandler(): Promise<BoundWitness[]>;
31
+ protected deleteHandler(hashes: Hash[]): Promise<Hash[]>;
32
+ protected getHandler(hashes: Hash[]): Promisable<WithStorageMeta<Payload>[]>;
33
+ protected insertHandler(payloads: Payload[]): Promise<WithStorageMeta<Payload>[]>;
34
+ protected nextHandler(options?: ArchivistNextOptions): Promise<WithStorageMeta<Payload>[]>;
32
35
  private insertPayloadIntoCache;
33
36
  private rebuildDataHashIndex;
34
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,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,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"}
@@ -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
  }
@@ -55,9 +55,17 @@ var MemoryArchivist = class 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 sortByStorageMeta(all).map((payload) => removeStorageMeta(payload));
66
+ return [
67
+ ...this.cache.values()
68
+ ].filter(exists).sort(PayloadBuilder.compareStorageMeta);
61
69
  }
62
70
  clearHandler() {
63
71
  this.cache.clear();
@@ -78,13 +86,14 @@ var MemoryArchivist = class extends AbstractArchivist {
78
86
  await this.clearHandler();
79
87
  return settled.filter(fulfilled).map((result) => result.value).filter(exists);
80
88
  }
81
- deleteHandler(hashes) {
82
- const deletedHashes = this.cache.dump().map(([key, item]) => {
83
- if (hashes.includes(key) || hashes.includes(item.value.$hash)) {
89
+ async deleteHandler(hashes) {
90
+ const deletedHashes = (await Promise.all(this.cache.dump().map(async ([key, item]) => {
91
+ const itemValueDataHash = await PayloadBuilder.dataHash(item.value);
92
+ if (hashes.includes(key) || hashes.includes(itemValueDataHash)) {
84
93
  this.cache.delete(key);
85
94
  return key;
86
95
  }
87
- }).filter(exists);
96
+ }))).filter(exists);
88
97
  this.rebuildDataHashIndex();
89
98
  return deletedHashes;
90
99
  }
@@ -95,41 +104,39 @@ var MemoryArchivist = class extends AbstractArchivist {
95
104
  if (resolvedHash !== hash && !result) {
96
105
  throw new Error("Missing referenced payload");
97
106
  }
98
- return removeStorageMeta(result);
107
+ return result;
99
108
  }).filter(exists);
100
109
  }
101
110
  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);
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);
114
+ }));
115
+ return insertedPayloads;
109
116
  }
110
117
  async nextHandler(options) {
111
- const { limit, offset, order } = options ?? {};
118
+ const { limit, cursor, order } = options ?? {};
112
119
  let all = await this.allHandler();
113
120
  if (order === "desc") {
114
121
  all = all.reverse();
115
122
  }
116
- const allPairs = await PayloadBuilder.hashPairs(all);
117
- const startIndex = offset ? allPairs.findIndex(([, hash]) => hash === offset) + 1 : 0;
118
- 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;
119
126
  }
120
- insertPayloadIntoCache(payload, hash, index = 0) {
121
- const withMeta = addStorageMeta(payload, index);
122
- this.cache.set(hash, withMeta);
123
- this.dataHashIndex.set(withMeta.$hash, 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
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
- this.dataHashIndex.set(payload.value.$hash, 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);
133
140
  }
134
141
  }
135
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 {\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, 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.5.2",
3
+ "version": "3.6.0-rc.10",
4
4
  "description": "Primary SDK for using XYO Protocol 2.0",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -29,28 +29,30 @@
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.2",
38
- "@xyo-network/archivist-model": "^3.5.2",
39
- "@xyo-network/boundwitness-model": "^3.5.2",
40
- "@xyo-network/module-model": "^3.5.2",
41
- "@xyo-network/payload-builder": "^3.5.2",
42
- "@xyo-network/payload-model": "^3.5.2",
32
+ "@xylabs/assert": "^4.4.21",
33
+ "@xylabs/exists": "^4.4.21",
34
+ "@xylabs/hex": "^4.4.21",
35
+ "@xylabs/object": "^4.4.21",
36
+ "@xylabs/promise": "^4.4.21",
37
+ "@xyo-network/archivist-abstract": "^3.6.0-rc.10",
38
+ "@xyo-network/archivist-model": "^3.6.0-rc.10",
39
+ "@xyo-network/boundwitness-model": "^3.6.0-rc.10",
40
+ "@xyo-network/module-model": "^3.6.0-rc.10",
41
+ "@xyo-network/payload-builder": "^3.6.0-rc.10",
42
+ "@xyo-network/payload-model": "^3.6.0-rc.10",
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.9",
49
- "@xyo-network/account": "^3.5.2",
46
+ "@xylabs/delay": "^4.4.21",
47
+ "@xylabs/ts-scripts-yarn3": "^4.2.6",
48
+ "@xylabs/tsconfig": "^4.2.6",
49
+ "@xylabs/vitest-extended": "^4.4.21",
50
+ "@xyo-network/account": "^3.6.0-rc.10",
50
51
  "typescript": "^5.7.2",
51
- "vitest": "^2.1.5"
52
+ "vitest": "^2.1.8"
52
53
  },
53
54
  "publishConfig": {
54
55
  "access": "public"
55
- }
56
+ },
57
+ "stableVersion": "3.5.2"
56
58
  }
@@ -1,11 +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 {
7
- AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta, WithStorageMeta,
8
- } from '@xyo-network/archivist-abstract'
6
+ import { AbstractArchivist } from '@xyo-network/archivist-abstract'
9
7
  import {
10
8
  ArchivistAllQuerySchema,
11
9
  ArchivistClearQuerySchema,
@@ -25,7 +23,7 @@ import {
25
23
  } from '@xyo-network/module-model'
26
24
  import { PayloadBuilder } from '@xyo-network/payload-builder'
27
25
  import {
28
- Payload, PayloadWithMeta, Schema, WithMeta,
26
+ Payload, Schema, WithStorageMeta,
29
27
  } from '@xyo-network/payload-model'
30
28
  import { LRUCache } from 'lru-cache'
31
29
 
@@ -54,7 +52,7 @@ export class MemoryArchivist<
54
52
  static override readonly configSchemas: Schema[] = [...super.configSchemas, MemoryArchivistConfigSchema]
55
53
  static override readonly defaultConfigSchema: Schema = MemoryArchivistConfigSchema
56
54
 
57
- private _cache?: LRUCache<Hash, WithStorageMeta<PayloadWithMeta>>
55
+ private _cache?: LRUCache<Hash, WithStorageMeta<Payload>>
58
56
  private _dataHashIndex?: LRUCache<Hash, Hash>
59
57
 
60
58
  override get queries() {
@@ -70,7 +68,7 @@ export class MemoryArchivist<
70
68
  }
71
69
 
72
70
  protected get cache() {
73
- this._cache = this._cache ?? new LRUCache<Hash, WithStorageMeta<PayloadWithMeta>>({ max: this.max })
71
+ this._cache = this._cache ?? new LRUCache<Hash, WithStorageMeta<Payload>>({ max: this.max })
74
72
  return this._cache
75
73
  }
76
74
 
@@ -83,9 +81,16 @@ export class MemoryArchivist<
83
81
  return this.config?.max ?? 10_000
84
82
  }
85
83
 
86
- protected override allHandler(): Promisable<PayloadWithMeta[]> {
87
- const all = this.cache.dump().map(([, item]) => item.value).filter(exists)
88
- return sortByStorageMeta(all).map(payload => 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)
89
94
  }
90
95
 
91
96
  protected override clearHandler(): void | Promise<void> {
@@ -94,7 +99,7 @@ export class MemoryArchivist<
94
99
  return this.emit('cleared', { mod: this })
95
100
  }
96
101
 
97
- protected override async commitHandler(): Promise<WithMeta<BoundWitness>[]> {
102
+ protected override async commitHandler(): Promise<BoundWitness[]> {
98
103
  const payloads = assertEx(await this.allHandler(), () => 'Nothing to commit')
99
104
  const settled = await Promise.allSettled(
100
105
  Object.values((await this.parentArchivists()).commit ?? [])?.map(async (parent) => {
@@ -107,65 +112,68 @@ export class MemoryArchivist<
107
112
  return settled.filter(fulfilled).map(result => result.value).filter(exists)
108
113
  }
109
114
 
110
- protected override deleteHandler(hashes: Hash[]): Promisable<Hash[]> {
111
- const deletedHashes: Hash[] = this.cache
115
+ protected override async deleteHandler(hashes: Hash[]): Promise<Hash[]> {
116
+ const deletedHashes: Hash[] = (await Promise.all(this.cache
112
117
  .dump()
113
- .map(([key, item]) => {
114
- if (hashes.includes(key) || hashes.includes(item.value.$hash)) {
118
+ .map(async ([key, item]) => {
119
+ const itemValueDataHash = await PayloadBuilder.dataHash(item.value)
120
+ if (hashes.includes(key) || hashes.includes(itemValueDataHash)) {
115
121
  this.cache.delete(key)
116
122
  return key
117
123
  }
118
- })
124
+ })))
119
125
  .filter(exists)
120
126
  this.rebuildDataHashIndex()
121
127
  return deletedHashes
122
128
  }
123
129
 
124
- protected override getHandler(hashes: Hash[]): Promisable<PayloadWithMeta[]> {
130
+ protected override getHandler(hashes: Hash[]): Promisable<WithStorageMeta<Payload>[]> {
125
131
  return hashes.map((hash) => {
126
132
  const resolvedHash = this.dataHashIndex.get(hash) ?? hash
127
133
  const result = this.cache.get(resolvedHash)
128
134
  if (resolvedHash !== hash && !result) {
129
135
  throw new Error('Missing referenced payload')
130
136
  }
131
- return removeStorageMeta(result)
137
+ return result
132
138
  }).filter(exists)
133
139
  }
134
140
 
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
- })
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)
145
+ }))
140
146
 
141
- return removeStorageMeta(insertedPayloads)
147
+ return insertedPayloads
142
148
  }
143
149
 
144
- protected override async nextHandler(options?: ArchivistNextOptions): Promise<PayloadWithMeta[]> {
150
+ protected override async nextHandler(options?: ArchivistNextOptions): Promise<WithStorageMeta<Payload>[]> {
145
151
  const {
146
- limit, offset, order,
152
+ limit, cursor, order,
147
153
  } = options ?? {}
148
154
  let all = await this.allHandler()
149
155
  if (order === 'desc') {
150
156
  all = all.reverse()
151
157
  }
152
- const allPairs = await PayloadBuilder.hashPairs(all)
153
- const startIndex = offset ? allPairs.findIndex(([, hash]) => hash === offset) + 1 : 0
154
- 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
155
163
  }
156
164
 
157
- private insertPayloadIntoCache(payload: PayloadWithMeta, hash: Hash, index = 0): WithStorageMeta<PayloadWithMeta> {
158
- const withMeta = addStorageMeta(payload, index)
159
- this.cache.set(hash, withMeta)
160
- this.dataHashIndex.set(withMeta.$hash, 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)
161
169
  return withMeta
162
170
  }
163
171
 
164
172
  private rebuildDataHashIndex() {
165
173
  this._dataHashIndex = new LRUCache<Hash, Hash>({ max: this.max })
166
- const pairs = this.cache.dump()
167
- for (const [hash, payload] of pairs) {
168
- this.dataHashIndex.set(payload.value.$hash, 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)
169
177
  }
170
178
  }
171
179
  }