keyv 5.0.0 → 5.0.1

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 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.addListener(KeyvHooks.PRE_SET, (key, value) => console.log(`Setting key ${key} to ${value}`));
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.addListener(KeyvHooks.POST_SET, (key, value) => console.log(`Set key ${key} to ${value}`));
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.addListener(KeyvHooks.PRE_SET, (key, value) => {
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
- import HooksManager from './hooks-manager.js';
2
- import EventManager from './event-manager.js';
3
- import StatsManager from './stats-manager.js';
4
- export type DeserializedData<Value> = {
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
- export interface CompressionAdapter {
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
- export declare enum KeyvHooks {
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
- export type StoredDataNoRaw<Value> = Value | undefined;
25
- export type StoredDataRaw<Value> = DeserializedData<Value> | undefined;
26
- export type StoredData<Value> = StoredDataNoRaw<Value> | StoredDataRaw<Value>;
27
- export interface IEventEmitter {
62
+ type StoredDataNoRaw<Value> = Value | undefined;
63
+ type StoredDataRaw<Value> = DeserializedData<Value> | undefined;
64
+ type StoredData<Value> = StoredDataNoRaw<Value> | StoredDataRaw<Value>;
65
+ interface IEventEmitter {
28
66
  on(event: string, listener: (...arguments_: any[]) => void): this;
29
67
  }
30
- export interface KeyvStoreAdapter extends IEventEmitter {
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
- export type KeyvOptions = {
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
- export default Keyv;
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
- import HooksManager from './hooks-manager.js';
2
- import EventManager from './event-manager.js';
3
- import StatsManager from './stats-manager.js';
4
- export type DeserializedData<Value> = {
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
- export interface CompressionAdapter {
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
- export declare enum KeyvHooks {
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
- export type StoredDataNoRaw<Value> = Value | undefined;
25
- export type StoredDataRaw<Value> = DeserializedData<Value> | undefined;
26
- export type StoredData<Value> = StoredDataNoRaw<Value> | StoredDataRaw<Value>;
27
- export interface IEventEmitter {
62
+ type StoredDataNoRaw<Value> = Value | undefined;
63
+ type StoredDataRaw<Value> = DeserializedData<Value> | undefined;
64
+ type StoredData<Value> = StoredDataNoRaw<Value> | StoredDataRaw<Value>;
65
+ interface IEventEmitter {
28
66
  on(event: string, listener: (...arguments_: any[]) => void): this;
29
67
  }
30
- export interface KeyvStoreAdapter extends IEventEmitter {
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
- export type KeyvOptions = {
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
- export default Keyv;
134
+
135
+ export { type CompressionAdapter, type DeserializedData, type IEventEmitter, Keyv, KeyvHooks, type KeyvOptions, type KeyvStoreAdapter, type StoredData, type StoredDataNoRaw, type StoredDataRaw, Keyv as default };