@xyo-network/archivist-memory 2.85.5

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.
Files changed (65) hide show
  1. package/LICENSE +165 -0
  2. package/README.md +13 -0
  3. package/dist/browser/CookieArchivist.d.cts +32 -0
  4. package/dist/browser/CookieArchivist.d.cts.map +1 -0
  5. package/dist/browser/CookieArchivist.d.mts +32 -0
  6. package/dist/browser/CookieArchivist.d.mts.map +1 -0
  7. package/dist/browser/CookieArchivist.d.ts +32 -0
  8. package/dist/browser/CookieArchivist.d.ts.map +1 -0
  9. package/dist/browser/MemoryArchivist.d.cts +31 -0
  10. package/dist/browser/MemoryArchivist.d.cts.map +1 -0
  11. package/dist/browser/MemoryArchivist.d.mts +31 -0
  12. package/dist/browser/MemoryArchivist.d.mts.map +1 -0
  13. package/dist/browser/MemoryArchivist.d.ts +31 -0
  14. package/dist/browser/MemoryArchivist.d.ts.map +1 -0
  15. package/dist/browser/StorageArchivist.d.cts +39 -0
  16. package/dist/browser/StorageArchivist.d.cts.map +1 -0
  17. package/dist/browser/StorageArchivist.d.mts +39 -0
  18. package/dist/browser/StorageArchivist.d.mts.map +1 -0
  19. package/dist/browser/StorageArchivist.d.ts +39 -0
  20. package/dist/browser/StorageArchivist.d.ts.map +1 -0
  21. package/dist/browser/index.cjs +136 -0
  22. package/dist/browser/index.cjs.map +1 -0
  23. package/dist/browser/index.d.cts +2 -0
  24. package/dist/browser/index.d.cts.map +1 -0
  25. package/dist/browser/index.d.mts +2 -0
  26. package/dist/browser/index.d.mts.map +1 -0
  27. package/dist/browser/index.d.ts +2 -0
  28. package/dist/browser/index.d.ts.map +1 -0
  29. package/dist/browser/index.js +115 -0
  30. package/dist/browser/index.js.map +1 -0
  31. package/dist/node/CookieArchivist.d.cts +32 -0
  32. package/dist/node/CookieArchivist.d.cts.map +1 -0
  33. package/dist/node/CookieArchivist.d.mts +32 -0
  34. package/dist/node/CookieArchivist.d.mts.map +1 -0
  35. package/dist/node/CookieArchivist.d.ts +32 -0
  36. package/dist/node/CookieArchivist.d.ts.map +1 -0
  37. package/dist/node/MemoryArchivist.d.cts +31 -0
  38. package/dist/node/MemoryArchivist.d.cts.map +1 -0
  39. package/dist/node/MemoryArchivist.d.mts +31 -0
  40. package/dist/node/MemoryArchivist.d.mts.map +1 -0
  41. package/dist/node/MemoryArchivist.d.ts +31 -0
  42. package/dist/node/MemoryArchivist.d.ts.map +1 -0
  43. package/dist/node/StorageArchivist.d.cts +39 -0
  44. package/dist/node/StorageArchivist.d.cts.map +1 -0
  45. package/dist/node/StorageArchivist.d.mts +39 -0
  46. package/dist/node/StorageArchivist.d.mts.map +1 -0
  47. package/dist/node/StorageArchivist.d.ts +39 -0
  48. package/dist/node/StorageArchivist.d.ts.map +1 -0
  49. package/dist/node/index.cjs +148 -0
  50. package/dist/node/index.cjs.map +1 -0
  51. package/dist/node/index.d.cts +2 -0
  52. package/dist/node/index.d.cts.map +1 -0
  53. package/dist/node/index.d.mts +2 -0
  54. package/dist/node/index.d.mts.map +1 -0
  55. package/dist/node/index.d.ts +2 -0
  56. package/dist/node/index.d.ts.map +1 -0
  57. package/dist/node/index.js +122 -0
  58. package/dist/node/index.js.map +1 -0
  59. package/package.json +79 -0
  60. package/src/CookieArchivist.ts +164 -0
  61. package/src/MemoryArchivist.ts +126 -0
  62. package/src/StorageArchivist.ts +191 -0
  63. package/src/index.ts +1 -0
  64. package/src/spec/testArchivist.ts +50 -0
  65. package/typedoc.json +5 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StorageArchivist.d.ts","sourceRoot":"","sources":["../../src/StorageArchivist.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,EAIL,eAAe,EAIf,iBAAiB,EACjB,wBAAwB,EACxB,eAAe,EAChB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAE9D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAIpD,MAAM,MAAM,4BAA4B,GAAG,sCAAsC,CAAA;AACjF,eAAO,MAAM,4BAA4B,EAAE,4BAAqE,CAAA;AAEhH,MAAM,MAAM,sBAAsB,GAAG,eAAe,CAAC;IACnD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,MAAM,EAAE,4BAA4B,CAAA;IACpC,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA;CACpC,CAAC,CAAA;AAEF,MAAM,MAAM,sBAAsB,GAAG,eAAe,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC,CAAA;AAC7F,qBAAa,gBAAgB,CACzB,OAAO,SAAS,sBAAsB,GAAG,sBAAsB,EAC/D,UAAU,SAAS,wBAAwB,GAAG,wBAAwB,CAExE,SAAQ,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAC7C,YAAW,iBAAiB;IAE5B,OAAgB,aAAa,2CAAiC;IAE9D,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAuB;IAEvC,IAAI,UAAU,WAEb;IAED,IAAI,YAAY,WAEf;IAED,IAAI,SAAS,WAEZ;IAED,IAAI,cAAc,YAEjB;IAED,IAAa,OAAO,IAAI,MAAM,EAAE,CAS/B;IAED,IAAI,IAAI,iCAEP;IAGD,OAAO,KAAK,cAAc,GAGzB;IAGD,OAAO,KAAK,OAAO,GAGlB;cAoBkB,UAAU,IAAI,eAAe,CAAC,OAAO,CAAC;cAKtC,YAAY,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;cAM9B,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;cAoBxC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;cAexD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;cAQ7C,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAc/E,SAAS,CAAC,WAAW;cAQI,YAAY;CAKtC"}
