eternal-timer 2.3.0 → 2.4.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 (86) hide show
  1. package/README.md +25 -13
  2. package/dist/cjs/TimersManager/JSONLTimersManager.cjs +25 -0
  3. package/dist/cjs/TimersManager/JSONLTimersManager.cjs.map +1 -0
  4. package/dist/cjs/TimersManager/JSONLTimersManager.d.ts +18 -0
  5. package/dist/cjs/TimersManager/JSONLTimersManager.d.ts.map +1 -0
  6. package/dist/cjs/TimersManager/PlainTextTimersManager.cjs +25 -0
  7. package/dist/cjs/TimersManager/PlainTextTimersManager.cjs.map +1 -0
  8. package/dist/cjs/TimersManager/PlainTextTimersManager.d.ts +18 -0
  9. package/dist/cjs/TimersManager/PlainTextTimersManager.d.ts.map +1 -0
  10. package/dist/cjs/TimersManager/TimersManager.cjs +211 -0
  11. package/dist/cjs/TimersManager/TimersManager.cjs.map +1 -0
  12. package/dist/cjs/TimersManager/TimersManager.d.ts +87 -0
  13. package/dist/cjs/TimersManager/TimersManager.d.ts.map +1 -0
  14. package/dist/cjs/TimersStore/JSONLTimersStore.cjs +50 -0
  15. package/dist/cjs/TimersStore/JSONLTimersStore.cjs.map +1 -0
  16. package/dist/cjs/TimersStore/JSONLTimersStore.d.ts +16 -0
  17. package/dist/cjs/TimersStore/JSONLTimersStore.d.ts.map +1 -0
  18. package/dist/cjs/TimersStore/PlainTextTimersStore.cjs +56 -0
  19. package/dist/cjs/TimersStore/PlainTextTimersStore.cjs.map +1 -0
  20. package/dist/cjs/TimersStore/PlainTextTimersStore.d.ts +16 -0
  21. package/dist/cjs/TimersStore/PlainTextTimersStore.d.ts.map +1 -0
  22. package/dist/cjs/TimersStore/TimersStore.cjs +44 -0
  23. package/dist/cjs/TimersStore/TimersStore.cjs.map +1 -0
  24. package/dist/cjs/TimersStore/TimersStore.d.ts +12 -0
  25. package/dist/cjs/TimersStore/TimersStore.d.ts.map +1 -0
  26. package/dist/cjs/index.cjs +2 -2
  27. package/dist/cjs/index.cjs.map +1 -1
  28. package/dist/cjs/index.d.ts +2 -2
  29. package/dist/cjs/index.d.ts.map +1 -1
  30. package/dist/cjs/types.d.ts +6 -3
  31. package/dist/cjs/types.d.ts.map +1 -1
  32. package/dist/esm/TimersManager/JSONLTimersManager.d.ts +18 -0
  33. package/dist/esm/TimersManager/JSONLTimersManager.d.ts.map +1 -0
  34. package/dist/esm/TimersManager/JSONLTimersManager.js +21 -0
  35. package/dist/esm/TimersManager/JSONLTimersManager.js.map +1 -0
  36. package/dist/esm/TimersManager/PlainTextTimersManager.d.ts +18 -0
  37. package/dist/esm/TimersManager/PlainTextTimersManager.d.ts.map +1 -0
  38. package/dist/esm/TimersManager/PlainTextTimersManager.js +21 -0
  39. package/dist/esm/TimersManager/PlainTextTimersManager.js.map +1 -0
  40. package/dist/esm/TimersManager/TimersManager.d.ts +87 -0
  41. package/dist/esm/TimersManager/TimersManager.d.ts.map +1 -0
  42. package/dist/esm/TimersManager/TimersManager.js +205 -0
  43. package/dist/esm/TimersManager/TimersManager.js.map +1 -0
  44. package/dist/esm/TimersStore/JSONLTimersStore.d.ts +16 -0
  45. package/dist/esm/TimersStore/JSONLTimersStore.d.ts.map +1 -0
  46. package/dist/esm/TimersStore/JSONLTimersStore.js +46 -0
  47. package/dist/esm/TimersStore/JSONLTimersStore.js.map +1 -0
  48. package/dist/esm/TimersStore/PlainTextTimersStore.d.ts +16 -0
  49. package/dist/esm/TimersStore/PlainTextTimersStore.d.ts.map +1 -0
  50. package/dist/esm/TimersStore/PlainTextTimersStore.js +52 -0
  51. package/dist/esm/TimersStore/PlainTextTimersStore.js.map +1 -0
  52. package/dist/esm/TimersStore/TimersStore.d.ts +12 -0
  53. package/dist/esm/TimersStore/TimersStore.d.ts.map +1 -0
  54. package/dist/esm/TimersStore/TimersStore.js +37 -0
  55. package/dist/esm/TimersStore/TimersStore.js.map +1 -0
  56. package/dist/esm/index.d.ts +2 -2
  57. package/dist/esm/index.d.ts.map +1 -1
  58. package/dist/esm/index.js +2 -2
  59. package/dist/esm/index.js.map +1 -1
  60. package/dist/esm/types.d.ts +6 -3
  61. package/dist/esm/types.d.ts.map +1 -1
  62. package/package.json +1 -1
  63. package/dist/cjs/JSONLTimersManager.cjs +0 -199
  64. package/dist/cjs/JSONLTimersManager.cjs.map +0 -1
  65. package/dist/cjs/JSONLTimersManager.d.ts +0 -63
  66. package/dist/cjs/JSONLTimersManager.d.ts.map +0 -1
  67. package/dist/cjs/PlainTextTimersManager.cjs +0 -200
  68. package/dist/cjs/PlainTextTimersManager.cjs.map +0 -1
  69. package/dist/cjs/PlainTextTimersManager.d.ts +0 -60
  70. package/dist/cjs/PlainTextTimersManager.d.ts.map +0 -1
  71. package/dist/cjs/TimersManager.cjs +0 -39
  72. package/dist/cjs/TimersManager.cjs.map +0 -1
  73. package/dist/cjs/TimersManager.d.ts +0 -75
  74. package/dist/cjs/TimersManager.d.ts.map +0 -1
  75. package/dist/esm/JSONLTimersManager.d.ts +0 -63
  76. package/dist/esm/JSONLTimersManager.d.ts.map +0 -1
  77. package/dist/esm/JSONLTimersManager.js +0 -192
  78. package/dist/esm/JSONLTimersManager.js.map +0 -1
  79. package/dist/esm/PlainTextTimersManager.d.ts +0 -60
  80. package/dist/esm/PlainTextTimersManager.d.ts.map +0 -1
  81. package/dist/esm/PlainTextTimersManager.js +0 -193
  82. package/dist/esm/PlainTextTimersManager.js.map +0 -1
  83. package/dist/esm/TimersManager.d.ts +0 -75
  84. package/dist/esm/TimersManager.d.ts.map +0 -1
  85. package/dist/esm/TimersManager.js +0 -32
  86. package/dist/esm/TimersManager.js.map +0 -1
