@kyo-services/schedulewise 2.0.2 โ†’ 2.2.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.
package/README.md CHANGED
@@ -20,10 +20,23 @@ A smart and efficient task scheduler for managing periodic jobs with precision t
20
20
 
21
21
  ## ๐Ÿ“ฆ Installation
22
22
 
23
+ You can install ScheduleWise using your preferred package manager:
24
+
25
+ Using npm:
23
26
  ```bash
24
27
  npm install @kyo-services/schedulewise
25
28
  ```
26
29
 
30
+ Using yarn:
31
+ ```bash
32
+ yarn add @kyo-services/schedulewise
33
+ ```
34
+
35
+ Using pnpm:
36
+ ```bash
37
+ pnpm add @kyo-services/schedulewise
38
+ ```
39
+
27
40
  ## ๐Ÿ”ง Usage
28
41
 
29
42
  ### Basic Task Scheduling
@@ -126,6 +139,42 @@ interface TaskOptions {
126
139
  | `removeTask(identifier)` | Removes a specific task |
127
140
  | `clearAllTasks()` | Removes all tasks |
128
141
  | `getAllTasks()` | Gets all scheduled tasks |
142
+ | `pause()` | Pauses all task executions |
143
+ | `resume()` | Resumes all task executions |
144
+ | `isPaused()` | Checks if scheduler is paused |
145
+ | `once(callback, options)` | Creates a one-time task with simplified API |
146
+ | `changeProcessorInterval(newInterval)` | Changes the scheduler's processor interval |
147
+
148
+ ### Scheduler Control
149
+
150
+ ```typescript
151
+ // Pause all task executions
152
+ sw.pause();
153
+
154
+ // Check if scheduler is paused
155
+ console.log('Scheduler paused:', sw.isPaused()); // true
156
+
157
+ // Resume all task executions
158
+ sw.resume();
159
+
160
+ // Adjust processor interval (default: 100ms)
161
+ sw.changeProcessorInterval(500);
162
+ ```
163
+
164
+ ### One-Time Task (Simplified API)
165
+
166
+ ```typescript
167
+ // Using the simplified 'once' method
168
+ sw.once(
169
+ () => {
170
+ console.log('This is a one-time task');
171
+ },
172
+ {
173
+ interval: 5000, // Execute after 5 seconds
174
+ name: 'simpleOneTimeTask' // Optional name
175
+ }
176
+ );
177
+ ```
129
178
 
130
179
  ## ๐Ÿงช Testing
131
180
 
@@ -1,5 +1,5 @@
1
- import { Task } from './Task.js';
2
- import { TaskCallback, TaskOptions } from './types.js';
1
+ import { Task } from "./Task.js";
2
+ import { TaskCallback, TaskOptions } from "./types.js";
3
3
  /**
4
4
  * A singleton class that manages scheduled tasks in the system
5
5
  * @class TaskScheduler
@@ -9,6 +9,7 @@ export declare class TaskScheduler {
9
9
  private currentTimestamp;
10
10
  private scheduledTasks;
11
11
  private schedulerInterval;
12
+ private processorInterval;
12
13
  private constructor();
13
14
  /**
14
15
  * Gets the singleton instance of TaskScheduler
@@ -42,11 +43,36 @@ export declare class TaskScheduler {
42
43
  * Removes all tasks and stops the scheduler
43
44
  */
44
45
  clearAllTasks(): void;
46
+ /**
47
+ * Pauses the scheduler
48
+ */
49
+ pause(): void;
50
+ /**
51
+ * Resumes the scheduler
52
+ */
53
+ resume(): void;
54
+ /**
55
+ * Checks if the scheduler is paused
56
+ * @returns {boolean} True if the scheduler is paused, false otherwise
57
+ */
58
+ isPaused(): boolean;
59
+ /**
60
+ * Executes a callback once
61
+ * @param {() => void} callback - The callback to execute
62
+ * @param {TaskOptions} options - Configuration options for the task
63
+ * @returns {Task} The created task instance
64
+ */
65
+ once(callback: () => void, options: TaskOptions): Task;
45
66
  /**
46
67
  * Updates current timestamp and processes tasks
47
68
  * @internal For testing purposes
48
69
  */
49
70
  processTasksNow(): void;
71
+ /**
72
+ * Changes the processor interval
73
+ * @param {number} newInterval - The new interval in milliseconds
74
+ */
75
+ changeProcessorInterval(newInterval: number): void;
50
76
  /**
51
77
  * Starts the task processor that executes scheduled tasks
52
78
  * @private
@@ -1,4 +1,4 @@
1
- import { Task } from './Task.js';
1
+ import { Task } from "./Task.js";
2
2
  /**
3
3
  * A singleton class that manages scheduled tasks in the system
4
4
  * @class TaskScheduler
@@ -8,6 +8,7 @@ export class TaskScheduler {
8
8
  currentTimestamp;
9
9
  scheduledTasks = new Map();
10
10
  schedulerInterval = null;
11
+ processorInterval = 100;
11
12
  constructor() {
12
13
  this.currentTimestamp = new Date();
13
14
  this.startTaskProcessor();
@@ -76,6 +77,40 @@ export class TaskScheduler {
76
77
  }
77
78
  this.scheduledTasks.clear();
78
79
  }
80
+ /**
81
+ * Pauses the scheduler
82
+ */
83
+ pause() {
84
+ if (this.schedulerInterval) {
85
+ clearInterval(this.schedulerInterval);
86
+ this.schedulerInterval = null;
87
+ }
88
+ }
89
+ /**
90
+ * Resumes the scheduler
91
+ */
92
+ resume() {
93
+ if (!this.schedulerInterval) {
94
+ this.startTaskProcessor();
95
+ }
96
+ }
97
+ /**
98
+ * Checks if the scheduler is paused
99
+ * @returns {boolean} True if the scheduler is paused, false otherwise
100
+ */
101
+ isPaused() {
102
+ return this.schedulerInterval === null;
103
+ }
104
+ /**
105
+ * Executes a callback once
106
+ * @param {() => void} callback - The callback to execute
107
+ * @param {TaskOptions} options - Configuration options for the task
108
+ * @returns {Task} The created task instance
109
+ */
110
+ once(callback, options) {
111
+ const task = this.scheduleTask(callback, { ...options, once: true });
112
+ return task;
113
+ }
79
114
  /**
80
115
  * Updates current timestamp and processes tasks
81
116
  * @internal For testing purposes
@@ -85,7 +120,8 @@ export class TaskScheduler {
85
120
  this.currentTimestamp = new Date();
86
121
  for (const task of this.scheduledTasks.values()) {
87
122
  const elapsedTime = task.getInterval();
88
- const shouldRun = task.shouldExecute(elapsedTime) && task.lastExecutionTime.getTime() <= previousTimestamp.getTime();
123
+ const shouldRun = task.shouldExecute(elapsedTime) &&
124
+ task.lastExecutionTime.getTime() <= previousTimestamp.getTime();
89
125
  if (!shouldRun)
90
126
  continue;
91
127
  task.execute(this.currentTimestamp);
@@ -94,6 +130,17 @@ export class TaskScheduler {
94
130
  }
95
131
  }
96
132
  }
133
+ /**
134
+ * Changes the processor interval
135
+ * @param {number} newInterval - The new interval in milliseconds
136
+ */
137
+ changeProcessorInterval(newInterval) {
138
+ if (newInterval <= 0)
139
+ throw new Error('Interval must be greater than 0');
140
+ this.processorInterval = newInterval;
141
+ if (this.schedulerInterval !== null)
142
+ this.startTaskProcessor();
143
+ }
97
144
  /**
98
145
  * Starts the task processor that executes scheduled tasks
99
146
  * @private
@@ -112,7 +159,7 @@ export class TaskScheduler {
112
159
  if (task.shouldRemove())
113
160
  this.removeTask(task.id);
114
161
  }
115
- }, 100);
162
+ }, this.processorInterval);
116
163
  }
117
164
  }
118
165
  //# sourceMappingURL=TaskScheduler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TaskScheduler.js","sourceRoot":"","sources":["../src/TaskScheduler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TaskScheduler.js","sourceRoot":"","sources":["../src/TaskScheduler.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kyo-services/schedulewise",
3
- "version": "2.0.2",
3
+ "version": "2.2.0",
4
4
  "type": "module",
5
5
  "engines": {
6
6
  "node": ">=18.0.0"
@@ -1,130 +1,184 @@
1
- import { Task } from './Task.js';
2
- import { TaskCallback, TaskOptions } from './types.js';
1
+ import { Task } from "./Task.js";
2
+ import { TaskCallback, TaskOptions } from "./types.js";
3
3
 
4
4
  /**
5
5
  * A singleton class that manages scheduled tasks in the system
6
6
  * @class TaskScheduler
7
7
  */
8
8
  export class TaskScheduler {
9
- private static instance: TaskScheduler;
10
- private currentTimestamp: Date;
11
- private scheduledTasks: Map<number | string, Task> = new Map();
12
- private schedulerInterval: ReturnType<typeof setInterval> | null = null;
13
-
14
- private constructor() {
15
- this.currentTimestamp = new Date();
16
- this.startTaskProcessor();
17
- }
18
-
19
- /**
20
- * Gets the singleton instance of TaskScheduler
21
- * @returns {TaskScheduler} The singleton instance
22
- */
23
- public static getInstance(): TaskScheduler {
24
- if (!TaskScheduler.instance) TaskScheduler.instance = new TaskScheduler();
25
- return TaskScheduler.instance;
26
- }
27
-
28
- /**
29
- * Finds a task by its identifier (id or name)
30
- * @param {number | string} identifier - The task's ID or name
31
- * @returns {Task | undefined} The found task or undefined
32
- */
33
- public findTask(identifier: number | string): Task | undefined {
34
- return this.scheduledTasks.get(identifier);
35
- }
36
-
37
- /**
38
- * Gets all scheduled tasks in the system
39
- * @returns {Task[]} Array of all scheduled tasks
40
- */
41
- public getAllTasks(): Task[] {
42
- return Array.from(this.scheduledTasks.values());
43
- }
44
-
45
- /**
46
- * Creates and schedules a new task
47
- * @param {TaskCallback} callback - Function to be executed
48
- * @param {TaskOptions} options - Configuration options for the task
49
- * @returns {Task} The created task instance
50
- */
51
- public scheduleTask(callback: TaskCallback, options: TaskOptions): Task {
52
- const taskId = Math.floor(Math.random() * 1000000);
53
- const task = new Task(
54
- this,
55
- options.name,
56
- taskId,
57
- callback,
58
- options.interval,
59
- false,
60
- options.once || false
61
- );
62
-
63
- this.scheduledTasks.set(taskId, task);
64
- if (options.name) this.scheduledTasks.set(options.name, task);
65
-
66
- if (options.immediate) {
67
- task.execute(this.currentTimestamp);
68
- task.lastExecutionTime = this.currentTimestamp;
69
- }
70
-
71
- return task;
72
- }
73
-
74
- /**
75
- * Removes a task from the scheduler
76
- * @param {number | string} identifier - The task's ID or name
77
- */
78
- public removeTask(identifier: number | string): void {
79
- const task = this.findTask(identifier);
80
- if (!task) return;
81
-
82
- this.scheduledTasks.delete(task.id);
83
- if (task.name) this.scheduledTasks.delete(task.name);
84
- }
85
-
86
- /**
87
- * Removes all tasks and stops the scheduler
88
- */
89
- public clearAllTasks(): void {
90
- if (this.schedulerInterval) {
91
- clearInterval(this.schedulerInterval);
92
- this.schedulerInterval = null;
93
- }
94
- this.scheduledTasks.clear();
95
- }
96
-
97
- /**
98
- * Updates current timestamp and processes tasks
99
- * @internal For testing purposes
100
- */
101
- public processTasksNow(): void {
102
- const previousTimestamp = this.currentTimestamp;
103
- this.currentTimestamp = new Date();
104
-
105
- for (const task of this.scheduledTasks.values()) {
106
- const elapsedTime = task.getInterval();
107
- const shouldRun = task.shouldExecute(elapsedTime) && task.lastExecutionTime.getTime() <= previousTimestamp.getTime();
108
-
109
- if (!shouldRun) continue;
110
-
111
- task.execute(this.currentTimestamp);
112
- if (task.shouldRemove()) {
113
- this.removeTask(task.id);
114
- }
115
- }
116
- }
117
-
118
- /**
119
- * Starts the task processor that executes scheduled tasks
120
- * @private
121
- */
122
- private startTaskProcessor(): void {
123
- if (this.schedulerInterval) clearInterval(this.schedulerInterval);
124
-
125
- this.schedulerInterval = setInterval(() => {
9
+ private static instance: TaskScheduler;
10
+ private currentTimestamp: Date;
11
+ private scheduledTasks: Map<number | string, Task> = new Map();
12
+ private schedulerInterval: ReturnType<typeof setInterval> | null = null;
13
+ private processorInterval: number = 100;
14
+
15
+ private constructor() {
16
+ this.currentTimestamp = new Date();
17
+ this.startTaskProcessor();
18
+ }
19
+
20
+ /**
21
+ * Gets the singleton instance of TaskScheduler
22
+ * @returns {TaskScheduler} The singleton instance
23
+ */
24
+ public static getInstance(): TaskScheduler {
25
+ if (!TaskScheduler.instance)
26
+ TaskScheduler.instance = new TaskScheduler();
27
+ return TaskScheduler.instance;
28
+ }
29
+
30
+ /**
31
+ * Finds a task by its identifier (id or name)
32
+ * @param {number | string} identifier - The task's ID or name
33
+ * @returns {Task | undefined} The found task or undefined
34
+ */
35
+ public findTask(identifier: number | string): Task | undefined {
36
+ return this.scheduledTasks.get(identifier);
37
+ }
38
+
39
+ /**
40
+ * Gets all scheduled tasks in the system
41
+ * @returns {Task[]} Array of all scheduled tasks
42
+ */
43
+ public getAllTasks(): Task[] {
44
+ return Array.from(this.scheduledTasks.values());
45
+ }
46
+
47
+ /**
48
+ * Creates and schedules a new task
49
+ * @param {TaskCallback} callback - Function to be executed
50
+ * @param {TaskOptions} options - Configuration options for the task
51
+ * @returns {Task} The created task instance
52
+ */
53
+ public scheduleTask(callback: TaskCallback, options: TaskOptions): Task {
54
+ const taskId = Math.floor(Math.random() * 1000000);
55
+ const task = new Task(
56
+ this,
57
+ options.name,
58
+ taskId,
59
+ callback,
60
+ options.interval,
61
+ false,
62
+ options.once || false
63
+ );
64
+
65
+ this.scheduledTasks.set(taskId, task);
66
+ if (options.name) this.scheduledTasks.set(options.name, task);
67
+
68
+ if (options.immediate) {
69
+ task.execute(this.currentTimestamp);
70
+ task.lastExecutionTime = this.currentTimestamp;
71
+ }
72
+
73
+ return task;
74
+ }
75
+
76
+ /**
77
+ * Removes a task from the scheduler
78
+ * @param {number | string} identifier - The task's ID or name
79
+ */
80
+ public removeTask(identifier: number | string): void {
81
+ const task = this.findTask(identifier);
82
+ if (!task) return;
83
+
84
+ this.scheduledTasks.delete(task.id);
85
+ if (task.name) this.scheduledTasks.delete(task.name);
86
+ }
87
+
88
+ /**
89
+ * Removes all tasks and stops the scheduler
90
+ */
91
+ public clearAllTasks(): void {
92
+ if (this.schedulerInterval) {
93
+ clearInterval(this.schedulerInterval);
94
+ this.schedulerInterval = null;
95
+ }
96
+ this.scheduledTasks.clear();
97
+ }
98
+
99
+ /**
100
+ * Pauses the scheduler
101
+ */
102
+ public pause(): void {
103
+ if (this.schedulerInterval) {
104
+ clearInterval(this.schedulerInterval);
105
+ this.schedulerInterval = null;
106
+ }
107
+ }
108
+
109
+ /**
110
+ * Resumes the scheduler
111
+ */
112
+ public resume(): void {
113
+ if (!this.schedulerInterval) {
114
+ this.startTaskProcessor();
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Checks if the scheduler is paused
120
+ * @returns {boolean} True if the scheduler is paused, false otherwise
121
+ */
122
+ public isPaused(): boolean {
123
+ return this.schedulerInterval === null;
124
+ }
125
+
126
+ /**
127
+ * Executes a callback once
128
+ * @param {() => void} callback - The callback to execute
129
+ * @param {TaskOptions} options - Configuration options for the task
130
+ * @returns {Task} The created task instance
131
+ */
132
+ public once(callback: () => void, options: TaskOptions): Task {
133
+ const task = this.scheduleTask(callback, { ...options, once: true });
134
+ return task;
135
+ }
136
+
137
+ /**
138
+ * Updates current timestamp and processes tasks
139
+ * @internal For testing purposes
140
+ */
141
+ public processTasksNow(): void {
142
+ const previousTimestamp = this.currentTimestamp;
143
+ this.currentTimestamp = new Date();
144
+
145
+ for (const task of this.scheduledTasks.values()) {
146
+ const elapsedTime = task.getInterval();
147
+ const shouldRun =
148
+ task.shouldExecute(elapsedTime) &&
149
+ task.lastExecutionTime.getTime() <= previousTimestamp.getTime();
150
+
151
+ if (!shouldRun) continue;
152
+
153
+ task.execute(this.currentTimestamp);
154
+ if (task.shouldRemove()) {
155
+ this.removeTask(task.id);
156
+ }
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Changes the processor interval
162
+ * @param {number} newInterval - The new interval in milliseconds
163
+ */
164
+ public changeProcessorInterval(newInterval: number): void {
165
+ if (newInterval <= 0) throw new Error('Interval must be greater than 0');
166
+
167
+ this.processorInterval = newInterval;
168
+
169
+ if (this.schedulerInterval !== null) this.startTaskProcessor();
170
+ }
171
+
172
+ /**
173
+ * Starts the task processor that executes scheduled tasks
174
+ * @private
175
+ */
176
+ private startTaskProcessor(): void {
177
+ if (this.schedulerInterval) clearInterval(this.schedulerInterval);
178
+
179
+ this.schedulerInterval = setInterval(() => {
126
180
  this.currentTimestamp = new Date();
127
-
181
+
128
182
  for (const task of this.scheduledTasks.values()) {
129
183
  const elapsedTime = this.currentTimestamp.getTime() - task.lastExecutionTime.getTime();
130
184
  const shouldRun = task.shouldExecute(elapsedTime);
@@ -134,6 +188,6 @@ export class TaskScheduler {
134
188
  task.execute(this.currentTimestamp);
135
189
  if (task.shouldRemove()) this.removeTask(task.id);
136
190
  }
137
- }, 100);
138
- }
139
- }
191
+ }, this.processorInterval);
192
+ }
193
+ }