eternal-timer 3.0.0 → 4.0.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 +145 -35
- package/dist/cjs/EventEmitter.d.ts +12 -0
- package/dist/cjs/EventEmitter.d.ts.map +1 -0
- package/dist/cjs/EventEmitter.js +50 -0
- package/dist/cjs/EventEmitter.js.map +1 -0
- package/dist/cjs/TimersManager/JSONLTimersManager.d.ts.map +1 -1
- package/dist/cjs/TimersManager/JSONLTimersManager.js +3 -1
- package/dist/cjs/TimersManager/JSONLTimersManager.js.map +1 -1
- package/dist/cjs/TimersManager/TimersManager.d.ts +30 -29
- package/dist/cjs/TimersManager/TimersManager.d.ts.map +1 -1
- package/dist/cjs/TimersManager/TimersManager.js +52 -49
- package/dist/cjs/TimersManager/TimersManager.js.map +1 -1
- package/dist/cjs/types.d.ts +14 -0
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/esm/EventEmitter.d.ts +12 -0
- package/dist/esm/EventEmitter.d.ts.map +1 -0
- package/dist/esm/EventEmitter.js +46 -0
- package/dist/esm/EventEmitter.js.map +1 -0
- package/dist/esm/TimersManager/JSONLTimersManager.d.ts.map +1 -1
- package/dist/esm/TimersManager/JSONLTimersManager.js +3 -1
- package/dist/esm/TimersManager/JSONLTimersManager.js.map +1 -1
- package/dist/esm/TimersManager/TimersManager.d.ts +30 -29
- package/dist/esm/TimersManager/TimersManager.d.ts.map +1 -1
- package/dist/esm/TimersManager/TimersManager.js +52 -49
- package/dist/esm/TimersManager/TimersManager.js.map +1 -1
- package/dist/esm/types.d.ts +14 -0
- package/dist/esm/types.d.ts.map +1 -1
- package/package.json +2 -5
- package/dist/cjs/Log.d.ts +0 -8
- package/dist/cjs/Log.d.ts.map +0 -1
- package/dist/cjs/Log.js +0 -61
- package/dist/cjs/Log.js.map +0 -1
- package/dist/esm/Log.d.ts +0 -8
- package/dist/esm/Log.d.ts.map +0 -1
- package/dist/esm/Log.js +0 -24
- 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 (
|
|
11
|
+
- **Monitor Timers (event-driven)**: Start monitoring expired timers and react to events like `expired`, `started`, `stopped`, 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
|
-
//
|
|
41
|
-
const interval = await manager.
|
|
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
|
-
//
|
|
75
|
-
const interval = await manager.
|
|
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
|
-
|
|
172
|
-
- `number` — Timer duration in milliseconds.
|
|
183
|
+
**Returns** A `Promise<string>` that resolves to the timer's unique ID (UUID).
|
|
173
184
|
|
|
174
|
-
|
|
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
|
-
**
|
|
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
|
-
|
|
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
|
-
### `
|
|
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`, `started`, `stopped`, 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
|
-
|
|
196
|
-
`callback` when a timer expires.
|
|
234
|
+
**Returns:** The interval ID which can be used to stop the loop with `clearInterval()`.
|
|
197
235
|
|
|
198
|
-
|
|
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
|
-
|
|
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
|
-
|
|
240
|
+
Registers an event listener for a specific timer event.
|
|
207
241
|
|
|
208
|
-
|
|
242
|
+
- **`event`**: The name of the event to listen for (e.g., `'expired'`, `'started'`, `'stopped'`, `'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
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
+
started: Timer<T, Extra>
|
|
355
|
+
stopped: 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;
|
|
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;CAqBhB"}
|
|
@@ -39,11 +39,13 @@ class JSONLTimersManager extends TimersManager_js_1.TimersManager {
|
|
|
39
39
|
try {
|
|
40
40
|
const timers = await this.TimersStore.loadTimers();
|
|
41
41
|
const index = timers?.findIndex(t => t.id === id);
|
|
42
|
-
if (index === -1) {
|
|
42
|
+
if (index === -1 || timers[index] === undefined) {
|
|
43
43
|
throw new Error(`Timer with id ${id} not found`);
|
|
44
44
|
}
|
|
45
|
+
const old = { ...timers[index] };
|
|
45
46
|
timers[index].extra = newExtra;
|
|
46
47
|
await this.TimersStore.saveTimers(timers);
|
|
48
|
+
await this.emit("updated", { old, new: timers[index] });
|
|
47
49
|
}
|
|
48
50
|
catch (e) {
|
|
49
51
|
throw new Error(`Error when changing extra`, { cause: e });
|
|
@@ -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;
|
|
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,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE,CAAC;oBACjD,MAAM,IAAI,KAAK,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;gBAClD,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,2BAA2B,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5D,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
|
-
|
|
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} [
|
|
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(
|
|
31
|
+
constructor(timerfile?: string);
|
|
31
32
|
/**
|
|
32
33
|
* createTimer
|
|
33
34
|
* @description Creates a new timer.
|
|
34
|
-
* @param {
|
|
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
|
-
*
|
|
39
|
-
* const
|
|
40
|
-
*
|
|
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
|
-
*
|
|
55
|
-
* @description Starts
|
|
56
|
-
*
|
|
57
|
-
* The
|
|
58
|
-
* @
|
|
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
|
|
64
|
-
*
|
|
65
|
-
* });
|
|
65
|
+
* const manager = new TimersManager();
|
|
66
|
+
* manager.checkStart(1000); // Check for expired timers every 1 second
|
|
66
67
|
*/
|
|
67
|
-
|
|
68
|
+
checkStart(interval?: number): Promise<NodeJS.Timeout>;
|
|
68
69
|
/**
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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;
|
|
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;AAElD;;;;;;;;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"}
|