@procwire/transport 0.1.1

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 (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +844 -0
  3. package/dist/channel/builder.d.ts +68 -0
  4. package/dist/channel/builder.d.ts.map +1 -0
  5. package/dist/channel/builder.js +120 -0
  6. package/dist/channel/builder.js.map +1 -0
  7. package/dist/channel/index.d.ts +6 -0
  8. package/dist/channel/index.d.ts.map +1 -0
  9. package/dist/channel/index.js +6 -0
  10. package/dist/channel/index.js.map +1 -0
  11. package/dist/channel/quickstart.d.ts +94 -0
  12. package/dist/channel/quickstart.d.ts.map +1 -0
  13. package/dist/channel/quickstart.js +104 -0
  14. package/dist/channel/quickstart.js.map +1 -0
  15. package/dist/channel/request-channel.d.ts +119 -0
  16. package/dist/channel/request-channel.d.ts.map +1 -0
  17. package/dist/channel/request-channel.js +476 -0
  18. package/dist/channel/request-channel.js.map +1 -0
  19. package/dist/channel/types.d.ts +226 -0
  20. package/dist/channel/types.d.ts.map +1 -0
  21. package/dist/channel/types.js +2 -0
  22. package/dist/channel/types.js.map +1 -0
  23. package/dist/framing/index.d.ts +4 -0
  24. package/dist/framing/index.d.ts.map +1 -0
  25. package/dist/framing/index.js +4 -0
  26. package/dist/framing/index.js.map +1 -0
  27. package/dist/framing/length-prefixed.d.ts +55 -0
  28. package/dist/framing/length-prefixed.d.ts.map +1 -0
  29. package/dist/framing/length-prefixed.js +102 -0
  30. package/dist/framing/length-prefixed.js.map +1 -0
  31. package/dist/framing/line-delimited.d.ts +61 -0
  32. package/dist/framing/line-delimited.d.ts.map +1 -0
  33. package/dist/framing/line-delimited.js +94 -0
  34. package/dist/framing/line-delimited.js.map +1 -0
  35. package/dist/framing/types.d.ts +35 -0
  36. package/dist/framing/types.d.ts.map +1 -0
  37. package/dist/framing/types.js +2 -0
  38. package/dist/framing/types.js.map +1 -0
  39. package/dist/index.d.ts +24 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +26 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/process/handle.d.ts +64 -0
  44. package/dist/process/handle.d.ts.map +1 -0
  45. package/dist/process/handle.js +107 -0
  46. package/dist/process/handle.js.map +1 -0
  47. package/dist/process/index.d.ts +37 -0
  48. package/dist/process/index.d.ts.map +1 -0
  49. package/dist/process/index.js +37 -0
  50. package/dist/process/index.js.map +1 -0
  51. package/dist/process/manager.d.ts +58 -0
  52. package/dist/process/manager.d.ts.map +1 -0
  53. package/dist/process/manager.js +360 -0
  54. package/dist/process/manager.js.map +1 -0
  55. package/dist/process/types.d.ts +322 -0
  56. package/dist/process/types.d.ts.map +1 -0
  57. package/dist/process/types.js +2 -0
  58. package/dist/process/types.js.map +1 -0
  59. package/dist/protocol/index.d.ts +4 -0
  60. package/dist/protocol/index.d.ts.map +1 -0
  61. package/dist/protocol/index.js +6 -0
  62. package/dist/protocol/index.js.map +1 -0
  63. package/dist/protocol/jsonrpc.d.ts +146 -0
  64. package/dist/protocol/jsonrpc.d.ts.map +1 -0
  65. package/dist/protocol/jsonrpc.js +288 -0
  66. package/dist/protocol/jsonrpc.js.map +1 -0
  67. package/dist/protocol/simple.d.ts +139 -0
  68. package/dist/protocol/simple.d.ts.map +1 -0
  69. package/dist/protocol/simple.js +297 -0
  70. package/dist/protocol/simple.js.map +1 -0
  71. package/dist/protocol/types.d.ts +117 -0
  72. package/dist/protocol/types.d.ts.map +1 -0
  73. package/dist/protocol/types.js +2 -0
  74. package/dist/protocol/types.js.map +1 -0
  75. package/dist/serialization/index.d.ts +5 -0
  76. package/dist/serialization/index.d.ts.map +1 -0
  77. package/dist/serialization/index.js +5 -0
  78. package/dist/serialization/index.js.map +1 -0
  79. package/dist/serialization/json.d.ts +66 -0
  80. package/dist/serialization/json.d.ts.map +1 -0
  81. package/dist/serialization/json.js +66 -0
  82. package/dist/serialization/json.js.map +1 -0
  83. package/dist/serialization/raw.d.ts +38 -0
  84. package/dist/serialization/raw.d.ts.map +1 -0
  85. package/dist/serialization/raw.js +41 -0
  86. package/dist/serialization/raw.js.map +1 -0
  87. package/dist/serialization/registry.d.ts +91 -0
  88. package/dist/serialization/registry.d.ts.map +1 -0
  89. package/dist/serialization/registry.js +119 -0
  90. package/dist/serialization/registry.js.map +1 -0
  91. package/dist/serialization/types.d.ts +27 -0
  92. package/dist/serialization/types.d.ts.map +1 -0
  93. package/dist/serialization/types.js +2 -0
  94. package/dist/serialization/types.js.map +1 -0
  95. package/dist/transport/factory.d.ts +139 -0
  96. package/dist/transport/factory.d.ts.map +1 -0
  97. package/dist/transport/factory.js +162 -0
  98. package/dist/transport/factory.js.map +1 -0
  99. package/dist/transport/index.d.ts +6 -0
  100. package/dist/transport/index.d.ts.map +1 -0
  101. package/dist/transport/index.js +9 -0
  102. package/dist/transport/index.js.map +1 -0
  103. package/dist/transport/socket-server.d.ts +48 -0
  104. package/dist/transport/socket-server.d.ts.map +1 -0
  105. package/dist/transport/socket-server.js +215 -0
  106. package/dist/transport/socket-server.js.map +1 -0
  107. package/dist/transport/socket-transport.d.ts +67 -0
  108. package/dist/transport/socket-transport.d.ts.map +1 -0
  109. package/dist/transport/socket-transport.js +193 -0
  110. package/dist/transport/socket-transport.js.map +1 -0
  111. package/dist/transport/stdio-transport.d.ts +94 -0
  112. package/dist/transport/stdio-transport.d.ts.map +1 -0
  113. package/dist/transport/stdio-transport.js +234 -0
  114. package/dist/transport/stdio-transport.js.map +1 -0
  115. package/dist/transport/types.d.ts +131 -0
  116. package/dist/transport/types.d.ts.map +1 -0
  117. package/dist/transport/types.js +2 -0
  118. package/dist/transport/types.js.map +1 -0
  119. package/dist/utils/assert.d.ts +16 -0
  120. package/dist/utils/assert.d.ts.map +1 -0
  121. package/dist/utils/assert.js +31 -0
  122. package/dist/utils/assert.js.map +1 -0
  123. package/dist/utils/disposables.d.ts +38 -0
  124. package/dist/utils/disposables.d.ts.map +1 -0
  125. package/dist/utils/disposables.js +59 -0
  126. package/dist/utils/disposables.js.map +1 -0
  127. package/dist/utils/errors.d.ts +43 -0
  128. package/dist/utils/errors.d.ts.map +1 -0
  129. package/dist/utils/errors.js +69 -0
  130. package/dist/utils/errors.js.map +1 -0
  131. package/dist/utils/events.d.ts +58 -0
  132. package/dist/utils/events.d.ts.map +1 -0
  133. package/dist/utils/events.js +95 -0
  134. package/dist/utils/events.js.map +1 -0
  135. package/dist/utils/index.d.ts +8 -0
  136. package/dist/utils/index.d.ts.map +1 -0
  137. package/dist/utils/index.js +8 -0
  138. package/dist/utils/index.js.map +1 -0
  139. package/dist/utils/pipe-path.d.ts +48 -0
  140. package/dist/utils/pipe-path.d.ts.map +1 -0
  141. package/dist/utils/pipe-path.js +89 -0
  142. package/dist/utils/pipe-path.js.map +1 -0
  143. package/dist/utils/platform.d.ts +16 -0
  144. package/dist/utils/platform.d.ts.map +1 -0
  145. package/dist/utils/platform.js +22 -0
  146. package/dist/utils/platform.js.map +1 -0
  147. package/dist/utils/time.d.ts +38 -0
  148. package/dist/utils/time.d.ts.map +1 -0
  149. package/dist/utils/time.js +55 -0
  150. package/dist/utils/time.js.map +1 -0
  151. package/package.json +85 -0
@@ -0,0 +1,360 @@
1
+ import { ProcessHandle } from "./handle.js";
2
+ import { EventEmitter } from "../utils/events.js";
3
+ import { StdioTransport } from "../transport/stdio-transport.js";
4
+ import { SocketTransport } from "../transport/socket-transport.js";
5
+ import { ChannelBuilder } from "../channel/builder.js";
6
+ import { LineDelimitedFraming } from "../framing/line-delimited.js";
7
+ import { LengthPrefixedFraming } from "../framing/length-prefixed.js";
8
+ import { JsonCodec } from "../serialization/json.js";
9
+ import { RawCodec } from "../serialization/raw.js";
10
+ import { JsonRpcProtocol } from "../protocol/jsonrpc.js";
11
+ import { SimpleProtocol } from "../protocol/simple.js";
12
+ import { PipePath } from "../utils/pipe-path.js";
13
+ import { sleep } from "../utils/time.js";
14
+ /**
15
+ * Process manager implementation.
16
+ * Manages the lifecycle of multiple child processes with restart capability.
17
+ */
18
+ export class ProcessManager {
19
+ config;
20
+ processes = new Map();
21
+ events = new EventEmitter();
22
+ constructor(config = {}) {
23
+ this.config = {
24
+ defaultTimeout: config.defaultTimeout ?? 30000,
25
+ restartPolicy: config.restartPolicy ?? {
26
+ enabled: false,
27
+ maxRestarts: 3,
28
+ backoffMs: 1000,
29
+ maxBackoffMs: 30000,
30
+ },
31
+ namespace: config.namespace ?? "procwire",
32
+ gracefulShutdownMs: config.gracefulShutdownMs ?? 5000,
33
+ };
34
+ }
35
+ /**
36
+ * Spawns a new managed process.
37
+ */
38
+ async spawn(id, options) {
39
+ if (this.processes.has(id)) {
40
+ throw new Error(`Process with ID '${id}' already exists`);
41
+ }
42
+ const restartPolicy = options.restartPolicy ?? this.config.restartPolicy;
43
+ // Create stdio transport
44
+ const transportOptions = {
45
+ executablePath: options.executablePath,
46
+ startupTimeout: options.startupTimeout ?? 10000,
47
+ };
48
+ if (options.args !== undefined) {
49
+ transportOptions.args = options.args;
50
+ }
51
+ if (options.cwd !== undefined) {
52
+ transportOptions.cwd = options.cwd;
53
+ }
54
+ if (options.env !== undefined) {
55
+ transportOptions.env = options.env;
56
+ }
57
+ const transport = new StdioTransport(transportOptions);
58
+ // Build control channel (stdio-based)
59
+ const controlChannel = await this.buildControlChannel(transport, options.controlChannel);
60
+ // Build data channel if enabled
61
+ let dataChannel = null;
62
+ if (options.dataChannel?.enabled) {
63
+ const dataPath = options.dataChannel.path ?? PipePath.forModule(this.config.namespace, id);
64
+ dataChannel = await this.buildDataChannel(dataPath, options.dataChannel.channel);
65
+ }
66
+ // Create handle
67
+ const handle = new ProcessHandle(id, null, controlChannel, dataChannel);
68
+ // Store managed process
69
+ const managed = {
70
+ handle,
71
+ transport,
72
+ options,
73
+ restartAttempt: 0,
74
+ manualStop: false,
75
+ restartPolicy,
76
+ };
77
+ this.processes.set(id, managed);
78
+ // Setup process lifecycle listeners
79
+ transport.on("exit", ({ code, signal }) => {
80
+ this.handleProcessExit(id, code, signal);
81
+ });
82
+ transport.on("error", (error) => {
83
+ this.events.emit("error", { id, error });
84
+ handle.emitError(error);
85
+ });
86
+ // Start transport and channels
87
+ try {
88
+ await transport.connect();
89
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
90
+ const pid = transport.process?.pid ?? null;
91
+ handle.setPid(pid);
92
+ await controlChannel.start();
93
+ if (dataChannel) {
94
+ await dataChannel.start();
95
+ }
96
+ handle.setState("running");
97
+ this.events.emit("spawn", { id, pid: pid ?? 0 });
98
+ this.events.emit("ready", { id });
99
+ }
100
+ catch (error) {
101
+ // Cleanup on failure
102
+ this.processes.delete(id);
103
+ await this.cleanupProcess(managed);
104
+ throw error;
105
+ }
106
+ return handle;
107
+ }
108
+ /**
109
+ * Terminates a managed process.
110
+ */
111
+ async terminate(id) {
112
+ const managed = this.processes.get(id);
113
+ if (!managed) {
114
+ throw new Error(`Process '${id}' not found`);
115
+ }
116
+ managed.manualStop = true;
117
+ managed.handle.setState("stopping");
118
+ await this.cleanupProcess(managed);
119
+ this.processes.delete(id);
120
+ managed.handle.setState("stopped");
121
+ }
122
+ /**
123
+ * Terminates all managed processes.
124
+ */
125
+ async terminateAll() {
126
+ const promises = [];
127
+ for (const id of this.processes.keys()) {
128
+ promises.push(this.terminate(id));
129
+ }
130
+ await Promise.all(promises);
131
+ }
132
+ /**
133
+ * Gets a process handle by ID.
134
+ */
135
+ getHandle(id) {
136
+ return this.processes.get(id)?.handle ?? null;
137
+ }
138
+ /**
139
+ * Checks if a process is running.
140
+ */
141
+ isRunning(id) {
142
+ const managed = this.processes.get(id);
143
+ return managed !== undefined && managed.handle.state === "running";
144
+ }
145
+ /**
146
+ * Subscribes to manager events.
147
+ */
148
+ on(event, handler) {
149
+ return this.events.on(event, handler);
150
+ }
151
+ /**
152
+ * Handles process exit event.
153
+ */
154
+ async handleProcessExit(id, code, signal) {
155
+ const managed = this.processes.get(id);
156
+ if (!managed) {
157
+ return;
158
+ }
159
+ this.events.emit("exit", { id, code, signal });
160
+ managed.handle.emitExit(code, signal);
161
+ // Check if we should restart
162
+ const shouldRestart = !managed.manualStop &&
163
+ managed.restartPolicy.enabled &&
164
+ managed.restartAttempt < managed.restartPolicy.maxRestarts &&
165
+ (code !== 0 || signal !== null);
166
+ if (shouldRestart) {
167
+ // Calculate backoff delay
168
+ const baseDelay = managed.restartPolicy.backoffMs;
169
+ const maxDelay = managed.restartPolicy.maxBackoffMs ?? Infinity;
170
+ const delay = Math.min(baseDelay * Math.pow(2, managed.restartAttempt), maxDelay);
171
+ managed.restartAttempt++;
172
+ managed.handle.setState("crashed");
173
+ this.events.emit("restart", {
174
+ id,
175
+ attempt: managed.restartAttempt,
176
+ delayMs: delay,
177
+ });
178
+ // Wait backoff delay
179
+ await sleep(delay);
180
+ // Attempt restart
181
+ try {
182
+ await this.restartProcess(id);
183
+ }
184
+ catch (error) {
185
+ const err = error instanceof Error ? error : new Error(String(error));
186
+ this.events.emit("crash", { id, error: err });
187
+ managed.handle.setState("error");
188
+ managed.handle.emitError(err);
189
+ }
190
+ }
191
+ else {
192
+ // No restart - mark as crashed or stopped
193
+ if (managed.manualStop || code === 0) {
194
+ managed.handle.setState("stopped");
195
+ }
196
+ else {
197
+ managed.handle.setState("crashed");
198
+ const error = new Error(`Process exited with code ${code} and signal ${signal}`);
199
+ this.events.emit("crash", { id, error });
200
+ }
201
+ // Cleanup
202
+ await this.cleanupProcess(managed);
203
+ this.processes.delete(id);
204
+ }
205
+ }
206
+ /**
207
+ * Restarts a crashed process.
208
+ */
209
+ async restartProcess(id) {
210
+ const managed = this.processes.get(id);
211
+ if (!managed) {
212
+ throw new Error(`Process '${id}' not found`);
213
+ }
214
+ // Cleanup old resources
215
+ await this.cleanupProcess(managed);
216
+ // Create new transport
217
+ const transportOptions = {
218
+ executablePath: managed.options.executablePath,
219
+ startupTimeout: managed.options.startupTimeout ?? 10000,
220
+ };
221
+ if (managed.options.args !== undefined) {
222
+ transportOptions.args = managed.options.args;
223
+ }
224
+ if (managed.options.cwd !== undefined) {
225
+ transportOptions.cwd = managed.options.cwd;
226
+ }
227
+ if (managed.options.env !== undefined) {
228
+ transportOptions.env = managed.options.env;
229
+ }
230
+ const transport = new StdioTransport(transportOptions);
231
+ // Build new control channel
232
+ const controlChannel = await this.buildControlChannel(transport, managed.options.controlChannel);
233
+ // Build new data channel if needed
234
+ let dataChannel = null;
235
+ if (managed.options.dataChannel?.enabled) {
236
+ const dataPath = managed.options.dataChannel.path ?? PipePath.forModule(this.config.namespace, id);
237
+ dataChannel = await this.buildDataChannel(dataPath, managed.options.dataChannel.channel);
238
+ }
239
+ // Update handle
240
+ const oldHandle = managed.handle;
241
+ const newHandle = new ProcessHandle(id, null, controlChannel, dataChannel);
242
+ managed.handle = newHandle;
243
+ managed.transport = transport;
244
+ // Setup listeners
245
+ transport.on("exit", ({ code, signal }) => {
246
+ this.handleProcessExit(id, code, signal);
247
+ });
248
+ transport.on("error", (error) => {
249
+ this.events.emit("error", { id, error });
250
+ newHandle.emitError(error);
251
+ });
252
+ // Start
253
+ await transport.connect();
254
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
255
+ const pid = transport.process?.pid ?? null;
256
+ newHandle.setPid(pid);
257
+ await controlChannel.start();
258
+ if (dataChannel) {
259
+ await dataChannel.start();
260
+ }
261
+ newHandle.setState("running");
262
+ this.events.emit("spawn", { id, pid: pid ?? 0 });
263
+ this.events.emit("ready", { id });
264
+ // Close old handle
265
+ await oldHandle.close().catch(() => { });
266
+ }
267
+ /**
268
+ * Cleans up process resources.
269
+ */
270
+ async cleanupProcess(managed) {
271
+ // Close channels
272
+ await managed.handle.close().catch(() => { });
273
+ // Terminate transport
274
+ try {
275
+ await managed.transport.disconnect();
276
+ }
277
+ catch {
278
+ // Force kill if graceful shutdown fails
279
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
280
+ const childProcess = managed.transport.process;
281
+ if (childProcess && !childProcess.killed) {
282
+ childProcess.kill("SIGKILL");
283
+ }
284
+ }
285
+ }
286
+ /**
287
+ * Builds control channel from stdio transport.
288
+ */
289
+ async buildControlChannel(transport, config) {
290
+ const framing = config?.framing === "length-prefixed"
291
+ ? new LengthPrefixedFraming()
292
+ : typeof config?.framing === "object"
293
+ ? config.framing
294
+ : new LineDelimitedFraming();
295
+ const serialization = config?.serialization === "raw"
296
+ ? new RawCodec()
297
+ : typeof config?.serialization === "object"
298
+ ? config.serialization
299
+ : new JsonCodec();
300
+ const protocol = config?.protocol === "simple"
301
+ ? new SimpleProtocol()
302
+ : typeof config?.protocol === "object"
303
+ ? config.protocol
304
+ : new JsonRpcProtocol();
305
+ const builder = new ChannelBuilder()
306
+ .withTransport(transport)
307
+ .withFraming(framing)
308
+ .withSerialization(serialization)
309
+ .withProtocol(protocol);
310
+ if (config?.timeoutMs !== undefined) {
311
+ builder.withTimeout(config.timeoutMs);
312
+ }
313
+ else {
314
+ builder.withTimeout(this.config.defaultTimeout);
315
+ }
316
+ if (config?.responseAccessor !== undefined) {
317
+ builder.withResponseAccessor(config.responseAccessor);
318
+ }
319
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
320
+ return builder.build();
321
+ }
322
+ /**
323
+ * Builds data channel from pipe transport.
324
+ */
325
+ async buildDataChannel(path, config) {
326
+ const transport = new SocketTransport({ path });
327
+ const framing = config?.framing === "line-delimited"
328
+ ? new LineDelimitedFraming()
329
+ : typeof config?.framing === "object"
330
+ ? config.framing
331
+ : new LengthPrefixedFraming();
332
+ const serialization = config?.serialization === "raw"
333
+ ? new RawCodec()
334
+ : typeof config?.serialization === "object"
335
+ ? config.serialization
336
+ : new JsonCodec();
337
+ const protocol = config?.protocol === "simple"
338
+ ? new SimpleProtocol()
339
+ : typeof config?.protocol === "object"
340
+ ? config.protocol
341
+ : new JsonRpcProtocol();
342
+ const builder = new ChannelBuilder()
343
+ .withTransport(transport)
344
+ .withFraming(framing)
345
+ .withSerialization(serialization)
346
+ .withProtocol(protocol);
347
+ if (config?.timeoutMs !== undefined) {
348
+ builder.withTimeout(config.timeoutMs);
349
+ }
350
+ else {
351
+ builder.withTimeout(this.config.defaultTimeout);
352
+ }
353
+ if (config?.responseAccessor !== undefined) {
354
+ builder.withResponseAccessor(config.responseAccessor);
355
+ }
356
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
357
+ return builder.build();
358
+ }
359
+ }
360
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/process/manager.ts"],"names":[],"mappings":"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"}