@xyo-network/archivist-memory 2.92.2 → 2.92.4
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/browser/MemoryArchivist.d.cts +6 -5
- package/dist/browser/MemoryArchivist.d.cts.map +1 -1
- package/dist/browser/MemoryArchivist.d.mts +6 -5
- package/dist/browser/MemoryArchivist.d.mts.map +1 -1
- package/dist/browser/MemoryArchivist.d.ts +6 -5
- package/dist/browser/MemoryArchivist.d.ts.map +1 -1
- package/dist/browser/index.cjs +37 -23
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +37 -23
- package/dist/browser/index.js.map +1 -1
- package/dist/node/MemoryArchivist.d.cts +6 -5
- package/dist/node/MemoryArchivist.d.cts.map +1 -1
- package/dist/node/MemoryArchivist.d.mts +6 -5
- package/dist/node/MemoryArchivist.d.mts.map +1 -1
- package/dist/node/MemoryArchivist.d.ts +6 -5
- package/dist/node/MemoryArchivist.d.ts.map +1 -1
- package/dist/node/index.cjs +38 -24
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +38 -24
- package/dist/node/index.js.map +1 -1
- package/package.json +13 -12
- package/src/MemoryArchivist.ts +40 -28
|
@@ -15,19 +15,20 @@ export type MemoryArchivistConfig = ArchivistConfig<{
|
|
|
15
15
|
export type MemoryArchivistParams<TConfig extends AnyConfigSchema<MemoryArchivistConfig> = AnyConfigSchema<MemoryArchivistConfig>> = ModuleParams<TConfig>;
|
|
16
16
|
export declare class MemoryArchivist<TParams extends MemoryArchivistParams<AnyConfigSchema<MemoryArchivistConfig>> = MemoryArchivistParams, TEventData extends ArchivistModuleEventData = ArchivistModuleEventData> extends AbstractArchivist<TParams, TEventData> implements ArchivistInstance, ModuleInstance {
|
|
17
17
|
static configSchemas: string[];
|
|
18
|
-
private _bodyHashIndex?;
|
|
19
18
|
private _cache?;
|
|
20
|
-
|
|
21
|
-
get cache(): LRUCache<string, WithStorageMeta<PayloadWithMeta>, unknown>;
|
|
22
|
-
get max(): number;
|
|
19
|
+
private _dataHashIndex?;
|
|
23
20
|
get queries(): string[];
|
|
21
|
+
protected get cache(): LRUCache<Lowercase<string>, WithStorageMeta<PayloadWithMeta>, unknown>;
|
|
22
|
+
protected get dataHashIndex(): LRUCache<Lowercase<string>, Lowercase<string>, unknown>;
|
|
23
|
+
protected get max(): number;
|
|
24
24
|
protected allHandler(): Promisable<PayloadWithMeta[]>;
|
|
25
25
|
protected clearHandler(): void | Promise<void>;
|
|
26
26
|
protected commitHandler(): Promise<WithMeta<BoundWitness>[]>;
|
|
27
|
-
protected deleteHandler(hashes: Hash[]):
|
|
27
|
+
protected deleteHandler(hashes: Hash[]): Promisable<Hash[]>;
|
|
28
28
|
protected getHandler(hashes: Hash[]): Promisable<PayloadWithMeta[]>;
|
|
29
29
|
protected insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]>;
|
|
30
30
|
protected nextHandler(options?: ArchivistNextOptions): Promise<PayloadWithMeta[]>;
|
|
31
31
|
private insertPayloadIntoCache;
|
|
32
|
+
private rebuildDataHashIndex;
|
|
32
33
|
}
|
|
33
34
|
//# sourceMappingURL=MemoryArchivist.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAwD,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAC1I,OAAO,EAIL,eAAe,EAKf,iBAAiB,EACjB,wBAAwB,EACxB,oBAAoB,EAErB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAmB,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE1G,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAC/E,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,GAAG,eAAe,CAAC;IAClD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,2BAA2B,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;CAChE,CAAC,CAAA;AAEF,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,CACxB,OAAO,SAAS,qBAAqB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,GAAG,qBAAqB,EACrG,UAAU,SAAS,wBAAwB,GAAG,wBAAwB,CAExE,SAAQ,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAC7C,YAAW,iBAAiB,EAAE,cAAc;IAE5C,OAAgB,aAAa,WAAuD;IAEpF,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;cAiBxD,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;cAanD,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;IAOhG,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,oBAAoB;CAO7B"}
|
|
@@ -15,19 +15,20 @@ export type MemoryArchivistConfig = ArchivistConfig<{
|
|
|
15
15
|
export type MemoryArchivistParams<TConfig extends AnyConfigSchema<MemoryArchivistConfig> = AnyConfigSchema<MemoryArchivistConfig>> = ModuleParams<TConfig>;
|
|
16
16
|
export declare class MemoryArchivist<TParams extends MemoryArchivistParams<AnyConfigSchema<MemoryArchivistConfig>> = MemoryArchivistParams, TEventData extends ArchivistModuleEventData = ArchivistModuleEventData> extends AbstractArchivist<TParams, TEventData> implements ArchivistInstance, ModuleInstance {
|
|
17
17
|
static configSchemas: string[];
|
|
18
|
-
private _bodyHashIndex?;
|
|
19
18
|
private _cache?;
|
|
20
|
-
|
|
21
|
-
get cache(): LRUCache<string, WithStorageMeta<PayloadWithMeta>, unknown>;
|
|
22
|
-
get max(): number;
|
|
19
|
+
private _dataHashIndex?;
|
|
23
20
|
get queries(): string[];
|
|
21
|
+
protected get cache(): LRUCache<Lowercase<string>, WithStorageMeta<PayloadWithMeta>, unknown>;
|
|
22
|
+
protected get dataHashIndex(): LRUCache<Lowercase<string>, Lowercase<string>, unknown>;
|
|
23
|
+
protected get max(): number;
|
|
24
24
|
protected allHandler(): Promisable<PayloadWithMeta[]>;
|
|
25
25
|
protected clearHandler(): void | Promise<void>;
|
|
26
26
|
protected commitHandler(): Promise<WithMeta<BoundWitness>[]>;
|
|
27
|
-
protected deleteHandler(hashes: Hash[]):
|
|
27
|
+
protected deleteHandler(hashes: Hash[]): Promisable<Hash[]>;
|
|
28
28
|
protected getHandler(hashes: Hash[]): Promisable<PayloadWithMeta[]>;
|
|
29
29
|
protected insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]>;
|
|
30
30
|
protected nextHandler(options?: ArchivistNextOptions): Promise<PayloadWithMeta[]>;
|
|
31
31
|
private insertPayloadIntoCache;
|
|
32
|
+
private rebuildDataHashIndex;
|
|
32
33
|
}
|
|
33
34
|
//# sourceMappingURL=MemoryArchivist.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAwD,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAC1I,OAAO,EAIL,eAAe,EAKf,iBAAiB,EACjB,wBAAwB,EACxB,oBAAoB,EAErB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAmB,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE1G,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAC/E,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,GAAG,eAAe,CAAC;IAClD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,2BAA2B,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;CAChE,CAAC,CAAA;AAEF,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,CACxB,OAAO,SAAS,qBAAqB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,GAAG,qBAAqB,EACrG,UAAU,SAAS,wBAAwB,GAAG,wBAAwB,CAExE,SAAQ,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAC7C,YAAW,iBAAiB,EAAE,cAAc;IAE5C,OAAgB,aAAa,WAAuD;IAEpF,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;cAiBxD,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;cAanD,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;IAOhG,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,oBAAoB;CAO7B"}
|
|
@@ -15,19 +15,20 @@ export type MemoryArchivistConfig = ArchivistConfig<{
|
|
|
15
15
|
export type MemoryArchivistParams<TConfig extends AnyConfigSchema<MemoryArchivistConfig> = AnyConfigSchema<MemoryArchivistConfig>> = ModuleParams<TConfig>;
|
|
16
16
|
export declare class MemoryArchivist<TParams extends MemoryArchivistParams<AnyConfigSchema<MemoryArchivistConfig>> = MemoryArchivistParams, TEventData extends ArchivistModuleEventData = ArchivistModuleEventData> extends AbstractArchivist<TParams, TEventData> implements ArchivistInstance, ModuleInstance {
|
|
17
17
|
static configSchemas: string[];
|
|
18
|
-
private _bodyHashIndex?;
|
|
19
18
|
private _cache?;
|
|
20
|
-
|
|
21
|
-
get cache(): LRUCache<string, WithStorageMeta<PayloadWithMeta>, unknown>;
|
|
22
|
-
get max(): number;
|
|
19
|
+
private _dataHashIndex?;
|
|
23
20
|
get queries(): string[];
|
|
21
|
+
protected get cache(): LRUCache<Lowercase<string>, WithStorageMeta<PayloadWithMeta>, unknown>;
|
|
22
|
+
protected get dataHashIndex(): LRUCache<Lowercase<string>, Lowercase<string>, unknown>;
|
|
23
|
+
protected get max(): number;
|
|
24
24
|
protected allHandler(): Promisable<PayloadWithMeta[]>;
|
|
25
25
|
protected clearHandler(): void | Promise<void>;
|
|
26
26
|
protected commitHandler(): Promise<WithMeta<BoundWitness>[]>;
|
|
27
|
-
protected deleteHandler(hashes: Hash[]):
|
|
27
|
+
protected deleteHandler(hashes: Hash[]): Promisable<Hash[]>;
|
|
28
28
|
protected getHandler(hashes: Hash[]): Promisable<PayloadWithMeta[]>;
|
|
29
29
|
protected insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]>;
|
|
30
30
|
protected nextHandler(options?: ArchivistNextOptions): Promise<PayloadWithMeta[]>;
|
|
31
31
|
private insertPayloadIntoCache;
|
|
32
|
+
private rebuildDataHashIndex;
|
|
32
33
|
}
|
|
33
34
|
//# sourceMappingURL=MemoryArchivist.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAwD,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAC1I,OAAO,EAIL,eAAe,EAKf,iBAAiB,EACjB,wBAAwB,EACxB,oBAAoB,EAErB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAmB,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE1G,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAC/E,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,GAAG,eAAe,CAAC;IAClD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,2BAA2B,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;CAChE,CAAC,CAAA;AAEF,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,CACxB,OAAO,SAAS,qBAAqB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,GAAG,qBAAqB,EACrG,UAAU,SAAS,wBAAwB,GAAG,wBAAwB,CAExE,SAAQ,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAC7C,YAAW,iBAAiB,EAAE,cAAc;IAE5C,OAAgB,aAAa,WAAuD;IAEpF,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;cAiBxD,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;cAanD,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;IAOhG,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,oBAAoB;CAO7B"}
|
package/dist/browser/index.cjs
CHANGED
|
@@ -28,6 +28,7 @@ module.exports = __toCommonJS(src_exports);
|
|
|
28
28
|
|
|
29
29
|
// src/MemoryArchivist.ts
|
|
30
30
|
var import_assert = require("@xylabs/assert");
|
|
31
|
+
var import_exists = require("@xylabs/exists");
|
|
31
32
|
var import_lodash = require("@xylabs/lodash");
|
|
32
33
|
var import_promise = require("@xylabs/promise");
|
|
33
34
|
var import_archivist_abstract = require("@xyo-network/archivist-abstract");
|
|
@@ -55,23 +56,8 @@ var MemoryArchivist = class extends import_archivist_abstract.AbstractArchivist
|
|
|
55
56
|
MemoryArchivistConfigSchema,
|
|
56
57
|
import_archivist_model.ArchivistConfigSchema
|
|
57
58
|
];
|
|
58
|
-
_bodyHashIndex;
|
|
59
59
|
_cache;
|
|
60
|
-
|
|
61
|
-
this._bodyHashIndex = this._bodyHashIndex ?? new import_lru_cache.LRUCache({
|
|
62
|
-
max: this.max
|
|
63
|
-
});
|
|
64
|
-
return this._bodyHashIndex;
|
|
65
|
-
}
|
|
66
|
-
get cache() {
|
|
67
|
-
this._cache = this._cache ?? new import_lru_cache.LRUCache({
|
|
68
|
-
max: this.max
|
|
69
|
-
});
|
|
70
|
-
return this._cache;
|
|
71
|
-
}
|
|
72
|
-
get max() {
|
|
73
|
-
return this.config?.max ?? 1e4;
|
|
74
|
-
}
|
|
60
|
+
_dataHashIndex;
|
|
75
61
|
get queries() {
|
|
76
62
|
return [
|
|
77
63
|
import_archivist_model.ArchivistAllQuerySchema,
|
|
@@ -83,13 +69,28 @@ var MemoryArchivist = class extends import_archivist_abstract.AbstractArchivist
|
|
|
83
69
|
...super.queries
|
|
84
70
|
];
|
|
85
71
|
}
|
|
72
|
+
get cache() {
|
|
73
|
+
this._cache = this._cache ?? new import_lru_cache.LRUCache({
|
|
74
|
+
max: this.max
|
|
75
|
+
});
|
|
76
|
+
return this._cache;
|
|
77
|
+
}
|
|
78
|
+
get dataHashIndex() {
|
|
79
|
+
this._dataHashIndex = this._dataHashIndex ?? new import_lru_cache.LRUCache({
|
|
80
|
+
max: this.max
|
|
81
|
+
});
|
|
82
|
+
return this._dataHashIndex;
|
|
83
|
+
}
|
|
84
|
+
get max() {
|
|
85
|
+
return this.config?.max ?? 1e4;
|
|
86
|
+
}
|
|
86
87
|
allHandler() {
|
|
87
88
|
const all = (0, import_lodash.compact)(this.cache.dump().map(([, item]) => item.value));
|
|
88
89
|
return (0, import_archivist_abstract.sortByStorageMeta)(all).map((payload) => (0, import_archivist_abstract.removeStorageMeta)(payload));
|
|
89
90
|
}
|
|
90
91
|
clearHandler() {
|
|
91
92
|
this.cache.clear();
|
|
92
|
-
this.
|
|
93
|
+
this.dataHashIndex.clear();
|
|
93
94
|
return this.emit("cleared", {
|
|
94
95
|
module: this
|
|
95
96
|
});
|
|
@@ -106,15 +107,19 @@ var MemoryArchivist = class extends import_archivist_abstract.AbstractArchivist
|
|
|
106
107
|
await this.clearHandler();
|
|
107
108
|
return (0, import_lodash.compact)(settled.filter(import_promise.fulfilled).map((result) => result.value));
|
|
108
109
|
}
|
|
109
|
-
|
|
110
|
-
const deletedHashes =
|
|
111
|
-
|
|
112
|
-
|
|
110
|
+
deleteHandler(hashes) {
|
|
111
|
+
const deletedHashes = this.cache.dump().map(([key, item]) => {
|
|
112
|
+
if (hashes.includes(key) || hashes.includes(item.value.$hash)) {
|
|
113
|
+
this.cache.delete(key);
|
|
114
|
+
return key;
|
|
115
|
+
}
|
|
116
|
+
}).filter(import_exists.exists);
|
|
117
|
+
this.rebuildDataHashIndex();
|
|
113
118
|
return deletedHashes;
|
|
114
119
|
}
|
|
115
120
|
getHandler(hashes) {
|
|
116
121
|
return (0, import_lodash.compact)(hashes.map((hash) => {
|
|
117
|
-
const resolvedHash = this.
|
|
122
|
+
const resolvedHash = this.dataHashIndex.get(hash) ?? hash;
|
|
118
123
|
const result = this.cache.get(resolvedHash);
|
|
119
124
|
if (resolvedHash !== hash && !result) {
|
|
120
125
|
throw new Error("Missing referenced payload");
|
|
@@ -138,9 +143,18 @@ var MemoryArchivist = class extends import_archivist_abstract.AbstractArchivist
|
|
|
138
143
|
insertPayloadIntoCache(payload, hash, index = 0) {
|
|
139
144
|
const withMeta = (0, import_archivist_abstract.addStorageMeta)(payload, index);
|
|
140
145
|
this.cache.set(hash, withMeta);
|
|
141
|
-
this.
|
|
146
|
+
this.dataHashIndex.set(withMeta.$hash, hash);
|
|
142
147
|
return withMeta;
|
|
143
148
|
}
|
|
149
|
+
rebuildDataHashIndex() {
|
|
150
|
+
this._dataHashIndex = new import_lru_cache.LRUCache({
|
|
151
|
+
max: this.max
|
|
152
|
+
});
|
|
153
|
+
const pairs = this.cache.dump();
|
|
154
|
+
for (const [hash, payload] of pairs) {
|
|
155
|
+
this.dataHashIndex.set(payload.value.$hash, hash);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
144
158
|
};
|
|
145
159
|
MemoryArchivist = _ts_decorate([
|
|
146
160
|
(0, import_module_model.creatableModule)()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/MemoryArchivist.ts"],"sourcesContent":["export * from './MemoryArchivist'\n","import { assertEx } from '@xylabs/assert'\nimport { Hash } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta, WithStorageMeta } from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistConfig,\n ArchivistConfigSchema,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuery,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n ArchivistNextOptions,\n ArchivistNextQuerySchema,\n} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadWithMeta, WithMeta } 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 = ArchivistConfig<{\n max?: number\n schema: 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 ArchivistInstance, ModuleInstance\n{\n static override configSchemas = [MemoryArchivistConfigSchema, ArchivistConfigSchema]\n\n private _bodyHashIndex?: LRUCache<string, string>\n private _cache?: LRUCache<string, WithStorageMeta<PayloadWithMeta>>\n\n get bodyHashIndex() {\n this._bodyHashIndex = this._bodyHashIndex ?? new LRUCache<string, string>({ max: this.max })\n return this._bodyHashIndex\n }\n\n get cache() {\n this._cache = this._cache ?? new LRUCache<string, WithStorageMeta<PayloadWithMeta>>({ max: this.max })\n return this._cache\n }\n\n get max() {\n return this.config?.max ?? 10_000\n }\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 override allHandler(): Promisable<PayloadWithMeta[]> {\n const all = compact(this.cache.dump().map(([, item]) => item.value))\n return sortByStorageMeta(all).map((payload) => removeStorageMeta(payload))\n }\n\n protected override clearHandler(): void | Promise<void> {\n this.cache.clear()\n this.bodyHashIndex.clear()\n return this.emit('cleared', { module: 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 compact(\n Object.values((await this.parents()).commit ?? [])?.map(async (parent) => {\n const queryPayload: ArchivistInsertQuery = {\n schema: ArchivistInsertQuerySchema,\n }\n const query = await this.bindQuery(queryPayload, payloads)\n return (await parent?.query(query[0], query[1]))?.[0]\n }),\n ),\n )\n await this.clearHandler()\n return compact(settled.filter(fulfilled).map((result) => result.value))\n }\n\n protected override async deleteHandler(hashes: Hash[]): Promise<Hash[]> {\n const deletedHashes = compact(\n await Promise.all(\n hashes.map((hash) => {\n return this.cache.delete(hash) ? hash : undefined\n }),\n ),\n )\n return deletedHashes\n }\n\n protected override getHandler(hashes: Hash[]): Promisable<PayloadWithMeta[]> {\n return compact(\n hashes.map((hash) => {\n const resolvedHash = this.bodyHashIndex.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 }),\n )\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]> {\n const pairs = await PayloadBuilder.hashPairs(payloads)\n const insertedPayloads = pairs.map(([payload, hash]) => {\n return this.cache.get(hash) ?? this.insertPayloadIntoCache(payload, hash)\n })\n\n return removeStorageMeta(insertedPayloads)\n }\n\n protected override async nextHandler(options?: ArchivistNextOptions): Promise<PayloadWithMeta[]> {\n const { limit, previous } = options ?? {}\n const all = sortByStorageMeta(compact(await Promise.all(this.cache.dump().map((value) => value[1].value))))\n const startIndex = previous ? all.findIndex((value) => value.$hash === previous) + 1 : 0\n return removeStorageMeta(all.slice(startIndex, limit ? startIndex + limit : undefined))\n }\n\n private insertPayloadIntoCache(payload: PayloadWithMeta, hash: string, index = 0): WithStorageMeta<PayloadWithMeta> {\n const withMeta = addStorageMeta(payload, index)\n this.cache.set(hash, withMeta)\n this.bodyHashIndex.set(withMeta.$hash, hash)\n return withMeta\n }\n}\n"],"mappings":"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","names":["MemoryArchivistConfigSchema","MemoryArchivist","AbstractArchivist","configSchemas","ArchivistConfigSchema","_bodyHashIndex","_cache","bodyHashIndex","LRUCache","max","cache","config","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","ArchivistNextQuerySchema","allHandler","all","compact","dump","map","item","value","sortByStorageMeta","payload","removeStorageMeta","clearHandler","clear","emit","module","commitHandler","payloads","assertEx","settled","Promise","allSettled","Object","values","parents","commit","parent","queryPayload","schema","query","bindQuery","filter","fulfilled","result","deleteHandler","hashes","deletedHashes","hash","delete","undefined","getHandler","resolvedHash","get","Error","insertHandler","pairs","PayloadBuilder","hashPairs","insertedPayloads","insertPayloadIntoCache","nextHandler","options","limit","previous","startIndex","findIndex","$hash","slice","index","withMeta","addStorageMeta","set","creatableModule"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/MemoryArchivist.ts"],"sourcesContent":["export * from './MemoryArchivist'\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Hash } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta, WithStorageMeta } from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistConfig,\n ArchivistConfigSchema,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuery,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n ArchivistNextOptions,\n ArchivistNextQuerySchema,\n} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadWithMeta, WithMeta } 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 = ArchivistConfig<{\n max?: number\n schema: 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 ArchivistInstance, ModuleInstance\n{\n static override configSchemas = [MemoryArchivistConfigSchema, ArchivistConfigSchema]\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 = compact(this.cache.dump().map(([, item]) => item.value))\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', { module: 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 compact(\n Object.values((await this.parents()).commit ?? [])?.map(async (parent) => {\n const queryPayload: ArchivistInsertQuery = {\n schema: ArchivistInsertQuerySchema,\n }\n const query = await this.bindQuery(queryPayload, payloads)\n return (await parent?.query(query[0], query[1]))?.[0]\n }),\n ),\n )\n await this.clearHandler()\n return compact(settled.filter(fulfilled).map((result) => result.value))\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 compact(\n 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 }),\n )\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]> {\n const pairs = await PayloadBuilder.hashPairs(payloads)\n const insertedPayloads = pairs.map(([payload, hash]) => {\n return this.cache.get(hash) ?? this.insertPayloadIntoCache(payload, hash)\n })\n\n return removeStorageMeta(insertedPayloads)\n }\n\n protected override async nextHandler(options?: ArchivistNextOptions): Promise<PayloadWithMeta[]> {\n const { limit, previous } = options ?? {}\n const all = sortByStorageMeta(compact(await Promise.all(this.cache.dump().map((value) => value[1].value))))\n const startIndex = previous ? all.findIndex((value) => value.$hash === previous) + 1 : 0\n return removeStorageMeta(all.slice(startIndex, limit ? startIndex + limit : undefined))\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":["MemoryArchivistConfigSchema","MemoryArchivist","AbstractArchivist","configSchemas","ArchivistConfigSchema","_cache","_dataHashIndex","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","ArchivistNextQuerySchema","cache","LRUCache","max","dataHashIndex","config","allHandler","all","compact","dump","map","item","value","sortByStorageMeta","payload","removeStorageMeta","clearHandler","clear","emit","module","commitHandler","payloads","assertEx","settled","Promise","allSettled","Object","values","parents","commit","parent","queryPayload","schema","query","bindQuery","filter","fulfilled","result","deleteHandler","hashes","deletedHashes","key","includes","$hash","delete","exists","rebuildDataHashIndex","getHandler","hash","resolvedHash","get","Error","insertHandler","pairs","PayloadBuilder","hashPairs","insertedPayloads","insertPayloadIntoCache","nextHandler","options","limit","previous","startIndex","findIndex","slice","undefined","index","withMeta","addStorageMeta","set","creatableModule"]}
|
package/dist/browser/index.js
CHANGED
|
@@ -3,6 +3,7 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
|
|
|
3
3
|
|
|
4
4
|
// src/MemoryArchivist.ts
|
|
5
5
|
import { assertEx } from "@xylabs/assert";
|
|
6
|
+
import { exists } from "@xylabs/exists";
|
|
6
7
|
import { compact } from "@xylabs/lodash";
|
|
7
8
|
import { fulfilled } from "@xylabs/promise";
|
|
8
9
|
import { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta } from "@xyo-network/archivist-abstract";
|
|
@@ -30,23 +31,8 @@ var MemoryArchivist = class extends AbstractArchivist {
|
|
|
30
31
|
MemoryArchivistConfigSchema,
|
|
31
32
|
ArchivistConfigSchema
|
|
32
33
|
];
|
|
33
|
-
_bodyHashIndex;
|
|
34
34
|
_cache;
|
|
35
|
-
|
|
36
|
-
this._bodyHashIndex = this._bodyHashIndex ?? new LRUCache({
|
|
37
|
-
max: this.max
|
|
38
|
-
});
|
|
39
|
-
return this._bodyHashIndex;
|
|
40
|
-
}
|
|
41
|
-
get cache() {
|
|
42
|
-
this._cache = this._cache ?? new LRUCache({
|
|
43
|
-
max: this.max
|
|
44
|
-
});
|
|
45
|
-
return this._cache;
|
|
46
|
-
}
|
|
47
|
-
get max() {
|
|
48
|
-
return this.config?.max ?? 1e4;
|
|
49
|
-
}
|
|
35
|
+
_dataHashIndex;
|
|
50
36
|
get queries() {
|
|
51
37
|
return [
|
|
52
38
|
ArchivistAllQuerySchema,
|
|
@@ -58,13 +44,28 @@ var MemoryArchivist = class extends AbstractArchivist {
|
|
|
58
44
|
...super.queries
|
|
59
45
|
];
|
|
60
46
|
}
|
|
47
|
+
get cache() {
|
|
48
|
+
this._cache = this._cache ?? new LRUCache({
|
|
49
|
+
max: this.max
|
|
50
|
+
});
|
|
51
|
+
return this._cache;
|
|
52
|
+
}
|
|
53
|
+
get dataHashIndex() {
|
|
54
|
+
this._dataHashIndex = this._dataHashIndex ?? new LRUCache({
|
|
55
|
+
max: this.max
|
|
56
|
+
});
|
|
57
|
+
return this._dataHashIndex;
|
|
58
|
+
}
|
|
59
|
+
get max() {
|
|
60
|
+
return this.config?.max ?? 1e4;
|
|
61
|
+
}
|
|
61
62
|
allHandler() {
|
|
62
63
|
const all = compact(this.cache.dump().map(([, item]) => item.value));
|
|
63
64
|
return sortByStorageMeta(all).map((payload) => removeStorageMeta(payload));
|
|
64
65
|
}
|
|
65
66
|
clearHandler() {
|
|
66
67
|
this.cache.clear();
|
|
67
|
-
this.
|
|
68
|
+
this.dataHashIndex.clear();
|
|
68
69
|
return this.emit("cleared", {
|
|
69
70
|
module: this
|
|
70
71
|
});
|
|
@@ -81,15 +82,19 @@ var MemoryArchivist = class extends AbstractArchivist {
|
|
|
81
82
|
await this.clearHandler();
|
|
82
83
|
return compact(settled.filter(fulfilled).map((result) => result.value));
|
|
83
84
|
}
|
|
84
|
-
|
|
85
|
-
const deletedHashes =
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
deleteHandler(hashes) {
|
|
86
|
+
const deletedHashes = this.cache.dump().map(([key, item]) => {
|
|
87
|
+
if (hashes.includes(key) || hashes.includes(item.value.$hash)) {
|
|
88
|
+
this.cache.delete(key);
|
|
89
|
+
return key;
|
|
90
|
+
}
|
|
91
|
+
}).filter(exists);
|
|
92
|
+
this.rebuildDataHashIndex();
|
|
88
93
|
return deletedHashes;
|
|
89
94
|
}
|
|
90
95
|
getHandler(hashes) {
|
|
91
96
|
return compact(hashes.map((hash) => {
|
|
92
|
-
const resolvedHash = this.
|
|
97
|
+
const resolvedHash = this.dataHashIndex.get(hash) ?? hash;
|
|
93
98
|
const result = this.cache.get(resolvedHash);
|
|
94
99
|
if (resolvedHash !== hash && !result) {
|
|
95
100
|
throw new Error("Missing referenced payload");
|
|
@@ -113,9 +118,18 @@ var MemoryArchivist = class extends AbstractArchivist {
|
|
|
113
118
|
insertPayloadIntoCache(payload, hash, index = 0) {
|
|
114
119
|
const withMeta = addStorageMeta(payload, index);
|
|
115
120
|
this.cache.set(hash, withMeta);
|
|
116
|
-
this.
|
|
121
|
+
this.dataHashIndex.set(withMeta.$hash, hash);
|
|
117
122
|
return withMeta;
|
|
118
123
|
}
|
|
124
|
+
rebuildDataHashIndex() {
|
|
125
|
+
this._dataHashIndex = new LRUCache({
|
|
126
|
+
max: this.max
|
|
127
|
+
});
|
|
128
|
+
const pairs = this.cache.dump();
|
|
129
|
+
for (const [hash, payload] of pairs) {
|
|
130
|
+
this.dataHashIndex.set(payload.value.$hash, hash);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
119
133
|
};
|
|
120
134
|
MemoryArchivist = _ts_decorate([
|
|
121
135
|
creatableModule()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/MemoryArchivist.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { Hash } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta, WithStorageMeta } from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistConfig,\n ArchivistConfigSchema,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuery,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n ArchivistNextOptions,\n ArchivistNextQuerySchema,\n} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadWithMeta, WithMeta } 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 = ArchivistConfig<{\n max?: number\n schema: 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 ArchivistInstance, ModuleInstance\n{\n static override configSchemas = [MemoryArchivistConfigSchema, ArchivistConfigSchema]\n\n private _bodyHashIndex?: LRUCache<string, string>\n private _cache?: LRUCache<string, WithStorageMeta<PayloadWithMeta>>\n\n get bodyHashIndex() {\n this._bodyHashIndex = this._bodyHashIndex ?? new LRUCache<string, string>({ max: this.max })\n return this._bodyHashIndex\n }\n\n get cache() {\n this._cache = this._cache ?? new LRUCache<string, WithStorageMeta<PayloadWithMeta>>({ max: this.max })\n return this._cache\n }\n\n get max() {\n return this.config?.max ?? 10_000\n }\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 override allHandler(): Promisable<PayloadWithMeta[]> {\n const all = compact(this.cache.dump().map(([, item]) => item.value))\n return sortByStorageMeta(all).map((payload) => removeStorageMeta(payload))\n }\n\n protected override clearHandler(): void | Promise<void> {\n this.cache.clear()\n this.bodyHashIndex.clear()\n return this.emit('cleared', { module: 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 compact(\n Object.values((await this.parents()).commit ?? [])?.map(async (parent) => {\n const queryPayload: ArchivistInsertQuery = {\n schema: ArchivistInsertQuerySchema,\n }\n const query = await this.bindQuery(queryPayload, payloads)\n return (await parent?.query(query[0], query[1]))?.[0]\n }),\n ),\n )\n await this.clearHandler()\n return compact(settled.filter(fulfilled).map((result) => result.value))\n }\n\n protected override async deleteHandler(hashes: Hash[]): Promise<Hash[]> {\n const deletedHashes = compact(\n await Promise.all(\n hashes.map((hash) => {\n return this.cache.delete(hash) ? hash : undefined\n }),\n ),\n )\n return deletedHashes\n }\n\n protected override getHandler(hashes: Hash[]): Promisable<PayloadWithMeta[]> {\n return compact(\n hashes.map((hash) => {\n const resolvedHash = this.bodyHashIndex.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 }),\n )\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]> {\n const pairs = await PayloadBuilder.hashPairs(payloads)\n const insertedPayloads = pairs.map(([payload, hash]) => {\n return this.cache.get(hash) ?? this.insertPayloadIntoCache(payload, hash)\n })\n\n return removeStorageMeta(insertedPayloads)\n }\n\n protected override async nextHandler(options?: ArchivistNextOptions): Promise<PayloadWithMeta[]> {\n const { limit, previous } = options ?? {}\n const all = sortByStorageMeta(compact(await Promise.all(this.cache.dump().map((value) => value[1].value))))\n const startIndex = previous ? all.findIndex((value) => value.$hash === previous) + 1 : 0\n return removeStorageMeta(all.slice(startIndex, limit ? startIndex + limit : undefined))\n }\n\n private insertPayloadIntoCache(payload: PayloadWithMeta, hash: string, index = 0): WithStorageMeta<PayloadWithMeta> {\n const withMeta = addStorageMeta(payload, index)\n this.cache.set(hash, withMeta)\n this.bodyHashIndex.set(withMeta.$hash, hash)\n return withMeta\n }\n}\n"],"mappings":"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","names":["assertEx","compact","fulfilled","AbstractArchivist","addStorageMeta","removeStorageMeta","sortByStorageMeta","ArchivistAllQuerySchema","ArchivistClearQuerySchema","ArchivistCommitQuerySchema","ArchivistConfigSchema","ArchivistDeleteQuerySchema","ArchivistInsertQuerySchema","ArchivistNextQuerySchema","creatableModule","PayloadBuilder","LRUCache","MemoryArchivistConfigSchema","MemoryArchivist","AbstractArchivist","configSchemas","ArchivistConfigSchema","_bodyHashIndex","_cache","bodyHashIndex","LRUCache","max","cache","config","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","ArchivistNextQuerySchema","allHandler","all","compact","dump","map","item","value","sortByStorageMeta","payload","removeStorageMeta","clearHandler","clear","emit","module","commitHandler","payloads","assertEx","settled","Promise","allSettled","Object","values","parents","commit","parent","queryPayload","schema","query","bindQuery","filter","fulfilled","result","deleteHandler","hashes","deletedHashes","hash","delete","undefined","getHandler","resolvedHash","get","Error","insertHandler","pairs","PayloadBuilder","hashPairs","insertedPayloads","insertPayloadIntoCache","nextHandler","options","limit","previous","startIndex","findIndex","$hash","slice","index","withMeta","addStorageMeta","set","creatableModule"]}
|
|
1
|
+
{"version":3,"sources":["../../src/MemoryArchivist.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Hash } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta, WithStorageMeta } from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistConfig,\n ArchivistConfigSchema,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuery,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n ArchivistNextOptions,\n ArchivistNextQuerySchema,\n} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadWithMeta, WithMeta } 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 = ArchivistConfig<{\n max?: number\n schema: 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 ArchivistInstance, ModuleInstance\n{\n static override configSchemas = [MemoryArchivistConfigSchema, ArchivistConfigSchema]\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 = compact(this.cache.dump().map(([, item]) => item.value))\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', { module: 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 compact(\n Object.values((await this.parents()).commit ?? [])?.map(async (parent) => {\n const queryPayload: ArchivistInsertQuery = {\n schema: ArchivistInsertQuerySchema,\n }\n const query = await this.bindQuery(queryPayload, payloads)\n return (await parent?.query(query[0], query[1]))?.[0]\n }),\n ),\n )\n await this.clearHandler()\n return compact(settled.filter(fulfilled).map((result) => result.value))\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 compact(\n 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 }),\n )\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]> {\n const pairs = await PayloadBuilder.hashPairs(payloads)\n const insertedPayloads = pairs.map(([payload, hash]) => {\n return this.cache.get(hash) ?? this.insertPayloadIntoCache(payload, hash)\n })\n\n return removeStorageMeta(insertedPayloads)\n }\n\n protected override async nextHandler(options?: ArchivistNextOptions): Promise<PayloadWithMeta[]> {\n const { limit, previous } = options ?? {}\n const all = sortByStorageMeta(compact(await Promise.all(this.cache.dump().map((value) => value[1].value))))\n const startIndex = previous ? all.findIndex((value) => value.$hash === previous) + 1 : 0\n return removeStorageMeta(all.slice(startIndex, limit ? startIndex + limit : undefined))\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","compact","fulfilled","AbstractArchivist","addStorageMeta","removeStorageMeta","sortByStorageMeta","ArchivistAllQuerySchema","ArchivistClearQuerySchema","ArchivistCommitQuerySchema","ArchivistConfigSchema","ArchivistDeleteQuerySchema","ArchivistInsertQuerySchema","ArchivistNextQuerySchema","creatableModule","PayloadBuilder","LRUCache","MemoryArchivistConfigSchema","MemoryArchivist","AbstractArchivist","configSchemas","ArchivistConfigSchema","_cache","_dataHashIndex","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","ArchivistNextQuerySchema","cache","LRUCache","max","dataHashIndex","config","allHandler","all","compact","dump","map","item","value","sortByStorageMeta","payload","removeStorageMeta","clearHandler","clear","emit","module","commitHandler","payloads","assertEx","settled","Promise","allSettled","Object","values","parents","commit","parent","queryPayload","schema","query","bindQuery","filter","fulfilled","result","deleteHandler","hashes","deletedHashes","key","includes","$hash","delete","exists","rebuildDataHashIndex","getHandler","hash","resolvedHash","get","Error","insertHandler","pairs","PayloadBuilder","hashPairs","insertedPayloads","insertPayloadIntoCache","nextHandler","options","limit","previous","startIndex","findIndex","slice","undefined","index","withMeta","addStorageMeta","set","creatableModule"]}
|
|
@@ -15,19 +15,20 @@ export type MemoryArchivistConfig = ArchivistConfig<{
|
|
|
15
15
|
export type MemoryArchivistParams<TConfig extends AnyConfigSchema<MemoryArchivistConfig> = AnyConfigSchema<MemoryArchivistConfig>> = ModuleParams<TConfig>;
|
|
16
16
|
export declare class MemoryArchivist<TParams extends MemoryArchivistParams<AnyConfigSchema<MemoryArchivistConfig>> = MemoryArchivistParams, TEventData extends ArchivistModuleEventData = ArchivistModuleEventData> extends AbstractArchivist<TParams, TEventData> implements ArchivistInstance, ModuleInstance {
|
|
17
17
|
static configSchemas: string[];
|
|
18
|
-
private _bodyHashIndex?;
|
|
19
18
|
private _cache?;
|
|
20
|
-
|
|
21
|
-
get cache(): LRUCache<string, WithStorageMeta<PayloadWithMeta>, unknown>;
|
|
22
|
-
get max(): number;
|
|
19
|
+
private _dataHashIndex?;
|
|
23
20
|
get queries(): string[];
|
|
21
|
+
protected get cache(): LRUCache<Lowercase<string>, WithStorageMeta<PayloadWithMeta>, unknown>;
|
|
22
|
+
protected get dataHashIndex(): LRUCache<Lowercase<string>, Lowercase<string>, unknown>;
|
|
23
|
+
protected get max(): number;
|
|
24
24
|
protected allHandler(): Promisable<PayloadWithMeta[]>;
|
|
25
25
|
protected clearHandler(): void | Promise<void>;
|
|
26
26
|
protected commitHandler(): Promise<WithMeta<BoundWitness>[]>;
|
|
27
|
-
protected deleteHandler(hashes: Hash[]):
|
|
27
|
+
protected deleteHandler(hashes: Hash[]): Promisable<Hash[]>;
|
|
28
28
|
protected getHandler(hashes: Hash[]): Promisable<PayloadWithMeta[]>;
|
|
29
29
|
protected insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]>;
|
|
30
30
|
protected nextHandler(options?: ArchivistNextOptions): Promise<PayloadWithMeta[]>;
|
|
31
31
|
private insertPayloadIntoCache;
|
|
32
|
+
private rebuildDataHashIndex;
|
|
32
33
|
}
|
|
33
34
|
//# sourceMappingURL=MemoryArchivist.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAwD,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAC1I,OAAO,EAIL,eAAe,EAKf,iBAAiB,EACjB,wBAAwB,EACxB,oBAAoB,EAErB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAmB,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE1G,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAC/E,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,GAAG,eAAe,CAAC;IAClD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,2BAA2B,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;CAChE,CAAC,CAAA;AAEF,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,CACxB,OAAO,SAAS,qBAAqB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,GAAG,qBAAqB,EACrG,UAAU,SAAS,wBAAwB,GAAG,wBAAwB,CAExE,SAAQ,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAC7C,YAAW,iBAAiB,EAAE,cAAc;IAE5C,OAAgB,aAAa,WAAuD;IAEpF,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;cAiBxD,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;cAanD,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;IAOhG,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,oBAAoB;CAO7B"}
|
|
@@ -15,19 +15,20 @@ export type MemoryArchivistConfig = ArchivistConfig<{
|
|
|
15
15
|
export type MemoryArchivistParams<TConfig extends AnyConfigSchema<MemoryArchivistConfig> = AnyConfigSchema<MemoryArchivistConfig>> = ModuleParams<TConfig>;
|
|
16
16
|
export declare class MemoryArchivist<TParams extends MemoryArchivistParams<AnyConfigSchema<MemoryArchivistConfig>> = MemoryArchivistParams, TEventData extends ArchivistModuleEventData = ArchivistModuleEventData> extends AbstractArchivist<TParams, TEventData> implements ArchivistInstance, ModuleInstance {
|
|
17
17
|
static configSchemas: string[];
|
|
18
|
-
private _bodyHashIndex?;
|
|
19
18
|
private _cache?;
|
|
20
|
-
|
|
21
|
-
get cache(): LRUCache<string, WithStorageMeta<PayloadWithMeta>, unknown>;
|
|
22
|
-
get max(): number;
|
|
19
|
+
private _dataHashIndex?;
|
|
23
20
|
get queries(): string[];
|
|
21
|
+
protected get cache(): LRUCache<Lowercase<string>, WithStorageMeta<PayloadWithMeta>, unknown>;
|
|
22
|
+
protected get dataHashIndex(): LRUCache<Lowercase<string>, Lowercase<string>, unknown>;
|
|
23
|
+
protected get max(): number;
|
|
24
24
|
protected allHandler(): Promisable<PayloadWithMeta[]>;
|
|
25
25
|
protected clearHandler(): void | Promise<void>;
|
|
26
26
|
protected commitHandler(): Promise<WithMeta<BoundWitness>[]>;
|
|
27
|
-
protected deleteHandler(hashes: Hash[]):
|
|
27
|
+
protected deleteHandler(hashes: Hash[]): Promisable<Hash[]>;
|
|
28
28
|
protected getHandler(hashes: Hash[]): Promisable<PayloadWithMeta[]>;
|
|
29
29
|
protected insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]>;
|
|
30
30
|
protected nextHandler(options?: ArchivistNextOptions): Promise<PayloadWithMeta[]>;
|
|
31
31
|
private insertPayloadIntoCache;
|
|
32
|
+
private rebuildDataHashIndex;
|
|
32
33
|
}
|
|
33
34
|
//# sourceMappingURL=MemoryArchivist.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAwD,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAC1I,OAAO,EAIL,eAAe,EAKf,iBAAiB,EACjB,wBAAwB,EACxB,oBAAoB,EAErB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAmB,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE1G,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAC/E,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,GAAG,eAAe,CAAC;IAClD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,2BAA2B,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;CAChE,CAAC,CAAA;AAEF,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,CACxB,OAAO,SAAS,qBAAqB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,GAAG,qBAAqB,EACrG,UAAU,SAAS,wBAAwB,GAAG,wBAAwB,CAExE,SAAQ,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAC7C,YAAW,iBAAiB,EAAE,cAAc;IAE5C,OAAgB,aAAa,WAAuD;IAEpF,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;cAiBxD,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;cAanD,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;IAOhG,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,oBAAoB;CAO7B"}
|
|
@@ -15,19 +15,20 @@ export type MemoryArchivistConfig = ArchivistConfig<{
|
|
|
15
15
|
export type MemoryArchivistParams<TConfig extends AnyConfigSchema<MemoryArchivistConfig> = AnyConfigSchema<MemoryArchivistConfig>> = ModuleParams<TConfig>;
|
|
16
16
|
export declare class MemoryArchivist<TParams extends MemoryArchivistParams<AnyConfigSchema<MemoryArchivistConfig>> = MemoryArchivistParams, TEventData extends ArchivistModuleEventData = ArchivistModuleEventData> extends AbstractArchivist<TParams, TEventData> implements ArchivistInstance, ModuleInstance {
|
|
17
17
|
static configSchemas: string[];
|
|
18
|
-
private _bodyHashIndex?;
|
|
19
18
|
private _cache?;
|
|
20
|
-
|
|
21
|
-
get cache(): LRUCache<string, WithStorageMeta<PayloadWithMeta>, unknown>;
|
|
22
|
-
get max(): number;
|
|
19
|
+
private _dataHashIndex?;
|
|
23
20
|
get queries(): string[];
|
|
21
|
+
protected get cache(): LRUCache<Lowercase<string>, WithStorageMeta<PayloadWithMeta>, unknown>;
|
|
22
|
+
protected get dataHashIndex(): LRUCache<Lowercase<string>, Lowercase<string>, unknown>;
|
|
23
|
+
protected get max(): number;
|
|
24
24
|
protected allHandler(): Promisable<PayloadWithMeta[]>;
|
|
25
25
|
protected clearHandler(): void | Promise<void>;
|
|
26
26
|
protected commitHandler(): Promise<WithMeta<BoundWitness>[]>;
|
|
27
|
-
protected deleteHandler(hashes: Hash[]):
|
|
27
|
+
protected deleteHandler(hashes: Hash[]): Promisable<Hash[]>;
|
|
28
28
|
protected getHandler(hashes: Hash[]): Promisable<PayloadWithMeta[]>;
|
|
29
29
|
protected insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]>;
|
|
30
30
|
protected nextHandler(options?: ArchivistNextOptions): Promise<PayloadWithMeta[]>;
|
|
31
31
|
private insertPayloadIntoCache;
|
|
32
|
+
private rebuildDataHashIndex;
|
|
32
33
|
}
|
|
33
34
|
//# sourceMappingURL=MemoryArchivist.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MemoryArchivist.d.ts","sourceRoot":"","sources":["../../src/MemoryArchivist.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAwD,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAC1I,OAAO,EAIL,eAAe,EAKf,iBAAiB,EACjB,wBAAwB,EACxB,oBAAoB,EAErB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAmB,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE1G,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAC/E,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,GAAG,eAAe,CAAC;IAClD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,2BAA2B,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;CAChE,CAAC,CAAA;AAEF,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,CACxB,OAAO,SAAS,qBAAqB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,GAAG,qBAAqB,EACrG,UAAU,SAAS,wBAAwB,GAAG,wBAAwB,CAExE,SAAQ,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAC7C,YAAW,iBAAiB,EAAE,cAAc;IAE5C,OAAgB,aAAa,WAAuD;IAEpF,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;cAiBxD,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;cAanD,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;IAOhG,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,oBAAoB;CAO7B"}
|
package/dist/node/index.cjs
CHANGED
|
@@ -33,6 +33,7 @@ module.exports = __toCommonJS(src_exports);
|
|
|
33
33
|
|
|
34
34
|
// src/MemoryArchivist.ts
|
|
35
35
|
var import_assert = require("@xylabs/assert");
|
|
36
|
+
var import_exists = require("@xylabs/exists");
|
|
36
37
|
var import_lodash = require("@xylabs/lodash");
|
|
37
38
|
var import_promise = require("@xylabs/promise");
|
|
38
39
|
var import_archivist_abstract = require("@xyo-network/archivist-abstract");
|
|
@@ -53,24 +54,8 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
53
54
|
__name(_ts_decorate, "_ts_decorate");
|
|
54
55
|
var MemoryArchivistConfigSchema = "network.xyo.archivist.memory.config";
|
|
55
56
|
var _MemoryArchivist = class _MemoryArchivist extends import_archivist_abstract.AbstractArchivist {
|
|
56
|
-
_bodyHashIndex;
|
|
57
57
|
_cache;
|
|
58
|
-
|
|
59
|
-
this._bodyHashIndex = this._bodyHashIndex ?? new import_lru_cache.LRUCache({
|
|
60
|
-
max: this.max
|
|
61
|
-
});
|
|
62
|
-
return this._bodyHashIndex;
|
|
63
|
-
}
|
|
64
|
-
get cache() {
|
|
65
|
-
this._cache = this._cache ?? new import_lru_cache.LRUCache({
|
|
66
|
-
max: this.max
|
|
67
|
-
});
|
|
68
|
-
return this._cache;
|
|
69
|
-
}
|
|
70
|
-
get max() {
|
|
71
|
-
var _a;
|
|
72
|
-
return ((_a = this.config) == null ? void 0 : _a.max) ?? 1e4;
|
|
73
|
-
}
|
|
58
|
+
_dataHashIndex;
|
|
74
59
|
get queries() {
|
|
75
60
|
return [
|
|
76
61
|
import_archivist_model.ArchivistAllQuerySchema,
|
|
@@ -82,13 +67,29 @@ var _MemoryArchivist = class _MemoryArchivist extends import_archivist_abstract.
|
|
|
82
67
|
...super.queries
|
|
83
68
|
];
|
|
84
69
|
}
|
|
70
|
+
get cache() {
|
|
71
|
+
this._cache = this._cache ?? new import_lru_cache.LRUCache({
|
|
72
|
+
max: this.max
|
|
73
|
+
});
|
|
74
|
+
return this._cache;
|
|
75
|
+
}
|
|
76
|
+
get dataHashIndex() {
|
|
77
|
+
this._dataHashIndex = this._dataHashIndex ?? new import_lru_cache.LRUCache({
|
|
78
|
+
max: this.max
|
|
79
|
+
});
|
|
80
|
+
return this._dataHashIndex;
|
|
81
|
+
}
|
|
82
|
+
get max() {
|
|
83
|
+
var _a;
|
|
84
|
+
return ((_a = this.config) == null ? void 0 : _a.max) ?? 1e4;
|
|
85
|
+
}
|
|
85
86
|
allHandler() {
|
|
86
87
|
const all = (0, import_lodash.compact)(this.cache.dump().map(([, item]) => item.value));
|
|
87
88
|
return (0, import_archivist_abstract.sortByStorageMeta)(all).map((payload) => (0, import_archivist_abstract.removeStorageMeta)(payload));
|
|
88
89
|
}
|
|
89
90
|
clearHandler() {
|
|
90
91
|
this.cache.clear();
|
|
91
|
-
this.
|
|
92
|
+
this.dataHashIndex.clear();
|
|
92
93
|
return this.emit("cleared", {
|
|
93
94
|
module: this
|
|
94
95
|
});
|
|
@@ -107,15 +108,19 @@ var _MemoryArchivist = class _MemoryArchivist extends import_archivist_abstract.
|
|
|
107
108
|
await this.clearHandler();
|
|
108
109
|
return (0, import_lodash.compact)(settled.filter(import_promise.fulfilled).map((result) => result.value));
|
|
109
110
|
}
|
|
110
|
-
|
|
111
|
-
const deletedHashes =
|
|
112
|
-
|
|
113
|
-
|
|
111
|
+
deleteHandler(hashes) {
|
|
112
|
+
const deletedHashes = this.cache.dump().map(([key, item]) => {
|
|
113
|
+
if (hashes.includes(key) || hashes.includes(item.value.$hash)) {
|
|
114
|
+
this.cache.delete(key);
|
|
115
|
+
return key;
|
|
116
|
+
}
|
|
117
|
+
}).filter(import_exists.exists);
|
|
118
|
+
this.rebuildDataHashIndex();
|
|
114
119
|
return deletedHashes;
|
|
115
120
|
}
|
|
116
121
|
getHandler(hashes) {
|
|
117
122
|
return (0, import_lodash.compact)(hashes.map((hash) => {
|
|
118
|
-
const resolvedHash = this.
|
|
123
|
+
const resolvedHash = this.dataHashIndex.get(hash) ?? hash;
|
|
119
124
|
const result = this.cache.get(resolvedHash);
|
|
120
125
|
if (resolvedHash !== hash && !result) {
|
|
121
126
|
throw new Error("Missing referenced payload");
|
|
@@ -139,9 +144,18 @@ var _MemoryArchivist = class _MemoryArchivist extends import_archivist_abstract.
|
|
|
139
144
|
insertPayloadIntoCache(payload, hash, index = 0) {
|
|
140
145
|
const withMeta = (0, import_archivist_abstract.addStorageMeta)(payload, index);
|
|
141
146
|
this.cache.set(hash, withMeta);
|
|
142
|
-
this.
|
|
147
|
+
this.dataHashIndex.set(withMeta.$hash, hash);
|
|
143
148
|
return withMeta;
|
|
144
149
|
}
|
|
150
|
+
rebuildDataHashIndex() {
|
|
151
|
+
this._dataHashIndex = new import_lru_cache.LRUCache({
|
|
152
|
+
max: this.max
|
|
153
|
+
});
|
|
154
|
+
const pairs = this.cache.dump();
|
|
155
|
+
for (const [hash, payload] of pairs) {
|
|
156
|
+
this.dataHashIndex.set(payload.value.$hash, hash);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
145
159
|
};
|
|
146
160
|
__name(_MemoryArchivist, "MemoryArchivist");
|
|
147
161
|
__publicField(_MemoryArchivist, "configSchemas", [
|
package/dist/node/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/MemoryArchivist.ts"],"sourcesContent":["export * from './MemoryArchivist'\n","import { assertEx } from '@xylabs/assert'\nimport { Hash } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta, WithStorageMeta } from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistConfig,\n ArchivistConfigSchema,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuery,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n ArchivistNextOptions,\n ArchivistNextQuerySchema,\n} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadWithMeta, WithMeta } 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 = ArchivistConfig<{\n max?: number\n schema: 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 ArchivistInstance, ModuleInstance\n{\n static override configSchemas = [MemoryArchivistConfigSchema, ArchivistConfigSchema]\n\n private _bodyHashIndex?: LRUCache<string, string>\n private _cache?: LRUCache<string, WithStorageMeta<PayloadWithMeta>>\n\n get bodyHashIndex() {\n this._bodyHashIndex = this._bodyHashIndex ?? new LRUCache<string, string>({ max: this.max })\n return this._bodyHashIndex\n }\n\n get cache() {\n this._cache = this._cache ?? new LRUCache<string, WithStorageMeta<PayloadWithMeta>>({ max: this.max })\n return this._cache\n }\n\n get max() {\n return this.config?.max ?? 10_000\n }\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 override allHandler(): Promisable<PayloadWithMeta[]> {\n const all = compact(this.cache.dump().map(([, item]) => item.value))\n return sortByStorageMeta(all).map((payload) => removeStorageMeta(payload))\n }\n\n protected override clearHandler(): void | Promise<void> {\n this.cache.clear()\n this.bodyHashIndex.clear()\n return this.emit('cleared', { module: 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 compact(\n Object.values((await this.parents()).commit ?? [])?.map(async (parent) => {\n const queryPayload: ArchivistInsertQuery = {\n schema: ArchivistInsertQuerySchema,\n }\n const query = await this.bindQuery(queryPayload, payloads)\n return (await parent?.query(query[0], query[1]))?.[0]\n }),\n ),\n )\n await this.clearHandler()\n return compact(settled.filter(fulfilled).map((result) => result.value))\n }\n\n protected override async deleteHandler(hashes: Hash[]): Promise<Hash[]> {\n const deletedHashes = compact(\n await Promise.all(\n hashes.map((hash) => {\n return this.cache.delete(hash) ? hash : undefined\n }),\n ),\n )\n return deletedHashes\n }\n\n protected override getHandler(hashes: Hash[]): Promisable<PayloadWithMeta[]> {\n return compact(\n hashes.map((hash) => {\n const resolvedHash = this.bodyHashIndex.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 }),\n )\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]> {\n const pairs = await PayloadBuilder.hashPairs(payloads)\n const insertedPayloads = pairs.map(([payload, hash]) => {\n return this.cache.get(hash) ?? this.insertPayloadIntoCache(payload, hash)\n })\n\n return removeStorageMeta(insertedPayloads)\n }\n\n protected override async nextHandler(options?: ArchivistNextOptions): Promise<PayloadWithMeta[]> {\n const { limit, previous } = options ?? {}\n const all = sortByStorageMeta(compact(await Promise.all(this.cache.dump().map((value) => value[1].value))))\n const startIndex = previous ? all.findIndex((value) => value.$hash === previous) + 1 : 0\n return removeStorageMeta(all.slice(startIndex, limit ? startIndex + limit : undefined))\n }\n\n private insertPayloadIntoCache(payload: PayloadWithMeta, hash: string, index = 0): WithStorageMeta<PayloadWithMeta> {\n const withMeta = addStorageMeta(payload, index)\n this.cache.set(hash, withMeta)\n this.bodyHashIndex.set(withMeta.$hash, hash)\n return withMeta\n }\n}\n"],"mappings":"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","names":["MemoryArchivistConfigSchema","MemoryArchivist","AbstractArchivist","_bodyHashIndex","_cache","bodyHashIndex","LRUCache","max","cache","config","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","ArchivistNextQuerySchema","allHandler","all","compact","dump","map","item","value","sortByStorageMeta","payload","removeStorageMeta","clearHandler","clear","emit","module","commitHandler","payloads","assertEx","settled","Promise","allSettled","Object","values","parents","commit","parent","queryPayload","schema","query","bindQuery","_a","filter","fulfilled","result","deleteHandler","hashes","deletedHashes","hash","delete","undefined","getHandler","resolvedHash","get","Error","insertHandler","pairs","PayloadBuilder","hashPairs","insertedPayloads","insertPayloadIntoCache","nextHandler","options","limit","previous","startIndex","findIndex","$hash","slice","index","withMeta","addStorageMeta","set","configSchemas","ArchivistConfigSchema","creatableModule"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/MemoryArchivist.ts"],"sourcesContent":["export * from './MemoryArchivist'\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Hash } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta, WithStorageMeta } from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistConfig,\n ArchivistConfigSchema,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuery,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n ArchivistNextOptions,\n ArchivistNextQuerySchema,\n} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadWithMeta, WithMeta } 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 = ArchivistConfig<{\n max?: number\n schema: 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 ArchivistInstance, ModuleInstance\n{\n static override configSchemas = [MemoryArchivistConfigSchema, ArchivistConfigSchema]\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 = compact(this.cache.dump().map(([, item]) => item.value))\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', { module: 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 compact(\n Object.values((await this.parents()).commit ?? [])?.map(async (parent) => {\n const queryPayload: ArchivistInsertQuery = {\n schema: ArchivistInsertQuerySchema,\n }\n const query = await this.bindQuery(queryPayload, payloads)\n return (await parent?.query(query[0], query[1]))?.[0]\n }),\n ),\n )\n await this.clearHandler()\n return compact(settled.filter(fulfilled).map((result) => result.value))\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 compact(\n 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 }),\n )\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]> {\n const pairs = await PayloadBuilder.hashPairs(payloads)\n const insertedPayloads = pairs.map(([payload, hash]) => {\n return this.cache.get(hash) ?? this.insertPayloadIntoCache(payload, hash)\n })\n\n return removeStorageMeta(insertedPayloads)\n }\n\n protected override async nextHandler(options?: ArchivistNextOptions): Promise<PayloadWithMeta[]> {\n const { limit, previous } = options ?? {}\n const all = sortByStorageMeta(compact(await Promise.all(this.cache.dump().map((value) => value[1].value))))\n const startIndex = previous ? all.findIndex((value) => value.$hash === previous) + 1 : 0\n return removeStorageMeta(all.slice(startIndex, limit ? startIndex + limit : undefined))\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":["MemoryArchivistConfigSchema","MemoryArchivist","AbstractArchivist","_cache","_dataHashIndex","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","ArchivistNextQuerySchema","cache","LRUCache","max","dataHashIndex","config","allHandler","all","compact","dump","map","item","value","sortByStorageMeta","payload","removeStorageMeta","clearHandler","clear","emit","module","commitHandler","payloads","assertEx","settled","Promise","allSettled","Object","values","parents","commit","parent","queryPayload","schema","query","bindQuery","_a","filter","fulfilled","result","deleteHandler","hashes","deletedHashes","key","includes","$hash","delete","exists","rebuildDataHashIndex","getHandler","hash","resolvedHash","get","Error","insertHandler","pairs","PayloadBuilder","hashPairs","insertedPayloads","insertPayloadIntoCache","nextHandler","options","limit","previous","startIndex","findIndex","slice","undefined","index","withMeta","addStorageMeta","set","configSchemas","ArchivistConfigSchema","creatableModule"]}
|
package/dist/node/index.js
CHANGED
|
@@ -8,6 +8,7 @@ var __publicField = (obj, key, value) => {
|
|
|
8
8
|
|
|
9
9
|
// src/MemoryArchivist.ts
|
|
10
10
|
import { assertEx } from "@xylabs/assert";
|
|
11
|
+
import { exists } from "@xylabs/exists";
|
|
11
12
|
import { compact } from "@xylabs/lodash";
|
|
12
13
|
import { fulfilled } from "@xylabs/promise";
|
|
13
14
|
import { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta } from "@xyo-network/archivist-abstract";
|
|
@@ -28,24 +29,8 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
28
29
|
__name(_ts_decorate, "_ts_decorate");
|
|
29
30
|
var MemoryArchivistConfigSchema = "network.xyo.archivist.memory.config";
|
|
30
31
|
var _MemoryArchivist = class _MemoryArchivist extends AbstractArchivist {
|
|
31
|
-
_bodyHashIndex;
|
|
32
32
|
_cache;
|
|
33
|
-
|
|
34
|
-
this._bodyHashIndex = this._bodyHashIndex ?? new LRUCache({
|
|
35
|
-
max: this.max
|
|
36
|
-
});
|
|
37
|
-
return this._bodyHashIndex;
|
|
38
|
-
}
|
|
39
|
-
get cache() {
|
|
40
|
-
this._cache = this._cache ?? new LRUCache({
|
|
41
|
-
max: this.max
|
|
42
|
-
});
|
|
43
|
-
return this._cache;
|
|
44
|
-
}
|
|
45
|
-
get max() {
|
|
46
|
-
var _a;
|
|
47
|
-
return ((_a = this.config) == null ? void 0 : _a.max) ?? 1e4;
|
|
48
|
-
}
|
|
33
|
+
_dataHashIndex;
|
|
49
34
|
get queries() {
|
|
50
35
|
return [
|
|
51
36
|
ArchivistAllQuerySchema,
|
|
@@ -57,13 +42,29 @@ var _MemoryArchivist = class _MemoryArchivist extends AbstractArchivist {
|
|
|
57
42
|
...super.queries
|
|
58
43
|
];
|
|
59
44
|
}
|
|
45
|
+
get cache() {
|
|
46
|
+
this._cache = this._cache ?? new LRUCache({
|
|
47
|
+
max: this.max
|
|
48
|
+
});
|
|
49
|
+
return this._cache;
|
|
50
|
+
}
|
|
51
|
+
get dataHashIndex() {
|
|
52
|
+
this._dataHashIndex = this._dataHashIndex ?? new LRUCache({
|
|
53
|
+
max: this.max
|
|
54
|
+
});
|
|
55
|
+
return this._dataHashIndex;
|
|
56
|
+
}
|
|
57
|
+
get max() {
|
|
58
|
+
var _a;
|
|
59
|
+
return ((_a = this.config) == null ? void 0 : _a.max) ?? 1e4;
|
|
60
|
+
}
|
|
60
61
|
allHandler() {
|
|
61
62
|
const all = compact(this.cache.dump().map(([, item]) => item.value));
|
|
62
63
|
return sortByStorageMeta(all).map((payload) => removeStorageMeta(payload));
|
|
63
64
|
}
|
|
64
65
|
clearHandler() {
|
|
65
66
|
this.cache.clear();
|
|
66
|
-
this.
|
|
67
|
+
this.dataHashIndex.clear();
|
|
67
68
|
return this.emit("cleared", {
|
|
68
69
|
module: this
|
|
69
70
|
});
|
|
@@ -82,15 +83,19 @@ var _MemoryArchivist = class _MemoryArchivist extends AbstractArchivist {
|
|
|
82
83
|
await this.clearHandler();
|
|
83
84
|
return compact(settled.filter(fulfilled).map((result) => result.value));
|
|
84
85
|
}
|
|
85
|
-
|
|
86
|
-
const deletedHashes =
|
|
87
|
-
|
|
88
|
-
|
|
86
|
+
deleteHandler(hashes) {
|
|
87
|
+
const deletedHashes = this.cache.dump().map(([key, item]) => {
|
|
88
|
+
if (hashes.includes(key) || hashes.includes(item.value.$hash)) {
|
|
89
|
+
this.cache.delete(key);
|
|
90
|
+
return key;
|
|
91
|
+
}
|
|
92
|
+
}).filter(exists);
|
|
93
|
+
this.rebuildDataHashIndex();
|
|
89
94
|
return deletedHashes;
|
|
90
95
|
}
|
|
91
96
|
getHandler(hashes) {
|
|
92
97
|
return compact(hashes.map((hash) => {
|
|
93
|
-
const resolvedHash = this.
|
|
98
|
+
const resolvedHash = this.dataHashIndex.get(hash) ?? hash;
|
|
94
99
|
const result = this.cache.get(resolvedHash);
|
|
95
100
|
if (resolvedHash !== hash && !result) {
|
|
96
101
|
throw new Error("Missing referenced payload");
|
|
@@ -114,9 +119,18 @@ var _MemoryArchivist = class _MemoryArchivist extends AbstractArchivist {
|
|
|
114
119
|
insertPayloadIntoCache(payload, hash, index = 0) {
|
|
115
120
|
const withMeta = addStorageMeta(payload, index);
|
|
116
121
|
this.cache.set(hash, withMeta);
|
|
117
|
-
this.
|
|
122
|
+
this.dataHashIndex.set(withMeta.$hash, hash);
|
|
118
123
|
return withMeta;
|
|
119
124
|
}
|
|
125
|
+
rebuildDataHashIndex() {
|
|
126
|
+
this._dataHashIndex = new LRUCache({
|
|
127
|
+
max: this.max
|
|
128
|
+
});
|
|
129
|
+
const pairs = this.cache.dump();
|
|
130
|
+
for (const [hash, payload] of pairs) {
|
|
131
|
+
this.dataHashIndex.set(payload.value.$hash, hash);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
120
134
|
};
|
|
121
135
|
__name(_MemoryArchivist, "MemoryArchivist");
|
|
122
136
|
__publicField(_MemoryArchivist, "configSchemas", [
|
package/dist/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/MemoryArchivist.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { Hash } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta, WithStorageMeta } from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistConfig,\n ArchivistConfigSchema,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuery,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n ArchivistNextOptions,\n ArchivistNextQuerySchema,\n} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadWithMeta, WithMeta } 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 = ArchivistConfig<{\n max?: number\n schema: 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 ArchivistInstance, ModuleInstance\n{\n static override configSchemas = [MemoryArchivistConfigSchema, ArchivistConfigSchema]\n\n private _bodyHashIndex?: LRUCache<string, string>\n private _cache?: LRUCache<string, WithStorageMeta<PayloadWithMeta>>\n\n get bodyHashIndex() {\n this._bodyHashIndex = this._bodyHashIndex ?? new LRUCache<string, string>({ max: this.max })\n return this._bodyHashIndex\n }\n\n get cache() {\n this._cache = this._cache ?? new LRUCache<string, WithStorageMeta<PayloadWithMeta>>({ max: this.max })\n return this._cache\n }\n\n get max() {\n return this.config?.max ?? 10_000\n }\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 override allHandler(): Promisable<PayloadWithMeta[]> {\n const all = compact(this.cache.dump().map(([, item]) => item.value))\n return sortByStorageMeta(all).map((payload) => removeStorageMeta(payload))\n }\n\n protected override clearHandler(): void | Promise<void> {\n this.cache.clear()\n this.bodyHashIndex.clear()\n return this.emit('cleared', { module: 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 compact(\n Object.values((await this.parents()).commit ?? [])?.map(async (parent) => {\n const queryPayload: ArchivistInsertQuery = {\n schema: ArchivistInsertQuerySchema,\n }\n const query = await this.bindQuery(queryPayload, payloads)\n return (await parent?.query(query[0], query[1]))?.[0]\n }),\n ),\n )\n await this.clearHandler()\n return compact(settled.filter(fulfilled).map((result) => result.value))\n }\n\n protected override async deleteHandler(hashes: Hash[]): Promise<Hash[]> {\n const deletedHashes = compact(\n await Promise.all(\n hashes.map((hash) => {\n return this.cache.delete(hash) ? hash : undefined\n }),\n ),\n )\n return deletedHashes\n }\n\n protected override getHandler(hashes: Hash[]): Promisable<PayloadWithMeta[]> {\n return compact(\n hashes.map((hash) => {\n const resolvedHash = this.bodyHashIndex.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 }),\n )\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]> {\n const pairs = await PayloadBuilder.hashPairs(payloads)\n const insertedPayloads = pairs.map(([payload, hash]) => {\n return this.cache.get(hash) ?? this.insertPayloadIntoCache(payload, hash)\n })\n\n return removeStorageMeta(insertedPayloads)\n }\n\n protected override async nextHandler(options?: ArchivistNextOptions): Promise<PayloadWithMeta[]> {\n const { limit, previous } = options ?? {}\n const all = sortByStorageMeta(compact(await Promise.all(this.cache.dump().map((value) => value[1].value))))\n const startIndex = previous ? all.findIndex((value) => value.$hash === previous) + 1 : 0\n return removeStorageMeta(all.slice(startIndex, limit ? startIndex + limit : undefined))\n }\n\n private insertPayloadIntoCache(payload: PayloadWithMeta, hash: string, index = 0): WithStorageMeta<PayloadWithMeta> {\n const withMeta = addStorageMeta(payload, index)\n this.cache.set(hash, withMeta)\n this.bodyHashIndex.set(withMeta.$hash, hash)\n return withMeta\n }\n}\n"],"mappings":";;;;;;;;;AAAA,SAASA,gBAAgB;AAEzB,SAASC,eAAe;AACxB,SAASC,iBAA6B;AACtC,SAASC,mBAAmBC,gBAAgBC,mBAAmBC,yBAA0C;AACzG,SACEC,yBACAC,2BACAC,4BAEAC,uBACAC,4BAEAC,4BAIAC,gCACK;AAEP,SAA0BC,uBAAqD;AAC/E,SAASC,sBAAsB;AAE/B,SAASC,gBAAgB;;;;;;;;;;;;AAGlB,IAAMC,8BAA2D;AAUjE,IAAMC,mBAAN,MAAMA,yBAIHC,kBAAAA;EAKAC;EACAC;EAER,IAAIC,gBAAgB;AAClB,SAAKF,iBAAiB,KAAKA,kBAAkB,IAAIG,SAAyB;MAAEC,KAAK,KAAKA;IAAI,CAAA;AAC1F,WAAO,KAAKJ;EACd;EAEA,IAAIK,QAAQ;AACV,SAAKJ,SAAS,KAAKA,UAAU,IAAIE,SAAmD;MAAEC,KAAK,KAAKA;IAAI,CAAA;AACpG,WAAO,KAAKH;EACd;EAEA,IAAIG,MAAM;;AACR,aAAO,UAAKE,WAAL,mBAAaF,QAAO;EAC7B;EAEA,IAAaG,UAAU;AACrB,WAAO;MACLC;MACAC;MACAC;MACAC;MACAC;MACAC;SACG,MAAMN;;EAEb;EAEmBO,aAA4C;AAC7D,UAAMC,MAAMC,QAAQ,KAAKX,MAAMY,KAAI,EAAGC,IAAI,CAAC,CAAA,EAAGC,IAAAA,MAAUA,KAAKC,KAAK,CAAA;AAClE,WAAOC,kBAAkBN,GAAAA,EAAKG,IAAI,CAACI,YAAYC,kBAAkBD,OAAAA,CAAAA;EACnE;EAEmBE,eAAqC;AACtD,SAAKnB,MAAMoB,MAAK;AAChB,SAAKvB,cAAcuB,MAAK;AACxB,WAAO,KAAKC,KAAK,WAAW;MAAEC,QAAQ;IAAK,CAAA;EAC7C;EAEA,MAAyBC,gBAAmD;;AAC1E,UAAMC,WAAWC,SAAS,MAAM,KAAKhB,WAAU,GAAI,mBAAA;AACnD,UAAMiB,UAAU,MAAMC,QAAQC,WAC5BjB,SACEkB,YAAOC,QAAQ,MAAM,KAAKC,QAAO,GAAIC,UAAU,CAAA,CAAE,MAAjDH,mBAAoDhB,IAAI,OAAOoB,WAAAA;;AAC7D,YAAMC,eAAqC;QACzCC,QAAQ7B;MACV;AACA,YAAM8B,QAAQ,MAAM,KAAKC,UAAUH,cAAcV,QAAAA;AACjD,cAAQc,MAAA,OAAML,iCAAQG,MAAMA,MAAM,CAAA,GAAIA,MAAM,CAAA,QAApC,gBAAAE,IAA2C;IACrD,EAAA,CAAA;AAGJ,UAAM,KAAKnB,aAAY;AACvB,WAAOR,QAAQe,QAAQa,OAAOC,SAAAA,EAAW3B,IAAI,CAAC4B,WAAWA,OAAO1B,KAAK,CAAA;EACvE;EAEA,MAAyB2B,cAAcC,QAAiC;AACtE,UAAMC,gBAAgBjC,QACpB,MAAMgB,QAAQjB,IACZiC,OAAO9B,IAAI,CAACgC,SAAAA;AACV,aAAO,KAAK7C,MAAM8C,OAAOD,IAAAA,IAAQA,OAAOE;IAC1C,CAAA,CAAA,CAAA;AAGJ,WAAOH;EACT;EAEmBI,WAAWL,QAA+C;AAC3E,WAAOhC,QACLgC,OAAO9B,IAAI,CAACgC,SAAAA;AACV,YAAMI,eAAe,KAAKpD,cAAcqD,IAAIL,IAAAA,KAASA;AACrD,YAAMJ,SAAS,KAAKzC,MAAMkD,IAAID,YAAAA;AAC9B,UAAIA,iBAAiBJ,QAAQ,CAACJ,QAAQ;AACpC,cAAM,IAAIU,MAAM,4BAAA;MAClB;AACA,aAAOjC,kBAAkBuB,MAAAA;IAC3B,CAAA,CAAA;EAEJ;EAEA,MAAyBW,cAAc5B,UAAiD;AACtF,UAAM6B,QAAQ,MAAMC,eAAeC,UAAU/B,QAAAA;AAC7C,UAAMgC,mBAAmBH,MAAMxC,IAAI,CAAC,CAACI,SAAS4B,IAAAA,MAAK;AACjD,aAAO,KAAK7C,MAAMkD,IAAIL,IAAAA,KAAS,KAAKY,uBAAuBxC,SAAS4B,IAAAA;IACtE,CAAA;AAEA,WAAO3B,kBAAkBsC,gBAAAA;EAC3B;EAEA,MAAyBE,YAAYC,SAA4D;AAC/F,UAAM,EAAEC,OAAOC,SAAQ,IAAKF,WAAW,CAAC;AACxC,UAAMjD,MAAMM,kBAAkBL,QAAQ,MAAMgB,QAAQjB,IAAI,KAAKV,MAAMY,KAAI,EAAGC,IAAI,CAACE,UAAUA,MAAM,CAAA,EAAGA,KAAK,CAAA,CAAA,CAAA;AACvG,UAAM+C,aAAaD,WAAWnD,IAAIqD,UAAU,CAAChD,UAAUA,MAAMiD,UAAUH,QAAAA,IAAY,IAAI;AACvF,WAAO3C,kBAAkBR,IAAIuD,MAAMH,YAAYF,QAAQE,aAAaF,QAAQb,MAAAA,CAAAA;EAC9E;EAEQU,uBAAuBxC,SAA0B4B,MAAcqB,QAAQ,GAAqC;AAClH,UAAMC,WAAWC,eAAenD,SAASiD,KAAAA;AACzC,SAAKlE,MAAMqE,IAAIxB,MAAMsB,QAAAA;AACrB,SAAKtE,cAAcwE,IAAIF,SAASH,OAAOnB,IAAAA;AACvC,WAAOsB;EACT;AACF;AA5GUzE;AAGR,cAPWD,kBAOK6E,iBAAgB;EAAC9E;EAA6B+E;;AAPzD,IAAM9E,kBAAN;AAAMA,kBAAAA,aAAAA;EADZ+E,gBAAAA;GACY/E,eAAAA;","names":["assertEx","compact","fulfilled","AbstractArchivist","addStorageMeta","removeStorageMeta","sortByStorageMeta","ArchivistAllQuerySchema","ArchivistClearQuerySchema","ArchivistCommitQuerySchema","ArchivistConfigSchema","ArchivistDeleteQuerySchema","ArchivistInsertQuerySchema","ArchivistNextQuerySchema","creatableModule","PayloadBuilder","LRUCache","MemoryArchivistConfigSchema","MemoryArchivist","AbstractArchivist","_bodyHashIndex","_cache","bodyHashIndex","LRUCache","max","cache","config","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","ArchivistNextQuerySchema","allHandler","all","compact","dump","map","item","value","sortByStorageMeta","payload","removeStorageMeta","clearHandler","clear","emit","module","commitHandler","payloads","assertEx","settled","Promise","allSettled","Object","values","parents","commit","parent","queryPayload","schema","query","bindQuery","_a","filter","fulfilled","result","deleteHandler","hashes","deletedHashes","hash","delete","undefined","getHandler","resolvedHash","get","Error","insertHandler","pairs","PayloadBuilder","hashPairs","insertedPayloads","insertPayloadIntoCache","nextHandler","options","limit","previous","startIndex","findIndex","$hash","slice","index","withMeta","addStorageMeta","set","configSchemas","ArchivistConfigSchema","creatableModule"]}
|
|
1
|
+
{"version":3,"sources":["../../src/MemoryArchivist.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Hash } from '@xylabs/hex'\nimport { compact } from '@xylabs/lodash'\nimport { fulfilled, Promisable } from '@xylabs/promise'\nimport { AbstractArchivist, addStorageMeta, removeStorageMeta, sortByStorageMeta, WithStorageMeta } from '@xyo-network/archivist-abstract'\nimport {\n ArchivistAllQuerySchema,\n ArchivistClearQuerySchema,\n ArchivistCommitQuerySchema,\n ArchivistConfig,\n ArchivistConfigSchema,\n ArchivistDeleteQuerySchema,\n ArchivistInsertQuery,\n ArchivistInsertQuerySchema,\n ArchivistInstance,\n ArchivistModuleEventData,\n ArchivistNextOptions,\n ArchivistNextQuerySchema,\n} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadWithMeta, WithMeta } 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 = ArchivistConfig<{\n max?: number\n schema: 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 ArchivistInstance, ModuleInstance\n{\n static override configSchemas = [MemoryArchivistConfigSchema, ArchivistConfigSchema]\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 = compact(this.cache.dump().map(([, item]) => item.value))\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', { module: 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 compact(\n Object.values((await this.parents()).commit ?? [])?.map(async (parent) => {\n const queryPayload: ArchivistInsertQuery = {\n schema: ArchivistInsertQuerySchema,\n }\n const query = await this.bindQuery(queryPayload, payloads)\n return (await parent?.query(query[0], query[1]))?.[0]\n }),\n ),\n )\n await this.clearHandler()\n return compact(settled.filter(fulfilled).map((result) => result.value))\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 compact(\n 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 }),\n )\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<PayloadWithMeta[]> {\n const pairs = await PayloadBuilder.hashPairs(payloads)\n const insertedPayloads = pairs.map(([payload, hash]) => {\n return this.cache.get(hash) ?? this.insertPayloadIntoCache(payload, hash)\n })\n\n return removeStorageMeta(insertedPayloads)\n }\n\n protected override async nextHandler(options?: ArchivistNextOptions): Promise<PayloadWithMeta[]> {\n const { limit, previous } = options ?? {}\n const all = sortByStorageMeta(compact(await Promise.all(this.cache.dump().map((value) => value[1].value))))\n const startIndex = previous ? all.findIndex((value) => value.$hash === previous) + 1 : 0\n return removeStorageMeta(all.slice(startIndex, limit ? startIndex + limit : undefined))\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","compact","fulfilled","AbstractArchivist","addStorageMeta","removeStorageMeta","sortByStorageMeta","ArchivistAllQuerySchema","ArchivistClearQuerySchema","ArchivistCommitQuerySchema","ArchivistConfigSchema","ArchivistDeleteQuerySchema","ArchivistInsertQuerySchema","ArchivistNextQuerySchema","creatableModule","PayloadBuilder","LRUCache","MemoryArchivistConfigSchema","MemoryArchivist","AbstractArchivist","_cache","_dataHashIndex","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","ArchivistNextQuerySchema","cache","LRUCache","max","dataHashIndex","config","allHandler","all","compact","dump","map","item","value","sortByStorageMeta","payload","removeStorageMeta","clearHandler","clear","emit","module","commitHandler","payloads","assertEx","settled","Promise","allSettled","Object","values","parents","commit","parent","queryPayload","schema","query","bindQuery","_a","filter","fulfilled","result","deleteHandler","hashes","deletedHashes","key","includes","$hash","delete","exists","rebuildDataHashIndex","getHandler","hash","resolvedHash","get","Error","insertHandler","pairs","PayloadBuilder","hashPairs","insertedPayloads","insertPayloadIntoCache","nextHandler","options","limit","previous","startIndex","findIndex","slice","undefined","index","withMeta","addStorageMeta","set","configSchemas","ArchivistConfigSchema","creatableModule"]}
|
package/package.json
CHANGED
|
@@ -10,22 +10,23 @@
|
|
|
10
10
|
"url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js/issues"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@xylabs/assert": "^3.0.
|
|
14
|
-
"@xylabs/
|
|
15
|
-
"@xylabs/
|
|
16
|
-
"@xylabs/
|
|
17
|
-
"@
|
|
18
|
-
"@xyo-network/archivist-
|
|
19
|
-
"@xyo-network/
|
|
20
|
-
"@xyo-network/
|
|
21
|
-
"@xyo-network/
|
|
22
|
-
"@xyo-network/payload-
|
|
13
|
+
"@xylabs/assert": "^3.0.13",
|
|
14
|
+
"@xylabs/exists": "^3.0.13",
|
|
15
|
+
"@xylabs/hex": "^3.0.13",
|
|
16
|
+
"@xylabs/lodash": "^3.0.13",
|
|
17
|
+
"@xylabs/promise": "^3.0.13",
|
|
18
|
+
"@xyo-network/archivist-abstract": "~2.92.4",
|
|
19
|
+
"@xyo-network/archivist-model": "~2.92.4",
|
|
20
|
+
"@xyo-network/boundwitness-model": "~2.92.4",
|
|
21
|
+
"@xyo-network/module-model": "~2.92.4",
|
|
22
|
+
"@xyo-network/payload-builder": "~2.92.4",
|
|
23
|
+
"@xyo-network/payload-model": "~2.92.4",
|
|
23
24
|
"lru-cache": "^10.2.0"
|
|
24
25
|
},
|
|
25
26
|
"devDependencies": {
|
|
26
27
|
"@xylabs/ts-scripts-yarn3": "^3.5.2",
|
|
27
28
|
"@xylabs/tsconfig": "^3.5.2",
|
|
28
|
-
"@xyo-network/account": "~2.92.
|
|
29
|
+
"@xyo-network/account": "~2.92.4",
|
|
29
30
|
"typescript": "^5.4.2"
|
|
30
31
|
},
|
|
31
32
|
"description": "Primary SDK for using XYO Protocol 2.0",
|
|
@@ -67,6 +68,6 @@
|
|
|
67
68
|
"url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
|
|
68
69
|
},
|
|
69
70
|
"sideEffects": false,
|
|
70
|
-
"version": "2.92.
|
|
71
|
+
"version": "2.92.4",
|
|
71
72
|
"type": "module"
|
|
72
73
|
}
|
package/src/MemoryArchivist.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { assertEx } from '@xylabs/assert'
|
|
2
|
+
import { exists } from '@xylabs/exists'
|
|
2
3
|
import { Hash } from '@xylabs/hex'
|
|
3
4
|
import { compact } from '@xylabs/lodash'
|
|
4
5
|
import { fulfilled, Promisable } from '@xylabs/promise'
|
|
@@ -43,22 +44,8 @@ export class MemoryArchivist<
|
|
|
43
44
|
{
|
|
44
45
|
static override configSchemas = [MemoryArchivistConfigSchema, ArchivistConfigSchema]
|
|
45
46
|
|
|
46
|
-
private
|
|
47
|
-
private
|
|
48
|
-
|
|
49
|
-
get bodyHashIndex() {
|
|
50
|
-
this._bodyHashIndex = this._bodyHashIndex ?? new LRUCache<string, string>({ max: this.max })
|
|
51
|
-
return this._bodyHashIndex
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
get cache() {
|
|
55
|
-
this._cache = this._cache ?? new LRUCache<string, WithStorageMeta<PayloadWithMeta>>({ max: this.max })
|
|
56
|
-
return this._cache
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
get max() {
|
|
60
|
-
return this.config?.max ?? 10_000
|
|
61
|
-
}
|
|
47
|
+
private _cache?: LRUCache<Hash, WithStorageMeta<PayloadWithMeta>>
|
|
48
|
+
private _dataHashIndex?: LRUCache<Hash, Hash>
|
|
62
49
|
|
|
63
50
|
override get queries() {
|
|
64
51
|
return [
|
|
@@ -72,6 +59,20 @@ export class MemoryArchivist<
|
|
|
72
59
|
]
|
|
73
60
|
}
|
|
74
61
|
|
|
62
|
+
protected get cache() {
|
|
63
|
+
this._cache = this._cache ?? new LRUCache<Hash, WithStorageMeta<PayloadWithMeta>>({ max: this.max })
|
|
64
|
+
return this._cache
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
protected get dataHashIndex() {
|
|
68
|
+
this._dataHashIndex = this._dataHashIndex ?? new LRUCache<Hash, Hash>({ max: this.max })
|
|
69
|
+
return this._dataHashIndex
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
protected get max() {
|
|
73
|
+
return this.config?.max ?? 10_000
|
|
74
|
+
}
|
|
75
|
+
|
|
75
76
|
protected override allHandler(): Promisable<PayloadWithMeta[]> {
|
|
76
77
|
const all = compact(this.cache.dump().map(([, item]) => item.value))
|
|
77
78
|
return sortByStorageMeta(all).map((payload) => removeStorageMeta(payload))
|
|
@@ -79,7 +80,7 @@ export class MemoryArchivist<
|
|
|
79
80
|
|
|
80
81
|
protected override clearHandler(): void | Promise<void> {
|
|
81
82
|
this.cache.clear()
|
|
82
|
-
this.
|
|
83
|
+
this.dataHashIndex.clear()
|
|
83
84
|
return this.emit('cleared', { module: this })
|
|
84
85
|
}
|
|
85
86
|
|
|
@@ -100,21 +101,24 @@ export class MemoryArchivist<
|
|
|
100
101
|
return compact(settled.filter(fulfilled).map((result) => result.value))
|
|
101
102
|
}
|
|
102
103
|
|
|
103
|
-
protected override
|
|
104
|
-
const deletedHashes =
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
104
|
+
protected override deleteHandler(hashes: Hash[]): Promisable<Hash[]> {
|
|
105
|
+
const deletedHashes: Hash[] = this.cache
|
|
106
|
+
.dump()
|
|
107
|
+
.map(([key, item]) => {
|
|
108
|
+
if (hashes.includes(key) || hashes.includes(item.value.$hash)) {
|
|
109
|
+
this.cache.delete(key)
|
|
110
|
+
return key
|
|
111
|
+
}
|
|
112
|
+
})
|
|
113
|
+
.filter(exists)
|
|
114
|
+
this.rebuildDataHashIndex()
|
|
111
115
|
return deletedHashes
|
|
112
116
|
}
|
|
113
117
|
|
|
114
118
|
protected override getHandler(hashes: Hash[]): Promisable<PayloadWithMeta[]> {
|
|
115
119
|
return compact(
|
|
116
120
|
hashes.map((hash) => {
|
|
117
|
-
const resolvedHash = this.
|
|
121
|
+
const resolvedHash = this.dataHashIndex.get(hash) ?? hash
|
|
118
122
|
const result = this.cache.get(resolvedHash)
|
|
119
123
|
if (resolvedHash !== hash && !result) {
|
|
120
124
|
throw new Error('Missing referenced payload')
|
|
@@ -140,10 +144,18 @@ export class MemoryArchivist<
|
|
|
140
144
|
return removeStorageMeta(all.slice(startIndex, limit ? startIndex + limit : undefined))
|
|
141
145
|
}
|
|
142
146
|
|
|
143
|
-
private insertPayloadIntoCache(payload: PayloadWithMeta, hash:
|
|
147
|
+
private insertPayloadIntoCache(payload: PayloadWithMeta, hash: Hash, index = 0): WithStorageMeta<PayloadWithMeta> {
|
|
144
148
|
const withMeta = addStorageMeta(payload, index)
|
|
145
149
|
this.cache.set(hash, withMeta)
|
|
146
|
-
this.
|
|
150
|
+
this.dataHashIndex.set(withMeta.$hash, hash)
|
|
147
151
|
return withMeta
|
|
148
152
|
}
|
|
153
|
+
|
|
154
|
+
private rebuildDataHashIndex() {
|
|
155
|
+
this._dataHashIndex = new LRUCache<Hash, Hash>({ max: this.max })
|
|
156
|
+
const pairs = this.cache.dump()
|
|
157
|
+
for (const [hash, payload] of pairs) {
|
|
158
|
+
this.dataHashIndex.set(payload.value.$hash, hash)
|
|
159
|
+
}
|
|
160
|
+
}
|
|
149
161
|
}
|