@zudojs/scheduler 0.0.1

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 (128) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +41 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/index.d.ts +40 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +49 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/scheduler/clock/index.d.ts +3 -0
  9. package/dist/scheduler/clock/index.d.ts.map +1 -0
  10. package/dist/scheduler/clock/index.js +2 -0
  11. package/dist/scheduler/clock/index.js.map +1 -0
  12. package/dist/scheduler/clock/schedulerClock.type.d.ts +21 -0
  13. package/dist/scheduler/clock/schedulerClock.type.d.ts.map +1 -0
  14. package/dist/scheduler/clock/schedulerClock.type.js +18 -0
  15. package/dist/scheduler/clock/schedulerClock.type.js.map +1 -0
  16. package/dist/scheduler/constants/index.d.ts +2 -0
  17. package/dist/scheduler/constants/index.d.ts.map +1 -0
  18. package/dist/scheduler/constants/index.js +2 -0
  19. package/dist/scheduler/constants/index.js.map +1 -0
  20. package/dist/scheduler/constants/schedulerConstants.core.d.ts +52 -0
  21. package/dist/scheduler/constants/schedulerConstants.core.d.ts.map +1 -0
  22. package/dist/scheduler/constants/schedulerConstants.core.js +50 -0
  23. package/dist/scheduler/constants/schedulerConstants.core.js.map +1 -0
  24. package/dist/scheduler/duration/duration.parser.d.ts +11 -0
  25. package/dist/scheduler/duration/duration.parser.d.ts.map +1 -0
  26. package/dist/scheduler/duration/duration.parser.js +31 -0
  27. package/dist/scheduler/duration/duration.parser.js.map +1 -0
  28. package/dist/scheduler/duration/index.d.ts +2 -0
  29. package/dist/scheduler/duration/index.d.ts.map +1 -0
  30. package/dist/scheduler/duration/index.js +2 -0
  31. package/dist/scheduler/duration/index.js.map +1 -0
  32. package/dist/scheduler/errors/index.d.ts +3 -0
  33. package/dist/scheduler/errors/index.d.ts.map +1 -0
  34. package/dist/scheduler/errors/index.js +2 -0
  35. package/dist/scheduler/errors/index.js.map +1 -0
  36. package/dist/scheduler/errors/scheduler.errors.d.ts +10 -0
  37. package/dist/scheduler/errors/scheduler.errors.d.ts.map +1 -0
  38. package/dist/scheduler/errors/scheduler.errors.js +9 -0
  39. package/dist/scheduler/errors/scheduler.errors.js.map +1 -0
  40. package/dist/scheduler/executor/index.d.ts +2 -0
  41. package/dist/scheduler/executor/index.d.ts.map +1 -0
  42. package/dist/scheduler/executor/index.js +2 -0
  43. package/dist/scheduler/executor/index.js.map +1 -0
  44. package/dist/scheduler/executor/jobExecutor.core.d.ts +19 -0
  45. package/dist/scheduler/executor/jobExecutor.core.d.ts.map +1 -0
  46. package/dist/scheduler/executor/jobExecutor.core.js +50 -0
  47. package/dist/scheduler/executor/jobExecutor.core.js.map +1 -0
  48. package/dist/scheduler/job/index.d.ts +7 -0
  49. package/dist/scheduler/job/index.d.ts.map +1 -0
  50. package/dist/scheduler/job/index.js +3 -0
  51. package/dist/scheduler/job/index.js.map +1 -0
  52. package/dist/scheduler/job/jobContext.type.d.ts +17 -0
  53. package/dist/scheduler/job/jobContext.type.d.ts.map +1 -0
  54. package/dist/scheduler/job/jobContext.type.js +15 -0
  55. package/dist/scheduler/job/jobContext.type.js.map +1 -0
  56. package/dist/scheduler/job/jobDefinition.type.d.ts +16 -0
  57. package/dist/scheduler/job/jobDefinition.type.d.ts.map +1 -0
  58. package/dist/scheduler/job/jobDefinition.type.js +12 -0
  59. package/dist/scheduler/job/jobDefinition.type.js.map +1 -0
  60. package/dist/scheduler/job/jobHandler.type.d.ts +6 -0
  61. package/dist/scheduler/job/jobHandler.type.d.ts.map +1 -0
  62. package/dist/scheduler/job/jobHandler.type.js +2 -0
  63. package/dist/scheduler/job/jobHandler.type.js.map +1 -0
  64. package/dist/scheduler/job/jobOptions.type.d.ts +25 -0
  65. package/dist/scheduler/job/jobOptions.type.d.ts.map +1 -0
  66. package/dist/scheduler/job/jobOptions.type.js +2 -0
  67. package/dist/scheduler/job/jobOptions.type.js.map +1 -0
  68. package/dist/scheduler/priorityQueue/index.d.ts +2 -0
  69. package/dist/scheduler/priorityQueue/index.d.ts.map +1 -0
  70. package/dist/scheduler/priorityQueue/index.js +2 -0
  71. package/dist/scheduler/priorityQueue/index.js.map +1 -0
  72. package/dist/scheduler/priorityQueue/schedulerPriorityQueue.core.d.ts +46 -0
  73. package/dist/scheduler/priorityQueue/schedulerPriorityQueue.core.d.ts.map +1 -0
  74. package/dist/scheduler/priorityQueue/schedulerPriorityQueue.core.js +121 -0
  75. package/dist/scheduler/priorityQueue/schedulerPriorityQueue.core.js.map +1 -0
  76. package/dist/scheduler/registry/index.d.ts +2 -0
  77. package/dist/scheduler/registry/index.d.ts.map +1 -0
  78. package/dist/scheduler/registry/index.js +2 -0
  79. package/dist/scheduler/registry/index.js.map +1 -0
  80. package/dist/scheduler/registry/jobRegistry.core.d.ts +32 -0
  81. package/dist/scheduler/registry/jobRegistry.core.d.ts.map +1 -0
  82. package/dist/scheduler/registry/jobRegistry.core.js +52 -0
  83. package/dist/scheduler/registry/jobRegistry.core.js.map +1 -0
  84. package/dist/scheduler/schedule/index.d.ts +4 -0
  85. package/dist/scheduler/schedule/index.d.ts.map +1 -0
  86. package/dist/scheduler/schedule/index.js +2 -0
  87. package/dist/scheduler/schedule/index.js.map +1 -0
  88. package/dist/scheduler/schedule/schedule.type.d.ts +24 -0
  89. package/dist/scheduler/schedule/schedule.type.d.ts.map +1 -0
  90. package/dist/scheduler/schedule/schedule.type.js +14 -0
  91. package/dist/scheduler/schedule/schedule.type.js.map +1 -0
  92. package/dist/scheduler/schedule/scheduleOptions.type.d.ts +10 -0
  93. package/dist/scheduler/schedule/scheduleOptions.type.d.ts.map +1 -0
  94. package/dist/scheduler/schedule/scheduleOptions.type.js +2 -0
  95. package/dist/scheduler/schedule/scheduleOptions.type.js.map +1 -0
  96. package/dist/scheduler/scheduleHandle/index.d.ts +3 -0
  97. package/dist/scheduler/scheduleHandle/index.d.ts.map +1 -0
  98. package/dist/scheduler/scheduleHandle/index.js +2 -0
  99. package/dist/scheduler/scheduleHandle/index.js.map +1 -0
  100. package/dist/scheduler/scheduleHandle/scheduleHandle.type.d.ts +26 -0
  101. package/dist/scheduler/scheduleHandle/scheduleHandle.type.d.ts.map +1 -0
  102. package/dist/scheduler/scheduleHandle/scheduleHandle.type.js +29 -0
  103. package/dist/scheduler/scheduleHandle/scheduleHandle.type.js.map +1 -0
  104. package/dist/scheduler/scheduler.core.d.ts +64 -0
  105. package/dist/scheduler/scheduler.core.d.ts.map +1 -0
  106. package/dist/scheduler/scheduler.core.js +164 -0
  107. package/dist/scheduler/scheduler.core.js.map +1 -0
  108. package/dist/scheduler/trigger/index.d.ts +3 -0
  109. package/dist/scheduler/trigger/index.d.ts.map +1 -0
  110. package/dist/scheduler/trigger/index.js +2 -0
  111. package/dist/scheduler/trigger/index.js.map +1 -0
  112. package/dist/scheduler/trigger/schedulerTrigger.core.d.ts +35 -0
  113. package/dist/scheduler/trigger/schedulerTrigger.core.d.ts.map +1 -0
  114. package/dist/scheduler/trigger/schedulerTrigger.core.js +54 -0
  115. package/dist/scheduler/trigger/schedulerTrigger.core.js.map +1 -0
  116. package/dist/scheduler/trigger/trigger.type.d.ts +12 -0
  117. package/dist/scheduler/trigger/trigger.type.d.ts.map +1 -0
  118. package/dist/scheduler/trigger/trigger.type.js +7 -0
  119. package/dist/scheduler/trigger/trigger.type.js.map +1 -0
  120. package/dist/scheduler/types/index.d.ts +2 -0
  121. package/dist/scheduler/types/index.d.ts.map +1 -0
  122. package/dist/scheduler/types/index.js +2 -0
  123. package/dist/scheduler/types/index.js.map +1 -0
  124. package/dist/scheduler/types/schedulerTypes.core.d.ts +146 -0
  125. package/dist/scheduler/types/schedulerTypes.core.d.ts.map +1 -0
  126. package/dist/scheduler/types/schedulerTypes.core.js +7 -0
  127. package/dist/scheduler/types/schedulerTypes.core.js.map +1 -0
  128. package/package.json +52 -0
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Priority queue using a min heap for scheduling.
3
+ *
4
+ * Provides O(log n) insertion and removal, and O(1) peek.
5
+ */
6
+ export class PriorityQueue {
7
+ heap = [];
8
+ /**
9
+ * Inserts a schedule into the priority queue.
10
+ */
11
+ enqueue(schedule) {
12
+ this.heap.push(schedule);
13
+ this.bubbleUp(this.heap.length - 1);
14
+ }
15
+ /**
16
+ * Removes and returns the earliest schedule.
17
+ */
18
+ dequeue() {
19
+ if (this.heap.length === 0) {
20
+ return undefined;
21
+ }
22
+ const top = this.heap[0];
23
+ const last = this.heap.pop();
24
+ if (this.heap.length > 0 && last !== undefined) {
25
+ this.heap[0] = last;
26
+ this.sinkDown(0);
27
+ }
28
+ return top;
29
+ }
30
+ /**
31
+ * Returns the earliest schedule without removing it.
32
+ */
33
+ peek() {
34
+ if (this.heap.length === 0) {
35
+ return undefined;
36
+ }
37
+ return this.heap[0];
38
+ }
39
+ /**
40
+ * Removes a schedule by ID.
41
+ */
42
+ remove(id) {
43
+ const index = this.heap.findIndex((schedule) => schedule.id === id);
44
+ if (index === -1) {
45
+ return false;
46
+ }
47
+ const last = this.heap.pop();
48
+ if (index < this.heap.length && last !== undefined) {
49
+ this.heap[index] = last;
50
+ this.bubbleUp(index);
51
+ this.sinkDown(index);
52
+ }
53
+ return true;
54
+ }
55
+ /**
56
+ * Returns the number of schedules in the queue.
57
+ */
58
+ get size() {
59
+ return this.heap.length;
60
+ }
61
+ /**
62
+ * Determines whether the queue is empty.
63
+ */
64
+ get isEmpty() {
65
+ return this.heap.length === 0;
66
+ }
67
+ /**
68
+ * Clears all schedules from the queue.
69
+ */
70
+ clear() {
71
+ this.heap.length = 0;
72
+ }
73
+ /**
74
+ * Bubble up an element to maintain heap property.
75
+ */
76
+ bubbleUp(index) {
77
+ while (index > 0) {
78
+ const parentIndex = Math.floor((index - 1) / 2);
79
+ const parent = this.heap[parentIndex];
80
+ const current = this.heap[index];
81
+ if (current.nextRunAt.getTime() < parent.nextRunAt.getTime()) {
82
+ [this.heap[parentIndex], this.heap[index]] = [current, parent];
83
+ index = parentIndex;
84
+ }
85
+ else {
86
+ break;
87
+ }
88
+ }
89
+ }
90
+ /**
91
+ * Sink down an element to maintain heap property.
92
+ */
93
+ sinkDown(index) {
94
+ while (true) {
95
+ let smallest = index;
96
+ const left = 2 * index + 1;
97
+ const right = 2 * index + 2;
98
+ if (left < this.heap.length &&
99
+ this.heap[left].nextRunAt.getTime() <
100
+ this.heap[smallest].nextRunAt.getTime()) {
101
+ smallest = left;
102
+ }
103
+ if (right < this.heap.length &&
104
+ this.heap[right].nextRunAt.getTime() <
105
+ this.heap[smallest].nextRunAt.getTime()) {
106
+ smallest = right;
107
+ }
108
+ if (smallest !== index) {
109
+ [this.heap[smallest], this.heap[index]] = [
110
+ this.heap[index],
111
+ this.heap[smallest],
112
+ ];
113
+ index = smallest;
114
+ }
115
+ else {
116
+ break;
117
+ }
118
+ }
119
+ }
120
+ }
121
+ //# sourceMappingURL=schedulerPriorityQueue.core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedulerPriorityQueue.core.js","sourceRoot":"","sources":["../../../src/scheduler/priorityQueue/schedulerPriorityQueue.core.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,aAAa;IACP,IAAI,GAAe,EAAE,CAAC;IAEvC;;OAEG;IACH,OAAO,CAAC,QAAkB;QACxB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/C,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,EAAU;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACnD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACvB,CAAC;IAED;;OAEG;IACK,QAAQ,CAAC,KAAa;QAC5B,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC;YACjB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAE,CAAC;YACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC;YAElC,IAAI,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC7D,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC/D,KAAK,GAAG,WAAW,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,QAAQ,CAAC,KAAa;QAC5B,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;YAC3B,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;YAE5B,IACE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM;gBACvB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAE,CAAC,SAAS,CAAC,OAAO,EAAE;oBAClC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAC1C,CAAC;gBACD,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;YAED,IACE,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM;gBACxB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC,SAAS,CAAC,OAAO,EAAE;oBACnC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAC1C,CAAC;gBACD,QAAQ,GAAG,KAAK,CAAC;YACnB,CAAC;YAED,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;gBACvB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAE,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC,GAAG;oBAC1C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAE;oBACjB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAE;iBACrB,CAAC;gBACF,KAAK,GAAG,QAAQ,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export { JobRegistry } from "./jobRegistry.core.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scheduler/registry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { JobRegistry } from "./jobRegistry.core.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scheduler/registry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { JobDefinition } from "../job/jobDefinition.type.js";
2
+ /**
3
+ * Registry for job definitions.
4
+ */
5
+ export declare class JobRegistry {
6
+ private readonly jobs;
7
+ /**
8
+ * Registers a job definition.
9
+ */
10
+ register(job: JobDefinition): void;
11
+ /**
12
+ * Retrieves a job definition by ID.
13
+ */
14
+ get(id: string): JobDefinition | undefined;
15
+ /**
16
+ * Determines whether a job is registered.
17
+ */
18
+ has(id: string): boolean;
19
+ /**
20
+ * Returns all registered job IDs.
21
+ */
22
+ list(): readonly string[];
23
+ /**
24
+ * Unregisters a job.
25
+ */
26
+ unregister(id: string): boolean;
27
+ /**
28
+ * Clears all registered jobs.
29
+ */
30
+ clear(): void;
31
+ }
32
+ //# sourceMappingURL=jobRegistry.core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobRegistry.core.d.ts","sourceRoot":"","sources":["../../../src/scheduler/registry/jobRegistry.core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AASlE;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoC;IAEzD;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAWjC;IAED;;OAEG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEzC;IAED;;OAEG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEvB;IAED;;OAEG;IACH,IAAI,IAAI,SAAS,MAAM,EAAE,CAExB;IAED;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE9B;IAED;;OAEG;IACH,KAAK,IAAI,IAAI,CAEZ;CACF"}
@@ -0,0 +1,52 @@
1
+ import { SchedulerJobAlreadyExistsError, SchedulerJobNotFoundError, } from "../errors/scheduler.errors.js";
2
+ import { MAX_JOBS } from "../constants/schedulerConstants.core.js";
3
+ /**
4
+ * Registry for job definitions.
5
+ */
6
+ export class JobRegistry {
7
+ jobs = new Map();
8
+ /**
9
+ * Registers a job definition.
10
+ */
11
+ register(job) {
12
+ if (this.jobs.size >= MAX_JOBS) {
13
+ throw new Error(`Maximum number of jobs (${MAX_JOBS}) exceeded.`);
14
+ }
15
+ const existing = this.jobs.get(job.id);
16
+ if (existing !== undefined) {
17
+ throw new SchedulerJobAlreadyExistsError(job.id);
18
+ }
19
+ this.jobs.set(job.id, Object.freeze(job));
20
+ }
21
+ /**
22
+ * Retrieves a job definition by ID.
23
+ */
24
+ get(id) {
25
+ return this.jobs.get(id);
26
+ }
27
+ /**
28
+ * Determines whether a job is registered.
29
+ */
30
+ has(id) {
31
+ return this.jobs.has(id);
32
+ }
33
+ /**
34
+ * Returns all registered job IDs.
35
+ */
36
+ list() {
37
+ return Array.from(this.jobs.keys());
38
+ }
39
+ /**
40
+ * Unregisters a job.
41
+ */
42
+ unregister(id) {
43
+ return this.jobs.delete(id);
44
+ }
45
+ /**
46
+ * Clears all registered jobs.
47
+ */
48
+ clear() {
49
+ this.jobs.clear();
50
+ }
51
+ }
52
+ //# sourceMappingURL=jobRegistry.core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobRegistry.core.js","sourceRoot":"","sources":["../../../src/scheduler/registry/jobRegistry.core.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,yCAAyC,CAAC;AAEnE;;GAEG;AACH,MAAM,OAAO,WAAW;IACL,IAAI,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEzD;;OAEG;IACH,QAAQ,CAAC,GAAkB;QACzB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,aAAa,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,8BAA8B,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,EAAU;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export type { Schedule, ScheduleType } from "./schedule.type.js";
2
+ export { createSchedule } from "./schedule.type.js";
3
+ export type { ScheduleOptions } from "./scheduleOptions.type.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scheduler/schedule/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,YAAY,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createSchedule } from "./schedule.type.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scheduler/schedule/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { ScheduleOptions } from "./scheduleOptions.type.js";
2
+ import type { ScheduleState } from "../types/schedulerTypes.core.js";
3
+ /**
4
+ * Schedule definition.
5
+ */
6
+ export interface Schedule {
7
+ readonly id: string;
8
+ readonly jobId: string;
9
+ readonly type: ScheduleType;
10
+ readonly expression?: string;
11
+ readonly nextRunAt: Date;
12
+ readonly lastRunAt?: Date;
13
+ readonly state: ScheduleState;
14
+ readonly options?: ScheduleOptions;
15
+ }
16
+ /**
17
+ * Type of schedule.
18
+ */
19
+ export type ScheduleType = "once" | "delay" | "interval" | "cron";
20
+ /**
21
+ * Creates a schedule.
22
+ */
23
+ export declare function createSchedule(id: string, jobId: string, type: ScheduleType, nextRunAt: Date, options?: ScheduleOptions): Schedule;
24
+ //# sourceMappingURL=schedule.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.type.d.ts","sourceRoot":"","sources":["../../../src/scheduler/schedule/schedule.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAE5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAE7B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IAEzB,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAE1B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAE9B,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;AAElE;;GAEG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,YAAY,EAClB,SAAS,EAAE,IAAI,EACf,OAAO,GAAE,eAAoB,GAC5B,QAAQ,CASV"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Creates a schedule.
3
+ */
4
+ export function createSchedule(id, jobId, type, nextRunAt, options = {}) {
5
+ return Object.freeze({
6
+ id,
7
+ jobId,
8
+ type,
9
+ nextRunAt,
10
+ state: "active",
11
+ options: Object.freeze(options),
12
+ });
13
+ }
14
+ //# sourceMappingURL=schedule.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.type.js","sourceRoot":"","sources":["../../../src/scheduler/schedule/schedule.type.ts"],"names":[],"mappings":"AA8BA;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,EAAU,EACV,KAAa,EACb,IAAkB,EAClB,SAAe,EACf,OAAO,GAAoB,EAAE;IAE7B,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,EAAE;QACF,KAAK;QACL,IAAI;QACJ,SAAS;QACT,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;KAChC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { MisfirePolicy } from "../types/schedulerTypes.core.js";
2
+ /**
3
+ * Options for a schedule.
4
+ */
5
+ export interface ScheduleOptions {
6
+ readonly timezone?: string;
7
+ readonly misfire?: MisfirePolicy;
8
+ readonly priority?: number;
9
+ }
10
+ //# sourceMappingURL=scheduleOptions.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduleOptions.type.d.ts","sourceRoot":"","sources":["../../../src/scheduler/schedule/scheduleOptions.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IAEjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scheduleOptions.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduleOptions.type.js","sourceRoot":"","sources":["../../../src/scheduler/schedule/scheduleOptions.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export type { ScheduleHandle } from "./scheduleHandle.type.js";
2
+ export { ScheduleHandleImpl } from "./scheduleHandle.type.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scheduler/scheduleHandle/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { ScheduleHandleImpl } from "./scheduleHandle.type.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scheduler/scheduleHandle/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { ScheduleState } from "../types/schedulerTypes.core.js";
2
+ /**
3
+ * Handle for controlling a schedule.
4
+ */
5
+ export interface ScheduleHandle {
6
+ readonly id: string;
7
+ state: ScheduleState;
8
+ pause(): Promise<void>;
9
+ resume(): Promise<void>;
10
+ cancel(): Promise<void>;
11
+ nextRun(): Date | undefined;
12
+ }
13
+ /**
14
+ * Implementation of ScheduleHandle.
15
+ */
16
+ export declare class ScheduleHandleImpl implements ScheduleHandle {
17
+ readonly id: string;
18
+ state: ScheduleState;
19
+ private cancelled;
20
+ constructor(id: string, state: ScheduleState);
21
+ pause(): Promise<void>;
22
+ resume(): Promise<void>;
23
+ cancel(): Promise<void>;
24
+ nextRun(): Date | undefined;
25
+ }
26
+ //# sourceMappingURL=scheduleHandle.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduleHandle.type.d.ts","sourceRoot":"","sources":["../../../src/scheduler/scheduleHandle/scheduleHandle.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,KAAK,EAAE,aAAa,CAAC;IAErB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAExB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAExB,OAAO,IAAI,IAAI,GAAG,SAAS,CAAC;CAC7B;AAED;;GAEG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IACvD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,KAAK,EAAE,aAAa,CAAC;IAErB,OAAO,CAAC,SAAS,CAAS;IAE1B,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAG3C;IAED,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAGrB;IAED,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAGtB;IAED,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAItB;IAED,OAAO,IAAI,IAAI,GAAG,SAAS,CAE1B;CACF"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Implementation of ScheduleHandle.
3
+ */
4
+ export class ScheduleHandleImpl {
5
+ id;
6
+ state;
7
+ cancelled = false;
8
+ constructor(id, state) {
9
+ this.id = id;
10
+ this.state = state;
11
+ }
12
+ pause() {
13
+ this.state = "paused";
14
+ return Promise.resolve();
15
+ }
16
+ resume() {
17
+ this.state = "active";
18
+ return Promise.resolve();
19
+ }
20
+ cancel() {
21
+ this.cancelled = true;
22
+ this.state = "cancelled";
23
+ return Promise.resolve();
24
+ }
25
+ nextRun() {
26
+ return undefined;
27
+ }
28
+ }
29
+ //# sourceMappingURL=scheduleHandle.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduleHandle.type.js","sourceRoot":"","sources":["../../../src/scheduler/scheduleHandle/scheduleHandle.type.ts"],"names":[],"mappings":"AAmBA;;GAEG;AACH,MAAM,OAAO,kBAAkB;IACpB,EAAE,CAAS;IAEpB,KAAK,CAAgB;IAEb,SAAS,GAAG,KAAK,CAAC;IAE1B,YAAY,EAAU,EAAE,KAAoB;QAC1C,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC;QACzB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,OAAO;QACL,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,64 @@
1
+ import type { JobDefinition } from "./job/jobDefinition.type.js";
2
+ import type { ScheduleHandle } from "./scheduleHandle/scheduleHandle.type.js";
3
+ import type { Clock } from "./clock/schedulerClock.type.js";
4
+ import { JobRegistry } from "./registry/jobRegistry.core.js";
5
+ import { JobExecutor } from "./executor/jobExecutor.core.js";
6
+ import { PriorityQueue } from "./priorityQueue/schedulerPriorityQueue.core.js";
7
+ /**
8
+ * Scheduler for time-based job execution.
9
+ */
10
+ export declare class Scheduler {
11
+ private readonly jobs;
12
+ private readonly executor;
13
+ private readonly queue;
14
+ private readonly clock;
15
+ private readonly schedules;
16
+ private running;
17
+ private timer?;
18
+ constructor(jobs?: JobRegistry, executor?: JobExecutor, queue?: PriorityQueue, clock?: Clock);
19
+ /**
20
+ * Starts the scheduler.
21
+ */
22
+ start(): void;
23
+ /**
24
+ * Stops the scheduler.
25
+ */
26
+ stop(): void;
27
+ /**
28
+ * Defines a new job.
29
+ */
30
+ define(job: JobDefinition): void;
31
+ /**
32
+ * Schedules a job to run once after a delay.
33
+ */
34
+ after(delay: string, jobId: string): ScheduleHandle;
35
+ /**
36
+ * Schedules a job to run at a specific date.
37
+ */
38
+ at(date: Date, jobId: string): ScheduleHandle;
39
+ /**
40
+ * Schedules a job to run at a fixed interval.
41
+ */
42
+ every(interval: string, jobId: string): ScheduleHandle;
43
+ /**
44
+ * Schedules a job using a cron expression.
45
+ */
46
+ cron(expression: string, jobId: string): ScheduleHandle;
47
+ /**
48
+ * Schedules a job with a trigger.
49
+ */
50
+ private scheduleJob;
51
+ /**
52
+ * Internal tick method for processing due jobs.
53
+ */
54
+ private tick;
55
+ /**
56
+ * Calculates the delay until the next tick.
57
+ */
58
+ private calculateDelay;
59
+ /**
60
+ * Executes a schedule.
61
+ */
62
+ private executeSchedule;
63
+ }
64
+ //# sourceMappingURL=scheduler.core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.core.d.ts","sourceRoot":"","sources":["../../src/scheduler/scheduler.core.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAIjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAI9E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAwB5D,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,gDAAgD,CAAC;AAS/E;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IAEnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IAEvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IAEtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAE9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IAEzD,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,KAAK,CAAC,CAAgC;IAE9C,YACE,IAAI,CAAC,EAAE,WAAW,EAClB,QAAQ,CAAC,EAAE,WAAW,EACtB,KAAK,CAAC,EAAE,aAAa,EACrB,KAAK,CAAC,EAAE,KAAK,EAMd;IAED;;OAEG;IACH,KAAK,IAAI,IAAI,CAOZ;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,CAUX;IAED;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAE/B;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAIlD;IAED;;OAEG;IACH,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAG5C;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAIrD;IAED;;OAEG;IACH,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAGtD;IAED;;OAEG;IACH,OAAO,CAAC,WAAW;IAmCnB;;OAEG;IACH,OAAO,CAAC,IAAI;IA2BZ;;OAEG;IACH,OAAO,CAAC,cAAc;IActB;;OAEG;YACW,eAAe;CAqB9B"}
@@ -0,0 +1,164 @@
1
+ import { ScheduleHandleImpl } from "./scheduleHandle/scheduleHandle.type.js";
2
+ import { SchedulerError, SchedulerNotStartedError, SchedulerAlreadyStartedError, SchedulerStoppedError, InvalidScheduleError, InvalidJobError, } from "./errors/scheduler.errors.js";
3
+ import { DateTrigger, DelayTrigger, IntervalTrigger, CronTrigger, } from "./trigger/schedulerTrigger.core.js";
4
+ import { SystemClock } from "./clock/schedulerClock.type.js";
5
+ import { JobRegistry } from "./registry/jobRegistry.core.js";
6
+ import { JobExecutor } from "./executor/jobExecutor.core.js";
7
+ import { PriorityQueue } from "./priorityQueue/schedulerPriorityQueue.core.js";
8
+ import { parseDuration } from "./duration/duration.parser.js";
9
+ import { MAX_SCHEDULES, MAX_TIMER_DELAY, } from "./constants/schedulerConstants.core.js";
10
+ /**
11
+ * Scheduler for time-based job execution.
12
+ */
13
+ export class Scheduler {
14
+ jobs;
15
+ executor;
16
+ queue;
17
+ clock;
18
+ schedules = new Map();
19
+ running = false;
20
+ timer;
21
+ constructor(jobs, executor, queue, clock) {
22
+ this.jobs = jobs ?? new JobRegistry();
23
+ this.executor = executor ?? new JobExecutor(clock ?? new SystemClock());
24
+ this.queue = queue ?? new PriorityQueue();
25
+ this.clock = clock ?? new SystemClock();
26
+ }
27
+ /**
28
+ * Starts the scheduler.
29
+ */
30
+ start() {
31
+ if (this.running) {
32
+ throw new SchedulerAlreadyStartedError();
33
+ }
34
+ this.running = true;
35
+ this.tick();
36
+ }
37
+ /**
38
+ * Stops the scheduler.
39
+ */
40
+ stop() {
41
+ if (!this.running) {
42
+ throw new SchedulerStoppedError();
43
+ }
44
+ this.running = false;
45
+ if (this.timer) {
46
+ clearTimeout(this.timer);
47
+ this.timer = undefined;
48
+ }
49
+ }
50
+ /**
51
+ * Defines a new job.
52
+ */
53
+ define(job) {
54
+ this.jobs.register(job);
55
+ }
56
+ /**
57
+ * Schedules a job to run once after a delay.
58
+ */
59
+ after(delay, jobId) {
60
+ const delayMs = parseDuration(delay);
61
+ const trigger = new DelayTrigger(delayMs);
62
+ return this.scheduleJob(jobId, trigger, "delay");
63
+ }
64
+ /**
65
+ * Schedules a job to run at a specific date.
66
+ */
67
+ at(date, jobId) {
68
+ const trigger = new DateTrigger(date);
69
+ return this.scheduleJob(jobId, trigger, "once");
70
+ }
71
+ /**
72
+ * Schedules a job to run at a fixed interval.
73
+ */
74
+ every(interval, jobId) {
75
+ const intervalMs = parseDuration(interval);
76
+ const trigger = new IntervalTrigger(intervalMs);
77
+ return this.scheduleJob(jobId, trigger, "interval");
78
+ }
79
+ /**
80
+ * Schedules a job using a cron expression.
81
+ */
82
+ cron(expression, jobId) {
83
+ const trigger = new CronTrigger(expression);
84
+ return this.scheduleJob(jobId, trigger, "cron", { expression });
85
+ }
86
+ /**
87
+ * Schedules a job with a trigger.
88
+ */
89
+ scheduleJob(jobId, trigger, type, options) {
90
+ if (!this.jobs.has(jobId)) {
91
+ throw new InvalidJobError(`Job "${jobId}" is not registered.`, jobId);
92
+ }
93
+ const scheduleId = crypto.randomUUID();
94
+ const nextRunAt = trigger.next(this.clock.now());
95
+ if (nextRunAt === null) {
96
+ throw new InvalidScheduleError("Trigger returned null for next run.", scheduleId);
97
+ }
98
+ const schedule = {
99
+ id: scheduleId,
100
+ jobId,
101
+ type,
102
+ expression: options?.expression,
103
+ nextRunAt,
104
+ state: "active",
105
+ };
106
+ this.schedules.set(scheduleId, schedule);
107
+ this.queue.enqueue(schedule);
108
+ return new ScheduleHandleImpl(scheduleId, "active");
109
+ }
110
+ /**
111
+ * Internal tick method for processing due jobs.
112
+ */
113
+ tick() {
114
+ if (!this.running) {
115
+ return;
116
+ }
117
+ const now = this.clock.now();
118
+ while (!this.queue.isEmpty) {
119
+ const schedule = this.queue.peek();
120
+ if (!schedule || schedule.nextRunAt > now) {
121
+ break;
122
+ }
123
+ this.queue.dequeue();
124
+ if (schedule.state !== "active") {
125
+ continue;
126
+ }
127
+ this.executeSchedule(schedule);
128
+ }
129
+ const delay = this.calculateDelay();
130
+ this.timer = setTimeout(() => this.tick(), delay);
131
+ }
132
+ /**
133
+ * Calculates the delay until the next tick.
134
+ */
135
+ calculateDelay() {
136
+ if (this.queue.isEmpty) {
137
+ return MAX_TIMER_DELAY;
138
+ }
139
+ const next = this.queue.peek();
140
+ if (!next) {
141
+ return MAX_TIMER_DELAY;
142
+ }
143
+ const delay = next.nextRunAt.getTime() - this.clock.nowMs();
144
+ return Math.max(0, Math.min(delay, MAX_TIMER_DELAY));
145
+ }
146
+ /**
147
+ * Executes a schedule.
148
+ */
149
+ async executeSchedule(schedule) {
150
+ const job = this.jobs.get(schedule.jobId);
151
+ if (!job) {
152
+ return;
153
+ }
154
+ const executionId = crypto.randomUUID();
155
+ const signal = new AbortController().signal;
156
+ try {
157
+ await this.executor.execute(job, executionId, schedule.nextRunAt, 1, signal);
158
+ }
159
+ catch (error) {
160
+ // Job execution failed - retry logic would go here
161
+ }
162
+ }
163
+ }
164
+ //# sourceMappingURL=scheduler.core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.core.js","sourceRoot":"","sources":["../../src/scheduler/scheduler.core.ts"],"names":[],"mappings":"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"}