@mclawnet/scheduler 0.1.0 → 0.1.2
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.
|
@@ -6,11 +6,12 @@ import FakeTimers from "@sinonjs/fake-timers";
|
|
|
6
6
|
import { Cron } from "croner";
|
|
7
7
|
import { SchedulerService } from "../scheduler-service.js";
|
|
8
8
|
import { JsonScheduleRepository } from "../json-schedule-repository.js";
|
|
9
|
-
import { makeDeferredExecutor, makeImmediateExecutor, sample, drainFactory, } from "./tick-helpers.js";
|
|
9
|
+
import { makeDeferredExecutor, makeImmediateExecutor, sample, drainFactory, drainUntilFactory, } from "./tick-helpers.js";
|
|
10
10
|
let home;
|
|
11
11
|
let repo;
|
|
12
12
|
let clock;
|
|
13
13
|
let drain;
|
|
14
|
+
let drainUntil;
|
|
14
15
|
beforeEach(() => {
|
|
15
16
|
home = mkdtempSync(join(tmpdir(), "sched-tick-"));
|
|
16
17
|
repo = new JsonScheduleRepository({ home });
|
|
@@ -20,6 +21,7 @@ beforeEach(() => {
|
|
|
20
21
|
advanceTimeDelta: 20,
|
|
21
22
|
});
|
|
22
23
|
drain = drainFactory(clock);
|
|
24
|
+
drainUntil = drainUntilFactory(clock);
|
|
23
25
|
});
|
|
24
26
|
afterEach(() => {
|
|
25
27
|
clock.uninstall();
|
|
@@ -32,9 +34,16 @@ describe("SchedulerService.tick — lastRunAt + nextRunAt persistence (Task 2.7)
|
|
|
32
34
|
oneshot: exec,
|
|
33
35
|
swarm: makeImmediateExecutor({ exitCode: 0 }),
|
|
34
36
|
});
|
|
37
|
+
let changeCount = 0;
|
|
38
|
+
svc.events.on("change", () => { changeCount += 1; });
|
|
35
39
|
await svc.start();
|
|
40
|
+
// Cron is */5 — one tick advances 5 minutes = exactly one cron boundary.
|
|
41
|
+
// Wait for the post-tick `change` event so the lastRunAt/nextRunAt write
|
|
42
|
+
// (proper-lockfile retry chain) has actually flushed before we reload.
|
|
43
|
+
// Without this, slow CI runners can land on the assertion before the file
|
|
44
|
+
// is rewritten and read back `undefined`.
|
|
36
45
|
await clock.tickAsync(5 * 60_000);
|
|
37
|
-
await
|
|
46
|
+
await drainUntil(() => changeCount >= 1);
|
|
38
47
|
const reloaded = await repo.getById(s.id);
|
|
39
48
|
expect(reloaded?.lastRunAt).toBeTruthy();
|
|
40
49
|
expect(reloaded?.nextRunAt).toBeTruthy();
|
|
@@ -51,11 +60,18 @@ describe("SchedulerService.tick — lastRunAt + nextRunAt persistence (Task 2.7)
|
|
|
51
60
|
oneshot: exec,
|
|
52
61
|
swarm: makeImmediateExecutor({ exitCode: 0 }),
|
|
53
62
|
});
|
|
63
|
+
let changeCount = 0;
|
|
64
|
+
svc.events.on("change", () => { changeCount += 1; });
|
|
54
65
|
await svc.start();
|
|
66
|
+
// First minute starts the deferred executor (no `change` emit until it
|
|
67
|
+
// resolves — only `run`). Second minute hits single-flight and is
|
|
68
|
+
// cancelled, which fires `commitTickPatch` → `change`. We only need to
|
|
69
|
+
// wait for that one cancellation-triggered persistence to land before
|
|
70
|
+
// reading lastRunAt/nextRunAt back from disk.
|
|
55
71
|
await clock.tickAsync(60_000);
|
|
56
72
|
await drain();
|
|
57
73
|
await clock.tickAsync(60_000);
|
|
58
|
-
await
|
|
74
|
+
await drainUntil(() => changeCount >= 1);
|
|
59
75
|
const reloaded = await repo.getById(s.id);
|
|
60
76
|
expect(reloaded?.lastRunAt).toBeTruthy();
|
|
61
77
|
expect(reloaded?.nextRunAt).toBeTruthy();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler-service-tick-27.test.js","sourceRoot":"","sources":["../../src/__tests__/scheduler-service-tick-27.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,UAAU,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EACL,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"scheduler-service-tick-27.test.js","sourceRoot":"","sources":["../../src/__tests__/scheduler-service-tick-27.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,UAAU,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EACL,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,EAAE,YAAY,EAAE,iBAAiB,GACrF,MAAM,mBAAmB,CAAC;AAE3B,IAAI,IAAY,CAAC;AACjB,IAAI,IAA4B,CAAC;AACjC,IAAI,KAAgC,CAAC;AACrC,IAAI,KAA0B,CAAC;AAC/B,IAAI,UAAkD,CAAC;AAEvD,UAAU,CAAC,GAAG,EAAE;IACd,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;IAClD,IAAI,GAAG,IAAI,sBAAsB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC;QACzB,GAAG,EAAE,IAAI,IAAI,CAAC,0BAA0B,CAAC;QACzC,iBAAiB,EAAE,IAAI;QACvB,gBAAgB,EAAE,EAAE;KACrB,CAAC,CAAC;IACH,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAC5B,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,KAAK,CAAC,SAAS,EAAE,CAAC;AACpB,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sEAAsE,EAAE,GAAG,EAAE;IACpF,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACvH,MAAM,IAAI,GAAG,qBAAqB,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,gBAAgB,CAAC,IAAI,EAAE;YACrC,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,qBAAqB,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;SAC9C,CAAC,CAAC;QACH,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QAElB,yEAAyE;QACzE,yEAAyE;QACzE,uEAAuE;QACvE,0EAA0E;QAC1E,0CAA0C;QAC1C,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAClC,MAAM,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;QAEzC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,UAAU,EAAE,CAAC;QACzC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,UAAU,EAAE,CAAC;QAEzC,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;aAC5E,OAAO,CAAC,IAAI,IAAI,CAAC,QAAS,CAAC,SAAU,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,YAAa,CAAC,WAAW,EAAE,CAAC,CAAC;QAE9D,MAAM,CAAC,IAAI,IAAI,CAAC,QAAS,CAAC,SAAU,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,eAAe,CAC9D,IAAI,IAAI,CAAC,QAAS,CAAC,SAAU,CAAC,CAAC,OAAO,EAAE,CACzC,CAAC;QAEF,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,IAAI,gBAAgB,CAAC,IAAI,EAAE;YACrC,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,qBAAqB,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;SAC9C,CAAC,CAAC;QACH,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QAElB,uEAAuE;QACvE,kEAAkE;QAClE,uEAAuE;QACvE,sEAAsE;QACtE,8CAA8C;QAC9C,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAAC,MAAM,KAAK,EAAE,CAAC;QAC7C,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAAC,MAAM,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;QAExE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,UAAU,EAAE,CAAC;QACzC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,UAAU,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAS,CAAC,SAAU,CAAC,CAAC,OAAO,EAAE,CAAC;aAC7C,eAAe,CAAC,IAAI,IAAI,CAAC,QAAS,CAAC,SAAU,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAE7D,IAAI,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,KAAK,EAAE,CAAC;QACd,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mclawnet/scheduler",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"croner": "^10.0.1",
|
|
20
20
|
"ulid": "^2.3.0",
|
|
21
|
-
"@mclawnet/logger": "0.1.
|
|
22
|
-
"@mclawnet/task": "0.1.
|
|
21
|
+
"@mclawnet/logger": "0.1.6",
|
|
22
|
+
"@mclawnet/task": "0.1.1"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@sinonjs/fake-timers": "^11.2.2",
|