@procedures/schedule 0.4.0 → 0.6.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.
Files changed (53) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +55 -5
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/cron.d.ts +36 -6
  5. package/dist/cron.d.ts.map +1 -1
  6. package/dist/cron.js +265 -41
  7. package/dist/cron.js.map +1 -1
  8. package/dist/errors.d.ts +4 -0
  9. package/dist/errors.d.ts.map +1 -1
  10. package/dist/errors.js.map +1 -1
  11. package/dist/index.d.ts +2 -2
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +2 -2
  14. package/dist/index.js.map +1 -1
  15. package/dist/module.d.ts +5 -0
  16. package/dist/module.d.ts.map +1 -1
  17. package/dist/module.js +8 -2
  18. package/dist/module.js.map +1 -1
  19. package/dist/procedures/schedule/add.d.ts +5 -2
  20. package/dist/procedures/schedule/add.d.ts.map +1 -1
  21. package/dist/procedures/schedule/add.js +15 -10
  22. package/dist/procedures/schedule/add.js.map +1 -1
  23. package/dist/procedures/schedule/list.js +1 -1
  24. package/dist/procedures/schedule/list.js.map +1 -1
  25. package/dist/procedures/schedule/next.d.ts +1 -1
  26. package/dist/procedures/schedule/next.d.ts.map +1 -1
  27. package/dist/procedures/schedule/next.js +2 -2
  28. package/dist/procedures/schedule/next.js.map +1 -1
  29. package/dist/programs.d.ts +3 -1
  30. package/dist/programs.d.ts.map +1 -1
  31. package/dist/programs.js.map +1 -1
  32. package/dist/scheduler.d.ts +9 -0
  33. package/dist/scheduler.d.ts.map +1 -1
  34. package/dist/scheduler.js +11 -6
  35. package/dist/scheduler.js.map +1 -1
  36. package/dist/store.d.ts +50 -5
  37. package/dist/store.d.ts.map +1 -1
  38. package/dist/store.js +161 -26
  39. package/dist/store.js.map +1 -1
  40. package/dist/types.d.ts +8 -4
  41. package/dist/types.d.ts.map +1 -1
  42. package/package.json +4 -4
  43. package/src/cron.ts +277 -48
  44. package/src/errors.ts +4 -0
  45. package/src/index.ts +10 -2
  46. package/src/module.ts +13 -2
  47. package/src/procedures/schedule/add.ts +15 -10
  48. package/src/procedures/schedule/list.ts +1 -1
  49. package/src/procedures/schedule/next.ts +3 -3
  50. package/src/programs.ts +3 -1
  51. package/src/scheduler.ts +16 -6
  52. package/src/store.ts +166 -24
  53. package/src/types.ts +8 -4
package/dist/store.js CHANGED
@@ -4,13 +4,27 @@
4
4
  * A host gives one store to the module of the procedures (`createScheduleModule({ store })`) and
5
5
  * the same store to its `Scheduler`. `update()` changes one schedule in one step, so the record of
6
6
  * a run does not lose a change of `schedule.add` that came at the same time.
7
+ *
8
+ * Two processes can share the file of a `FileScheduleStore`: a lock file next to it keeps their
9
+ * changes apart (see the comment of the class).
7
10
  */
