keyv 5.0.0 → 5.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/index.cjs +455 -0
- package/dist/{esm/index.d.ts → index.d.cts} +53 -14
- package/dist/{cjs/index.d.ts → index.d.ts} +53 -14
- package/dist/index.js +429 -0
- package/package.json +12 -9
- package/dist/cjs/event-manager.d.ts +0 -16
- package/dist/cjs/event-manager.js +0 -95
- package/dist/cjs/event-manager.js.map +0 -1
- package/dist/cjs/hooks-manager.d.ts +0 -11
- package/dist/cjs/hooks-manager.js +0 -55
- package/dist/cjs/hooks-manager.js.map +0 -1
- package/dist/cjs/index.js +0 -267
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/stats-manager.d.ts +0 -16
- package/dist/cjs/stats-manager.js +0 -51
- package/dist/cjs/stats-manager.js.map +0 -1
- package/dist/esm/event-manager.d.ts +0 -16
- package/dist/esm/event-manager.js +0 -93
- package/dist/esm/event-manager.js.map +0 -1
- package/dist/esm/hooks-manager.d.ts +0 -11
- package/dist/esm/hooks-manager.js +0 -50
- package/dist/esm/hooks-manager.js.map +0 -1
- package/dist/esm/index.js +0 -261
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/stats-manager.d.ts +0 -16
- package/dist/esm/stats-manager.js +0 -46
- package/dist/esm/stats-manager.js.map +0 -1
package/README.md
CHANGED
|
@@ -150,18 +150,18 @@ import Keyv, { KeyvHooks } from 'keyv';
|
|
|
150
150
|
```js
|
|
151
151
|
//PRE_SET hook
|
|
152
152
|
const keyv = new Keyv();
|
|
153
|
-
keyv.hooks.
|
|
153
|
+
keyv.hooks.addHandler(KeyvHooks.PRE_SET, (key, value) => console.log(`Setting key ${key} to ${value}`));
|
|
154
154
|
|
|
155
155
|
//POST_SET hook
|
|
156
156
|
const keyv = new Keyv();
|
|
157
|
-
keyv.hooks.
|
|
157
|
+
keyv.hooks.addHandler(KeyvHooks.POST_SET, (key, value) => console.log(`Set key ${key} to ${value}`));
|
|
158
158
|
```
|
|
159
159
|
|
|
160
160
|
In these examples you can also manipulate the value before it is set. For example, you could add a prefix to all keys.
|
|
161
161
|
|
|
162
162
|
```js
|
|
163
163
|
const keyv = new Keyv();
|
|
164
|
-
keyv.hooks.
|
|
164
|
+
keyv.hooks.addHandler(KeyvHooks.PRE_SET, (key, value) => {
|
|
165
165
|
console.log(`Setting key ${key} to ${value}`);
|
|
166
166
|
key = `prefix-${key}`;
|
|
167
167
|
});
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,455 @@
|
|
|
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 __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var src_exports = {};
|
|
22
|
+
__export(src_exports, {
|
|
23
|
+
Keyv: () => Keyv,
|
|
24
|
+
KeyvHooks: () => KeyvHooks,
|
|
25
|
+
default: () => src_default
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(src_exports);
|
|
28
|
+
var import_serialize = require("@keyv/serialize");
|
|
29
|
+
|
|
30
|
+
// src/event-manager.ts
|
|
31
|
+
var EventManager = class {
|
|
32
|
+
_eventListeners;
|
|
33
|
+
_maxListeners;
|
|
34
|
+
constructor() {
|
|
35
|
+
this._eventListeners = /* @__PURE__ */ new Map();
|
|
36
|
+
this._maxListeners = 100;
|
|
37
|
+
}
|
|
38
|
+
maxListeners() {
|
|
39
|
+
return this._maxListeners;
|
|
40
|
+
}
|
|
41
|
+
// Add an event listener
|
|
42
|
+
addListener(event, listener) {
|
|
43
|
+
this.on(event, listener);
|
|
44
|
+
}
|
|
45
|
+
on(event, listener) {
|
|
46
|
+
if (!this._eventListeners.has(event)) {
|
|
47
|
+
this._eventListeners.set(event, []);
|
|
48
|
+
}
|
|
49
|
+
const listeners = this._eventListeners.get(event);
|
|
50
|
+
if (listeners) {
|
|
51
|
+
if (listeners.length >= this._maxListeners) {
|
|
52
|
+
console.warn(`MaxListenersExceededWarning: Possible event memory leak detected. ${listeners.length + 1} ${event} listeners added. Use setMaxListeners() to increase limit.`);
|
|
53
|
+
}
|
|
54
|
+
listeners.push(listener);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Remove an event listener
|
|
58
|
+
removeListener(event, listener) {
|
|
59
|
+
this.off(event, listener);
|
|
60
|
+
}
|
|
61
|
+
off(event, listener) {
|
|
62
|
+
const listeners = this._eventListeners.get(event) ?? [];
|
|
63
|
+
const index = listeners.indexOf(listener);
|
|
64
|
+
if (index > -1) {
|
|
65
|
+
listeners.splice(index, 1);
|
|
66
|
+
}
|
|
67
|
+
if (listeners.length === 0) {
|
|
68
|
+
this._eventListeners.delete(event);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Emit an event
|
|
72
|
+
emit(event, ...arguments_) {
|
|
73
|
+
const listeners = this._eventListeners.get(event);
|
|
74
|
+
if (listeners && listeners.length > 0) {
|
|
75
|
+
for (const listener of listeners) {
|
|
76
|
+
listener(...arguments_);
|
|
77
|
+
}
|
|
78
|
+
} else if (event === "error") {
|
|
79
|
+
if (arguments_[0] instanceof Error) {
|
|
80
|
+
throw arguments_[0];
|
|
81
|
+
} else {
|
|
82
|
+
const error = new CustomError(arguments_[0]);
|
|
83
|
+
error.context = arguments_[0];
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Get all listeners for a specific event
|
|
89
|
+
listeners(event) {
|
|
90
|
+
return this._eventListeners.get(event) ?? [];
|
|
91
|
+
}
|
|
92
|
+
// Remove all listeners for a specific event
|
|
93
|
+
removeAllListeners(event) {
|
|
94
|
+
if (event) {
|
|
95
|
+
this._eventListeners.delete(event);
|
|
96
|
+
} else {
|
|
97
|
+
this._eventListeners.clear();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Set the maximum number of listeners for a single event
|
|
101
|
+
setMaxListeners(n) {
|
|
102
|
+
this._maxListeners = n;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
var CustomError = class _CustomError extends Error {
|
|
106
|
+
context;
|
|
107
|
+
constructor(message, context) {
|
|
108
|
+
super(message);
|
|
109
|
+
this.context = context;
|
|
110
|
+
if (Error.captureStackTrace) {
|
|
111
|
+
Error.captureStackTrace(this, _CustomError);
|
|
112
|
+
}
|
|
113
|
+
this.name = this.constructor.name;
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
var event_manager_default = EventManager;
|
|
117
|
+
|
|
118
|
+
// src/hooks-manager.ts
|
|
119
|
+
var HooksManager = class extends event_manager_default {
|
|
120
|
+
_hookHandlers;
|
|
121
|
+
constructor() {
|
|
122
|
+
super();
|
|
123
|
+
this._hookHandlers = /* @__PURE__ */ new Map();
|
|
124
|
+
}
|
|
125
|
+
// Adds a handler function for a specific event
|
|
126
|
+
addHandler(event, handler) {
|
|
127
|
+
const eventHandlers = this._hookHandlers.get(event);
|
|
128
|
+
if (eventHandlers) {
|
|
129
|
+
eventHandlers.push(handler);
|
|
130
|
+
} else {
|
|
131
|
+
this._hookHandlers.set(event, [handler]);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Removes a specific handler function for a specific event
|
|
135
|
+
removeHandler(event, handler) {
|
|
136
|
+
const eventHandlers = this._hookHandlers.get(event);
|
|
137
|
+
if (eventHandlers) {
|
|
138
|
+
const index = eventHandlers.indexOf(handler);
|
|
139
|
+
if (index !== -1) {
|
|
140
|
+
eventHandlers.splice(index, 1);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Triggers all handlers for a specific event with provided data
|
|
145
|
+
trigger(event, data) {
|
|
146
|
+
const eventHandlers = this._hookHandlers.get(event);
|
|
147
|
+
if (eventHandlers) {
|
|
148
|
+
for (const handler of eventHandlers) {
|
|
149
|
+
try {
|
|
150
|
+
handler(data);
|
|
151
|
+
} catch (error) {
|
|
152
|
+
this.emit("error", new Error(`Error in hook handler for event "${event}": ${error.message}`));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Provides read-only access to the current handlers
|
|
158
|
+
get handlers() {
|
|
159
|
+
return new Map(this._hookHandlers);
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
var hooks_manager_default = HooksManager;
|
|
163
|
+
|
|
164
|
+
// src/stats-manager.ts
|
|
165
|
+
var StatsManager = class extends event_manager_default {
|
|
166
|
+
enabled = true;
|
|
167
|
+
hits = 0;
|
|
168
|
+
misses = 0;
|
|
169
|
+
sets = 0;
|
|
170
|
+
deletes = 0;
|
|
171
|
+
errors = 0;
|
|
172
|
+
constructor(enabled) {
|
|
173
|
+
super();
|
|
174
|
+
if (enabled !== void 0) {
|
|
175
|
+
this.enabled = enabled;
|
|
176
|
+
}
|
|
177
|
+
this.reset();
|
|
178
|
+
}
|
|
179
|
+
hit() {
|
|
180
|
+
if (this.enabled) {
|
|
181
|
+
this.hits++;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
miss() {
|
|
185
|
+
if (this.enabled) {
|
|
186
|
+
this.misses++;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
set() {
|
|
190
|
+
if (this.enabled) {
|
|
191
|
+
this.sets++;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
delete() {
|
|
195
|
+
if (this.enabled) {
|
|
196
|
+
this.deletes++;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
reset() {
|
|
200
|
+
this.hits = 0;
|
|
201
|
+
this.misses = 0;
|
|
202
|
+
this.sets = 0;
|
|
203
|
+
this.deletes = 0;
|
|
204
|
+
this.errors = 0;
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
var stats_manager_default = StatsManager;
|
|
208
|
+
|
|
209
|
+
// src/index.ts
|
|
210
|
+
var KeyvHooks = /* @__PURE__ */ ((KeyvHooks2) => {
|
|
211
|
+
KeyvHooks2["PRE_SET"] = "preSet";
|
|
212
|
+
KeyvHooks2["POST_SET"] = "postSet";
|
|
213
|
+
KeyvHooks2["PRE_GET"] = "preGet";
|
|
214
|
+
KeyvHooks2["POST_GET"] = "postGet";
|
|
215
|
+
KeyvHooks2["PRE_GET_MANY"] = "preGetMany";
|
|
216
|
+
KeyvHooks2["POST_GET_MANY"] = "postGetMany";
|
|
217
|
+
KeyvHooks2["PRE_DELETE"] = "preDelete";
|
|
218
|
+
KeyvHooks2["POST_DELETE"] = "postDelete";
|
|
219
|
+
return KeyvHooks2;
|
|
220
|
+
})(KeyvHooks || {});
|
|
221
|
+
var iterableAdapters = [
|
|
222
|
+
"sqlite",
|
|
223
|
+
"postgres",
|
|
224
|
+
"mysql",
|
|
225
|
+
"mongo",
|
|
226
|
+
"redis",
|
|
227
|
+
"tiered"
|
|
228
|
+
];
|
|
229
|
+
var Keyv = class extends event_manager_default {
|
|
230
|
+
opts;
|
|
231
|
+
iterator;
|
|
232
|
+
hooks = new hooks_manager_default();
|
|
233
|
+
stats = new stats_manager_default(false);
|
|
234
|
+
constructor(store, options) {
|
|
235
|
+
super();
|
|
236
|
+
options ??= {};
|
|
237
|
+
store ??= {};
|
|
238
|
+
this.opts = {
|
|
239
|
+
namespace: "keyv",
|
|
240
|
+
serialize: import_serialize.defaultSerialize,
|
|
241
|
+
deserialize: import_serialize.defaultDeserialize,
|
|
242
|
+
emitErrors: true,
|
|
243
|
+
// @ts-expect-error - Map is not a KeyvStoreAdapter
|
|
244
|
+
store: /* @__PURE__ */ new Map(),
|
|
245
|
+
...options
|
|
246
|
+
};
|
|
247
|
+
if (store && store.get) {
|
|
248
|
+
this.opts.store = store;
|
|
249
|
+
} else {
|
|
250
|
+
this.opts = {
|
|
251
|
+
...this.opts,
|
|
252
|
+
...store
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
if (this.opts.compression) {
|
|
256
|
+
const compression = this.opts.compression;
|
|
257
|
+
this.opts.serialize = compression.serialize.bind(compression);
|
|
258
|
+
this.opts.deserialize = compression.deserialize.bind(compression);
|
|
259
|
+
}
|
|
260
|
+
if (this.opts.store) {
|
|
261
|
+
if (!this._isValidStorageAdapter(this.opts.store)) {
|
|
262
|
+
throw new Error("Invalid storage adapter");
|
|
263
|
+
}
|
|
264
|
+
if (typeof this.opts.store.on === "function" && this.opts.emitErrors) {
|
|
265
|
+
this.opts.store.on("error", (error) => this.emit("error", error));
|
|
266
|
+
}
|
|
267
|
+
this.opts.store.namespace = this.opts.namespace;
|
|
268
|
+
if (typeof this.opts.store[Symbol.iterator] === "function" && this.opts.store instanceof Map) {
|
|
269
|
+
this.iterator = this.generateIterator(this.opts.store);
|
|
270
|
+
} else if ("iterator" in this.opts.store && this.opts.store.opts && this._checkIterableAdapter()) {
|
|
271
|
+
this.iterator = this.generateIterator(this.opts.store.iterator.bind(this.opts.store));
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
if (this.opts.stats) {
|
|
275
|
+
this.stats.enabled = this.opts.stats;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
generateIterator(iterator) {
|
|
279
|
+
const function_ = async function* () {
|
|
280
|
+
for await (const [key, raw] of typeof iterator === "function" ? iterator(this.opts.store.namespace) : iterator) {
|
|
281
|
+
const data = await this.opts.deserialize(raw);
|
|
282
|
+
if (this.opts.store.namespace && !key.includes(this.opts.store.namespace)) {
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
if (typeof data.expires === "number" && Date.now() > data.expires) {
|
|
286
|
+
this.delete(key);
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
yield [this._getKeyUnprefix(key), data.value];
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
return function_.bind(this);
|
|
293
|
+
}
|
|
294
|
+
_checkIterableAdapter() {
|
|
295
|
+
return iterableAdapters.includes(this.opts.store.opts.dialect) || iterableAdapters.some((element) => this.opts.store.opts.url.includes(element));
|
|
296
|
+
}
|
|
297
|
+
_getKeyPrefix(key) {
|
|
298
|
+
return `${this.opts.namespace}:${key}`;
|
|
299
|
+
}
|
|
300
|
+
_getKeyPrefixArray(keys) {
|
|
301
|
+
return keys.map((key) => `${this.opts.namespace}:${key}`);
|
|
302
|
+
}
|
|
303
|
+
_getKeyUnprefix(key) {
|
|
304
|
+
return key.split(":").splice(1).join(":");
|
|
305
|
+
}
|
|
306
|
+
_isValidStorageAdapter(store) {
|
|
307
|
+
return store instanceof Map || typeof store.get === "function" && typeof store.set === "function" && typeof store.delete === "function" && typeof store.clear === "function";
|
|
308
|
+
}
|
|
309
|
+
async get(key, options) {
|
|
310
|
+
const { store } = this.opts;
|
|
311
|
+
const isArray = Array.isArray(key);
|
|
312
|
+
const keyPrefixed = isArray ? this._getKeyPrefixArray(key) : this._getKeyPrefix(key);
|
|
313
|
+
const isDataExpired = (data) => typeof data.expires === "number" && Date.now() > data.expires;
|
|
314
|
+
if (isArray) {
|
|
315
|
+
this.hooks.trigger("preGetMany" /* PRE_GET_MANY */, { keys: keyPrefixed });
|
|
316
|
+
if (store.getMany === void 0) {
|
|
317
|
+
const promises = keyPrefixed.map(async (key2) => {
|
|
318
|
+
const rawData3 = await store.get(key2);
|
|
319
|
+
const deserializedRow = typeof rawData3 === "string" || this.opts.compression ? await this.opts.deserialize(rawData3) : rawData3;
|
|
320
|
+
if (deserializedRow === void 0 || deserializedRow === null) {
|
|
321
|
+
return void 0;
|
|
322
|
+
}
|
|
323
|
+
if (isDataExpired(deserializedRow)) {
|
|
324
|
+
await this.delete(key2);
|
|
325
|
+
return void 0;
|
|
326
|
+
}
|
|
327
|
+
return options?.raw ? deserializedRow : deserializedRow.value;
|
|
328
|
+
});
|
|
329
|
+
const deserializedRows = await Promise.allSettled(promises);
|
|
330
|
+
const result2 = deserializedRows.map((row) => row.value);
|
|
331
|
+
this.hooks.trigger("postGetMany" /* POST_GET_MANY */, result2);
|
|
332
|
+
if (result2.length > 0) {
|
|
333
|
+
this.stats.hit();
|
|
334
|
+
}
|
|
335
|
+
return result2;
|
|
336
|
+
}
|
|
337
|
+
const rawData2 = await store.getMany(keyPrefixed);
|
|
338
|
+
const result = [];
|
|
339
|
+
for (const index in rawData2) {
|
|
340
|
+
let row = rawData2[index];
|
|
341
|
+
if (typeof row === "string") {
|
|
342
|
+
row = await this.opts.deserialize(row);
|
|
343
|
+
}
|
|
344
|
+
if (row === void 0 || row === null) {
|
|
345
|
+
result.push(void 0);
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
if (isDataExpired(row)) {
|
|
349
|
+
await this.delete(key[index]);
|
|
350
|
+
result.push(void 0);
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
const value = options?.raw ? row : row.value;
|
|
354
|
+
result.push(value);
|
|
355
|
+
}
|
|
356
|
+
this.hooks.trigger("postGetMany" /* POST_GET_MANY */, result);
|
|
357
|
+
if (result.length > 0) {
|
|
358
|
+
this.stats.hit();
|
|
359
|
+
}
|
|
360
|
+
return result;
|
|
361
|
+
}
|
|
362
|
+
this.hooks.trigger("preGet" /* PRE_GET */, { key: keyPrefixed });
|
|
363
|
+
const rawData = await store.get(keyPrefixed);
|
|
364
|
+
const deserializedData = typeof rawData === "string" || this.opts.compression ? await this.opts.deserialize(rawData) : rawData;
|
|
365
|
+
if (deserializedData === void 0 || deserializedData === null) {
|
|
366
|
+
this.stats.miss();
|
|
367
|
+
return void 0;
|
|
368
|
+
}
|
|
369
|
+
if (isDataExpired(deserializedData)) {
|
|
370
|
+
await this.delete(key);
|
|
371
|
+
this.stats.miss();
|
|
372
|
+
return void 0;
|
|
373
|
+
}
|
|
374
|
+
this.hooks.trigger("postGet" /* POST_GET */, { key: keyPrefixed, value: deserializedData });
|
|
375
|
+
this.stats.hit();
|
|
376
|
+
return options?.raw ? deserializedData : deserializedData.value;
|
|
377
|
+
}
|
|
378
|
+
async set(key, value, ttl) {
|
|
379
|
+
this.hooks.trigger("preSet" /* PRE_SET */, { key, value, ttl });
|
|
380
|
+
const keyPrefixed = this._getKeyPrefix(key);
|
|
381
|
+
if (typeof ttl === "undefined") {
|
|
382
|
+
ttl = this.opts.ttl;
|
|
383
|
+
}
|
|
384
|
+
if (ttl === 0) {
|
|
385
|
+
ttl = void 0;
|
|
386
|
+
}
|
|
387
|
+
const { store } = this.opts;
|
|
388
|
+
const expires = typeof ttl === "number" ? Date.now() + ttl : null;
|
|
389
|
+
if (typeof value === "symbol") {
|
|
390
|
+
this.emit("error", "symbol cannot be serialized");
|
|
391
|
+
}
|
|
392
|
+
value = { value, expires };
|
|
393
|
+
value = await this.opts.serialize(value);
|
|
394
|
+
await store.set(keyPrefixed, value, ttl);
|
|
395
|
+
this.hooks.trigger("postSet" /* POST_SET */, { key: keyPrefixed, value, ttl });
|
|
396
|
+
this.stats.set();
|
|
397
|
+
return true;
|
|
398
|
+
}
|
|
399
|
+
async delete(key) {
|
|
400
|
+
const { store } = this.opts;
|
|
401
|
+
if (Array.isArray(key)) {
|
|
402
|
+
const keyPrefixed2 = this._getKeyPrefixArray(key);
|
|
403
|
+
this.hooks.trigger("preDelete" /* PRE_DELETE */, { key: keyPrefixed2 });
|
|
404
|
+
if (store.deleteMany !== void 0) {
|
|
405
|
+
return store.deleteMany(keyPrefixed2);
|
|
406
|
+
}
|
|
407
|
+
const promises = keyPrefixed2.map(async (key2) => store.delete(key2));
|
|
408
|
+
const results = await Promise.allSettled(promises);
|
|
409
|
+
const returnResult = results.every((x) => x.value === true);
|
|
410
|
+
this.hooks.trigger("postDelete" /* POST_DELETE */, returnResult);
|
|
411
|
+
return returnResult;
|
|
412
|
+
}
|
|
413
|
+
const keyPrefixed = this._getKeyPrefix(key);
|
|
414
|
+
const result = store.delete(keyPrefixed);
|
|
415
|
+
this.hooks.trigger("postDelete" /* POST_DELETE */, result);
|
|
416
|
+
this.stats.delete();
|
|
417
|
+
return result;
|
|
418
|
+
}
|
|
419
|
+
async clear() {
|
|
420
|
+
this.emit("clear");
|
|
421
|
+
const { store } = this.opts;
|
|
422
|
+
await store.clear();
|
|
423
|
+
}
|
|
424
|
+
async has(key) {
|
|
425
|
+
const keyPrefixed = this._getKeyPrefix(key);
|
|
426
|
+
const { store } = this.opts;
|
|
427
|
+
if (store.has !== void 0 && !(store instanceof Map)) {
|
|
428
|
+
return store.has(keyPrefixed);
|
|
429
|
+
}
|
|
430
|
+
const rawData = await store.get(keyPrefixed);
|
|
431
|
+
if (rawData) {
|
|
432
|
+
const data = this.opts.deserialize(rawData);
|
|
433
|
+
if (data) {
|
|
434
|
+
if (data.expires === void 0 || data.expires === null) {
|
|
435
|
+
return true;
|
|
436
|
+
}
|
|
437
|
+
return data.expires > Date.now();
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
return false;
|
|
441
|
+
}
|
|
442
|
+
async disconnect() {
|
|
443
|
+
const { store } = this.opts;
|
|
444
|
+
this.emit("disconnect");
|
|
445
|
+
if (typeof store.disconnect === "function") {
|
|
446
|
+
return store.disconnect();
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
};
|
|
450
|
+
var src_default = Keyv;
|
|
451
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
452
|
+
0 && (module.exports = {
|
|
453
|
+
Keyv,
|
|
454
|
+
KeyvHooks
|
|
455
|
+
});
|
|
@@ -1,17 +1,55 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
type EventListener = (...arguments_: any[]) => void;
|
|
2
|
+
declare class EventManager {
|
|
3
|
+
_eventListeners: Map<string, EventListener[]>;
|
|
4
|
+
_maxListeners: number;
|
|
5
|
+
constructor();
|
|
6
|
+
maxListeners(): number;
|
|
7
|
+
addListener(event: string, listener: EventListener): void;
|
|
8
|
+
on(event: string, listener: EventListener): void;
|
|
9
|
+
removeListener(event: string, listener: EventListener): void;
|
|
10
|
+
off(event: string, listener: EventListener): void;
|
|
11
|
+
emit(event: string, ...arguments_: any[]): void;
|
|
12
|
+
listeners(event: string): EventListener[];
|
|
13
|
+
removeAllListeners(event?: string): void;
|
|
14
|
+
setMaxListeners(n: number): void;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
type HookHandler = (...arguments_: any[]) => void;
|
|
18
|
+
declare class HooksManager extends EventManager {
|
|
19
|
+
_hookHandlers: Map<string, HookHandler[]>;
|
|
20
|
+
constructor();
|
|
21
|
+
addHandler(event: string, handler: HookHandler): void;
|
|
22
|
+
removeHandler(event: string, handler: HookHandler): void;
|
|
23
|
+
trigger(event: string, data: any): void;
|
|
24
|
+
get handlers(): Map<string, HookHandler[]>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
declare class StatsManager extends EventManager {
|
|
28
|
+
enabled: boolean;
|
|
29
|
+
hits: number;
|
|
30
|
+
misses: number;
|
|
31
|
+
sets: number;
|
|
32
|
+
deletes: number;
|
|
33
|
+
errors: number;
|
|
34
|
+
constructor(enabled?: boolean);
|
|
35
|
+
hit(): void;
|
|
36
|
+
miss(): void;
|
|
37
|
+
set(): void;
|
|
38
|
+
delete(): void;
|
|
39
|
+
reset(): void;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
type DeserializedData<Value> = {
|
|
5
43
|
value?: Value;
|
|
6
44
|
expires?: number;
|
|
7
45
|
};
|
|
8
|
-
|
|
46
|
+
interface CompressionAdapter {
|
|
9
47
|
compress(value: any, options?: any): Promise<any>;
|
|
10
48
|
decompress(value: any, options?: any): Promise<any>;
|
|
11
49
|
serialize<Value>(data: DeserializedData<Value>): Promise<string> | string;
|
|
12
50
|
deserialize<Value>(data: string): Promise<DeserializedData<Value> | undefined> | DeserializedData<Value> | undefined;
|
|
13
51
|
}
|
|
14
|
-
|
|
52
|
+
declare enum KeyvHooks {
|
|
15
53
|
PRE_SET = "preSet",
|
|
16
54
|
POST_SET = "postSet",
|
|
17
55
|
PRE_GET = "preGet",
|
|
@@ -21,13 +59,13 @@ export declare enum KeyvHooks {
|
|
|
21
59
|
PRE_DELETE = "preDelete",
|
|
22
60
|
POST_DELETE = "postDelete"
|
|
23
61
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
on(event: string, listener: (...arguments_: any[]) => void):
|
|
62
|
+
type StoredDataNoRaw<Value> = Value | undefined;
|
|
63
|
+
type StoredDataRaw<Value> = DeserializedData<Value> | undefined;
|
|
64
|
+
type StoredData<Value> = StoredDataNoRaw<Value> | StoredDataRaw<Value>;
|
|
65
|
+
interface IEventEmitter {
|
|
66
|
+
on(event: string, listener: (...arguments_: any[]) => void): void;
|
|
29
67
|
}
|
|
30
|
-
|
|
68
|
+
interface KeyvStoreAdapter extends IEventEmitter {
|
|
31
69
|
opts: any;
|
|
32
70
|
namespace?: string;
|
|
33
71
|
get<Value>(key: string): Promise<StoredData<Value> | undefined>;
|
|
@@ -40,7 +78,7 @@ export interface KeyvStoreAdapter extends IEventEmitter {
|
|
|
40
78
|
deleteMany?(key: string[]): Promise<boolean>;
|
|
41
79
|
iterator?<Value>(namespace?: string): AsyncGenerator<Array<string | Awaited<Value> | undefined>, void>;
|
|
42
80
|
}
|
|
43
|
-
|
|
81
|
+
type KeyvOptions = {
|
|
44
82
|
/** Emit errors */
|
|
45
83
|
emitErrors?: boolean;
|
|
46
84
|
/** Namespace for the current instance. */
|
|
@@ -93,4 +131,5 @@ declare class Keyv extends EventManager {
|
|
|
93
131
|
has(key: string): Promise<boolean>;
|
|
94
132
|
disconnect(): Promise<void>;
|
|
95
133
|
}
|
|
96
|
-
|
|
134
|
+
|
|
135
|
+
export { type CompressionAdapter, type DeserializedData, type IEventEmitter, Keyv, KeyvHooks, type KeyvOptions, type KeyvStoreAdapter, type StoredData, type StoredDataNoRaw, type StoredDataRaw, Keyv as default };
|
|
@@ -1,17 +1,55 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
type EventListener = (...arguments_: any[]) => void;
|
|
2
|
+
declare class EventManager {
|
|
3
|
+
_eventListeners: Map<string, EventListener[]>;
|
|
4
|
+
_maxListeners: number;
|
|
5
|
+
constructor();
|
|
6
|
+
maxListeners(): number;
|
|
7
|
+
addListener(event: string, listener: EventListener): void;
|
|
8
|
+
on(event: string, listener: EventListener): void;
|
|
9
|
+
removeListener(event: string, listener: EventListener): void;
|
|
10
|
+
off(event: string, listener: EventListener): void;
|
|
11
|
+
emit(event: string, ...arguments_: any[]): void;
|
|
12
|
+
listeners(event: string): EventListener[];
|
|
13
|
+
removeAllListeners(event?: string): void;
|
|
14
|
+
setMaxListeners(n: number): void;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
type HookHandler = (...arguments_: any[]) => void;
|
|
18
|
+
declare class HooksManager extends EventManager {
|
|
19
|
+
_hookHandlers: Map<string, HookHandler[]>;
|
|
20
|
+
constructor();
|
|
21
|
+
addHandler(event: string, handler: HookHandler): void;
|
|
22
|
+
removeHandler(event: string, handler: HookHandler): void;
|
|
23
|
+
trigger(event: string, data: any): void;
|
|
24
|
+
get handlers(): Map<string, HookHandler[]>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
declare class StatsManager extends EventManager {
|
|
28
|
+
enabled: boolean;
|
|
29
|
+
hits: number;
|
|
30
|
+
misses: number;
|
|
31
|
+
sets: number;
|
|
32
|
+
deletes: number;
|
|
33
|
+
errors: number;
|
|
34
|
+
constructor(enabled?: boolean);
|
|
35
|
+
hit(): void;
|
|
36
|
+
miss(): void;
|
|
37
|
+
set(): void;
|
|
38
|
+
delete(): void;
|
|
39
|
+
reset(): void;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
type DeserializedData<Value> = {
|
|
5
43
|
value?: Value;
|
|
6
44
|
expires?: number;
|
|
7
45
|
};
|
|
8
|
-
|
|
46
|
+
interface CompressionAdapter {
|
|
9
47
|
compress(value: any, options?: any): Promise<any>;
|
|
10
48
|
decompress(value: any, options?: any): Promise<any>;
|
|
11
49
|
serialize<Value>(data: DeserializedData<Value>): Promise<string> | string;
|
|
12
50
|
deserialize<Value>(data: string): Promise<DeserializedData<Value> | undefined> | DeserializedData<Value> | undefined;
|
|
13
51
|
}
|
|
14
|
-
|
|
52
|
+
declare enum KeyvHooks {
|
|
15
53
|
PRE_SET = "preSet",
|
|
16
54
|
POST_SET = "postSet",
|
|
17
55
|
PRE_GET = "preGet",
|
|
@@ -21,13 +59,13 @@ export declare enum KeyvHooks {
|
|
|
21
59
|
PRE_DELETE = "preDelete",
|
|
22
60
|
POST_DELETE = "postDelete"
|
|
23
61
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
on(event: string, listener: (...arguments_: any[]) => void):
|
|
62
|
+
type StoredDataNoRaw<Value> = Value | undefined;
|
|
63
|
+
type StoredDataRaw<Value> = DeserializedData<Value> | undefined;
|
|
64
|
+
type StoredData<Value> = StoredDataNoRaw<Value> | StoredDataRaw<Value>;
|
|
65
|
+
interface IEventEmitter {
|
|
66
|
+
on(event: string, listener: (...arguments_: any[]) => void): void;
|
|
29
67
|
}
|
|
30
|
-
|
|
68
|
+
interface KeyvStoreAdapter extends IEventEmitter {
|
|
31
69
|
opts: any;
|
|
32
70
|
namespace?: string;
|
|
33
71
|
get<Value>(key: string): Promise<StoredData<Value> | undefined>;
|
|
@@ -40,7 +78,7 @@ export interface KeyvStoreAdapter extends IEventEmitter {
|
|
|
40
78
|
deleteMany?(key: string[]): Promise<boolean>;
|
|
41
79
|
iterator?<Value>(namespace?: string): AsyncGenerator<Array<string | Awaited<Value> | undefined>, void>;
|
|
42
80
|
}
|
|
43
|
-
|
|
81
|
+
type KeyvOptions = {
|
|
44
82
|
/** Emit errors */
|
|
45
83
|
emitErrors?: boolean;
|
|
46
84
|
/** Namespace for the current instance. */
|
|
@@ -93,4 +131,5 @@ declare class Keyv extends EventManager {
|
|
|
93
131
|
has(key: string): Promise<boolean>;
|
|
94
132
|
disconnect(): Promise<void>;
|
|
95
133
|
}
|
|
96
|
-
|
|
134
|
+
|
|
135
|
+
export { type CompressionAdapter, type DeserializedData, type IEventEmitter, Keyv, KeyvHooks, type KeyvOptions, type KeyvStoreAdapter, type StoredData, type StoredDataNoRaw, type StoredDataRaw, Keyv as default };
|