@eggjs/redis 3.1.0 → 4.0.0-beta.26

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.
Files changed (43) hide show
  1. package/README.md +144 -120
  2. package/dist/agent.d.ts +2 -0
  3. package/dist/agent.js +3 -0
  4. package/dist/app.d.ts +2 -0
  5. package/dist/app.js +3 -0
  6. package/dist/{esm/config → config}/config.default.js +1 -1
  7. package/dist/index.d.ts +1 -0
  8. package/dist/{esm/index.js → index.js} +2 -2
  9. package/dist/{commonjs/lib → lib}/redis.d.ts +2 -2
  10. package/dist/lib/redis.js +76 -0
  11. package/dist/types.d.ts +14 -0
  12. package/dist/{esm/types.js → types.js} +1 -1
  13. package/package.json +49 -79
  14. package/dist/commonjs/agent.d.ts +0 -2
  15. package/dist/commonjs/agent.js +0 -5
  16. package/dist/commonjs/app.d.ts +0 -2
  17. package/dist/commonjs/app.js +0 -5
  18. package/dist/commonjs/config/config.default.js +0 -55
  19. package/dist/commonjs/index.d.ts +0 -1
  20. package/dist/commonjs/index.js +0 -4
  21. package/dist/commonjs/lib/redis.js +0 -88
  22. package/dist/commonjs/package.json +0 -3
  23. package/dist/commonjs/types.d.ts +0 -11
  24. package/dist/commonjs/types.js +0 -3
  25. package/dist/esm/agent.d.ts +0 -2
  26. package/dist/esm/agent.js +0 -3
  27. package/dist/esm/app.d.ts +0 -2
  28. package/dist/esm/app.js +0 -3
  29. package/dist/esm/config/config.default.d.ts +0 -59
  30. package/dist/esm/index.d.ts +0 -1
  31. package/dist/esm/lib/redis.d.ts +0 -6
  32. package/dist/esm/lib/redis.js +0 -81
  33. package/dist/esm/package.json +0 -3
  34. package/dist/esm/types.d.ts +0 -11
  35. package/dist/package.json +0 -4
  36. package/src/agent.ts +0 -3
  37. package/src/app.ts +0 -3
  38. package/src/config/config.default.ts +0 -111
  39. package/src/index.ts +0 -1
  40. package/src/lib/redis.ts +0 -125
  41. package/src/types.ts +0 -14
  42. package/src/typings/index.d.ts +0 -4
  43. /package/dist/{commonjs/config → config}/config.default.d.ts +0 -0