@@ -0,0 +1,52 @@
1
+ import { validate } from "uuid";
2
+ import { TimersStore } from "./TimersStore.js";
3
+ export class PlainTextTimersStore extends TimersStore {
4
+ constructor(timerfile) {
5
+ super(timerfile);
6
+ }
7
+ /**
8
+ * checkTimerfileSyntax
9
+ * @description Checks the syntax of the timer file.
10
+ * @param fileData
11
+ * @returns void
12
+ * @throws If syntax is invalid
13
+ */
14
+ async checkTimerfileSyntax(timers) {
15
+ const throwing = () => {
16
+ throw new Error(`Timer file's syntax is wrong`);
17
+ };
18
+ for (const timer of timers) {
19
+ if (Object.keys(timer).length !== 3)
20
+ throwing();
21
+ if (!validate(timer.id))
22
+ throwing();
23
+ if (isNaN(Number(timer.start)))
24
+ throwing();
25
+ if (isNaN(Number(timer.stop)))
26
+ throwing();
27
+ if (Number(timer.start) > Number(timer.stop))
28
+ throwing();
29
+ }
30
+ return;
31
+ }
32
+ toStringifyTimers(timers) {
33
+ if (timers.length === 0) {
34
+ return "";
35
+ }
36
+ return timers.map(timer => `${timer.id} ${timer.start} ${timer.stop}`).join("\n");
37
+ }
38
+ parseTimers(data) {
39
+ return data
40
+ .split(/\r?\n/)
41
+ .filter((line) => line.trim())
42
+ .map((line) => {
43
+ const [id, startStr, stopStr] = line.split(" ");
44
+ return {
45
+ id: id,
46
+ start: Number(startStr),
47
+ stop: Number(stopStr),
48
+ };
49
+ });
50
+ }
51
+ }
52
+ //# sourceMappingURL=PlainTextTimersStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlainTextTimersStore.js","sourceRoot":"","sources":["../../../src/TimersStore/PlainTextTimersStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAGhC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,OAAO,oBAAqB,SAAQ,WAAwB;IAEjE,YACC,SAAiB;QAEjB,KAAK,CAAC,SAAS,CAAC,CAAC;IAClB,CAAC;IAED;;;;;;OAMM;IACa,KAAK,CAAC,oBAAoB,CAAC,MAA4B;QACzE,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,QAAQ,CAAC,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,MAA4B;QAC7D,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;aACA,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;CACD"}
@@ -0,0 +1,12 @@
1
+ import type { StorageType, Timer } from "../types.js";
2
+ export declare abstract class TimersStore<T extends StorageType> {
3
+ protected readonly timerfile: string;
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>[];
11
+ }
12
+ //# sourceMappingURL=TimersStore.d.ts.map
@@ -0,0 +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;IACtD,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAErC,SAAS,aACR,SAAS,EAAE,MAAM;IAKL,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAWjC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAU7C,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IASrD,SAAS,CAAC,QAAQ,CAAC,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;aAC1D,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM;aAChD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE;CACrD"}
@@ -0,0 +1,37 @@
1
+ import fs from "fs";
2
+ export class TimersStore {
3
+ timerfile;
4
+ constructor(timerfile) {
5
+ this.timerfile = timerfile;
6
+ }
7
+ async loadTimers() {
8
+ try {
9
+ const data = await fs.promises.readFile(this.timerfile, "utf-8");
10
+ const timersData = this.parseTimers(data);
11
+ await this.checkTimerfileSyntax(timersData);
12
+ return timersData;
13
+ }
14
+ catch (e) {
15
+ throw new Error("Error when loading timer data", { cause: e });
16
+ }
17
+ }
18
+ async saveTimers(timers) {
19
+ const data = this.toStringifyTimers(timers);
20
+ try {
21
+ await fs.promises.writeFile(this.timerfile, data, "utf-8");
22
+ }
23
+ catch (e) {
24
+ throw new Error(`Error when saving timer data`, { cause: e });
25
+ }
26
+ }
27
+ async appendTimer(timer) {
28
+ try {
29
+ await fs.promises.appendFile(this.timerfile, this.toStringifyTimers([timer]) + "\n");
30
+ return;
31
+ }
32
+ catch (e) {
33
+ throw new Error(`Error when appending timer data`, { cause: e });
34
+ }
35
+ }
36
+ }
37
+ //# sourceMappingURL=TimersStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimersStore.js","sourceRoot":"","sources":["../../../src/TimersStore/TimersStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAIpB,MAAM,OAAgB,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,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACjE,MAAM,UAAU,GAAe,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACtD,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,MAAkB;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAE5C,IAAI,CAAC;YACJ,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5D,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,KAAe;QACvC,IAAI,CAAC;YACJ,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YACrF,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"}
@@ -1,4 +1,4 @@
1
1
  export type { Timer, CreateTimerOptions, StorageType } from "./types.js";
