@eggjs/redis 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/README.md +40 -19
- package/dist/commonjs/config/config.default.d.ts +2 -2
- package/dist/commonjs/lib/redis.js +13 -12
- package/dist/esm/config/config.default.d.ts +2 -2
- package/dist/esm/lib/redis.js +13 -12
- package/dist/package.json +1 -1
- package/package.json +18 -8
- package/src/config/config.default.ts +2 -2
- package/src/lib/redis.ts +62 -29
package/README.md
CHANGED
|
@@ -49,12 +49,12 @@ Configure redis information in `${app_root}/config/config.default.js`:
|
|
|
49
49
|
```javascript
|
|
50
50
|
config.redis = {
|
|
51
51
|
client: {
|
|
52
|
-
port: 6379,
|
|
53
|
-
host: '127.0.0.1',
|
|
52
|
+
port: 6379, // Redis port
|
|
53
|
+
host: '127.0.0.1', // Redis host
|
|
54
54
|
password: 'auth',
|
|
55
55
|
db: 0,
|
|
56
56
|
},
|
|
57
|
-
}
|
|
57
|
+
};
|
|
58
58
|
```
|
|
59
59
|
|
|
60
60
|
**Multi Clients**
|
|
@@ -62,9 +62,10 @@ config.redis = {
|
|
|
62
62
|
```javascript
|
|
63
63
|
config.redis = {
|
|
64
64
|
clients: {
|
|
65
|
-
foo: {
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
foo: {
|
|
66
|
+
// instanceName. See below
|
|
67
|
+
port: 6379, // Redis port
|
|
68
|
+
host: '127.0.0.1', // Redis host
|
|
68
69
|
password: 'auth',
|
|
69
70
|
db: 0,
|
|
70
71
|
},
|
|
@@ -74,8 +75,8 @@ config.redis = {
|
|
|
74
75
|
password: 'auth',
|
|
75
76
|
db: 1,
|
|
76
77
|
},
|
|
77
|
-
}
|
|
78
|
-
}
|
|
78
|
+
},
|
|
79
|
+
};
|
|
79
80
|
```
|
|
80
81
|
|
|
81
82
|
**Sentinel**
|
|
@@ -86,16 +87,16 @@ config.redis = {
|
|
|
86
87
|
// Sentinel instances
|
|
87
88
|
sentinels: [
|
|
88
89
|
{
|
|
89
|
-
port: 26379,
|
|
90
|
-
host: '127.0.0.1',
|
|
90
|
+
port: 26379, // Sentinel port
|
|
91
|
+
host: '127.0.0.1', // Sentinel host
|
|
91
92
|
},
|
|
92
93
|
// other sentinel instance config
|
|
93
94
|
],
|
|
94
|
-
name: 'mymaster',
|
|
95
|
+
name: 'mymaster', // Master name
|
|
95
96
|
password: 'auth',
|
|
96
|
-
db: 0
|
|
97
|
+
db: 0,
|
|
97
98
|
},
|
|
98
|
-
}
|
|
99
|
+
};
|
|
99
100
|
```
|
|
100
101
|
|
|
101
102
|
**No password**
|
|
@@ -127,12 +128,12 @@ you can pass the instance by `config.redis.Redis`:
|
|
|
127
128
|
config.redis = {
|
|
128
129
|
Redis: require('ioredis'), // customize ioredis version, only set when you needed
|
|
129
130
|
client: {
|
|
130
|
-
port: 6379,
|
|
131
|
-
host: '127.0.0.1',
|
|
131
|
+
port: 6379, // Redis port
|
|
132
|
+
host: '127.0.0.1', // Redis host
|
|
132
133
|
password: 'auth',
|
|
133
134
|
db: 0,
|
|
134
135
|
},
|
|
135
|
-
}
|
|
136
|
+
};
|
|
136
137
|
```
|
|
137
138
|
|
|
138
139
|
**weakDependent**
|
|
@@ -140,13 +141,13 @@ config.redis = {
|
|
|
140
141
|
```javascript
|
|
141
142
|
config.redis = {
|
|
142
143
|
client: {
|
|
143
|
-
port: 6379,
|
|
144
|
-
host: '127.0.0.1',
|
|
144
|
+
port: 6379, // Redis port
|
|
145
|
+
host: '127.0.0.1', // Redis host
|
|
145
146
|
password: 'auth',
|
|
146
147
|
db: 0,
|
|
147
148
|
weakDependent: true, // the redis instance won't block app start
|
|
148
149
|
},
|
|
149
|
-
}
|
|
150
|
+
};
|
|
150
151
|
```
|
|
151
152
|
|
|
152
153
|
## Usage
|
|
@@ -233,6 +234,26 @@ module.exports = app => {
|
|
|
233
234
|
};
|
|
234
235
|
```
|
|
235
236
|
|
|
237
|
+
## For the local dev
|
|
238
|
+
|
|
239
|
+
Run docker compose to start test redis service
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
docker compose -f docker-compose.yml up -d
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Run the unit tests
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
npm test
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
Stop test redis service
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
docker compose -f docker-compose.yml down
|
|
255
|
+
```
|
|
256
|
+
|
|
236
257
|
## Questions & Suggestions
|
|
237
258
|
|
|
238
259
|
Please open an issue [here](https://github.com/eggjs/egg/issues).
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { RedisOptions, ClusterOptions } from 'ioredis';
|
|
1
|
+
import type { RedisOptions, ClusterOptions, Redis } from 'ioredis';
|
|
2
2
|
export interface RedisClientOptions extends RedisOptions {
|
|
3
3
|
/**
|
|
4
4
|
* Whether to enable weakDependent mode, the redis client start will not block the application start
|
|
@@ -51,7 +51,7 @@ export interface RedisConfig {
|
|
|
51
51
|
*
|
|
52
52
|
* Default to `undefined`, which means using the built-in ioredis
|
|
53
53
|
*/
|
|
54
|
-
Redis?:
|
|
54
|
+
Redis?: typeof Redis;
|
|
55
55
|
}
|
|
56
56
|
declare const _default: {
|
|
57
57
|
redis: RedisConfig;
|
|
@@ -30,19 +30,19 @@ function createClient(options, app) {
|
|
|
30
30
|
let client;
|
|
31
31
|
if ('cluster' in options && options.cluster === true) {
|
|
32
32
|
const config = options;
|
|
33
|
-
(0, node_assert_1.default)(config.nodes && config.nodes.length
|
|
34
|
-
config.nodes
|
|
33
|
+
(0, node_assert_1.default)(config.nodes && config.nodes.length > 0, '[@eggjs/redis] cluster nodes configuration is required when use cluster redis');
|
|
34
|
+
for (const client of config.nodes) {
|
|
35
35
|
(0, node_assert_1.default)(client.host && client.port, `[@eggjs/redis] 'host: ${client.host}', 'port: ${client.port}' are required on config`);
|
|
36
|
-
}
|
|
36
|
+
}
|
|
37
37
|
app.coreLogger.info('[@eggjs/redis] cluster connecting');
|
|
38
38
|
client = new RedisClass.Cluster(config.nodes, config);
|
|
39
39
|
}
|
|
40
40
|
else if ('sentinels' in options && options.sentinels) {
|
|
41
41
|
const config = options;
|
|
42
|
-
(0, node_assert_1.default)(config.sentinels && config.sentinels.length
|
|
43
|
-
config.sentinels
|
|
42
|
+
(0, node_assert_1.default)(config.sentinels && config.sentinels.length > 0, '[@eggjs/redis] sentinels configuration is required when use redis sentinel');
|
|
43
|
+
for (const sentinel of config.sentinels) {
|
|
44
44
|
(0, node_assert_1.default)(sentinel.host && sentinel.port, `[@eggjs/redis] 'host: ${sentinel.host}', 'port: ${sentinel.port}' are required on config`);
|
|
45
|
-
}
|
|
45
|
+
}
|
|
46
46
|
const mask = config.password ? '***' : config.password;
|
|
47
47
|
(0, node_assert_1.default)(config.name && config.password !== undefined && config.db !== undefined, `[@eggjs/redis] 'name of master: ${config.name}', 'password: ${mask}', 'db: ${config.db}' are required on config`);
|
|
48
48
|
app.coreLogger.info('[@eggjs/redis] sentinel connecting start');
|
|
@@ -51,7 +51,11 @@ function createClient(options, app) {
|
|
|
51
51
|
else {
|
|
52
52
|
const config = options;
|
|
53
53
|
const mask = config.password ? '***' : config.password;
|
|
54
|
-
(0, node_assert_1.default)((config.host &&
|
|
54
|
+
(0, node_assert_1.default)((config.host &&
|
|
55
|
+
config.port &&
|
|
56
|
+
config.password !== undefined &&
|
|
57
|
+
config.db !== undefined) ||
|
|
58
|
+
config.path, `[@eggjs/redis] 'host: ${config.host}', 'port: ${config.port}', 'password: ${mask}', 'db: ${config.db}' or 'path:${config.path}' are required on config`);
|
|
55
59
|
if (config.host) {
|
|
56
60
|
app.coreLogger.info('[@eggjs/redis] server connecting redis://:***@%s:%s/%s', config.host, config.port, config.db);
|
|
57
61
|
}
|
|
@@ -76,12 +80,9 @@ function createClient(options, app) {
|
|
|
76
80
|
});
|
|
77
81
|
return;
|
|
78
82
|
}
|
|
79
|
-
await Promise.race([
|
|
80
|
-
(0, node_events_1.once)(client, 'ready'),
|
|
81
|
-
(0, node_events_1.once)(client, 'error'),
|
|
82
|
-
]);
|
|
83
|
+
await Promise.race([(0, node_events_1.once)(client, 'ready'), (0, node_events_1.once)(client, 'error')]);
|
|
83
84
|
app.coreLogger.info(`[@eggjs/redis] instance[${index}] status OK, client ready`);
|
|
84
85
|
}, `[@eggjs/redis] instance[${index}] start check`);
|
|
85
86
|
return client;
|
|
86
87
|
}
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
88
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlZGlzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDhEQUFpQztBQUNqQyw2Q0FBbUM7QUFFbkMscUNBQWdDO0FBT2hDLE1BQWEsU0FBUztJQUNTO0lBQTdCLFlBQTZCLEdBQVk7UUFBWixRQUFHLEdBQUgsR0FBRyxDQUFTO1FBQ3ZDLFFBQVE7SUFDVixDQUFDO0lBQ0QsS0FBSyxDQUFDLE9BQU87UUFDWCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3JCLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxhQUFhLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdkQsR0FBRyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDMUMsQ0FBQzthQUFNLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUQsR0FBRyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDMUMsQ0FBQztJQUNILENBQUM7Q0FDRjtBQVpELDhCQVlDO0FBRUQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsU0FBUyxZQUFZLENBQ25CLE9BQWlELEVBQ2pELEdBQVk7SUFFWixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksZUFBSyxDQUFDO0lBQ25ELElBQUksTUFBTSxDQUFDO0lBRVgsSUFBSSxTQUFTLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDckQsTUFBTSxNQUFNLEdBQUcsT0FBOEIsQ0FBQztRQUM5QyxJQUFBLHFCQUFNLEVBQ0osTUFB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
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { RedisOptions, ClusterOptions } from 'ioredis';
|
|
1
|
+
import type { RedisOptions, ClusterOptions, Redis } from 'ioredis';
|
|
2
2
|
export interface RedisClientOptions extends RedisOptions {
|
|
3
3
|
/**
|
|
4
4
|
* Whether to enable weakDependent mode, the redis client start will not block the application start
|
|
@@ -51,7 +51,7 @@ export interface RedisConfig {
|
|
|
51
51
|
*
|
|
52
52
|
* Default to `undefined`, which means using the built-in ioredis
|
|
53
53
|
*/
|
|
54
|
-
Redis?:
|
|
54
|
+
Redis?: typeof Redis;
|
|
55
55
|
}
|
|
56
56
|
declare const _default: {
|
|
57
57
|
redis: RedisConfig;
|
package/dist/esm/lib/redis.js
CHANGED
|
@@ -23,19 +23,19 @@ function createClient(options, app) {
|
|
|
23
23
|
let client;
|
|
24
24
|
if ('cluster' in options && options.cluster === true) {
|
|
25
25
|
const config = options;
|
|
26
|
-
assert(config.nodes && config.nodes.length
|
|
27
|
-
config.nodes
|
|
26
|
+
assert(config.nodes && config.nodes.length > 0, '[@eggjs/redis] cluster nodes configuration is required when use cluster redis');
|
|
27
|
+
for (const client of config.nodes) {
|
|
28
28
|
assert(client.host && client.port, `[@eggjs/redis] 'host: ${client.host}', 'port: ${client.port}' are required on config`);
|
|
29
|
-
}
|
|
29
|
+
}
|
|
30
30
|
app.coreLogger.info('[@eggjs/redis] cluster connecting');
|
|
31
31
|
client = new RedisClass.Cluster(config.nodes, config);
|
|
32
32
|
}
|
|
33
33
|
else if ('sentinels' in options && options.sentinels) {
|
|
34
34
|
const config = options;
|
|
35
|
-
assert(config.sentinels && config.sentinels.length
|
|
36
|
-
config.sentinels
|
|
35
|
+
assert(config.sentinels && config.sentinels.length > 0, '[@eggjs/redis] sentinels configuration is required when use redis sentinel');
|
|
36
|
+
for (const sentinel of config.sentinels) {
|
|
37
37
|
assert(sentinel.host && sentinel.port, `[@eggjs/redis] 'host: ${sentinel.host}', 'port: ${sentinel.port}' are required on config`);
|
|
38
|
-
}
|
|
38
|
+
}
|
|
39
39
|
const mask = config.password ? '***' : config.password;
|
|
40
40
|
assert(config.name && config.password !== undefined && config.db !== undefined, `[@eggjs/redis] 'name of master: ${config.name}', 'password: ${mask}', 'db: ${config.db}' are required on config`);
|
|
41
41
|
app.coreLogger.info('[@eggjs/redis] sentinel connecting start');
|
|
@@ -44,7 +44,11 @@ function createClient(options, app) {
|
|
|
44
44
|
else {
|
|
45
45
|
const config = options;
|
|
46
46
|
const mask = config.password ? '***' : config.password;
|
|
47
|
-
assert((config.host &&
|
|
47
|
+
assert((config.host &&
|
|
48
|
+
config.port &&
|
|
49
|
+
config.password !== undefined &&
|
|
50
|
+
config.db !== undefined) ||
|
|
51
|
+
config.path, `[@eggjs/redis] 'host: ${config.host}', 'port: ${config.port}', 'password: ${mask}', 'db: ${config.db}' or 'path:${config.path}' are required on config`);
|
|
48
52
|
if (config.host) {
|
|
49
53
|
app.coreLogger.info('[@eggjs/redis] server connecting redis://:***@%s:%s/%s', config.host, config.port, config.db);
|
|
50
54
|
}
|
|
@@ -69,12 +73,9 @@ function createClient(options, app) {
|
|
|
69
73
|
});
|
|
70
74
|
return;
|
|
71
75
|
}
|
|
72
|
-
await Promise.race([
|
|
73
|
-
once(client, 'ready'),
|
|
74
|
-
once(client, 'error'),
|
|
75
|
-
]);
|
|
76
|
+
await Promise.race([once(client, 'ready'), once(client, 'error')]);
|
|
76
77
|
app.coreLogger.info(`[@eggjs/redis] instance[${index}] status OK, client ready`);
|
|
77
78
|
}, `[@eggjs/redis] instance[${index}] start check`);
|
|
78
79
|
return client;
|
|
79
80
|
}
|
|
80
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlZGlzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRW5DLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFPaEMsTUFBTSxPQUFPLFNBQVM7SUFDUztJQUE3QixZQUE2QixHQUFZO1FBQVosUUFBRyxHQUFILEdBQUcsQ0FBUztRQUN2QyxRQUFRO0lBQ1YsQ0FBQztJQUNELEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNyQixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssYUFBYSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3ZELEdBQUcsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzFDLENBQUM7YUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzFELEdBQUcsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFFRCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDZCxTQUFTLFlBQVksQ0FDbkIsT0FBaUQsRUFDakQsR0FBWTtJQUVaLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUM7SUFDbkQsSUFBSSxNQUFNLENBQUM7SUFFWCxJQUFJLFNBQVMsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxJQUFJLEVBQUUs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
|
package/dist/package.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eggjs/redis",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -35,19 +35,21 @@
|
|
|
35
35
|
"node": ">= 18.19.0"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@eggjs/core": "^6.
|
|
38
|
+
"@eggjs/core": "^6.4.1",
|
|
39
39
|
"ioredis": "^5.4.2"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
|
-
"@arethetypeswrong/cli": "^0.17.
|
|
42
|
+
"@arethetypeswrong/cli": "^0.17.4",
|
|
43
43
|
"@eggjs/bin": "7",
|
|
44
44
|
"@eggjs/mock": "^6.0.5",
|
|
45
45
|
"@eggjs/tsconfig": "1",
|
|
46
46
|
"@types/mocha": "10",
|
|
47
47
|
"@types/node": "22",
|
|
48
|
-
"egg": "
|
|
49
|
-
"
|
|
50
|
-
"
|
|
48
|
+
"egg": "4",
|
|
49
|
+
"husky": "^9.1.7",
|
|
50
|
+
"lint-staged": "^15.5.0",
|
|
51
|
+
"oxlint": "^0.16.2",
|
|
52
|
+
"prettier": "^3.5.3",
|
|
51
53
|
"rimraf": "6",
|
|
52
54
|
"snap-shot-it": "^7.9.10",
|
|
53
55
|
"tshy": "3",
|
|
@@ -55,14 +57,22 @@
|
|
|
55
57
|
"typescript": "5"
|
|
56
58
|
},
|
|
57
59
|
"scripts": {
|
|
58
|
-
"lint": "
|
|
60
|
+
"lint": "oxlint",
|
|
59
61
|
"pretest": "npm run clean && npm run lint -- --fix",
|
|
60
62
|
"test": "egg-bin test",
|
|
61
63
|
"preci": "npm run clean && npm run lint",
|
|
62
64
|
"ci": "egg-bin cov",
|
|
63
65
|
"postci": "npm run prepublishOnly && npm run clean",
|
|
64
66
|
"clean": "rimraf dist",
|
|
65
|
-
"prepublishOnly": "tshy && tshy-after && attw --pack"
|
|
67
|
+
"prepublishOnly": "tshy && tshy-after && attw --pack",
|
|
68
|
+
"prepare": "husky"
|
|
69
|
+
},
|
|
70
|
+
"lint-staged": {
|
|
71
|
+
"*": "prettier --write --ignore-unknown --cache",
|
|
72
|
+
"*.{ts,js,json,md,yml}": [
|
|
73
|
+
"prettier --ignore-unknown --write",
|
|
74
|
+
"oxlint --fix"
|
|
75
|
+
]
|
|
66
76
|
},
|
|
67
77
|
"type": "module",
|
|
68
78
|
"tshy": {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { RedisOptions, ClusterOptions } from 'ioredis';
|
|
1
|
+
import type { RedisOptions, ClusterOptions, Redis } from 'ioredis';
|
|
2
2
|
|
|
3
3
|
export interface RedisClientOptions extends RedisOptions {
|
|
4
4
|
/**
|
|
@@ -54,7 +54,7 @@ export interface RedisConfig {
|
|
|
54
54
|
*
|
|
55
55
|
* Default to `undefined`, which means using the built-in ioredis
|
|
56
56
|
*/
|
|
57
|
-
Redis?:
|
|
57
|
+
Redis?: typeof Redis;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
export default {
|
package/src/lib/redis.ts
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import assert from 'node:assert';
|
|
2
2
|
import { once } from 'node:events';
|
|
3
|
+
|
|
3
4
|
import { Redis } from 'ioredis';
|
|
4
5
|
import type { ILifecycleBoot, EggCore } from '@eggjs/core';
|
|
5
|
-
import type {
|
|
6
|
+
import type {
|
|
7
|
+
RedisClusterOptions,
|
|
8
|
+
RedisClientOptions,
|
|
9
|
+
} from '../config/config.default.js';
|
|
6
10
|
|
|
7
11
|
export class RedisBoot implements ILifecycleBoot {
|
|
8
12
|
constructor(private readonly app: EggCore) {
|
|
@@ -19,48 +23,76 @@ export class RedisBoot implements ILifecycleBoot {
|
|
|
19
23
|
}
|
|
20
24
|
|
|
21
25
|
let count = 0;
|
|
22
|
-
function createClient(
|
|
23
|
-
|
|
26
|
+
function createClient(
|
|
27
|
+
options: RedisClusterOptions | RedisClientOptions,
|
|
28
|
+
app: EggCore
|
|
29
|
+
) {
|
|
30
|
+
const RedisClass = app.config.redis.Redis ?? Redis;
|
|
24
31
|
let client;
|
|
25
32
|
|
|
26
33
|
if ('cluster' in options && options.cluster === true) {
|
|
27
34
|
const config = options as RedisClusterOptions;
|
|
28
|
-
assert(
|
|
35
|
+
assert(
|
|
36
|
+
config.nodes && config.nodes.length > 0,
|
|
37
|
+
'[@eggjs/redis] cluster nodes configuration is required when use cluster redis'
|
|
38
|
+
);
|
|
29
39
|
|
|
30
|
-
config.nodes
|
|
31
|
-
assert(
|
|
32
|
-
|
|
40
|
+
for (const client of config.nodes) {
|
|
41
|
+
assert(
|
|
42
|
+
client.host && client.port,
|
|
43
|
+
`[@eggjs/redis] 'host: ${client.host}', 'port: ${client.port}' are required on config`
|
|
44
|
+
);
|
|
45
|
+
}
|
|
33
46
|
app.coreLogger.info('[@eggjs/redis] cluster connecting');
|
|
34
|
-
client = new RedisClass.Cluster(config.nodes, config
|
|
47
|
+
client = new RedisClass.Cluster(config.nodes, config);
|
|
35
48
|
} else if ('sentinels' in options && options.sentinels) {
|
|
36
49
|
const config = options as RedisClientOptions;
|
|
37
|
-
assert(
|
|
50
|
+
assert(
|
|
51
|
+
config.sentinels && config.sentinels.length > 0,
|
|
52
|
+
'[@eggjs/redis] sentinels configuration is required when use redis sentinel'
|
|
53
|
+
);
|
|
38
54
|
|
|
39
|
-
config.sentinels
|
|
40
|
-
assert(
|
|
41
|
-
|
|
42
|
-
|
|
55
|
+
for (const sentinel of config.sentinels) {
|
|
56
|
+
assert(
|
|
57
|
+
sentinel.host && sentinel.port,
|
|
58
|
+
`[@eggjs/redis] 'host: ${sentinel.host}', 'port: ${sentinel.port}' are required on config`
|
|
59
|
+
);
|
|
60
|
+
}
|
|
43
61
|
|
|
44
62
|
const mask = config.password ? '***' : config.password;
|
|
45
|
-
assert(
|
|
46
|
-
|
|
63
|
+
assert(
|
|
64
|
+
config.name && config.password !== undefined && config.db !== undefined,
|
|
65
|
+
`[@eggjs/redis] 'name of master: ${config.name}', 'password: ${mask}', 'db: ${config.db}' are required on config`
|
|
66
|
+
);
|
|
47
67
|
|
|
48
68
|
app.coreLogger.info('[@eggjs/redis] sentinel connecting start');
|
|
49
|
-
client = new RedisClass(config
|
|
69
|
+
client = new RedisClass(config);
|
|
50
70
|
} else {
|
|
51
71
|
const config = options as RedisClientOptions;
|
|
52
72
|
const mask = config.password ? '***' : config.password;
|
|
53
|
-
assert(
|
|
54
|
-
|
|
73
|
+
assert(
|
|
74
|
+
(config.host &&
|
|
75
|
+
config.port &&
|
|
76
|
+
config.password !== undefined &&
|
|
77
|
+
config.db !== undefined) ||
|
|
78
|
+
config.path,
|
|
79
|
+
`[@eggjs/redis] 'host: ${config.host}', 'port: ${config.port}', 'password: ${mask}', 'db: ${config.db}' or 'path:${config.path}' are required on config`
|
|
80
|
+
);
|
|
55
81
|
if (config.host) {
|
|
56
|
-
app.coreLogger.info(
|
|
57
|
-
|
|
82
|
+
app.coreLogger.info(
|
|
83
|
+
'[@eggjs/redis] server connecting redis://:***@%s:%s/%s',
|
|
84
|
+
config.host,
|
|
85
|
+
config.port,
|
|
86
|
+
config.db
|
|
87
|
+
);
|
|
58
88
|
} else {
|
|
59
|
-
app.coreLogger.info(
|
|
60
|
-
|
|
89
|
+
app.coreLogger.info(
|
|
90
|
+
'[@eggjs/redis] server connecting %s',
|
|
91
|
+
config.path || config
|
|
92
|
+
);
|
|
61
93
|
}
|
|
62
94
|
|
|
63
|
-
client = new RedisClass(config
|
|
95
|
+
client = new RedisClass(config);
|
|
64
96
|
}
|
|
65
97
|
|
|
66
98
|
client.on('connect', () => {
|
|
@@ -74,18 +106,19 @@ function createClient(options: RedisClusterOptions | RedisClientOptions, app: Eg
|
|
|
74
106
|
const index = count++;
|
|
75
107
|
app.lifecycle.registerBeforeStart(async () => {
|
|
76
108
|
if ('weakDependent' in options && options.weakDependent) {
|
|
77
|
-
app.coreLogger.info(
|
|
109
|
+
app.coreLogger.info(
|
|
110
|
+
`[@eggjs/redis] instance[${index}] is weak dependent and won't block app start`
|
|
111
|
+
);
|
|
78
112
|
client.once('ready', () => {
|
|
79
113
|
app.coreLogger.info(`[@eggjs/redis] instance[${index}] status OK`);
|
|
80
114
|
});
|
|
81
115
|
return;
|
|
82
116
|
}
|
|
83
117
|
|
|
84
|
-
await Promise.race([
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
app.coreLogger.info(`[@eggjs/redis] instance[${index}] status OK, client ready`);
|
|
118
|
+
await Promise.race([once(client, 'ready'), once(client, 'error')]);
|
|
119
|
+
app.coreLogger.info(
|
|
120
|
+
`[@eggjs/redis] instance[${index}] status OK, client ready`
|
|
121
|
+
);
|
|
89
122
|
}, `[@eggjs/redis] instance[${index}] start check`);
|
|
90
123
|
|
|
91
124
|
return client;
|