@primuslabs/por-client-sdk 0.1.6 → 0.1.8

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.
@@ -3,6 +3,7 @@ interface SchedulerOptions {
3
3
  intervalMs: number;
4
4
  shouldStop?: (err: any) => boolean;
5
5
  stopMode?: "immediate" | "delayed";
6
+ stateFile?: string;
6
7
  }
7
8
  export declare class Scheduler {
8
9
  private job;
@@ -10,6 +11,7 @@ export declare class Scheduler {
10
11
  private stopped;
11
12
  private lastSigintTime;
12
13
  private sigintCount;
14
+ private stateFile?;
13
15
  constructor(job: JobFn, opts: SchedulerOptions);
14
16
  stop(signal?: string): void;
15
17
  start(): Promise<void>;
package/dist/scheduler.js CHANGED
@@ -1,51 +1,80 @@
1
1
  import { sleepMs } from "./utils.js";
2
+ import fs from "fs";
3
+ import path from "path";
4
+ function readState(file) {
5
+ try {
6
+ if (!fs.existsSync(file))
7
+ return null;
8
+ const raw = fs.readFileSync(file, "utf8");
9
+ return JSON.parse(raw);
10
+ }
11
+ catch {
12
+ return null;
13
+ }
14
+ }
15
+ function writeState(file, state) {
16
+ try {
17
+ const dir = path.dirname(path.resolve(file));
18
+ fs.mkdirSync(dir, { recursive: true });
19
+ fs.writeFileSync(file, JSON.stringify(state), "utf8");
20
+ }
21
+ catch (err) {
22
+ console.warn("⚠️ Failed to write scheduler state:", err);
23
+ }
24
+ }
2
25
  export class Scheduler {
3
26
  job;
4
27
  opts;
5
28
  stopped = false;
6
29
  lastSigintTime = 0;
7
30
  sigintCount = 0;
31
+ stateFile;
8
32
  constructor(job, opts) {
9
33
  this.job = job;
10
34
  this.opts = opts;
11
35
  if (!this.opts.stopMode)
12
36
  this.opts.stopMode = "delayed";
37
+ this.stateFile = opts.stateFile;
13
38
  process.on("SIGTERM", () => this.stop("SIGTERM"));
14
39
  process.on("SIGINT", () => this.stop("SIGINT"));
15
40
  }
16
41
  stop(signal) {
17
- if (signal) {
18
- if (signal !== "SIGINT") {
19
- console.log(`🛑 Received ${signal}.`);
20
- }
21
- }
22
- else {
23
- console.log("🛑 Stop requested.");
42
+ if (signal && signal !== "SIGINT") {
43
+ console.log(`🛑 Received ${signal}.`);
24
44
  }
25
45
  const now = Date.now();
26
46
  if (signal === "SIGINT") {
27
- if (now - this.lastSigintTime <= 2000) {
47
+ if (now - this.lastSigintTime <= 2000)
28
48
  this.sigintCount++;
29
- }
30
- else {
49
+ else
31
50
  this.sigintCount = 1;
32
- }
33
51
  this.lastSigintTime = now;
34
- if (this.sigintCount >= 2) {
52
+ if (this.sigintCount >= 2)
35
53
  process.exit(1);
36
- }
37
- else {
38
- console.log(`🛑 Received ${signal}. (Press twice Ctrl + C to exit)`);
39
- }
54
+ console.log("🛑 Press Ctrl+C twice to exit");
40
55
  }
41
56
  this.stopped = true;
42
57
  }
43
58
  async start() {
44
- const intervalMs = this.opts.intervalMs;
59
+ const { intervalMs } = this.opts;
45
60
  console.log(`Start Scheduler at ${new Date().toISOString()} with job interval: ${intervalMs} (ms)`);
61
+ if (this.stateFile) {
62
+ const state = readState(this.stateFile);
63
+ if (state?.lastStartedAt) {
64
+ const elapsed = Date.now() - state.lastStartedAt;
65
+ const delay = intervalMs - elapsed;
66
+ if (delay > 0) {
67
+ console.log(`⏳ Recovering schedule, wait the next in ${delay / 1000.0} s`);
68
+ await sleepMs(delay);
69
+ }
70
+ }
71
+ }
46
72
  while (!this.stopped) {
47
73
  const startedAt = Date.now();
48
- console.log("🚀 job start", new Date().toISOString());
74
+ if (this.stateFile) {
75
+ writeState(this.stateFile, { lastStartedAt: startedAt });
76
+ }
77
+ console.log("🚀 job start", new Date(startedAt).toISOString());
49
78
  let shouldStop = false;
50
79
  try {
51
80
  await this.job();
@@ -61,7 +90,7 @@ export class Scheduler {
61
90
  this.stopped = true;
62
91
  }
63
92
  if (!this.stopped) {
64
- console.log(`⏳ Next in ${delayMs} ms ...`);
93
+ console.log(`⏳ Next in ${delayMs / 1000.0} s`);
65
94
  await sleepMs(delayMs);
66
95
  }
67
96
  if (shouldStop && this.opts.stopMode === "delayed") {
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@primuslabs/por-client-sdk",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "author": "Primus Labs <dev@primuslabs.org>",
5
5
  "description": "Primus PoR client sdk",
6
6
  "license": "ISC",