@xyo-network/archivist-memory 3.14.18 → 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.
- package/dist/neutral/index.mjs +22 -3
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/types/Archivist.d.ts +6 -2
- package/dist/types/Archivist.d.ts.map +1 -1
- package/package.json +20 -20
- package/src/Archivist.ts +23 -3
package/dist/neutral/index.mjs
CHANGED
|
@@ -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 {
|
|
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,
|
|
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.
|
|
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,30 +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.
|
|
33
|
-
"@xylabs/exists": "^4.9.
|
|
34
|
-
"@xylabs/hex": "^4.9.
|
|
35
|
-
"@xylabs/object": "^4.9.
|
|
36
|
-
"@xylabs/promise": "^4.9.
|
|
37
|
-
"@xyo-network/account": "^3.14.
|
|
38
|
-
"@xyo-network/account-model": "^3.14.
|
|
39
|
-
"@xyo-network/archivist-abstract": "^3.14.
|
|
40
|
-
"@xyo-network/archivist-model": "^3.14.
|
|
41
|
-
"@xyo-network/boundwitness-model": "^3.14.
|
|
42
|
-
"@xyo-network/module-model": "^3.14.
|
|
43
|
-
"@xyo-network/payload-builder": "^3.14.
|
|
44
|
-
"@xyo-network/payload-model": "^3.14.
|
|
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.
|
|
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.
|
|
52
|
-
"@xyo-network/archivist-acceptance-tests": "^3.14.
|
|
53
|
-
"@xyo-network/id-payload-plugin": "^3.14.
|
|
54
|
-
"@xyo-network/payload-wrapper": "^3.14.
|
|
55
|
-
"@xyo-network/wallet": "^3.14.
|
|
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",
|
|
56
56
|
"typescript": "^5.8.3",
|
|
57
57
|
"vitest": "^3.1.3"
|
|
58
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 {
|
|
4
|
-
|
|
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)
|