@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 drain();
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 drain();
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,GAClE,MAAM,mBAAmB,CAAC;AAE3B,IAAI,IAAY,CAAC;AACjB,IAAI,IAA4B,CAAC;AACjC,IAAI,KAAgC,CAAC;AACrC,IAAI,KAA0B,CAAC;AAE/B,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;AAC9B,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,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QAElB,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAClC,MAAM,KAAK,EAAE,CAAC;QAEd,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,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QAElB,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAAC,MAAM,KAAK,EAAE,CAAC;QAC7C,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAAC,MAAM,KAAK,EAAE,CAAC;QAE7C,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"}
1
+ {"version":3,"file":"scheduler-service-tick-27.test.js","sourceRoot":"","sources":["../../src/__tests__/scheduler-service-tick-27.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mclawnet/scheduler",
3
- "version": "0.1.0",
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.5",
22
- "@mclawnet/task": "0.1.0"
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",