8
- import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
11
+ import { mkdir, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
9
12
  import { dirname } from "node:path";
10
13
  import { randomBytes } from "node:crypto";
14
+ import { checkTimeZone } from "./cron.js";
11
15
  import { ScheduleError } from "./errors.js";
12
16
  const byId = (a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0);
13
17
  const isCount = (value) => typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
18
+ /** True for `utc`, `local` and an IANA name that `Intl` knows. */
19
+ function isTimeZone(timeZone) {
20
+ try {
21
+ checkTimeZone(timeZone);
22
+ return true;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
14
28
  /** The schedule of a record that came from a file: its shape is not trusted. */
15
29
  export function checkSchedule(value) {
16
30
  const record = value;
@@ -21,8 +35,9 @@ export function checkSchedule(value) {
21
35
  if (typeof record.cron !== "string" || typeof record.program !== "string" || record.program === "") {
22
36
  throw new ScheduleError("BAD_STORE", `The schedule ${record.id} needs a cron expression and a program`);
23
37
  }
24
- if (record.timeZone !== "utc" && record.timeZone !== "local")
25
- throw new ScheduleError("BAD_STORE", `The schedule ${record.id} needs the time zone utc or local`);
38
+ if (typeof record.timeZone !== "string" || !isTimeZone(record.timeZone)) {
39
+ throw new ScheduleError("BAD_STORE", `The schedule ${record.id} needs the time zone utc, local or an IANA name that Intl knows`);
40
+ }
26
41
  if (typeof record.createdAt !== "number" || !Number.isFinite(record.createdAt))
27
42
  throw new ScheduleError("BAD_STORE", `The schedule ${record.id} needs createdAt`);
28
43
  if (!isCount(record.runs) || !isCount(record.failures) || !isCount(record.skipped))
@@ -67,19 +82,52 @@ function isContention(error) {
67
82
  return process.platform === "win32" && (code === "EPERM" || code === "EACCES" || code === "EBUSY");
68
83
  }
69
84
  const pause = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
85
+ /** This function starts `operation` again while Windows holds the file for a moment: at most 20 times. */
86
+ async function retried(operation) {
87
+ for (let attempt = 1;; attempt++) {
88
+ try {
89
+ return await operation();
90
+ }
91
+ catch (error) {
92
+ if (attempt >= 20 || !isContention(error))
93
+ throw error;
94
+ await pause(10 * attempt);
95
+ }
96
+ }
97
+ }
98
+ /** This function removes a file. A file that does not exist is not an error. */
99
+ const removeFile = (path) => retried(() => rm(path, { force: true }));
100
+ /** The default age of a stale lock file: 30 seconds. */
101
+ export const DEFAULT_LOCK_STALE_MS = 30_000;
70
102
  /**
71
103
  * A store in one JSON file: `{ "schemaVersion": 1, "schedules": { "<id>": <Schedule> } }`. Each
72
104
  * operation reads the file again. A write goes through a temporary file and a rename, so a reader
73
- * never sees a part of a write. The writes of this process go one at a time. The store is for
74
- * one process: two processes on one file can lose a write.
105
+ * does not see a part of a write. The changes of this process go one at a time.
106
+ *
107
+ * Two processes can share the file. Each change holds a lock file next to it (`lockPath`):
108
+ * - The store makes the lock file with the flag `wx`. Only one process can make it.
109
+ * - Under the lock, the store reads the file again, changes it, writes it, and then removes the lock.
110
+ * - A lock file older than `staleMs` (default 30 seconds) is stale, and the store takes it over.
111
+ * - A store that waits for twice `staleMs` gives up with `LOCKED`.
112
+ * - The store removes only its own lock: the lock file holds a token of the store.
75
113
  */
76
114
  export class FileScheduleStore {
77
115
  path;
78
116
  kind = "file";
117
+ /** The lock file: the path of the store with `.lock`. */
118
+ lockPath;
119
+ staleMs;
79
120
  queue = Promise.resolve();
80
- /** @param path - The JSON file. The store makes it, and its folder, at the first write. */
81
- constructor(path) {
121
+ /**
122
+ * @param path - The JSON file. The store makes it, and its folder, at the first write.
123
+ * @param options - The age of a stale lock file.
124
+ */
125
+ constructor(path, options = {}) {
82
126
  this.path = path;
127
+ this.lockPath = `${path}.lock`;
128
+ this.staleMs = options.staleMs ?? DEFAULT_LOCK_STALE_MS;
129
+ if (!(this.staleMs > 0) || !Number.isFinite(this.staleMs))
130
+ throw new TypeError("FileScheduleStore: staleMs must be a number above 0");
83
131
  }
84
132
  async get(id) {
85
133
  return (await this.read()).schedules[id];
@@ -128,7 +176,7 @@ export class FileScheduleStore {
128
176
  async read() {
129
177
  let text;
130
178
  try {
131
- text = await readFile(this.path, "utf8");
179
+ text = await retried(() => readFile(this.path, "utf8"));
132
180
  }
133
181
  catch (error) {
134
182
  if (error.code === "ENOENT")
@@ -155,33 +203,120 @@ export class FileScheduleStore {
155
203
  }
156
204
  return { schemaVersion: 1, schedules };
157
205
  }
158
- /** One change of the file, after the changes before it. `edit` gives false for no change. */
206
+ /**
207
+ * One change of the file, after the changes before it, under the lock file. The read under the
208
+ * lock gets the changes of the other processes. `edit` gives false for no change.
209
+ */
159
210
  change(edit) {
160
211
  const run = this.queue.then(async () => {
161
- const file = await this.read();
162
- if (!edit(file))
163
- return;
164
- await mkdir(dirname(this.path), { recursive: true });
165
- const temporary = `${this.path}.${randomBytes(6).toString("hex")}.tmp`;
166
- await writeFile(temporary, JSON.stringify(file, null, 2) + "\n", "utf8");
167
- for (let attempt = 1;; attempt++) {
168
- try {
169
- await rename(temporary, this.path);
212
+ const token = await this.lock();
213
+ try {
214
+ const file = await this.read();
215
+ if (!edit(file))
170
216
  return;
171
- }
172
- catch (error) {
173
- if (attempt >= 20 || !isContention(error)) {
174
- await rm(temporary, { force: true });
175
- throw error;
176
- }
177
- await pause(10 * attempt);
178
- }
217
+ await this.write(file);
218
+ }
219
+ finally {
220
+ await this.unlock(token);
179
221
  }
180
222
  });
181
223
  // A failed change does not stop the next one
182
224
  this.queue = run.catch(() => undefined);
183
225
  return run;
184
226
  }
227
+ /** This method writes the file through a temporary file and a rename. */
228
+ async write(file) {
229
+ const temporary = `${this.path}.${randomBytes(6).toString("hex")}.tmp`;
230
+ await writeFile(temporary, JSON.stringify(file, null, 2) + "\n", "utf8");
231
+ try {
232
+ await retried(() => rename(temporary, this.path));
233
+ }
234
+ catch (error) {
235
+ await rm(temporary, { force: true });
236
+ throw error;
237
+ }
238
+ }
239
+ /**
240
+ * This method makes the lock file and gives its token. It waits while another store holds the
241
+ * lock, and it takes over a stale lock. After twice `staleMs`, it throws `LOCKED`.
242
+ */
243
+ async lock() {
244
+ const token = `${process.pid}:${randomBytes(8).toString("hex")}`;
245
+ const deadline = Date.now() + 2 * this.staleMs;
246
+ for (let attempt = 0;; attempt++) {
247
+ try {
248
+ await writeFile(this.lockPath, token, { encoding: "utf8", flag: "wx" });
249
+ return token;
250
+ }
251
+ catch (error) {
252
+ const code = error.code;
253
+ if (code === "ENOENT" && attempt === 0) {
254
+ // The folder of the store does not exist yet
255
+ await mkdir(dirname(this.lockPath), { recursive: true });
256
+ continue;
257
+ }
258
+ if (code !== "EEXIST" && !isContention(error))
259
+ throw error;
260
+ }
261
+ if (await this.breakStale())
262
+ continue;
263
+ if (Date.now() >= deadline) {
264
+ throw new ScheduleError("LOCKED", `The lock file ${this.lockPath} stays held: another process holds it for more than ${2 * this.staleMs} ms`);
265
+ }
266
+ // A short wait with a random part: two waiting processes do not try again at the same time
267
+ await pause(Math.min(50, 2 + attempt) + Math.random() * 5);
268
+ }
269
+ }
270
+ /** This method removes the lock file when it holds the token of this store. A lock that another store took over stays. */
271
+ async unlock(token) {
272
+ let content;
273
+ try {
274
+ content = await retried(() => readFile(this.lockPath, "utf8"));
275
+ }
276
+ catch {
277
+ return;
278
+ }
279
+ if (content === token)
280
+ await removeFile(this.lockPath);
281
+ }
282
+ /** True when the file exists and its last change is older than `staleMs`. */
283
+ async isStale(path) {
284
+ try {
285
+ return Date.now() - (await stat(path)).mtimeMs > this.staleMs;
286
+ }
287
+ catch {
288
+ return false;
289
+ }
290
+ }
291
+ /**
292
+ * This method removes a stale lock file, and gives true then. A second lock file (`.lock.break`)
293
+ * lets one store at a time examine and remove a stale lock. A second store thus finds the new
294
+ * lock of the first store, not the stale lock, and does not remove it.
295
+ */
296
+ async breakStale() {
297
+ if (!(await this.isStale(this.lockPath)))
298
+ return false;
299
+ const breaker = `${this.lockPath}.break`;
300
+ try {
301
+ await writeFile(breaker, String(process.pid), { encoding: "utf8", flag: "wx" });
302
+ }
303
+ catch {
304
+ // Another store examines the lock now. The breaker of a process that stopped is stale too.
305
+ if (await this.isStale(breaker))
306
+ await removeFile(breaker).catch(() => undefined);
307
+ return false;
308
+ }
309
+ try {
310
+ // The examination again, under the breaker: another store can have taken over the lock
311
+ if (!(await this.isStale(this.lockPath)))
312
+ return false;
313
+ await removeFile(this.lockPath);
314
+ return true;
315
+ }
316
+ finally {
317
+ await removeFile(breaker).catch(() => undefined);
318
+ }
319
+ }
185
320
  }
186
321
  /** The store of the default module and of a `Scheduler` without a store: in memory, one for the process. */
187
322
  export const defaultScheduleStore = new MemoryScheduleStore();
package/dist/store.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -5,8 +5,11 @@
5
5
  * `module.ts`: an exported schema needs a written type (isolatedDeclarations).
6
6
  */
7
7
  import type { PermittedEffects } from "@procedures/client";
8
- /** The time zone of a cron expression: the UTC time, or the local time of the host. */
9
- export type ScheduleTimeZone = "utc" | "local";
8
+ /**
9
+ * The time zone of a cron expression: `utc`, `local` (the time zone of the host), or an IANA name
10
+ * that `Intl` knows, for example `Europe/Berlin`.
11
+ */
12
+ export type ScheduleTimeZone = "utc" | "local" | (string & {});
10
13
  /** The last run of a schedule. */
11
14
  export interface ScheduleRun {
12
15
  /** The wall time of the start, in milliseconds since 1970. */
@@ -30,6 +33,7 @@ export interface Schedule {
30
33
  program: string;
31
34
  /** The input of the program. */
32
35
  input?: unknown;
36
+ /** The time zone of the expression: `utc`, `local` or an IANA name. */
33
37
  timeZone: ScheduleTimeZone;
34
38
  /** When the schedule was added, in milliseconds since 1970. A schedule starts no run for a time before it. */
35
39
  createdAt: number;
@@ -61,7 +65,7 @@ export interface ScheduleAddInput {
61
65
  /** The dotted key of the stored program. */
62
66
  program: string;
63
67
  input?: unknown;
64
- /** The time zone of the expression. The default is `local`. */
68
+ /** The time zone of the expression: `utc`, `local` or an IANA name such as `Europe/Berlin`. The default is `local`. */
65
69
  timeZone?: ScheduleTimeZone | undefined;
66
70
  /** True: replace a schedule of the same name. The default is false: a second schedule of a name is an error. */
67
71
  replace?: boolean | undefined;
@@ -90,7 +94,7 @@ export interface ScheduleNextInput {
90
94
  count?: number | undefined;
91
95
  /** The times come after this time: an ISO text. The default is now. */
92
96
  after?: string | undefined;
93
- /** The time zone of the expression. The default is `local`. */
97
+ /** The time zone of the expression: `utc`, `local` or an IANA name such as `Europe/Berlin`. The default is `local`. */
94
98
  timeZone?: ScheduleTimeZone | undefined;
95
99
  }
96
100
  export interface ScheduleNextOutput {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,uFAAuF;AACvF,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,OAAO,CAAC;AAE/C,kCAAkC;AAClC,MAAM,WAAW,WAAW;IAC1B,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,SAAS,GAAG,SAAS,CAAC;IAC/B,0EAA0E;IAC1E,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CACpE;AAED,yFAAyF;AACzF,MAAM,WAAW,QAAQ;IACvB,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,8GAA8G;IAC9G,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,gBAAgB,CAAA;KAAE,GAAG,SAAS,CAAC;IAC7E,OAAO,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAClC,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,yGAAyG;IACzG,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,gEAAgE;AAChE,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C,oHAAoH;IACpH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAMD,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACxC,gHAAgH;IAChH,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,YAAY,CAAC;CACxB;AAMD,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,qCAAqC;IACrC,SAAS,EAAE,YAAY,EAAE,CAAC;CAC3B;AAMD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,oBAAoB;IACnC,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;CAClB;AAMD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;CACzC;AAED,MAAM,WAAW,kBAAkB;IACjC,mJAAmJ;IACnJ,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,OAAO,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAE/D,kCAAkC;AAClC,MAAM,WAAW,WAAW;IAC1B,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,SAAS,GAAG,SAAS,CAAC;IAC/B,0EAA0E;IAC1E,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CACpE;AAED,yFAAyF;AACzF,MAAM,WAAW,QAAQ;IACvB,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uEAAuE;IACvE,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,8GAA8G;IAC9G,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,gBAAgB,CAAA;KAAE,GAAG,SAAS,CAAC;IAC7E,OAAO,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAClC,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,yGAAyG;IACzG,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,gEAAgE;AAChE,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C,oHAAoH;IACpH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAMD,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uHAAuH;IACvH,QAAQ,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACxC,gHAAgH;IAChH,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,YAAY,CAAC;CACxB;AAMD,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,qCAAqC;IACrC,SAAS,EAAE,YAAY,EAAE,CAAC;CAC3B;AAMD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,oBAAoB;IACnC,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;CAClB;AAMD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,uHAAuH;IACvH,QAAQ,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;CACzC;AAED,MAAM,WAAW,kBAAkB;IACjC,mJAAmJ;IACnJ,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package",
3
3
  "name": "@procedures/schedule",
4
- "version": "0.4.0",
4
+ "version": "0.6.0",
5
5
  "description": "A cron for stored programs: schedules as procedures, and a scheduler that a host starts, with an injectable clock and no overlapping runs.",
6
6
  "keywords": [
7
7
  "procedures",
@@ -52,7 +52,7 @@
52
52
  ],
53
53
  "devDependencies": {
54
54
  "@mark1russell7/cue": "^1.0.0",
55
- "@mark1russell7/service": "^0.4.0",
55
+ "@mark1russell7/service": "^0.4.1",
56
56
  "typescript": "^7.0.2",
57
57
  "vitest": "^5.0.3"
58
58
  },
@@ -63,8 +63,8 @@
63
63
  "procedures": "./dist/register.js"
64
64
  },
65
65
  "dependencies": {
66
- "@procedures/client": "0.4.0",
67
- "@procedures/store": "0.4.0",
66
+ "@procedures/client": "0.6.0",
67
+ "@procedures/store": "0.6.0",
68
68
  "zod": "^4.6.5"
69
69
  },
70
70
  "publishConfig": {