eternal-timer 3.0.0 → 4.1.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 (62) hide show
  1. package/README.md +145 -35
  2. package/dist/cjs/EventEmitter.d.ts +12 -0
  3. package/dist/cjs/EventEmitter.d.ts.map +1 -0
  4. package/dist/cjs/EventEmitter.js +50 -0
  5. package/dist/cjs/EventEmitter.js.map +1 -0
  6. package/dist/cjs/TimersManager/JSONLTimersManager.d.ts.map +1 -1
  7. package/dist/cjs/TimersManager/JSONLTimersManager.js +6 -3
  8. package/dist/cjs/TimersManager/JSONLTimersManager.js.map +1 -1
  9. package/dist/cjs/TimersManager/TimersManager.d.ts +30 -29
  10. package/dist/cjs/TimersManager/TimersManager.d.ts.map +1 -1
  11. package/dist/cjs/TimersManager/TimersManager.js +58 -54
  12. package/dist/cjs/TimersManager/TimersManager.js.map +1 -1
  13. package/dist/cjs/TimersStore/JSONLTimersStore.d.ts.map +1 -1
  14. package/dist/cjs/TimersStore/JSONLTimersStore.js +2 -1
  15. package/dist/cjs/TimersStore/JSONLTimersStore.js.map +1 -1
  16. package/dist/cjs/TimersStore/PlainTextTimersStore.d.ts.map +1 -1
  17. package/dist/cjs/TimersStore/PlainTextTimersStore.js +2 -1
  18. package/dist/cjs/TimersStore/PlainTextTimersStore.js.map +1 -1
  19. package/dist/cjs/TimersStore/TimersStore.d.ts.map +1 -1
  20. package/dist/cjs/TimersStore/TimersStore.js +4 -3
  21. package/dist/cjs/TimersStore/TimersStore.js.map +1 -1
  22. package/dist/cjs/throwMessage.d.ts +12 -0
  23. package/dist/cjs/throwMessage.d.ts.map +1 -0
  24. package/dist/cjs/throwMessage.js +15 -0
  25. package/dist/cjs/throwMessage.js.map +1 -0
  26. package/dist/cjs/types.d.ts +14 -0
  27. package/dist/cjs/types.d.ts.map +1 -1
  28. package/dist/esm/EventEmitter.d.ts +12 -0
  29. package/dist/esm/EventEmitter.d.ts.map +1 -0
  30. package/dist/esm/EventEmitter.js +46 -0
  31. package/dist/esm/EventEmitter.js.map +1 -0
  32. package/dist/esm/TimersManager/JSONLTimersManager.d.ts.map +1 -1
  33. package/dist/esm/TimersManager/JSONLTimersManager.js +6 -3
  34. package/dist/esm/TimersManager/JSONLTimersManager.js.map +1 -1
  35. package/dist/esm/TimersManager/TimersManager.d.ts +30 -29
  36. package/dist/esm/TimersManager/TimersManager.d.ts.map +1 -1
  37. package/dist/esm/TimersManager/TimersManager.js +58 -54
  38. package/dist/esm/TimersManager/TimersManager.js.map +1 -1
  39. package/dist/esm/TimersStore/JSONLTimersStore.d.ts.map +1 -1
  40. package/dist/esm/TimersStore/JSONLTimersStore.js +2 -1
  41. package/dist/esm/TimersStore/JSONLTimersStore.js.map +1 -1
  42. package/dist/esm/TimersStore/PlainTextTimersStore.d.ts.map +1 -1
  43. package/dist/esm/TimersStore/PlainTextTimersStore.js +2 -1
  44. package/dist/esm/TimersStore/PlainTextTimersStore.js.map +1 -1
  45. package/dist/esm/TimersStore/TimersStore.d.ts.map +1 -1
  46. package/dist/esm/TimersStore/TimersStore.js +4 -3
  47. package/dist/esm/TimersStore/TimersStore.js.map +1 -1
  48. package/dist/esm/throwMessage.d.ts +12 -0
  49. package/dist/esm/throwMessage.d.ts.map +1 -0
  50. package/dist/esm/throwMessage.js +12 -0
  51. package/dist/esm/throwMessage.js.map +1 -0
  52. package/dist/esm/types.d.ts +14 -0
  53. package/dist/esm/types.d.ts.map +1 -1
  54. package/package.json +2 -5
  55. package/dist/cjs/Log.d.ts +0 -8
  56. package/dist/cjs/Log.d.ts.map +0 -1
  57. package/dist/cjs/Log.js +0 -61
  58. package/dist/cjs/Log.js.map +0 -1
  59. package/dist/esm/Log.d.ts +0 -8
  60. package/dist/esm/Log.d.ts.map +0 -1
  61. package/dist/esm/Log.js +0 -24
  62. package/dist/esm/Log.js.map +0 -1
