@keyv/redis 2.5.8 → 2.6.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.
@@ -0,0 +1,21 @@
1
+ /// <reference types="node" />
2
+ import EventEmitter from 'events';
3
+ import { type ClearOutput, type DeleteManyOutput, type DeleteOutput, type DisconnectOutput, type GetManyOutput, type GetOutput, type HasOutput, type IteratorOutput, type KeyvRedisOptions, type KeyvUriOptions, type SetOutput } from './types';
4
+ declare class KeyvRedis<Value = any> extends EventEmitter {
5
+ ttlSupport: boolean;
6
+ namespace?: string;
7
+ opts: Record<string, unknown>;
8
+ redis: any;
9
+ constructor(uri: KeyvRedisOptions | KeyvUriOptions, options?: KeyvRedisOptions);
10
+ _getNamespace(): string;
11
+ get(key: string): GetOutput<Value>;
12
+ getMany(keys: string[]): GetManyOutput<Value>;
13
+ set(key: string, value: Value, ttl?: number): SetOutput;
14
+ delete(key: string): DeleteOutput;
15
+ deleteMany(key: string): DeleteManyOutput;
16
+ clear(): ClearOutput;
17
+ iterator(namespace?: string): IteratorOutput;
18
+ has(key: string): HasOutput;
19
+ disconnect(): DisconnectOutput;
20
+ }
21
+ export = KeyvRedis;
package/dist/index.js ADDED
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ const events_1 = __importDefault(require("events"));
6
+ const ioredis_1 = __importDefault(require("ioredis"));
7
+ class KeyvRedis extends events_1.default {
8
+ constructor(uri, options) {
9
+ super();
10
+ this.ttlSupport = true;
11
+ this.opts = {};
12
+ this.opts.dialect = 'redis';
13
+ if (uri instanceof ioredis_1.default) {
14
+ this.redis = uri;
15
+ }
16
+ else {
17
+ options = { ...(typeof uri === 'string' ? { uri } : uri), ...options };
18
+ // @ts-expect-error - uri is a string or RedisOptions
19
+ this.redis = new ioredis_1.default(options.uri, options);
20
+ }
21
+ this.redis.on('error', (error) => this.emit('error', error));
22
+ }
23
+ _getNamespace() {
24
+ return `namespace:${this.namespace}`;
25
+ }
26
+ async get(key) {
27
+ const value = await this.redis.get(key);
28
+ if (value === null) {
29
+ return undefined;
30
+ }
31
+ return value;
32
+ }
33
+ async getMany(keys) {
34
+ const rows = await this.redis.mget(keys);
35
+ return rows;
36
+ }
37
+ async set(key, value, ttl) {
38
+ if (value === undefined) {
39
+ return undefined;
40
+ }
41
+ if (typeof ttl === 'number') {
42
+ await this.redis.set(key, value, 'PX', ttl);
43
+ }
44
+ else {
45
+ await this.redis.set(key, value);
46
+ }
47
+ await this.redis.sadd(this._getNamespace(), key);
48
+ }
49
+ async delete(key) {
50
+ const items = await this.redis.del(key);
51
+ await this.redis.srem(this._getNamespace(), key);
52
+ return items > 0;
53
+ }
54
+ async deleteMany(key) {
55
+ return this.delete(key);
56
+ }
57
+ async clear() {
58
+ const keys = await this.redis.smembers(this._getNamespace());
59
+ await this.redis.del([...keys, this._getNamespace()]);
60
+ }
61
+ async *iterator(namespace) {
62
+ const scan = this.redis.scan.bind(this.redis);
63
+ const get = this.redis.mget.bind(this.redis);
64
+ let cursor = '0';
65
+ do {
66
+ // eslint-disable-next-line no-await-in-loop
67
+ const [curs, keys] = await scan(cursor, 'MATCH', `${namespace}:*`);
68
+ cursor = curs;
69
+ if (keys.length > 0) {
70
+ // eslint-disable-next-line no-await-in-loop
71
+ const values = await get(keys);
72
+ for (const [i] of keys.entries()) {
73
+ const key = keys[i];
74
+ const value = values[i];
75
+ yield [key, value];
76
+ }
77
+ }
78
+ } while (cursor !== '0');
79
+ }
80
+ async has(key) {
81
+ const value = await this.redis.exists(key);
82
+ return value !== 0;
83
+ }
84
+ async disconnect() {
85
+ return this.redis.disconnect();
86
+ }
87
+ }
88
+ module.exports = KeyvRedis;
89
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { StoredData } from 'keyv';
2
+ import { type Cluster } from 'ioredis';
3
+ import type Redis from 'ioredis';
4
+ export type KeyvRedisOptions = {
5
+ [K in keyof Redis]?: Redis[K];
6
+ } & {
7
+ uri?: string;
8
+ dialect?: string;
9
+ };
10
+ export type KeyvUriOptions = string | KeyvRedisOptions | Redis | Cluster;
11
+ export type IteratorOutput = AsyncGenerator<any, void, any>;
12
+ export type GetOutput<Value> = Promise<Value | undefined>;
13
+ export type GetManyOutput<Value> = Promise<Array<StoredData<Value | undefined>>>;
14
+ export type SetOutput = Promise<any>;
15
+ export type DeleteOutput = Promise<boolean>;
16
+ export type DeleteManyOutput = Promise<boolean>;
17
+ export type ClearOutput = Promise<void>;
18
+ export type HasOutput = Promise<boolean>;
19
+ export type DisconnectOutput = Promise<void>;
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "@keyv/redis",
3
- "version": "2.5.8",
3
+ "version": "2.6.0",
4
4
  "description": "Redis storage adapter for Keyv",
