@warlock.js/logger 4.0.128 → 4.0.129

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 (71) hide show
  1. package/cjs/cron-parser.d.ts +98 -0
  2. package/cjs/cron-parser.d.ts.map +1 -0
  3. package/cjs/cron-parser.js +193 -0
  4. package/cjs/cron-parser.js.map +1 -0
  5. package/cjs/index.d.ts +43 -5
  6. package/cjs/index.d.ts.map +1 -1
  7. package/cjs/index.js +1 -1
  8. package/cjs/job.d.ts +332 -0
  9. package/cjs/job.d.ts.map +1 -0
  10. package/cjs/job.js +616 -0
  11. package/cjs/job.js.map +1 -0
  12. package/cjs/log-channel.d.ts +2 -2
  13. package/cjs/logger.d.ts +1 -1
  14. package/cjs/scheduler.d.ts +182 -0
  15. package/cjs/scheduler.d.ts.map +1 -0
  16. package/cjs/scheduler.js +316 -0
  17. package/cjs/scheduler.js.map +1 -0
  18. package/cjs/types.d.ts +58 -89
  19. package/cjs/types.d.ts.map +1 -1
  20. package/cjs/utils.d.ts +3 -0
  21. package/cjs/utils.d.ts.map +1 -0
  22. package/esm/cron-parser.d.ts +98 -0
  23. package/esm/cron-parser.d.ts.map +1 -0
  24. package/esm/cron-parser.js +193 -0
  25. package/esm/cron-parser.js.map +1 -0
  26. package/esm/index.d.ts +43 -5
  27. package/esm/index.d.ts.map +1 -1
  28. package/esm/index.js +1 -1
  29. package/esm/job.d.ts +332 -0
  30. package/esm/job.d.ts.map +1 -0
  31. package/esm/job.js +616 -0
  32. package/esm/job.js.map +1 -0
  33. package/esm/log-channel.d.ts +2 -2
  34. package/esm/logger.d.ts +1 -1
  35. package/esm/scheduler.d.ts +182 -0
  36. package/esm/scheduler.d.ts.map +1 -0
  37. package/esm/scheduler.js +316 -0
  38. package/esm/scheduler.js.map +1 -0
  39. package/esm/types.d.ts +58 -89
  40. package/esm/types.d.ts.map +1 -1
  41. package/esm/utils.d.ts +3 -0
  42. package/esm/utils.d.ts.map +1 -0
  43. package/package.json +1 -1
  44. package/cjs/channels/console-log.js +0 -47
  45. package/cjs/channels/console-log.js.map +0 -1
  46. package/cjs/channels/file-log.js +0 -272
  47. package/cjs/channels/file-log.js.map +0 -1
  48. package/cjs/channels/json-file-log.js +0 -102
  49. package/cjs/channels/json-file-log.js.map +0 -1
  50. package/cjs/log-channel.js +0 -88
  51. package/cjs/log-channel.js.map +0 -1
  52. package/cjs/logger.js +0 -112
  53. package/cjs/logger.js.map +0 -1
  54. package/cjs/utils/capture-unhandled-errors.js +0 -12
  55. package/cjs/utils/capture-unhandled-errors.js.map +0 -1
  56. package/cjs/utils/clear-message.js +0 -9
  57. package/cjs/utils/clear-message.js.map +0 -1
  58. package/esm/channels/console-log.js +0 -47
  59. package/esm/channels/console-log.js.map +0 -1
  60. package/esm/channels/file-log.js +0 -272
  61. package/esm/channels/file-log.js.map +0 -1
  62. package/esm/channels/json-file-log.js +0 -102
  63. package/esm/channels/json-file-log.js.map +0 -1
  64. package/esm/log-channel.js +0 -88
  65. package/esm/log-channel.js.map +0 -1
  66. package/esm/logger.js +0 -112
  67. package/esm/logger.js.map +0 -1
  68. package/esm/utils/capture-unhandled-errors.js +0 -12
  69. package/esm/utils/capture-unhandled-errors.js.map +0 -1
  70. package/esm/utils/clear-message.js +0 -9
  71. package/esm/utils/clear-message.js.map +0 -1
