eternal-timer 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +57 -24
  2. package/dist/cjs/JSONLTimersManager.cjs +193 -0
  3. package/dist/cjs/JSONLTimersManager.d.ts +63 -0
  4. package/dist/cjs/JSONLTimersManager.d.ts.map +1 -0
  5. package/dist/cjs/JSONLTimersManager.js.map +1 -0
  6. package/dist/cjs/Log.cjs +82 -0
  7. package/dist/cjs/Log.d.ts +8 -0
  8. package/dist/cjs/Log.d.ts.map +1 -0
  9. package/dist/cjs/Log.js.map +1 -0
  10. package/dist/cjs/PlainTextTimersManager.cjs +192 -0
  11. package/dist/cjs/PlainTextTimersManager.d.ts +60 -0
  12. package/dist/cjs/PlainTextTimersManager.d.ts.map +1 -0
  13. package/dist/cjs/PlainTextTimersManager.js.map +1 -0
  14. package/dist/cjs/TimersManager.cjs +39 -0
  15. package/dist/cjs/TimersManager.d.ts +75 -0
  16. package/dist/cjs/TimersManager.d.ts.map +1 -0
  17. package/dist/cjs/TimersManager.js.map +1 -0
  18. package/dist/cjs/index.cjs +5 -279
  19. package/dist/cjs/index.d.ts +3 -72
  20. package/dist/cjs/index.d.ts.map +1 -1
  21. package/dist/cjs/index.js.map +1 -1
  22. package/dist/cjs/types.cjs +3 -0
  23. package/dist/cjs/types.d.ts +8 -0
  24. package/dist/cjs/types.d.ts.map +1 -0
  25. package/dist/cjs/types.js.map +1 -0
  26. package/dist/esm/JSONLTimersManager.d.ts +63 -0
  27. package/dist/esm/JSONLTimersManager.d.ts.map +1 -0
  28. package/dist/esm/JSONLTimersManager.js +186 -0
  29. package/dist/esm/JSONLTimersManager.js.map +1 -0
  30. package/dist/esm/Log.d.ts +8 -0
  31. package/dist/esm/Log.d.ts.map +1 -0
  32. package/dist/esm/Log.js +45 -0
  33. package/dist/esm/Log.js.map +1 -0
  34. package/dist/esm/PlainTextTimersManager.d.ts +60 -0
  35. package/dist/esm/PlainTextTimersManager.d.ts.map +1 -0
  36. package/dist/esm/PlainTextTimersManager.js +185 -0
  37. package/dist/esm/PlainTextTimersManager.js.map +1 -0
  38. package/dist/esm/TimersManager.d.ts +75 -0
  39. package/dist/esm/TimersManager.d.ts.map +1 -0
  40. package/dist/esm/TimersManager.js +32 -0
  41. package/dist/esm/TimersManager.js.map +1 -0
  42. package/dist/esm/index.d.ts +3 -72
  43. package/dist/esm/index.d.ts.map +1 -1
  44. package/dist/esm/index.js +2 -274
  45. package/dist/esm/index.js.map +1 -1
  46. package/dist/esm/types.d.ts +8 -0
  47. package/dist/esm/types.d.ts.map +1 -0
  48. package/dist/esm/types.js +2 -0
  49. package/dist/esm/types.js.map +1 -0
  50. package/package.json +12 -4
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # eternal-timer
2
2
 