5
- "main": "src/index.js",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
6
7
  "scripts": {
7
- "build": "echo 'No build step required.'",
8
+ "build": "tsc --project tsconfig.dist.json",
8
9
  "prepare": "yarn build",
9
10
  "test": "xo && c8 ava --serial",
10
11
  "test:ci": "xo && ava --serial",
@@ -14,6 +15,12 @@
14
15
  "rules": {
15
16
  "unicorn/prefer-module": 0,
16
17
  "unicorn/prefer-node-protocol": 0,
18
+ "unicorn/no-typeof-undefined": 0,
19
+ "import/extensions": 0,
20
+ "@typescript-eslint/no-unsafe-call": 0,
21
+ "@typescript-eslint/no-unsafe-assignment": 0,
22
+ "@typescript-eslint/no-unsafe-return": 0,
23
+ "unicorn/prefer-ternary": 0,
17
24
  "ava/no-ignored-test-files": [
18
25
  "error",
19
26
  {
@@ -61,25 +68,19 @@
61
68
  },
62
69
  "devDependencies": {
63
70
  "@keyv/test-suite": "*",
64
- "ava": "^5.2.0",
65
- "c8": "^7.13.0",
66
- "delay": "^5.0.0",
71
+ "delay": "^6.0.0",
67
72
  "keyv": "*",
68
73
  "requirable": "^1.0.5",
69
74
  "timekeeper": "^2.2.0",
70
- "ts-node": "^10.9.1",
71
- "tsd": "^0.28.1",
72
- "typescript": "^5.0.4",
73
- "xo": "^0.54.2"
75
+ "tsd": "^0.28.1"
74
76
  },
75
77
  "tsd": {
76
78
  "directory": "test"
77
79
  },
78
- "types": "./src/index.d.ts",
79
80
  "engines": {
80
- "node": ">= 12"
81
+ "node": ">= 14"
81
82
  },
82
83
  "files": [
83
- "src"
84
+ "dist"
84
85
  ]
85
86
  }
package/src/index.d.ts DELETED
@@ -1,31 +0,0 @@
1
- /* eslint-disable @typescript-eslint/consistent-type-definitions */
2
- import {EventEmitter} from 'events';
3
- import type{Store, StoredData} from 'keyv';
4
- import type{Redis, Cluster} from 'ioredis';
5
-
6
- declare class KeyvRedis<Value=any> extends EventEmitter implements Store<Value> {
7
- readonly ttlSupport: false;
8
- namespace?: string | undefined;
9
- opts: Record<string, unknown>;
10
- redis: any;
11
- constructor(options?: KeyvRedis.Options | Redis | Cluster);
12
- constructor(uri: string | Redis | Cluster, options?: KeyvRedis.Options);
13
- get(key: string): Promise<Value>;
14
- getMany?(
15
- keys: string[]
16
- ): Array<StoredData<Value>> | Promise<Array<StoredData<Value>>> | undefined;
17
- set(key: string, value: Value, ttl?: number): any;
18
- delete(key: string): boolean | Promise<boolean>;
19
- deleteMany(keys: string[]): boolean;
20
- clear(): void | Promise<void>;
21
- iterator(namespace: string | undefined): AsyncGenerator<any, void, any>;
22
- has?(key: string): boolean | Promise<boolean>;
23
- disconnect(): void;
24
- }
25
- declare namespace KeyvRedis {
26
- interface Options {
27
- uri?: string | undefined;
28
- dialect?: string | undefined;
29
- }
30
- }
31
- export = KeyvRedis;
package/src/index.js DELETED
@@ -1,107 +0,0 @@
1
- const EventEmitter = require('events');
2
- const Redis = require('ioredis');
3
-
4
- class KeyvRedis extends EventEmitter {
5
- constructor(uri, options) {
6
- super();
7
- this.ttlSupport = true;
8
- this.opts = {};
9
- this.opts.dialect = 'redis';
10
-
11
- if ((uri.options && uri.options.family) || (uri.options && uri.isCluster)) {
12
- this.redis = uri;
13
- } else {
14
- options = {...(typeof uri === 'string' ? {uri} : uri), ...options};
15
- this.redis = new Redis(options.uri, options);
16
- }
17
-
18
- this.redis.on('error', error => this.emit('error', error));
19
- }
20
-
21
- _getNamespace() {
22
- return `namespace:${this.namespace}`;
23
- }
24
-
25
- get(key) {
26
- return this.redis.get(key)
27
- .then(value => {
28
- if (value === null) {
29
- return undefined;
30
- }
31
-
32
- return value;
33
- });
34
- }
35
-
36
- getMany(keys) {
37
- return this.redis.mget(keys)
38
- .then(rows => rows);
39
- }
40
-
41
- set(key, value, ttl) {
42
- if (value === undefined) {
43
- return Promise.resolve(undefined);
44
- }
45
-
46
- return Promise.resolve()
47
- .then(() => {
48
- if (typeof ttl === 'number') {
49
- return this.redis.set(key, value, 'PX', ttl);
50
- }
51
-
52
- return this.redis.set(key, value);
53
- })
54
- .then(() => this.redis.sadd(this._getNamespace(), key))
55
- .then(() => undefined);
56
- }
57
-
58
- delete(key) {
59
- return this.redis.del(key)
60
- .then(items => this.redis.srem(this._getNamespace(), key)
61
- .then(() => items > 0));
62
- }
63
-
64
- deleteMany(key) {
65
- return this.delete(key);
66
- }
67
-
68
- clear() {
69
- return this.redis.smembers(this._getNamespace())
70
- .then(keys => this.redis.del([...keys, this._getNamespace()]))
71
- .then(() => undefined);
72
- }
73
-
74
- async * iterator(namespace) {
75
- const scan = this.redis.scan.bind(this.redis);
76
- const get = this.redis.mget.bind(this.redis);
77
- async function * iterate(curs, pattern) {
78
- const [cursor, keys] = await scan(curs, 'MATCH', pattern);
79
-
80
- if (keys.length > 0) {
81
- const values = await get(keys);
82
- for (const [i] of keys.entries()) {
83
- const key = keys[i];
84
- const value = values[i];
85
- yield [key, value];
86
- }
87
- }
88
-
89
- if (cursor !== '0') {
90
- yield * iterate(cursor, pattern);
91
- }
92
- }
93
-
94
- yield * iterate(0, `${namespace}:*`);
95
- }
96
-
97
- has(key) {
98
- return this.redis.exists(key)
99
- .then(value => value !== 0);
100
- }
101
-
102
- disconnect() {
103
- return this.redis.disconnect();
104
- }
105
- }
106
-
107
- module.exports = KeyvRedis;