@zhin.js/process-monitor 3.0.3 → 3.0.5

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/lib/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { formatProcessStatus, formatUptime, processState, resetProcessMonitorForTests, resolveProcessMonitorConfig, startProcessMonitor, startTime, } from './monitor.js';
2
- export type { NotifyChannel, ProcessMonitorConfig, ProcessState } from './monitor.js';
1
+ export { classifyStartup, formatProcessStatus, formatUptime, processState, resetProcessMonitorForTests, resolveProcessMonitorConfig, startProcessMonitor, startTime, } from './monitor.js';
2
+ export type { NotifyChannel, ProcessMonitorConfig, ProcessState, StartupReason } from './monitor.js';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,2BAA2B,EAC3B,2BAA2B,EAC3B,mBAAmB,EACnB,SAAS,GACV,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,2BAA2B,EAC3B,2BAA2B,EAC3B,mBAAmB,EACnB,SAAS,GACV,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
package/lib/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { formatProcessStatus, formatUptime, processState, resetProcessMonitorForTests, resolveProcessMonitorConfig, startProcessMonitor, startTime, } from './monitor.js';
1
+ export { classifyStartup, formatProcessStatus, formatUptime, processState, resetProcessMonitorForTests, resolveProcessMonitorConfig, startProcessMonitor, startTime, } from './monitor.js';
2
2
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,2BAA2B,EAC3B,2BAA2B,EAC3B,mBAAmB,EACnB,SAAS,GACV,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,2BAA2B,EAC3B,2BAA2B,EAC3B,mBAAmB,EACnB,SAAS,GACV,MAAM,cAAc,CAAC"}
package/lib/monitor.d.ts CHANGED
@@ -13,6 +13,8 @@ export interface ProcessMonitorConfig {
13
13
  export interface ProcessState {
14
14
  lastPid?: number;
15
15
  lastStartTime?: number;
16
+ /** SIGTERM/SIGINT 正常退出时置 true,下次启动据此归为 restart 而非 crash。 */
17
+ cleanExit?: boolean;
16
18
  restartCount: number;
17
19
  crashCount: number;
18
20
  totalUptime: number;
@@ -24,6 +26,16 @@ export declare function resolveProcessMonitorConfig(raw: ProcessMonitorConfig |
24
26
  };
25
27
  export declare function formatUptime(ms: number): string;
26
28
  export declare function formatProcessStatus(): string;
29
+ export type StartupReason = 'start' | 'restart' | 'crash';
30
+ /**
31
+ * Classify this startup from persisted state.
32
+ * - 同 PID(热重载,进程未退出)跳过判定,不算 restart/crash。
33
+ * - 上次为 SIGTERM/SIGINT 正常退出(cleanExit)时归为 restart,即使间隔 <5min。
34
+ */
35
+ export declare function classifyStartup(state: ProcessState, currentPid: number, now?: number): {
36
+ reason: StartupReason;
37
+ uptime?: number;
38
+ };
27
39
  /** Start monitoring once; returns disposer for lifecycle cleanup. */
28
40
  export declare function startProcessMonitor(rawConfig?: ProcessMonitorConfig): () => void;
29
41
  /** Test helper: reset module state without touching disk. */
@@ -1 +1 @@
1
- {"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../src/monitor.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,eAAO,IAAI,YAAY,EAAE,YAIxB,CAAC;AAEF,eAAO,MAAM,SAAS,QAAa,CAAC;AAKpC,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,oBAAoB,GAAG,SAAS,GACpC,QAAQ,CACT,IAAI,CACF,oBAAoB,EACpB,SAAS,GAAG,eAAe,GAAG,iBAAiB,GAAG,eAAe,CAClE,CACF,GAAG;IAAE,cAAc,EAAE,aAAa,EAAE,CAAA;CAAE,CAQtC;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAU/C;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAgB5C;AAgJD,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,SAAS,CAAC,EAAE,oBAAoB,GAAG,MAAM,IAAI,CA2BhF;AAED,6DAA6D;AAC7D,wBAAgB,2BAA2B,IAAI,IAAI,CAQlD"}
1
+ {"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../src/monitor.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,eAAO,IAAI,YAAY,EAAE,YAIxB,CAAC;AAEF,eAAO,MAAM,SAAS,QAAa,CAAC;AAKpC,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,oBAAoB,GAAG,SAAS,GACpC,QAAQ,CACT,IAAI,CACF,oBAAoB,EACpB,SAAS,GAAG,eAAe,GAAG,iBAAiB,GAAG,eAAe,CAClE,CACF,GAAG;IAAE,cAAc,EAAE,aAAa,EAAE,CAAA;CAAE,CAQtC;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAU/C;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAgB5C;AAkGD,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AAE1D;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,MAAM,EAClB,GAAG,SAAa,GACf;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAQ5C;AAuCD,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,SAAS,CAAC,EAAE,oBAAoB,GAAG,MAAM,IAAI,CA6BhF;AAED,6DAA6D;AAC7D,wBAAgB,2BAA2B,IAAI,IAAI,CAQlD"}
package/lib/monitor.js CHANGED
@@ -120,24 +120,33 @@ async function sendNotification(config, record) {
120
120
  }
121
121
  }
122
122
  }