@@ -0,0 +1,39 @@
1
+ import { Promisable, PromisableArray } from '@xylabs/promise';
2
+ import { AbstractArchivist } from '@xyo-network/archivist-abstract';
3
+ import { ArchivistConfig, ArchivistInstance, ArchivistModuleEventData, ArchivistParams } from '@xyo-network/archivist-model';
4
+ import { BoundWitness } from '@xyo-network/boundwitness-model';
5
+ import { AnyConfigSchema } from '@xyo-network/module-model';
6
+ import { Payload } from '@xyo-network/payload-model';
7
+ export type StorageArchivistConfigSchema = 'network.xyo.archivist.storage.config';
8
+ export declare const StorageArchivistConfigSchema: StorageArchivistConfigSchema;
9
+ export type StorageArchivistConfig = ArchivistConfig<{
10
+ maxEntries?: number;
11
+ maxEntrySize?: number;
12
+ namespace?: string;
13
+ persistAccount?: boolean;
14
+ schema: StorageArchivistConfigSchema;
15
+ type?: 'local' | 'session' | 'page';
16
+ }>;
17
+ export type StorageArchivistParams = ArchivistParams<AnyConfigSchema<StorageArchivistConfig>>;
18
+ export declare class StorageArchivist<TParams extends StorageArchivistParams = StorageArchivistParams, TEventData extends ArchivistModuleEventData = ArchivistModuleEventData> extends AbstractArchivist<TParams, TEventData> implements ArchivistInstance {
19
+ static configSchemas: "network.xyo.archivist.storage.config"[];
20
+ private _privateStorage;
21
+ private _storage;
22
+ get maxEntries(): number;
23
+ get maxEntrySize(): number;
24
+ get namespace(): string;
25
+ get persistAccount(): boolean;
26
+ get queries(): string[];
27
+ get type(): "local" | "session" | "page";
28
+ private get privateStorage();
29
+ private get storage();
30
+ protected allHandler(): PromisableArray<Payload>;
31
+ protected clearHandler(): void | Promise<void>;
32
+ protected commitHandler(): Promise<BoundWitness[]>;
33
+ protected deleteHandler(hashes: string[]): Promise<string[]>;
34
+ protected getHandler(hashes: string[]): Promisable<Payload[]>;
35
+ protected insertHandler(payloads: Payload[]): Promise<Payload[]>;
36
+ protected saveAccount(): void;
37
+ protected startHandler(): Promise<boolean>;
38
+ }
39
+ //# sourceMappingURL=StorageArchivist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StorageArchivist.d.ts","sourceRoot":"","sources":["../../src/StorageArchivist.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,EAIL,eAAe,EAIf,iBAAiB,EACjB,wBAAwB,EACxB,eAAe,EAChB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAE9D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAIpD,MAAM,MAAM,4BAA4B,GAAG,sCAAsC,CAAA;AACjF,eAAO,MAAM,4BAA4B,EAAE,4BAAqE,CAAA;AAEhH,MAAM,MAAM,sBAAsB,GAAG,eAAe,CAAC;IACnD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,MAAM,EAAE,4BAA4B,CAAA;IACpC,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA;CACpC,CAAC,CAAA;AAEF,MAAM,MAAM,sBAAsB,GAAG,eAAe,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC,CAAA;AAC7F,qBAAa,gBAAgB,CACzB,OAAO,SAAS,sBAAsB,GAAG,sBAAsB,EAC/D,UAAU,SAAS,wBAAwB,GAAG,wBAAwB,CAExE,SAAQ,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAC7C,YAAW,iBAAiB;IAE5B,OAAgB,aAAa,2CAAiC;IAE9D,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAuB;IAEvC,IAAI,UAAU,WAEb;IAED,IAAI,YAAY,WAEf;IAED,IAAI,SAAS,WAEZ;IAED,IAAI,cAAc,YAEjB;IAED,IAAa,OAAO,IAAI,MAAM,EAAE,CAS/B;IAED,IAAI,IAAI,iCAEP;IAGD,OAAO,KAAK,cAAc,GAGzB;IAGD,OAAO,KAAK,OAAO,GAGlB;cAoBkB,UAAU,IAAI,eAAe,CAAC,OAAO,CAAC;cAKtC,YAAY,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;cAM9B,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;cAoBxC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;cAexD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;cAQ7C,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAc/E,SAAS,CAAC,WAAW;cAQI,YAAY;CAKtC"}
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
7
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+ var __publicField = (obj, key, value) => {
22
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
23
+ return value;
24
+ };
25
+
26
+ // src/index.ts
27
+ var src_exports = {};
28
+ __export(src_exports, {
29
+ MemoryArchivist: () => MemoryArchivist,
30
+ MemoryArchivistConfigSchema: () => MemoryArchivistConfigSchema
31
+ });
32
+ module.exports = __toCommonJS(src_exports);
33
+
34
+ // src/MemoryArchivist.ts
35
+ var import_assert = require("@xylabs/assert");
36
+ var import_lodash = require("@xylabs/lodash");
37
+ var import_promise = require("@xylabs/promise");
38
+ var import_archivist_abstract = require("@xyo-network/archivist-abstract");
39
+ var import_archivist_model = require("@xyo-network/archivist-model");
40
+ var import_hash = require("@xyo-network/hash");
41
+ var import_module_model = require("@xyo-network/module-model");
42
+ var import_payload_wrapper = require("@xyo-network/payload-wrapper");
43
+ var import_lru_cache = require("lru-cache");
44
+ function _ts_decorate(decorators, target, key, desc) {
45
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
46
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
47
+ r = Reflect.decorate(decorators, target, key, desc);
48
+ else
49
+ for (var i = decorators.length - 1; i >= 0; i--)
50
+ if (d = decorators[i])
51
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
52
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
53
+ }
54
+ __name(_ts_decorate, "_ts_decorate");
55
+ var MemoryArchivistConfigSchema = "network.xyo.archivist.memory.config";
56
+ var _MemoryArchivist = class _MemoryArchivist extends import_archivist_abstract.AbstractArchivist {
57
+ _cache;
58
+ get cache() {
59
+ this._cache = this._cache ?? new import_lru_cache.LRUCache({
60
+ max: this.max
61
+ });
62
+ return this._cache;
63
+ }
64
+ get max() {
65
+ var _a;
66
+ return ((_a = this.config) == null ? void 0 : _a.max) ?? 1e4;
67
+ }
68
+ get queries() {
69
+ return [
70
+ import_archivist_model.ArchivistAllQuerySchema,
71
+ import_archivist_model.ArchivistDeleteQuerySchema,
72
+ import_archivist_model.ArchivistClearQuerySchema,
73
+ import_archivist_model.ArchivistInsertQuerySchema,
74
+ import_archivist_model.ArchivistCommitQuerySchema,
75
+ ...super.queries
76
+ ];
77
+ }
78
+ allHandler() {
79
+ return (0, import_lodash.compact)(this.cache.dump().map((value) => import_hash.PayloadHasher.hashFields(value[1].value)));
80
+ }
81
+ clearHandler() {
82
+ this.cache.clear();
83
+ return this.emit("cleared", {
84
+ module: this
85
+ });
86
+ }
87
+ async commitHandler() {
88
+ var _a;
89
+ const payloads = (0, import_assert.assertEx)(await this.allHandler(), "Nothing to commit");
90
+ const settled = await Promise.allSettled((0, import_lodash.compact)((_a = Object.values((await this.parents()).commit ?? [])) == null ? void 0 : _a.map(async (parent) => {
91
+ var _a2;
92
+ const queryPayload = {
93
+ schema: import_archivist_model.ArchivistInsertQuerySchema
94
+ };
95
+ const query = await this.bindQuery(queryPayload, payloads);
96
+ return (_a2 = await (parent == null ? void 0 : parent.query(query[0], query[1]))) == null ? void 0 : _a2[0];
97
+ })));
98
+ await this.clearHandler();
99
+ return (0, import_lodash.compact)(settled.filter(import_promise.fulfilled).map((result) => result.value));
100
+ }
101
+ async deleteHandler(hashes) {
102
+ const payloadPairs = await Promise.all((await this.get(hashes)).map(async (payload) => [
103
+ await import_hash.PayloadHasher.hashAsync(payload),
104
+ payload
105
+ ]));
106
+ const deletedPairs = (0, import_lodash.compact)(await Promise.all(payloadPairs.map(([hash, payload]) => {
107
+ return this.cache.delete(hash) ? [
108
+ hash,
109
+ payload
110
+ ] : void 0;
111
+ })));
112
+ return deletedPairs.map(([hash]) => hash);
113
+ }
114
+ getHandler(hashes) {
115
+ return (0, import_lodash.compact)(hashes.map((hash) => this.cache.get(hash)));
116
+ }
117
+ async insertHandler(payloads) {
118
+ const insertedPayloads = await Promise.all(payloads.map((payload) => {
119
+ return this.insertPayloadIntoCache(payload);
120
+ }));
121
+ return insertedPayloads;
122
+ }
123
+ async insertPayloadIntoCache(payload) {
124
+ const wrapper = import_payload_wrapper.PayloadWrapper.wrap(payload);
125
+ const payloadWithMeta = {
126
+ ...import_hash.PayloadHasher.hashFields(payload),
127
+ _hash: await wrapper.hashAsync(),
128
+ _timestamp: Date.now()
129
+ };
130
+ this.cache.set(payloadWithMeta._hash, payloadWithMeta);
131
+ return payload;
132
+ }
133
+ };
134
+ __name(_MemoryArchivist, "MemoryArchivist");
135
+ __publicField(_MemoryArchivist, "configSchemas", [
136
+ MemoryArchivistConfigSchema,
137
+ import_archivist_model.ArchivistConfigSchema
138
+ ]);
139
+ var MemoryArchivist = _MemoryArchivist;
140
+ MemoryArchivist = _ts_decorate([
141
+ (0, import_module_model.creatableModule)()
142
+ ], MemoryArchivist);
143
+ // Annotate the CommonJS export names for ESM import in node:
144
+ 0 && (module.exports = {
145
+ MemoryArchivist,
146
+ MemoryArchivistConfigSchema
147
+ });
148
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.ts","../../src/MemoryArchivist.ts"],"sourcesContent":["export * from './MemoryArchivist'\n","import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { fulfilled, Promisable, PromisableArray } from '@xylabs/promise'\nimport { AbstractArchivist } 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} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\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<string, Payload>\n\n get cache() {\n this._cache = this._cache ?? new LRUCache<string, Payload>({ 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 ...super.queries,\n ]\n }\n\n protected override allHandler(): PromisableArray<Payload> {\n return compact(this.cache.dump().map((value) => PayloadHasher.hashFields(value[1].value)))\n }\n\n protected override clearHandler(): void | Promise<void> {\n this.cache.clear()\n return this.emit('cleared', { module: this })\n }\n\n protected override async commitHandler(): Promise<BoundWitness[]> {\n const payloads = assertEx(await this.allHandler(), 'Nothing to commit')\n const settled = await Promise.allSettled(\n 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: string[]): Promise<string[]> {\n const payloadPairs: [string, Payload][] = await Promise.all(\n (await this.get(hashes)).map<Promise<[string, Payload]>>(async (payload) => [await PayloadHasher.hashAsync(payload), payload]),\n )\n const deletedPairs: [string, Payload][] = compact(\n await Promise.all(\n payloadPairs.map<[string, Payload] | undefined>(([hash, payload]) => {\n return this.cache.delete(hash) ? [hash, payload] : undefined\n }),\n ),\n )\n return deletedPairs.map(([hash]) => hash)\n }\n\n protected override getHandler(hashes: string[]): Promisable<Payload[]> {\n return compact(hashes.map((hash) => this.cache.get(hash)))\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<Payload[]> {\n const insertedPayloads = await Promise.all(\n payloads.map((payload) => {\n return this.insertPayloadIntoCache(payload)\n }),\n )\n\n return insertedPayloads\n }\n\n private async insertPayloadIntoCache(payload: Payload): Promise<Payload> {\n const wrapper = PayloadWrapper.wrap(payload)\n const payloadWithMeta = { ...PayloadHasher.hashFields(payload), _hash: await wrapper.hashAsync(), _timestamp: Date.now() }\n this.cache.set(payloadWithMeta._hash, payloadWithMeta)\n return payload\n }\n}\n"],"mappings":"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","names":["MemoryArchivistConfigSchema","MemoryArchivist","AbstractArchivist","_cache","cache","LRUCache","max","config","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","allHandler","compact","dump","map","value","PayloadHasher","hashFields","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","payloadPairs","all","get","payload","hashAsync","deletedPairs","hash","delete","undefined","getHandler","insertHandler","insertedPayloads","insertPayloadIntoCache","wrapper","PayloadWrapper","wrap","payloadWithMeta","_hash","_timestamp","Date","now","set","configSchemas","ArchivistConfigSchema","creatableModule"]}
@@ -0,0 +1,2 @@
1
+ export * from './MemoryArchivist';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './MemoryArchivist';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './MemoryArchivist';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA"}
@@ -0,0 +1,122 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
4
+ var __publicField = (obj, key, value) => {
5
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
6
+ return value;
7
+ };
8
+
9
+ // src/MemoryArchivist.ts
10
+ import { assertEx } from "@xylabs/assert";
11
+ import { compact } from "@xylabs/lodash";
12
+ import { fulfilled } from "@xylabs/promise";
13
+ import { AbstractArchivist } from "@xyo-network/archivist-abstract";
14
+ import { ArchivistAllQuerySchema, ArchivistClearQuerySchema, ArchivistCommitQuerySchema, ArchivistConfigSchema, ArchivistDeleteQuerySchema, ArchivistInsertQuerySchema } from "@xyo-network/archivist-model";
15
+ import { PayloadHasher } from "@xyo-network/hash";
16
+ import { creatableModule } from "@xyo-network/module-model";
17
+ import { PayloadWrapper } from "@xyo-network/payload-wrapper";
18
+ import { LRUCache } from "lru-cache";
19
+ function _ts_decorate(decorators, target, key, desc) {
20
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
21
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
22
+ r = Reflect.decorate(decorators, target, key, desc);
23
+ else
24
+ for (var i = decorators.length - 1; i >= 0; i--)
25
+ if (d = decorators[i])
26
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
27
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
28
+ }
29
+ __name(_ts_decorate, "_ts_decorate");
30
+ var MemoryArchivistConfigSchema = "network.xyo.archivist.memory.config";
31
+ var _MemoryArchivist = class _MemoryArchivist extends AbstractArchivist {
32
+ _cache;
33
+ get cache() {
34
+ this._cache = this._cache ?? new LRUCache({
35
+ max: this.max
36
+ });
37
+ return this._cache;
38
+ }
39
+ get max() {
40
+ var _a;
41
+ return ((_a = this.config) == null ? void 0 : _a.max) ?? 1e4;
42
+ }
43
+ get queries() {
44
+ return [
45
+ ArchivistAllQuerySchema,
46
+ ArchivistDeleteQuerySchema,
47
+ ArchivistClearQuerySchema,
48
+ ArchivistInsertQuerySchema,
49
+ ArchivistCommitQuerySchema,
50
+ ...super.queries
51
+ ];
52
+ }
53
+ allHandler() {
54
+ return compact(this.cache.dump().map((value) => PayloadHasher.hashFields(value[1].value)));
55
+ }
56
+ clearHandler() {
57
+ this.cache.clear();
58
+ return this.emit("cleared", {
59
+ module: this
60
+ });
61
+ }
62
+ async commitHandler() {
63
+ var _a;
64
+ const payloads = assertEx(await this.allHandler(), "Nothing to commit");
65
+ const settled = await Promise.allSettled(compact((_a = Object.values((await this.parents()).commit ?? [])) == null ? void 0 : _a.map(async (parent) => {
66
+ var _a2;
67
+ const queryPayload = {
68
+ schema: ArchivistInsertQuerySchema
69
+ };
70
+ const query = await this.bindQuery(queryPayload, payloads);
71
+ return (_a2 = await (parent == null ? void 0 : parent.query(query[0], query[1]))) == null ? void 0 : _a2[0];
72
+ })));
73
+ await this.clearHandler();
74
+ return compact(settled.filter(fulfilled).map((result) => result.value));
75
+ }
76
+ async deleteHandler(hashes) {
77
+ const payloadPairs = await Promise.all((await this.get(hashes)).map(async (payload) => [
78
+ await PayloadHasher.hashAsync(payload),
79
+ payload
80
+ ]));
81
+ const deletedPairs = compact(await Promise.all(payloadPairs.map(([hash, payload]) => {
82
+ return this.cache.delete(hash) ? [
83
+ hash,
84
+ payload
85
+ ] : void 0;
86
+ })));
87
+ return deletedPairs.map(([hash]) => hash);
88
+ }
89
+ getHandler(hashes) {
90
+ return compact(hashes.map((hash) => this.cache.get(hash)));
91
+ }
92
+ async insertHandler(payloads) {
93
+ const insertedPayloads = await Promise.all(payloads.map((payload) => {
94
+ return this.insertPayloadIntoCache(payload);
95
+ }));
96
+ return insertedPayloads;
97
+ }
98
+ async insertPayloadIntoCache(payload) {
99
+ const wrapper = PayloadWrapper.wrap(payload);
100
+ const payloadWithMeta = {
101
+ ...PayloadHasher.hashFields(payload),
102
+ _hash: await wrapper.hashAsync(),
103
+ _timestamp: Date.now()
104
+ };
105
+ this.cache.set(payloadWithMeta._hash, payloadWithMeta);
106
+ return payload;
107
+ }
108
+ };
109
+ __name(_MemoryArchivist, "MemoryArchivist");
110
+ __publicField(_MemoryArchivist, "configSchemas", [
111
+ MemoryArchivistConfigSchema,
112
+ ArchivistConfigSchema
113
+ ]);
114
+ var MemoryArchivist = _MemoryArchivist;
115
+ MemoryArchivist = _ts_decorate([
116
+ creatableModule()
117
+ ], MemoryArchivist);
118
+ export {
119
+ MemoryArchivist,
120
+ MemoryArchivistConfigSchema
121
+ };
122
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/MemoryArchivist.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { fulfilled, Promisable, PromisableArray } from '@xylabs/promise'\nimport { AbstractArchivist } 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} from '@xyo-network/archivist-model'\nimport { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { AnyConfigSchema, creatableModule, ModuleInstance, ModuleParams } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\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<string, Payload>\n\n get cache() {\n this._cache = this._cache ?? new LRUCache<string, Payload>({ 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 ...super.queries,\n ]\n }\n\n protected override allHandler(): PromisableArray<Payload> {\n return compact(this.cache.dump().map((value) => PayloadHasher.hashFields(value[1].value)))\n }\n\n protected override clearHandler(): void | Promise<void> {\n this.cache.clear()\n return this.emit('cleared', { module: this })\n }\n\n protected override async commitHandler(): Promise<BoundWitness[]> {\n const payloads = assertEx(await this.allHandler(), 'Nothing to commit')\n const settled = await Promise.allSettled(\n 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: string[]): Promise<string[]> {\n const payloadPairs: [string, Payload][] = await Promise.all(\n (await this.get(hashes)).map<Promise<[string, Payload]>>(async (payload) => [await PayloadHasher.hashAsync(payload), payload]),\n )\n const deletedPairs: [string, Payload][] = compact(\n await Promise.all(\n payloadPairs.map<[string, Payload] | undefined>(([hash, payload]) => {\n return this.cache.delete(hash) ? [hash, payload] : undefined\n }),\n ),\n )\n return deletedPairs.map(([hash]) => hash)\n }\n\n protected override getHandler(hashes: string[]): Promisable<Payload[]> {\n return compact(hashes.map((hash) => this.cache.get(hash)))\n }\n\n protected override async insertHandler(payloads: Payload[]): Promise<Payload[]> {\n const insertedPayloads = await Promise.all(\n payloads.map((payload) => {\n return this.insertPayloadIntoCache(payload)\n }),\n )\n\n return insertedPayloads\n }\n\n private async insertPayloadIntoCache(payload: Payload): Promise<Payload> {\n const wrapper = PayloadWrapper.wrap(payload)\n const payloadWithMeta = { ...PayloadHasher.hashFields(payload), _hash: await wrapper.hashAsync(), _timestamp: Date.now() }\n this.cache.set(payloadWithMeta._hash, payloadWithMeta)\n return payload\n }\n}\n"],"mappings":"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","names":["assertEx","compact","fulfilled","AbstractArchivist","ArchivistAllQuerySchema","ArchivistClearQuerySchema","ArchivistCommitQuerySchema","ArchivistConfigSchema","ArchivistDeleteQuerySchema","ArchivistInsertQuerySchema","PayloadHasher","creatableModule","PayloadWrapper","LRUCache","MemoryArchivistConfigSchema","MemoryArchivist","AbstractArchivist","_cache","cache","LRUCache","max","config","queries","ArchivistAllQuerySchema","ArchivistDeleteQuerySchema","ArchivistClearQuerySchema","ArchivistInsertQuerySchema","ArchivistCommitQuerySchema","allHandler","compact","dump","map","value","PayloadHasher","hashFields","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","payloadPairs","all","get","payload","hashAsync","deletedPairs","hash","delete","undefined","getHandler","insertHandler","insertedPayloads","insertPayloadIntoCache","wrapper","PayloadWrapper","wrap","payloadWithMeta","_hash","_timestamp","Date","now","set","configSchemas","ArchivistConfigSchema","creatableModule"]}
package/package.json ADDED
@@ -0,0 +1,79 @@
1
+ {
2
+ "name": "@xyo-network/archivist-memory",
3
+ "author": {
4
+ "email": "support@xyo.network",
5
+ "name": "XYO Development Team",
6
+ "url": "https://xyo.network"
7
+ },
8
+ "bugs": {
9
+ "email": "support@xyo.network",
10
+ "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js/issues"
11
+ },
12
+ "dependencies": {
13
+ "@xylabs/assert": "^2.13.23",
14
+ "@xylabs/delay": "^2.13.23",
15
+ "@xylabs/lodash": "^2.13.23",
16
+ "@xylabs/promise": "^2.13.23",
17
+ "@xyo-network/archivist-abstract": "~2.85.5",
18
+ "@xyo-network/archivist-model": "~2.85.5",
19
+ "@xyo-network/boundwitness-model": "~2.85.5",
20
+ "@xyo-network/hash": "~2.85.5",
21
+ "@xyo-network/id-payload-plugin": "~2.85.5",
22
+ "@xyo-network/module-model": "~2.85.5",
23
+ "@xyo-network/payload-model": "~2.85.5",
24
+ "@xyo-network/payload-wrapper": "~2.85.5",
25
+ "js-cookie": "^3.0.5",
26
+ "lru-cache": "^10.1.0",
27
+ "store2": "^2.14.2"
28
+ },
29
+ "devDependencies": {
30
+ "@types/js-cookie": "^3.0.6",
31
+ "@xylabs/ts-scripts-yarn3": "^3.2.25",
32
+ "@xylabs/tsconfig": "^3.2.25",
33
+ "@xyo-network/account": "~2.85.5",
34
+ "@xyo-network/boundwitness-builder": "~2.85.5",
35
+ "@xyo-network/node-memory": "~2.85.5",
36
+ "typescript": "^5.3.3"
37
+ },
38
+ "description": "Primary SDK for using XYO Protocol 2.0",
39
+ "types": "dist/node/index.d.ts",
40
+ "exports": {
41
+ ".": {
42
+ "browser": {
43
+ "require": {
44
+ "types": "./dist/browser/index.d.cts",
45
+ "default": "./dist/browser/index.cjs"
46
+ },
47
+ "import": {
48
+ "types": "./dist/browser/index.d.mts",
49
+ "default": "./dist/browser/index.js"
50
+ }
51
+ },
52
+ "node": {
53
+ "require": {
54
+ "types": "./dist/node/index.d.cts",
55
+ "default": "./dist/node/index.cjs"
56
+ },
57
+ "import": {
58
+ "types": "./dist/node/index.d.mts",
59
+ "default": "./dist/node/index.js"
60
+ }
61
+ }
62
+ },
63
+ "./package.json": "./package.json"
64
+ },
65
+ "main": "dist/node/index.cjs",
66
+ "module": "dist/node/index.js",
67
+ "homepage": "https://xyo.network",
68
+ "license": "LGPL-3.0-only",
69
+ "publishConfig": {
70
+ "access": "public"
71
+ },
72
+ "repository": {
73
+ "type": "git",
74
+ "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
75
+ },
76
+ "sideEffects": false,
77
+ "version": "2.85.5",
78
+ "type": "module"
79
+ }
@@ -0,0 +1,164 @@
1
+ import { assertEx } from '@xylabs/assert'
2
+ import { compact } from '@xylabs/lodash'
3
+ import { fulfilled, Promisable, PromisableArray } from '@xylabs/promise'
4
+ import { AbstractArchivist } from '@xyo-network/archivist-abstract'
5
+ import {
6
+ ArchivistAllQuerySchema,
7
+ ArchivistClearQuerySchema,
8
+ ArchivistCommitQuerySchema,
9
+ ArchivistConfig,
10
+ ArchivistDeleteQuerySchema,
11
+ ArchivistInsertQuery,
12
+ ArchivistInsertQuerySchema,
13
+ ArchivistModuleEventData,
14
+ ArchivistParams,
15
+ } from '@xyo-network/archivist-model'
16
+ import { BoundWitness } from '@xyo-network/boundwitness-model'
17
+ import { PayloadHasher } from '@xyo-network/hash'
18
+ import { AnyConfigSchema } from '@xyo-network/module-model'
19
+ import { Payload } from '@xyo-network/payload-model'
20
+ import { PayloadWrapper } from '@xyo-network/payload-wrapper'
21
+ import Cookies from 'js-cookie'
22
+
23
+ export type CookieArchivistConfigSchema = 'network.xyo.archivist.cookie.config'
24
+ export const CookieArchivistConfigSchema: CookieArchivistConfigSchema = 'network.xyo.archivist.cookie.config'
25
+
26
+ export type CookieArchivistConfig = ArchivistConfig<{
27
+ domain?: string
28
+ maxEntries?: number
29
+ maxEntrySize?: number
30
+ namespace?: string
31
+ schema: CookieArchivistConfigSchema
32
+ }>
33
+
34
+ export type CookieArchivistParams = ArchivistParams<AnyConfigSchema<CookieArchivistConfig>>
35
+
36
+ export class CookieArchivist<
37
+ TParams extends CookieArchivistParams,
38
+ TEventData extends ArchivistModuleEventData = ArchivistModuleEventData,
39
+ > extends AbstractArchivist<TParams, TEventData> {
40
+ static override configSchemas = [CookieArchivistConfigSchema]
41
+
42
+ get domain() {
43
+ return this.config?.domain
44
+ }
45
+
46
+ get maxEntries() {
47
+ //all browsers support at least 60 cookies
48
+ return this.config?.maxEntries ?? 60
49
+ }
50
+
51
+ get maxEntrySize() {
52
+ //all browsers support at least 4000 length per cookie
53
+ return this.config?.maxEntrySize ?? 4000
54
+ }
55
+
56
+ get namespace() {
57
+ return this.config?.namespace ?? 'xyoarch'
58
+ }
59
+
60
+ override get queries(): string[] {
61
+ return [
62
+ ArchivistAllQuerySchema,
63
+ ArchivistDeleteQuerySchema,
64
+ ArchivistClearQuerySchema,
65
+ ArchivistInsertQuerySchema,
66
+ ArchivistCommitQuerySchema,
67
+ ...super.queries,
68
+ ]
69
+ }
70
+
71
+ protected override allHandler(): PromisableArray<Payload> {
72
+ try {
73
+ return Object.entries(Cookies.get())
74
+ .filter(([key]) => key.startsWith(`${this.namespace}-`))
75
+ .map(([, value]) => JSON.parse(value))
76
+ } catch (ex) {
77
+ console.error(`Error: ${JSON.stringify(ex, null, 2)}`)
78
+ throw ex
79
+ }
80
+ }
81
+
82
+ protected override clearHandler(): void | Promise<void> {
83
+ try {
84
+ Object.entries(Cookies.get()).map(([key]) => {
85
+ if (key.startsWith(`${this.namespace}-`)) {
86
+ Cookies.remove(key)
87
+ }
88
+ })
89
+ } catch (ex) {
90
+ console.error(`Error: ${JSON.stringify(ex, null, 2)}`)
91
+ throw ex
92
+ }
93
+ }
94
+
95
+ protected override async commitHandler(): Promise<BoundWitness[]> {
96
+ try {
97
+ const payloads = await this.all()
98
+ assertEx(payloads.length > 0, 'Nothing to commit')
99
+ const settled = await Promise.allSettled(
100
+ compact(
101
+ Object.values((await this.parents()).commit ?? [])?.map(async (parent) => {
102
+ const queryPayload: ArchivistInsertQuery = {
103
+ schema: ArchivistInsertQuerySchema,
104
+ }
105
+ const query = await this.bindQuery(queryPayload, payloads)
106
+ return (await parent?.query(query[0], query[1]))?.[0]
107
+ }),
108
+ ),
109
+ )
110
+ await this.clear()
111
+ return compact(settled.filter(fulfilled).map((result) => result.value))
112
+ } catch (ex) {
113
+ console.error(`Error: ${JSON.stringify(ex, null, 2)}`)
114
+ throw ex
115
+ }
116
+ }
117
+
118
+ protected override async deleteHandler(hashes: string[]): Promise<string[]> {
119
+ const payloadPairs: [string, Payload][] = await Promise.all(
120
+ (await this.get(hashes)).map<Promise<[string, Payload]>>(async (payload) => [await PayloadHasher.hashAsync(payload), payload]),
121
+ )
122
+ const deletedPairs: [string, Payload][] = compact(
123
+ await Promise.all(
124
+ payloadPairs.map<[string, Payload] | undefined>(([hash, payload]) => {
125
+ Cookies.remove(hash)
126
+ return [hash, payload]
127
+ }),
128
+ ),
129
+ )
130
+ return deletedPairs.map(([hash]) => hash)
131
+ }
132
+
133
+ protected override getHandler(hashes: string[]): Promisable<Payload[]> {
134
+ return compact(
135
+ hashes.map((hash) => {
136
+ const cookieString = Cookies.get(this.keyFromHash(hash))
137
+ return cookieString ? JSON.parse(cookieString) : undefined
138
+ }),
139
+ )
140
+ }
141
+
142
+ protected override async insertHandler(payloads: Payload[]): Promise<Payload[]> {
143
+ try {
144
+ const resultPayloads: Payload[] = await Promise.all(
145
+ payloads.map(async (payload) => {
146
+ const wrapper = PayloadWrapper.wrap(payload)
147
+ const key = this.keyFromHash(await wrapper.hashAsync())
148
+ const value = JSON.stringify(wrapper.payload())
149
+ assertEx(value.length < this.maxEntrySize, `Payload too large [${wrapper.hashAsync()}, ${value.length}]`)
150
+ Cookies.set(key, JSON.stringify(wrapper.payload()))
151
+ return wrapper.payload()
152
+ }),
153
+ )
154
+ return resultPayloads
155
+ } catch (ex) {
156
+ console.error(`Error: ${JSON.stringify(ex, null, 2)}`)
157
+ throw ex
158
+ }
159
+ }
160
+
161
+ private keyFromHash(hash: string) {
162
+ return `${this.namespace}-${hash}`
163
+ }
164
+ }