@eggjs/schedule 5.0.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/LICENSE +21 -0
- package/README.md +313 -0
- package/dist/commonjs/agent.d.ts +7 -0
- package/dist/commonjs/agent.js +32 -0
- package/dist/commonjs/app/extend/agent.d.ts +2 -0
- package/dist/commonjs/app/extend/agent.js +29 -0
- package/dist/commonjs/app/extend/application.d.ts +2 -0
- package/dist/commonjs/app/extend/application.js +16 -0
- package/dist/commonjs/app.d.ts +6 -0
- package/dist/commonjs/app.js +131 -0
- package/dist/commonjs/config/config.default.d.ts +2 -0
- package/dist/commonjs/config/config.default.js +17 -0
- package/dist/commonjs/index.d.ts +1 -0
- package/dist/commonjs/index.js +18 -0
- package/dist/commonjs/lib/load_schedule.d.ts +3 -0
- package/dist/commonjs/lib/load_schedule.js +71 -0
- package/dist/commonjs/lib/schedule.d.ts +31 -0
- package/dist/commonjs/lib/schedule.js +89 -0
- package/dist/commonjs/lib/schedule_worker.d.ts +10 -0
- package/dist/commonjs/lib/schedule_worker.js +22 -0
- package/dist/commonjs/lib/strategy/all.d.ts +4 -0
- package/dist/commonjs/lib/strategy/all.js +11 -0
- package/dist/commonjs/lib/strategy/base.d.ts +30 -0
- package/dist/commonjs/lib/strategy/base.js +79 -0
- package/dist/commonjs/lib/strategy/timer.d.ts +20 -0
- package/dist/commonjs/lib/strategy/timer.js +99 -0
- package/dist/commonjs/lib/strategy/worker.d.ts +4 -0
- package/dist/commonjs/lib/strategy/worker.js +11 -0
- package/dist/commonjs/lib/types.d.ts +53 -0
- package/dist/commonjs/lib/types.js +3 -0
- package/dist/commonjs/package.json +3 -0
- package/dist/esm/agent.d.ts +7 -0
- package/dist/esm/agent.js +29 -0
- package/dist/esm/app/extend/agent.d.ts +2 -0
- package/dist/esm/app/extend/agent.js +27 -0
- package/dist/esm/app/extend/application.d.ts +2 -0
- package/dist/esm/app/extend/application.js +14 -0
- package/dist/esm/app.d.ts +6 -0
- package/dist/esm/app.js +125 -0
- package/dist/esm/config/config.default.d.ts +2 -0
- package/dist/esm/config/config.default.js +15 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/lib/load_schedule.d.ts +3 -0
- package/dist/esm/lib/load_schedule.js +65 -0
- package/dist/esm/lib/schedule.d.ts +31 -0
- package/dist/esm/lib/schedule.js +85 -0
- package/dist/esm/lib/schedule_worker.d.ts +10 -0
- package/dist/esm/lib/schedule_worker.js +18 -0
- package/dist/esm/lib/strategy/all.d.ts +4 -0
- package/dist/esm/lib/strategy/all.js +7 -0
- package/dist/esm/lib/strategy/base.d.ts +30 -0
- package/dist/esm/lib/strategy/base.js +75 -0
- package/dist/esm/lib/strategy/timer.d.ts +20 -0
- package/dist/esm/lib/strategy/timer.js +92 -0
- package/dist/esm/lib/strategy/worker.d.ts +4 -0
- package/dist/esm/lib/strategy/worker.js +7 -0
- package/dist/esm/lib/types.d.ts +53 -0
- package/dist/esm/lib/types.js +2 -0
- package/dist/esm/package.json +3 -0
- package/dist/package.json +4 -0
- package/package.json +91 -0
- package/src/agent.ts +36 -0
- package/src/app/extend/agent.ts +30 -0
- package/src/app/extend/application.ts +16 -0
- package/src/app.ts +142 -0
- package/src/config/config.default.ts +17 -0
- package/src/index.ts +1 -0
- package/src/lib/load_schedule.ts +74 -0
- package/src/lib/schedule.ts +100 -0
- package/src/lib/schedule_worker.ts +24 -0
- package/src/lib/strategy/all.ts +7 -0
- package/src/lib/strategy/base.ts +91 -0
- package/src/lib/strategy/timer.ts +106 -0
- package/src/lib/strategy/worker.ts +7 -0
- package/src/lib/types.ts +58 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ScheduleWorker } from '../../lib/schedule_worker.js';
|
|
2
|
+
const SCHEDULE_WORKER = Symbol('application#scheduleWorker');
|
|
3
|
+
export default {
|
|
4
|
+
/**
|
|
5
|
+
* @member app#schedule
|
|
6
|
+
*/
|
|
7
|
+
get scheduleWorker() {
|
|
8
|
+
if (!this[SCHEDULE_WORKER]) {
|
|
9
|
+
this[SCHEDULE_WORKER] = new ScheduleWorker(this);
|
|
10
|
+
}
|
|
11
|
+
return this[SCHEDULE_WORKER];
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL2V4dGVuZC9hcHBsaWNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFOUQsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLDRCQUE0QixDQUFDLENBQUM7QUFFN0QsZUFBZTtJQUNiOztPQUVHO0lBQ0gsSUFBSSxjQUFjO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQy9CLENBQUM7Q0FDSyxDQUFDIn0=
|
package/dist/esm/app.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { debuglog } from 'node:util';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { importResolve } from '@eggjs/utils';
|
|
4
|
+
const debug = debuglog('@eggjs/schedule/app');
|
|
5
|
+
export default class Boot {
|
|
6
|
+
#app;
|
|
7
|
+
#logger;
|
|
8
|
+
constructor(app) {
|
|
9
|
+
this.#app = app;
|
|
10
|
+
this.#logger = app.getLogger('scheduleLogger');
|
|
11
|
+
}
|
|
12
|
+
async didLoad() {
|
|
13
|
+
const scheduleWorker = this.#app.scheduleWorker;
|
|
14
|
+
await scheduleWorker.init();
|
|
15
|
+
// log schedule list
|
|
16
|
+
for (const s in scheduleWorker.scheduleItems) {
|
|
17
|
+
const schedule = scheduleWorker.scheduleItems[s];
|
|
18
|
+
if (!schedule.schedule.disable) {
|
|
19
|
+
this.#logger.info('[@eggjs/schedule]: register schedule %s', schedule.key);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// register schedule event
|
|
23
|
+
this.#app.messenger.on('egg-schedule', async (info) => {
|
|
24
|
+
debug('app got "egg-schedule" message: %o', info);
|
|
25
|
+
const { id, key } = info;
|
|
26
|
+
this.#logger.debug(`[Job#${id}] ${key} await app ready`);
|
|
27
|
+
await this.#app.ready();
|
|
28
|
+
const schedule = scheduleWorker.scheduleItems[key];
|
|
29
|
+
this.#logger.debug(`[Job#${id}] ${key} task received by app`);
|
|
30
|
+
if (!schedule) {
|
|
31
|
+
this.#logger.warn(`[Job#${id}] ${key} unknown task`);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
/* istanbul ignore next */
|
|
35
|
+
if (schedule.schedule.disable) {
|
|
36
|
+
this.#logger.warn(`[Job#${id}] ${key} disable`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
this.#logger.info(`[Job#${id}] ${key} executing by app`);
|
|
40
|
+
// run with anonymous context
|
|
41
|
+
const ctx = this.#app.createAnonymousContext({
|
|
42
|
+
method: 'SCHEDULE',
|
|
43
|
+
url: `/__schedule?path=${key}&${schedule.scheduleQueryString}`,
|
|
44
|
+
});
|
|
45
|
+
const start = Date.now();
|
|
46
|
+
let success;
|
|
47
|
+
let e;
|
|
48
|
+
try {
|
|
49
|
+
// execute
|
|
50
|
+
await this.#app.ctxStorage.run(ctx, async () => {
|
|
51
|
+
return await schedule.task(ctx, ...info.args);
|
|
52
|
+
});
|
|
53
|
+
success = true;
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
success = false;
|
|
57
|
+
e = err;
|
|
58
|
+
}
|
|
59
|
+
const rt = Date.now() - start;
|
|
60
|
+
const msg = `[Job#${id}] ${key} execute ${success ? 'succeed' : 'failed'}, used ${rt}ms.`;
|
|
61
|
+
if (success) {
|
|
62
|
+
this.#logger.info(msg);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
this.#logger.error(msg, e);
|
|
66
|
+
}
|
|
67
|
+
// notify agent job finish
|
|
68
|
+
this.#app.messenger.sendToAgent('egg-schedule', {
|
|
69
|
+
...info,
|
|
70
|
+
success,
|
|
71
|
+
workerId: process.pid,
|
|
72
|
+
rt,
|
|
73
|
+
message: e?.message,
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
// for test purpose
|
|
77
|
+
const config = this.#app.config;
|
|
78
|
+
const directory = [
|
|
79
|
+
path.join(config.baseDir, 'app/schedule'),
|
|
80
|
+
...config.schedule.directory,
|
|
81
|
+
];
|
|
82
|
+
const runSchedule = async (schedulePath, ...args) => {
|
|
83
|
+
debug('[runSchedule] start schedulePath: %o, args: %o', schedulePath, args);
|
|
84
|
+
// resolve real path
|
|
85
|
+
if (path.isAbsolute(schedulePath)) {
|
|
86
|
+
schedulePath = importResolve(schedulePath);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
for (const dir of directory) {
|
|
90
|
+
const trySchedulePath = path.join(dir, schedulePath);
|
|
91
|
+
try {
|
|
92
|
+
schedulePath = importResolve(trySchedulePath);
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
debug('[runSchedule] importResolve %o error: %s', trySchedulePath, err);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
debug('[runSchedule] resolve schedulePath: %o', schedulePath);
|
|
101
|
+
let schedule;
|
|
102
|
+
try {
|
|
103
|
+
schedule = scheduleWorker.scheduleItems[schedulePath];
|
|
104
|
+
if (!schedule) {
|
|
105
|
+
throw new Error(`Cannot find schedule ${schedulePath}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
err.message = `[@eggjs/schedule] ${err.message}`;
|
|
110
|
+
throw err;
|
|
111
|
+
}
|
|
112
|
+
// run with anonymous context
|
|
113
|
+
const ctx = this.#app.createAnonymousContext({
|
|
114
|
+
method: 'SCHEDULE',
|
|
115
|
+
url: `/__schedule?path=${schedulePath}&${schedule.scheduleQueryString}`,
|
|
116
|
+
});
|
|
117
|
+
return await this.#app.ctxStorage.run(ctx, async () => {
|
|
118
|
+
return await schedule.task(ctx, ...args);
|
|
119
|
+
});
|
|
120
|
+
};
|
|
121
|
+
Reflect.set(this.#app, 'runSchedule', runSchedule);
|
|
122
|
+
debug('didLoad');
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUk3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRzdDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBRTlDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sSUFBSTtJQUN2QixJQUFJLENBQWM7SUFDbEIsT0FBTyxDQUFZO0lBQ25CLFlBQVksR0FBZ0I7UUFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDaEQsTUFBTSxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFNUIsb0JBQW9CO1FBQ3BCLEtBQUssTUFBTSxDQUFDLElBQUksY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdDLE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHlDQUF5QyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3RSxDQUFDO1FBQ0gsQ0FBQztRQUVELDBCQUEwQjtRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLEtBQUssRUFBQyxJQUFJLEVBQUMsRUFBRTtZQUNsRCxLQUFLLENBQUMsb0NBQW9DLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEQsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3pELE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4QixNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLEdBQUcsdUJBQXVCLENBQUMsQ0FBQztZQUU5RCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssR0FBRyxlQUFlLENBQUMsQ0FBQztnQkFDckQsT0FBTztZQUNULENBQUM7WUFFRCwwQkFBMEI7WUFDMUIsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDO2dCQUNoRCxPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLEdBQUcsbUJBQW1CLENBQUMsQ0FBQztZQUV6RCw2QkFBNkI7WUFDN0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztnQkFDM0MsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLEdBQUcsRUFBRSxvQkFBb0IsR0FBRyxJQUFJLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTthQUMvRCxDQUFDLENBQUM7WUFFSCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFFekIsSUFBSSxPQUFnQixDQUFDO1lBQ3JCLElBQUksQ0FBb0IsQ0FBQztZQUN6QixJQUFJLENBQUM7Z0JBQ0gsVUFBVTtnQkFDVixNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxJQUFJLEVBQUU7b0JBQzdDLE9BQU8sTUFBTSxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDaEQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNqQixDQUFDO1lBQUMsT0FBTyxHQUFRLEVBQUUsQ0FBQztnQkFDbEIsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDaEIsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUNWLENBQUM7WUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDO1lBRTlCLE1BQU0sR0FBRyxHQUFHLFFBQVEsRUFBRSxLQUFLLEdBQUcsWUFBWSxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxVQUFVLEVBQUUsS0FBSyxDQUFDO1lBQzFGLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM3QixDQUFDO1lBRUQsMEJBQTBCO1lBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUU7Z0JBQzlDLEdBQUcsSUFBSTtnQkFDUCxPQUFPO2dCQUNQLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRztnQkFDckIsRUFBRTtnQkFDRixPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU87YUFDRSxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxtQkFBbUI7UUFDbkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDaEMsTUFBTSxTQUFTLEdBQUc7WUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQztZQUN6QyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUztTQUM3QixDQUFDO1FBQ0YsTUFBTSxXQUFXLEdBQUcsS0FBSyxFQUFFLFlBQW9CLEVBQUUsR0FBRyxJQUFXLEVBQUUsRUFBRTtZQUNqRSxLQUFLLENBQUMsZ0RBQWdELEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRTVFLG9CQUFvQjtZQUNwQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsWUFBWSxHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM3QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sS0FBSyxNQUFNLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztvQkFDNUIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7b0JBQ3JELElBQUksQ0FBQzt3QkFDSCxZQUFZLEdBQUcsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO3dCQUM5QyxNQUFNO29CQUNSLENBQUM7b0JBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQzt3QkFDYixLQUFLLENBQUMsMENBQTBDLEVBQUUsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUMxRSxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBRUQsS0FBSyxDQUFDLHdDQUF3QyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQzlELElBQUksUUFBeUIsQ0FBQztZQUM5QixJQUFJLENBQUM7Z0JBQ0gsUUFBUSxHQUFHLGNBQWMsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDZCxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixZQUFZLEVBQUUsQ0FBQyxDQUFDO2dCQUMxRCxDQUFDO1lBQ0gsQ0FBQztZQUFDLE9BQU8sR0FBUSxFQUFFLENBQUM7Z0JBQ2xCLEdBQUcsQ0FBQyxPQUFPLEdBQUcscUJBQXFCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDakQsTUFBTSxHQUFHLENBQUM7WUFDWixDQUFDO1lBRUQsNkJBQTZCO1lBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUM7Z0JBQzNDLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixHQUFHLEVBQUUsb0JBQW9CLFlBQVksSUFBSSxRQUFRLENBQUMsbUJBQW1CLEVBQUU7YUFDeEUsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ3BELE9BQU8sTUFBTSxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQzNDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUVuRCxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkIsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export default () => {
|
|
2
|
+
const config = {};
|
|
3
|
+
config.customLogger = {
|
|
4
|
+
scheduleLogger: {
|
|
5
|
+
consoleLevel: 'NONE',
|
|
6
|
+
file: 'egg-schedule.log',
|
|
7
|
+
},
|
|
8
|
+
};
|
|
9
|
+
config.schedule = {
|
|
10
|
+
// custom additional directory, full path
|
|
11
|
+
directory: [],
|
|
12
|
+
};
|
|
13
|
+
return config;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmRlZmF1bHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29uZmlnL2NvbmZpZy5kZWZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGVBQWUsR0FBRyxFQUFFO0lBQ2xCLE1BQU0sTUFBTSxHQUFHLEVBQXlCLENBQUM7SUFFekMsTUFBTSxDQUFDLFlBQVksR0FBRztRQUNwQixjQUFjLEVBQUU7WUFDZCxZQUFZLEVBQUUsTUFBTTtZQUNwQixJQUFJLEVBQUUsa0JBQWtCO1NBQ3pCO0tBQ0YsQ0FBQztJQUVGLE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIseUNBQXlDO1FBQ3pDLFNBQVMsRUFBRSxFQUFFO0tBQ2QsQ0FBQztJQUVGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQyJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './lib/types.js';
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import assert from 'node:assert';
|
|
3
|
+
import { stringify } from 'node:querystring';
|
|
4
|
+
import { isClass, isFunction, isGeneratorFunction } from 'is-type-of';
|
|
5
|
+
import { importResolve } from '@eggjs/utils';
|
|
6
|
+
function getScheduleLoader(app) {
|
|
7
|
+
return class ScheduleLoader extends app.loader.FileLoader {
|
|
8
|
+
async load() {
|
|
9
|
+
const target = this.options.target;
|
|
10
|
+
const items = await this.parse();
|
|
11
|
+
for (const item of items) {
|
|
12
|
+
const schedule = item.exports;
|
|
13
|
+
const fullpath = item.fullpath;
|
|
14
|
+
const scheduleConfig = schedule.schedule;
|
|
15
|
+
assert(scheduleConfig, `schedule(${fullpath}): must have "schedule" and "task" properties`);
|
|
16
|
+
assert(isClass(schedule) || isFunction(schedule.task), `schedule(${fullpath}: \`schedule.task\` should be function or \`schedule\` should be class`);
|
|
17
|
+
let task;
|
|
18
|
+
if (isClass(schedule)) {
|
|
19
|
+
assert(!isGeneratorFunction(schedule.prototype.subscribe), `schedule(${fullpath}): "schedule" generator function is not support, should use async function instead`);
|
|
20
|
+
task = async (ctx, ...args) => {
|
|
21
|
+
const instance = new schedule(ctx);
|
|
22
|
+
// s.subscribe = app.toAsyncFunction(s.subscribe);
|
|
23
|
+
return instance.subscribe(...args);
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
assert(!isGeneratorFunction(schedule.task), `schedule(${fullpath}): "task" generator function is not support, should use async function instead`);
|
|
28
|
+
task = schedule.task;
|
|
29
|
+
// task = app.toAsyncFunction(schedule.task);
|
|
30
|
+
}
|
|
31
|
+
const env = app.config.env;
|
|
32
|
+
const envList = schedule.schedule.env;
|
|
33
|
+
if (Array.isArray(envList) && !envList.includes(env)) {
|
|
34
|
+
app.coreLogger.info(`[@eggjs/schedule]: ignore schedule ${fullpath} due to \`schedule.env\` not match`);
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
// handle symlink case
|
|
38
|
+
const realFullpath = importResolve(fullpath);
|
|
39
|
+
target[realFullpath] = {
|
|
40
|
+
schedule: scheduleConfig,
|
|
41
|
+
scheduleQueryString: stringify(scheduleConfig),
|
|
42
|
+
task,
|
|
43
|
+
key: realFullpath,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
return target;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export async function loadSchedule(app) {
|
|
51
|
+
const dirs = [
|
|
52
|
+
...app.loader.getLoadUnits().map(unit => path.join(unit.path, 'app/schedule')),
|
|
53
|
+
...app.config.schedule.directory,
|
|
54
|
+
];
|
|
55
|
+
const Loader = getScheduleLoader(app);
|
|
56
|
+
const schedules = {};
|
|
57
|
+
await new Loader({
|
|
58
|
+
directory: dirs,
|
|
59
|
+
target: schedules,
|
|
60
|
+
inject: app,
|
|
61
|
+
}).load();
|
|
62
|
+
Reflect.set(app, 'schedules', schedules);
|
|
63
|
+
return schedules;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZF9zY2hlZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbG9hZF9zY2hlZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN0RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBSTdDLFNBQVMsaUJBQWlCLENBQUMsR0FBdUI7SUFDaEQsT0FBTyxNQUFNLGNBQWUsU0FBUSxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVU7UUFDdkQsS0FBSyxDQUFDLElBQUk7WUFDUixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQXlDLENBQUM7WUFDdEUsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDekIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQWlFLENBQUM7Z0JBQ3hGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQy9CLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7Z0JBQ3pDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsWUFBWSxRQUFRLCtDQUErQyxDQUFDLENBQUM7Z0JBQzVGLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFDbkQsWUFBWSxRQUFRLHdFQUF3RSxDQUFDLENBQUM7Z0JBRWhHLElBQUksSUFBcUIsQ0FBQztnQkFDMUIsSUFBSSxP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
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Agent } from 'egg';
|
|
2
|
+
import type { EggScheduleItem, EggScheduleJobInfo } from './types.js';
|
|
3
|
+
import type { BaseStrategy } from './strategy/base.js';
|
|
4
|
+
export declare class Schedule {
|
|
5
|
+
#private;
|
|
6
|
+
closed: boolean;
|
|
7
|
+
constructor(agent: Agent);
|
|
8
|
+
/**
|
|
9
|
+
* register a custom Schedule Strategy
|
|
10
|
+
* @param {String} type - strategy type
|
|
11
|
+
* @param {Strategy} clz - Strategy class
|
|
12
|
+
*/
|
|
13
|
+
use(type: string, clz: typeof BaseStrategy): void;
|
|
14
|
+
/**
|
|
15
|
+
* load all schedule jobs, then initialize and register speical strategy
|
|
16
|
+
*/
|
|
17
|
+
init(): Promise<void>;
|
|
18
|
+
registerSchedule(scheduleItem: EggScheduleItem): void;
|
|
19
|
+
unregisterSchedule(key: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* job finish event handler
|
|
22
|
+
*
|
|
23
|
+
* @param {Object} info - { id, key, success, message, workerId }
|
|
24
|
+
*/
|
|
25
|
+
onJobFinish(info: EggScheduleJobInfo): void;
|
|
26
|
+
/**
|
|
27
|
+
* start schedule
|
|
28
|
+
*/
|
|
29
|
+
start(): void;
|
|
30
|
+
close(): void;
|
|
31
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { debuglog } from 'node:util';
|
|
2
|
+
import { loadSchedule } from './load_schedule.js';
|
|
3
|
+
const debug = debuglog('@eggjs/schedule/lib/schedule');
|
|
4
|
+
export class Schedule {
|
|
5
|
+
closed = false;
|
|
6
|
+
#agent;
|
|
7
|
+
#logger;
|
|
8
|
+
#strategyClassMap = new Map();
|
|
9
|
+
#strategyInstanceMap = new Map();
|
|
10
|
+
constructor(agent) {
|
|
11
|
+
this.#agent = agent;
|
|
12
|
+
this.#logger = agent.getLogger('scheduleLogger');
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* register a custom Schedule Strategy
|
|
16
|
+
* @param {String} type - strategy type
|
|
17
|
+
* @param {Strategy} clz - Strategy class
|
|
18
|
+
*/
|
|
19
|
+
use(type, clz) {
|
|
20
|
+
this.#strategyClassMap.set(type, clz);
|
|
21
|
+
debug('use type: %o', type);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* load all schedule jobs, then initialize and register speical strategy
|
|
25
|
+
*/
|
|
26
|
+
async init() {
|
|
27
|
+
const scheduleItems = await loadSchedule(this.#agent);
|
|
28
|
+
for (const scheduleItem of Object.values(scheduleItems)) {
|
|
29
|
+
this.registerSchedule(scheduleItem);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
registerSchedule(scheduleItem) {
|
|
33
|
+
const { key, schedule } = scheduleItem;
|
|
34
|
+
const type = schedule.type;
|
|
35
|
+
if (schedule.disable) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// find Strategy by type
|
|
39
|
+
const Strategy = this.#strategyClassMap.get(type);
|
|
40
|
+
if (!Strategy) {
|
|
41
|
+
const err = new Error(`schedule type [${type}] is not defined`);
|
|
42
|
+
err.name = 'EggScheduleError';
|
|
43
|
+
throw err;
|
|
44
|
+
}
|
|
45
|
+
// Initialize strategy and register
|
|
46
|
+
const instance = new Strategy(schedule, this.#agent, key);
|
|
47
|
+
this.#strategyInstanceMap.set(key, instance);
|
|
48
|
+
debug('registerSchedule type: %o, config: %o, key: %o', type, schedule, key);
|
|
49
|
+
}
|
|
50
|
+
unregisterSchedule(key) {
|
|
51
|
+
debug('unregisterSchedule key: %o', key);
|
|
52
|
+
return this.#strategyInstanceMap.delete(key);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* job finish event handler
|
|
56
|
+
*
|
|
57
|
+
* @param {Object} info - { id, key, success, message, workerId }
|
|
58
|
+
*/
|
|
59
|
+
onJobFinish(info) {
|
|
60
|
+
this.#logger.debug(`[Job#${info.id}] ${info.key} finish event received by agent from worker#${info.workerId}`);
|
|
61
|
+
const instance = this.#strategyInstanceMap.get(info.key);
|
|
62
|
+
/* istanbul ignore else */
|
|
63
|
+
if (instance) {
|
|
64
|
+
instance.onJobFinish(info);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* start schedule
|
|
69
|
+
*/
|
|
70
|
+
start() {
|
|
71
|
+
debug('start');
|
|
72
|
+
this.closed = false;
|
|
73
|
+
for (const instance of this.#strategyInstanceMap.values()) {
|
|
74
|
+
instance.start();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
close() {
|
|
78
|
+
this.closed = true;
|
|
79
|
+
for (const instance of this.#strategyInstanceMap.values()) {
|
|
80
|
+
instance.close();
|
|
81
|
+
}
|
|
82
|
+
debug('close');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3NjaGVkdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFckMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSWxELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0FBRXZELE1BQU0sT0FBTyxRQUFRO0lBQ25CLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFFZixNQUFNLENBQVE7SUFDZCxPQUFPLENBQVk7SUFDbkIsaUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQStCLENBQUM7SUFDM0Qsb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7SUFFdkQsWUFBWSxLQUFZO1FBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsR0FBRyxDQUFDLElBQVksRUFBRSxHQUF3QjtRQUN4QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN0QyxLQUFLLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxJQUFJO1FBQ1IsTUFBTSxhQUFhLEdBQUcsTUFBTSxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELEtBQUssTUFBTSxZQUFZLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ3hELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN0QyxDQUFDO0lB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
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Application } from 'egg';
|
|
2
|
+
import type { EggScheduleItem } from './types.js';
|
|
3
|
+
export declare class ScheduleWorker {
|
|
4
|
+
#private;
|
|
5
|
+
scheduleItems: Record<string, EggScheduleItem>;
|
|
6
|
+
constructor(app: Application);
|
|
7
|
+
init(): Promise<void>;
|
|
8
|
+
registerSchedule(scheduleItem: EggScheduleItem): void;
|
|
9
|
+
unregisterSchedule(key: string): void;
|
|
10
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { loadSchedule } from './load_schedule.js';
|
|
2
|
+
export class ScheduleWorker {
|
|
3
|
+
#app;
|
|
4
|
+
scheduleItems = {};
|
|
5
|
+
constructor(app) {
|
|
6
|
+
this.#app = app;
|
|
7
|
+
}
|
|
8
|
+
async init() {
|
|
9
|
+
this.scheduleItems = await loadSchedule(this.#app);
|
|
10
|
+
}
|
|
11
|
+
registerSchedule(scheduleItem) {
|
|
12
|
+
this.scheduleItems[scheduleItem.key] = scheduleItem;
|
|
13
|
+
}
|
|
14
|
+
unregisterSchedule(key) {
|
|
15
|
+
delete this.scheduleItems[key];
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVfd29ya2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9zY2hlZHVsZV93b3JrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBR2xELE1BQU0sT0FBTyxjQUFjO0lBQ3pCLElBQUksQ0FBYztJQUNsQixhQUFhLEdBQW9DLEVBQUUsQ0FBQztJQUVwRCxZQUFZLEdBQWdCO1FBQzFCLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSTtRQUNSLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxZQUE2QjtRQUM1QyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxZQUFZLENBQUM7SUFDdEQsQ0FBQztJQUVELGtCQUFrQixDQUFDLEdBQVc7UUFDNUIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7Q0FDRiJ9
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TimerStrategy } from './timer.js';
|
|
2
|
+
export class AllStrategy extends TimerStrategy {
|
|
3
|
+
handler() {
|
|
4
|
+
this.sendAll();
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zdHJhdGVneS9hbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUUzQyxNQUFNLE9BQU8sV0FBWSxTQUFRLGFBQWE7SUFDNUMsT0FBTztRQUNMLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQixDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Agent, EggLogger } from 'egg';
|
|
2
|
+
import type { EggScheduleConfig, EggScheduleJobInfo } from '../types.js';
|
|
3
|
+
export declare class BaseStrategy {
|
|
4
|
+
protected agent: Agent;
|
|
5
|
+
protected scheduleConfig: EggScheduleConfig;
|
|
6
|
+
protected key: string;
|
|
7
|
+
protected logger: EggLogger;
|
|
8
|
+
protected closed: boolean;
|
|
9
|
+
count: number;
|
|
10
|
+
constructor(scheduleConfig: EggScheduleConfig, agent: Agent, key: string);
|
|
11
|
+
/** keep compatibility */
|
|
12
|
+
get schedule(): EggScheduleConfig;
|
|
13
|
+
start(): void;
|
|
14
|
+
close(): void;
|
|
15
|
+
onJobStart(_info: EggScheduleJobInfo): void;
|
|
16
|
+
onJobFinish(_info: EggScheduleJobInfo): void;
|
|
17
|
+
/**
|
|
18
|
+
* trigger one worker
|
|
19
|
+
*
|
|
20
|
+
* @param {...any} args - pass to job task
|
|
21
|
+
*/
|
|
22
|
+
sendOne(...args: any[]): void;
|
|
23
|
+
/**
|
|
24
|
+
* trigger all worker
|
|
25
|
+
*
|
|
26
|
+
* @param {...any} args - pass to job task
|
|
27
|
+
*/
|
|
28
|
+
sendAll(...args: any[]): void;
|
|
29
|
+
getSeqId(): string;
|
|
30
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
export class BaseStrategy {
|
|
2
|
+
agent;
|
|
3
|
+
scheduleConfig;
|
|
4
|
+
key;
|
|
5
|
+
logger;
|
|
6
|
+
closed = false;
|
|
7
|
+
count = 0;
|
|
8
|
+
constructor(scheduleConfig, agent, key) {
|
|
9
|
+
this.agent = agent;
|
|
10
|
+
this.key = key;
|
|
11
|
+
this.scheduleConfig = scheduleConfig;
|
|
12
|
+
this.logger = this.agent.getLogger('scheduleLogger');
|
|
13
|
+
}
|
|
14
|
+
/** keep compatibility */
|
|
15
|
+
get schedule() {
|
|
16
|
+
return this.scheduleConfig;
|
|
17
|
+
}
|
|
18
|
+
start() {
|
|
19
|
+
// empty loop by default
|
|
20
|
+
}
|
|
21
|
+
close() {
|
|
22
|
+
this.closed = true;
|
|
23
|
+
}
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
25
|
+
onJobStart(_info) { }
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
27
|
+
onJobFinish(_info) { }
|
|
28
|
+
/**
|
|
29
|
+
* trigger one worker
|
|
30
|
+
*
|
|
31
|
+
* @param {...any} args - pass to job task
|
|
32
|
+
*/
|
|
33
|
+
sendOne(...args) {
|
|
34
|
+
/* istanbul ignore next */
|
|
35
|
+
if (this.agent.schedule.closed) {
|
|
36
|
+
this.logger.warn(`${this.key} skip due to schedule closed`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
this.count++;
|
|
40
|
+
const info = {
|
|
41
|
+
key: this.key,
|
|
42
|
+
id: this.getSeqId(),
|
|
43
|
+
args,
|
|
44
|
+
};
|
|
45
|
+
this.logger.info(`[Job#${info.id}] ${info.key} triggered, send random by agent`);
|
|
46
|
+
this.agent.messenger.sendRandom('egg-schedule', info);
|
|
47
|
+
this.onJobStart(info);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* trigger all worker
|
|
51
|
+
*
|
|
52
|
+
* @param {...any} args - pass to job task
|
|
53
|
+
*/
|
|
54
|
+
sendAll(...args) {
|
|
55
|
+
/* istanbul ignore next */
|
|
56
|
+
if (this.agent.schedule.closed) {
|
|
57
|
+
this.logger.warn(`${this.key} skip due to schedule closed`);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
this.count++;
|
|
61
|
+
const info = {
|
|
62
|
+
key: this.key,
|
|
63
|
+
id: this.getSeqId(),
|
|
64
|
+
args,
|
|
65
|
+
};
|
|
66
|
+
this.logger.info(`[Job#${info.id}] ${info.key} triggered, send all by agent`);
|
|
67
|
+
// send to all workers
|
|
68
|
+
this.agent.messenger.send('egg-schedule', info);
|
|
69
|
+
this.onJobStart(info);
|
|
70
|
+
}
|
|
71
|
+
getSeqId() {
|
|
72
|
+
return `${Date.now()}${process.hrtime().join('')}${this.count}`;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3RyYXRlZ3kvYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxNQUFNLE9BQU8sWUFBWTtJQUNiLEtBQUssQ0FBUTtJQUNiLGNBQWMsQ0FBb0I7SUFDbEMsR0FBRyxDQUFTO0lBQ1osTUFBTSxDQUFZO0lBQ2xCLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDekIsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUVWLFlBQVksY0FBaUMsRUFBRSxLQUFZLEVBQUUsR0FBVztRQUN0RSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQseUJBQXlCO0lBQ3pCLElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRUQsS0FBSztRQUNILHdCQUF3QjtJQUMxQixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFRCw2REFBNkQ7SUFDN0QsVUFBVSxDQUFDLEtBQXlCLElBQUcsQ0FBQztJQUV4Qyw2REFBNkQ7SUFDN0QsV0FBVyxDQUFDLEtBQXlCLElBQUcsQ0FBQztJQUV6Qzs7OztPQUlHO0lBQ0gsT0FBTyxDQUFDLEdBQUcsSUFBVztRQUNwQiwwQkFBMEI7UUFDMUIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLDhCQUE4QixDQUFDLENBQUM7WUFDNUQsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFYixNQUFNLElBQUksR0FBRztZQUNYLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ25CLElBQUk7U0FDaUIsQ0FBQztRQUV4QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsa0NBQWtDLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxPQUFPLENBQUMsR0FBRyxJQUFXO1FBQ3BCLDBCQUEwQjtRQUMxQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsOEJBQThCLENBQUMsQ0FBQztZQUM1RCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUViLE1BQU0sSUFBSSxHQUFHO1lBQ1gsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbkIsSUFBSTtTQUNpQixDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRywrQkFBK0IsQ0FBQyxDQUFDO1FBQzlFLHNCQUFzQjtRQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2xFLENBQUM7Q0FDRiJ9
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type CronExpression } from 'cron-parser';
|
|
2
|
+
import safeTimers from 'safe-timers';
|
|
3
|
+
import type { Agent } from 'egg';
|
|
4
|
+
import type { EggScheduleConfig } from '../types.js';
|
|
5
|
+
import { BaseStrategy } from './base.js';
|
|
6
|
+
export declare abstract class TimerStrategy extends BaseStrategy {
|
|
7
|
+
#private;
|
|
8
|
+
protected cronInstance?: CronExpression;
|
|
9
|
+
constructor(scheduleConfig: EggScheduleConfig, agent: Agent, key: string);
|
|
10
|
+
protected handler(): void;
|
|
11
|
+
start(): void;
|
|
12
|
+
onJobStart(): void;
|
|
13
|
+
/**
|
|
14
|
+
* calculate next tick
|
|
15
|
+
*
|
|
16
|
+
* @return {Number|undefined} time interval, if out of range then return `undefined`
|
|
17
|
+
*/
|
|
18
|
+
protected getNextTick(): number | undefined;
|
|
19
|
+
protected safeTimeout(handler: () => void, delay: number, ...args: any[]): number | safeTimers.Timeout;
|
|
20
|
+
}
|