@eggjs/schedule 6.0.0-beta.35 → 6.0.0-beta.36
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/dist/agent.d.ts +12 -8
- package/dist/agent.js +30 -32
- package/dist/app/extend/agent.d.ts +21 -17
- package/dist/app/extend/agent.js +30 -28
- package/dist/app/extend/application.d.ts +11 -7
- package/dist/app/extend/application.js +17 -15
- package/dist/app/extend/application.unittest.d.ts +7 -3
- package/dist/app/extend/application.unittest.js +45 -50
- package/dist/app.d.ts +10 -6
- package/dist/app.js +69 -77
- package/dist/config/config.default.d.ts +19 -17
- package/dist/config/config.default.js +11 -11
- package/dist/index.d.ts +13 -10
- package/dist/index.js +15 -14
- package/dist/lib/load_schedule.d.ts +7 -3
- package/dist/lib/load_schedule.js +58 -63
- package/dist/lib/schedule.d.ts +34 -30
- package/dist/lib/schedule.js +76 -84
- package/dist/lib/schedule_worker.d.ts +13 -9
- package/dist/lib/schedule_worker.js +22 -20
- package/dist/lib/strategy/all.d.ts +7 -3
- package/dist/lib/strategy/all.js +10 -6
- package/dist/lib/strategy/base.d.ts +35 -31
- package/dist/lib/strategy/base.js +73 -75
- package/dist/lib/strategy/timer.d.ts +22 -18
- package/dist/lib/strategy/timer.js +70 -93
- package/dist/lib/strategy/worker.d.ts +7 -3
- package/dist/lib/strategy/worker.js +10 -6
- package/dist/lib/types.d.ts +26 -23
- package/dist/lib/types.js +1 -2
- package/dist/types.d.ts +40 -38
- package/dist/types.js +1 -2
- package/package.json +44 -52
|
@@ -1,75 +1,73 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
75
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvc3RyYXRlZ3kvYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxNQUFNLE9BQU8sWUFBWTtJQUNiLEtBQUssQ0FBUTtJQUNiLGNBQWMsQ0FBb0I7SUFDbEMsR0FBRyxDQUFTO0lBQ1osTUFBTSxDQUFZO0lBQ2xCLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDekIsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUVWLFlBQVksY0FBaUMsRUFBRSxLQUFZLEVBQUUsR0FBVztRQUN0RSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQseUJBQXlCO0lBQ3pCLElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDVCx3QkFBd0I7SUFDMUIsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLO1FBQ1QsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUVELDZEQUE2RDtJQUM3RCxVQUFVLENBQUMsS0FBeUIsSUFBUyxDQUFDO0lBRTlDLDZEQUE2RDtJQUM3RCxXQUFXLENBQUMsS0FBeUIsSUFBUyxDQUFDO0lBRS9DOzs7O09BSUc7SUFDSCxPQUFPLENBQUMsR0FBRyxJQUFXO1FBQ3BCLDBCQUEwQjtRQUMxQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsOEJBQThCLENBQUMsQ0FBQztZQUM1RCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUViLE1BQU0sSUFBSSxHQUFHO1lBQ1gsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbkIsSUFBSTtTQUNpQixDQUFDO1FBRXhCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyxHQUFHLElBQVc7UUFDcEIsMEJBQTBCO1FBQzFCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyw4QkFBOEIsQ0FBQyxDQUFDO1lBQzVELE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRWIsTUFBTSxJQUFJLEdBQUc7WUFDWCxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDYixFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNuQixJQUFJO1NBQ2lCLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLCtCQUErQixDQUFDLENBQUM7UUFDOUUsc0JBQXNCO1FBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDbEUsQ0FBQztDQUNGIn0=
|
|
1
|
+
//#region src/lib/strategy/base.ts
|
|
2
|
+
var BaseStrategy = class {
|
|
3
|
+
agent;
|
|
4
|
+
scheduleConfig;
|
|
5
|
+
key;
|
|
6
|
+
logger;
|
|
7
|
+
closed = false;
|
|
8
|
+
count = 0;
|
|
9
|
+
constructor(scheduleConfig, agent, key) {
|
|
10
|
+
this.agent = agent;
|
|
11
|
+
this.key = key;
|
|
12
|
+
this.scheduleConfig = scheduleConfig;
|
|
13
|
+
this.logger = this.agent.getLogger("scheduleLogger");
|
|
14
|
+
}
|
|
15
|
+
/** keep compatibility */
|
|
16
|
+
get schedule() {
|
|
17
|
+
return this.scheduleConfig;
|
|
18
|
+
}
|
|
19
|
+
async start() {}
|
|
20
|
+
async close() {
|
|
21
|
+
this.closed = true;
|
|
22
|
+
}
|
|
23
|
+
onJobStart(_info) {}
|
|
24
|
+
onJobFinish(_info) {}
|
|
25
|
+
/**
|
|
26
|
+
* trigger one worker
|
|
27
|
+
*
|
|
28
|
+
* @param {...any} args - pass to job task
|
|
29
|
+
*/
|
|
30
|
+
sendOne(...args) {
|
|
31
|
+
/* istanbul ignore next */
|
|
32
|
+
if (this.agent.schedule.closed) {
|
|
33
|
+
this.logger.warn(`${this.key} skip due to schedule closed`);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
this.count++;
|
|
37
|
+
const info = {
|
|
38
|
+
key: this.key,
|
|
39
|
+
id: this.getSeqId(),
|
|
40
|
+
args
|
|
41
|
+
};
|
|
42
|
+
this.logger.info(`[Job#${info.id}] ${info.key} triggered, send random by agent`);
|
|
43
|
+
this.agent.messenger.sendRandom("egg-schedule", info);
|
|
44
|
+
this.onJobStart(info);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* trigger all worker
|
|
48
|
+
*
|
|
49
|
+
* @param {...any} args - pass to job task
|
|
50
|
+
*/
|
|
51
|
+
sendAll(...args) {
|
|
52
|
+
/* istanbul ignore next */
|
|
53
|
+
if (this.agent.schedule.closed) {
|
|
54
|
+
this.logger.warn(`${this.key} skip due to schedule closed`);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
this.count++;
|
|
58
|
+
const info = {
|
|
59
|
+
key: this.key,
|
|
60
|
+
id: this.getSeqId(),
|
|
61
|
+
args
|
|
62
|
+
};
|
|
63
|
+
this.logger.info(`[Job#${info.id}] ${info.key} triggered, send all by agent`);
|
|
64
|
+
this.agent.messenger.send("egg-schedule", info);
|
|
65
|
+
this.onJobStart(info);
|
|
66
|
+
}
|
|
67
|
+
getSeqId() {
|
|
68
|
+
return `${Date.now()}${process.hrtime().join("")}${this.count}`;
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
//#endregion
|
|
73
|
+
export { BaseStrategy };
|
|
@@ -1,19 +1,23 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
1
|
+
import { EggScheduleConfig } from "../../config/config.default.js";
|
|
2
|
+
import { BaseStrategy } from "./base.js";
|
|
3
|
+
import ScheduleAgent from "../../app/extend/agent.js";
|
|
4
|
+
import { CronExpression } from "cron-parser";
|
|
5
|
+
|
|
6
|
+
//#region src/lib/strategy/timer.d.ts
|
|
7
|
+
declare abstract class TimerStrategy extends BaseStrategy {
|
|
8
|
+
#private;
|
|
9
|
+
protected cronInstance?: CronExpression;
|
|
10
|
+
constructor(scheduleConfig: EggScheduleConfig, agent: ScheduleAgent, key: string);
|
|
11
|
+
protected handler(): void;
|
|
12
|
+
start(): Promise<void>;
|
|
13
|
+
onJobStart(): void;
|
|
14
|
+
/**
|
|
15
|
+
* calculate next tick
|
|
16
|
+
*
|
|
17
|
+
* @return {Number|undefined} time interval, if out of range then return `undefined`
|
|
18
|
+
*/
|
|
19
|
+
protected getNextTick(): number | undefined;
|
|
20
|
+
protected safeTimeout(handler: () => void, delay: number, ...args: any[]): number | ReturnType<typeof setTimeout>;
|
|
19
21
|
}
|
|
22
|
+
//#endregion
|
|
23
|
+
export { TimerStrategy };
|
|
@@ -1,94 +1,71 @@
|
|
|
1
|
-
import assert from 'node:assert';
|
|
2
|
-
import cronParser from 'cron-parser';
|
|
3
|
-
import { ms } from 'humanize-ms';
|
|
4
|
-
import safeTimers from 'safe-timers';
|
|
5
|
-
import { logDate } from 'utility';
|
|
6
1
|
import { BaseStrategy } from "./base.js";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
nextTick = nextInterval.getTime();
|
|
78
|
-
}
|
|
79
|
-
catch (err) {
|
|
80
|
-
// Error: Out of the timespan range
|
|
81
|
-
this.logger.info(`[Timer] ${this.key} cron out of the timespan range, error: %s`, err);
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
} while (now >= nextTick);
|
|
85
|
-
return nextTick - now;
|
|
86
|
-
}
|
|
87
|
-
// won\'t run here
|
|
88
|
-
}
|
|
89
|
-
safeTimeout(handler, delay, ...args) {
|
|
90
|
-
const fn = delay < safeTimers.maxInterval ? setTimeout : safeTimers.setTimeout;
|
|
91
|
-
return fn(handler, delay, ...args);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3N0cmF0ZWd5L3RpbWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUdqQyxPQUFPLFVBQVUsTUFBTSxhQUFhLENBQUM7QUFDckMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLFVBQVUsTUFBTSxhQUFhLENBQUM7QUFDckMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUlsQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXpDLE1BQU0sT0FBZ0IsYUFBYyxTQUFRLFlBQVk7SUFDNUMsWUFBWSxDQUFrQjtJQUV4QyxZQUFZLGNBQWlDLEVBQUUsS0FBWSxFQUFFLEdBQVc7UUFDdEUsS0FBSyxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFbEMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDdkUsTUFBTSxDQUNKLFFBQVEsSUFBSSxJQUFJLElBQUksU0FBUyxFQUM3QixxQkFBcUIsSUFBSSxDQUFDLEdBQUcsdUZBQXVGLENBQ3JILENBQUM7UUFFRixtQkFBbUI7UUFDbkIsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQztnQkFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7WUFBQyxPQUFPLEdBQVEsRUFBRSxDQUFDO2dCQUNsQixNQUFNLElBQUksU0FBUyxDQUFDLHFCQUFxQixJQUFJLENBQUMsR0FBRywyQkFBMkIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRTtvQkFDekcsS0FB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
|
|
2
|
+
import assert from "node:assert";
|
|
3
|
+
import cronParser from "cron-parser";
|
|
4
|
+
import { ms } from "humanize-ms";
|
|
5
|
+
import safeTimers from "safe-timers";
|
|
6
|
+
import { logDate } from "utility";
|
|
7
|
+
|
|
8
|
+
//#region src/lib/strategy/timer.ts
|
|
9
|
+
var TimerStrategy = class extends BaseStrategy {
|
|
10
|
+
cronInstance;
|
|
11
|
+
constructor(scheduleConfig, agent, key) {
|
|
12
|
+
super(scheduleConfig, agent, key);
|
|
13
|
+
const { interval, cron, cronOptions, immediate } = this.scheduleConfig;
|
|
14
|
+
assert(interval || cron || immediate, `[@eggjs/schedule] ${this.key} \`schedule.interval\` or \`schedule.cron\` or \`schedule.immediate\` must be present`);
|
|
15
|
+
if (cron) try {
|
|
16
|
+
this.cronInstance = cronParser.parseExpression(cron, cronOptions);
|
|
17
|
+
} catch (err) {
|
|
18
|
+
throw new TypeError(`[@eggjs/schedule] ${this.key} parse cron instruction(${cron}) error: ${err.message}`, { cause: err });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
handler() {
|
|
22
|
+
throw new TypeError(`[@eggjs/schedule] ${this.key} strategy should override \`handler()\` method`);
|
|
23
|
+
}
|
|
24
|
+
async start() {
|
|
25
|
+
/* istanbul ignore next */
|
|
26
|
+
if (this.agent.schedule.closed) return;
|
|
27
|
+
if (this.scheduleConfig.immediate) {
|
|
28
|
+
this.logger.info(`[Timer] ${this.key} next time will execute immediate`);
|
|
29
|
+
setImmediate(() => this.handler());
|
|
30
|
+
} else this.#scheduleNext();
|
|
31
|
+
}
|
|
32
|
+
#scheduleNext() {
|
|
33
|
+
/* istanbul ignore next */
|
|
34
|
+
if (this.agent.schedule.closed) return;
|
|
35
|
+
const nextTick = this.getNextTick();
|
|
36
|
+
if (nextTick) {
|
|
37
|
+
this.logger.info(`[Timer] ${this.key} next time will execute after ${nextTick}ms at ${logDate(new Date(Date.now() + nextTick))}`);
|
|
38
|
+
this.safeTimeout(() => this.handler(), nextTick);
|
|
39
|
+
} else this.logger.info(`[Timer] ${this.key} reach endDate, will stop`);
|
|
40
|
+
}
|
|
41
|
+
onJobStart() {
|
|
42
|
+
this.#scheduleNext();
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* calculate next tick
|
|
46
|
+
*
|
|
47
|
+
* @return {Number|undefined} time interval, if out of range then return `undefined`
|
|
48
|
+
*/
|
|
49
|
+
getNextTick() {
|
|
50
|
+
if (this.scheduleConfig.interval) return ms(this.scheduleConfig.interval);
|
|
51
|
+
if (this.cronInstance) {
|
|
52
|
+
const now = Date.now();
|
|
53
|
+
let nextTick;
|
|
54
|
+
do
|
|
55
|
+
try {
|
|
56
|
+
nextTick = this.cronInstance.next().getTime();
|
|
57
|
+
} catch (err) {
|
|
58
|
+
this.logger.info(`[Timer] ${this.key} cron out of the timespan range, error: %s`, err);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
while (now >= nextTick);
|
|
62
|
+
return nextTick - now;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
safeTimeout(handler, delay, ...args) {
|
|
66
|
+
return (delay < safeTimers.maxInterval ? setTimeout : safeTimers.setTimeout)(handler, delay, ...args);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
//#endregion
|
|
71
|
+
export { TimerStrategy };
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import { TimerStrategy } from
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { TimerStrategy } from "./timer.js";
|
|
2
|
+
|
|
3
|
+
//#region src/lib/strategy/worker.d.ts
|
|
4
|
+
declare class WorkerStrategy extends TimerStrategy {
|
|
5
|
+
handler(): void;
|
|
4
6
|
}
|
|
7
|
+
//#endregion
|
|
8
|
+
export { WorkerStrategy };
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { TimerStrategy } from "./timer.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
|
|
3
|
+
//#region src/lib/strategy/worker.ts
|
|
4
|
+
var WorkerStrategy = class extends TimerStrategy {
|
|
5
|
+
handler() {
|
|
6
|
+
this.sendOne();
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
//#endregion
|
|
11
|
+
export { WorkerStrategy };
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -1,27 +1,30 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { CronOptions, EggScheduleConfig } from "../config/config.default.js";
|
|
2
|
+
import { Context } from "egg";
|
|
3
|
+
|
|
4
|
+
//#region src/lib/types.d.ts
|
|
5
|
+
type EggScheduleTaskOptions = Omit<EggScheduleConfig, "directory">;
|
|
6
|
+
type EggScheduleTask = (ctx: Context, ...args: any[]) => Promise<void>;
|
|
6
7
|
/**
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
* Schedule handler interface
|
|
9
|
+
*/
|
|
10
|
+
interface EggScheduleHandler {
|
|
11
|
+
schedule: EggScheduleTaskOptions;
|
|
12
|
+
task: EggScheduleTask;
|
|
12
13
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
interface EggScheduleItem {
|
|
15
|
+
schedule: EggScheduleTaskOptions;
|
|
16
|
+
scheduleQueryString: string;
|
|
17
|
+
task: EggScheduleTask;
|
|
18
|
+
key: string;
|
|
18
19
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
interface EggScheduleJobInfo {
|
|
21
|
+
id: string;
|
|
22
|
+
key: string;
|
|
23
|
+
workerId: number;
|
|
24
|
+
args: any[];
|
|
25
|
+
success?: boolean;
|
|
26
|
+
message?: string;
|
|
27
|
+
rt?: number;
|
|
27
28
|
}
|
|
29
|
+
//#endregion
|
|
30
|
+
export { type CronOptions, EggScheduleHandler, EggScheduleItem, EggScheduleJobInfo, EggScheduleTask, EggScheduleTaskOptions };
|
package/dist/lib/types.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
|
|
1
|
+
export { };
|
package/dist/types.d.ts
CHANGED
|
@@ -1,38 +1,40 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
1
|
+
import { EggScheduleConfig } from "./config/config.default.js";
|
|
2
|
+
import { BaseStrategy } from "./lib/strategy/base.js";
|
|
3
|
+
import { Scheduler } from "./lib/schedule.js";
|
|
4
|
+
import { TimerStrategy } from "./lib/strategy/timer.js";
|
|
5
|
+
import { ScheduleWorker } from "./lib/schedule_worker.js";
|
|
6
|
+
|
|
7
|
+
//#region src/types.d.ts
|
|
8
|
+
declare module "egg" {
|
|
9
|
+
interface EggAppConfig {
|
|
10
|
+
/**
|
|
11
|
+
* Schedule Config
|
|
12
|
+
* @see https://eggjs.org/basics/schedule
|
|
13
|
+
*/
|
|
14
|
+
schedule: EggScheduleConfig;
|
|
15
|
+
}
|
|
16
|
+
interface Agent {
|
|
17
|
+
/**
|
|
18
|
+
* Schedule Strategy
|
|
19
|
+
*/
|
|
20
|
+
ScheduleStrategy: typeof BaseStrategy;
|
|
21
|
+
/**
|
|
22
|
+
* Timer Schedule Strategy
|
|
23
|
+
*/
|
|
24
|
+
TimerScheduleStrategy: typeof TimerStrategy;
|
|
25
|
+
/**
|
|
26
|
+
* Schedule
|
|
27
|
+
*/
|
|
28
|
+
schedule: Scheduler;
|
|
29
|
+
}
|
|
30
|
+
interface Application {
|
|
31
|
+
/**
|
|
32
|
+
* Schedule Worker
|
|
33
|
+
*/
|
|
34
|
+
scheduleWorker: ScheduleWorker;
|
|
35
|
+
/**
|
|
36
|
+
* Run a schedule, only for unit test
|
|
37
|
+
*/
|
|
38
|
+
runSchedule(schedulePath: string, ...args: any[]): Promise<any>;
|
|
39
|
+
}
|
|
40
|
+
}
|
package/dist/types.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
|
|
1
|
+
export { };
|