pixivflow 2.10.30 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -15
- package/config/fly-two-bots.example.json +4 -0
- package/dist/commands/SchedulerCommand.d.ts.map +1 -1
- package/dist/commands/SchedulerCommand.js +49 -0
- package/dist/commands/SchedulerCommand.js.map +1 -1
- package/dist/commands/scheduler-runtime.d.ts +2 -1
- package/dist/commands/scheduler-runtime.d.ts.map +1 -1
- package/dist/commands/scheduler-runtime.js +71 -5
- package/dist/commands/scheduler-runtime.js.map +1 -1
- package/dist/config/defaults.d.ts +7 -0
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +7 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/types.d.ts +49 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/validation.d.ts.map +1 -1
- package/dist/config/validation.js +16 -1
- package/dist/config/validation.js.map +1 -1
- package/dist/delivery/DeliveryOutbox.d.ts +7 -0
- package/dist/delivery/DeliveryOutbox.d.ts.map +1 -1
- package/dist/delivery/DeliveryOutbox.js +12 -0
- package/dist/delivery/DeliveryOutbox.js.map +1 -1
- package/dist/delivery/HttpMultipartDelivery.d.ts.map +1 -1
- package/dist/delivery/HttpMultipartDelivery.js +6 -1
- package/dist/delivery/HttpMultipartDelivery.js.map +1 -1
- package/dist/delivery/types.d.ts +4 -0
- package/dist/delivery/types.d.ts.map +1 -1
- package/dist/download/DownloadManager.d.ts +12 -1
- package/dist/download/DownloadManager.d.ts.map +1 -1
- package/dist/download/DownloadManager.js +15 -0
- package/dist/download/DownloadManager.js.map +1 -1
- package/dist/download/IllustrationDownloader.d.ts +2 -2
- package/dist/download/IllustrationDownloader.d.ts.map +1 -1
- package/dist/download/IllustrationDownloader.js +21 -18
- package/dist/download/IllustrationDownloader.js.map +1 -1
- package/dist/download/UgoiraConverter.d.ts +2 -0
- package/dist/download/UgoiraConverter.d.ts.map +1 -0
- package/dist/download/UgoiraConverter.js +21 -0
- package/dist/download/UgoiraConverter.js.map +1 -0
- package/dist/download/handlers/IllustrationTargetHandler.d.ts.map +1 -1
- package/dist/download/handlers/IllustrationTargetHandler.js +12 -4
- package/dist/download/handlers/IllustrationTargetHandler.js.map +1 -1
- package/dist/download/handlers/NovelTargetHandler.d.ts.map +1 -1
- package/dist/download/handlers/NovelTargetHandler.js +12 -3
- package/dist/download/handlers/NovelTargetHandler.js.map +1 -1
- package/dist/download/pipeline/DownloadPipeline.d.ts +5 -0
- package/dist/download/pipeline/DownloadPipeline.d.ts.map +1 -1
- package/dist/download/pipeline/DownloadPipeline.js +10 -0
- package/dist/download/pipeline/DownloadPipeline.js.map +1 -1
- package/dist/download/ugoira_to_gif.py +65 -0
- package/dist/package.json +1 -1
- package/dist/scheduler/MultiScheduleManager.d.ts +20 -1
- package/dist/scheduler/MultiScheduleManager.d.ts.map +1 -1
- package/dist/scheduler/MultiScheduleManager.js +37 -3
- package/dist/scheduler/MultiScheduleManager.js.map +1 -1
- package/dist/scheduler/ScheduleTriggerServer.d.ts +55 -0
- package/dist/scheduler/ScheduleTriggerServer.d.ts.map +1 -0
- package/dist/scheduler/ScheduleTriggerServer.js +101 -0
- package/dist/scheduler/ScheduleTriggerServer.js.map +1 -0
- package/dist/scheduler/Scheduler.d.ts +12 -3
- package/dist/scheduler/Scheduler.d.ts.map +1 -1
- package/dist/scheduler/Scheduler.js +28 -10
- package/dist/scheduler/Scheduler.js.map +1 -1
- package/dist/scheduler/SlotCoordinator.d.ts +59 -0
- package/dist/scheduler/SlotCoordinator.d.ts.map +1 -0
- package/dist/scheduler/SlotCoordinator.js +150 -0
- package/dist/scheduler/SlotCoordinator.js.map +1 -0
- package/dist/storage/Database.d.ts +4 -0
- package/dist/storage/Database.d.ts.map +1 -1
- package/dist/storage/Database.js +7 -0
- package/dist/storage/Database.js.map +1 -1
- package/dist/storage/DatabaseMigration.d.ts.map +1 -1
- package/dist/storage/DatabaseMigration.js +35 -0
- package/dist/storage/DatabaseMigration.js.map +1 -1
- package/dist/storage/repositories/SlotRepository.d.ts +78 -0
- package/dist/storage/repositories/SlotRepository.d.ts.map +1 -0
- package/dist/storage/repositories/SlotRepository.js +170 -0
- package/dist/storage/repositories/SlotRepository.js.map +1 -0
- package/dist/webui/package.json +1 -1
- package/package.json +1 -1
|
@@ -69,6 +69,8 @@ class MultiScheduleManager {
|
|
|
69
69
|
reloadTimer = null;
|
|
70
70
|
watching = false;
|
|
71
71
|
admission = new SerialJobAdmission(8);
|
|
72
|
+
/** Slot context for the next externally-triggered run; consumed once by execute(). */
|
|
73
|
+
pendingSlot = null;
|
|
72
74
|
constructor(options) {
|
|
73
75
|
this.options = options;
|
|
74
76
|
}
|
|
@@ -92,6 +94,13 @@ class MultiScheduleManager {
|
|
|
92
94
|
catchUpMissedRuns(config) {
|
|
93
95
|
if (!this.options.database)
|
|
94
96
|
return;
|
|
97
|
+
// External mode (Fly autosleep): a stopped machine is the normal saving
|
|
98
|
+
// state, not an outage — never self-trigger historical runs on cold start.
|
|
99
|
+
if (this.isExternalMode(config))
|
|
100
|
+
return;
|
|
101
|
+
// Opt-out for internal hosts that do not want startup catch-up.
|
|
102
|
+
if (config.schedulerRuntime?.catchUpMissedRuns === false)
|
|
103
|
+
return;
|
|
95
104
|
const now = new Date();
|
|
96
105
|
for (const plan of (0, schedules_1.resolveSchedules)(config)) {
|
|
97
106
|
if (!plan.enabled)
|
|
@@ -150,6 +159,7 @@ class MultiScheduleManager {
|
|
|
150
159
|
const plans = (0, schedules_1.resolveSchedules)(config);
|
|
151
160
|
const enabledPlans = plans.filter((plan) => plan.enabled);
|
|
152
161
|
const queueLimit = config.schedulerRuntime?.queueLimit ?? Math.max(enabledPlans.length, 1);
|
|
162
|
+
const registerCron = !this.isExternalMode(config);
|
|
153
163
|
// loadConfig performs full validation. Stop the previous cron table only
|
|
154
164
|
// after every new definition is available, then publish one snapshot.
|
|
155
165
|
for (const scheduler of this.schedulers.values())
|
|
@@ -164,10 +174,13 @@ class MultiScheduleManager {
|
|
|
164
174
|
// wedged run cannot hold the shared admission queue forever.
|
|
165
175
|
const schedulerConfig = plan.timeout !== undefined ? plan : { ...plan, timeout: Scheduler_1.DEFAULT_SCHEDULE_TIMEOUT_MS };
|
|
166
176
|
const scheduler = new Scheduler_1.Scheduler(schedulerConfig, this.options.database, this.options.telemetry, plan.id, this.admission, (failure) => this.options.onFailure?.(config, plan, failure));
|
|
167
|
-
scheduler
|
|
177
|
+
scheduler[registerCron ? 'start' : 'init'](async () => {
|
|
168
178
|
// The closure keeps the exact validated snapshot for an in-flight run.
|
|
169
|
-
// Later runs are attached to the replacement cron table.
|
|
170
|
-
|
|
179
|
+
// Later runs are attached to the replacement cron table. An external
|
|
180
|
+
// trigger's slot context is consumed once here (cron fires have none).
|
|
181
|
+
const slot = this.pendingSlot;
|
|
182
|
+
this.pendingSlot = null;
|
|
183
|
+
await this.options.execute(config, plan, slot ?? undefined);
|
|
171
184
|
});
|
|
172
185
|
this.schedulers.set(plan.id, scheduler);
|
|
173
186
|
}
|
|
@@ -219,6 +232,27 @@ class MultiScheduleManager {
|
|
|
219
232
|
scheduler.stop();
|
|
220
233
|
this.schedulers.clear();
|
|
221
234
|
}
|
|
235
|
+
/** External scheduler mode: runs are HTTP-triggered, never by internal cron. */
|
|
236
|
+
isExternalMode(config = this.activeConfig) {
|
|
237
|
+
return config.schedulerRuntime?.mode === 'external';
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Trigger one schedule immediately (external HTTP trigger / run-once). Returns
|
|
241
|
+
* false if the schedule id is unknown. Honors Scheduler's running/pending and
|
|
242
|
+
* serial-admission guards, so duplicate triggers never double-run.
|
|
243
|
+
*/
|
|
244
|
+
triggerSchedule(scheduleId, slot) {
|
|
245
|
+
const scheduler = this.schedulers.get(scheduleId);
|
|
246
|
+
if (!scheduler)
|
|
247
|
+
return false;
|
|
248
|
+
if (slot)
|
|
249
|
+
this.pendingSlot = slot;
|
|
250
|
+
return scheduler.runNow();
|
|
251
|
+
}
|
|
252
|
+
/** Enabled schedule ids in the active snapshot (for the trigger API / status). */
|
|
253
|
+
scheduleIds() {
|
|
254
|
+
return [...this.schedulers.keys()];
|
|
255
|
+
}
|
|
222
256
|
getStatus() {
|
|
223
257
|
return {
|
|
224
258
|
ok: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiScheduleManager.js","sourceRoot":"","sources":["../../src/scheduler/MultiScheduleManager.ts"],"names":[],"mappings":";;;;;;AAAA,qCAAiD;AAEjD,8DAAqC;AAGrC,sCAAmC;AAEnC,2CAOqB;AACrB,2CAAiE;
|
|
1
|
+
{"version":3,"file":"MultiScheduleManager.js","sourceRoot":"","sources":["../../src/scheduler/MultiScheduleManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authenticated HTTP Slot trigger for `schedulerRuntime.mode: external`.
|
|
3
|
+
*
|
|
4
|
+
* A dumb external clock (Cloudflare cron worker, cron-job.org, GitHub Actions)
|
|
5
|
+
* POSTs the slot name; this server wakes with the machine, verifies a bearer
|
|
6
|
+
* token, and runs the schedules' slot **synchronously** so the open HTTP
|
|
7
|
+
* request keeps the Fly machine active for the whole run (the request itself
|
|
8
|
+
* is the activity lease — no background fire-and-forget that lets Fly stop the
|
|
9
|
+
* machine mid-slot). All business state lives in the Slot ledger; the handler
|
|
10
|
+
* never trusts a client-supplied past date and never back-fills old slots.
|
|
11
|
+
*/
|
|
12
|
+
export interface TriggerHandlers {
|
|
13
|
+
/** Resolve the canonical slot for a requested name (validated to now). */
|
|
14
|
+
resolveSlot(requested: string | undefined): {
|
|
15
|
+
slotId: string;
|
|
16
|
+
slotName: string;
|
|
17
|
+
slotDate: string;
|
|
18
|
+
} | {
|
|
19
|
+
error: string;
|
|
20
|
+
status: number;
|
|
21
|
+
};
|
|
22
|
+
/** Run one schedule's slot; idempotent. Returns the schedule's slot summary. */
|
|
23
|
+
runScheduleSlot(scheduleId: string, slot: {
|
|
24
|
+
slotId: string;
|
|
25
|
+
slotName: string;
|
|
26
|
+
slotDate: string;
|
|
27
|
+
}): Promise<ScheduleSlotResult>;
|
|
28
|
+
/** List enabled schedules + today's slot status (for GET). */
|
|
29
|
+
status(): unknown;
|
|
30
|
+
}
|
|
31
|
+
export interface ScheduleSlotResult {
|
|
32
|
+
scheduleId: string;
|
|
33
|
+
slotId: string;
|
|
34
|
+
status: string;
|
|
35
|
+
cells: Array<{
|
|
36
|
+
targetId: string;
|
|
37
|
+
status: string;
|
|
38
|
+
workId: string | null;
|
|
39
|
+
error?: string | null;
|
|
40
|
+
}>;
|
|
41
|
+
alreadyCompleted?: boolean;
|
|
42
|
+
}
|
|
43
|
+
export declare class ScheduleTriggerServer {
|
|
44
|
+
private readonly token;
|
|
45
|
+
private readonly handlers;
|
|
46
|
+
private server;
|
|
47
|
+
constructor(token: string | undefined, handlers: TriggerHandlers);
|
|
48
|
+
/** Token from config or SCHEDULER_TRIGGER_TOKEN env; empty => fail closed. */
|
|
49
|
+
static resolveToken(configured?: string): string | undefined;
|
|
50
|
+
start(host: string, port: number): void;
|
|
51
|
+
private scheduleIds;
|
|
52
|
+
private auth;
|
|
53
|
+
stop(): void;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=ScheduleTriggerServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScheduleTriggerServer.d.ts","sourceRoot":"","sources":["../../src/scheduler/ScheduleTriggerServer.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;GAUG;AACH,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACvI,gFAAgF;IAChF,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC/H,8DAA8D;IAC9D,MAAM,IAAI,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IACjG,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,qBAAa,qBAAqB;IAI9B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAJ3B,OAAO,CAAC,MAAM,CAAuB;gBAGlB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,QAAQ,EAAE,eAAe;IAG5C,8EAA8E;IAC9E,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI5D,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAoDvC,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,IAAI,CAsBV;IAEF,IAAI,IAAI,IAAI;CAIb"}
|
|
@@ -0,0 +1,101 @@
|
|
|
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.ScheduleTriggerServer = void 0;
|
|
7
|
+
const express_1 = __importDefault(require("express"));
|
|
8
|
+
const node_crypto_1 = require("node:crypto");
|
|
9
|
+
const logger_1 = require("../logger");
|
|
10
|
+
class ScheduleTriggerServer {
|
|
11
|
+
token;
|
|
12
|
+
handlers;
|
|
13
|
+
server = null;
|
|
14
|
+
constructor(token, handlers) {
|
|
15
|
+
this.token = token;
|
|
16
|
+
this.handlers = handlers;
|
|
17
|
+
}
|
|
18
|
+
/** Token from config or SCHEDULER_TRIGGER_TOKEN env; empty => fail closed. */
|
|
19
|
+
static resolveToken(configured) {
|
|
20
|
+
return (configured ?? process.env.SCHEDULER_TRIGGER_TOKEN ?? '').trim() || undefined;
|
|
21
|
+
}
|
|
22
|
+
start(host, port) {
|
|
23
|
+
const app = (0, express_1.default)();
|
|
24
|
+
app.use(express_1.default.json());
|
|
25
|
+
app.get('/health', (_req, res) => {
|
|
26
|
+
res.json({ status: 'ok', service: 'pixivflow-scheduler-trigger' });
|
|
27
|
+
});
|
|
28
|
+
app.get('/internal/schedules', this.auth, (_req, res) => {
|
|
29
|
+
res.json(this.handlers.status());
|
|
30
|
+
});
|
|
31
|
+
app.post('/internal/schedules/run', this.auth, async (req, res) => {
|
|
32
|
+
try {
|
|
33
|
+
const slotName = typeof req.body?.slot === 'string' ? req.body.slot : undefined;
|
|
34
|
+
const resolved = this.handlers.resolveSlot(slotName);
|
|
35
|
+
if ('error' in resolved) {
|
|
36
|
+
res.status(resolved.status).json({ status: 'error', error: resolved.error });
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const schedules = this.scheduleIds();
|
|
40
|
+
if (schedules.length === 0) {
|
|
41
|
+
res.status(409).json({ status: 'error', error: 'No enabled schedules' });
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// Run schedules serially (low-memory). The first schedule's run returns
|
|
45
|
+
// false-admission (already running) only under a true concurrent dup.
|
|
46
|
+
const results = [];
|
|
47
|
+
for (const scheduleId of schedules) {
|
|
48
|
+
results.push(await this.handlers.runScheduleSlot(scheduleId, resolved));
|
|
49
|
+
}
|
|
50
|
+
const anyWork = results.some((r) => !r.alreadyCompleted);
|
|
51
|
+
res.json({
|
|
52
|
+
status: results.some((r) => r.status === 'partial') ? 'partial' : 'ok',
|
|
53
|
+
slot: resolved.slotId,
|
|
54
|
+
note: results.every((r) => r.alreadyCompleted) ? 'already_completed' : anyWork ? 'completed' : 'noop',
|
|
55
|
+
schedules: results,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
logger_1.logger.error('Slot trigger failed', { error: error instanceof Error ? error.message : String(error) });
|
|
60
|
+
res.status(500).json({ status: 'error', error: 'slot run failed; the slot ledger will resume on the next trigger' });
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
this.server = app.listen(port, host, () => {
|
|
64
|
+
logger_1.logger.info('Schedule trigger server listening', { host, port, auth: this.token ? 'bearer' : 'DISABLED (no token)' });
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
scheduleIds() {
|
|
68
|
+
const s = this.handlers.status();
|
|
69
|
+
return s.schedules ?? [];
|
|
70
|
+
}
|
|
71
|
+
auth = (req, res, next) => {
|
|
72
|
+
if (!this.token) {
|
|
73
|
+
// Fail closed: never allow an unauthenticated trigger in production.
|
|
74
|
+
res.status(503).json({ status: 'error', error: 'trigger disabled: SCHEDULER_TRIGGER_TOKEN not configured' });
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const header = req.headers.authorization ?? '';
|
|
78
|
+
const presented = header.startsWith('Bearer ') ? header.slice(7).trim() : '';
|
|
79
|
+
const expected = this.token;
|
|
80
|
+
let ok = presented.length === expected.length;
|
|
81
|
+
if (ok) {
|
|
82
|
+
try {
|
|
83
|
+
ok = (0, node_crypto_1.timingSafeEqual)(Buffer.from(presented), Buffer.from(expected));
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
ok = false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (!ok) {
|
|
90
|
+
res.status(401).json({ status: 'error', error: 'unauthorized' });
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
next();
|
|
94
|
+
};
|
|
95
|
+
stop() {
|
|
96
|
+
this.server?.close();
|
|
97
|
+
this.server = null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
exports.ScheduleTriggerServer = ScheduleTriggerServer;
|
|
101
|
+
//# sourceMappingURL=ScheduleTriggerServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScheduleTriggerServer.js","sourceRoot":"","sources":["../../src/scheduler/ScheduleTriggerServer.ts"],"names":[],"mappings":";;;;;;AAAA,sDAA8D;AAC9D,6CAA8C;AAG9C,sCAAmC;AA8BnC,MAAa,qBAAqB;IAIb;IACA;IAJX,MAAM,GAAkB,IAAI,CAAC;IAErC,YACmB,KAAyB,EACzB,QAAyB;QADzB,UAAK,GAAL,KAAK,CAAoB;QACzB,aAAQ,GAAR,QAAQ,CAAiB;IACzC,CAAC;IAEJ,8EAA8E;IAC9E,MAAM,CAAC,YAAY,CAAC,UAAmB;QACrC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;IACvF,CAAC;IAED,KAAK,CAAC,IAAY,EAAE,IAAY;QAC9B,MAAM,GAAG,GAAY,IAAA,iBAAO,GAAE,CAAC;QAC/B,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAExB,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;YAClD,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;YACzE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,IAAI,CAAC,yBAAyB,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;YACnF,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;gBAChF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBACrD,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;oBACxB,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;oBAC7E,OAAO;gBACT,CAAC;gBAED,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC3B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;oBACzE,OAAO;gBACT,CAAC;gBAED,wEAAwE;gBACxE,sEAAsE;gBACtE,MAAM,OAAO,GAAyB,EAAE,CAAC;gBACzC,KAAK,MAAM,UAAU,IAAI,SAAS,EAAE,CAAC;oBACnC,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAC1E,CAAC;gBAED,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;gBACzD,GAAG,CAAC,IAAI,CAAC;oBACP,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;oBACtE,IAAI,EAAE,QAAQ,CAAC,MAAM;oBACrB,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;oBACrG,SAAS,EAAE,OAAO;iBACnB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,eAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACvG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,kEAAkE,EAAE,CAAC,CAAC;YACvH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;YACxC,eAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACxH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,WAAW;QACjB,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAA8B,CAAC;QAC7D,OAAO,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC;IAC3B,CAAC;IAEO,IAAI,GAAG,CAAC,GAAY,EAAE,GAAa,EAAE,IAAgB,EAAQ,EAAE;QACrE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,qEAAqE;YACrE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,0DAA0D,EAAE,CAAC,CAAC;YAC7G,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,IAAI,EAAE,GAAG,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,CAAC;QAC9C,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,CAAC;gBACH,EAAE,GAAG,IAAA,6BAAe,EAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtE,CAAC;YAAC,MAAM,CAAC;gBACP,EAAE,GAAG,KAAK,CAAC;YACb,CAAC;QACH,CAAC;QACD,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QACD,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;IAEF,IAAI;QACF,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;CACF;AAlGD,sDAkGC"}
|
|
@@ -51,10 +51,19 @@ export declare class Scheduler {
|
|
|
51
51
|
constructor(config: SchedulerConfig, database?: Database | undefined, telemetry?: JobTelemetry | undefined, scheduleId?: string, admission?: JobAdmissionController | undefined, onFailure?: ((failure: JobFailure) => Promise<void> | void) | undefined);
|
|
52
52
|
start(job: () => Promise<void>): void;
|
|
53
53
|
/**
|
|
54
|
-
*
|
|
55
|
-
*
|
|
54
|
+
* Arm the scheduler for external/manual triggers (runNow) WITHOUT registering
|
|
55
|
+
* a cron task. Used in `external` scheduler mode where an authenticated HTTP
|
|
56
|
+
* trigger — not the in-process clock — fires runs.
|
|
56
57
|
*/
|
|
57
|
-
|
|
58
|
+
init(job: () => Promise<void>): void;
|
|
59
|
+
private arm;
|
|
60
|
+
/**
|
|
61
|
+
* Trigger one execution immediately (external HTTP trigger / catch-up /
|
|
62
|
+
* run-once). Honors the same guards as a cron firing. Returns false when the
|
|
63
|
+
* run is not admitted (already running/pending, stopped, maxed) so callers
|
|
64
|
+
* can report idempotent "already in progress" instead of assuming a start.
|
|
65
|
+
*/
|
|
66
|
+
runNow(): boolean;
|
|
58
67
|
private executeJob;
|
|
59
68
|
/**
|
|
60
69
|
* Execute the job. Item counting happens via JobTelemetry in executeJob,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Scheduler.d.ts","sourceRoot":"","sources":["../../src/scheduler/Scheduler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C;;;GAGG;AACH,eAAO,MAAM,2BAA2B,QAAiB,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,sFAAsF;IACtF,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IACrC,+FAA+F;IAC/F,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IACnD,gFAAgF;IAChF,aAAa,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,8DAA8D;AAC9D,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;CACvD;AAED,qBAAa,SAAS;IAYlB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IAhB7B,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,GAAG,CAAsC;IACjD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,mBAAmB,CAAa;IACxC,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,OAAO,CAAkB;gBAGd,MAAM,EAAE,eAAe,EACvB,QAAQ,CAAC,EAAE,QAAQ,YAAA,EACnB,SAAS,CAAC,EAAE,YAAY,YAAA,EACxB,UAAU,GAAE,MAAkB,EAC9B,SAAS,CAAC,EAAE,sBAAsB,YAAA,EAClC,SAAS,CAAC,GAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,aAAA;IAGrE,KAAK,CAAC,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"Scheduler.d.ts","sourceRoot":"","sources":["../../src/scheduler/Scheduler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C;;;GAGG;AACH,eAAO,MAAM,2BAA2B,QAAiB,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,sFAAsF;IACtF,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IACrC,+FAA+F;IAC/F,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IACnD,gFAAgF;IAChF,aAAa,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,8DAA8D;AAC9D,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;CACvD;AAED,qBAAa,SAAS;IAYlB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IAhB7B,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,GAAG,CAAsC;IACjD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,mBAAmB,CAAa;IACxC,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,OAAO,CAAkB;gBAGd,MAAM,EAAE,eAAe,EACvB,QAAQ,CAAC,EAAE,QAAQ,YAAA,EACnB,SAAS,CAAC,EAAE,YAAY,YAAA,EACxB,UAAU,GAAE,MAAkB,EAC9B,SAAS,CAAC,EAAE,sBAAsB,YAAA,EAClC,SAAS,CAAC,GAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,aAAA;IAGrE,KAAK,CAAC,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC;IAIrC;;;;OAIG;IACI,IAAI,CAAC,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC;IAIpC,OAAO,CAAC,GAAG;IAsCX;;;;;OAKG;IACI,MAAM,IAAI,OAAO;YAOV,UAAU;IA4NxB;;;;OAIG;YACW,mBAAmB;IAO1B,IAAI;IAgBJ,QAAQ;;;;;;;;;CAWhB"}
|
|
@@ -37,7 +37,18 @@ class Scheduler {
|
|
|
37
37
|
this.onFailure = onFailure;
|
|
38
38
|
}
|
|
39
39
|
start(job) {
|
|
40
|
-
|
|
40
|
+
this.arm(job, true);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Arm the scheduler for external/manual triggers (runNow) WITHOUT registering
|
|
44
|
+
* a cron task. Used in `external` scheduler mode where an authenticated HTTP
|
|
45
|
+
* trigger — not the in-process clock — fires runs.
|
|
46
|
+
*/
|
|
47
|
+
init(job) {
|
|
48
|
+
this.arm(job, false);
|
|
49
|
+
}
|
|
50
|
+
arm(job, registerCron) {
|
|
51
|
+
if (registerCron && !node_cron_1.default.validate(this.config.cron)) {
|
|
41
52
|
throw new Error(`Invalid cron expression: ${this.config.cron}`);
|
|
42
53
|
}
|
|
43
54
|
// Load initial execution count from database
|
|
@@ -47,7 +58,7 @@ class Scheduler {
|
|
|
47
58
|
this.consecutiveFailures = this.database.getConsecutiveFailures(this.scheduleId);
|
|
48
59
|
}
|
|
49
60
|
logger_1.logger.info('Scheduler initialised', {
|
|
50
|
-
cron: this.config.cron,
|
|
61
|
+
cron: registerCron ? this.config.cron : '(external trigger)',
|
|
51
62
|
timezone: this.config.timezone ?? 'system',
|
|
52
63
|
maxExecutions: this.config.maxExecutions ?? 'unlimited',
|
|
53
64
|
minInterval: this.config.minInterval ? `${this.config.minInterval}ms` : 'none',
|
|
@@ -57,21 +68,28 @@ class Scheduler {
|
|
|
57
68
|
currentConsecutiveFailures: this.consecutiveFailures,
|
|
58
69
|
scheduleId: this.scheduleId,
|
|
59
70
|
});
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
71
|
+
if (registerCron) {
|
|
72
|
+
this.task = node_cron_1.default.schedule(this.config.cron, async () => {
|
|
73
|
+
await this.executeJob(job);
|
|
74
|
+
}, {
|
|
75
|
+
timezone: this.config.timezone,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
65
78
|
this.job = job;
|
|
66
79
|
}
|
|
67
80
|
/**
|
|
68
|
-
* Trigger one execution immediately (
|
|
69
|
-
* Honors the same guards as a cron firing
|
|
81
|
+
* Trigger one execution immediately (external HTTP trigger / catch-up /
|
|
82
|
+
* run-once). Honors the same guards as a cron firing. Returns false when the
|
|
83
|
+
* run is not admitted (already running/pending, stopped, maxed) so callers
|
|
84
|
+
* can report idempotent "already in progress" instead of assuming a start.
|
|
70
85
|
*/
|
|
71
86
|
runNow() {
|
|
72
87
|
if (!this.job)
|
|
73
|
-
return;
|
|
88
|
+
return false;
|
|
89
|
+
if (this.running || this.pending || this.stopped)
|
|
90
|
+
return false;
|
|
74
91
|
void this.executeJob(this.job);
|
|
92
|
+
return true;
|
|
75
93
|
}
|
|
76
94
|
async executeJob(job) {
|
|
77
95
|
// Check if already running
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Scheduler.js","sourceRoot":"","sources":["../../src/scheduler/Scheduler.ts"],"names":[],"mappings":";;;;;;AAAA,0DAAgD;AAGhD,sCAAmC;AACnC,4CAAuD;AAGvD;;;GAGG;AACU,QAAA,2BAA2B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAiC1D,MAAa,SAAS;IAYD;IACA;IACA;IACA;IACA;IACA;IAhBX,IAAI,GAAyB,IAAI,CAAC;IAClC,GAAG,GAAiC,IAAI,CAAC;IACzC,OAAO,GAAG,KAAK,CAAC;IAChB,iBAAiB,GAAW,CAAC,CAAC;IAC9B,cAAc,GAAW,CAAC,CAAC;IAC3B,mBAAmB,GAAW,CAAC,CAAC;IAChC,aAAa,GAA0B,IAAI,CAAC;IAC5C,OAAO,GAAY,KAAK,CAAC;IACzB,OAAO,GAAY,KAAK,CAAC;IAEjC,YACmB,MAAuB,EACvB,QAAmB,EACnB,SAAwB,EACxB,aAAqB,SAAS,EAC9B,SAAkC,EAClC,SAAyD;QALzD,WAAM,GAAN,MAAM,CAAiB;QACvB,aAAQ,GAAR,QAAQ,CAAW;QACnB,cAAS,GAAT,SAAS,CAAe;QACxB,eAAU,GAAV,UAAU,CAAoB;QAC9B,cAAS,GAAT,SAAS,CAAyB;QAClC,cAAS,GAAT,SAAS,CAAgD;IACzE,CAAC;IAEG,KAAK,CAAC,GAAwB;QACnC,IAAI,CAAC,mBAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"Scheduler.js","sourceRoot":"","sources":["../../src/scheduler/Scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { ScheduleConfig, StandaloneConfig, TargetConfig } from '../config';
|
|
2
|
+
import { Database } from '../storage/Database';
|
|
3
|
+
import { CellStatus, SlotItemRecord, SlotRecord, SlotStatus } from '../storage/repositories/SlotRepository';
|
|
4
|
+
export interface SlotContext {
|
|
5
|
+
slotId: string;
|
|
6
|
+
slotName: string;
|
|
7
|
+
slotDate: string;
|
|
8
|
+
triggerSource: string;
|
|
9
|
+
}
|
|
10
|
+
export interface SlotCellSummary {
|
|
11
|
+
targetId: string;
|
|
12
|
+
status: CellStatus;
|
|
13
|
+
workId: string | null;
|
|
14
|
+
error?: string | null;
|
|
15
|
+
}
|
|
16
|
+
export interface SlotRunSummary {
|
|
17
|
+
scheduleId: string;
|
|
18
|
+
slotId: string;
|
|
19
|
+
status: SlotStatus;
|
|
20
|
+
alreadyCompleted: boolean;
|
|
21
|
+
cells: SlotCellSummary[];
|
|
22
|
+
}
|
|
23
|
+
/** Morning cron fires before noon; evening from noon onward (config tz). */
|
|
24
|
+
export declare function slotNameForNow(timezone: string | undefined): 'morning' | 'evening';
|
|
25
|
+
/** Today's date (YYYY-MM-DD) in the configured scheduler timezone. */
|
|
26
|
+
export declare function slotDateForNow(timezone: string | undefined): string;
|
|
27
|
+
/**
|
|
28
|
+
* Owns the Schedule Slot ledger for one scheduler run. Ensures duplicate
|
|
29
|
+
* triggers / restarts converge on one slot, completed cells are not re-run, and
|
|
30
|
+
* a selected work id stays locked across automatic retries.
|
|
31
|
+
*/
|
|
32
|
+
export declare class SlotCoordinator {
|
|
33
|
+
private readonly database;
|
|
34
|
+
constructor(database: Database);
|
|
35
|
+
/** Resolve + validate a requested slot against now (never trusts client date). */
|
|
36
|
+
resolveSlot(requested: string | undefined, config: StandaloneConfig): SlotContext | {
|
|
37
|
+
error: string;
|
|
38
|
+
status: number;
|
|
39
|
+
};
|
|
40
|
+
private primaryTimezone;
|
|
41
|
+
/** The targets that still need to run for this slot (skips terminal cells). */
|
|
42
|
+
pendingTargets(slotId: string, targets: TargetConfig[]): {
|
|
43
|
+
target: TargetConfig;
|
|
44
|
+
cell: SlotItemRecord;
|
|
45
|
+
}[];
|
|
46
|
+
/** Open (or resume) a slot and return whether the whole slot is already done. */
|
|
47
|
+
begin(slot: SlotContext, schedule: ScheduleConfig): {
|
|
48
|
+
slotRec: SlotRecord;
|
|
49
|
+
alreadyCompleted: boolean;
|
|
50
|
+
};
|
|
51
|
+
/** Lock the selected work for a cell (first selection wins; retries keep it). */
|
|
52
|
+
lockWork(slotId: string, targetId: string, workId: string, workType: string): void;
|
|
53
|
+
/** Record a cell's terminal state from the download/delivery outcome. */
|
|
54
|
+
markCell(slotId: string, targetId: string, status: CellStatus, error?: string): void;
|
|
55
|
+
/** Roll cell results up into the slot status and log a readable summary. */
|
|
56
|
+
finish(slot: SlotContext, schedule: ScheduleConfig, targets: TargetConfig[]): SlotRunSummary;
|
|
57
|
+
completedSummary(slotId: string, schedule: ScheduleConfig): SlotRunSummary;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=SlotCoordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SlotCoordinator.d.ts","sourceRoot":"","sources":["../../src/scheduler/SlotCoordinator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAG5G,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,UAAU,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAKlF;AAED,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CASnE;AAMD;;;;GAIG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,QAAQ;IAE/C,kFAAkF;IAClF,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,WAAW,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAwBrH,OAAO,CAAC,eAAe;IAIvB,+EAA+E;IAC/E,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG;QAAE,MAAM,EAAE,YAAY,CAAC;QAAC,IAAI,EAAE,cAAc,CAAA;KAAE,EAAE;IAWzG,iFAAiF;IACjF,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,GAAG;QAAE,OAAO,EAAE,UAAU,CAAC;QAAC,gBAAgB,EAAE,OAAO,CAAA;KAAE;IAiBtG,iFAAiF;IACjF,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKlF,yEAAyE;IACzE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAOpF,4EAA4E;IAC5E,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,cAAc;IA8B5F,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,cAAc;CAgB3E"}
|