2
- export { JSONLTimersManager } from "./JSONLTimersManager.js";
3
- export { PlainTextTimersManager } from "./PlainTextTimersManager.js";
2
+ export { JSONLTimersManager } from "./TimersManager/JSONLTimersManager.js";
3
+ export { PlainTextTimersManager } from "./TimersManager/PlainTextTimersManager.js";
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC"}
package/dist/esm/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { JSONLTimersManager } from "./JSONLTimersManager.js";
2
- export { PlainTextTimersManager } from "./PlainTextTimersManager.js";
1
+ export { JSONLTimersManager } from "./TimersManager/JSONLTimersManager.js";
2
+ export { PlainTextTimersManager } from "./TimersManager/PlainTextTimersManager.js";
3
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC"}
@@ -1,12 +1,15 @@
1
1
  export type StorageType = "JSONL" | "PlainText";
2
- export type Timer<T extends StorageType> = {
2
+ export type Timer<T extends StorageType> = T extends "JSONL" ? {
3
3
  id: string;
4
4
  start: number;
5
5
  stop: number;
6
- } & (T extends "JSONL" ? {
7
6
  title?: string;
8
7
  description?: string;
9
- } : object);
8
+ } : {
9
+ id: string;
10
+ start: number;
11
+ stop: number;
12
+ };
10
13
  export type CreateTimerOptions<T extends StorageType> = T extends "JSONL" ? {
11
14
  length: number;
12
15
  title?: string;
@@ -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,IAAI;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CAChB,GAAG,CAAC,CAAC,SAAS,OAAO,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,CAAC;AAE5E,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,WAAW,IAAI,CAAC,SAAS,OAAO,GACnE;IACI,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,MAAM,GACV,CAAC,SAAS,WAAW,GACnB,MAAM,GACN,KAAK,CAAC"}
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,IACnC,CAAC,SAAS,OAAO,GACX;IACI,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB,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,IAAI,CAAC,SAAS,OAAO,GACnE;IACI,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,MAAM,GACV,CAAC,SAAS,WAAW,GACnB,MAAM,GACN,KAAK,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eternal-timer",
3
- "version": "2.3.0",
3
+ "version": "2.4.0",
4
4
  "description": "timer for node.js package",
5
5
  "scripts": {
6
6
  "dev": "nodemon --watch src --exec ts-node src/index.ts",
@@ -1,199 +0,0 @@
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 readline_1 = __importDefault(require("readline"));
10
- const TimersManager_js_1 = require("./TimersManager.cjs");
11
- const Log_js_1 = require("./Log.cjs");
12
- /**
13
- * JSONLTimersManager
14
- * @description
15
- * Manages timers stored in a JSONL file.
16
- * (This is a abstract class)
17
- *
18
- * - Timers are persisted in a file
19
- * - Expired timers are detected by polling
20
- */
21
- class JSONLTimersManager extends TimersManager_js_1.TimersManager {
22
- getDefaultFilename() {
23
- return ".timers.jsonl";
24
- }
25
- async checkTimerfileSyntax(fileData) {
26
- const throwing = () => {
27
- throw new Error(`Timer file's syntax is wrong`);
28
- };
29
- const timersData = fileData
30
- .split('\n')
31
- .map(l => l.trim())
32
- .filter(l => l !== "");
33
- for (const timerData of timersData) {
34
- const parsed = JSON.parse(timerData);
35
- if (!parsed.id || typeof parsed.id !== "string" || parsed.id.length !== 36)
36
- throwing();
37
- if (!parsed.start || typeof parsed.start !== "number" || parsed.start.toString().trim() === "")
38
- throwing();
39
- if (!parsed.stop || typeof parsed.stop !== "number" || parsed.stop.toString().trim() === "")
40
- throwing();
41
- if (parsed.title && typeof parsed.title !== "string")
42
- throwing();
43
- if (parsed.description && typeof parsed.description !== "string")
44
- throwing();
45
- }
46
- return;
47
- }
48
- /**
49
- * createTimer
50
- * @description Creates a new timer.
51
- * @param length Timer duration in milliseconds
52
- * @param title(string, optional) Title of the timer(only for JSONLTimersManager)
53
- * @param description(string, optional) Description of the timer(only for JSONLTimersManager)
54
- * @returns Promise that resolves to the timer ID (UUID)
55
- * @throws If length is invalid(e.g. length < 0) or file operation fails
56
- * @example
57
- * const manager = new JSONLTimersManager();
58
- * const newTimer = await manager.createTimer(5000);
59
- * // newTimer will be id of the timer
60
- */
61
- async createTimer(options) {
62
- try {
63
- let length = typeof options === "object" ? options.length : options;
64
- if (length < 0) {
65
- throw new Error(`Invailed length: ${length}`);
66
- }
67
- const timersRaw = await fs_1.default.promises.readFile(this.timerfiledir, "utf-8");
68
- await this.checkTimerfileSyntax(timersRaw);
69
- length = Math.trunc(length);
70
- // uuid, start, end
71
- const id = (0, uuid_1.v4)();
72
- const now = Date.now();
73
- const newTimerData = JSON.stringify({
74
- id,
75
- start: now,
76
- stop: (now + length),
77
- ...(typeof options === "object" && options.title !== undefined && { title: options.title }),
78
- ...(typeof options === "object" && options.description !== undefined && { description: options.description }),
79
- });
80
- await fs_1.default.promises.appendFile(this.timerfiledir, newTimerData + "\n");
81
- return id;
82
- }
83
- catch (e) {
84
- throw new Error(`Error when creating timer: ${e}`);
85
- }
86
- }
87
- /**
88
- * removeTimer
89
- * @description Removes a timer by ID.
90
- * @param id ID of the timer to remove
91
- * @returns void
92
- * @throws If file operation fails
93
- * @example
94
- * await manager.removeTimer(id);
95
- */
96
- async removeTimer(id) {
97
- try {
98
- const timersRaw = await fs_1.default.promises.readFile(this.timerfiledir, "utf-8");
99
- await this.checkTimerfileSyntax(timersRaw);
100
- const rl = readline_1.default.createInterface({
101
- input: fs_1.default.createReadStream(this.timerfiledir),
102
- crlfDelay: Infinity,
103
- });
104
- let newTimersData = "";
105
- let found = false;
106
- for await (const line of rl) {
107
- if (!line.trim())
108
- continue;
109
- const timerData = JSON.parse(line);
110
- if (timerData.id === id) {
111
- found = true;
112
- continue;
113
- }
114
- newTimersData += `${JSON.stringify(timerData, null, 0)}\n`;
115
- }
116
- if (!found) {
117
- throw new Error(`Timer with id ${id} not found`);
118
- }
119
- await fs_1.default.promises.writeFile(this.timerfiledir, newTimersData, "utf-8");
120
- return;
121
- }
122
- catch (e) {
123
- throw new Error(`Error when removing timer: ${e}`);
124
- }
125
- }
126
- /**
127
- * @description Starts monitoring expired timers asynchronously and returns immediately. The callback is invoked asynchronously when a timer expires.
128
- * The callback is awaited before continuing.
129
- * @param callback Function invoked when an expired timer is detected (called asynchronously)
130
- * @param interval (number, optional): Check interval in milliseconds (default: 200ms)
131
- * @throws If file operation fails
132
- * @returns (NodeJS.Timeout) intervalId interval id of checkTimers
133
- * @example
134
- * const interval = manager.checkTimers((timer) => {
135
- * console.log(`A timer was stopped: ${timer.id}`);
136
- * });
137
- */
138
- checkTimers(callback, interval = 200) {
139
- return setInterval(async () => {
140
- if (this.checkLock)
141
- return;
142
- this.checkLock = true;
143
- try {
144
- const rl = readline_1.default.createInterface({
145
- input: fs_1.default.createReadStream(this.timerfiledir),
146
- crlfDelay: Infinity,
147
- });
148
- for await (const line of rl) {
149
- if (!line.trim())
150
- continue;
151
- const timerData = JSON.parse(line);
152
- const now = Date.now();
153
- if (Number(timerData.stop) <= now) {
154
- await this.removeTimer(timerData.id);
155
- callback(timerData).catch(async (e) => {
156
- await Log_js_1.Log.ensureLogger();
157
- if (Log_js_1.Log.loggerInstance) {
158
- Log_js_1.Log.loggerInstance.error(`Error in callback of checkTimers: ${e}`);
159
- }
160
- });
161
- }
162
- }
163
- }
164
- catch (e) {
165
- await Log_js_1.Log.ensureLogger();
166
- if (Log_js_1.Log.loggerInstance) {
167
- Log_js_1.Log.loggerInstance.error(`Error when checking alarm: ${e}`);
168
- }
169
- }
170
- finally {
171
- this.checkLock = false;
172
- }
173
- }, interval);
174
- }
175
- /**
176
- * showTimers
177
- * @description Retrieves all active timers.
178
- * @returns Array of `Timer` objects
179
- * @throws If file operation fails
180
- * @example
181
- * const timers = await manager.showTimers();
182
- * console.log(JSON.stringify(timers))
183
- */
184
- async showTimers() {
185
- try {
186
- const timersRaw = await fs_1.default.promises.readFile(this.timerfiledir, "utf-8");
187
- const timersData = timersRaw
188
- .split(/\r?\n/)
189
- .filter(t => t.trim())
190
- .map(line => JSON.parse(line));
191
- return timersData;
192
- }
193
- catch (e) {
194
- throw new Error(`Error when showing timers: ${e}`);
195
- }
196
- }
197
- }
198
- exports.JSONLTimersManager = JSONLTimersManager;
199
- //# sourceMappingURL=JSONLTimersManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"JSONLTimersManager.js","sourceRoot":"","sources":["../../src/JSONLTimersManager.ts"],"names":[],"mappings":"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"}
@@ -1,63 +0,0 @@
1
- import type { Timer, CreateTimerOptions } from "./types.js";
2
- import { TimersManager } from "./TimersManager.js";
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<"JSONL"> {
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(options: CreateTimerOptions<"JSONL">): 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: 200ms)
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<"JSONL">) => 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<"JSONL">[]>;
62
- }
63
- //# sourceMappingURL=JSONLTimersManager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"JSONLTimersManager.d.ts","sourceRoot":"","sources":["../../src/JSONLTimersManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD;;;;;;;;GAQG;AACH,qBAAa,kBAAmB,SAAQ,aAAa,CAAC,OAAO,CAAC;cAC1C,kBAAkB,IAAI,MAAM;cAI/B,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBrE;;;;;;;;;;;;OAYM;IACgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IA6BxF;;;;;;;;OAQM;IACgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC5D;;;;;;;;;;;OAWM;IACU,WAAW,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAE,MAAY,GAAG,MAAM,CAAC,OAAO;IAoCvH;;;;;;;;OAQM;IACgB,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;CAa7D"}
@@ -1,200 +0,0 @@
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.PlainTextTimersManager = void 0;
7
- const fs_1 = __importDefault(require("fs"));
8
- const uuid_1 = require("uuid");
9
- const readline_1 = __importDefault(require("readline"));
10
- const TimersManager_js_1 = require("./TimersManager.cjs");
11
- const Log_js_1 = require("./Log.cjs");
12
- class PlainTextTimersManager extends TimersManager_js_1.TimersManager {
13
- getDefaultFilename() {
14
- return ".timers";
15
- }
16
- /**
17
- * checkTimerfileSyntax
18
- * @description Checks the syntax of the timer file.
19
- * @param fileData
20
- * @returns void
21
- * @throws If syntax is invalid
22
- */
23
- async checkTimerfileSyntax(fileData) {
24
- const throwing = () => {
25
- throw new Error(`Timer file's syntax is wrong`);
26
- };
27
- const timersData = fileData
28
- .split('\n')
29
- .map(l => l.trim())
30
- .filter(l => l !== "");
31
- for (const timerData of timersData) {
32
- const timerArray = timerData.split(/\s+/);
33
- if (timerArray.length !== 3)
34
- throwing();
35
- if (timerArray[0]?.length !== 36)
36
- throwing();
37
- if (timerArray[1].trim() === "")
38
- throwing();
39
- if (timerArray[2].trim() === "")
40
- throwing();
41
- }
42
- return;
43
- }
44
- /**
45
- * createTimer
46
- * @description Creates a new timer.
47
- * @param length
48
- * @returns Promise that resolves to the timer ID (UUID)
49
- * @throws If length is invalid(e.g. length < 0) or file operation fails
50
- * @example
51
- * const manager = new PlainTextTimersManager();
52
- * const newTimer = await manager.createTimer(5000);
53
- * // newTimer will be id of the timer
54
- */
55
- async createTimer(options) {
56
- try {
57
- if (options < 0) {
58
- throw new Error(`Invailed length: ${options}`);
59
- }
60
- const timersRaw = await fs_1.default.promises.readFile(this.timerfiledir, "utf-8");
61
- await this.checkTimerfileSyntax(timersRaw);
62
- const length = Math.trunc(options);
63
- // uuid, start, end
64
- const id = (0, uuid_1.v4)();
65
- const now = Date.now();
66
- const newTimerData = `${id} ${now.toString()} ${(now + length).toString()}`;
67
- await fs_1.default.promises.appendFile(this.timerfiledir, newTimerData + "\n");
68
- return id;
69
- }
70
- catch (e) {
71
- throw new Error(`Error when creating timer: ${e}`);
72
- }
73
- }
74
- /**
75
- * removeTimer
76
- * @description Removes a timer by ID.
77
- * @param id ID of the timer to remove
78
- * @returns void
79
- * @throws If file operation fails
80
- * @example
81
- * await manager.removeTimer(id);
82
- */
83
- async removeTimer(id) {
84
- try {
85
- const timersRaw = await fs_1.default.promises.readFile(this.timerfiledir, "utf-8");
86
- await this.checkTimerfileSyntax(timersRaw);
87
- const rl = readline_1.default.createInterface({
88
- input: fs_1.default.createReadStream(this.timerfiledir),
89
- crlfDelay: Infinity,
90
- });
91
- const newTimersDataLines = [];
92
- let found = false;
93
- for await (const line of rl) {
94
- if (!line.trim())
95
- continue;
96
- const [timerId] = line.split(" ");
97
- if (timerId === id) {
98
- found = true;
99
- continue;
100
- }
101
- newTimersDataLines.push(line);
102
- }
103
- if (!found) {
104
- throw new Error(`Timer with id ${id} not found`);
105
- }
106
- await fs_1.default.promises.writeFile(this.timerfiledir, newTimersDataLines.join("\n"), "utf-8");
107
- return;
108
- }
109
- catch (e) {
110
- throw new Error(`Error when removing timer: ${e}`);
111
- }
112
- }
113
- /**
114
- * checkTimers
115
- * @description Starts monitoring expired timers asynchronously and returns immediately. The callback is invoked asynchronously when a timer expires.
116
- * The callback is awaited before continuing.
117
- * @param callback Function invoked when an expired timer is detected (called asynchronously)
118
- * @param interval (number, optional): Check interval in milliseconds (default: 200ms)
119
- * @throws If file operation fails
120
- * @returns (NodeJS.Timeout) intervalId interval id of checkTimers
121
- * @example
122
- * const interval = manager.checkTimers((timer) => {
123
- * console.log(`A timer was stopped: ${timer.id}`);
124
- * });
125
- */
126
- checkTimers(callback, interval = 200) {
127
- return setInterval(async () => {
128
- if (this.checkLock)
129
- return;
130
- this.checkLock = true;
131
- try {
132
- const rl = readline_1.default.createInterface({
133
- input: fs_1.default.createReadStream(this.timerfiledir),
134
- crlfDelay: Infinity,
135
- });
136
- for await (const line of rl) {
137
- if (!line.trim())
138
- continue;
139
- const [id, startStr, stopStr] = line.split(" ");
140
- const timer = {
141
- id: id,
142
- start: Number(startStr),
143
- stop: Number(stopStr),
144
- };
145
- const now = Date.now();
146
- if (Number(timer.stop) <= now) {
147
- await this.removeTimer(timer.id);
148
- callback(timer).catch(async (e) => {
149
- await Log_js_1.Log.ensureLogger();
150
- if (Log_js_1.Log.loggerInstance) {
151
- Log_js_1.Log.loggerInstance.error(`Error in timer callback: ${e}`);
152
- }
153
- });
154
- }
155
- }
156
- }
157
- catch (e) {
158
- await Log_js_1.Log.ensureLogger();
159
- if (Log_js_1.Log.loggerInstance) {
160
- Log_js_1.Log.loggerInstance.error(`Error when checking alarm: ${e}`);
161
- }
162
- }
163
- finally {
164
- this.checkLock = false;
165
- }
166
- }, interval);
167
- }
168
- /**
169
- * showTimers
170
- * @description Retrieves all active timers.
171
- * @returns Array of `Timer` objects
172
- * @throws If file operation fails
173
- * @example
174
- * const timers = await manager.showTimers();
175
- * console.log(JSON.stringify(timers))
176
- */
177
- async showTimers() {
178
- try {
179
- const timersRaw = await fs_1.default.promises.readFile(this.timerfiledir, "utf-8");
180
- const timersData = timersRaw.split(/\r?\n/);
181
- const timersJSON = [];
182
- for (const timerData of timersData) {
183
- const splitedTimerData = timerData.split(" ");
184
- if (!timerData.trim())
185
- continue;
186
- timersJSON.push({
187
- id: splitedTimerData[0],
188
- start: Number(splitedTimerData[1]),
189
- stop: Number(splitedTimerData[2]),
190
- });
191
- }
192
- return timersJSON;
193
- }
194
- catch (e) {
195
- throw new Error(`Error when showing timers: ${e}`);
196
- }
197
- }
198
- }
199
- exports.PlainTextTimersManager = PlainTextTimersManager;
200
- //# sourceMappingURL=PlainTextTimersManager.js.map