package/README.md CHANGED
@@ -8,7 +8,7 @@ A simple and persistent timer library for Node.js. Timers are saved to a file an
8
8
 
9
9
  ## Features
10
10
 
11
- - **Monitor Timers (asynchronous)**: Start monitoring expired timers asynchronously; the function returns immediately and the callback is called when timers expire.
11
+ - **Monitor Timers (event-driven)**: Start monitoring expired timers and react to events like `expired`, `created`, `removed`, and `updated` through an event system.
12
12
  - **Persistence**: Save timer data to a file that persists across process restarts
13
13
  - **Choice of Format**: Choose between JSON Lines for rich data or plain text for lightweight storage.
14
14
 
@@ -37,8 +37,11 @@ async function main() {
37
37
  const timerId = await manager.createTimer({length: 5000, extra: { title: 'My Timer', description: 'This is a test timer.' }});
38
38
  console.log('Timer created:', timerId);
39
39
 
40
- // Monitor timers (executes when timer expires)
41
- const interval = await manager.checkTimers(async (timer) => {
40
+ // Start monitoring for expired timers
41
+ const interval = await manager.checkStart();
42
+
43
+ // Listen for 'expired' events
44
+ manager.on('expired', (timer) => {
42
45
  console.log('Timer expired:', timer.id, timer.extra?.title);
43
46
  });
44
47
 
@@ -71,8 +74,11 @@ async function main() {
71
74
  const timerId = await manager.createTimer(5000);
72
75
  console.log('Timer created:', timerId);
73
76
 
74
- // Monitor timers
75
- const interval = await manager.checkTimers(async (timer) => {
77
+ // Start monitoring for expired timers
78
+ const interval = await manager.checkStart();
79
+
80
+ // Listen for 'expired' events
81
+ manager.on('expired', (timer) => {
76
82
  console.log('Timer expired:', timer.id);
77
83
  });
78
84
 
@@ -83,7 +89,7 @@ async function main() {
83
89
  // Stop monitoring after a while
84
90
  setTimeout(() => {
85
91
  clearInterval(interval);
86
- console.log('Stopped monitoring timers.');
92
+ console.log('Stopped monitoring for timers.');
87
93
  }, 10000);
88
94
  }
89
95
 
@@ -160,26 +166,55 @@ Creates a manager for timers stored in **plain-text** format.
160
166
 
161
167
  ---
162
168
 
163
- ### `createTimer(options: CreateTimerOptions<T>): Promise<string>`
169
+ ### `createTimer(options: CreateTimerOptions<T, Extra>): Promise<string>`
164
170
 
165
171
  Creates a new timer and saves it to the file.
166
172
 
167
173
  #### Parameters
168
174
 
169
- - **`options`**
175
+ - **`options`** (`CreateTimerOptions<T, Extra>`)
176
+ - When using `PlainTextTimersManager` (type `PlainText`):
177
+ - `number` — The timer's duration in milliseconds.
178
+ - When using `JSONLTimersManager` (type `JSONL`):
179
+ - `{ length: number; extra?: Extra }`
180
+ - `length` (number): The timer's duration in milliseconds.
181
+ - `extra` (optional, `Extra` object): An object containing arbitrary user-defined metadata for the timer.
170
182
 
171
- When using `"PlainText"` storage:
172
- - `number` — Timer duration in milliseconds.
183
+ **Returns** A `Promise<string>` that resolves to the timer's unique ID (UUID).
173
184
 
174
- When using `"JSONL"` storage:
175
- - `{ length: number; extra?: Extra }`
176
- - `length` (number): Timer duration in milliseconds.
177
- - `extra` (optional, Extra): An object containing arbitrary user-defined metadata.
185
+ **Throws** An error if: `length` is invalid (e.g., negative) or a file operation fails.
178
186
 
179
- **Returns** A `Promise<string>` that resolves to the timer's unique ID (UUID).
187
+ **Examples:**
188
+
189
+ ```javascript
190
+ // For PlainTextTimersManager with a custom Extra type
191
+ import { PlainTextTimersManager } from 'eternal-timer';
192
+
193
+ // For PlainTextTimersManager
194
+ const manager = new PlainTextTimersManager();
195
+ const newTimerId = await manager.createTimer(5000); // Create a 5-second timer
196
+ console.log('Created PlainText timer with ID:', newTimerId);
197
+ ```
198
+
199
+ ```typescript
200
+ // For JSONLTimersManager with a custom Extra type
201
+ import { JSONLTimersManager } from 'eternal-timer';
180
202
 
181
- **Throws** An error if: `length` is invalid (e.g., negative) or a file operation fails
203
+ interface MyCustomExtra {
204
+ purpose: string;
205
+ userId: string;
206
+ }
182
207
 
208
+ const jsonlManager = new JSONLTimersManager<MyCustomExtra>();
209
+ const jsonlTimerId = await jsonlManager.createTimer({
210
+ length: 10000, // 10 seconds
211
+ extra: {
212
+ purpose: "Session Timeout",
213
+ userId: "user-123"
214
+ }
215
+ });
216
+ console.log('Created JSONL timer with ID:', jsonlTimerId);
217
+ ```
183
218
  ### `removeTimer(id: string): Promise<void>`
184
219
 
185
220
  Removes a timer by its ID.
@@ -190,22 +225,61 @@ Removes a timer by its ID.
190
225
 
191
226
  **Throws:** An error if the timer with the specified ID is not found or if a file operation fails.
192
227
 
193
- ### `checkTimers(callback: (timer: Timer) => void | Promise<void>, interval?: number): Promise<NodeJS.Timeout>`
228
+ ### `checkStart(interval?: number): Promise<NodeJS.Timeout>`
229
+
230
+ Starts the timer checking loop. This method should be called once after creating an instance of a `TimersManager` to begin detecting expired timers. Events like `expired`, `errored`, `created`, `removed`, and `updated` are emitted, which can be listened to using the `on` method.
231
+
232
+ - **`interval`** (optional, number): Polling interval in milliseconds (default: 200ms)
194
233
 
195
- Starts monitoring timers at the specified interval and invokes the provided
196
- `callback` when a timer expires.
234
+ **Returns:** The interval ID which can be used to stop the loop with `clearInterval()`.
197
235
 
198
- For each expired timer, the `callback` is awaited before processing continues.
199
- Monitoring runs periodically in the background and can be stopped using the
200
- returned `NodeJS.Timeout`.
236
+ **Throws:** If file operation fails during checking.
201
237
 
202
- - **callback**: An async function invoked with the expired `timer`.
203
- - **interval** *(optional, number)*: Interval in milliseconds for checking timers.
204
- Defaults to `200`.
238
+ ### `on<K extends keyof TimerEvents<T, Extra>>(event: K, listener: (payload: TimerEvents<T, Extra>[K]) => void | Promise<void>): void`
205
239
 
206
- **Returns:** A `NodeJS.Timeout` that can be passed to `clearInterval()` to stop monitoring.
240
+ Registers an event listener for a specific timer event.
207
241
 
208
- **Throws:** An error if a timer storage operation fails.
242
+ - **`event`**: The name of the event to listen for (e.g., `'expired'`, `'created'`, `'removed'`, `'updated'`, `'errored'`).
243
+ - **`listener`**: The callback function to execute when the event is emitted. It receives the event payload as an argument.
244
+
245
+ **Returns:** `void`
246
+
247
+ **Example:**
248
+ ```javascript
249
+ manager.on('expired', (timer) => {
250
+ console.log(`Timer ${timer.id} expired!`);
251
+ });
252
+
253
+ manager.on('errored', (error) => {
254
+ console.error('Timer event error:', error);
255
+ });
256
+ ```
257
+
258
+ ### `once<K extends keyof TimerEvents<T, Extra>>(event: K, listener: (payload: TimerEvents<T, Extra>[K]) => void | Promise<void>): void`
259
+
260
+ Registers a one-time event listener for a specific timer event. The listener will be invoked only once for the specified event, after which it will be automatically removed.
261
+
262
+ - **`event`**: The name of the event to listen for.
263
+ - **`listener`**: The callback function to execute when the event is emitted.
264
+
265
+ **Returns:** `void`
266
+
267
+ ### `off<K extends keyof TimerEvents<T, Extra>>(event: K, listener: (payload: TimerEvents<T, Extra>[K]) => void | Promise<void>): void`
268
+
269
+ Removes a specific event listener for a given event.
270
+
271
+ - **`event`**: The name of the event from which to remove the listener.
272
+ - **`listener`**: The listener function to remove.
273
+
274
+ **Returns:** `void`
275
+
276
+ ### `offAll<K extends keyof TimerEvents<T, Extra>>(event: K): void`
277
+
278
+ Removes all event listeners for a specific event.
279
+
280
+ - **`event`**: The name of the event for which to remove all listeners.
281
+
282
+ **Returns:** `void`
209
283
 
210
284
  ### `showTimers(): Promise<Timer[]>`
211
285
 
@@ -226,6 +300,13 @@ Adjusts the remaining time of a specified timer. This can be used to extend or s
226
300
 
227
301
  **Throws:** An error if: the timer with the specified ID is not found, the resulting remaining time would be negative, or a file operation fails.
228
302
 
303
+ **Example:**
304
+ ```javascript
305
+ // Assuming 'timerId' is the ID of an existing timer
306
+ await manager.adjustRemainingTime(timerId, 60000); // Add 1 minute to the timer
307
+ await manager.adjustRemainingTime(timerId, -30000); // Subtract 30 seconds from the timer
308
+ ```
309
+
229
310
  ## Type Definition
230
311
 
231
312
  The `StorageType` has the following structure:
@@ -236,16 +317,45 @@ type StorageType = "JSONL" | "PlainText"
236
317
  The `Timer` object has the following structure:
237
318
 
238
319
  ```typescript
239
- type Timer<T extends StorageType, Extra extends object> = {
240
- id: string;
241
- start: number;
242
- stop: number;
243
- } & (T extends "JSONL"
244
- ? { extra: Extra }
245
- : {});
320
+ type Timer<T extends StorageType, Extra extends object> =
321
+ T extends "JSONL"
322
+ ? {
323
+ id: string;
324
+ start: number;
325
+ stop: number;
326
+ extra: Extra
327
+ }
328
+ : {
329
+ id: string;
330
+ start: number;
331
+ stop: number;
332
+ };
333
+ ```
334
+ `Extra` is a generic type parameter that represents an object containing arbitrary user-defined metadata for JSONL timers. By default, it's `object`. For example, it can be `{ title?: string; description?: string }`.
335
+
336
+ The `CreateTimerOptions` type is used when creating new timers:
337
+ ```typescript
338
+ type CreateTimerOptions<T extends StorageType, Extra extends object> = T extends "JSONL"
339
+ ? {
340
+ length: number;
341
+ extra: Extra
342
+ }
343
+ : T extends "PlainText"
344
+ ? number
345
+ : never;
246
346
  ```
247
- `Extra` is a generic type parameter that represents an object containing arbitrary user-defined metadata for JSONL timers. For example, it can be `{ title?: string; description?: string }`.
248
347
 
348
+ The `TimerEvents` type defines the events emitted by `TimersManager`:
349
+ ```typescript
350
+ type TimerEvents<T extends StorageType, Extra extends object> = {
351
+ expired: Timer<T, Extra>
352
+ errored: Error
353
+ interval: void
354
+ created: Timer<T, Extra>
355
+ removed: Timer<T, Extra>
356
+ updated: { old: Timer<T, Extra>, new: Timer<T, Extra> }
357
+ }
358
+ ```
249
359
  ## Scripts
250
360
 
251
361
  - `npm run build`: Compile TypeScript
@@ -0,0 +1,12 @@
1
+ import type { StorageType, TimerEvents } from "./types.js";
2
+ export declare class EventEmitter<T extends StorageType, Extra extends object> {
3
+ protected listeners: {
4
+ [K in keyof TimerEvents<T, Extra>]?: ((payload: TimerEvents<T, Extra>[K]) => void | Promise<void>)[];
5
+ };
6
+ on<K extends keyof TimerEvents<T, Extra>>(event: K, listener: (payload: TimerEvents<T, Extra>[K]) => void | Promise<void>): void;
7
+ once<K extends keyof TimerEvents<T, Extra>>(event: K, listener: (payload: TimerEvents<T, Extra>[K]) => void | Promise<void>): void;
8
+ off<K extends keyof TimerEvents<T, Extra>>(event: K, listener: (payload: TimerEvents<T, Extra>[K]) => void | Promise<void>): void;
9
+ offAll<K extends keyof TimerEvents<T, Extra>>(event: K): void;
10
+ protected emit<K extends keyof TimerEvents<T, Extra>>(event: K, payload: TimerEvents<T, Extra>[K]): Promise<void>;
11
+ }
12
+ //# sourceMappingURL=EventEmitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventEmitter.d.ts","sourceRoot":"","sources":["../../src/EventEmitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3D,qBAAa,YAAY,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,SAAS,MAAM;IACpE,SAAS,CAAC,SAAS,EAAE;SACb,CAAC,IAAI,MAAM,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAClC,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAChC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE;KAC/B,CAAM;IAEH,EAAE,CAAC,CAAC,SAAS,MAAM,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,EAC9C,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACnE,IAAI;IAOA,IAAI,CAAC,CAAC,SAAS,MAAM,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,EAChD,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACnE,IAAI;IAQA,GAAG,CAAC,CAAC,SAAS,MAAM,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,EAC/C,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACnE,IAAI;IAUA,MAAM,CAAC,CAAC,SAAS,MAAM,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,EAClD,KAAK,EAAE,CAAC,GACN,IAAI;cAIS,IAAI,CAAC,CAAC,SAAS,MAAM,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,EACzD,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAC/B,OAAO,CAAC,IAAI,CAAC;CAoBhB"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventEmitter = void 0;
4
+ class EventEmitter {
5
+ listeners = {};
6
+ on(event, listener) {
7
+ if (!this.listeners[event]) {
8
+ this.listeners[event] = [];
9
+ }
10
+ this.listeners[event].push(listener);
11
+ }
12
+ once(event, listener) {
13
+ const wrapper = (payload) => {
14
+ this.off(event, wrapper);
15
+ return listener(payload);
16
+ };
17
+ this.on(event, wrapper);
18
+ }
19
+ off(event, listener) {
20
+ const listeners = this.listeners[event];
21
+ if (!listeners)
22
+ return;
23
+ const index = listeners.indexOf(listener);
24
+ if (index !== -1) {
25
+ listeners.splice(index, 1);
26
+ }
27
+ }
28
+ offAll(event) {
29
+ this.listeners[event] = [];
30
+ }
31
+ async emit(event, payload) {
32
+ const listeners = this.listeners[event];
33
+ if (!listeners?.length)
34
+ return;
35
+ const errors = [];
36
+ await Promise.all(listeners.map(async (l) => {
37
+ try {
38
+ await l(payload);
39
+ }
40
+ catch (e) {
41
+ errors.push(e);
42
+ }
43
+ }));
44
+ if (errors.length > 0) {
45
+ throw new AggregateError(errors, `Errors in event "${event}"`);
46
+ }
47
+ }
48
+ }
49
+ exports.EventEmitter = EventEmitter;
50
+ //# sourceMappingURL=EventEmitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventEmitter.js","sourceRoot":"","sources":["../../src/EventEmitter.ts"],"names":[],"mappings":";;;AAEA,MAAa,YAAY;IACd,SAAS,GAIZ,EAAE,CAAC;IAEH,EAAE,CACR,KAAQ,EACR,QAAqE;QAErE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC5B,CAAC;QACK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAEM,IAAI,CACV,KAAQ,EACR,QAAqE;QAErE,MAAM,OAAO,GAAG,CAAC,OAAiC,EAAE,EAAE;YACrD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACzB,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC,CAAC;QACF,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACzB,CAAC;IAEM,GAAG,CACT,KAAQ,EACR,QAAqE;QAErE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YAClB,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC5B,CAAC;IACF,CAAC;IAEM,MAAM,CACZ,KAAQ;QAER,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IAC5B,CAAC;IAES,KAAK,CAAC,IAAI,CACnB,KAAQ,EACR,OAAiC;QAEjC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS,EAAE,MAAM;YAAE,OAAO;QAE/B,MAAM,MAAM,GAAc,EAAE,CAAC;QAE7B,MAAM,OAAO,CAAC,GAAG,CAChB,SAAS,CAAC,GAAG,CAAC,KAAK,EAAC,CAAC,EAAC,EAAE;YACvB,IAAI,CAAC;gBACJ,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;YAClB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACZ,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,CAAC;QACF,CAAC,CAAC,CACF,CAAC;QAEF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,cAAc,CAAC,MAAM,EAAE,oBAAoB,KAAK,GAAG,CAAC,CAAC;QAChE,CAAC;IACF,CAAC;CACD;AAtED,oCAsEC"}
@@ -1 +1 @@
1
- {"version":3,"file":"JSONLTimersManager.d.ts","sourceRoot":"","sources":["../../../src/TimersManager/JSONLTimersManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE;;;;;;;;GAQG;AACH,qBAAa,kBAAkB,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC;IACnG,UAAmB,WAAW,EAAE,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,CAAQ;cAEnD,kBAAkB,IAAI,MAAM;cAItB,iBAAiB,IAAI,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAI9E,UAAmB,IAAI,EAAE,OAAO,CAAoB;IAEpD;;;;;;;;;;;OAWG;IACU,WAAW,CACvB,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,KAAK,GACb,OAAO,CAAC,IAAI,CAAC;CAkBhB"}
1
+ {"version":3,"file":"JSONLTimersManager.d.ts","sourceRoot":"","sources":["../../../src/TimersManager/JSONLTimersManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAGtE;;;;;;;;GAQG;AACH,qBAAa,kBAAkB,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC;IACnG,UAAmB,WAAW,EAAE,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,CAAQ;cAEnD,kBAAkB,IAAI,MAAM;cAItB,iBAAiB,IAAI,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAI9E,UAAmB,IAAI,EAAE,OAAO,CAAoB;IAEpD;;;;;;;;;;;OAWG;IACU,WAAW,CACvB,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,KAAK,GACb,OAAO,CAAC,IAAI,CAAC;CAqBhB"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.JSONLTimersManager = void 0;
4
4
  const TimersManager_js_1 = require("./TimersManager.js");
5
5
  const JSONLTimersStore_js_1 = require("../TimersStore/JSONLTimersStore.js");
6
+ const throwMessage_js_1 = require("../throwMessage.js");
6
7
  /**
7
8
  * JSONLTimersManager
8
9
  * @description
@@ -39,14 +40,16 @@ class JSONLTimersManager extends TimersManager_js_1.TimersManager {
39
40
  try {
40
41
  const timers = await this.TimersStore.loadTimers();
41
42
  const index = timers?.findIndex(t => t.id === id);
42
- if (index === -1) {
43
- throw new Error(`Timer with id ${id} not found`);
43
+ if (index === -1 || timers[index] === undefined) {
44
+ throw new Error(throwMessage_js_1.throwMessage.NotFound(id));
44
45
  }
46
+ const old = { ...timers[index] };
45
47
  timers[index].extra = newExtra;
46
48
  await this.TimersStore.saveTimers(timers);
49
+ await this.emit("updated", { old, new: timers[index] });
47
50
  }
48
51
  catch (e) {
49
- throw new Error(`Error when changing extra`, { cause: e });
52
+ throw new Error(throwMessage_js_1.throwMessage.ChangeExtra, { cause: e });
50
53
  }
51
54
  });
52
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"JSONLTimersManager.js","sourceRoot":"","sources":["../../../src/TimersManager/JSONLTimersManager.ts"],"names":[],"mappings":";;;AAAA,yDAAmD;AACnD,4EAAsE;AAEtE;;;;;;;;GAQG;AACH,MAAa,kBAAkD,SAAQ,gCAA6B;IAChF,WAAW,GAAmC,IAAI,CAAC;IAEnD,kBAAkB;QACpC,OAAO,eAAe,CAAC;IACxB,CAAC;IAEkB,KAAK,CAAC,iBAAiB;QACzC,OAAO,IAAI,sCAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAChD,CAAC;IAEkB,IAAI,GAAY,OAAgB,CAAC;IAEpD;;;;;;;;;;;OAWG;IACI,KAAK,CAAC,WAAW,CACvB,EAAU,EACV,QAAe;QAEf,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YACnC,IAAI,CAAC,WAAW,KAAK,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACpD,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;gBAEnD,MAAM,KAAK,GAAG,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;gBAClD,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;oBAClB,MAAM,IAAI,KAAK,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;gBAClD,CAAC;gBAED,MAAM,CAAC,KAAK,CAAE,CAAC,KAAK,GAAG,QAAQ,CAAC;gBAChC,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5D,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC;CACD;AA9CD,gDA8CC"}
1
+ {"version":3,"file":"JSONLTimersManager.js","sourceRoot":"","sources":["../../../src/TimersManager/JSONLTimersManager.ts"],"names":[],"mappings":";;;AAAA,yDAAmD;AACnD,4EAAsE;AACtE,wDAAkD;AAElD;;;;;;;;GAQG;AACH,MAAa,kBAAkD,SAAQ,gCAA6B;IAChF,WAAW,GAAmC,IAAI,CAAC;IAEnD,kBAAkB;QACpC,OAAO,eAAe,CAAC;IACxB,CAAC;IAEkB,KAAK,CAAC,iBAAiB;QACzC,OAAO,IAAI,sCAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAChD,CAAC;IAEkB,IAAI,GAAY,OAAgB,CAAC;IAEpD;;;;;;;;;;;OAWG;IACI,KAAK,CAAC,WAAW,CACvB,EAAU,EACV,QAAe;QAEf,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YACnC,IAAI,CAAC,WAAW,KAAK,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACpD,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;gBAEnD,MAAM,KAAK,GAAG,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;gBAClD,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE,CAAC;oBACjD,MAAM,IAAI,KAAK,CAAC,8BAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5C,CAAC;gBAED,MAAM,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBAEjC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,QAAQ,CAAC;gBAC/B,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAC1C,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACzD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,8BAAY,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACzD,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC;CACD;AAjDD,gDAiDC"}
@@ -1,5 +1,6 @@
1
1
  import type { CreateTimerOptions, StorageType, Timer } from "../types.js";
2
2
  import { TimersStore } from "../TimersStore/TimersStore.js";
3
+ import { EventEmitter } from "../EventEmitter.js";
3
4
  /**
4
5
  * TimersManager
5
6
  * @description
@@ -9,9 +10,9 @@ import { TimersStore } from "../TimersStore/TimersStore.js";
9
10
  * - Timers are persisted in a file
10
11
  * - Expired timers are detected by polling
11
12
  */
12
- export declare abstract class TimersManager<T extends StorageType, Extra extends object> {
13
+ export declare abstract class TimersManager<T extends StorageType, Extra extends object> extends EventEmitter<T, Extra> {
13
14
  protected readonly timerfiledir: string;
14
- private checkLock;
15
+ protected checkLock: boolean;
15
16
  protected TimersStore: TimersStore<T, Extra> | null;
16
17
  private queue;
17
18
  protected runExclusive<T>(fn: () => Promise<T>): Promise<T>;
@@ -21,23 +22,27 @@ export declare abstract class TimersManager<T extends StorageType, Extra extends
21
22
  /**
22
23
  * constructor
23
24
  * @description Initializes the TimersManager instance. If the timer file does not exist, an empty file is created.
24
- * @param {string} [options] (string, optional) Configuration timer file path and it is treated as the timer file path.
25
+ * @param {string} [timerfile] (string, optional) Configuration timer file path and it is treated as the timer file path.
25
26
  * @throws If file access or creation fails
26
27
  * @example
27
28
  * const manager = new TimersManager(); // Uses default timer file path
28
29
  * const manager = new TimersManager("/path/to/timers.txt"); // Uses specified timer file path
29
30
  */
30
- constructor(options?: string);
31
+ constructor(timerfile?: string);
31
32
  /**
32
33
  * createTimer
33
34
  * @description Creates a new timer.
34
- * @param {{length: number, extra: Extra} | number} options Timer duration in milliseconds and extra field(only JSONL)
35
+ * @param {CreateTimerOptions<T, Extra>} options Timer duration in milliseconds for PlainText or an object with length and extra for JSONL.
35
36
  * @returns Promise that resolves to the timer ID (UUID)
36
- * @throws If length is invalid(e.g. length < 0) or file operation fails
37
+ * @throws If length is invalid (e.g. length < 0) or file operation fails
37
38
  * @example
38
- * const manager = new TimersManager();
39
- * const newTimer = await manager.createTimer(5000);
40
- * // newTimer will be id of the timer
39
+ * // For PlainTextTimersManager
40
+ * const manager = new PlainTextTimersManager();
41
+ * const newTimerId = await manager.createTimer(5000); // Create a 5-second timer
42
+ *
43
+ * // For JSONLTimersManager
44
+ * const jsonlManager = new JSONLTimersManager<{ title: string }>();
45
+ * const jsonlTimerId = await jsonlManager.createTimer({ length: 10000, extra: { title: "My JSONL Timer" } }); // Create a 10-second timer with extra data
41
46
  */
42
47
  createTimer(options: CreateTimerOptions<T, Extra>): Promise<string>;
43
48
  /**
@@ -51,29 +56,25 @@ export declare abstract class TimersManager<T extends StorageType, Extra extends
51
56
  */
52
57
  removeTimer(id: string): Promise<void>;
53
58
  /**
54
- * checkTimers
55
- * @description Starts monitoring timers at the specified interval.
56
- * When a timer expires, the provided `callback` is invoked with the timer.
57
- * The callback is awaited before the next processing cycle continues.
58
- * @param {(timer: Timer<T, Extra>) => void | Promise<void>} callback Function invoked when an expired timer is detected (called asynchronously)
59
- * @param {number} [interval=200] (number, optional): Check interval in milliseconds (default: 200ms)
60
- * @throws If file operation fails
61
- * @returns {Promise<NodeJS.Timeout>} intervalId interval id of checkTimers
59
+ * checkStart
60
+ * @description Starts the timer checking loop. This method should be called once after creating an instance of TimersManager to detect expired timers.
61
+ * @param {number} [interval=200] Polling interval in milliseconds (default: 200ms)
62
+ * @returns The interval ID which can be used to stop the loop with clearInterval
63
+ * @throws If file operation fails during checking
62
64
  * @example
63
- * const interval = await manager.checkTimers((timer) => {
64
- * console.log(`A timer was stopped: ${timer.id}`);
65
- * });
65
+ * const manager = new TimersManager();
66
+ * manager.checkStart(1000); // Check for expired timers every 1 second
66
67
  */
67
- checkTimers(callback: (timer: Timer<T, Extra>) => void | Promise<void>, interval?: number): Promise<NodeJS.Timeout>;
68
+ checkStart(interval?: number): Promise<NodeJS.Timeout>;
68
69
  /**
69
- * showTimers
70
- * @description Retrieves all active timers.
71
- * @returns Array of `Timer` objects
72
- * @throws If file operation fails
73
- * @example
74
- * const timers = await manager.showTimers();
75
- * console.log(JSON.stringify(timers))
76
- */
70
+ * showTimers
71
+ * @description Retrieves all active timers.
72
+ * @returns Array of `Timer` objects
73
+ * @throws If file operation fails
74
+ * @example
75
+ * const timers = await manager.showTimers();
76
+ * console.log(JSON.stringify(timers))
77
+ */
77
78
  showTimers(): Promise<Timer<T, Extra>[]>;
78
79
  /**
79
80
  * adjustRemainingTime
@@ -1 +1 @@
1
- {"version":3,"file":"TimersManager.d.ts","sourceRoot":"","sources":["../../../src/TimersManager/TimersManager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAG5D;;;;;;;;GAQG;AACH,8BAAsB,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,SAAS,MAAM;IAC9E,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IACxC,OAAO,CAAC,SAAS,CAAkB;IAEnC,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,IAAI,CAAQ;IAE3D,OAAO,CAAC,KAAK,CAAoC;IACjD,SAAS,CAAC,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC;IAM9C,SAAS,CAAC,QAAQ,CAAC,kBAAkB,IAAI,MAAM;IAC/C,SAAS,CAAC,QAAQ,CAAC,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACtE,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAE3B;;;;;;;;QAQO;gBAEN,OAAO,CAAC,EAAE,MAAM;IAcjB;;;;;;;;;;OAUM;IACO,WAAW,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IA+BhF;;;;;;;;OAQM;IACO,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBnD;;;;;;;;;;;;;OAaM;IACO,WAAW,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAE,MAAY,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;IAuDrI;;;;;;;;OAQM;IACO,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;IAQrD;;;;;;;QAOO;IACM,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAsB1E"}
1
+ {"version":3,"file":"TimersManager.d.ts","sourceRoot":"","sources":["../../../src/TimersManager/TimersManager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD;;;;;;;;GAQG;AACH,8BAAsB,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,SAAS,MAAM,CAAE,SAAQ,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC;IAC9G,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IACxC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAS;IAErC,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,IAAI,CAAQ;IAE3D,OAAO,CAAC,KAAK,CAAoC;IACjD,SAAS,CAAC,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC;IAM9C,SAAS,CAAC,QAAQ,CAAC,kBAAkB,IAAI,MAAM;IAC/C,SAAS,CAAC,QAAQ,CAAC,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACtE,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAE3B;;;;;;;;QAQO;gBAEN,SAAS,CAAC,EAAE,MAAM;IAenB;;;;;;;;;;;;;;OAcM;IACO,WAAW,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAgChF;;;;;;;;OAQM;IACO,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBnD;;;;;;;;;OASG;IACU,UAAU,CACtB,QAAQ,GAAE,MAAY,GACpB,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;IAqD1B;;;;;;;;UAQG;IACU,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;IAQrD;;;;;;;QAOO;IACM,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAwB1E"}