@@ -1,2 +0,0 @@
1
- import { RedisBoot } from './lib/redis.js';
2
- export default RedisBoot;
@@ -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
@@ -1,2 +0,0 @@
1
- import { RedisBoot } from './lib/redis.js';
2
- export default RedisBoot;
@@ -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==
@@ -1 +0,0 @@
1
- import './types.js';
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlZGlzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDhEQUFpQztBQUNqQyw2Q0FBbUM7QUFFbkMscUNBQWdDO0FBT2hDLE1BQWEsU0FBUztJQUNTO0lBQTdCLFlBQTZCLEdBQVk7UUFBWixRQUFHLEdBQUgsR0FBRyxDQUFTO1FBQ3ZDLFFBQVE7SUFDVixDQUFDO0lBQ0QsS0FBSyxDQUFDLE9BQU87UUFDWCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3JCLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxhQUFhLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdkQsR0FBRyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDMUMsQ0FBQzthQUFNLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUQsR0FBRyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDMUMsQ0FBQztJQUNILENBQUM7Q0FDRjtBQVpELDhCQVlDO0FBRUQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsU0FBUyxZQUFZLENBQ25CLE9BQWlELEVBQ2pELEdBQVk7SUFFWixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksZUFBSyxDQUFDO0lBQ25ELElBQUksTUFBTSxDQUFDO0lBRVgsSUFBSSxTQUFTLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDckQsTUFBTSxNQUFNLEdBQUcsT0FBOEIsQ0FBQztRQUM5QyxJQUFBLHFCQUFNLEVBQ0osTUFBTSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ3ZDLCtFQUErRSxDQUNoRixDQUFDO1FBRUYsS0FBSyxNQUFNLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEMsSUFBQSxxQkFBTSxFQUNKLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksRUFDMUIseUJBQXlCLE1BQU0sQ0FBQyxJQUFJLGFBQWEsTUFBTSxDQUFDLElBQUksMEJBQTBCLENBQ3ZGLENBQUM7UUFDSixDQUFDO1FBQ0QsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUN6RCxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDeEQsQ0FBQztTQUFNLElBQUksV0FBVyxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdkQsTUFBTSxNQUFNLEdBQUcsT0FBNkIsQ0FBQztRQUM3QyxJQUFBLHFCQUFNLEVBQ0osTUFBTSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQy9DLDRFQUE0RSxDQUM3RSxDQUFDO1FBRUYsS0FBSyxNQUFNLFFBQVEsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDeEMsSUFBQSxxQkFBTSxFQUNKLFFBQVEsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksRUFDOUIseUJBQXlCLFFBQVEsQ0FBQyxJQUFJLGFBQWEsUUFBUSxDQUFDLElBQUksMEJBQTBCLENBQzNGLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ3ZELElBQUEscUJBQU0sRUFDSixNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxFQUFFLEtBQUssU0FBUyxFQUN2RSxtQ0FBbUMsTUFBTSxDQUFDLElBQUksaUJBQWlCLElBQUksV0FBVyxNQUFNLENBQUMsRUFBRSwwQkFBMEIsQ0FDbEgsQ0FBQztRQUVGLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDaEUsTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxNQUFNLEdBQUcsT0FBNkIsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDdkQsSUFBQSxxQkFBTSxFQUNKLENBQUMsTUFBTSxDQUFDLElBQUk7WUFDVixNQUFNLENBQUMsSUFBSTtZQUNYLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUztZQUM3QixNQUFNLENBQUMsRUFBRSxLQUFLLFNBQVMsQ0FBQztZQUN4QixNQUFNLENBQUMsSUFBSSxFQUNiLHlCQUF5QixNQUFNLENBQUMsSUFBSSxhQUFhLE1BQU0sQ0FBQyxJQUFJLGlCQUFpQixJQUFJLFdBQVcsTUFBTSxDQUFDLEVBQUUsY0FBYyxNQUFNLENBQUMsSUFBSSwwQkFBMEIsQ0FDekosQ0FBQztRQUNGLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2hCLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUNqQix3REFBd0QsRUFDeEQsTUFBTSxDQUFDLElBQUksRUFDWCxNQUFNLENBQUMsSUFBSSxFQUNYLE1BQU0sQ0FBQyxFQUFFLENBQ1YsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQ2pCLHFDQUFxQyxFQUNyQyxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FDdEIsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUN4QixHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0lBQy9ELENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUU7UUFDdkIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDN0QsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUN0QixHQUFHLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLEtBQUssSUFBSSxFQUFFO1FBQzNDLElBQUksZUFBZSxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEQsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQ2pCLDJCQUEyQixLQUFLLCtDQUErQyxDQUNoRixDQUFDO1lBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO2dCQUN4QixHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQywyQkFBMkIsS0FBSyxhQUFhLENBQUMsQ0FBQztZQUNyRSxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBQSxrQkFBSSxFQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsRUFBRSxJQUFBLGtCQUFJLEVBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRSxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDakIsMkJBQTJCLEtBQUssMkJBQTJCLENBQzVELENBQUM7SUFDSixDQUFDLEVBQUUsMkJBQTJCLEtBQUssZUFBZSxDQUFDLENBQUM7SUFFcEQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyJ9
@@ -1,3 +0,0 @@
1
- {
2
- "type": "commonjs"
3
- }
@@ -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
- }
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -1,2 +0,0 @@
1
- import { RedisBoot } from './lib/redis.js';
2
- export default RedisBoot;
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
@@ -1,2 +0,0 @@
1
- import { RedisBoot } from './lib/redis.js';
2
- export default RedisBoot;
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;
@@ -1 +0,0 @@
1
- import './types.js';
@@ -1,6 +0,0 @@
1
- import type { ILifecycleBoot, EggCore } from '@eggjs/core';
2
- export declare class RedisBoot implements ILifecycleBoot {
3
- private readonly app;
4
- constructor(app: EggCore);
5
- didLoad(): Promise<void>;
6
- }
@@ -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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
@@ -1,3 +0,0 @@
1
- {
2
- "type": "module"
3
- }
@@ -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
@@ -1,4 +0,0 @@
1
- {
2
- "name": "@eggjs/redis",
3
- "version": "3.1.0"
4
- }
package/src/agent.ts DELETED
@@ -1,3 +0,0 @@
1
- import { RedisBoot } from './lib/redis.js';
2
-
3
- export default RedisBoot;
package/src/app.ts DELETED
@@ -1,3 +0,0 @@
1
- import { RedisBoot } from './lib/redis.js';
2
-
3
- export default RedisBoot;
@@ -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
- }