@eggjs/redis 3.1.0 → 4.0.0-beta.27
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 +144 -120
- package/dist/agent.d.ts +2 -0
- package/dist/agent.js +3 -0
- package/dist/app.d.ts +2 -0
- package/dist/app.js +3 -0
- package/dist/{esm/config → config}/config.default.js +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/{esm/index.js → index.js} +2 -2
- package/dist/{commonjs/lib → lib}/redis.d.ts +2 -2
- package/dist/lib/redis.js +76 -0
- package/dist/types.d.ts +14 -0
- package/dist/{esm/types.js → types.js} +1 -1
- package/package.json +48 -79
- package/dist/commonjs/agent.d.ts +0 -2
- package/dist/commonjs/agent.js +0 -5
- package/dist/commonjs/app.d.ts +0 -2
- package/dist/commonjs/app.js +0 -5
- package/dist/commonjs/config/config.default.js +0 -55
- package/dist/commonjs/index.d.ts +0 -1
- package/dist/commonjs/index.js +0 -4
- package/dist/commonjs/lib/redis.js +0 -88
- package/dist/commonjs/package.json +0 -3
- package/dist/commonjs/types.d.ts +0 -11
- package/dist/commonjs/types.js +0 -3
- package/dist/esm/agent.d.ts +0 -2
- package/dist/esm/agent.js +0 -3
- package/dist/esm/app.d.ts +0 -2
- package/dist/esm/app.js +0 -3
- package/dist/esm/config/config.default.d.ts +0 -59
- package/dist/esm/index.d.ts +0 -1
- package/dist/esm/lib/redis.d.ts +0 -6
- package/dist/esm/lib/redis.js +0 -81
- package/dist/esm/package.json +0 -3
- package/dist/esm/types.d.ts +0 -11
- package/dist/package.json +0 -4
- package/src/agent.ts +0 -3
- package/src/app.ts +0 -3
- package/src/config/config.default.ts +0 -111
- package/src/index.ts +0 -1
- package/src/lib/redis.ts +0 -125
- package/src/types.ts +0 -14
- package/src/typings/index.d.ts +0 -4
- /package/dist/{commonjs/config → config}/config.default.d.ts +0 -0
package/dist/commonjs/agent.d.ts
DELETED
package/dist/commonjs/agent.js
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const redis_js_1 = require("./lib/redis.js");
|
|
4
|
-
exports.default = redis_js_1.RedisBoot;
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWdlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2Q0FBMkM7QUFFM0Msa0JBQWUsb0JBQVMsQ0FBQyJ9
|
package/dist/commonjs/app.d.ts
DELETED
package/dist/commonjs/app.js
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const redis_js_1 = require("./lib/redis.js");
|
|
4
|
-
exports.default = redis_js_1.RedisBoot;
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUEyQztBQUUzQyxrQkFBZSxvQkFBUyxDQUFDIn0=
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.default = {
|
|
4
|
-
redis: {
|
|
5
|
-
default: {},
|
|
6
|
-
app: true,
|
|
7
|
-
agent: false,
|
|
8
|
-
supportTimeCommand: true,
|
|
9
|
-
// Single Redis
|
|
10
|
-
// client: {
|
|
11
|
-
// host: 'host',
|
|
12
|
-
// port: 'port',
|
|
13
|
-
// family: 'user',
|
|
14
|
-
// password: 'password',
|
|
15
|
-
// db: 'db',
|
|
16
|
-
// },
|
|
17
|
-
//
|
|
18
|
-
// Cluster Redis
|
|
19
|
-
// client: {
|
|
20
|
-
// cluster: true,
|
|
21
|
-
// nodes: [{
|
|
22
|
-
// host: 'host',
|
|
23
|
-
// port: 'port',
|
|
24
|
-
// family: 'user',
|
|
25
|
-
// password: 'password',
|
|
26
|
-
// db: 'db',
|
|
27
|
-
// }, {
|
|
28
|
-
// host: 'host',
|
|
29
|
-
// port: 'port',
|
|
30
|
-
// family: 'user',
|
|
31
|
-
// password: 'password',
|
|
32
|
-
// db: 'db',
|
|
33
|
-
// },
|
|
34
|
-
// ]},
|
|
35
|
-
//
|
|
36
|
-
// Multi Redis
|
|
37
|
-
// clients: {
|
|
38
|
-
// instance1: {
|
|
39
|
-
// host: 'host',
|
|
40
|
-
// port: 'port',
|
|
41
|
-
// family: 'user',
|
|
42
|
-
// password: 'password',
|
|
43
|
-
// db: 'db',
|
|
44
|
-
// },
|
|
45
|
-
// instance2: {
|
|
46
|
-
// host: 'host',
|
|
47
|
-
// port: 'port',
|
|
48
|
-
// family: 'user',
|
|
49
|
-
// password: 'password',
|
|
50
|
-
// db: 'db',
|
|
51
|
-
// },
|
|
52
|
-
// },
|
|
53
|
-
},
|
|
54
|
-
};
|
|
55
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmRlZmF1bHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29uZmlnL2NvbmZpZy5kZWZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMkRBLGtCQUFlO0lBQ2IsS0FBSyxFQUFFO1FBQ0wsT0FBTyxFQUFFLEVBQUU7UUFDWCxHQUFHLEVBQUUsSUFBSTtRQUNULEtBQUssRUFBRSxLQUFLO1FBQ1osa0JBQWtCLEVBQUUsSUFBSTtRQUN4QixlQUFlO1FBQ2YsWUFBWTtRQUNaLGtCQUFrQjtRQUNsQixrQkFBa0I7UUFDbEIsb0JBQW9CO1FBQ3BCLDBCQUEwQjtRQUMxQixjQUFjO1FBQ2QsS0FBSztRQUNMLEVBQUU7UUFDRixnQkFBZ0I7UUFDaEIsWUFBWTtRQUNaLG1CQUFtQjtRQUNuQixjQUFjO1FBQ2Qsb0JBQW9CO1FBQ3BCLG9CQUFvQjtRQUNwQixzQkFBc0I7UUFDdEIsNEJBQTRCO1FBQzVCLGdCQUFnQjtRQUNoQixTQUFTO1FBQ1Qsb0JBQW9CO1FBQ3BCLG9CQUFvQjtRQUNwQixzQkFBc0I7UUFDdEIsNEJBQTRCO1FBQzVCLGdCQUFnQjtRQUNoQixPQUFPO1FBQ1AsTUFBTTtRQUNOLEVBQUU7UUFDRixjQUFjO1FBQ2QsYUFBYTtRQUNiLGlCQUFpQjtRQUNqQixvQkFBb0I7UUFDcEIsb0JBQW9CO1FBQ3BCLHNCQUFzQjtRQUN0Qiw0QkFBNEI7UUFDNUIsZ0JBQWdCO1FBQ2hCLE9BQU87UUFDUCxpQkFBaUI7UUFDakIsb0JBQW9CO1FBQ3BCLG9CQUFvQjtRQUNwQixzQkFBc0I7UUFDdEIsNEJBQTRCO1FBQzVCLGdCQUFnQjtRQUNoQixPQUFPO1FBQ1AsS0FBSztLQUNTO0NBQ2pCLENBQUMifQ==
|
package/dist/commonjs/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import './types.js';
|
package/dist/commonjs/index.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
require("./types.js");
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzQkFBb0IifQ==
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.RedisBoot = void 0;
|
|
7
|
-
const node_assert_1 = __importDefault(require("node:assert"));
|
|
8
|
-
const node_events_1 = require("node:events");
|
|
9
|
-
const ioredis_1 = require("ioredis");
|
|
10
|
-
class RedisBoot {
|
|
11
|
-
app;
|
|
12
|
-
constructor(app) {
|
|
13
|
-
this.app = app;
|
|
14
|
-
// empty
|
|
15
|
-
}
|
|
16
|
-
async didLoad() {
|
|
17
|
-
const app = this.app;
|
|
18
|
-
if (app.type === 'application' && app.config.redis.app) {
|
|
19
|
-
app.addSingleton('redis', createClient);
|
|
20
|
-
}
|
|
21
|
-
else if (app.type === 'agent' && app.config.redis.agent) {
|
|
22
|
-
app.addSingleton('redis', createClient);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
exports.RedisBoot = RedisBoot;
|
|
27
|
-
let count = 0;
|
|
28
|
-
function createClient(options, app) {
|
|
29
|
-
const RedisClass = app.config.redis.Redis ?? ioredis_1.Redis;
|
|
30
|
-
let client;
|
|
31
|
-
if ('cluster' in options && options.cluster === true) {
|
|
32
|
-
const config = options;
|
|
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
|
-
(0, node_assert_1.default)(client.host && client.port, `[@eggjs/redis] 'host: ${client.host}', 'port: ${client.port}' are required on config`);
|
|
36
|
-
}
|
|
37
|
-
app.coreLogger.info('[@eggjs/redis] cluster connecting');
|
|
38
|
-
client = new RedisClass.Cluster(config.nodes, config);
|
|
39
|
-
}
|
|
40
|
-
else if ('sentinels' in options && options.sentinels) {
|
|
41
|
-
const config = options;
|
|
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
|
-
(0, node_assert_1.default)(sentinel.host && sentinel.port, `[@eggjs/redis] 'host: ${sentinel.host}', 'port: ${sentinel.port}' are required on config`);
|
|
45
|
-
}
|
|
46
|
-
const mask = config.password ? '***' : config.password;
|
|
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
|
-
app.coreLogger.info('[@eggjs/redis] sentinel connecting start');
|
|
49
|
-
client = new RedisClass(config);
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
const config = options;
|
|
53
|
-
const mask = config.password ? '***' : config.password;
|
|
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`);
|
|
59
|
-
if (config.host) {
|
|
60
|
-
app.coreLogger.info('[@eggjs/redis] server connecting redis://:***@%s:%s/%s', config.host, config.port, config.db);
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
app.coreLogger.info('[@eggjs/redis] server connecting %s', config.path || config);
|
|
64
|
-
}
|
|
65
|
-
client = new RedisClass(config);
|
|
66
|
-
}
|
|
67
|
-
client.on('connect', () => {
|
|
68
|
-
app.coreLogger.info('[@eggjs/redis] client connect success');
|
|
69
|
-
});
|
|
70
|
-
client.on('error', err => {
|
|
71
|
-
app.coreLogger.error('[@eggjs/redis] client error: %s', err);
|
|
72
|
-
app.coreLogger.error(err);
|
|
73
|
-
});
|
|
74
|
-
const index = count++;
|
|
75
|
-
app.lifecycle.registerBeforeStart(async () => {
|
|
76
|
-
if ('weakDependent' in options && options.weakDependent) {
|
|
77
|
-
app.coreLogger.info(`[@eggjs/redis] instance[${index}] is weak dependent and won't block app start`);
|
|
78
|
-
client.once('ready', () => {
|
|
79
|
-
app.coreLogger.info(`[@eggjs/redis] instance[${index}] status OK`);
|
|
80
|
-
});
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
await Promise.race([(0, node_events_1.once)(client, 'ready'), (0, node_events_1.once)(client, 'error')]);
|
|
84
|
-
app.coreLogger.info(`[@eggjs/redis] instance[${index}] status OK, client ready`);
|
|
85
|
-
}, `[@eggjs/redis] instance[${index}] start check`);
|
|
86
|
-
return client;
|
|
87
|
-
}
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlZGlzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDhEQUFpQztBQUNqQyw2Q0FBbUM7QUFFbkMscUNBQWdDO0FBT2hDLE1BQWEsU0FBUztJQUNTO0lBQTdCLFlBQTZCLEdBQVk7UUFBWixRQUFHLEdBQUgsR0FBRyxDQUFTO1FBQ3ZDLFFBQVE7SUFDVixDQUFDO0lBQ0QsS0FBSyxDQUFDLE9BQU87UUFDWCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3JCLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxhQUFhLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdkQsR0FBRyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDMUMsQ0FBQzthQUFNLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUQsR0FBRyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDMUMsQ0FBQztJQUNILENBQUM7Q0FDRjtBQVpELDhCQVlDO0FBRUQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsU0FBUyxZQUFZLENBQ25CLE9BQWlELEVBQ2pELEdBQVk7SUFFWixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksZUFBSyxDQUFDO0lBQ25ELElBQUksTUFBTSxDQUFDO0lBRVgsSUFBSSxTQUFTLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDckQsTUFBTSxNQUFNLEdBQUcsT0FBOEIsQ0FBQztRQUM5QyxJQUFBLHFCQUFNLEVBQ0osTUFB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
|
package/dist/commonjs/types.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { Singleton } from '@eggjs/core';
|
|
2
|
-
import type { Redis } from 'ioredis';
|
|
3
|
-
import type { RedisConfig } from './config/config.default.js';
|
|
4
|
-
declare module '@eggjs/core' {
|
|
5
|
-
interface EggAppConfig {
|
|
6
|
-
redis: RedisConfig;
|
|
7
|
-
}
|
|
8
|
-
interface EggCore {
|
|
9
|
-
redis: Redis & Singleton<Redis>;
|
|
10
|
-
}
|
|
11
|
-
}
|
package/dist/commonjs/types.js
DELETED
package/dist/esm/agent.d.ts
DELETED
package/dist/esm/agent.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { RedisBoot } from './lib/redis.js';
|
|
2
|
-
export default RedisBoot;
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWdlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLGVBQWUsU0FBUyxDQUFDIn0=
|
package/dist/esm/app.d.ts
DELETED
package/dist/esm/app.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { RedisBoot } from './lib/redis.js';
|
|
2
|
-
export default RedisBoot;
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsZUFBZSxTQUFTLENBQUMifQ==
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import type { RedisOptions, ClusterOptions, Redis } from 'ioredis';
|
|
2
|
-
export interface RedisClientOptions extends RedisOptions {
|
|
3
|
-
/**
|
|
4
|
-
* Whether to enable weakDependent mode, the redis client start will not block the application start
|
|
5
|
-
*
|
|
6
|
-
* Default to `undefined`
|
|
7
|
-
*/
|
|
8
|
-
weakDependent?: boolean;
|
|
9
|
-
}
|
|
10
|
-
export interface RedisClusterOptions extends ClusterOptions {
|
|
11
|
-
cluster: true;
|
|
12
|
-
nodes: RedisClientOptions[];
|
|
13
|
-
}
|
|
14
|
-
export interface RedisConfig {
|
|
15
|
-
/**
|
|
16
|
-
* Default redis client config
|
|
17
|
-
*
|
|
18
|
-
* Default to `{}`
|
|
19
|
-
*/
|
|
20
|
-
default: RedisClientOptions;
|
|
21
|
-
/**
|
|
22
|
-
* Single Redis or Cluster Redis config
|
|
23
|
-
*/
|
|
24
|
-
client?: RedisClientOptions | RedisClusterOptions;
|
|
25
|
-
/**
|
|
26
|
-
* Multi Redis config
|
|
27
|
-
*/
|
|
28
|
-
clients?: Record<string, RedisClientOptions>;
|
|
29
|
-
/**
|
|
30
|
-
* redis client will try to use TIME command to detect client is ready or not
|
|
31
|
-
* if your redis server not support TIME command, please set this config to false
|
|
32
|
-
* see https://redis.io/commands/time
|
|
33
|
-
*
|
|
34
|
-
* Default to `true`
|
|
35
|
-
*/
|
|
36
|
-
supportTimeCommand: boolean;
|
|
37
|
-
/**
|
|
38
|
-
* Whether to enable redis for `app`
|
|
39
|
-
*
|
|
40
|
-
* Default to `true`
|
|
41
|
-
*/
|
|
42
|
-
app: boolean;
|
|
43
|
-
/**
|
|
44
|
-
* Whether to enable redis for `agent`
|
|
45
|
-
*
|
|
46
|
-
* Default to `false`
|
|
47
|
-
*/
|
|
48
|
-
agent: boolean;
|
|
49
|
-
/**
|
|
50
|
-
* Customize iovalkey version, only set when you needed
|
|
51
|
-
*
|
|
52
|
-
* Default to `undefined`, which means using the built-in ioredis
|
|
53
|
-
*/
|
|
54
|
-
Redis?: typeof Redis;
|
|
55
|
-
}
|
|
56
|
-
declare const _default: {
|
|
57
|
-
redis: RedisConfig;
|
|
58
|
-
};
|
|
59
|
-
export default _default;
|
package/dist/esm/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import './types.js';
|
package/dist/esm/lib/redis.d.ts
DELETED
package/dist/esm/lib/redis.js
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert';
|
|
2
|
-
import { once } from 'node:events';
|
|
3
|
-
import { Redis } from 'ioredis';
|
|
4
|
-
export class RedisBoot {
|
|
5
|
-
app;
|
|
6
|
-
constructor(app) {
|
|
7
|
-
this.app = app;
|
|
8
|
-
// empty
|
|
9
|
-
}
|
|
10
|
-
async didLoad() {
|
|
11
|
-
const app = this.app;
|
|
12
|
-
if (app.type === 'application' && app.config.redis.app) {
|
|
13
|
-
app.addSingleton('redis', createClient);
|
|
14
|
-
}
|
|
15
|
-
else if (app.type === 'agent' && app.config.redis.agent) {
|
|
16
|
-
app.addSingleton('redis', createClient);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
let count = 0;
|
|
21
|
-
function createClient(options, app) {
|
|
22
|
-
const RedisClass = app.config.redis.Redis ?? Redis;
|
|
23
|
-
let client;
|
|
24
|
-
if ('cluster' in options && options.cluster === true) {
|
|
25
|
-
const config = options;
|
|
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
|
-
assert(client.host && client.port, `[@eggjs/redis] 'host: ${client.host}', 'port: ${client.port}' are required on config`);
|
|
29
|
-
}
|
|
30
|
-
app.coreLogger.info('[@eggjs/redis] cluster connecting');
|
|
31
|
-
client = new RedisClass.Cluster(config.nodes, config);
|
|
32
|
-
}
|
|
33
|
-
else if ('sentinels' in options && options.sentinels) {
|
|
34
|
-
const config = options;
|
|
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
|
-
assert(sentinel.host && sentinel.port, `[@eggjs/redis] 'host: ${sentinel.host}', 'port: ${sentinel.port}' are required on config`);
|
|
38
|
-
}
|
|
39
|
-
const mask = config.password ? '***' : config.password;
|
|
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
|
-
app.coreLogger.info('[@eggjs/redis] sentinel connecting start');
|
|
42
|
-
client = new RedisClass(config);
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
const config = options;
|
|
46
|
-
const mask = config.password ? '***' : config.password;
|
|
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`);
|
|
52
|
-
if (config.host) {
|
|
53
|
-
app.coreLogger.info('[@eggjs/redis] server connecting redis://:***@%s:%s/%s', config.host, config.port, config.db);
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
app.coreLogger.info('[@eggjs/redis] server connecting %s', config.path || config);
|
|
57
|
-
}
|
|
58
|
-
client = new RedisClass(config);
|
|
59
|
-
}
|
|
60
|
-
client.on('connect', () => {
|
|
61
|
-
app.coreLogger.info('[@eggjs/redis] client connect success');
|
|
62
|
-
});
|
|
63
|
-
client.on('error', err => {
|
|
64
|
-
app.coreLogger.error('[@eggjs/redis] client error: %s', err);
|
|
65
|
-
app.coreLogger.error(err);
|
|
66
|
-
});
|
|
67
|
-
const index = count++;
|
|
68
|
-
app.lifecycle.registerBeforeStart(async () => {
|
|
69
|
-
if ('weakDependent' in options && options.weakDependent) {
|
|
70
|
-
app.coreLogger.info(`[@eggjs/redis] instance[${index}] is weak dependent and won't block app start`);
|
|
71
|
-
client.once('ready', () => {
|
|
72
|
-
app.coreLogger.info(`[@eggjs/redis] instance[${index}] status OK`);
|
|
73
|
-
});
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
await Promise.race([once(client, 'ready'), once(client, 'error')]);
|
|
77
|
-
app.coreLogger.info(`[@eggjs/redis] instance[${index}] status OK, client ready`);
|
|
78
|
-
}, `[@eggjs/redis] instance[${index}] start check`);
|
|
79
|
-
return client;
|
|
80
|
-
}
|
|
81
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlZGlzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRW5DLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFPaEMsTUFBTSxPQUFPLFNBQVM7SUFDUztJQUE3QixZQUE2QixHQUFZO1FBQVosUUFBRyxHQUFILEdBQUcsQ0FBUztRQUN2QyxRQUFRO0lBQ1YsQ0FBQztJQUNELEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNyQixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssYUFBYSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3ZELEdBQUcsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzFDLENBQUM7YUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzFELEdBQUcsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFFRCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDZCxTQUFTLFlBQVksQ0FDbkIsT0FBaUQsRUFDakQsR0FBWTtJQUVaLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUM7SUFDbkQsSUFBSSxNQUFNLENBQUM7SUFFWCxJQUFJLFNBQVMsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxJQUFJLEVBQUUs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
|
package/dist/esm/package.json
DELETED
package/dist/esm/types.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { Singleton } from '@eggjs/core';
|
|
2
|
-
import type { Redis } from 'ioredis';
|
|
3
|
-
import type { RedisConfig } from './config/config.default.js';
|
|
4
|
-
declare module '@eggjs/core' {
|
|
5
|
-
interface EggAppConfig {
|
|
6
|
-
redis: RedisConfig;
|
|
7
|
-
}
|
|
8
|
-
interface EggCore {
|
|
9
|
-
redis: Redis & Singleton<Redis>;
|
|
10
|
-
}
|
|
11
|
-
}
|
package/dist/package.json
DELETED
package/src/agent.ts
DELETED
package/src/app.ts
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import type { RedisOptions, ClusterOptions, Redis } from 'ioredis';
|
|
2
|
-
|
|
3
|
-
export interface RedisClientOptions extends RedisOptions {
|
|
4
|
-
/**
|
|
5
|
-
* Whether to enable weakDependent mode, the redis client start will not block the application start
|
|
6
|
-
*
|
|
7
|
-
* Default to `undefined`
|
|
8
|
-
*/
|
|
9
|
-
weakDependent?: boolean;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export interface RedisClusterOptions extends ClusterOptions {
|
|
13
|
-
cluster: true;
|
|
14
|
-
nodes: RedisClientOptions[];
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface RedisConfig {
|
|
18
|
-
/**
|
|
19
|
-
* Default redis client config
|
|
20
|
-
*
|
|
21
|
-
* Default to `{}`
|
|
22
|
-
*/
|
|
23
|
-
default: RedisClientOptions;
|
|
24
|
-
/**
|
|
25
|
-
* Single Redis or Cluster Redis config
|
|
26
|
-
*/
|
|
27
|
-
client?: RedisClientOptions | RedisClusterOptions;
|
|
28
|
-
/**
|
|
29
|
-
* Multi Redis config
|
|
30
|
-
*/
|
|
31
|
-
clients?: Record<string, RedisClientOptions>;
|
|
32
|
-
/**
|
|
33
|
-
* redis client will try to use TIME command to detect client is ready or not
|
|
34
|
-
* if your redis server not support TIME command, please set this config to false
|
|
35
|
-
* see https://redis.io/commands/time
|
|
36
|
-
*
|
|
37
|
-
* Default to `true`
|
|
38
|
-
*/
|
|
39
|
-
supportTimeCommand: boolean;
|
|
40
|
-
/**
|
|
41
|
-
* Whether to enable redis for `app`
|
|
42
|
-
*
|
|
43
|
-
* Default to `true`
|
|
44
|
-
*/
|
|
45
|
-
app: boolean;
|
|
46
|
-
/**
|
|
47
|
-
* Whether to enable redis for `agent`
|
|
48
|
-
*
|
|
49
|
-
* Default to `false`
|
|
50
|
-
*/
|
|
51
|
-
agent: boolean;
|
|
52
|
-
/**
|
|
53
|
-
* Customize iovalkey version, only set when you needed
|
|
54
|
-
*
|
|
55
|
-
* Default to `undefined`, which means using the built-in ioredis
|
|
56
|
-
*/
|
|
57
|
-
Redis?: typeof Redis;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export default {
|
|
61
|
-
redis: {
|
|
62
|
-
default: {},
|
|
63
|
-
app: true,
|
|
64
|
-
agent: false,
|
|
65
|
-
supportTimeCommand: true,
|
|
66
|
-
// Single Redis
|
|
67
|
-
// client: {
|
|
68
|
-
// host: 'host',
|
|
69
|
-
// port: 'port',
|
|
70
|
-
// family: 'user',
|
|
71
|
-
// password: 'password',
|
|
72
|
-
// db: 'db',
|
|
73
|
-
// },
|
|
74
|
-
//
|
|
75
|
-
// Cluster Redis
|
|
76
|
-
// client: {
|
|
77
|
-
// cluster: true,
|
|
78
|
-
// nodes: [{
|
|
79
|
-
// host: 'host',
|
|
80
|
-
// port: 'port',
|
|
81
|
-
// family: 'user',
|
|
82
|
-
// password: 'password',
|
|
83
|
-
// db: 'db',
|
|
84
|
-
// }, {
|
|
85
|
-
// host: 'host',
|
|
86
|
-
// port: 'port',
|
|
87
|
-
// family: 'user',
|
|
88
|
-
// password: 'password',
|
|
89
|
-
// db: 'db',
|
|
90
|
-
// },
|
|
91
|
-
// ]},
|
|
92
|
-
//
|
|
93
|
-
// Multi Redis
|
|
94
|
-
// clients: {
|
|
95
|
-
// instance1: {
|
|
96
|
-
// host: 'host',
|
|
97
|
-
// port: 'port',
|
|
98
|
-
// family: 'user',
|
|
99
|
-
// password: 'password',
|
|
100
|
-
// db: 'db',
|
|
101
|
-
// },
|
|
102
|
-
// instance2: {
|
|
103
|
-
// host: 'host',
|
|
104
|
-
// port: 'port',
|
|
105
|
-
// family: 'user',
|
|
106
|
-
// password: 'password',
|
|
107
|
-
// db: 'db',
|
|
108
|
-
// },
|
|
109
|
-
// },
|
|
110
|
-
} as RedisConfig,
|
|
111
|
-
};
|
package/src/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import './types.js';
|
package/src/lib/redis.ts
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert';
|
|
2
|
-
import { once } from 'node:events';
|
|
3
|
-
|
|
4
|
-
import { Redis } from 'ioredis';
|
|
5
|
-
import type { ILifecycleBoot, EggCore } from '@eggjs/core';
|
|
6
|
-
import type {
|
|
7
|
-
RedisClusterOptions,
|
|
8
|
-
RedisClientOptions,
|
|
9
|
-
} from '../config/config.default.js';
|
|
10
|
-
|
|
11
|
-
export class RedisBoot implements ILifecycleBoot {
|
|
12
|
-
constructor(private readonly app: EggCore) {
|
|
13
|
-
// empty
|
|
14
|
-
}
|
|
15
|
-
async didLoad() {
|
|
16
|
-
const app = this.app;
|
|
17
|
-
if (app.type === 'application' && app.config.redis.app) {
|
|
18
|
-
app.addSingleton('redis', createClient);
|
|
19
|
-
} else if (app.type === 'agent' && app.config.redis.agent) {
|
|
20
|
-
app.addSingleton('redis', createClient);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
let count = 0;
|
|
26
|
-
function createClient(
|
|
27
|
-
options: RedisClusterOptions | RedisClientOptions,
|
|
28
|
-
app: EggCore
|
|
29
|
-
) {
|
|
30
|
-
const RedisClass = app.config.redis.Redis ?? Redis;
|
|
31
|
-
let client;
|
|
32
|
-
|
|
33
|
-
if ('cluster' in options && options.cluster === true) {
|
|
34
|
-
const config = options as RedisClusterOptions;
|
|
35
|
-
assert(
|
|
36
|
-
config.nodes && config.nodes.length > 0,
|
|
37
|
-
'[@eggjs/redis] cluster nodes configuration is required when use cluster redis'
|
|
38
|
-
);
|
|
39
|
-
|
|
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
|
-
}
|
|
46
|
-
app.coreLogger.info('[@eggjs/redis] cluster connecting');
|
|
47
|
-
client = new RedisClass.Cluster(config.nodes, config);
|
|
48
|
-
} else if ('sentinels' in options && options.sentinels) {
|
|
49
|
-
const config = options as RedisClientOptions;
|
|
50
|
-
assert(
|
|
51
|
-
config.sentinels && config.sentinels.length > 0,
|
|
52
|
-
'[@eggjs/redis] sentinels configuration is required when use redis sentinel'
|
|
53
|
-
);
|
|
54
|
-
|
|
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
|
-
}
|
|
61
|
-
|
|
62
|
-
const mask = config.password ? '***' : config.password;
|
|
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
|
-
);
|
|
67
|
-
|
|
68
|
-
app.coreLogger.info('[@eggjs/redis] sentinel connecting start');
|
|
69
|
-
client = new RedisClass(config);
|
|
70
|
-
} else {
|
|
71
|
-
const config = options as RedisClientOptions;
|
|
72
|
-
const mask = config.password ? '***' : config.password;
|
|
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
|
-
);
|
|
81
|
-
if (config.host) {
|
|
82
|
-
app.coreLogger.info(
|
|
83
|
-
'[@eggjs/redis] server connecting redis://:***@%s:%s/%s',
|
|
84
|
-
config.host,
|
|
85
|
-
config.port,
|
|
86
|
-
config.db
|
|
87
|
-
);
|
|
88
|
-
} else {
|
|
89
|
-
app.coreLogger.info(
|
|
90
|
-
'[@eggjs/redis] server connecting %s',
|
|
91
|
-
config.path || config
|
|
92
|
-
);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
client = new RedisClass(config);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
client.on('connect', () => {
|
|
99
|
-
app.coreLogger.info('[@eggjs/redis] client connect success');
|
|
100
|
-
});
|
|
101
|
-
client.on('error', err => {
|
|
102
|
-
app.coreLogger.error('[@eggjs/redis] client error: %s', err);
|
|
103
|
-
app.coreLogger.error(err);
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
const index = count++;
|
|
107
|
-
app.lifecycle.registerBeforeStart(async () => {
|
|
108
|
-
if ('weakDependent' in options && options.weakDependent) {
|
|
109
|
-
app.coreLogger.info(
|
|
110
|
-
`[@eggjs/redis] instance[${index}] is weak dependent and won't block app start`
|
|
111
|
-
);
|
|
112
|
-
client.once('ready', () => {
|
|
113
|
-
app.coreLogger.info(`[@eggjs/redis] instance[${index}] status OK`);
|
|
114
|
-
});
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
await Promise.race([once(client, 'ready'), once(client, 'error')]);
|
|
119
|
-
app.coreLogger.info(
|
|
120
|
-
`[@eggjs/redis] instance[${index}] status OK, client ready`
|
|
121
|
-
);
|
|
122
|
-
}, `[@eggjs/redis] instance[${index}] start check`);
|
|
123
|
-
|
|
124
|
-
return client;
|
|
125
|
-
}
|