123
+ /**
124
+ * Classify this startup from persisted state.
125
+ * - 同 PID(热重载,进程未退出)跳过判定,不算 restart/crash。
126
+ * - 上次为 SIGTERM/SIGINT 正常退出(cleanExit)时归为 restart,即使间隔 <5min。
127
+ */
128
+ export function classifyStartup(state, currentPid, now = Date.now()) {
129
+ if (!state.lastPid || !state.lastStartTime)
130
+ return { reason: 'start' };
131
+ if (state.lastPid === currentPid)
132
+ return { reason: 'start' };
133
+ const uptime = now - state.lastStartTime;
134
+ if (state.cleanExit === true || uptime >= 5 * 60 * 1000) {
135
+ return { reason: 'restart', uptime };
136
+ }
137
+ return { reason: 'crash', uptime };
138
+ }
123
139
  async function detectStartupReason(config) {
124
140
  const currentPid = process.pid;
125
141
  const currentTime = Date.now();
126
- let reason = 'start';
127
- let uptime;
128
- if (processState.lastPid && processState.lastStartTime) {
129
- const timeSinceLastStart = currentTime - processState.lastStartTime;
130
- if (timeSinceLastStart < 5 * 60 * 1000) {
131
- reason = 'crash';
132
- processState.crashCount++;
133
- }
134
- else {
135
- reason = 'restart';
136
- processState.restartCount++;
137
- }
138
- uptime = timeSinceLastStart;
142
+ const { reason, uptime } = classifyStartup(processState, currentPid, currentTime);
143
+ if (reason === 'crash')
144
+ processState.crashCount++;
145
+ else if (reason === 'restart')
146
+ processState.restartCount++;
147
+ if (uptime)
139
148
  processState.totalUptime += uptime;
140
- }
149
+ processState.cleanExit = false;
141
150
  processState.lastPid = currentPid;
142
151
  processState.lastStartTime = currentTime;
143
152
  saveProcessState();
@@ -168,9 +177,11 @@ export function startProcessMonitor(rawConfig) {
168
177
  loadProcessState();
169
178
  void detectStartupReason(config);
170
179
  const onSigterm = () => {
180
+ processState.cleanExit = true;
171
181
  saveProcessState();
172
182
  };
173
183
  const onSigint = () => {
184
+ processState.cleanExit = true;
174
185
  saveProcessState();
175
186
  };
176
187
  process.on('SIGTERM', onSigterm);
@@ -1 +1 @@
1
- {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../src/monitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../src/monitor.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhin.js/process-monitor",
3
- "version": "3.0.3",
3
+ "version": "3.0.5",
4
4
  "description": "进程监控与重启通知插件 (Plugin Runtime)",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -38,9 +38,9 @@
38
38
  "directory": "plugins/features/process-monitor"
39
39
  },
40
40
  "dependencies": {
41
- "@zhin.js/command": "1.0.1",
42
- "@zhin.js/plugin-runtime": "1.0.1",
43
- "@zhin.js/tool": "1.0.1"
41
+ "@zhin.js/command": "1.0.3",
42
+ "@zhin.js/plugin-runtime": "1.1.1",
43
+ "@zhin.js/tool": "1.0.3"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@types/node": "^26.1.0",
package/src/index.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export {
2
+ classifyStartup,
2
3
  formatProcessStatus,
3
4
  formatUptime,
4
5
  processState,
@@ -7,4 +8,4 @@ export {
7
8
  startProcessMonitor,
8
9
  startTime,
9
10
  } from './monitor.js';
10
- export type { NotifyChannel, ProcessMonitorConfig, ProcessState } from './monitor.js';
11
+ export type { NotifyChannel, ProcessMonitorConfig, ProcessState, StartupReason } from './monitor.js';
package/src/monitor.ts CHANGED
@@ -23,6 +23,8 @@ export interface ProcessMonitorConfig {
23
23
  export interface ProcessState {
24
24
  lastPid?: number;
25
25
  lastStartTime?: number;
26
+ /** SIGTERM/SIGINT 正常退出时置 true,下次启动据此归为 restart 而非 crash。 */
27
+ cleanExit?: boolean;
26
28
  restartCount: number;
27
29
  crashCount: number;
28
30
  totalUptime: number;
@@ -184,27 +186,39 @@ async function sendNotification(
184
186
  }
185
187
  }
186
188
 
189
+ export type StartupReason = 'start' | 'restart' | 'crash';
190
+
191
+ /**
192
+ * Classify this startup from persisted state.
193
+ * - 同 PID(热重载,进程未退出)跳过判定,不算 restart/crash。
194
+ * - 上次为 SIGTERM/SIGINT 正常退出(cleanExit)时归为 restart,即使间隔 <5min。
195
+ */
196
+ export function classifyStartup(
197
+ state: ProcessState,
198
+ currentPid: number,
199
+ now = Date.now(),
200
+ ): { reason: StartupReason; uptime?: number } {
201
+ if (!state.lastPid || !state.lastStartTime) return { reason: 'start' };
202
+ if (state.lastPid === currentPid) return { reason: 'start' };
203
+ const uptime = now - state.lastStartTime;
204
+ if (state.cleanExit === true || uptime >= 5 * 60 * 1000) {
205
+ return { reason: 'restart', uptime };
206
+ }
207
+ return { reason: 'crash', uptime };
208
+ }
209
+
187
210
  async function detectStartupReason(
188
211
  config: ReturnType<typeof resolveProcessMonitorConfig>,
189
212
  ): Promise<void> {
190
213
  const currentPid = process.pid;
191
214
  const currentTime = Date.now();
192
- let reason: 'start' | 'restart' | 'crash' = 'start';
193
- let uptime: number | undefined;
194
215
 
195
- if (processState.lastPid && processState.lastStartTime) {
196
- const timeSinceLastStart = currentTime - processState.lastStartTime;
197
- if (timeSinceLastStart < 5 * 60 * 1000) {
198
- reason = 'crash';
199
- processState.crashCount++;
200
- } else {
201
- reason = 'restart';
202
- processState.restartCount++;
203
- }
204
- uptime = timeSinceLastStart;
205
- processState.totalUptime += uptime;
206
- }
216
+ const { reason, uptime } = classifyStartup(processState, currentPid, currentTime);
217
+ if (reason === 'crash') processState.crashCount++;
218
+ else if (reason === 'restart') processState.restartCount++;
219
+ if (uptime) processState.totalUptime += uptime;
207
220
 
221
+ processState.cleanExit = false;
208
222
  processState.lastPid = currentPid;
209
223
  processState.lastStartTime = currentTime;
210
224
  saveProcessState();
@@ -241,9 +255,11 @@ export function startProcessMonitor(rawConfig?: ProcessMonitorConfig): () => voi
241
255
  void detectStartupReason(config);
242
256
 
243
257
  const onSigterm = () => {
258
+ processState.cleanExit = true;
244
259
  saveProcessState();
245
260
  };
246
261
  const onSigint = () => {
262
+ processState.cleanExit = true;
247
263
  saveProcessState();
248
264
  };
249
265
  process.on('SIGTERM', onSigterm);