@procwire/transport 0.2.0 → 0.3.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 (84) hide show
  1. package/dist/framing/line-delimited.d.ts.map +1 -1
  2. package/dist/framing/line-delimited.js.map +1 -1
  3. package/dist/heartbeat/constants.d.ts +12 -0
  4. package/dist/heartbeat/constants.d.ts.map +1 -0
  5. package/dist/heartbeat/constants.js +17 -0
  6. package/dist/heartbeat/constants.js.map +1 -0
  7. package/dist/heartbeat/index.d.ts +10 -0
  8. package/dist/heartbeat/index.d.ts.map +1 -0
  9. package/dist/heartbeat/index.js +10 -0
  10. package/dist/heartbeat/index.js.map +1 -0
  11. package/dist/heartbeat/manager.d.ts +107 -0
  12. package/dist/heartbeat/manager.d.ts.map +1 -0
  13. package/dist/heartbeat/manager.js +252 -0
  14. package/dist/heartbeat/manager.js.map +1 -0
  15. package/dist/heartbeat/types.d.ts +99 -0
  16. package/dist/heartbeat/types.d.ts.map +1 -0
  17. package/dist/heartbeat/types.js +8 -0
  18. package/dist/heartbeat/types.js.map +1 -0
  19. package/dist/index.d.ts +4 -0
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +5 -0
  22. package/dist/index.js.map +1 -1
  23. package/dist/process/manager.d.ts.map +1 -1
  24. package/dist/process/manager.js +2 -1
  25. package/dist/process/manager.js.map +1 -1
  26. package/dist/protocol/index.d.ts +2 -0
  27. package/dist/protocol/index.d.ts.map +1 -1
  28. package/dist/protocol/index.js +3 -0
  29. package/dist/protocol/index.js.map +1 -1
  30. package/dist/protocol/reserved-methods.d.ts +90 -0
  31. package/dist/protocol/reserved-methods.d.ts.map +1 -0
  32. package/dist/protocol/reserved-methods.js +99 -0
  33. package/dist/protocol/reserved-methods.js.map +1 -0
  34. package/dist/protocol/reserved-types.d.ts +231 -0
  35. package/dist/protocol/reserved-types.d.ts.map +1 -0
  36. package/dist/protocol/reserved-types.js +10 -0
  37. package/dist/protocol/reserved-types.js.map +1 -0
  38. package/dist/reconnect/constants.d.ts +12 -0
  39. package/dist/reconnect/constants.d.ts.map +1 -0
  40. package/dist/reconnect/constants.js +21 -0
  41. package/dist/reconnect/constants.js.map +1 -0
  42. package/dist/reconnect/index.d.ts +10 -0
  43. package/dist/reconnect/index.d.ts.map +1 -0
  44. package/dist/reconnect/index.js +10 -0
  45. package/dist/reconnect/index.js.map +1 -0
  46. package/dist/reconnect/manager.d.ts +110 -0
  47. package/dist/reconnect/manager.d.ts.map +1 -0
  48. package/dist/reconnect/manager.js +264 -0
  49. package/dist/reconnect/manager.js.map +1 -0
  50. package/dist/reconnect/types.d.ts +137 -0
  51. package/dist/reconnect/types.d.ts.map +1 -0
  52. package/dist/reconnect/types.js +8 -0
  53. package/dist/reconnect/types.js.map +1 -0
  54. package/dist/resilience/handle.d.ts +112 -0
  55. package/dist/resilience/handle.d.ts.map +1 -0
  56. package/dist/resilience/handle.js +371 -0
  57. package/dist/resilience/handle.js.map +1 -0
  58. package/dist/resilience/index.d.ts +9 -0
  59. package/dist/resilience/index.d.ts.map +1 -0
  60. package/dist/resilience/index.js +9 -0
  61. package/dist/resilience/index.js.map +1 -0
  62. package/dist/resilience/types.d.ts +191 -0
  63. package/dist/resilience/types.d.ts.map +1 -0
  64. package/dist/resilience/types.js +8 -0
  65. package/dist/resilience/types.js.map +1 -0
  66. package/dist/shutdown/constants.d.ts +12 -0
  67. package/dist/shutdown/constants.d.ts.map +1 -0
  68. package/dist/shutdown/constants.js +15 -0
  69. package/dist/shutdown/constants.js.map +1 -0
  70. package/dist/shutdown/index.d.ts +10 -0
  71. package/dist/shutdown/index.d.ts.map +1 -0
  72. package/dist/shutdown/index.js +10 -0
  73. package/dist/shutdown/index.js.map +1 -0
  74. package/dist/shutdown/manager.d.ts +102 -0
  75. package/dist/shutdown/manager.d.ts.map +1 -0
  76. package/dist/shutdown/manager.js +252 -0
  77. package/dist/shutdown/manager.js.map +1 -0
  78. package/dist/shutdown/types.d.ts +133 -0
  79. package/dist/shutdown/types.d.ts.map +1 -0
  80. package/dist/shutdown/types.js +8 -0
  81. package/dist/shutdown/types.js.map +1 -0
  82. package/dist/transport/socket-transport.d.ts.map +1 -1
  83. package/dist/transport/socket-transport.js.map +1 -1
  84. package/package.json +1 -1
