@xyo-network/archivist-memory 3.14.17 → 3.14.19

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.
@@ -17,16 +17,22 @@ var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
17
17
  // src/Archivist.ts
18
18
  import { assertEx } from "@xylabs/assert";
19
19
  import { exists } from "@xylabs/exists";
20
- import { fulfilled } from "@xylabs/promise";
20
+ import {
21
+ hexToBigInt
22
+ } from "@xylabs/hex";
23
+ import {
24
+ fulfilled
25
+ } from "@xylabs/promise";
21
26
  import { Account } from "@xyo-network/account";
22
- import { AbstractArchivist } from "@xyo-network/archivist-abstract";
27
+ import { AbstractArchivist, StorageClassLabel } from "@xyo-network/archivist-abstract";
23
28
  import {
24
29
  ArchivistAllQuerySchema,
25
30
  ArchivistClearQuerySchema,
26
31
  ArchivistCommitQuerySchema,
27
32
  ArchivistDeleteQuerySchema,
28
33
  ArchivistInsertQuerySchema,
29
- ArchivistNextQuerySchema
34
+ ArchivistNextQuerySchema,
35
+ ArchivistSnapshotPayloadSchema
30
36
  } from "@xyo-network/archivist-model";
31
37
  import {
32
38
  creatableModule
@@ -140,6 +146,18 @@ var MemoryArchivist = class extends AbstractArchivist {
140
146
  const startIndex = cursor ? MemoryArchivist.findIndexFromCursor(all, cursor) + (open ? 1 : 0) : 0;
141
147
  return all.slice(startIndex, startIndex + limit);
142
148
  }
149
+ snapshotHandler() {
150
+ return [{
151
+ hash: Object.fromEntries(
152
+ [...this.cache.entries()].toSorted(([, payloadA], [, payloadB]) => {
153
+ const diff = hexToBigInt(payloadA._sequence) - hexToBigInt(payloadB._sequence);
154
+ return diff > 0n ? 1 : diff < 0n ? -1 : 0;
155
+ })
156
+ ),
157
+ dataHash: Object.fromEntries(this.dataHashIndex.entries()),
158
+ schema: ArchivistSnapshotPayloadSchema
159
+ }];
160
+ }
143
161
  insertPayloadIntoCache(payload) {
144
162
  this.cache.set(payload._hash, payload);
145
163
  this.dataHashIndex.set(payload._dataHash, payload._hash);
@@ -158,6 +176,7 @@ var MemoryArchivist = class extends AbstractArchivist {
158
176
  };
159
177
  __publicField(MemoryArchivist, "configSchemas", [...__superGet(MemoryArchivist, MemoryArchivist, "configSchemas"), MemoryArchivistConfigSchema]);
160
178
  __publicField(MemoryArchivist, "defaultConfigSchema", MemoryArchivistConfigSchema);
179
+ __publicField(MemoryArchivist, "labels", { ...__superGet(MemoryArchivist, MemoryArchivist, "labels"), [StorageClassLabel]: "memory" });
161
180
  MemoryArchivist = __decorateClass([
162
181
  creatableModule()
163
182
  ], MemoryArchivist);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Archivist.ts","../../src/Config.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Hash, Hex } from '@xylabs/hex'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { Account } from '@xyo-network/account'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { AbstractArchivist } from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuery,\n ArchivistInsertQuerySchema,\n ArchivistModuleEventData,\n ArchivistNextOptions,\n ArchivistNextQuerySchema,\n ArchivistParams,\n AttachableArchivistInstance,\n} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport {\n AnyConfigSchema, creatableModule, ModuleInstance,\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\nimport { MemoryArchivistConfig, MemoryArchivistConfigSchema } from './Config.ts'\n\nexport type MemoryArchivistParams<TConfig extends AnyConfigSchema<MemoryArchivistConfig> = AnyConfigSchema<MemoryArchivistConfig>> =\n ArchivistParams<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 private _sequenceIndex: WithStorageMeta<Payload>[] = []\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 async from(payloads: Payload[], account?: AccountInstance): Promise<MemoryArchivist> {\n const archivist = await MemoryArchivist.create({ account: account ?? await Account.random() })\n await archivist.insert(payloads)\n return archivist\n }\n\n protected override allHandler(): Promisable<WithStorageMeta<Payload>[]> {\n return [...this.cache.values()].filter(exists).toSorted(PayloadBuilder.compareStorageMeta)\n }\n\n protected override clearHandler(): void | Promise<void> {\n this.cache.clear()\n this.rebuildDataHashIndex()\n this.rebuildDataHashIndex()\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 await this.rebuildSequenceIndex()\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 insertHandler(payloads: WithStorageMeta<Payload>[]): WithStorageMeta<Payload>[] {\n const payloadsWithMeta = payloads.toSorted(PayloadBuilder.compareStorageMeta)\n this._sequenceIndex.push(...payloadsWithMeta)\n return payloadsWithMeta.map((payload) => {\n return this.insertPayloadIntoCache(payload)\n })\n }\n\n protected override nextHandler(options?: ArchivistNextOptions): Promisable<WithStorageMeta<Payload>[]> {\n const {\n limit = 100, cursor, order, open = true,\n } = options ?? {}\n let all = this._sequenceIndex.toSorted(PayloadBuilder.compareStorageMeta)\n if (order === 'desc') {\n all = all.toReversed()\n }\n const startIndex = cursor\n ? MemoryArchivist.findIndexFromCursor(all, cursor) + (open ? 1 : 0)\n : 0\n return all.slice(startIndex, startIndex + limit)\n }\n\n private insertPayloadIntoCache(payload: WithStorageMeta<Payload>): WithStorageMeta<Payload> {\n this.cache.set(payload._hash, payload)\n this.dataHashIndex.set(payload._dataHash, payload._hash)\n return payload\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 private async rebuildSequenceIndex() {\n this._sequenceIndex = (await this.allHandler()).toSorted(PayloadBuilder.compareStorageMeta)\n }\n}\n","import type { EmptyObject, WithAdditional } from '@xylabs/object'\nimport type { ArchivistConfig } from '@xyo-network/archivist-model'\nimport type { Payload, Schema } from '@xyo-network/payload-model'\n\nexport const MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config' as const\nexport type MemoryArchivistConfigSchema = typeof MemoryArchivistConfigSchema\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"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/Archivist.ts","../../src/Config.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport {\n Hash, Hex, hexToBigInt,\n} from '@xylabs/hex'\nimport {\n fulfilled, Promisable, PromisableArray,\n} from '@xylabs/promise'\nimport { Account } from '@xyo-network/account'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { AbstractArchivist, StorageClassLabel } from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuery,\n ArchivistInsertQuerySchema,\n ArchivistModuleEventData,\n ArchivistNextOptions,\n ArchivistNextQuerySchema,\n ArchivistParams,\n ArchivistSnapshotPayload,\n ArchivistSnapshotPayloadSchema,\n AttachableArchivistInstance,\n} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport {\n AnyConfigSchema, creatableModule, ModuleInstance,\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\nimport { MemoryArchivistConfig, MemoryArchivistConfigSchema } from './Config.ts'\n\nexport type MemoryArchivistParams<TConfig extends AnyConfigSchema<MemoryArchivistConfig> = AnyConfigSchema<MemoryArchivistConfig>> =\n ArchivistParams<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 static override readonly labels = { ...super.labels, [StorageClassLabel]: 'memory' }\n\n private _cache?: LRUCache<Hash, WithStorageMeta<Payload>>\n private _dataHashIndex?: LRUCache<Hash, Hash>\n private _sequenceIndex: WithStorageMeta<Payload>[] = []\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 async from(payloads: Payload[], account?: AccountInstance): Promise<MemoryArchivist> {\n const archivist = await MemoryArchivist.create({ account: account ?? await Account.random() })\n await archivist.insert(payloads)\n return archivist\n }\n\n protected override allHandler(): Promisable<WithStorageMeta<Payload>[]> {\n return [...this.cache.values()].filter(exists).toSorted(PayloadBuilder.compareStorageMeta)\n }\n\n protected override clearHandler(): void | Promise<void> {\n this.cache.clear()\n this.rebuildDataHashIndex()\n this.rebuildDataHashIndex()\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 await this.rebuildSequenceIndex()\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 insertHandler(payloads: WithStorageMeta<Payload>[]): WithStorageMeta<Payload>[] {\n const payloadsWithMeta = payloads.toSorted(PayloadBuilder.compareStorageMeta)\n this._sequenceIndex.push(...payloadsWithMeta)\n return payloadsWithMeta.map((payload) => {\n return this.insertPayloadIntoCache(payload)\n })\n }\n\n protected override nextHandler(options?: ArchivistNextOptions): Promisable<WithStorageMeta<Payload>[]> {\n const {\n limit = 100, cursor, order, open = true,\n } = options ?? {}\n let all = this._sequenceIndex.toSorted(PayloadBuilder.compareStorageMeta)\n if (order === 'desc') {\n all = all.toReversed()\n }\n const startIndex = cursor\n ? MemoryArchivist.findIndexFromCursor(all, cursor) + (open ? 1 : 0)\n : 0\n return all.slice(startIndex, startIndex + limit)\n }\n\n protected override snapshotHandler(): PromisableArray<ArchivistSnapshotPayload<WithStorageMeta<Payload>, Hash>> {\n return [{\n hash: Object.fromEntries(\n [...this.cache.entries()].toSorted(([, payloadA], [, payloadB]) => {\n const diff = hexToBigInt(payloadA._sequence) - hexToBigInt(payloadB._sequence)\n return diff > 0n ? 1 : diff < 0n ? -1 : 0\n }),\n ),\n dataHash: Object.fromEntries(this.dataHashIndex.entries()),\n schema: ArchivistSnapshotPayloadSchema,\n }]\n }\n\n private insertPayloadIntoCache(payload: WithStorageMeta<Payload>): WithStorageMeta<Payload> {\n this.cache.set(payload._hash, payload)\n this.dataHashIndex.set(payload._dataHash, payload._hash)\n return payload\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 private async rebuildSequenceIndex() {\n this._sequenceIndex = (await this.allHandler()).toSorted(PayloadBuilder.compareStorageMeta)\n }\n}\n","import type { EmptyObject, WithAdditional } from '@xylabs/object'\nimport type { ArchivistConfig } from '@xyo-network/archivist-model'\nimport type { Payload, Schema } from '@xyo-network/payload-model'\n\nexport const MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config' as const\nexport type MemoryArchivistConfigSchema = typeof MemoryArchivistConfigSchema\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"],"mappings":"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","names":[]}
@@ -1,8 +1,8 @@
1
1
  import { Hash } from '@xylabs/hex';
2
- import { Promisable } from '@xylabs/promise';
2
+ import { Promisable, PromisableArray } from '@xylabs/promise';
3
3
  import { AccountInstance } from '@xyo-network/account-model';
4
4
  import { AbstractArchivist } from '@xyo-network/archivist-abstract';
5
- import { ArchivistModuleEventData, ArchivistNextOptions, ArchivistParams, AttachableArchivistInstance } from '@xyo-network/archivist-model';
5
+ import { ArchivistModuleEventData, ArchivistNextOptions, ArchivistParams, ArchivistSnapshotPayload, AttachableArchivistInstance } from '@xyo-network/archivist-model';
6
6
  import { BoundWitness } from '@xyo-network/boundwitness-model';
7
7
  import { AnyConfigSchema, ModuleInstance } from '@xyo-network/module-model';
8
8
  import { Payload, Schema, WithStorageMeta } from '@xyo-network/payload-model';
@@ -12,6 +12,9 @@ export type MemoryArchivistParams<TConfig extends AnyConfigSchema<MemoryArchivis
12
12
  export declare class MemoryArchivist<TParams extends MemoryArchivistParams<AnyConfigSchema<MemoryArchivistConfig>> = MemoryArchivistParams, TEventData extends ArchivistModuleEventData = ArchivistModuleEventData> extends AbstractArchivist<TParams, TEventData> implements AttachableArchivistInstance, ModuleInstance {
13
13
  static readonly configSchemas: Schema[];
14
14
  static readonly defaultConfigSchema: Schema;
15
+ static readonly labels: {
16
+ "network.xyo.storage.class": string;
17
+ };
15
18
  private _cache?;
16
19
  private _dataHashIndex?;
17
20
  private _sequenceIndex;
@@ -28,6 +31,7 @@ export declare class MemoryArchivist<TParams extends MemoryArchivistParams<AnyCo
28
31
  protected getHandler(hashes: Hash[]): Promisable<WithStorageMeta<Payload>[]>;
29
32
  protected insertHandler(payloads: WithStorageMeta<Payload>[]): WithStorageMeta<Payload>[];
30
33
  protected nextHandler(options?: ArchivistNextOptions): Promisable<WithStorageMeta<Payload>[]>;
34
+ protected snapshotHandler(): PromisableArray<ArchivistSnapshotPayload<WithStorageMeta<Payload>, Hash>>;
31
35
  private insertPayloadIntoCache;
32
36
  private rebuildDataHashIndex;
33
37
  private rebuildSequenceIndex;
@@ -1 +1 @@
1
- {"version":3,"file":"Archivist.d.ts","sourceRoot":"","sources":["../../src/Archivist.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAO,MAAM,aAAa,CAAA;AACvC,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,EAOL,wBAAwB,EACxB,oBAAoB,EAEpB,eAAe,EACf,2BAA2B,EAC5B,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EACL,eAAe,EAAmB,cAAc,EACjD,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,OAAO,EAAE,MAAM,EAAE,eAAe,EACjC,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,EAAE,qBAAqB,EAA+B,MAAM,aAAa,CAAA;AAEhF,MAAM,MAAM,qBAAqB,CAAC,OAAO,SAAS,eAAe,CAAC,qBAAqB,CAAC,GAAG,eAAe,CAAC,qBAAqB,CAAC,IAC/H,eAAe,CAAC,OAAO,CAAC,CAAA;AAC1B,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;IAC7C,OAAO,CAAC,cAAc,CAAiC;IAEvD,IAAa,OAAO,aAUnB;IAED,SAAS,KAAK,KAAK,mEAGlB;IAED,SAAS,KAAK,aAAa,4DAG1B;IAED,SAAS,KAAK,GAAG,WAEhB;IAED,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAQ5B,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;cAMjE,UAAU,IAAI,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;cAIpD,YAAY,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;cAO9B,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;cAaxC,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;cAgBpD,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;cAWlE,aAAa,CAAC,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,EAAE;cAQ/E,WAAW,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;IActG,OAAO,CAAC,sBAAsB;IAM9B,OAAO,CAAC,oBAAoB;YAQd,oBAAoB;CAGnC"}
1
+ {"version":3,"file":"Archivist.d.ts","sourceRoot":"","sources":["../../src/Archivist.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,IAAI,EACL,MAAM,aAAa,CAAA;AACpB,OAAO,EACM,UAAU,EAAE,eAAe,EACvC,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAqB,MAAM,iCAAiC,CAAA;AACtF,OAAO,EAOL,wBAAwB,EACxB,oBAAoB,EAEpB,eAAe,EACf,wBAAwB,EAExB,2BAA2B,EAC5B,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EACL,eAAe,EAAmB,cAAc,EACjD,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,OAAO,EAAE,MAAM,EAAE,eAAe,EACjC,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,EAAE,qBAAqB,EAA+B,MAAM,aAAa,CAAA;AAEhF,MAAM,MAAM,qBAAqB,CAAC,OAAO,SAAS,eAAe,CAAC,qBAAqB,CAAC,GAAG,eAAe,CAAC,qBAAqB,CAAC,IAC/H,eAAe,CAAC,OAAO,CAAC,CAAA;AAC1B,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;IAClF,gBAAyB,MAAM;;MAAqD;IAEpF,OAAO,CAAC,MAAM,CAAC,CAA0C;IACzD,OAAO,CAAC,cAAc,CAAC,CAAsB;IAC7C,OAAO,CAAC,cAAc,CAAiC;IAEvD,IAAa,OAAO,aAUnB;IAED,SAAS,KAAK,KAAK,mEAGlB;IAED,SAAS,KAAK,aAAa,4DAG1B;IAED,SAAS,KAAK,GAAG,WAEhB;IAED,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAQ5B,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;cAMjE,UAAU,IAAI,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;cAIpD,YAAY,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;cAO9B,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;cAaxC,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;cAgBpD,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;cAWlE,aAAa,CAAC,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,EAAE;cAQ/E,WAAW,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;cAcnF,eAAe,IAAI,eAAe,CAAC,wBAAwB,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;IAa/G,OAAO,CAAC,sBAAsB;IAM9B,OAAO,CAAC,oBAAoB;YAQd,oBAAoB;CAGnC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/archivist-memory",
3
- "version": "3.14.17",
3
+ "version": "3.14.19",
4
4
  "description": "Primary SDK for using XYO Protocol 2.0",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -29,31 +29,30 @@
29
29
  "module": "dist/neutral/index.mjs",
30
30
  "types": "dist/types/index.d.ts",
31
31
  "dependencies": {
32
- "@xylabs/assert": "^4.9.3",
33
- "@xylabs/exists": "^4.9.3",
34
- "@xylabs/hex": "^4.9.3",
35
- "@xylabs/object": "^4.9.3",
36
- "@xylabs/promise": "^4.9.3",
37
- "@xyo-network/account": "^3.14.17",
38
- "@xyo-network/account-model": "^3.14.17",
39
- "@xyo-network/archivist-abstract": "^3.14.17",
40
- "@xyo-network/archivist-model": "^3.14.17",
41
- "@xyo-network/boundwitness-model": "^3.14.17",
42
- "@xyo-network/module-model": "^3.14.17",
43
- "@xyo-network/payload-builder": "^3.14.17",
44
- "@xyo-network/payload-model": "^3.14.17",
32
+ "@xylabs/assert": "^4.9.4",
33
+ "@xylabs/exists": "^4.9.4",
34
+ "@xylabs/hex": "^4.9.4",
35
+ "@xylabs/object": "^4.9.4",
36
+ "@xylabs/promise": "^4.9.4",
37
+ "@xyo-network/account": "^3.14.19",
38
+ "@xyo-network/account-model": "^3.14.19",
39
+ "@xyo-network/archivist-abstract": "^3.14.19",
40
+ "@xyo-network/archivist-model": "^3.14.19",
41
+ "@xyo-network/boundwitness-model": "^3.14.19",
42
+ "@xyo-network/module-model": "^3.14.19",
43
+ "@xyo-network/payload-builder": "^3.14.19",
44
+ "@xyo-network/payload-model": "^3.14.19",
45
45
  "lru-cache": "^11.1.0"
46
46
  },
47
47
  "devDependencies": {
48
- "@xylabs/delay": "^4.9.3",
48
+ "@xylabs/delay": "^4.9.4",
49
49
  "@xylabs/ts-scripts-yarn3": "^6.5.5",
50
50
  "@xylabs/tsconfig": "^6.5.5",
51
- "@xylabs/vitest-extended": "^4.9.3",
52
- "@xyo-network/archivist-acceptance-tests": "^3.14.17",
53
- "@xyo-network/id-payload-plugin": "^3.14.17",
54
- "@xyo-network/payload-wrapper": "^3.14.17",
55
- "@xyo-network/wallet": "^3.14.17",
56
- "knip": "^5.54.1",
51
+ "@xylabs/vitest-extended": "^4.9.4",
52
+ "@xyo-network/archivist-acceptance-tests": "^3.14.19",
53
+ "@xyo-network/id-payload-plugin": "^3.14.19",
54
+ "@xyo-network/payload-wrapper": "^3.14.19",
55
+ "@xyo-network/wallet": "^3.14.19",
57
56
  "typescript": "^5.8.3",
58
57
  "vitest": "^3.1.3"
59
58
  },
package/src/Archivist.ts CHANGED
@@ -1,10 +1,14 @@
1
1
  import { assertEx } from '@xylabs/assert'
2
2
  import { exists } from '@xylabs/exists'
3
- import { Hash, Hex } from '@xylabs/hex'
4
- import { fulfilled, Promisable } from '@xylabs/promise'
3
+ import {
4
+ Hash, Hex, hexToBigInt,
5
+ } from '@xylabs/hex'
6
+ import {
7
+ fulfilled, Promisable, PromisableArray,
8
+ } from '@xylabs/promise'
5
9
  import { Account } from '@xyo-network/account'
6
10
  import { AccountInstance } from '@xyo-network/account-model'
7
- import { AbstractArchivist } from '@xyo-network/archivist-abstract'
11
+ import { AbstractArchivist, StorageClassLabel } from '@xyo-network/archivist-abstract'
8
12
  import {
9
13
  ArchivistAllQuerySchema,
10
14
  ArchivistClearQuerySchema,
@@ -16,6 +20,8 @@ import {
16
20
  ArchivistNextOptions,
17
21
  ArchivistNextQuerySchema,
18
22
  ArchivistParams,
23
+ ArchivistSnapshotPayload,
24
+ ArchivistSnapshotPayloadSchema,
19
25
  AttachableArchivistInstance,
20
26
  } from '@xyo-network/archivist-model'
21
27
  import { BoundWitness } from '@xyo-network/boundwitness-model'
@@ -41,6 +47,7 @@ export class MemoryArchivist<
41
47
  implements AttachableArchivistInstance, ModuleInstance {
42
48
  static override readonly configSchemas: Schema[] = [...super.configSchemas, MemoryArchivistConfigSchema]
43
49
  static override readonly defaultConfigSchema: Schema = MemoryArchivistConfigSchema
50
+ static override readonly labels = { ...super.labels, [StorageClassLabel]: 'memory' }
44
51
 
45
52
  private _cache?: LRUCache<Hash, WithStorageMeta<Payload>>
46
53
  private _dataHashIndex?: LRUCache<Hash, Hash>
@@ -159,6 +166,19 @@ export class MemoryArchivist<
159
166
  return all.slice(startIndex, startIndex + limit)
160
167
  }
161
168
 
169
+ protected override snapshotHandler(): PromisableArray<ArchivistSnapshotPayload<WithStorageMeta<Payload>, Hash>> {
170
+ return [{
171
+ hash: Object.fromEntries(
172
+ [...this.cache.entries()].toSorted(([, payloadA], [, payloadB]) => {
173
+ const diff = hexToBigInt(payloadA._sequence) - hexToBigInt(payloadB._sequence)
174
+ return diff > 0n ? 1 : diff < 0n ? -1 : 0
175
+ }),
176
+ ),
177
+ dataHash: Object.fromEntries(this.dataHashIndex.entries()),
178
+ schema: ArchivistSnapshotPayloadSchema,
179
+ }]
180
+ }
181
+
162
182
  private insertPayloadIntoCache(payload: WithStorageMeta<Payload>): WithStorageMeta<Payload> {
163
183
  this.cache.set(payload._hash, payload)
164
184
  this.dataHashIndex.set(payload._dataHash, payload._hash)