eternal-timer 2.5.1 → 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 +189 -50
- 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 +17 -5
- package/dist/cjs/TimersManager/JSONLTimersManager.d.ts.map +1 -1
- package/dist/cjs/TimersManager/JSONLTimersManager.js +19 -21
- package/dist/cjs/TimersManager/JSONLTimersManager.js.map +1 -1
- package/dist/cjs/TimersManager/PlainTextTimersManager.d.ts +2 -1
- package/dist/cjs/TimersManager/PlainTextTimersManager.d.ts.map +1 -1
- package/dist/cjs/TimersManager/PlainTextTimersManager.js +1 -0
- package/dist/cjs/TimersManager/PlainTextTimersManager.js.map +1 -1
- package/dist/cjs/TimersManager/TimersManager.d.ts +39 -37
- package/dist/cjs/TimersManager/TimersManager.d.ts.map +1 -1
- package/dist/cjs/TimersManager/TimersManager.js +62 -55
- package/dist/cjs/TimersManager/TimersManager.js.map +1 -1
- package/dist/cjs/TimersStore/JSONLTimersStore.d.ts +4 -4
- package/dist/cjs/TimersStore/JSONLTimersStore.d.ts.map +1 -1
- package/dist/cjs/TimersStore/JSONLTimersStore.js +5 -3
- package/dist/cjs/TimersStore/JSONLTimersStore.js.map +1 -1
- package/dist/cjs/TimersStore/PlainTextTimersStore.d.ts +4 -4
- package/dist/cjs/TimersStore/PlainTextTimersStore.d.ts.map +1 -1
- package/dist/cjs/TimersStore/PlainTextTimersStore.js.map +1 -1
- package/dist/cjs/TimersStore/TimersStore.d.ts +7 -7
- package/dist/cjs/TimersStore/TimersStore.d.ts.map +1 -1
- package/dist/cjs/TimersStore/TimersStore.js.map +1 -1
- package/dist/cjs/types.d.ts +19 -7
- 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 +17 -5
- package/dist/esm/TimersManager/JSONLTimersManager.d.ts.map +1 -1
- package/dist/esm/TimersManager/JSONLTimersManager.js +19 -21
- package/dist/esm/TimersManager/JSONLTimersManager.js.map +1 -1
- package/dist/esm/TimersManager/PlainTextTimersManager.d.ts +2 -1
- package/dist/esm/TimersManager/PlainTextTimersManager.d.ts.map +1 -1
- package/dist/esm/TimersManager/PlainTextTimersManager.js +1 -0
- package/dist/esm/TimersManager/PlainTextTimersManager.js.map +1 -1
- package/dist/esm/TimersManager/TimersManager.d.ts +39 -37
- package/dist/esm/TimersManager/TimersManager.d.ts.map +1 -1
- package/dist/esm/TimersManager/TimersManager.js +62 -55
- package/dist/esm/TimersManager/TimersManager.js.map +1 -1
- package/dist/esm/TimersStore/JSONLTimersStore.d.ts +4 -4
- package/dist/esm/TimersStore/JSONLTimersStore.d.ts.map +1 -1
- package/dist/esm/TimersStore/JSONLTimersStore.js +5 -3
- package/dist/esm/TimersStore/JSONLTimersStore.js.map +1 -1
- package/dist/esm/TimersStore/PlainTextTimersStore.d.ts +4 -4
- package/dist/esm/TimersStore/PlainTextTimersStore.d.ts.map +1 -1
- package/dist/esm/TimersStore/PlainTextTimersStore.js.map +1 -1
- package/dist/esm/TimersStore/TimersStore.d.ts +7 -7
- package/dist/esm/TimersStore/TimersStore.d.ts.map +1 -1
- package/dist/esm/TimersStore/TimersStore.js.map +1 -1
- package/dist/esm/types.d.ts +19 -7
- 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
|
@@ -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,76 +10,77 @@ 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> {
|
|
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 TimersStore: TimersStore<T> | null;
|
|
15
|
+
protected checkLock: boolean;
|
|
16
|
+
protected TimersStore: TimersStore<T, Extra> | null;
|
|
16
17
|
private queue;
|
|
17
18
|
protected runExclusive<T>(fn: () => Promise<T>): Promise<T>;
|
|
18
19
|
protected abstract getDefaultFilename(): string;
|
|
19
|
-
protected abstract createTimersStore(): Promise<TimersStore<T>>;
|
|
20
|
+
protected abstract createTimersStore(): Promise<TimersStore<T, Extra>>;
|
|
21
|
+
protected abstract type: T;
|
|
20
22
|
/**
|
|
21
23
|
* constructor
|
|
22
24
|
* @description Initializes the TimersManager instance. If the timer file does not exist, an empty file is created.
|
|
23
|
-
* @param
|
|
25
|
+
* @param {string} [timerfile] (string, optional) Configuration timer file path and it is treated as the timer file path.
|
|
24
26
|
* @throws If file access or creation fails
|
|
25
27
|
* @example
|
|
26
28
|
* const manager = new TimersManager(); // Uses default timer file path
|
|
27
29
|
* const manager = new TimersManager("/path/to/timers.txt"); // Uses specified timer file path
|
|
28
30
|
*/
|
|
29
|
-
constructor(
|
|
31
|
+
constructor(timerfile?: string);
|
|
30
32
|
/**
|
|
31
33
|
* createTimer
|
|
32
34
|
* @description Creates a new timer.
|
|
33
|
-
* @param
|
|
35
|
+
* @param {CreateTimerOptions<T, Extra>} options Timer duration in milliseconds for PlainText or an object with length and extra for JSONL.
|
|
34
36
|
* @returns Promise that resolves to the timer ID (UUID)
|
|
35
|
-
* @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
|
|
36
38
|
* @example
|
|
37
|
-
*
|
|
38
|
-
* const
|
|
39
|
-
*
|
|
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
|
|
40
46
|
*/
|
|
41
|
-
createTimer(options: CreateTimerOptions<T>): Promise<string>;
|
|
47
|
+
createTimer(options: CreateTimerOptions<T, Extra>): Promise<string>;
|
|
42
48
|
/**
|
|
43
49
|
* removeTimer
|
|
44
50
|
* @description Removes a timer by ID.
|
|
45
|
-
* @param id ID of the timer to remove
|
|
46
|
-
* @returns
|
|
51
|
+
* @param {string} id ID of the timer to remove
|
|
52
|
+
* @returns Promise resolving when the operation is complete
|
|
47
53
|
* @throws If file operation fails
|
|
48
54
|
* @example
|
|
49
55
|
* await manager.removeTimer(id);
|
|
50
56
|
*/
|
|
51
57
|
removeTimer(id: string): Promise<void>;
|
|
52
58
|
/**
|
|
53
|
-
*
|
|
54
|
-
* @description Starts
|
|
55
|
-
*
|
|
56
|
-
* The
|
|
57
|
-
* @
|
|
58
|
-
* @param interval (number, optional): Check interval in milliseconds (default: 200ms)
|
|
59
|
-
* @throws If file operation fails
|
|
60
|
-
* @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
|
|
61
64
|
* @example
|
|
62
|
-
* const
|
|
63
|
-
*
|
|
64
|
-
* });
|
|
65
|
+
* const manager = new TimersManager();
|
|
66
|
+
* manager.checkStart(1000); // Check for expired timers every 1 second
|
|
65
67
|
*/
|
|
66
|
-
|
|
68
|
+
checkStart(interval?: number): Promise<NodeJS.Timeout>;
|
|
67
69
|
/**
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
showTimers(): Promise<Timer<T>[]>;
|
|
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
|
+
*/
|
|
78
|
+
showTimers(): Promise<Timer<T, Extra>[]>;
|
|
77
79
|
/**
|
|
78
80
|
* adjustRemainingTime
|
|
79
81
|
* @description Adjusts the remaining time of a timer.
|
|
80
|
-
* @param id ID of the timer to modify
|
|
81
|
-
* @param delay Delay in milliseconds to add/subtract from the remaining time
|
|
82
|
+
* @param {string} id ID of the timer to modify
|
|
83
|
+
* @param {number} delay Delay in milliseconds to add/subtract from the remaining time
|
|
82
84
|
* @returns Promise resolving when the operation is complete
|
|
83
85
|
* @throws If file operation fails
|
|
84
86
|
*/
|
|
@@ -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"}
|
|
@@ -8,7 +8,7 @@ const path_1 = __importDefault(require("path"));
|
|
|
8
8
|
const fs_1 = __importDefault(require("fs"));
|
|
9
9
|
const uuid_1 = require("uuid");
|
|
10
10
|
const searchRoot_js_1 = __importDefault(require("../searchRoot.js"));
|
|
11
|
-
const
|
|
11
|
+
const EventEmitter_js_1 = require("../EventEmitter.js");
|
|
12
12
|
/**
|
|
13
13
|
* TimersManager
|
|
14
14
|
* @description
|
|
@@ -18,7 +18,7 @@ const Log_js_1 = require("../Log.js");
|
|
|
18
18
|
* - Timers are persisted in a file
|
|
19
19
|
* - Expired timers are detected by polling
|
|
20
20
|
*/
|
|
21
|
-
class TimersManager {
|
|
21
|
+
class TimersManager extends EventEmitter_js_1.EventEmitter {
|
|
22
22
|
timerfiledir;
|
|
23
23
|
checkLock = false;
|
|
24
24
|
TimersStore = null;
|
|
@@ -31,15 +31,16 @@ class TimersManager {
|
|
|
31
31
|
/**
|
|
32
32
|
* constructor
|
|
33
33
|
* @description Initializes the TimersManager instance. If the timer file does not exist, an empty file is created.
|
|
34
|
-
* @param
|
|
34
|
+
* @param {string} [timerfile] (string, optional) Configuration timer file path and it is treated as the timer file path.
|
|
35
35
|
* @throws If file access or creation fails
|
|
36
36
|
* @example
|
|
37
37
|
* const manager = new TimersManager(); // Uses default timer file path
|
|
38
38
|
* const manager = new TimersManager("/path/to/timers.txt"); // Uses specified timer file path
|
|
39
39
|
*/
|
|
40
|
-
constructor(
|
|
40
|
+
constructor(timerfile) {
|
|
41
|
+
super();
|
|
41
42
|
const rootDir = (0, searchRoot_js_1.default)();
|
|
42
|
-
this.timerfiledir = path_1.default.resolve(rootDir,
|
|
43
|
+
this.timerfiledir = path_1.default.resolve(rootDir, timerfile ?? this.getDefaultFilename());
|
|
43
44
|
if (!this.timerfiledir.startsWith(rootDir)) {
|
|
44
45
|
throw new Error(`Timer file path must be within the project directory`);
|
|
45
46
|
}
|
|
@@ -53,17 +54,24 @@ class TimersManager {
|
|
|
53
54
|
/**
|
|
54
55
|
* createTimer
|
|
55
56
|
* @description Creates a new timer.
|
|
56
|
-
* @param
|
|
57
|
+
* @param {CreateTimerOptions<T, Extra>} options Timer duration in milliseconds for PlainText or an object with length and extra for JSONL.
|
|
57
58
|
* @returns Promise that resolves to the timer ID (UUID)
|
|
58
|
-
* @throws If length is invalid(e.g. length < 0) or file operation fails
|
|
59
|
+
* @throws If length is invalid (e.g. length < 0) or file operation fails
|
|
59
60
|
* @example
|
|
60
|
-
*
|
|
61
|
-
* const
|
|
62
|
-
*
|
|
61
|
+
* // For PlainTextTimersManager
|
|
62
|
+
* const manager = new PlainTextTimersManager();
|
|
63
|
+
* const newTimerId = await manager.createTimer(5000); // Create a 5-second timer
|
|
64
|
+
*
|
|
65
|
+
* // For JSONLTimersManager
|
|
66
|
+
* const jsonlManager = new JSONLTimersManager<{ title: string }>();
|
|
67
|
+
* const jsonlTimerId = await jsonlManager.createTimer({ length: 10000, extra: { title: "My JSONL Timer" } }); // Create a 10-second timer with extra data
|
|
63
68
|
*/
|
|
64
69
|
async createTimer(options) {
|
|
65
70
|
return this.runExclusive(async () => {
|
|
66
71
|
this.TimersStore ??= await this.createTimersStore();
|
|
72
|
+
if (this.type === "JSONL" && typeof options === "number") {
|
|
73
|
+
throw new Error(`Cannot create timer without extra fields in JSONL`);
|
|
74
|
+
}
|
|
67
75
|
let length = typeof options === "object" ? options.length : options;
|
|
68
76
|
if (length < 0)
|
|
69
77
|
throw new Error(`Invalid length: ${length}`);
|
|
@@ -75,18 +83,20 @@ class TimersManager {
|
|
|
75
83
|
id,
|
|
76
84
|
start: now,
|
|
77
85
|
stop: stopTime,
|
|
78
|
-
...(typeof options === "object" && options.
|
|
79
|
-
|
|
86
|
+
...(options && typeof options === "object" && options.extra !== undefined
|
|
87
|
+
? { extra: options.extra }
|
|
88
|
+
: {}),
|
|
80
89
|
};
|
|
81
90
|
await this.TimersStore.appendTimer(newTimerData);
|
|
91
|
+
await this.emit("started", newTimerData);
|
|
82
92
|
return id;
|
|
83
93
|
});
|
|
84
94
|
}
|
|
85
95
|
/**
|
|
86
96
|
* removeTimer
|
|
87
97
|
* @description Removes a timer by ID.
|
|
88
|
-
* @param id ID of the timer to remove
|
|
89
|
-
* @returns
|
|
98
|
+
* @param {string} id ID of the timer to remove
|
|
99
|
+
* @returns Promise resolving when the operation is complete
|
|
90
100
|
* @throws If file operation fails
|
|
91
101
|
* @example
|
|
92
102
|
* await manager.removeTimer(id);
|
|
@@ -96,37 +106,35 @@ class TimersManager {
|
|
|
96
106
|
this.TimersStore ??= await this.createTimersStore();
|
|
97
107
|
const timers = await this.TimersStore.loadTimers();
|
|
98
108
|
const index = timers.findIndex(t => t.id === id);
|
|
99
|
-
if (index === -1) {
|
|
109
|
+
if (index === -1 || timers[index] === undefined) {
|
|
100
110
|
throw new Error(`Timer with id ${id} not found`);
|
|
101
111
|
}
|
|
102
112
|
timers.splice(index, 1);
|
|
103
113
|
await this.TimersStore.saveTimers(timers);
|
|
114
|
+
await this.emit("stopped", timers[index]);
|
|
104
115
|
return;
|
|
105
116
|
});
|
|
106
117
|
}
|
|
107
118
|
/**
|
|
108
|
-
*
|
|
109
|
-
* @description Starts
|
|
110
|
-
*
|
|
111
|
-
* The
|
|
112
|
-
* @
|
|
113
|
-
* @param interval (number, optional): Check interval in milliseconds (default: 200ms)
|
|
114
|
-
* @throws If file operation fails
|
|
115
|
-
* @returns (Promise<NodeJS.Timeout>) intervalId interval id of checkTimers
|
|
119
|
+
* checkStart
|
|
120
|
+
* @description Starts the timer checking loop. This method should be called once after creating an instance of TimersManager to detect expired timers.
|
|
121
|
+
* @param {number} [interval=200] Polling interval in milliseconds (default: 200ms)
|
|
122
|
+
* @returns The interval ID which can be used to stop the loop with clearInterval
|
|
123
|
+
* @throws If file operation fails during checking
|
|
116
124
|
* @example
|
|
117
|
-
* const
|
|
118
|
-
*
|
|
119
|
-
* });
|
|
125
|
+
* const manager = new TimersManager();
|
|
126
|
+
* manager.checkStart(1000); // Check for expired timers every 1 second
|
|
120
127
|
*/
|
|
121
|
-
async
|
|
128
|
+
async checkStart(interval = 200) {
|
|
122
129
|
this.TimersStore ??= await this.createTimersStore();
|
|
123
130
|
const loop = async () => {
|
|
124
|
-
if (this.checkLock)
|
|
131
|
+
if (this.checkLock)
|
|
125
132
|
return;
|
|
126
|
-
}
|
|
127
133
|
this.checkLock = true;
|
|
134
|
+
let expiredTimers = [];
|
|
128
135
|
try {
|
|
129
|
-
|
|
136
|
+
expiredTimers = await this.runExclusive(async () => {
|
|
137
|
+
await this.emit("interval", void 0);
|
|
130
138
|
const allTimers = await this.TimersStore.loadTimers();
|
|
131
139
|
const now = Date.now();
|
|
132
140
|
const expired = [];
|
|
@@ -144,35 +152,33 @@ class TimersManager {
|
|
|
144
152
|
}
|
|
145
153
|
return expired;
|
|
146
154
|
});
|
|
147
|
-
for (const timerData of expiredTimers) {
|
|
148
|
-
try {
|
|
149
|
-
await callback(timerData);
|
|
150
|
-
}
|
|
151
|
-
catch (e) {
|
|
152
|
-
await Log_js_1.Log.ensureLogger();
|
|
153
|
-
Log_js_1.Log.loggerInstance?.error(`Error in callback of checkTimers: ${e}`);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
155
|
}
|
|
157
156
|
catch (e) {
|
|
158
|
-
|
|
159
|
-
Log_js_1.Log.loggerInstance?.error(`Error when checking timer: ${e}`);
|
|
160
|
-
}
|
|
161
|
-
finally {
|
|
157
|
+
this.emit("errored", e instanceof Error ? e : new Error(String(e))).catch(() => { });
|
|
162
158
|
this.checkLock = false;
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
for (const timer of expiredTimers) {
|
|
162
|
+
try {
|
|
163
|
+
await this.emit("expired", timer);
|
|
164
|
+
}
|
|
165
|
+
catch (e) {
|
|
166
|
+
await this.emit("errored", e instanceof Error ? e : new Error(String(e)));
|
|
167
|
+
}
|
|
163
168
|
}
|
|
169
|
+
this.checkLock = false;
|
|
164
170
|
};
|
|
165
171
|
return setInterval(loop, interval);
|
|
166
172
|
}
|
|
167
173
|
/**
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
174
|
+
* showTimers
|
|
175
|
+
* @description Retrieves all active timers.
|
|
176
|
+
* @returns Array of `Timer` objects
|
|
177
|
+
* @throws If file operation fails
|
|
178
|
+
* @example
|
|
179
|
+
* const timers = await manager.showTimers();
|
|
180
|
+
* console.log(JSON.stringify(timers))
|
|
181
|
+
*/
|
|
176
182
|
async showTimers() {
|
|
177
183
|
return this.runExclusive(async () => {
|
|
178
184
|
this.TimersStore ??= await this.createTimersStore();
|
|
@@ -183,8 +189,8 @@ class TimersManager {
|
|
|
183
189
|
/**
|
|
184
190
|
* adjustRemainingTime
|
|
185
191
|
* @description Adjusts the remaining time of a timer.
|
|
186
|
-
* @param id ID of the timer to modify
|
|
187
|
-
* @param delay Delay in milliseconds to add/subtract from the remaining time
|
|
192
|
+
* @param {string} id ID of the timer to modify
|
|
193
|
+
* @param {number} delay Delay in milliseconds to add/subtract from the remaining time
|
|
188
194
|
* @returns Promise resolving when the operation is complete
|
|
189
195
|
* @throws If file operation fails
|
|
190
196
|
*/
|
|
@@ -193,16 +199,17 @@ class TimersManager {
|
|
|
193
199
|
this.TimersStore ??= await this.createTimersStore();
|
|
194
200
|
const timers = await this.TimersStore.loadTimers();
|
|
195
201
|
const index = timers.findIndex(t => t.id === id);
|
|
196
|
-
if (index === -1) {
|
|
202
|
+
if (index === -1 || timers[index] === undefined) {
|
|
197
203
|
throw new Error(`Timer with id ${id} not found`);
|
|
198
204
|
}
|
|
205
|
+
const old = { ...timers[index] };
|
|
199
206
|
const now = Date.now();
|
|
200
207
|
const timer = timers[index];
|
|
201
208
|
const remaining = Math.max(0, timer.stop - now);
|
|
202
209
|
const newRemaining = Math.max(0, remaining + delay);
|
|
203
210
|
timer.stop = now + newRemaining;
|
|
204
|
-
timers[index] = timer;
|
|
205
211
|
await this.TimersStore.saveTimers(timers);
|
|
212
|
+
await this.emit("updated", { old, new: timer });
|
|
206
213
|
return;
|
|
207
214
|
});
|
|
208
215
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimersManager.js","sourceRoot":"","sources":["../../../src/TimersManager/TimersManager.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,4CAAoB;AACpB,+BAAoC;AAEpC,qEAA0C;AAG1C,
|
|
1
|
+
{"version":3,"file":"TimersManager.js","sourceRoot":"","sources":["../../../src/TimersManager/TimersManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Timer } from "../types.js";
|
|
2
2
|
import { TimersStore } from "./TimersStore.js";
|
|
3
|
-
export declare class JSONLTimersStore extends TimersStore<"JSONL"> {
|
|
3
|
+
export declare class JSONLTimersStore<Extra extends object> extends TimersStore<"JSONL", Extra> {
|
|
4
4
|
constructor(timerfile: string);
|
|
5
5
|
/**
|
|
6
6
|
* checkTimerfileSyntax
|
|
@@ -9,8 +9,8 @@ export declare class JSONLTimersStore extends TimersStore<"JSONL"> {
|
|
|
9
9
|
* @returns void
|
|
10
10
|
* @throws If syntax is invalid
|
|
11
11
|
*/
|
|
12
|
-
protected checkTimerfileSyntax(timers: Timer<"JSONL">[]): Promise<void>;
|
|
13
|
-
toStringifyTimers(timers: Timer<"JSONL">[]): string;
|
|
14
|
-
parseTimers(data: string): Timer<"JSONL">[];
|
|
12
|
+
protected checkTimerfileSyntax(timers: Timer<"JSONL", Extra>[]): Promise<void>;
|
|
13
|
+
toStringifyTimers(timers: Timer<"JSONL", Extra>[]): string;
|
|
14
|
+
parseTimers(data: string): Timer<"JSONL", Extra>[];
|
|
15
15
|
}
|
|
16
16
|
//# sourceMappingURL=JSONLTimersStore.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JSONLTimersStore.d.ts","sourceRoot":"","sources":["../../../src/TimersStore/JSONLTimersStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,qBAAa,
|
|
1
|
+
{"version":3,"file":"JSONLTimersStore.d.ts","sourceRoot":"","sources":["../../../src/TimersStore/JSONLTimersStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,qBAAa,gBAAgB,CAAC,KAAK,SAAS,MAAM,CAAE,SAAQ,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC;gBAGrF,SAAS,EAAE,MAAM;IAKlB;;;;;;OAMG;cACsB,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAe7E,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,GAAG,MAAM;IAO1D,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;CAMlE"}
|
|
@@ -19,6 +19,10 @@ class JSONLTimersStore extends TimersStore_js_1.TimersStore {
|
|
|
19
19
|
throw new Error(`Timer file's syntax is wrong`);
|
|
20
20
|
};
|
|
21
21
|
for (const timer of timers) {
|
|
22
|
+
if (Object.keys(timer).length !== 4)
|
|
23
|
+
throwing();
|
|
24
|
+
if (Object.keys(timer).length !== 4)
|
|
25
|
+
throwing();
|
|
22
26
|
if (!timer.id || !(0, uuid_1.validate)(timer.id))
|
|
23
27
|
throwing();
|
|
24
28
|
if (!timer.start || typeof timer.start !== "number")
|
|
@@ -27,9 +31,7 @@ class JSONLTimersStore extends TimersStore_js_1.TimersStore {
|
|
|
27
31
|
throwing();
|
|
28
32
|
if (timer.start > timer.stop)
|
|
29
33
|
throwing();
|
|
30
|
-
if (timer.
|
|
31
|
-
throwing();
|
|
32
|
-
if (timer.description && typeof timer.description !== "string")
|
|
34
|
+
if (!timer.extra || typeof timer.extra !== "object")
|
|
33
35
|
throwing();
|
|
34
36
|
}
|
|
35
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JSONLTimersStore.js","sourceRoot":"","sources":["../../../src/TimersStore/JSONLTimersStore.ts"],"names":[],"mappings":";;;AAAA,+BAAgC;AAGhC,qDAA+C;AAE/C,MAAa,
|
|
1
|
+
{"version":3,"file":"JSONLTimersStore.js","sourceRoot":"","sources":["../../../src/TimersStore/JSONLTimersStore.ts"],"names":[],"mappings":";;;AAAA,+BAAgC;AAGhC,qDAA+C;AAE/C,MAAa,gBAAuC,SAAQ,4BAA2B;IAEtF,YACC,SAAiB;QAEjB,KAAK,CAAC,SAAS,CAAC,CAAC;IAClB,CAAC;IAED;;;;;;OAMG;IACgB,KAAK,CAAC,oBAAoB,CAAC,MAA+B;QAC5E,MAAM,QAAQ,GAAG,GAAG,EAAE;YACrB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACjD,CAAC,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;gBAAE,QAAQ,EAAE,CAAC;YAChD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;gBAAE,QAAQ,EAAE,CAAC;YAChD,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,IAAA,eAAQ,EAAC,KAAK,CAAC,EAAE,CAAC;gBAAE,QAAQ,EAAE,CAAC;YACjD,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;gBAAE,QAAQ,EAAE,CAAC;YAChE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,QAAQ,EAAE,CAAC;YAC9D,IAAI,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI;gBAAE,QAAQ,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;gBAAE,QAAQ,EAAE,CAAC;QACjE,CAAC;IACF,CAAC;IAEe,iBAAiB,CAAC,MAA+B;QAChE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,CAAC;QACX,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IAEe,WAAW,CAAC,IAAY;QACvC,OAAO,IAAI;aACT,KAAK,CAAC,OAAO,CAAC;aACd,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC7B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAA0B,CAAC,CAAC;IAC5D,CAAC;CACD;AA3CD,4CA2CC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Timer } from "../types.js";
|
|
2
2
|
import { TimersStore } from "./TimersStore.js";
|
|
3
|
-
export declare class PlainTextTimersStore extends TimersStore<"PlainText"> {
|
|
3
|
+
export declare class PlainTextTimersStore extends TimersStore<"PlainText", object> {
|
|
4
4
|
constructor(timerfile: string);
|
|
5
5
|
/**
|
|
6
6
|
* checkTimerfileSyntax
|
|
@@ -9,8 +9,8 @@ export declare class PlainTextTimersStore extends TimersStore<"PlainText"> {
|
|
|
9
9
|
* @returns void
|
|
10
10
|
* @throws If syntax is invalid
|
|
11
11
|
*/
|
|
12
|
-
protected checkTimerfileSyntax(timers: Timer<"PlainText">[]): Promise<void>;
|
|
13
|
-
toStringifyTimers(timers: Timer<"PlainText">[]): string;
|
|
14
|
-
parseTimers(data: string): Timer<"PlainText">[];
|
|
12
|
+
protected checkTimerfileSyntax(timers: Timer<"PlainText", object>[]): Promise<void>;
|
|
13
|
+
toStringifyTimers(timers: Timer<"PlainText", object>[]): string;
|
|
14
|
+
parseTimers(data: string): Timer<"PlainText", object>[];
|
|
15
15
|
}
|
|
16
16
|
//# sourceMappingURL=PlainTextTimersStore.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlainTextTimersStore.d.ts","sourceRoot":"","sources":["../../../src/TimersStore/PlainTextTimersStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,qBAAa,oBAAqB,SAAQ,WAAW,CAAC,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"PlainTextTimersStore.d.ts","sourceRoot":"","sources":["../../../src/TimersStore/PlainTextTimersStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,qBAAa,oBAAqB,SAAQ,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC;gBAGxE,SAAS,EAAE,MAAM;IAKlB;;;;;;OAMM;cACmB,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAclF,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,GAAG,MAAM;IAO/D,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE;CAavE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlainTextTimersStore.js","sourceRoot":"","sources":["../../../src/TimersStore/PlainTextTimersStore.ts"],"names":[],"mappings":";;;AAAA,+BAAgC;AAGhC,qDAA+C;AAE/C,MAAa,oBAAqB,SAAQ,
|
|
1
|
+
{"version":3,"file":"PlainTextTimersStore.js","sourceRoot":"","sources":["../../../src/TimersStore/PlainTextTimersStore.ts"],"names":[],"mappings":";;;AAAA,+BAAgC;AAGhC,qDAA+C;AAE/C,MAAa,oBAAqB,SAAQ,4BAAgC;IAEzE,YACC,SAAiB;QAEjB,KAAK,CAAC,SAAS,CAAC,CAAC;IAClB,CAAC;IAED;;;;;;OAMM;IACa,KAAK,CAAC,oBAAoB,CAAC,MAAoC;QACjF,MAAM,QAAQ,GAAG,GAAG,EAAE;YACrB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACjD,CAAC,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;gBAAE,QAAQ,EAAE,CAAC;YAChD,IAAI,CAAC,IAAA,eAAQ,EAAC,KAAK,CAAC,EAAE,CAAC;gBAAE,QAAQ,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAAE,QAAQ,EAAE,CAAC;YAC3C,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAAE,QAAQ,EAAE,CAAC;YAC1C,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,QAAQ,EAAE,CAAC;QAC1D,CAAC;QACD,OAAO;IACR,CAAC;IAEe,iBAAiB,CAAC,MAAoC;QACrE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,CAAC;QACX,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnF,CAAC;IAEe,WAAW,CAAC,IAAY;QACvC,OAAO,IAAI;aACT,KAAK,CAAC,OAAO,CAAC;aACd,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC7B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACb,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAChD,OAAO;gBACN,EAAE,EAAE,EAAG;gBACP,KAAK,EAAE,MAAM,CAAC,QAAS,CAAC;gBACxB,IAAI,EAAE,MAAM,CAAC,OAAQ,CAAC;aACQ,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;CACD;AAjDD,oDAiDC"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { StorageType, Timer } from "../types.js";
|
|
2
|
-
export declare abstract class TimersStore<T extends StorageType> {
|
|
2
|
+
export declare abstract class TimersStore<T extends StorageType, Extra extends object> {
|
|
3
3
|
protected readonly timerfile: string;
|
|
4
4
|
protected constructor(timerfile: string);
|
|
5
|
-
loadTimers(): Promise<Timer<T>[]>;
|
|
6
|
-
saveTimers(timers: Timer<T>[]): Promise<void>;
|
|
7
|
-
appendTimer(timer: Timer<T>): Promise<void>;
|
|
8
|
-
protected abstract checkTimerfileSyntax(timers: Timer<T>[]): Promise<void>;
|
|
9
|
-
abstract toStringifyTimers(timers: Timer<T>[]): string;
|
|
10
|
-
abstract parseTimers(data: string): Timer<T>[];
|
|
5
|
+
loadTimers(): Promise<Timer<T, Extra>[]>;
|
|
6
|
+
saveTimers(timers: Timer<T, Extra>[]): Promise<void>;
|
|
7
|
+
appendTimer(timer: Timer<T, Extra>): Promise<void>;
|
|
8
|
+
protected abstract checkTimerfileSyntax(timers: Timer<T, Extra>[]): Promise<void>;
|
|
9
|
+
abstract toStringifyTimers(timers: Timer<T, Extra>[]): string;
|
|
10
|
+
abstract parseTimers(data: string): Timer<T, Extra>[];
|
|
11
11
|
}
|
|
12
12
|
//# sourceMappingURL=TimersStore.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimersStore.d.ts","sourceRoot":"","sources":["../../../src/TimersStore/TimersStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEtD,8BAAsB,WAAW,CAAC,CAAC,SAAS,WAAW;
|
|
1
|
+
{"version":3,"file":"TimersStore.d.ts","sourceRoot":"","sources":["../../../src/TimersStore/TimersStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEtD,8BAAsB,WAAW,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,SAAS,MAAM;IAC5E,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAErC,SAAS,aACR,SAAS,EAAE,MAAM;IAKL,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;IAWxC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpD,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5D,SAAS,CAAC,QAAQ,CAAC,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;aACjE,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,MAAM;aACvD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE;CAC5D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimersStore.js","sourceRoot":"","sources":["../../../src/TimersStore/TimersStore.ts"],"names":[],"mappings":";;;;;;AAAA,2DAA6B;AAI7B,MAAsB,WAAW;IACb,SAAS,CAAS;IAErC,YACC,SAAiB;QAEjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5B,CAAC;IAEM,KAAK,CAAC,UAAU;QACtB,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACxD,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"TimersStore.js","sourceRoot":"","sources":["../../../src/TimersStore/TimersStore.ts"],"names":[],"mappings":";;;;;;AAAA,2DAA6B;AAI7B,MAAsB,WAAW;IACb,SAAS,CAAS;IAErC,YACC,SAAiB;QAEjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5B,CAAC;IAEM,KAAK,CAAC,UAAU;QACtB,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACxD,MAAM,UAAU,GAAsB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAC7D,MAAM,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;YAC5C,OAAO,UAAU,CAAC;QACnB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,+BAA+B,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAChE,CAAC;IACF,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,MAAyB;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAE5C,IAAI,CAAC;YACJ,MAAM,kBAAE,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,8BAA8B,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;IACF,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,KAAsB;QAC9C,IAAI,CAAC;YACJ,MAAM,kBAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC5E,OAAO;QACR,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,iCAAiC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC;IACF,CAAC;CAKD;AA1CD,kCA0CC"}
|
package/dist/cjs/types.d.ts
CHANGED
|
@@ -1,18 +1,30 @@
|
|
|
1
1
|
export type StorageType = "JSONL" | "PlainText";
|
|
2
|
-
export type Timer<T extends StorageType> = T extends "JSONL" ? {
|
|
2
|
+
export type Timer<T extends StorageType, Extra extends object> = T extends "JSONL" ? {
|
|
3
3
|
id: string;
|
|
4
4
|
start: number;
|
|
5
5
|
stop: number;
|
|
6
|
-
|
|
7
|
-
description?: string;
|
|
6
|
+
extra: Extra;
|
|
8
7
|
} : {
|
|
9
8
|
id: string;
|
|
10
9
|
start: number;
|
|
11
10
|
stop: number;
|
|
12
11
|
};
|
|
13
|
-
export type CreateTimerOptions<T extends StorageType> = T extends "JSONL" ? {
|
|
12
|
+
export type CreateTimerOptions<T extends StorageType, Extra extends object> = T extends "JSONL" ? {
|
|
14
13
|
length: number;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
extra: Extra;
|
|
15
|
+
} : T extends "PlainText" ? number : never;
|
|
16
|
+
export type TimerEvents<T extends StorageType, Extra extends object> = {
|
|
17
|
+
expired: Timer<T, Extra>;
|
|
18
|
+
errored: Error;
|
|
19
|
+
interval: void;
|
|
20
|
+
started: Timer<T, Extra>;
|
|
21
|
+
stopped: Timer<T, Extra>;
|
|
22
|
+
updated: {
|
|
23
|
+
old: Timer<T, Extra>;
|
|
24
|
+
new: Timer<T, Extra>;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
export type ListenerMap<T extends StorageType, Extra extends object> = {
|
|
28
|
+
[K in keyof TimerEvents<T, Extra>]?: ((payload: TimerEvents<T, Extra>[K]) => void | Promise<void>)[];
|
|
29
|
+
};
|
|
18
30
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/cjs/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,WAAW,CAAC;AAEhD,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,WAAW,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,WAAW,CAAC;AAEhD,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,SAAS,MAAM,IACzD,CAAC,SAAS,OAAO,GACX;IACI,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAA;CACf,GACD;IACI,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAEZ,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,SAAS,MAAM,IAAI,CAAC,SAAS,OAAO,GACzF;IACI,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAA;CACf,GACD,CAAC,SAAS,WAAW,GACnB,MAAM,GACN,KAAK,CAAC;AAEd,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,SAAS,MAAM,IAAI;IACrE,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACxB,OAAO,EAAE,KAAK,CAAA;IACd,QAAQ,EAAE,IAAI,CAAA;IACd,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACxB,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACxB,OAAO,EAAE;QAAE,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;KAAE,CAAA;CACxD,CAAA;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,SAAS,MAAM,IAAI;KACpE,CAAC,IAAI,MAAM,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CACpC,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAC9B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE;CAC7B,CAAA"}
|
|
@@ -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"}
|