@@ -0,0 +1,371 @@
1
+ /**
2
+ * ResilientProcessHandle implementation.
3
+ *
4
+ * Wraps a ProcessHandle with heartbeat monitoring, auto-reconnect,
5
+ * and graceful shutdown capabilities.
6
+ *
7
+ * @packageDocumentation
8
+ * @module Resilience
9
+ */
10
+ import { EventEmitter } from "../utils/events.js";
11
+ import { HeartbeatManager, DEFAULT_HEARTBEAT_OPTIONS } from "../heartbeat/index.js";
12
+ import { ReconnectManager, DEFAULT_RECONNECT_OPTIONS } from "../reconnect/index.js";
13
+ import { ShutdownManager, DEFAULT_SHUTDOWN_OPTIONS } from "../shutdown/index.js";
14
+ import { ReservedMethods } from "../protocol/reserved-methods.js";
15
+ /**
16
+ * Creates a Reconnectable adapter from a ProcessHandle.
17
+ *
18
+ * Note: Reconnection is NOT supported for stdio-based ProcessHandle.
19
+ * stdio streams are bound to a specific process - when the process dies,
20
+ * the streams are destroyed and cannot be "reconnected".
21
+ *
22
+ * For ProcessHandle, "reconnection" means restarting the process, which is
23
+ * the responsibility of ProcessManager at a higher level, not ResilientProcessHandle.
24
+ *
25
+ * Reconnection IS supported for socket-based transports (TCP, named pipes as server)
26
+ * where a new connection can be established to a listening endpoint.
27
+ *
28
+ * @internal
29
+ */
30
+ function createReconnectable(_handle) {
31
+ return {
32
+ connect: async () => {
33
+ // stdio-based handles cannot be reconnected - the streams are bound
34
+ // to a specific process and are destroyed when the process exits.
35
+ // Use ProcessManager.restart() to restart the entire process instead.
36
+ throw new Error("Reconnection not supported for ProcessHandle. " +
37
+ "Use ProcessManager.restart() to restart the process.");
38
+ },
39
+ };
40
+ }
41
+ /**
42
+ * Creates a Shutdownable adapter from a ProcessHandle and control channel.
43
+ */
44
+ function createShutdownable(handle, kill) {
45
+ return {
46
+ id: handle.id,
47
+ pid: handle.pid,
48
+ request: (method, params, timeout) => handle.request(method, params, timeout),
49
+ kill,
50
+ onNotification: (method, handler) => {
51
+ // Subscribe to notifications from the control channel
52
+ // The channel's onNotification returns an unsubscribe function
53
+ const channel = handle.controlChannel;
54
+ // We need to filter notifications by method
55
+ const wrappedHandler = (notification) => {
56
+ // Check if this notification has the expected method
57
+ // The notification format depends on the protocol
58
+ const notif = notification;
59
+ if (notif.method === method) {
60
+ handler(notif.params);
61
+ }
62
+ };
63
+ return channel.onNotification(wrappedHandler);
64
+ },
65
+ };
66
+ }
67
+ /**
68
+ * Default resilient process options.
69
+ *
70
+ * Note: Reconnect is disabled by default for ProcessHandle because stdio-based
71
+ * transports cannot be reconnected. See createReconnectable() for details.
72
+ */
73
+ export const DEFAULT_RESILIENT_OPTIONS = {
74
+ heartbeat: DEFAULT_HEARTBEAT_OPTIONS,
75
+ reconnect: { ...DEFAULT_RECONNECT_OPTIONS, enabled: false },
76
+ shutdown: DEFAULT_SHUTDOWN_OPTIONS,
77
+ };
78
+ /**
79
+ * A process handle with resilience features.
80
+ *
81
+ * Combines heartbeat monitoring, auto-reconnect, and graceful shutdown
82
+ * with a standard ProcessHandle.
83
+ *
84
+ * @example
85
+ * ```typescript
86
+ * const resilientHandle = new ResilientProcessHandle(processHandle, {
87
+ * heartbeat: { intervalMs: 5000, timeoutMs: 1000, maxMissed: 3 },
88
+ * reconnect: { maxAttempts: 5, initialDelay: 100 },
89
+ * shutdown: { gracefulTimeoutMs: 5000 },
90
+ * });
91
+ *
92
+ * resilientHandle.on('heartbeatDead', () => {
93
+ * console.log('Worker is unresponsive');
94
+ * });
95
+ *
96
+ * resilientHandle.on('reconnected', ({ attempt }) => {
97
+ * console.log(`Reconnected after ${attempt} attempts`);
98
+ * });
99
+ *
100
+ * resilientHandle.start();
101
+ *
102
+ * // Later
103
+ * await resilientHandle.shutdown('user_requested');
104
+ * ```
105
+ */
106
+ export class ResilientProcessHandle {
107
+ _handle;
108
+ events = new EventEmitter();
109
+ heartbeatManager = null;
110
+ reconnectManager = null;
111
+ shutdownManager = null;
112
+ handleEventSubscriptions = [];
113
+ resilienceSubscriptions = [];
114
+ _isHealthy = true;
115
+ killFn = null;
116
+ /**
117
+ * Creates a new ResilientProcessHandle.
118
+ *
119
+ * @param handle - The underlying ProcessHandle
120
+ * @param options - Resilience configuration options
121
+ * @param killFn - Function to kill the process (injected for testability)
122
+ */
123
+ constructor(handle, options = {}, killFn) {
124
+ this._handle = handle;
125
+ this.killFn = killFn ?? null;
126
+ // Initialize heartbeat manager if not disabled
127
+ if (options.heartbeat !== false) {
128
+ const heartbeatOptions = {
129
+ ...DEFAULT_HEARTBEAT_OPTIONS,
130
+ ...(options.heartbeat ?? {}),
131
+ };
132
+ this.heartbeatManager = new HeartbeatManager(handle.controlChannel, heartbeatOptions);
133
+ this.setupHeartbeatListeners();
134
+ }
135
+ // Initialize reconnect manager if not disabled
136
+ if (options.reconnect !== false) {
137
+ const reconnectOptions = {
138
+ ...DEFAULT_RECONNECT_OPTIONS,
139
+ ...(options.reconnect ?? {}),
140
+ };
141
+ this.reconnectManager = new ReconnectManager(createReconnectable(handle), reconnectOptions);
142
+ this.setupReconnectListeners();
143
+ }
144
+ // Initialize shutdown manager if not disabled
145
+ if (options.shutdown !== false) {
146
+ const shutdownOptions = {
147
+ ...DEFAULT_SHUTDOWN_OPTIONS,
148
+ ...(options.shutdown ?? {}),
149
+ };
150
+ this.shutdownManager = new ShutdownManager(shutdownOptions);
151
+ this.setupShutdownListeners();
152
+ }
153
+ // Forward base handle events
154
+ this.setupHandleEventForwarding();
155
+ }
156
+ // ProcessHandle interface delegation
157
+ get id() {
158
+ return this._handle.id;
159
+ }
160
+ get pid() {
161
+ return this._handle.pid;
162
+ }
163
+ get state() {
164
+ return this._handle.state;
165
+ }
166
+ get isHealthy() {
167
+ return this._isHealthy;
168
+ }
169
+ get isReconnecting() {
170
+ return this.reconnectManager?.isReconnecting() ?? false;
171
+ }
172
+ get controlChannel() {
173
+ return this._handle.controlChannel;
174
+ }
175
+ get dataChannel() {
176
+ return this._handle.dataChannel;
177
+ }
178
+ get handle() {
179
+ return this._handle;
180
+ }
181
+ /**
182
+ * Sends a request, optionally queueing during reconnection.
183
+ * Successful requests signal activity to the heartbeat manager (implicit heartbeat).
184
+ */
185
+ async request(method, params, timeout) {
186
+ // If reconnecting and queueing is enabled, queue the request
187
+ if (this.reconnectManager?.isReconnecting()) {
188
+ const queued = this.reconnectManager.queueRequest(method, async () => {
189
+ return this._handle.request(method, params, timeout);
190
+ });
191
+ if (queued !== null) {
192
+ return queued;
193
+ }
194
+ }
195
+ const result = await this._handle.request(method, params, timeout);
196
+ // Signal activity to heartbeat manager (implicit heartbeat mode)
197
+ // This prevents healthy workers from being marked dead just because
198
+ // they don't respond to ping/pong while actively processing requests
199
+ this.heartbeatManager?.onActivity();
200
+ return result;
201
+ }
202
+ async notify(method, params) {
203
+ return this._handle.notify(method, params);
204
+ }
205
+ async requestViaData(method, params, timeout) {
206
+ if (!this._handle.dataChannel) {
207
+ throw new Error(`Data channel not available for process '${this.id}'`);
208
+ }
209
+ return this._handle.dataChannel.request(method, params, timeout);
210
+ }
211
+ /**
212
+ * Initiates graceful shutdown of the process.
213
+ */
214
+ async shutdown(reason = "user_requested") {
215
+ if (!this.shutdownManager) {
216
+ // No graceful shutdown - force kill and close
217
+ this.forceKill();
218
+ await this.close();
219
+ return;
220
+ }
221
+ // Stop heartbeat during shutdown
222
+ this.heartbeatManager?.stop();
223
+ const shutdownable = createShutdownable(this._handle, (signal) => {
224
+ if (this.killFn) {
225
+ this.killFn(signal);
226
+ }
227
+ else if (this._handle.pid !== null) {
228
+ // Fallback to process.kill() if no killFn provided
229
+ try {
230
+ process.kill(this._handle.pid, signal ?? "SIGTERM");
231
+ }
232
+ catch {
233
+ // Process may already be dead
234
+ }
235
+ }
236
+ });
237
+ await this.shutdownManager.initiateShutdown(shutdownable, reason);
238
+ }
239
+ async close() {
240
+ this.stop();
241
+ this.cleanupAllSubscriptions();
242
+ await this._handle.close();
243
+ }
244
+ on(event, handler) {
245
+ return this.events.on(event, handler);
246
+ }
247
+ /**
248
+ * Starts resilience features.
249
+ */
250
+ start() {
251
+ if (this.heartbeatManager) {
252
+ this.setupHeartbeatPongListener();
253
+ this.heartbeatManager.start();
254
+ }
255
+ }
256
+ /**
257
+ * Stops resilience features.
258
+ * Note: Base handle event forwarding continues after stop().
259
+ */
260
+ stop() {
261
+ this.heartbeatManager?.stop();
262
+ this.reconnectManager?.cancel();
263
+ // Cleanup resilience subscriptions only (not handle event forwarding)
264
+ for (const unsub of this.resilienceSubscriptions) {
265
+ unsub();
266
+ }
267
+ this.resilienceSubscriptions.length = 0;
268
+ }
269
+ // Private methods
270
+ setupHeartbeatListeners() {
271
+ if (!this.heartbeatManager)
272
+ return;
273
+ this.heartbeatManager.on("heartbeat:missed", ({ missedCount }) => {
274
+ this.events.emit("heartbeatMissed", { missedCount });
275
+ });
276
+ this.heartbeatManager.on("heartbeat:recovered", ({ missedCount }) => {
277
+ this._isHealthy = true;
278
+ this.events.emit("heartbeatRecovered", { missedCount });
279
+ });
280
+ this.heartbeatManager.on("heartbeat:dead", ({ missedCount, lastPongAt }) => {
281
+ this._isHealthy = false;
282
+ this.events.emit("heartbeatDead", { missedCount, lastPongAt });
283
+ });
284
+ }
285
+ setupReconnectListeners() {
286
+ if (!this.reconnectManager)
287
+ return;
288
+ this.reconnectManager.on("reconnect:attempting", ({ attempt, delay }) => {
289
+ this.events.emit("reconnecting", { attempt, delay });
290
+ });
291
+ this.reconnectManager.on("reconnect:success", ({ attempt, totalTimeMs }) => {
292
+ this.events.emit("reconnected", { attempt, totalTimeMs });
293
+ });
294
+ this.reconnectManager.on("reconnect:failed", ({ attempts, lastError }) => {
295
+ this.events.emit("reconnectFailed", { attempts, lastError });
296
+ });
297
+ }
298
+ setupShutdownListeners() {
299
+ if (!this.shutdownManager)
300
+ return;
301
+ this.shutdownManager.on("shutdown:start", ({ reason }) => {
302
+ this.events.emit("shutdownStarted", { reason });
303
+ });
304
+ this.shutdownManager.on("shutdown:ack", ({ pendingRequests }) => {
305
+ this.events.emit("shutdownAcknowledged", { pendingRequests });
306
+ });
307
+ this.shutdownManager.on("shutdown:done", ({ graceful, durationMs }) => {
308
+ this.events.emit("shutdownComplete", { graceful, durationMs });
309
+ });
310
+ }
311
+ setupHandleEventForwarding() {
312
+ const unsub1 = this._handle.on("stateChange", (data) => {
313
+ this.events.emit("stateChange", data);
314
+ });
315
+ const unsub2 = this._handle.on("exit", (data) => {
316
+ this.events.emit("exit", data);
317
+ });
318
+ const unsub3 = this._handle.on("error", (error) => {
319
+ this.events.emit("error", error);
320
+ });
321
+ this.handleEventSubscriptions.push(unsub1, unsub2, unsub3);
322
+ }
323
+ setupHeartbeatPongListener() {
324
+ if (!this.heartbeatManager)
325
+ return;
326
+ // Listen for notifications from worker
327
+ const channel = this._handle.controlChannel;
328
+ const unsubNotification = channel.onNotification((notification) => {
329
+ const notif = notification;
330
+ // Forward pong to HeartbeatManager for latency tracking
331
+ if (notif.method === ReservedMethods.HEARTBEAT_PONG) {
332
+ this.heartbeatManager.handlePong(notif.params);
333
+ }
334
+ // Any notification from worker counts as activity for implicit heartbeat.
335
+ // This prevents marking active workers as dead just because they don't
336
+ // respond to ping/pong while sending progress updates, metrics, etc.
337
+ this.heartbeatManager.onActivity();
338
+ });
339
+ this.resilienceSubscriptions.push(unsubNotification);
340
+ }
341
+ /**
342
+ * Force kills the process with SIGKILL.
343
+ */
344
+ forceKill() {
345
+ if (this.killFn) {
346
+ this.killFn("SIGKILL");
347
+ }
348
+ else if (this._handle.pid !== null) {
349
+ try {
350
+ process.kill(this._handle.pid, "SIGKILL");
351
+ }
352
+ catch {
353
+ // Process may already be dead
354
+ }
355
+ }
356
+ }
357
+ /**
358
+ * Cleanup all subscriptions (called by close()).
359
+ */
360
+ cleanupAllSubscriptions() {
361
+ for (const unsub of this.resilienceSubscriptions) {
362
+ unsub();
363
+ }
364
+ this.resilienceSubscriptions.length = 0;
365
+ for (const unsub of this.handleEventSubscriptions) {
366
+ unsub();
367
+ }
368
+ this.handleEventSubscriptions.length = 0;
369
+ }
370
+ }
371
+ //# sourceMappingURL=handle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle.js","sourceRoot":"","sources":["../../src/resilience/handle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Resilience module combining heartbeat, reconnect, and shutdown.
3
+ *
4
+ * @packageDocumentation
5
+ * @module Resilience
6
+ */
7
+ export * from "./types.js";
8
+ export * from "./handle.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resilience/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Resilience module combining heartbeat, reconnect, and shutdown.
3
+ *
4
+ * @packageDocumentation
5
+ * @module Resilience
6
+ */
7
+ export * from "./types.js";
8
+ export * from "./handle.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resilience/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Type definitions for the Resilience module.
3
+ *
4
+ * @packageDocumentation
5
+ * @module Resilience
6
+ */
7
+ import type { Unsubscribe } from "../utils/disposables.js";
8
+ import type { HeartbeatOptions } from "../heartbeat/types.js";
9
+ import type { ReconnectOptions } from "../reconnect/types.js";
10
+ import type { ShutdownOptions } from "../shutdown/types.js";
11
+ import type { ShutdownReason } from "../protocol/reserved-types.js";
12
+ import type { ProcessHandle, ProcessState, ProcessHandleEvents } from "../process/types.js";
13
+ import type { Channel } from "../channel/types.js";
14
+ /**
15
+ * Options for creating a ResilientProcessHandle.
16
+ */
17
+ export interface ResilientProcessOptions {
18
+ /**
19
+ * Heartbeat configuration.
20
+ * Set to false to disable heartbeat.
21
+ * Partial options will be merged with defaults.
22
+ */
23
+ heartbeat?: Partial<HeartbeatOptions> | false;
24
+ /**
25
+ * Reconnect configuration.
26
+ * Set to false to disable auto-reconnect.
27
+ * Partial options will be merged with defaults.
28
+ */
29
+ reconnect?: Partial<ReconnectOptions> | false;
30
+ /**
31
+ * Shutdown configuration.
32
+ * Set to false to disable graceful shutdown.
33
+ * Partial options will be merged with defaults.
34
+ */
35
+ shutdown?: Partial<ShutdownOptions> | false;
36
+ }
37
+ /**
38
+ * Extended events for resilient process handle.
39
+ */
40
+ export interface ResilientProcessEvents extends ProcessHandleEvents {
41
+ /**
42
+ * Fired when heartbeat is missed (worker may be unresponsive).
43
+ */
44
+ heartbeatMissed: {
45
+ missedCount: number;
46
+ };
47
+ /**
48
+ * Fired when heartbeat recovers after misses.
49
+ */
50
+ heartbeatRecovered: {
51
+ missedCount: number;
52
+ };
53
+ /**
54
+ * Fired when worker is determined dead (max misses exceeded).
55
+ */
56
+ heartbeatDead: {
57
+ missedCount: number;
58
+ lastPongAt: number | null;
59
+ };
60
+ /**
61
+ * Fired when reconnection is attempting.
62
+ */
63
+ reconnecting: {
64
+ attempt: number;
65
+ delay: number;
66
+ };
67
+ /**
68
+ * Fired when reconnection succeeds.
69
+ */
70
+ reconnected: {
71
+ attempt: number;
72
+ totalTimeMs: number;
73
+ };
74
+ /**
75
+ * Fired when reconnection fails permanently.
76
+ */
77
+ reconnectFailed: {
78
+ attempts: number;
79
+ lastError: Error;
80
+ };
81
+ /**
82
+ * Fired when graceful shutdown starts.
83
+ */
84
+ shutdownStarted: {
85
+ reason: ShutdownReason;
86
+ };
87
+ /**
88
+ * Fired when worker acknowledges shutdown.
89
+ */
90
+ shutdownAcknowledged: {
91
+ pendingRequests: number;
92
+ };
93
+ /**
94
+ * Fired when shutdown completes (graceful or forced).
95
+ */
96
+ shutdownComplete: {
97
+ graceful: boolean;
98
+ durationMs: number;
99
+ };
100
+ }
101
+ /**
102
+ * Interface for a resilient process handle with heartbeat, reconnect, and shutdown.
103
+ */
104
+ export interface IResilientProcessHandle {
105
+ /**
106
+ * Unique process identifier.
107
+ */
108
+ readonly id: string;
109
+ /**
110
+ * Process ID (OS-level).
111
+ */
112
+ readonly pid: number | null;
113
+ /**
114
+ * Current process state.
115
+ */
116
+ readonly state: ProcessState;
117
+ /**
118
+ * Whether the process is currently healthy (responding to heartbeats).
119
+ */
120
+ readonly isHealthy: boolean;
121
+ /**
122
+ * Whether the process is currently reconnecting.
123
+ */
124
+ readonly isReconnecting: boolean;
125
+ /**
126
+ * Control channel (stdio-based, always available).
127
+ */
128
+ readonly controlChannel: Channel;
129
+ /**
130
+ * Data channel (pipe-based, optional).
131
+ */
132
+ readonly dataChannel: Channel | null;
133
+ /**
134
+ * Underlying process handle.
135
+ */
136
+ readonly handle: ProcessHandle;
137
+ /**
138
+ * Sends a request via control channel.
139
+ * Requests are queued during reconnection if enabled.
140
+ *
141
+ * @param method - Method name
142
+ * @param params - Optional parameters
143
+ * @param timeout - Optional timeout override
144
+ * @returns Promise resolving to response result
145
+ */
146
+ request(method: string, params?: unknown, timeout?: number): Promise<unknown>;
147
+ /**
148
+ * Sends a notification via control channel.
149
+ *
150
+ * @param method - Method name
151
+ * @param params - Optional parameters
152
+ */
153
+ notify(method: string, params?: unknown): Promise<void>;
154
+ /**
155
+ * Sends a request via data channel.
156
+ *
157
+ * @param method - Method name
158
+ * @param params - Optional parameters
159
+ * @param timeout - Optional timeout override
160
+ * @returns Promise resolving to response result
161
+ * @throws {Error} if data channel is not available
162
+ */
163
+ requestViaData(method: string, params?: unknown, timeout?: number): Promise<unknown>;
164
+ /**
165
+ * Initiates graceful shutdown of the process.
166
+ *
167
+ * @param reason - Reason for shutdown
168
+ * @returns Promise that resolves when shutdown is complete
169
+ */
170
+ shutdown(reason?: ShutdownReason): Promise<void>;
171
+ /**
172
+ * Closes the handle and its channels.
173
+ * Does not terminate the process - use shutdown() for that.
174
+ */
175
+ close(): Promise<void>;
176
+ /**
177
+ * Subscribes to handle events.
178
+ *
179
+ * @returns Unsubscribe function
180
+ */
181
+ on<K extends keyof ResilientProcessEvents>(event: K, handler: (data: ResilientProcessEvents[K]) => void): Unsubscribe;
182
+ /**
183
+ * Starts the resilience features (heartbeat monitoring, etc.).
184
+ */
185
+ start(): void;
186
+ /**
187
+ * Stops the resilience features.
188
+ */
189
+ stop(): void;
190
+ }
191
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/resilience/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC5F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC;IAE9C;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC;IAE9C;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IACjE;;OAEG;IACH,eAAe,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAEzC;;OAEG;IACH,kBAAkB,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAE5C;;OAEG;IACH,aAAa,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAElE;;OAEG;IACH,YAAY,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAEjD;;OAEG;IACH,WAAW,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAEtD;;OAEG;IACH,eAAe,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,KAAK,CAAA;KAAE,CAAC;IAExD;;OAEG;IACH,eAAe,EAAE;QAAE,MAAM,EAAE,cAAc,CAAA;KAAE,CAAC;IAE5C;;OAEG;IACH,oBAAoB,EAAE;QAAE,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;IAElD;;OAEG;IACH,gBAAgB,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7D;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5B;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B;;OAEG;IACH,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAErC;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAE/B;;;;;;;;OAQG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9E;;;;;OAKG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExD;;;;;;;;OAQG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAErF;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjD;;;OAGG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;;;OAIG;IACH,EAAE,CAAC,CAAC,SAAS,MAAM,sBAAsB,EACvC,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAAK,IAAI,GACjD,WAAW,CAAC;IAEf;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;IAEd;;OAEG;IACH,IAAI,IAAI,IAAI,CAAC;CACd"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Type definitions for the Resilience module.
3
+ *
4
+ * @packageDocumentation
5
+ * @module Resilience
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/resilience/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Default options for ShutdownManager.
3
+ *
4
+ * @packageDocumentation
5
+ * @module Shutdown
6
+ */
7
+ import type { ShutdownOptions } from "./types.js";
8
+ /**
9
+ * Default shutdown options.
10
+ */
11
+ export declare const DEFAULT_SHUTDOWN_OPTIONS: Required<ShutdownOptions>;
12
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/shutdown/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,eAAe,CAI9D,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Default options for ShutdownManager.
3
+ *
4
+ * @packageDocumentation
5
+ * @module Shutdown
6
+ */
7
+ /**
8
+ * Default shutdown options.
9
+ */
10
+ export const DEFAULT_SHUTDOWN_OPTIONS = {
11
+ enabled: true,
12
+ gracefulTimeoutMs: 5000,
13
+ exitWaitMs: 1000,
14
+ };
15
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/shutdown/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAA8B;IACjE,OAAO,EAAE,IAAI;IACb,iBAAiB,EAAE,IAAI;IACvB,UAAU,EAAE,IAAI;CACjB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Graceful shutdown module for managed processes.
3
+ *
4
+ * @packageDocumentation
5
+ * @module Shutdown
6
+ */
7
+ export * from "./types.js";
8
+ export * from "./constants.js";
9
+ export * from "./manager.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shutdown/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC"}