@sebspark/promise-cache 3.0.0 → 3.1.0
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/index.js +23 -124
- package/dist/index.mjs +13 -124
- package/package.json +3 -2
package/dist/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
2
3
|
var __defProp = Object.defineProperty;
|
|
3
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
8
|
var __export = (target, all) => {
|
|
7
9
|
for (var name in all)
|
|
@@ -15,6 +17,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
15
17
|
}
|
|
16
18
|
return to;
|
|
17
19
|
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
18
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
29
|
|
|
20
30
|
// src/index.ts
|
|
@@ -30,6 +40,7 @@ var import_node_crypto = require("crypto");
|
|
|
30
40
|
|
|
31
41
|
// src/persistor.ts
|
|
32
42
|
var import_redis = require("redis");
|
|
43
|
+
var import_superjson = __toESM(require("superjson"));
|
|
33
44
|
|
|
34
45
|
// src/localMemory.ts
|
|
35
46
|
var LocalStorage = class {
|
|
@@ -72,123 +83,11 @@ var createLocalMemoryClient = () => {
|
|
|
72
83
|
return localStorage;
|
|
73
84
|
};
|
|
74
85
|
|
|
75
|
-
// src/serializerUtils.ts
|
|
76
|
-
function serialize(value) {
|
|
77
|
-
const type = typeof value;
|
|
78
|
-
if (value === null) {
|
|
79
|
-
return JSON.stringify({ type: "null" });
|
|
80
|
-
}
|
|
81
|
-
if (value === void 0) {
|
|
82
|
-
return JSON.stringify({ type: "undefined" });
|
|
83
|
-
}
|
|
84
|
-
switch (type) {
|
|
85
|
-
case "string":
|
|
86
|
-
case "number":
|
|
87
|
-
case "boolean":
|
|
88
|
-
return JSON.stringify({ type, value });
|
|
89
|
-
case "bigint":
|
|
90
|
-
return JSON.stringify({ type: "bigint", value: value.toString() });
|
|
91
|
-
case "object": {
|
|
92
|
-
if (Array.isArray(value)) {
|
|
93
|
-
return JSON.stringify({ type: "array", value: value.map(serialize) });
|
|
94
|
-
}
|
|
95
|
-
if (value instanceof Map) {
|
|
96
|
-
const entries = Array.from(value.entries()).map(([key, val]) => [
|
|
97
|
-
serialize(key),
|
|
98
|
-
serialize(val)
|
|
99
|
-
]);
|
|
100
|
-
return JSON.stringify({ type: "map", value: entries });
|
|
101
|
-
}
|
|
102
|
-
if (value instanceof Set) {
|
|
103
|
-
const entries = Array.from(value).map(serialize);
|
|
104
|
-
return JSON.stringify({ type: "set", value: entries });
|
|
105
|
-
}
|
|
106
|
-
if (value.constructor === Object) {
|
|
107
|
-
const entries = Object.entries(value).reduce(
|
|
108
|
-
(acc, [key, val]) => {
|
|
109
|
-
acc[key] = serialize(val);
|
|
110
|
-
return acc;
|
|
111
|
-
},
|
|
112
|
-
{}
|
|
113
|
-
);
|
|
114
|
-
return JSON.stringify({ type: "object", value: entries });
|
|
115
|
-
}
|
|
116
|
-
throw new Error("Cannot serialize non-plain objects");
|
|
117
|
-
}
|
|
118
|
-
default:
|
|
119
|
-
throw new Error(`Unsupported type: ${type}`);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
function deserializePrimitives(serialized) {
|
|
123
|
-
let parsed = serialized;
|
|
124
|
-
if (typeof serialized === "string") {
|
|
125
|
-
parsed = JSON.parse(serialized);
|
|
126
|
-
}
|
|
127
|
-
switch (parsed.type) {
|
|
128
|
-
case "string":
|
|
129
|
-
return parsed.value;
|
|
130
|
-
case "number":
|
|
131
|
-
return Number(parsed.value);
|
|
132
|
-
case "boolean":
|
|
133
|
-
return Boolean(parsed.value);
|
|
134
|
-
case "undefined":
|
|
135
|
-
return void 0;
|
|
136
|
-
case "bigint":
|
|
137
|
-
return BigInt(parsed.value);
|
|
138
|
-
case "null":
|
|
139
|
-
return null;
|
|
140
|
-
default:
|
|
141
|
-
throw new Error(
|
|
142
|
-
`Unsupported type during deserialization: ${JSON.stringify(parsed)}`
|
|
143
|
-
);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
function deserialize(serialized) {
|
|
147
|
-
let parsed = serialized;
|
|
148
|
-
if (typeof serialized === "string") {
|
|
149
|
-
parsed = JSON.parse(serialized);
|
|
150
|
-
}
|
|
151
|
-
switch (parsed.type) {
|
|
152
|
-
case "string":
|
|
153
|
-
case "number":
|
|
154
|
-
case "boolean":
|
|
155
|
-
case "undefined":
|
|
156
|
-
case "bigint":
|
|
157
|
-
case "null":
|
|
158
|
-
return deserializePrimitives(parsed);
|
|
159
|
-
case "array":
|
|
160
|
-
return parsed.value.map(deserialize);
|
|
161
|
-
case "map": {
|
|
162
|
-
const map = /* @__PURE__ */ new Map();
|
|
163
|
-
for (const [key, val] of parsed.value) {
|
|
164
|
-
map.set(deserialize(key), deserialize(val));
|
|
165
|
-
}
|
|
166
|
-
return map;
|
|
167
|
-
}
|
|
168
|
-
case "set": {
|
|
169
|
-
const set = /* @__PURE__ */ new Set();
|
|
170
|
-
for (const item of parsed.value) {
|
|
171
|
-
set.add(deserialize(item));
|
|
172
|
-
}
|
|
173
|
-
return set;
|
|
174
|
-
}
|
|
175
|
-
case "object": {
|
|
176
|
-
const obj = {};
|
|
177
|
-
for (const [key, val] of Object.entries(parsed.value)) {
|
|
178
|
-
obj[key] = deserialize(val);
|
|
179
|
-
}
|
|
180
|
-
return obj;
|
|
181
|
-
}
|
|
182
|
-
default:
|
|
183
|
-
throw new Error(`Unsupported type during deserialization: ${parsed}`);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
|
|
187
86
|
// src/persistor.ts
|
|
188
87
|
var CACHE_CLIENT = import_redis.createClient;
|
|
189
88
|
var isTestRunning = process.env.NODE_ENV === "test";
|
|
190
89
|
function toMillis(seconds) {
|
|
191
|
-
return seconds
|
|
90
|
+
return seconds * 1e3;
|
|
192
91
|
}
|
|
193
92
|
var Persistor = class {
|
|
194
93
|
client = null;
|
|
@@ -279,20 +178,21 @@ var Persistor = class {
|
|
|
279
178
|
* @param object.timestamp Timestamp
|
|
280
179
|
*/
|
|
281
180
|
async set(key, { value, timestamp = Date.now(), ttl }) {
|
|
282
|
-
var _a;
|
|
181
|
+
var _a, _b;
|
|
283
182
|
if (!this.client || !this.client.isReady) {
|
|
284
183
|
(_a = this.logger) == null ? void 0 : _a.error("Client not ready");
|
|
285
184
|
return;
|
|
286
185
|
}
|
|
287
186
|
try {
|
|
288
|
-
const serializedData =
|
|
289
|
-
value
|
|
187
|
+
const serializedData = import_superjson.default.stringify({
|
|
188
|
+
value,
|
|
290
189
|
ttl,
|
|
291
190
|
timestamp
|
|
292
191
|
});
|
|
293
192
|
const options = this.createOptions(ttl);
|
|
294
193
|
await this.client.set(key, serializedData, options);
|
|
295
194
|
} catch (error) {
|
|
195
|
+
(_b = this.logger) == null ? void 0 : _b.error(`Error setting data in redis: ${error}`);
|
|
296
196
|
throw new Error(`Error setting data in redis: ${error}`);
|
|
297
197
|
}
|
|
298
198
|
}
|
|
@@ -302,21 +202,19 @@ var Persistor = class {
|
|
|
302
202
|
* @returns GetType<T> value
|
|
303
203
|
*/
|
|
304
204
|
async get(key) {
|
|
205
|
+
var _a, _b;
|
|
305
206
|
if (!this.client) {
|
|
306
|
-
|
|
207
|
+
(_a = this.logger) == null ? void 0 : _a.error("Client not ready");
|
|
208
|
+
return null;
|
|
307
209
|
}
|
|
308
210
|
try {
|
|
309
211
|
const data = await this.client.get(key);
|
|
310
212
|
if (!data) {
|
|
311
213
|
return null;
|
|
312
214
|
}
|
|
313
|
-
|
|
314
|
-
const deserialized = JSON.parse(storedData.value);
|
|
315
|
-
return {
|
|
316
|
-
...storedData,
|
|
317
|
-
value: deserialize(deserialized)
|
|
318
|
-
};
|
|
215
|
+
return import_superjson.default.parse(data);
|
|
319
216
|
} catch (error) {
|
|
217
|
+
(_b = this.logger) == null ? void 0 : _b.error(`Error getting data in redis: ${error}`);
|
|
320
218
|
throw new Error(`Error getting data from redis: ${error}`);
|
|
321
219
|
}
|
|
322
220
|
}
|
|
@@ -325,7 +223,7 @@ var Persistor = class {
|
|
|
325
223
|
* @param key Cache key
|
|
326
224
|
*/
|
|
327
225
|
async delete(key) {
|
|
328
|
-
var _a;
|
|
226
|
+
var _a, _b;
|
|
329
227
|
if (!this.client || !this.client.isReady) {
|
|
330
228
|
(_a = this.logger) == null ? void 0 : _a.error("Client not ready");
|
|
331
229
|
return;
|
|
@@ -333,6 +231,7 @@ var Persistor = class {
|
|
|
333
231
|
try {
|
|
334
232
|
await this.client.del(key);
|
|
335
233
|
} catch (error) {
|
|
234
|
+
(_b = this.logger) == null ? void 0 : _b.error(`Error deleting data from redis: ${error}`);
|
|
336
235
|
throw new Error(`Error deleting data from redis: ${error}`);
|
|
337
236
|
}
|
|
338
237
|
}
|
package/dist/index.mjs
CHANGED
|
@@ -3,6 +3,7 @@ import { randomUUID } from "node:crypto";
|
|
|
3
3
|
|
|
4
4
|
// src/persistor.ts
|
|
5
5
|
import { createClient } from "redis";
|
|
6
|
+
import superjson from "superjson";
|
|
6
7
|
|
|
7
8
|
// src/localMemory.ts
|
|
8
9
|
var LocalStorage = class {
|
|
@@ -45,123 +46,11 @@ var createLocalMemoryClient = () => {
|
|
|
45
46
|
return localStorage;
|
|
46
47
|
};
|
|
47
48
|
|
|
48
|
-
// src/serializerUtils.ts
|
|
49
|
-
function serialize(value) {
|
|
50
|
-
const type = typeof value;
|
|
51
|
-
if (value === null) {
|
|
52
|
-
return JSON.stringify({ type: "null" });
|
|
53
|
-
}
|
|
54
|
-
if (value === void 0) {
|
|
55
|
-
return JSON.stringify({ type: "undefined" });
|
|
56
|
-
}
|
|
57
|
-
switch (type) {
|
|
58
|
-
case "string":
|
|
59
|
-
case "number":
|
|
60
|
-
case "boolean":
|
|
61
|
-
return JSON.stringify({ type, value });
|
|
62
|
-
case "bigint":
|
|
63
|
-
return JSON.stringify({ type: "bigint", value: value.toString() });
|
|
64
|
-
case "object": {
|
|
65
|
-
if (Array.isArray(value)) {
|
|
66
|
-
return JSON.stringify({ type: "array", value: value.map(serialize) });
|
|
67
|
-
}
|
|
68
|
-
if (value instanceof Map) {
|
|
69
|
-
const entries = Array.from(value.entries()).map(([key, val]) => [
|
|
70
|
-
serialize(key),
|
|
71
|
-
serialize(val)
|
|
72
|
-
]);
|
|
73
|
-
return JSON.stringify({ type: "map", value: entries });
|
|
74
|
-
}
|
|
75
|
-
if (value instanceof Set) {
|
|
76
|
-
const entries = Array.from(value).map(serialize);
|
|
77
|
-
return JSON.stringify({ type: "set", value: entries });
|
|
78
|
-
}
|
|
79
|
-
if (value.constructor === Object) {
|
|
80
|
-
const entries = Object.entries(value).reduce(
|
|
81
|
-
(acc, [key, val]) => {
|
|
82
|
-
acc[key] = serialize(val);
|
|
83
|
-
return acc;
|
|
84
|
-
},
|
|
85
|
-
{}
|
|
86
|
-
);
|
|
87
|
-
return JSON.stringify({ type: "object", value: entries });
|
|
88
|
-
}
|
|
89
|
-
throw new Error("Cannot serialize non-plain objects");
|
|
90
|
-
}
|
|
91
|
-
default:
|
|
92
|
-
throw new Error(`Unsupported type: ${type}`);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
function deserializePrimitives(serialized) {
|
|
96
|
-
let parsed = serialized;
|
|
97
|
-
if (typeof serialized === "string") {
|
|
98
|
-
parsed = JSON.parse(serialized);
|
|
99
|
-
}
|
|
100
|
-
switch (parsed.type) {
|
|
101
|
-
case "string":
|
|
102
|
-
return parsed.value;
|
|
103
|
-
case "number":
|
|
104
|
-
return Number(parsed.value);
|
|
105
|
-
case "boolean":
|
|
106
|
-
return Boolean(parsed.value);
|
|
107
|
-
case "undefined":
|
|
108
|
-
return void 0;
|
|
109
|
-
case "bigint":
|
|
110
|
-
return BigInt(parsed.value);
|
|
111
|
-
case "null":
|
|
112
|
-
return null;
|
|
113
|
-
default:
|
|
114
|
-
throw new Error(
|
|
115
|
-
`Unsupported type during deserialization: ${JSON.stringify(parsed)}`
|
|
116
|
-
);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
function deserialize(serialized) {
|
|
120
|
-
let parsed = serialized;
|
|
121
|
-
if (typeof serialized === "string") {
|
|
122
|
-
parsed = JSON.parse(serialized);
|
|
123
|
-
}
|
|
124
|
-
switch (parsed.type) {
|
|
125
|
-
case "string":
|
|
126
|
-
case "number":
|
|
127
|
-
case "boolean":
|
|
128
|
-
case "undefined":
|
|
129
|
-
case "bigint":
|
|
130
|
-
case "null":
|
|
131
|
-
return deserializePrimitives(parsed);
|
|
132
|
-
case "array":
|
|
133
|
-
return parsed.value.map(deserialize);
|
|
134
|
-
case "map": {
|
|
135
|
-
const map = /* @__PURE__ */ new Map();
|
|
136
|
-
for (const [key, val] of parsed.value) {
|
|
137
|
-
map.set(deserialize(key), deserialize(val));
|
|
138
|
-
}
|
|
139
|
-
return map;
|
|
140
|
-
}
|
|
141
|
-
case "set": {
|
|
142
|
-
const set = /* @__PURE__ */ new Set();
|
|
143
|
-
for (const item of parsed.value) {
|
|
144
|
-
set.add(deserialize(item));
|
|
145
|
-
}
|
|
146
|
-
return set;
|
|
147
|
-
}
|
|
148
|
-
case "object": {
|
|
149
|
-
const obj = {};
|
|
150
|
-
for (const [key, val] of Object.entries(parsed.value)) {
|
|
151
|
-
obj[key] = deserialize(val);
|
|
152
|
-
}
|
|
153
|
-
return obj;
|
|
154
|
-
}
|
|
155
|
-
default:
|
|
156
|
-
throw new Error(`Unsupported type during deserialization: ${parsed}`);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
49
|
// src/persistor.ts
|
|
161
50
|
var CACHE_CLIENT = createClient;
|
|
162
51
|
var isTestRunning = process.env.NODE_ENV === "test";
|
|
163
52
|
function toMillis(seconds) {
|
|
164
|
-
return seconds
|
|
53
|
+
return seconds * 1e3;
|
|
165
54
|
}
|
|
166
55
|
var Persistor = class {
|
|
167
56
|
client = null;
|
|
@@ -252,20 +141,21 @@ var Persistor = class {
|
|
|
252
141
|
* @param object.timestamp Timestamp
|
|
253
142
|
*/
|
|
254
143
|
async set(key, { value, timestamp = Date.now(), ttl }) {
|
|
255
|
-
var _a;
|
|
144
|
+
var _a, _b;
|
|
256
145
|
if (!this.client || !this.client.isReady) {
|
|
257
146
|
(_a = this.logger) == null ? void 0 : _a.error("Client not ready");
|
|
258
147
|
return;
|
|
259
148
|
}
|
|
260
149
|
try {
|
|
261
|
-
const serializedData =
|
|
262
|
-
value
|
|
150
|
+
const serializedData = superjson.stringify({
|
|
151
|
+
value,
|
|
263
152
|
ttl,
|
|
264
153
|
timestamp
|
|
265
154
|
});
|
|
266
155
|
const options = this.createOptions(ttl);
|
|
267
156
|
await this.client.set(key, serializedData, options);
|
|
268
157
|
} catch (error) {
|
|
158
|
+
(_b = this.logger) == null ? void 0 : _b.error(`Error setting data in redis: ${error}`);
|
|
269
159
|
throw new Error(`Error setting data in redis: ${error}`);
|
|
270
160
|
}
|
|
271
161
|
}
|
|
@@ -275,21 +165,19 @@ var Persistor = class {
|
|
|
275
165
|
* @returns GetType<T> value
|
|
276
166
|
*/
|
|
277
167
|
async get(key) {
|
|
168
|
+
var _a, _b;
|
|
278
169
|
if (!this.client) {
|
|
279
|
-
|
|
170
|
+
(_a = this.logger) == null ? void 0 : _a.error("Client not ready");
|
|
171
|
+
return null;
|
|
280
172
|
}
|
|
281
173
|
try {
|
|
282
174
|
const data = await this.client.get(key);
|
|
283
175
|
if (!data) {
|
|
284
176
|
return null;
|
|
285
177
|
}
|
|
286
|
-
|
|
287
|
-
const deserialized = JSON.parse(storedData.value);
|
|
288
|
-
return {
|
|
289
|
-
...storedData,
|
|
290
|
-
value: deserialize(deserialized)
|
|
291
|
-
};
|
|
178
|
+
return superjson.parse(data);
|
|
292
179
|
} catch (error) {
|
|
180
|
+
(_b = this.logger) == null ? void 0 : _b.error(`Error getting data in redis: ${error}`);
|
|
293
181
|
throw new Error(`Error getting data from redis: ${error}`);
|
|
294
182
|
}
|
|
295
183
|
}
|
|
@@ -298,7 +186,7 @@ var Persistor = class {
|
|
|
298
186
|
* @param key Cache key
|
|
299
187
|
*/
|
|
300
188
|
async delete(key) {
|
|
301
|
-
var _a;
|
|
189
|
+
var _a, _b;
|
|
302
190
|
if (!this.client || !this.client.isReady) {
|
|
303
191
|
(_a = this.logger) == null ? void 0 : _a.error("Client not ready");
|
|
304
192
|
return;
|
|
@@ -306,6 +194,7 @@ var Persistor = class {
|
|
|
306
194
|
try {
|
|
307
195
|
await this.client.del(key);
|
|
308
196
|
} catch (error) {
|
|
197
|
+
(_b = this.logger) == null ? void 0 : _b.error(`Error deleting data from redis: ${error}`);
|
|
309
198
|
throw new Error(`Error deleting data from redis: ${error}`);
|
|
310
199
|
}
|
|
311
200
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sebspark/promise-cache",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
"tsconfig": "*"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"redis": "4.7.0"
|
|
22
|
+
"redis": "4.7.0",
|
|
23
|
+
"superjson": "^2.2.2"
|
|
23
24
|
}
|
|
24
25
|
}
|