3
- ![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/SUKEsann2000/eternal-timer/publish.yml)
3
+ ![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/SUKEsann2000/eternal-timer/run_test.yml)
4
4
  ![NPM Downloads](https://img.shields.io/npm/dm/eternal-timer)
5
5
 
6
6
  A simple and persistent timer library for Node.js. Timers are saved to a file and maintain their state even after process restart.
@@ -9,7 +9,7 @@ A simple and persistent timer library for Node.js. Timers are saved to a file an
9
9
 
10
10
  - **Monitor Timers (asynchronous)**: Start monitoring expired timers asynchronously; the function returns immediately and the callback is called when timers expire.
11
11
  - **Persistence**: Save timer data to a file that persists across process restarts
12
- - **JSON Lines Support**: Use the `.jsonl` extension for your timer file to store richer data, including titles and descriptions.
12
+ - **Choice of Format**: Choose between JSON Lines for rich data or plain text for lightweight storage.
13
13
 
14
14
  ## Installation
15
15
 
@@ -19,15 +19,18 @@ npm install eternal-timer
19
19
 
20
20
  ## Usage
21
21
 
22
- ### Basic Example
22
+ You can choose between two manager classes depending on the desired storage format.
23
+
24
+ ### `JSONLTimersManager` (JSON Lines)
25
+
26
+ Use this manager to store timers in a `.jsonl` file, which allows for storing `title` and `description`.
23
27
 
24
28
  ```javascript
25
- import { TimersManager } from 'eternal-timer';
29
+ import { JSONLTimersManager } from 'eternal-timer';
26
30
 
27
31
  async function main() {
28
32
  // By default, timers are stored in '.timers.jsonl' in the project root.
29
- // Using a .jsonl file enables storing title and description.
30
- const manager = new TimersManager();
33
+ const manager = new JSONLTimersManager();
31
34
 
32
35
  // Create a timer (5 seconds) with a title and description
33
36
  const timerId = await manager.createTimer(5000, 'My Timer', 'This is a test timer.');
@@ -49,17 +52,47 @@ async function main() {
49
52
  main();
50
53
  ```
51
54
 
55
+ ### `PlainTextTimersManager` (Plain Text)
56
+
57
+ Use this manager for a more lightweight plain-text format.
58
+
59
+ ```javascript
60
+ import { PlainTextTimersManager } from 'eternal-timer';
61
+
62
+ async function main() {
63
+ // By default, timers are stored in '.timers' in the project root.
64
+ const manager = new PlainTextTimersManager();
65
+
66
+ // Create a timer (5 seconds)
67
+ const timerId = await manager.createTimer(5000);
68
+ console.log('Timer created:', timerId);
69
+
70
+ // Monitor timers
71
+ const interval = manager.checkTimers(async (timer) => {
72
+ console.log('Timer expired:', timer.id);
73
+ });
74
+ }
75
+
76
+ main();
77
+ ```
78
+
52
79
  ## API
53
80
 
54
- ### `new TimersManager(timerfiledir?: string)`
81
+ ### `new JSONLTimersManager(timerfiledir?: string)`
82
+
83
+ Creates a manager for timers stored in the **JSON Lines** format.
55
84
 
56
- Creates a new `TimersManager` instance.
85
+ **Parameters:**
86
+ - `timerfiledir` (string, optional): The path to the timer file. If omitted, the default is `.timers.jsonl` in the project root.
87
+
88
+ ### `new PlainTextTimersManager(timerfiledir?: string)`
89
+
90
+ Creates a manager for timers stored in the **plain-text** format.
57
91
 
58
92
  **Parameters:**
59
- - `timerfiledir` (string, optional): The path to the timer file. The file extension determines the storage format.
60
- - **`.jsonl` extension**: Timers are stored in the feature-rich **JSON Lines** format.
61
- - **Other extensions (or no extension)**: Timers are stored in the lightweight **plain-text** format.
62
- - If omitted, the default is `.timers.jsonl` in the project root.
93
+ - `timerfiledir` (string, optional): The path to the timer file. If omitted, the default is `.timers` in the project root.
94
+
95
+ ---
63
96
 
64
97
  ### `createTimer(length: number, title?: string, description?: string): Promise<string>`
65
98
 
@@ -67,8 +100,8 @@ Creates a new timer.
67
100
 
68
101
  **Parameters:**
69
102
  - `length` (number): Timer duration in milliseconds
70
- - `title` (string, optional): A title for the timer. Only stored if using a `.jsonl` file.
71
- - `description` (string, optional): A description for the timer. Only stored if using a `.jsonl` file.
103
+ - `title` (string, optional): A title for the timer. **Only available for `JSONLTimersManager`**.
104
+ - `description` (string, optional): A description for the timer. **Only available for `JSONLTimersManager`**.
72
105
 
73
106
  **Returns:** Promise that resolves to the timer ID (UUID)
74
107
 
@@ -128,25 +161,27 @@ type Timer = {
128
161
  - `npm run test`: Test the compiled code
129
162
  - `npm run lint`: Lint all codes
130
163
 
131
- ## Storage
164
+ ## Storage Formats
132
165
 
133
- You can choose between two storage formats based on the file extension you provide to the `TimersManager` constructor.
166
+ You can choose between two storage formats by selecting the appropriate manager class.
134
167
 
135
- ### 1. JSON Lines (`.jsonl`) - Default
136
- This is the default format, used when the timer file has a `.jsonl` extension.
168
+ ### 1. JSON Lines (via `JSONLTimersManager`)
169
+ This is the recommended format for storing rich metadata.
137
170
 
138
- - **Pros**: Allows for storing rich metadata like `title` and `description`.
171
+ - **Pros**: Allows for storing `title` and `description`.
139
172
  - **Cons**: Involves JSON parsing, which may have a minor performance overhead.
173
+ - **Default File**: `.timers.jsonl`
140
174
  - **Format**:
141
175
  ```json
142
176
  {"id":"...","start":1678886400000,"stop":1678886405000,"title":"My Timer","description":"..."}
143
177
  ```
144
178
 
145
- ### 2. Plain Text
146
- This format is used for any file that does not have a `.jsonl` extension (e.g., `.timers`).
179
+ ### 2. Plain Text (via `PlainTextTimersManager`)
180
+ This format is more lightweight and slightly faster.
147
181
 
148
- - **Pros**: More lightweight and slightly faster due to avoiding JSON parsing.
182
+ - **Pros**: Simple and efficient.
149
183
  - **Cons**: Cannot store additional data like `title` or `description`.
184
+ - **Default File**: `.timers`
150
185
  - **Format**:
151
186
  ```
152
187
  {id} {start_timestamp} {stop_timestamp}
@@ -161,5 +196,3 @@ Licensed under the Apache License, Version 2.0. See the `LICENSE` file for detai
161
196
  ## Repository
162
197
 
163
198
  https://github.com/SUKEsann2000/eternal-timer
164
-
165
-
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.JSONLTimersManager = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const uuid_1 = require("uuid");
9
+ const TimersManager_js_1 = require("./TimersManager.cjs");
10
+ const Log_js_1 = require("./Log.cjs");
11
+ /**
12
+ * JSONLTimersManager
13
+ * @description
14
+ * Manages timers stored in a JSONL file.
15
+ * (This is a abstract class)
16
+ *
17
+ * - Timers are persisted in a file
18
+ * - Expired timers are detected by polling
19
+ */
20
+ class JSONLTimersManager extends TimersManager_js_1.TimersManager {
21
+ getDefaultFilename() {
22
+ return ".timers.jsonl";
23
+ }
24
+ async checkTimerfileSyntax(fileData) {
25
+ const throwing = () => {
26
+ throw new Error(`Timer file's syntax is wrong`);
27
+ };
28
+ const timersData = fileData
29
+ .split('\n')
30
+ .map(l => l.trim())
31
+ .filter(l => l !== "");
32
+ for (const timerData of timersData) {
33
+ const parsed = JSON.parse(timerData);
34
+ if (!parsed.id || typeof parsed.id !== "string" || parsed.id.length !== 36)
35
+ throwing();
36
+ if (!parsed.start || typeof parsed.start !== "number" || parsed.start.toString().trim() === "")
37
+ throwing();
38
+ if (!parsed.stop || typeof parsed.stop !== "number" || parsed.stop.toString().trim() === "")
39
+ throwing();
40
+ if (parsed.title && typeof parsed.title !== "string")
41
+ throwing();
42
+ if (parsed.description && typeof parsed.description !== "string")
43
+ throwing();
44
+ }
45
+ return;
46
+ }
47
+ /**
48
+ * createTimer
49
+ * @description Creates a new timer.
50
+ * @param length Timer duration in milliseconds
51
+ * @param title(string, optional) Title of the timer(only for JSONLTimersManager)
52
+ * @param description(string, optional) Description of the timer(only for JSONLTimersManager)
53
+ * @returns Promise that resolves to the timer ID (UUID)
54
+ * @throws If length is invalid(e.g. length < 0) or file operation fails
55
+ * @example
56
+ * const manager = new JSONLTimersManager();
57
+ * const newTimer = await manager.createTimer(5000);
58
+ * // newTimer will be id of the timer
59
+ */
60
+ async createTimer(length, title, description) {
61
+ try {
62
+ if (length < 0) {
63
+ throw new Error(`Invailed length: ${length}`);
64
+ }
65
+ const timersRaw = await fs_1.default.promises.readFile(this.timerfiledir, "utf-8");
66
+ await this.checkTimerfileSyntax(timersRaw);
67
+ length = Math.trunc(length);
68
+ // uuid, start, end
69
+ const id = (0, uuid_1.v4)();
70
+ const now = Date.now();
71
+ const newTimerData = JSON.stringify({
72
+ id,
73
+ start: now,
74
+ stop: (now + length),
75
+ ...(title !== undefined && { title }),
76
+ ...(description !== undefined && { description }),
77
+ });
78
+ await fs_1.default.promises.appendFile(this.timerfiledir, newTimerData + "\n");
79
+ return id;
80
+ }
81
+ catch (e) {
82
+ throw new Error(`Error when creating timer: ${e}`);
83
+ }
84
+ }
85
+ /**
86
+ * removeTimer
87
+ * @description Removes a timer by ID.
88
+ * @param id ID of the timer to remove
89
+ * @returns void
90
+ * @throws If file operation fails
91
+ * @example
92
+ * await manager.removeTimer(id);
93
+ */
94
+ async removeTimer(id) {
95
+ try {
96
+ const timersRaw = await fs_1.default.promises.readFile(this.timerfiledir, "utf-8");
97
+ await this.checkTimerfileSyntax(timersRaw);
98
+ let newTimersData = "";
99
+ const timersData = timersRaw
100
+ .split(/\r?\n/)
101
+ .filter(t => t.trim())
102
+ .map(line => JSON.parse(line));
103
+ let found = false;
104
+ for (const timerData of timersData) {
105
+ if (!timerData)
106
+ continue;
107
+ if (timerData.id === id) {
108
+ found = true;
109
+ continue;
110
+ }
111
+ newTimersData += `${JSON.stringify(timerData, null, 0)}\n`;
112
+ }
113
+ if (!found) {
114
+ throw new Error(`Timer with id ${id} not found`);
115
+ }
116
+ await fs_1.default.promises.writeFile(this.timerfiledir, newTimersData, "utf-8");
117
+ return;
118
+ }
119
+ catch (e) {
120
+ throw new Error(`Error when removing timer: ${e}`);
121
+ }
122
+ }
123
+ /**
124
+ * @description Starts monitoring expired timers asynchronously and returns immediately. The callback is invoked asynchronously when a timer expires.
125
+ * The callback is awaited before continuing.
126
+ * @param callback Function invoked when an expired timer is detected (called asynchronously)
127
+ * @param interval (number, optional): Check interval in milliseconds (default: 50ms)
128
+ * @throws If file operation fails
129
+ * @returns (NodeJS.Timeout) intervalId interval id of checkTimers
130
+ * @example
131
+ * const interval = manager.checkTimers((timer) => {
132
+ * console.log(`A timer was stopped: ${timer.id}`);
133
+ * });
134
+ */
135
+ checkTimers(callback, interval = 50) {
136
+ return setInterval(async () => {
137
+ if (this.checkLock)
138
+ return;
139
+ this.checkLock = true;
140
+ try {
141
+ const timersDataRaw = await fs_1.default.promises.readFile(this.timerfiledir, "utf-8");
142
+ const timersMap = new Map();
143
+ const timersData = timersDataRaw
144
+ .split(/\r?\n/)
145
+ .filter(line => line.trim())
146
+ .map(line => JSON.parse(line));
147
+ for (const timer of timersData) {
148
+ timersMap.set(timer.id, timer);
149
+ }
150
+ const now = Date.now();
151
+ for (const timer of timersMap.values()) {
152
+ if (Number(timer.stop) <= now) {
153
+ await this.removeTimer(timer.id);
154
+ await callback(timer);
155
+ }
156
+ }
157
+ }
158
+ catch (e) {
159
+ await Log_js_1.Log.ensureLogger();
160
+ if (Log_js_1.Log.loggerInstance) {
161
+ Log_js_1.Log.loggerInstance.error(`Error when checking alarm: ${e}`);
162
+ }
163
+ }
164
+ finally {
165
+ this.checkLock = false;
166
+ }
167
+ }, interval);
168
+ }
169
+ /**
170
+ * showTimers
171
+ * @description Retrieves all active timers.
172
+ * @returns Array of `Timer` objects
173
+ * @throws If file operation fails
174
+ * @example
175
+ * const timers = await manager.showTimers();
176
+ * console.log(JSON.stringify(timers))
177
+ */
178
+ async showTimers() {
179
+ try {
180
+ const timersRaw = await fs_1.default.promises.readFile(this.timerfiledir, "utf-8");
181
+ const timersData = timersRaw
182
+ .split(/\r?\n/)
183
+ .filter(t => t.trim())
184
+ .map(line => JSON.parse(line));
185
+ return timersData;
186
+ }
187
+ catch (e) {
188
+ throw new Error(`Error when showing timers: ${e}`);
189
+ }
190
+ }
191
+ }
192
+ exports.JSONLTimersManager = JSONLTimersManager;
193
+ //# sourceMappingURL=JSONLTimersManager.js.map
@@ -0,0 +1,63 @@
1
+ import type { Timer } from "./types.cjs";
2
+ import { TimersManager } from "./TimersManager.cjs";
3
+ /**
4
+ * JSONLTimersManager
5
+ * @description
6
+ * Manages timers stored in a JSONL file.
7
+ * (This is a abstract class)
8
+ *
9
+ * - Timers are persisted in a file
10
+ * - Expired timers are detected by polling
11
+ */
12
+ export declare class JSONLTimersManager extends TimersManager {
13
+ protected getDefaultFilename(): string;
14
+ protected checkTimerfileSyntax(fileData: string): Promise<void>;
15
+ /**
16
+ * createTimer
17
+ * @description Creates a new timer.
18
+ * @param length Timer duration in milliseconds
19
+ * @param title(string, optional) Title of the timer(only for JSONLTimersManager)
20
+ * @param description(string, optional) Description of the timer(only for JSONLTimersManager)
21
+ * @returns Promise that resolves to the timer ID (UUID)
22
+ * @throws If length is invalid(e.g. length < 0) or file operation fails
23
+ * @example
24
+ * const manager = new JSONLTimersManager();
25
+ * const newTimer = await manager.createTimer(5000);
26
+ * // newTimer will be id of the timer
27
+ */
28
+ createTimer(length: number, title?: string, description?: string): Promise<string>;
29
+ /**
30
+ * removeTimer
31
+ * @description Removes a timer by ID.
32
+ * @param id ID of the timer to remove
33
+ * @returns void
34
+ * @throws If file operation fails
35
+ * @example
36
+ * await manager.removeTimer(id);
37
+ */
38
+ removeTimer(id: string): Promise<void>;
39
+ /**
40
+ * @description Starts monitoring expired timers asynchronously and returns immediately. The callback is invoked asynchronously when a timer expires.
41
+ * The callback is awaited before continuing.
42
+ * @param callback Function invoked when an expired timer is detected (called asynchronously)
43
+ * @param interval (number, optional): Check interval in milliseconds (default: 50ms)
44
+ * @throws If file operation fails
45
+ * @returns (NodeJS.Timeout) intervalId interval id of checkTimers
46
+ * @example
47
+ * const interval = manager.checkTimers((timer) => {
48
+ * console.log(`A timer was stopped: ${timer.id}`);
49
+ * });
50
+ */
51
+ checkTimers(callback: (timer: Timer) => Promise<void>, interval?: number): NodeJS.Timeout;
52
+ /**
53
+ * showTimers
54
+ * @description Retrieves all active timers.
55
+ * @returns Array of `Timer` objects
56
+ * @throws If file operation fails
57
+ * @example
58
+ * const timers = await manager.showTimers();
59
+ * console.log(JSON.stringify(timers))
60
+ */
61
+ showTimers(): Promise<Timer[]>;
62
+ }
63
+ //# sourceMappingURL=JSONLTimersManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSONLTimersManager.d.ts","sourceRoot":"","sources":["../../src/JSONLTimersManager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD;;;;;;;;GAQG;AACH,qBAAa,kBAAmB,SAAQ,aAAa;IACpD,SAAS,CAAC,kBAAkB,IAAI,MAAM;cAItB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBrE;;;;;;;;;;;;OAYM;IACO,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4B/F;;;;;;;;OAQM;IACO,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BnD;;;;;;;;;;;OAWM;IACC,WAAW,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAE,MAAW,GAAG,MAAM,CAAC,OAAO;IAoCpG;;;;;;;;OAQM;IACO,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;CAa3C"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSONLTimersManager.js","sourceRoot":"","sources":["../../src/JSONLTimersManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Log = void 0;
37
+ class Log {
38
+ static logger = null;
39
+ static initPromise = null;
40
+ static async ensureLogger() {
41
+ if (Log.logger)
42
+ return;
43
+ if (!Log.initPromise) {
44
+ Log.initPromise = (async () => {
45
+ try {
46
+ const logtape = await Promise.resolve().then(() => __importStar(require("@logtape/logtape")));
47
+ Log.logger = logtape.getLogger(["eternal-timer"]);
48
+ }
49
+ catch {
50
+ console.info("Tip: Install the optional package '@logtape/logtape' to customize logging behavior.");
51
+ }
52
+ })();
53
+ }
54
+ await Log.initPromise;
55
+ }
56
+ static get loggerInstance() {
57
+ return Log.logger;
58
+ }
59
+ }
60
+ exports.Log = Log;
61
+ /*
62
+ let logger: Logger | null = null;
63
+ let initPromise: Promise<void> | null = null;
64
+
65
+ export async function ensureLogger() {
66
+ if (logger) return;
67
+ if (!initPromise) {
68
+ initPromise = (async () => {
69
+ try {
70
+ const logtape = await import("@logtape/logtape");
71
+ logger = logtape.getLogger(["eternal-timer"]);
72
+ } catch {
73
+ console.info(
74
+ "Tip: Install the optional package '@logtape/logtape' to customize logging behavior.",
75
+ );
76
+ }
77
+ })();
78
+ }
79
+ await initPromise;
80
+ }
81
+ */
82
+ //# sourceMappingURL=Log.js.map
@@ -0,0 +1,8 @@
1
+ import type { Logger } from "@logtape/logtape";
2
+ export declare class Log {
3
+ private static logger;
4
+ private static initPromise;
5
+ static ensureLogger(): Promise<void>;
6
+ static get loggerInstance(): Logger | null;
7
+ }
8
+ //# sourceMappingURL=Log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Log.d.ts","sourceRoot":"","sources":["../../src/Log.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,qBAAa,GAAG;IACf,OAAO,CAAC,MAAM,CAAC,MAAM,CAAuB;IAC5C,OAAO,CAAC,MAAM,CAAC,WAAW,CAA8B;WAEpC,YAAY;IAiBhC,WAAkB,cAAc,IAAI,MAAM,GAAG,IAAI,CAEhD;CACD"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Log.js","sourceRoot":"","sources":["../../src/Log.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,MAAa,GAAG;IACP,MAAM,CAAC,MAAM,GAAkB,IAAI,CAAC;IACpC,MAAM,CAAC,WAAW,GAAyB,IAAI,CAAC;IAEjD,MAAM,CAAC,KAAK,CAAC,YAAY;QAC/B,IAAI,GAAG,CAAC,MAAM;YAAE,OAAO;QACvB,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YACtB,GAAG,CAAC,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;gBAC7B,IAAI,CAAC;oBACJ,MAAM,OAAO,GAAG,wDAAa,kBAAkB,GAAC,CAAC;oBACjD,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;gBACnD,CAAC;gBAAC,MAAM,CAAC;oBACR,OAAO,CAAC,IAAI,CACX,qFAAqF,CACrF,CAAC;gBACH,CAAC;YACF,CAAC,CAAC,EAAE,CAAC;QACN,CAAC;QACD,MAAM,GAAG,CAAC,WAAW,CAAC;IACvB,CAAC;IAEM,MAAM,KAAK,cAAc;QAC/B,OAAO,GAAG,CAAC,MAAM,CAAC;IACnB,CAAC;;AAvBF,kBAwBC;AAED;;;;;;;;;;;;;;;;;;;;EAoBE"}