@xyo-network/archivist-memory 3.6.0-rc.1 → 3.6.0-rc.2
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
|
|
4
|
+
import { AbstractArchivist } from '@xyo-network/archivist-abstract';
|
|
5
5
|
import { ArchivistConfig, ArchivistModuleEventData, ArchivistNextOptions, AttachableArchivistInstance } from '@xyo-network/archivist-model';
|
|
6
6
|
import { BoundWitness } from '@xyo-network/boundwitness-model';
|
|
7
7
|
import { AnyConfigSchema, ModuleInstance, ModuleParams } from '@xyo-network/module-model';
|
|
8
|
-
import { Payload, Schema } from '@xyo-network/payload-model';
|
|
8
|
+
import { Payload, Schema, WithStorageMeta } from '@xyo-network/payload-model';
|
|
9
9
|
import { LRUCache } from 'lru-cache';
|
|
10
10
|
export type MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config';
|
|
11
11
|
export declare const MemoryArchivistConfigSchema: MemoryArchivistConfigSchema;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC5D,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC5D,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAE,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;;sEAGlB;IAED,SAAS,KAAK,aAAa,4DAG1B;IAED,SAAS,KAAK,GAAG,WAEhB;cAEkB,UAAU,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;cAKnC,YAAY,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;cAM9B,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;cAaxC,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;cAepD,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;cAW3C,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;cAStD,WAAW,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAa1E,sBAAsB;YAOtB,oBAAoB;CAQnC"}
|
package/dist/neutral/index.mjs
CHANGED
|
@@ -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
|
|
21
|
+
var MemoryArchivist = class extends AbstractArchivist {
|
|
22
22
|
static {
|
|
23
23
|
__name(this, "MemoryArchivist");
|
|
24
24
|
}
|
|
@@ -57,7 +57,7 @@ var MemoryArchivist = class _MemoryArchivist extends AbstractArchivist {
|
|
|
57
57
|
}
|
|
58
58
|
allHandler() {
|
|
59
59
|
const all = this.cache.dump().map(([, item]) => item.value).filter(exists);
|
|
60
|
-
return
|
|
60
|
+
return PayloadBuilder.sortByStorageMeta(all);
|
|
61
61
|
}
|
|
62
62
|
clearHandler() {
|
|
63
63
|
this.cache.clear();
|
|
@@ -96,15 +96,15 @@ var MemoryArchivist = class _MemoryArchivist extends AbstractArchivist {
|
|
|
96
96
|
if (resolvedHash !== hash && !result) {
|
|
97
97
|
throw new Error("Missing referenced payload");
|
|
98
98
|
}
|
|
99
|
-
return
|
|
99
|
+
return result;
|
|
100
100
|
}).filter(exists);
|
|
101
101
|
}
|
|
102
102
|
async insertHandler(payloads) {
|
|
103
103
|
const pairs = await PayloadBuilder.hashPairs(payloads);
|
|
104
|
-
const insertedPayloads = await Promise.all(pairs.map(async ([payload, hash]
|
|
105
|
-
return this.cache.get(hash) ?? await this.insertPayloadIntoCache(payload
|
|
104
|
+
const insertedPayloads = await Promise.all(pairs.map(async ([payload, hash]) => {
|
|
105
|
+
return this.cache.get(hash) ?? await this.insertPayloadIntoCache(payload);
|
|
106
106
|
}));
|
|
107
|
-
return
|
|
107
|
+
return insertedPayloads;
|
|
108
108
|
}
|
|
109
109
|
async nextHandler(options) {
|
|
110
110
|
const { limit, offset, order } = options ?? {};
|
|
@@ -116,11 +116,10 @@ var MemoryArchivist = class _MemoryArchivist extends AbstractArchivist {
|
|
|
116
116
|
const startIndex = offset ? allPairs.findIndex(([, hash]) => hash === offset) + 1 : 0;
|
|
117
117
|
return allPairs.slice(startIndex, limit ? startIndex + limit : void 0).map(([payload]) => payload);
|
|
118
118
|
}
|
|
119
|
-
async insertPayloadIntoCache(payload
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
this.
|
|
123
|
-
this.dataHashIndex.set(dataHash, hash);
|
|
119
|
+
async insertPayloadIntoCache(payload) {
|
|
120
|
+
const withMeta = await PayloadBuilder.addStorageMeta(payload);
|
|
121
|
+
this.cache.set(withMeta._hash, withMeta);
|
|
122
|
+
this.dataHashIndex.set(withMeta._dataHash, withMeta._hash);
|
|
124
123
|
return withMeta;
|
|
125
124
|
}
|
|
126
125
|
async rebuildDataHashIndex() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/MemoryArchivist.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Hash } from '@xylabs/hex'\nimport { EmptyObject, WithAdditional } from '@xylabs/object'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist, WithStorageMeta } from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistConfig,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuery,\n ArchivistInsertQuerySchema,\n ArchivistModuleEventData,\n ArchivistNextOptions,\n ArchivistNextQuerySchema,\n AttachableArchivistInstance,\n} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport {\n AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams,\n} from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, Schema } from '@xyo-network/payload-model'\nimport { LRUCache } from 'lru-cache'\n\nexport type MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config'\nexport const MemoryArchivistConfigSchema: MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config'\n\nexport type MemoryArchivistConfig<TConfig extends Payload | EmptyObject | void = void, TSchema extends Schema | void = void> = ArchivistConfig<\n WithAdditional<\n {\n max?: number\n },\n TConfig\n >,\n TSchema extends Schema ? TSchema : MemoryArchivistConfigSchema | ArchivistConfig['schema']\n>\n\nexport type MemoryArchivistParams<TConfig extends AnyConfigSchema<MemoryArchivistConfig> = AnyConfigSchema<MemoryArchivistConfig>> =\n ModuleParams<TConfig>\n@creatableModule()\nexport class MemoryArchivist<\n TParams extends MemoryArchivistParams<AnyConfigSchema<MemoryArchivistConfig>> = MemoryArchivistParams,\n TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,\n>\n extends AbstractArchivist<TParams, TEventData>\n implements AttachableArchivistInstance, ModuleInstance {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, MemoryArchivistConfigSchema]\n static override readonly defaultConfigSchema: Schema = MemoryArchivistConfigSchema\n\n private _cache?: LRUCache<Hash, WithStorageMeta<Payload>>\n private _dataHashIndex?: LRUCache<Hash, Hash>\n\n override get queries() {\n return [\n ArchivistAllQuerySchema,\n ArchivistDeleteQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistInsertQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistNextQuerySchema,\n ...super.queries,\n ]\n }\n\n protected get cache() {\n this._cache = this._cache ?? new LRUCache<Hash, WithStorageMeta<Payload>>({ max: this.max })\n return this._cache\n }\n\n protected get dataHashIndex() {\n this._dataHashIndex = this._dataHashIndex ?? new LRUCache<Hash, Hash>({ max: this.max })\n return this._dataHashIndex\n }\n\n protected get max() {\n return this.config?.max ?? 10_000\n }\n\n protected override allHandler(): Promisable<Payload[]> {\n const all = this.cache.dump().map(([, item]) => item.value).filter(exists)\n return MemoryArchivist.sortByStorageMeta(all).map(payload => MemoryArchivist.removeStorageMeta(payload))\n }\n\n protected override clearHandler(): void | Promise<void> {\n this.cache.clear()\n this.dataHashIndex.clear()\n return this.emit('cleared', { mod: this })\n }\n\n protected override async commitHandler(): Promise<BoundWitness[]> {\n const payloads = assertEx(await this.allHandler(), () => 'Nothing to commit')\n const settled = await Promise.allSettled(\n Object.values((await this.parentArchivists()).commit ?? [])?.map(async (parent) => {\n const queryPayload: ArchivistInsertQuery = { schema: ArchivistInsertQuerySchema }\n const query = await this.bindQuery(queryPayload, payloads)\n return (await parent?.query(query[0], query[1]))?.[0]\n }).filter(exists),\n )\n await this.clearHandler()\n return settled.filter(fulfilled).map(result => result.value).filter(exists)\n }\n\n protected override async deleteHandler(hashes: Hash[]): Promise<Hash[]> {\n const deletedHashes: Hash[] = (await Promise.all(this.cache\n .dump()\n .map(async ([key, item]) => {\n const itemValueDataHash = await PayloadBuilder.dataHash(item.value)\n if (hashes.includes(key) || hashes.includes(itemValueDataHash)) {\n this.cache.delete(key)\n return key\n }\n })))\n .filter(exists)\n await this.rebuildDataHashIndex()\n return deletedHashes\n }\n\n protected override getHandler(hashes: Hash[]): Promisable<Payload[]> {\n return hashes.map((hash) => {\n const resolvedHash = this.dataHashIndex.get(hash) ?? hash\n const result = this.cache.get(resolvedHash)\n if (resolvedHash !== hash && !result) {\n throw new Error('Missing referenced payload')\n }\n return MemoryArchivist.removeStorageMeta(result)\n }).filter(exists)\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<Payload[]> {\n const pairs = await PayloadBuilder.hashPairs(payloads)\n const insertedPayloads = await Promise.all(pairs.map(async ([payload, hash], index) => {\n return this.cache.get(hash) ?? await this.insertPayloadIntoCache(payload, hash, index)\n }))\n\n return MemoryArchivist.removeStorageMeta(insertedPayloads)\n }\n\n protected override async nextHandler(options?: ArchivistNextOptions): Promise<Payload[]> {\n const {\n limit, offset, order,\n } = options ?? {}\n let all = await this.allHandler()\n if (order === 'desc') {\n all = all.reverse()\n }\n const allPairs = await PayloadBuilder.hashPairs(all)\n const startIndex = offset ? allPairs.findIndex(([, hash]) => hash === offset) + 1 : 0\n return allPairs.slice(startIndex, limit ? startIndex + limit : undefined).map(([payload]) => payload)\n }\n\n private async insertPayloadIntoCache(payload: Payload, hash: Hash, index = 0): Promise<WithStorageMeta<Payload>> {\n const dataHash = await PayloadBuilder.dataHash(payload)\n const withMeta = await MemoryArchivist.addSequencedStorageMeta(payload, index)\n this.cache.set(hash, withMeta)\n this.dataHashIndex.set(dataHash, hash)\n return withMeta\n }\n\n private async rebuildDataHashIndex() {\n this._dataHashIndex = new LRUCache<Hash, Hash>({ max: this.max })\n const pairs = this.cache.dump()\n for (const [hash, payload] of pairs) {\n const dataHash = await PayloadBuilder.dataHash(payload.value)\n this.dataHashIndex.set(dataHash, hash)\n }\n }\n}\n"],"mappings":"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","names":["assertEx","exists","fulfilled","AbstractArchivist","ArchivistAllQuerySchema","ArchivistClearQuerySchema","ArchivistCommitQuerySchema","ArchivistDeleteQuerySchema","ArchivistInsertQuerySchema","ArchivistNextQuerySchema","creatableModule","PayloadBuilder","LRUCache","MemoryArchivistConfigSchema","MemoryArchivist","AbstractArchivist","configSchemas","defaultConfigSchema","_cache","_dataHashIndex","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","ArchivistNextQuerySchema","cache","LRUCache","max","dataHashIndex","config","allHandler","all","dump","map","item","value","filter","exists","sortByStorageMeta","payload","removeStorageMeta","clearHandler","clear","emit","mod","commitHandler","payloads","assertEx","settled","Promise","allSettled","Object","values","parentArchivists","commit","parent","queryPayload","schema","query","bindQuery","fulfilled","result","deleteHandler","hashes","deletedHashes","key","itemValueDataHash","PayloadBuilder","dataHash","includes","delete","rebuildDataHashIndex","getHandler","hash","resolvedHash","get","Error","insertHandler","pairs","hashPairs","insertedPayloads","index","insertPayloadIntoCache","nextHandler","options","limit","offset","order","reverse","allPairs","startIndex","findIndex","slice","undefined","withMeta","addSequencedStorageMeta","set"]}
|
|
1
|
+
{"version":3,"sources":["../../src/MemoryArchivist.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Hash } 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 protected override allHandler(): Promisable<Payload[]> {\n const all = this.cache.dump().map(([, item]) => item.value).filter(exists)\n return PayloadBuilder.sortByStorageMeta(all)\n }\n\n protected override clearHandler(): void | Promise<void> {\n this.cache.clear()\n this.dataHashIndex.clear()\n return this.emit('cleared', { mod: this })\n }\n\n protected override async commitHandler(): Promise<BoundWitness[]> {\n const payloads = assertEx(await this.allHandler(), () => 'Nothing to commit')\n const settled = await Promise.allSettled(\n Object.values((await this.parentArchivists()).commit ?? [])?.map(async (parent) => {\n const queryPayload: ArchivistInsertQuery = { schema: ArchivistInsertQuerySchema }\n const query = await this.bindQuery(queryPayload, payloads)\n return (await parent?.query(query[0], query[1]))?.[0]\n }).filter(exists),\n )\n await this.clearHandler()\n return settled.filter(fulfilled).map(result => result.value).filter(exists)\n }\n\n protected override async deleteHandler(hashes: Hash[]): Promise<Hash[]> {\n const deletedHashes: Hash[] = (await Promise.all(this.cache\n .dump()\n .map(async ([key, item]) => {\n const itemValueDataHash = await PayloadBuilder.dataHash(item.value)\n if (hashes.includes(key) || hashes.includes(itemValueDataHash)) {\n this.cache.delete(key)\n return key\n }\n })))\n .filter(exists)\n await this.rebuildDataHashIndex()\n return deletedHashes\n }\n\n protected override getHandler(hashes: Hash[]): Promisable<Payload[]> {\n return hashes.map((hash) => {\n const resolvedHash = this.dataHashIndex.get(hash) ?? hash\n const result = this.cache.get(resolvedHash)\n if (resolvedHash !== hash && !result) {\n throw new Error('Missing referenced payload')\n }\n return result\n }).filter(exists)\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<Payload[]> {\n const pairs = await PayloadBuilder.hashPairs(payloads)\n const insertedPayloads = await Promise.all(pairs.map(async ([payload, hash]) => {\n return this.cache.get(hash) ?? await this.insertPayloadIntoCache(payload)\n }))\n\n return insertedPayloads\n }\n\n protected override async nextHandler(options?: ArchivistNextOptions): Promise<Payload[]> {\n const {\n limit, offset, order,\n } = options ?? {}\n let all = await this.allHandler()\n if (order === 'desc') {\n all = all.reverse()\n }\n const allPairs = await PayloadBuilder.hashPairs(all)\n const startIndex = offset ? allPairs.findIndex(([, hash]) => hash === offset) + 1 : 0\n return allPairs.slice(startIndex, limit ? startIndex + limit : undefined).map(([payload]) => payload)\n }\n\n private async insertPayloadIntoCache(payload: Payload): 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 async rebuildDataHashIndex() {\n this._dataHashIndex = new LRUCache<Hash, Hash>({ max: this.max })\n const pairs = this.cache.dump()\n for (const [hash, payload] of pairs) {\n const dataHash = await PayloadBuilder.dataHash(payload.value)\n this.dataHashIndex.set(dataHash, hash)\n }\n }\n}\n"],"mappings":";;;;AAAA,SAASA,gBAAgB;AACzB,SAASC,cAAc;AAGvB,SAASC,iBAA6B;AACtC,SAASC,yBAAyB;AAClC,SACEC,yBACAC,2BACAC,4BAEAC,4BAEAC,4BAGAC,gCAEK;AAEP,SACmBC,uBACZ;AACP,SAASC,sBAAsB;AAI/B,SAASC,gBAAgB;;;;;;;;AAGlB,IAAMC,8BAA2D;AAejE,IAAMC,kBAAN,cAIGC,kBAAAA;SAAAA;;;EAER,OAAyBC,gBAA0B;OAAI,MAAMA;IAAeH;;EAC5E,OAAyBI,sBAA8BJ;EAE/CK;EACAC;EAER,IAAaC,UAAU;AACrB,WAAO;MACLC;MACAC;MACAC;MACAC;MACAC;MACAC;SACG,MAAMN;;EAEb;EAEA,IAAcO,QAAQ;AACpB,SAAKT,SAAS,KAAKA,UAAU,IAAIU,SAAyC;MAAEC,KAAK,KAAKA;IAAI,CAAA;AAC1F,WAAO,KAAKX;EACd;EAEA,IAAcY,gBAAgB;AAC5B,SAAKX,iBAAiB,KAAKA,kBAAkB,IAAIS,SAAqB;MAAEC,KAAK,KAAKA;IAAI,CAAA;AACtF,WAAO,KAAKV;EACd;EAEA,IAAcU,MAAM;AAClB,WAAO,KAAKE,QAAQF,OAAO;EAC7B;EAEmBG,aAAoC;AACrD,UAAMC,MAAM,KAAKN,MAAMO,KAAI,EAAGC,IAAI,CAAC,CAAA,EAAGC,IAAAA,MAAUA,KAAKC,KAAK,EAAEC,OAAOC,MAAAA;AACnE,WAAOC,eAAeC,kBAAkBR,GAAAA;EAC1C;EAEmBS,eAAqC;AACtD,SAAKf,MAAMgB,MAAK;AAChB,SAAKb,cAAca,MAAK;AACxB,WAAO,KAAKC,KAAK,WAAW;MAAEC,KAAK;IAAK,CAAA;EAC1C;EAEA,MAAyBC,gBAAyC;AAChE,UAAMC,WAAWC,SAAS,MAAM,KAAKhB,WAAU,GAAI,MAAM,mBAAA;AACzD,UAAMiB,UAAU,MAAMC,QAAQC,WAC5BC,OAAOC,QAAQ,MAAM,KAAKC,iBAAgB,GAAIC,UAAU,CAAA,CAAE,GAAGpB,IAAI,OAAOqB,WAAAA;AACtE,YAAMC,eAAqC;QAAEC,QAAQlC;MAA2B;AAChF,YAAMmC,QAAQ,MAAM,KAAKC,UAAUH,cAAcV,QAAAA;AACjD,cAAQ,MAAMS,QAAQG,MAAMA,MAAM,CAAA,GAAIA,MAAM,CAAA,CAAE,KAAK,CAAA;IACrD,CAAA,EAAGrB,OAAOC,MAAAA,CAAAA;AAEZ,UAAM,KAAKG,aAAY;AACvB,WAAOO,QAAQX,OAAOuB,SAAAA,EAAW1B,IAAI2B,CAAAA,WAAUA,OAAOzB,KAAK,EAAEC,OAAOC,MAAAA;EACtE;EAEA,MAAyBwB,cAAcC,QAAiC;AACtE,UAAMC,iBAAyB,MAAMf,QAAQjB,IAAI,KAAKN,MACnDO,KAAI,EACJC,IAAI,OAAO,CAAC+B,KAAK9B,IAAAA,MAAK;AACrB,YAAM+B,oBAAoB,MAAM3B,eAAe4B,SAAShC,KAAKC,KAAK;AAClE,UAAI2B,OAAOK,SAASH,GAAAA,KAAQF,OAAOK,SAASF,iBAAAA,GAAoB;AAC9D,aAAKxC,MAAM2C,OAAOJ,GAAAA;AAClB,eAAOA;MACT;IACF,CAAA,CAAA,GACC5B,OAAOC,MAAAA;AACV,UAAM,KAAKgC,qBAAoB;AAC/B,WAAON;EACT;EAEmBO,WAAWR,QAAuC;AACnE,WAAOA,OAAO7B,IAAI,CAACsC,SAAAA;AACjB,YAAMC,eAAe,KAAK5C,cAAc6C,IAAIF,IAAAA,KAASA;AACrD,YAAMX,SAAS,KAAKnC,MAAMgD,IAAID,YAAAA;AAC9B,UAAIA,iBAAiBD,QAAQ,CAACX,QAAQ;AACpC,cAAM,IAAIc,MAAM,4BAAA;MAClB;AACA,aAAOd;IACT,CAAA,EAAGxB,OAAOC,MAAAA;EACZ;EAEA,MAAyBsC,cAAc9B,UAAyC;AAC9E,UAAM+B,QAAQ,MAAMtC,eAAeuC,UAAUhC,QAAAA;AAC7C,UAAMiC,mBAAmB,MAAM9B,QAAQjB,IAAI6C,MAAM3C,IAAI,OAAO,CAAC8C,SAASR,IAAAA,MAAK;AACzE,aAAO,KAAK9C,MAAMgD,IAAIF,IAAAA,KAAS,MAAM,KAAKS,uBAAuBD,OAAAA;IACnE,CAAA,CAAA;AAEA,WAAOD;EACT;EAEA,MAAyBG,YAAYC,SAAoD;AACvF,UAAM,EACJC,OAAOC,QAAQC,MAAK,IAClBH,WAAW,CAAC;AAChB,QAAInD,MAAM,MAAM,KAAKD,WAAU;AAC/B,QAAIuD,UAAU,QAAQ;AACpBtD,YAAMA,IAAIuD,QAAO;IACnB;AACA,UAAMC,WAAW,MAAMjD,eAAeuC,UAAU9C,GAAAA;AAChD,UAAMyD,aAAaJ,SAASG,SAASE,UAAU,CAAC,CAAA,EAAGlB,IAAAA,MAAUA,SAASa,MAAAA,IAAU,IAAI;AACpF,WAAOG,SAASG,MAAMF,YAAYL,QAAQK,aAAaL,QAAQQ,MAAAA,EAAW1D,IAAI,CAAC,CAAC8C,OAAAA,MAAaA,OAAAA;EAC/F;EAEA,MAAcC,uBAAuBD,SAAqD;AACxF,UAAMa,WAAW,MAAMtD,eAAeuD,eAAed,OAAAA;AACrD,SAAKtD,MAAMqE,IAAIF,SAASG,OAAOH,QAAAA;AAC/B,SAAKhE,cAAckE,IAAIF,SAASI,WAAWJ,SAASG,KAAK;AACzD,WAAOH;EACT;EAEA,MAAcvB,uBAAuB;AACnC,SAAKpD,iBAAiB,IAAIS,SAAqB;MAAEC,KAAK,KAAKA;IAAI,CAAA;AAC/D,UAAMiD,QAAQ,KAAKnD,MAAMO,KAAI;AAC7B,eAAW,CAACuC,MAAMQ,OAAAA,KAAYH,OAAO;AACnC,YAAMV,WAAW,MAAM5B,eAAe4B,SAASa,QAAQ5C,KAAK;AAC5D,WAAKP,cAAckE,IAAI5B,UAAUK,IAAAA;IACnC;EACF;AACF;;;;","names":["assertEx","exists","fulfilled","AbstractArchivist","ArchivistAllQuerySchema","ArchivistClearQuerySchema","ArchivistCommitQuerySchema","ArchivistDeleteQuerySchema","ArchivistInsertQuerySchema","ArchivistNextQuerySchema","creatableModule","PayloadBuilder","LRUCache","MemoryArchivistConfigSchema","MemoryArchivist","AbstractArchivist","configSchemas","defaultConfigSchema","_cache","_dataHashIndex","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","ArchivistNextQuerySchema","cache","LRUCache","max","dataHashIndex","config","allHandler","all","dump","map","item","value","filter","exists","PayloadBuilder","sortByStorageMeta","clearHandler","clear","emit","mod","commitHandler","payloads","assertEx","settled","Promise","allSettled","Object","values","parentArchivists","commit","parent","queryPayload","schema","query","bindQuery","fulfilled","result","deleteHandler","hashes","deletedHashes","key","itemValueDataHash","dataHash","includes","delete","rebuildDataHashIndex","getHandler","hash","resolvedHash","get","Error","insertHandler","pairs","hashPairs","insertedPayloads","payload","insertPayloadIntoCache","nextHandler","options","limit","offset","order","reverse","allPairs","startIndex","findIndex","slice","undefined","withMeta","addStorageMeta","set","_hash","_dataHash"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/archivist-memory",
|
|
3
|
-
"version": "3.6.0-rc.
|
|
3
|
+
"version": "3.6.0-rc.2",
|
|
4
4
|
"description": "Primary SDK for using XYO Protocol 2.0",
|
|
5
5
|
"homepage": "https://xyo.network",
|
|
6
6
|
"bugs": {
|
|
@@ -34,19 +34,19 @@
|
|
|
34
34
|
"@xylabs/hex": "^4.4.12",
|
|
35
35
|
"@xylabs/object": "^4.4.12",
|
|
36
36
|
"@xylabs/promise": "^4.4.12",
|
|
37
|
-
"@xyo-network/archivist-abstract": "^3.6.0-rc.
|
|
38
|
-
"@xyo-network/archivist-model": "^3.6.0-rc.
|
|
39
|
-
"@xyo-network/boundwitness-model": "^3.6.0-rc.
|
|
40
|
-
"@xyo-network/module-model": "^3.6.0-rc.
|
|
41
|
-
"@xyo-network/payload-builder": "^3.6.0-rc.
|
|
42
|
-
"@xyo-network/payload-model": "^3.6.0-rc.
|
|
37
|
+
"@xyo-network/archivist-abstract": "^3.6.0-rc.2",
|
|
38
|
+
"@xyo-network/archivist-model": "^3.6.0-rc.2",
|
|
39
|
+
"@xyo-network/boundwitness-model": "^3.6.0-rc.2",
|
|
40
|
+
"@xyo-network/module-model": "^3.6.0-rc.2",
|
|
41
|
+
"@xyo-network/payload-builder": "^3.6.0-rc.2",
|
|
42
|
+
"@xyo-network/payload-model": "^3.6.0-rc.2",
|
|
43
43
|
"lru-cache": "^11.0.2"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@xylabs/ts-scripts-yarn3": "^4.2.4",
|
|
47
47
|
"@xylabs/tsconfig": "^4.2.4",
|
|
48
48
|
"@xylabs/vitest-extended": "^4.4.12",
|
|
49
|
-
"@xyo-network/account": "^3.6.0-rc.
|
|
49
|
+
"@xyo-network/account": "^3.6.0-rc.2",
|
|
50
50
|
"typescript": "^5.7.2",
|
|
51
51
|
"vitest": "^2.1.8"
|
|
52
52
|
},
|
package/src/MemoryArchivist.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { exists } from '@xylabs/exists'
|
|
|
3
3
|
import { Hash } from '@xylabs/hex'
|
|
4
4
|
import { EmptyObject, WithAdditional } from '@xylabs/object'
|
|
5
5
|
import { fulfilled, Promisable } from '@xylabs/promise'
|
|
6
|
-
import { AbstractArchivist
|
|
6
|
+
import { AbstractArchivist } from '@xyo-network/archivist-abstract'
|
|
7
7
|
import {
|
|
8
8
|
ArchivistAllQuerySchema,
|
|
9
9
|
ArchivistClearQuerySchema,
|
|
@@ -22,7 +22,9 @@ import {
|
|
|
22
22
|
AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams,
|
|
23
23
|
} from '@xyo-network/module-model'
|
|
24
24
|
import { PayloadBuilder } from '@xyo-network/payload-builder'
|
|
25
|
-
import {
|
|
25
|
+
import {
|
|
26
|
+
Payload, Schema, WithStorageMeta,
|
|
27
|
+
} from '@xyo-network/payload-model'
|
|
26
28
|
import { LRUCache } from 'lru-cache'
|
|
27
29
|
|
|
28
30
|
export type MemoryArchivistConfigSchema = 'network.xyo.archivist.memory.config'
|
|
@@ -81,7 +83,7 @@ export class MemoryArchivist<
|
|
|
81
83
|
|
|
82
84
|
protected override allHandler(): Promisable<Payload[]> {
|
|
83
85
|
const all = this.cache.dump().map(([, item]) => item.value).filter(exists)
|
|
84
|
-
return
|
|
86
|
+
return PayloadBuilder.sortByStorageMeta(all)
|
|
85
87
|
}
|
|
86
88
|
|
|
87
89
|
protected override clearHandler(): void | Promise<void> {
|
|
@@ -125,17 +127,17 @@ export class MemoryArchivist<
|
|
|
125
127
|
if (resolvedHash !== hash && !result) {
|
|
126
128
|
throw new Error('Missing referenced payload')
|
|
127
129
|
}
|
|
128
|
-
return
|
|
130
|
+
return result
|
|
129
131
|
}).filter(exists)
|
|
130
132
|
}
|
|
131
133
|
|
|
132
134
|
protected override async insertHandler(payloads: Payload[]): Promise<Payload[]> {
|
|
133
135
|
const pairs = await PayloadBuilder.hashPairs(payloads)
|
|
134
|
-
const insertedPayloads = await Promise.all(pairs.map(async ([payload, hash]
|
|
135
|
-
return this.cache.get(hash) ?? await this.insertPayloadIntoCache(payload
|
|
136
|
+
const insertedPayloads = await Promise.all(pairs.map(async ([payload, hash]) => {
|
|
137
|
+
return this.cache.get(hash) ?? await this.insertPayloadIntoCache(payload)
|
|
136
138
|
}))
|
|
137
139
|
|
|
138
|
-
return
|
|
140
|
+
return insertedPayloads
|
|
139
141
|
}
|
|
140
142
|
|
|
141
143
|
protected override async nextHandler(options?: ArchivistNextOptions): Promise<Payload[]> {
|
|
@@ -151,11 +153,10 @@ export class MemoryArchivist<
|
|
|
151
153
|
return allPairs.slice(startIndex, limit ? startIndex + limit : undefined).map(([payload]) => payload)
|
|
152
154
|
}
|
|
153
155
|
|
|
154
|
-
private async insertPayloadIntoCache(payload: Payload
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
this.
|
|
158
|
-
this.dataHashIndex.set(dataHash, hash)
|
|
156
|
+
private async insertPayloadIntoCache(payload: Payload): Promise<WithStorageMeta<Payload>> {
|
|
157
|
+
const withMeta = await PayloadBuilder.addStorageMeta(payload)
|
|
158
|
+
this.cache.set(withMeta._hash, withMeta)
|
|
159
|
+
this.dataHashIndex.set(withMeta._dataHash, withMeta._hash)
|
|
159
160
|
return withMeta
|
|
160
161
|
}
|
|
161
162
|
|