@@ -0,0 +1,182 @@
1
+ import { Job, JobCallback } from "./job";
2
+ import type { SchedulerEvents } from "./types";
3
+ /**
4
+ * Type-safe event emitter interface for Scheduler events
5
+ */
6
+ interface TypedEventEmitter<TEvents extends Record<string, unknown[]>> {
7
+ on<K extends keyof TEvents>(event: K, listener: (...args: TEvents[K]) => void): this;
8
+ once<K extends keyof TEvents>(event: K, listener: (...args: TEvents[K]) => void): this;
9
+ off<K extends keyof TEvents>(event: K, listener: (...args: TEvents[K]) => void): this;
10
+ emit<K extends keyof TEvents>(event: K, ...args: TEvents[K]): boolean;
11
+ }
12
+ declare const Scheduler_base: new () => TypedEventEmitter<SchedulerEvents>;
13
+ /**
14
+ * Scheduler class manages and executes scheduled jobs.
15
+ *
16
+ * Features:
17
+ * - Event-based observability
18
+ * - Parallel or sequential job execution
19
+ * - Drift compensation for accurate timing
20
+ * - Graceful shutdown with job draining
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const scheduler = new Scheduler();
25
+ *
26
+ * scheduler.on('job:error', (jobName, error) => {
27
+ * logger.error(`Job ${jobName} failed:`, error);
28
+ * });
29
+ *
30
+ * scheduler
31
+ * .addJob(cleanupJob)
32
+ * .addJob(reportJob)
33
+ * .runInParallel(true)
34
+ * .start();
35
+ *
36
+ * // Graceful shutdown
37
+ * process.on('SIGTERM', () => scheduler.shutdown());
38
+ * ```
39
+ */
40
+ export declare class Scheduler extends Scheduler_base implements TypedEventEmitter<SchedulerEvents> {
41
+ /**
42
+ * List of registered jobs
43
+ */
44
+ private _jobs;
45
+ /**
46
+ * Reference to the current timeout for stopping
47
+ */
48
+ private _timeoutId;
49
+ /**
50
+ * Tick interval in milliseconds (how often to check for due jobs)
51
+ */
52
+ private _tickInterval;
53
+ /**
54
+ * Whether to run due jobs in parallel
55
+ */
56
+ private _runInParallel;
57
+ /**
58
+ * Maximum concurrent jobs when running in parallel
59
+ */
60
+ private _maxConcurrency;
61
+ /**
62
+ * Flag indicating scheduler is shutting down
63
+ */
64
+ private _isShuttingDown;
65
+ /**
66
+ * Returns true if the scheduler is currently running
67
+ */
68
+ get isRunning(): boolean;
69
+ /**
70
+ * Returns the number of registered jobs
71
+ */
72
+ get jobCount(): number;
73
+ /**
74
+ * Add a job to the scheduler
75
+ *
76
+ * @param job - Job instance to schedule
77
+ * @returns this for chaining
78
+ */
79
+ addJob(job: Job): this;
80
+ /**
81
+ * Alias to create a new job directly and store it
82
+ */
83
+ newJob(name: string, jobCallback: JobCallback): Job;
84
+ /**
85
+ * Add multiple jobs to the scheduler
86
+ *
87
+ * @param jobs - Array of Job instances
88
+ * @returns this for chaining
89
+ */
90
+ addJobs(jobs: Job[]): this;
91
+ /**
92
+ * Remove a job from the scheduler by name
93
+ *
94
+ * @param jobName - Name of the job to remove
95
+ * @returns true if job was found and removed
96
+ */
97
+ removeJob(jobName: string): boolean;
98
+ /**
99
+ * Get a job by name
100
+ *
101
+ * @param jobName - Name of the job to find
102
+ * @returns Job instance or undefined
103
+ */
104
+ getJob(jobName: string): Job | undefined;
105
+ /**
106
+ * Get all registered jobs
107
+ *
108
+ * @returns Array of registered jobs (readonly)
109
+ */
110
+ list(): readonly Job[];
111
+ /**
112
+ * Set the tick interval (how often to check for due jobs)
113
+ *
114
+ * @param ms - Interval in milliseconds (minimum 100ms)
115
+ * @returns this for chaining
116
+ */
117
+ runEvery(ms: number): this;
118
+ /**
119
+ * Configure whether jobs should run in parallel
120
+ *
121
+ * @param parallel - Enable parallel execution
122
+ * @param maxConcurrency - Maximum concurrent jobs (default: 10)
123
+ * @returns this for chaining
124
+ */
125
+ runInParallel(parallel: boolean, maxConcurrency?: number): this;
126
+ /**
127
+ * Start the scheduler
128
+ *
129
+ * @throws Error if scheduler is already running
130
+ */
131
+ start(): void;
132
+ /**
133
+ * Stop the scheduler immediately
134
+ *
135
+ * Note: This does not wait for running jobs to complete.
136
+ * Use shutdown() for graceful termination.
137
+ */
138
+ stop(): void;
139
+ /**
140
+ * Gracefully shutdown the scheduler
141
+ *
142
+ * Stops scheduling new jobs and waits for currently running jobs to complete.
143
+ *
144
+ * @param timeout - Maximum time to wait for jobs (default: 30000ms)
145
+ * @returns Promise that resolves when shutdown is complete
146
+ */
147
+ shutdown(timeout?: number): Promise<void>;
148
+ /**
149
+ * Schedule the next tick
150
+ */
151
+ private _scheduleTick;
152
+ /**
153
+ * Execute a scheduler tick - check and run due jobs
154
+ */
155
+ private _tick;
156
+ /**
157
+ * Run jobs sequentially
158
+ */
159
+ private _runJobsSequentially;
160
+ /**
161
+ * Run jobs in parallel with concurrency limit
162
+ */
163
+ private _runJobsInParallel;
164
+ /**
165
+ * Run a single job and emit events
166
+ */
167
+ private _runJob;
168
+ }
169
+ /**
170
+ * Default scheduler instance for simple use cases
171
+ *
172
+ * @example
173
+ * ```typescript
174
+ * import { scheduler, job } from "@warlock.js/scheduler";
175
+ *
176
+ * scheduler.addJob(job("cleanup", cleanupFn).daily());
177
+ * scheduler.start();
178
+ * ```
179
+ */
180
+ export declare const scheduler: Scheduler;
181
+ export {};
182
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,KAAK,EAAa,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1D;;GAEG;AACH,UAAU,iBAAiB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;IACnE,EAAE,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACrF,IAAI,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACvF,GAAG,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACtF,IAAI,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;CACvE;wCA8BoC,kBAAkB,eAAe,CAAC;AA5BvE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,SACX,SAAQ,cACR,YAAW,iBAAiB,CAAC,eAAe,CAAC;IAM7C;;OAEG;IACH,OAAO,CAAC,KAAK,CAAa;IAE1B;;OAEG;IACH,OAAO,CAAC,UAAU,CAA+B;IAEjD;;OAEG;IACH,OAAO,CAAC,aAAa,CAAQ;IAE7B;;OAEG;IACH,OAAO,CAAC,cAAc,CAAS;IAE/B;;OAEG;IACH,OAAO,CAAC,eAAe,CAAM;IAE7B;;OAEG;IACH,OAAO,CAAC,eAAe,CAAS;IAMhC;;OAEG;IACH,IAAW,SAAS,IAAI,OAAO,CAE9B;IAED;;OAEG;IACH,IAAW,QAAQ,IAAI,MAAM,CAE5B;IAMD;;;;;OAKG;IACI,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAU7B;;OAEG;IACI,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW;IAMpD;;;;;OAKG;IACI,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAKjC;;;;;OAKG;IACI,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAS1C;;;;;OAKG;IACI,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,GAAG,SAAS;IAI/C;;;;OAIG;IACI,IAAI,IAAI,SAAS,GAAG,EAAE;IAI7B;;;;;OAKG;IACI,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQjC;;;;;;OAMG;IACI,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,cAAc,SAAK,GAAG,IAAI;IAUlE;;;;OAIG;IACI,KAAK,IAAI,IAAI;IAoBpB;;;;;OAKG;IACI,IAAI,IAAI,IAAI;IASnB;;;;;;;OAOG;IACU,QAAQ,CAAC,OAAO,SAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBrD;;OAEG;IACH,OAAO,CAAC,aAAa;IAiBrB;;OAEG;YACW,KAAK;IAyBnB;;OAEG;YACW,oBAAoB;IAOlC;;OAEG;YACW,kBAAkB;IAchC;;OAEG;YACW,OAAO;CAatB;AAMD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS,WAAkB,CAAC"}
@@ -0,0 +1,316 @@
1
+ import {EventEmitter}from'events';import {Job}from'./job.js';/**
2
+ * Scheduler class manages and executes scheduled jobs.
3
+ *
4
+ * Features:
5
+ * - Event-based observability
6
+ * - Parallel or sequential job execution
7
+ * - Drift compensation for accurate timing
8
+ * - Graceful shutdown with job draining
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * const scheduler = new Scheduler();
13
+ *
14
+ * scheduler.on('job:error', (jobName, error) => {
15
+ * logger.error(`Job ${jobName} failed:`, error);
16
+ * });
17
+ *
18
+ * scheduler
19
+ * .addJob(cleanupJob)
20
+ * .addJob(reportJob)
21
+ * .runInParallel(true)
22
+ * .start();
23
+ *
24
+ * // Graceful shutdown
25
+ * process.on('SIGTERM', () => scheduler.shutdown());
26
+ * ```
27
+ */
28
+ class Scheduler extends EventEmitter {
29
+ // ─────────────────────────────────────────────────────────────────────────────
30
+ // Private Properties
31
+ // ─────────────────────────────────────────────────────────────────────────────
32
+ /**
33
+ * List of registered jobs
34
+ */
35
+ _jobs = [];
36
+ /**
37
+ * Reference to the current timeout for stopping
38
+ */
39
+ _timeoutId = null;
40
+ /**
41
+ * Tick interval in milliseconds (how often to check for due jobs)
42
+ */
43
+ _tickInterval = 1000;
44
+ /**
45
+ * Whether to run due jobs in parallel
46
+ */
47
+ _runInParallel = false;
48
+ /**
49
+ * Maximum concurrent jobs when running in parallel
50
+ */
51
+ _maxConcurrency = 10;
52
+ /**
53
+ * Flag indicating scheduler is shutting down
54
+ */
55
+ _isShuttingDown = false;
56
+ // ─────────────────────────────────────────────────────────────────────────────
57
+ // Public Getters
58
+ // ─────────────────────────────────────────────────────────────────────────────
59
+ /**
60
+ * Returns true if the scheduler is currently running
61
+ */
62
+ get isRunning() {
63
+ return this._timeoutId !== null;
64
+ }
65
+ /**
66
+ * Returns the number of registered jobs
67
+ */
68
+ get jobCount() {
69
+ return this._jobs.length;
70
+ }
71
+ // ─────────────────────────────────────────────────────────────────────────────
72
+ // Configuration Methods (Fluent API)
73
+ // ─────────────────────────────────────────────────────────────────────────────
74
+ /**
75
+ * Add a job to the scheduler
76
+ *
77
+ * @param job - Job instance to schedule
78
+ * @returns this for chaining
79
+ */
80
+ addJob(job) {
81
+ this._jobs.push(job);
82
+ if (this.isRunning) {
83
+ job.prepare();
84
+ }
85
+ return this;
86
+ }
87
+ /**
88
+ * Alias to create a new job directly and store it
89
+ */
90
+ newJob(name, jobCallback) {
91
+ const job = new Job(name, jobCallback);
92
+ this.addJob(job);
93
+ return job;
94
+ }
95
+ /**
96
+ * Add multiple jobs to the scheduler
97
+ *
98
+ * @param jobs - Array of Job instances
99
+ * @returns this for chaining
100
+ */
101
+ addJobs(jobs) {
102
+ this._jobs.push(...jobs);
103
+ return this;
104
+ }
105
+ /**
106
+ * Remove a job from the scheduler by name
107
+ *
108
+ * @param jobName - Name of the job to remove
109
+ * @returns true if job was found and removed
110
+ */
111
+ removeJob(jobName) {
112
+ const index = this._jobs.findIndex((j) => j.name === jobName);
113
+ if (index !== -1) {
114
+ this._jobs.splice(index, 1);
115
+ return true;
116
+ }
117
+ return false;
118
+ }
119
+ /**
120
+ * Get a job by name
121
+ *
122
+ * @param jobName - Name of the job to find
123
+ * @returns Job instance or undefined
124
+ */
125
+ getJob(jobName) {
126
+ return this._jobs.find((j) => j.name === jobName);
127
+ }
128
+ /**
129
+ * Get all registered jobs
130
+ *
131
+ * @returns Array of registered jobs (readonly)
132
+ */
133
+ list() {
134
+ return this._jobs;
135
+ }
136
+ /**
137
+ * Set the tick interval (how often to check for due jobs)
138
+ *
139
+ * @param ms - Interval in milliseconds (minimum 100ms)
140
+ * @returns this for chaining
141
+ */
142
+ runEvery(ms) {
143
+ if (ms < 100) {
144
+ throw new Error("Tick interval must be at least 100ms");
145
+ }
146
+ this._tickInterval = ms;
147
+ return this;
148
+ }
149
+ /**
150
+ * Configure whether jobs should run in parallel
151
+ *
152
+ * @param parallel - Enable parallel execution
153
+ * @param maxConcurrency - Maximum concurrent jobs (default: 10)
154
+ * @returns this for chaining
155
+ */
156
+ runInParallel(parallel, maxConcurrency = 10) {
157
+ this._runInParallel = parallel;
158
+ this._maxConcurrency = maxConcurrency;
159
+ return this;
160
+ }
161
+ // ─────────────────────────────────────────────────────────────────────────────
162
+ // Lifecycle Methods
163
+ // ─────────────────────────────────────────────────────────────────────────────
164
+ /**
165
+ * Start the scheduler
166
+ *
167
+ * @throws Error if scheduler is already running
168
+ */
169
+ start() {
170
+ if (this.isRunning) {
171
+ throw new Error("Scheduler is already running.");
172
+ }
173
+ if (this._jobs.length === 0) {
174
+ throw new Error("Cannot start scheduler with no jobs.");
175
+ }
176
+ // Prepare all jobs (calculate initial next run times)
177
+ for (const job of this._jobs) {
178
+ job.prepare();
179
+ }
180
+ this._isShuttingDown = false;
181
+ this._scheduleTick();
182
+ this.emit("scheduler:started");
183
+ }
184
+ /**
185
+ * Stop the scheduler immediately
186
+ *
187
+ * Note: This does not wait for running jobs to complete.
188
+ * Use shutdown() for graceful termination.
189
+ */
190
+ stop() {
191
+ if (this._timeoutId) {
192
+ clearTimeout(this._timeoutId);
193
+ this._timeoutId = null;
194
+ }
195
+ this.emit("scheduler:stopped");
196
+ }
197
+ /**
198
+ * Gracefully shutdown the scheduler
199
+ *
200
+ * Stops scheduling new jobs and waits for currently running jobs to complete.
201
+ *
202
+ * @param timeout - Maximum time to wait for jobs (default: 30000ms)
203
+ * @returns Promise that resolves when shutdown is complete
204
+ */
205
+ async shutdown(timeout = 30000) {
206
+ this._isShuttingDown = true;
207
+ this.stop();
208
+ // Get all currently running jobs
209
+ const runningJobs = this._jobs.filter((j) => j.isRunning);
210
+ if (runningJobs.length > 0) {
211
+ // Wait for jobs to complete or timeout
212
+ await Promise.race([
213
+ Promise.all(runningJobs.map((j) => j.waitForCompletion())),
214
+ new Promise((resolve) => setTimeout(resolve, timeout)),
215
+ ]);
216
+ }
217
+ }
218
+ // ─────────────────────────────────────────────────────────────────────────────
219
+ // Private Methods
220
+ // ─────────────────────────────────────────────────────────────────────────────
221
+ /**
222
+ * Schedule the next tick
223
+ */
224
+ _scheduleTick() {
225
+ if (this._isShuttingDown)
226
+ return;
227
+ const startTime = Date.now();
228
+ // Use setImmediate for first tick to allow event handlers to be registered
229
+ this._timeoutId = setTimeout(async () => {
230
+ await this._tick();
231
+ // Calculate time spent and adjust next tick for drift compensation
232
+ const elapsed = Date.now() - startTime;
233
+ Math.max(this._tickInterval - elapsed, 0);
234
+ this._scheduleTick();
235
+ }, this._tickInterval);
236
+ }
237
+ /**
238
+ * Execute a scheduler tick - check and run due jobs
239
+ */
240
+ async _tick() {
241
+ this.emit("scheduler:tick", new Date());
242
+ // Find jobs that should run
243
+ const dueJobs = this._jobs.filter((job) => {
244
+ if (!job.shouldRun())
245
+ return false;
246
+ // Skip if overlap prevention is enabled and job is running
247
+ if (job.isRunning) {
248
+ this.emit("job:skip", job.name, "Job is already running");
249
+ return false;
250
+ }
251
+ return true;
252
+ });
253
+ if (dueJobs.length === 0)
254
+ return;
255
+ if (this._runInParallel) {
256
+ await this._runJobsInParallel(dueJobs);
257
+ }
258
+ else {
259
+ await this._runJobsSequentially(dueJobs);
260
+ }
261
+ }
262
+ /**
263
+ * Run jobs sequentially
264
+ */
265
+ async _runJobsSequentially(jobs) {
266
+ for (const job of jobs) {
267
+ if (this._isShuttingDown)
268
+ break;
269
+ await this._runJob(job);
270
+ }
271
+ }
272
+ /**
273
+ * Run jobs in parallel with concurrency limit
274
+ */
275
+ async _runJobsInParallel(jobs) {
276
+ // Simple batching for concurrency control
277
+ const batches = [];
278
+ for (let i = 0; i < jobs.length; i += this._maxConcurrency) {
279
+ batches.push(jobs.slice(i, i + this._maxConcurrency));
280
+ }
281
+ for (const batch of batches) {
282
+ if (this._isShuttingDown)
283
+ break;
284
+ await Promise.allSettled(batch.map((job) => this._runJob(job)));
285
+ }
286
+ }
287
+ /**
288
+ * Run a single job and emit events
289
+ */
290
+ async _runJob(job) {
291
+ this.emit("job:start", job.name);
292
+ const result = await job.run();
293
+ if (result.success) {
294
+ this.emit("job:complete", job.name, result);
295
+ }
296
+ else {
297
+ this.emit("job:error", job.name, result.error);
298
+ }
299
+ return result;
300
+ }
301
+ }
302
+ // ─────────────────────────────────────────────────────────────────────────────
303
+ // Default Export
304
+ // ─────────────────────────────────────────────────────────────────────────────
305
+ /**
306
+ * Default scheduler instance for simple use cases
307
+ *
308
+ * @example
309
+ * ```typescript
310
+ * import { scheduler, job } from "@warlock.js/scheduler";
311
+ *
312
+ * scheduler.addJob(job("cleanup", cleanupFn).daily());
313
+ * scheduler.start();
314
+ * ```
315
+ */
316
+ const scheduler = new Scheduler();export{Scheduler,scheduler};//# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sources":["../src/scheduler.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
package/esm/types.d.ts CHANGED
@@ -1,94 +1,63 @@
1
- import type { LogChannel } from "./log-channel";
2
- import type { Logger } from "./logger";
3
- export type LogLevel = "debug" | "info" | "warn" | "error" | "success";
4
- export type DebugMode = "daily" | "monthly" | "yearly" | "hourly";
5
- export type BasicLogConfigurations = {
6
- /**
7
- * Set what level of logs should be logged
8
- *
9
- * @default all
10
- */
11
- levels?: LogLevel[];
12
- /**
13
- * Date and time format
14
- */
15
- dateFormat?: {
16
- date?: string;
17
- time?: string;
1
+ /**
2
+ * Time unit types for scheduling intervals
3
+ */
4
+ export type TimeType = "second" | "minute" | "hour" | "day" | "week" | "month" | "year";
5
+ /**
6
+ * Days of the week (lowercase for consistency)
7
+ */
8
+ export type Day = "sunday" | "monday" | "tuesday" | "wednesday" | "thursday" | "friday" | "saturday";
9
+ /**
10
+ * Job interval configuration
11
+ */
12
+ export type JobIntervals = {
13
+ /** Day of week or day of month */
14
+ day?: Day | number;
15
+ /** Time of day in HH:mm format */
16
+ time?: string;
17
+ /** Recurring interval configuration */
18
+ every?: {
19
+ type?: TimeType;
20
+ value?: number;
18
21
  };
19
- /**
20
- * Advanced filter to determine if the message should be logged or not
21
- */
22
- filter: (data: LoggingData) => boolean;
23
- /**
24
- * Add additional context to the log
25
- */
26
- context?: (data: LoggingData) => Promise<Record<string, any>>;
27
22
  };
28
- export type LogMessage = {
29
- content: string;
30
- level: LogLevel;
31
- date: string;
32
- module: string;
33
- action: string;
34
- stack?: string;
23
+ /**
24
+ * Result of a job execution
25
+ */
26
+ export type JobResult = {
27
+ /** Whether the job completed successfully */
28
+ success: boolean;
29
+ /** Execution duration in milliseconds */
30
+ duration: number;
31
+ /** Error if the job failed */
32
+ error?: unknown;
33
+ /** Number of retry attempts made */
34
+ retries?: number;
35
35
  };
36
- export interface LogContract {
37
- /**
38
- * Channel name
39
- */
40
- name: string;
41
- /**
42
- * Channel description
43
- */
44
- description?: string;
45
- /**
46
- * Determine if channel is logging in terminal
47
- */
48
- terminal?: boolean;
49
- /**
50
- * Log the given message
51
- */
52
- log(data: LoggingData): void | Promise<void>;
53
- }
54
- export type LoggingData = {
55
- type: "info" | "debug" | "warn" | "error" | "success";
56
- module: string;
57
- action: string;
58
- message: any;
59
- context?: Record<string, any>;
36
+ /**
37
+ * Job execution status
38
+ */
39
+ export type JobStatus = "idle" | "running" | "completed" | "failed";
40
+ /**
41
+ * Retry configuration for jobs
42
+ */
43
+ export type RetryConfig = {
44
+ /** Maximum number of retry attempts */
45
+ maxRetries: number;
46
+ /** Delay between retries in milliseconds */
47
+ delay: number;
48
+ /** Backoff multiplier for exponential backoff */
49
+ backoffMultiplier?: number;
50
+ };
51
+ /**
52
+ * Scheduler event types for observability
53
+ */
54
+ export type SchedulerEvents = {
55
+ "job:start": [jobName: string];
56
+ "job:complete": [jobName: string, result: JobResult];
57
+ "job:error": [jobName: string, error: unknown];
58
+ "job:skip": [jobName: string, reason: string];
59
+ "scheduler:started": [];
60
+ "scheduler:stopped": [];
61
+ "scheduler:tick": [timestamp: Date];
60
62
  };
61
- export type OmittedLoggingData = Omit<LoggingData, "type">;
62
- export interface Log {
63
- (data: LoggingData): Promise<Logger>;
64
- /**
65
- * Make info log
66
- */
67
- info(data: OmittedLoggingData): Promise<Logger>;
68
- info(module: string, action: string, message: any): Promise<Logger>;
69
- /**
70
- * Make debug log
71
- */
72
- debug(data: OmittedLoggingData): Promise<Logger>;
73
- debug(module: string, action: string, message: any): Promise<Logger>;
74
- /**
75
- * Make warn log
76
- */
77
- warn(data: OmittedLoggingData): Promise<Logger>;
78
- warn(module: string, action: string, message: any): Promise<Logger>;
79
- /**
80
- * Make error log
81
- */
82
- error(data: OmittedLoggingData): Promise<Logger>;
83
- error(module: string, action: string, message: any): Promise<Logger>;
84
- /**
85
- * Make success log
86
- */
87
- success(data: OmittedLoggingData): Promise<Logger>;
88
- success(module: string, action: string, message: any): Promise<Logger>;
89
- /**
90
- * Get channel by name
91
- */
92
- channel(name: string): LogChannel | undefined;
93
- }
94
63
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAExF;;GAEG;AACH,MAAM,MAAM,GAAG,GACX,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,WAAW,GACX,UAAU,GACV,QAAQ,GACR,UAAU,CAAC;AAEf;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,kCAAkC;IAClC,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC;IACnB,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,KAAK,CAAC,EAAE;QACN,IAAI,CAAC,EAAE,QAAQ,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,6CAA6C;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEpE;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/B,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACrD,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC/C,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,mBAAmB,EAAE,EAAE,CAAC;IACxB,mBAAmB,EAAE,EAAE,CAAC;IACxB,gBAAgB,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;CACrC,CAAC"}