procxy 0.1.0-alpha.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 (55) hide show
  1. package/CHANGELOG.md +125 -0
  2. package/README.md +936 -0
  3. package/dist/child/agent.d.ts +3 -0
  4. package/dist/child/agent.d.ts.map +1 -0
  5. package/dist/child/agent.js +126 -0
  6. package/dist/child/agent.js.map +1 -0
  7. package/dist/child/child-proxy.d.ts +23 -0
  8. package/dist/child/child-proxy.d.ts.map +1 -0
  9. package/dist/child/child-proxy.js +193 -0
  10. package/dist/child/child-proxy.js.map +1 -0
  11. package/dist/child/event-bridge.d.ts +15 -0
  12. package/dist/child/event-bridge.d.ts.map +1 -0
  13. package/dist/child/event-bridge.js +51 -0
  14. package/dist/child/event-bridge.js.map +1 -0
  15. package/dist/index.d.ts +11 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +8 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/parent/ipc-client.d.ts +31 -0
  20. package/dist/parent/ipc-client.d.ts.map +1 -0
  21. package/dist/parent/ipc-client.js +316 -0
  22. package/dist/parent/ipc-client.js.map +1 -0
  23. package/dist/parent/parent-proxy.d.ts +4 -0
  24. package/dist/parent/parent-proxy.d.ts.map +1 -0
  25. package/dist/parent/parent-proxy.js +76 -0
  26. package/dist/parent/parent-proxy.js.map +1 -0
  27. package/dist/parent/procxy.d.ts +6 -0
  28. package/dist/parent/procxy.d.ts.map +1 -0
  29. package/dist/parent/procxy.js +120 -0
  30. package/dist/parent/procxy.js.map +1 -0
  31. package/dist/shared/errors.d.ts +31 -0
  32. package/dist/shared/errors.d.ts.map +1 -0
  33. package/dist/shared/errors.js +85 -0
  34. package/dist/shared/errors.js.map +1 -0
  35. package/dist/shared/module-resolver.d.ts +6 -0
  36. package/dist/shared/module-resolver.d.ts.map +1 -0
  37. package/dist/shared/module-resolver.js +99 -0
  38. package/dist/shared/module-resolver.js.map +1 -0
  39. package/dist/shared/protocol.d.ts +86 -0
  40. package/dist/shared/protocol.d.ts.map +1 -0
  41. package/dist/shared/protocol.js +2 -0
  42. package/dist/shared/protocol.js.map +1 -0
  43. package/dist/shared/serialization.d.ts +20 -0
  44. package/dist/shared/serialization.d.ts.map +1 -0
  45. package/dist/shared/serialization.js +96 -0
  46. package/dist/shared/serialization.js.map +1 -0
  47. package/dist/types/options.d.ts +9 -0
  48. package/dist/types/options.d.ts.map +1 -0
  49. package/dist/types/options.js +2 -0
  50. package/dist/types/options.js.map +1 -0
  51. package/dist/types/procxy.d.ts +50 -0
  52. package/dist/types/procxy.d.ts.map +1 -0
  53. package/dist/types/procxy.js +2 -0
  54. package/dist/types/procxy.js.map +1 -0
  55. package/package.json +87 -0
@@ -0,0 +1,316 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { TimeoutError, ChildCrashedError } from '../shared/errors.js';
3
+ import { EventEmitter } from 'node:events';
4
+ import { CallbackRegistry, serializeWithCallbacks } from '../shared/serialization.js';
5
+ export class IPCClient extends EventEmitter {
6
+ childProcess;
7
+ pendingRequests = new Map();
8
+ callbackRegistry = new CallbackRegistry();
9
+ propertyStore = new Map();
10
+ timeout;
11
+ retries;
12
+ isTerminated = false;
13
+ subscribedEvents = new Set();
14
+ constructor(childProcess, timeout = 30000, retries = 3) {
15
+ super();
16
+ this.childProcess = childProcess;
17
+ this.timeout = timeout;
18
+ this.retries = retries;
19
+ this.childProcess.on('message', this.handleMessage.bind(this));
20
+ this.childProcess.on('exit', this.handleExit.bind(this));
21
+ this.setupEventTracking();
22
+ }
23
+ get process() {
24
+ return this.childProcess;
25
+ }
26
+ setupEventTracking() {
27
+ const originalOn = this.on.bind(this);
28
+ const originalOnce = this.once.bind(this);
29
+ const originalOff = this.off.bind(this);
30
+ const originalRemoveListener = this.removeListener.bind(this);
31
+ const originalRemoveAllListeners = this.removeAllListeners.bind(this);
32
+ this.on = (event, listener) => {
33
+ const hadListeners = this.listenerCount(event) > 0;
34
+ const result = originalOn(event, listener);
35
+ if (!hadListeners && this.listenerCount(event) === 1) {
36
+ this.subscribeInChild(event);
37
+ }
38
+ return result;
39
+ };
40
+ this.once = (event, listener) => {
41
+ const hadListeners = this.listenerCount(event) > 0;
42
+ const result = originalOnce(event, listener);
43
+ if (!hadListeners && this.listenerCount(event) > 0) {
44
+ this.subscribeInChild(event);
45
+ }
46
+ return result;
47
+ };
48
+ this.off = (event, listener) => {
49
+ const result = originalOff(event, listener);
50
+ if (this.listenerCount(event) === 0) {
51
+ this.unsubscribeInChild(event);
52
+ }
53
+ return result;
54
+ };
55
+ this.removeListener = (event, listener) => {
56
+ const result = originalRemoveListener(event, listener);
57
+ if (this.listenerCount(event) === 0) {
58
+ this.unsubscribeInChild(event);
59
+ }
60
+ return result;
61
+ };
62
+ this.removeAllListeners = (event) => {
63
+ if (event) {
64
+ const hadListeners = this.listenerCount(event) > 0;
65
+ const result = originalRemoveAllListeners(event);
66
+ if (hadListeners) {
67
+ this.unsubscribeInChild(event);
68
+ }
69
+ return result;
70
+ }
71
+ else {
72
+ const events = this.eventNames();
73
+ const result = originalRemoveAllListeners();
74
+ for (const evt of events) {
75
+ this.unsubscribeInChild(evt);
76
+ }
77
+ return result;
78
+ }
79
+ };
80
+ }
81
+ subscribeInChild(event) {
82
+ if (this.isTerminated) {
83
+ return;
84
+ }
85
+ if (this.subscribedEvents.has(event)) {
86
+ return;
87
+ }
88
+ this.subscribedEvents.add(event);
89
+ const eventName = typeof event === 'symbol' ? event.toString() : event;
90
+ const message = {
91
+ type: 'EVENT_SUBSCRIBE',
92
+ eventName
93
+ };
94
+ this.childProcess.send(message);
95
+ }
96
+ unsubscribeInChild(event) {
97
+ if (this.isTerminated) {
98
+ return;
99
+ }
100
+ if (!this.subscribedEvents.has(event)) {
101
+ return;
102
+ }
103
+ this.subscribedEvents.delete(event);
104
+ const eventName = typeof event === 'symbol' ? event.toString() : event;
105
+ const message = {
106
+ type: 'EVENT_UNSUBSCRIBE',
107
+ eventName
108
+ };
109
+ this.childProcess.send(message);
110
+ }
111
+ async sendRequest(method, args, attemptNumber = 0) {
112
+ if (this.isTerminated) {
113
+ throw new Error('Child process has been terminated');
114
+ }
115
+ const id = randomUUID();
116
+ const serializedArgs = args.map((arg) => serializeWithCallbacks(arg, this.callbackRegistry));
117
+ const request = {
118
+ type: 'CALL',
119
+ id,
120
+ prop: method,
121
+ args: serializedArgs
122
+ };
123
+ return new Promise((resolve, reject) => {
124
+ const timeoutId = setTimeout(() => {
125
+ this.pendingRequests.delete(id);
126
+ if (attemptNumber < this.retries) {
127
+ this.sendRequest(method, args, attemptNumber + 1)
128
+ .then(resolve)
129
+ .catch(reject);
130
+ }
131
+ else {
132
+ reject(new TimeoutError(method, this.timeout));
133
+ }
134
+ }, this.timeout);
135
+ this.pendingRequests.set(id, {
136
+ resolve,
137
+ reject,
138
+ method,
139
+ timeoutId
140
+ });
141
+ this.childProcess.send(request);
142
+ });
143
+ }
144
+ handleMessage(message) {
145
+ if (message.type === 'RESULT' || message.type === 'ERROR') {
146
+ this.handleResponse(message);
147
+ return;
148
+ }
149
+ if (message.type === 'EVENT') {
150
+ this.handleEvent(message);
151
+ return;
152
+ }
153
+ if (message.type === 'CALLBACK_INVOKE') {
154
+ this.handleCallbackInvoke(message);
155
+ return;
156
+ }
157
+ if (message.type === 'PROPERTY_GET') {
158
+ this.handlePropertyGet(message);
159
+ return;
160
+ }
161
+ if (message.type === 'PROPERTY_SET') {
162
+ this.handlePropertySet(message);
163
+ return;
164
+ }
165
+ if (message.type === 'INIT_SUCCESS') {
166
+ this.emit('init_success');
167
+ return;
168
+ }
169
+ if (message.type === 'INIT_FAILURE') {
170
+ this.emit('init_failure', this.toError(message.error));
171
+ return;
172
+ }
173
+ }
174
+ handleResponse(response) {
175
+ const pending = this.pendingRequests.get(response.id);
176
+ if (!pending) {
177
+ return;
178
+ }
179
+ if (pending.timeoutId) {
180
+ clearTimeout(pending.timeoutId);
181
+ }
182
+ this.pendingRequests.delete(response.id);
183
+ if (response.type === 'RESULT') {
184
+ pending.resolve(response.value ?? null);
185
+ }
186
+ else {
187
+ pending.reject(this.toError(response.error));
188
+ }
189
+ }
190
+ handleEvent(message) {
191
+ this.emit(message.eventName, ...message.args);
192
+ }
193
+ async handleCallbackInvoke(message) {
194
+ const callback = this.callbackRegistry.get(message.callbackId);
195
+ if (!callback) {
196
+ const errorResponse = {
197
+ id: message.id,
198
+ type: 'CALLBACK_ERROR',
199
+ error: {
200
+ name: 'Error',
201
+ message: `Callback ${message.callbackId} not found`,
202
+ stack: undefined
203
+ }
204
+ };
205
+ this.childProcess.send(errorResponse);
206
+ return;
207
+ }
208
+ try {
209
+ const result = await callback(...message.args);
210
+ const successResponse = {
211
+ id: message.id,
212
+ type: 'CALLBACK_RESULT',
213
+ value: result ?? null
214
+ };
215
+ this.childProcess.send(successResponse);
216
+ }
217
+ catch (error) {
218
+ const errorResponse = {
219
+ id: message.id,
220
+ type: 'CALLBACK_ERROR',
221
+ error: {
222
+ name: error instanceof Error ? error.name : 'Error',
223
+ message: error instanceof Error ? error.message : String(error),
224
+ stack: error instanceof Error ? error.stack : undefined
225
+ }
226
+ };
227
+ this.childProcess.send(errorResponse);
228
+ }
229
+ }
230
+ handlePropertyGet(message) {
231
+ const value = this.propertyStore.get(message.prop) ?? null;
232
+ const response = {
233
+ id: message.id,
234
+ type: 'PROPERTY_RESULT',
235
+ value
236
+ };
237
+ this.childProcess.send(response);
238
+ }
239
+ handlePropertySet(message) {
240
+ this.propertyStore.set(message.prop, message.value);
241
+ }
242
+ hasProperty(prop) {
243
+ return this.propertyStore.has(prop);
244
+ }
245
+ getPropertySync(prop) {
246
+ return this.propertyStore.get(prop) ?? null;
247
+ }
248
+ handleExit(code, signal) {
249
+ this.isTerminated = true;
250
+ const error = new ChildCrashedError(code, signal);
251
+ for (const [_id, pending] of this.pendingRequests.entries()) {
252
+ if (pending.timeoutId) {
253
+ clearTimeout(pending.timeoutId);
254
+ }
255
+ pending.reject(error);
256
+ }
257
+ this.pendingRequests.clear();
258
+ this.emit('child_exit', code, signal);
259
+ }
260
+ async terminate() {
261
+ this.childProcess.off('message', this.handleMessage);
262
+ if (this.isTerminated) {
263
+ return;
264
+ }
265
+ this.isTerminated = true;
266
+ try {
267
+ if (this.childProcess.connected && !this.childProcess.killed) {
268
+ const disposeRequest = { type: 'DISPOSE' };
269
+ this.childProcess.send(disposeRequest);
270
+ await Promise.race([
271
+ new Promise((resolve) => {
272
+ const handler = (msg) => {
273
+ if (msg.type === 'DISPOSE_COMPLETE') {
274
+ this.childProcess.off('message', handler);
275
+ resolve();
276
+ }
277
+ };
278
+ this.childProcess.on('message', handler);
279
+ }),
280
+ new Promise((resolve) => setTimeout(resolve, 1000))
281
+ ]);
282
+ }
283
+ }
284
+ catch {
285
+ }
286
+ for (const [_id, pending] of this.pendingRequests.entries()) {
287
+ if (pending.timeoutId) {
288
+ clearTimeout(pending.timeoutId);
289
+ }
290
+ pending.reject(new Error('Child process terminated'));
291
+ }
292
+ this.pendingRequests.clear();
293
+ this.childProcess.kill();
294
+ return new Promise((resolve) => {
295
+ if (!this.childProcess.connected) {
296
+ resolve();
297
+ return;
298
+ }
299
+ this.childProcess.once('exit', () => {
300
+ resolve();
301
+ });
302
+ setTimeout(() => {
303
+ this.childProcess.kill('SIGKILL');
304
+ resolve();
305
+ }, 5000);
306
+ });
307
+ }
308
+ toError(info) {
309
+ const error = new Error(info?.message ?? 'Unknown error');
310
+ error.name = info?.name ?? 'Error';
311
+ error.stack = info?.stack;
312
+ error.code = info?.code;
313
+ return error;
314
+ }
315
+ }
316
+ //# sourceMappingURL=ipc-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc-client.js","sourceRoot":"","sources":["../../src/parent/ipc-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Procxy } from '../types/procxy.js';
2
+ import { IPCClient } from './ipc-client.js';
3
+ export declare function createParentProxy<T extends object>(ipcClient: IPCClient): Procxy<T>;
4
+ //# sourceMappingURL=parent-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parent-proxy.d.ts","sourceRoot":"","sources":["../../src/parent/parent-proxy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAsB5C,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAkFnF"}
@@ -0,0 +1,76 @@
1
+ import { ProcxyError } from '../shared/errors.js';
2
+ const eventMethods = new Set([
3
+ 'on',
4
+ 'once',
5
+ 'off',
6
+ 'addListener',
7
+ 'removeListener',
8
+ 'removeAllListeners',
9
+ 'emit',
10
+ 'listeners',
11
+ 'listenerCount',
12
+ 'eventNames'
13
+ ]);
14
+ function isValidIdentifier(name) {
15
+ return /^[A-Za-z_$][\w$]*$/.test(name);
16
+ }
17
+ export function createParentProxy(ipcClient) {
18
+ const base = {};
19
+ const proxy = new Proxy(base, {
20
+ get: (_target, prop) => {
21
+ if (prop === 'then') {
22
+ return undefined;
23
+ }
24
+ if (prop === '$terminate') {
25
+ return () => ipcClient.terminate();
26
+ }
27
+ if (prop === '$process') {
28
+ return ipcClient.process;
29
+ }
30
+ if (prop === Symbol.dispose) {
31
+ return () => {
32
+ void ipcClient.terminate();
33
+ };
34
+ }
35
+ if (prop === Symbol.asyncDispose) {
36
+ return () => ipcClient.terminate();
37
+ }
38
+ if (typeof prop === 'symbol') {
39
+ return undefined;
40
+ }
41
+ if (eventMethods.has(prop)) {
42
+ const handler = ipcClient[prop];
43
+ return typeof handler === 'function' ? handler.bind(ipcClient) : undefined;
44
+ }
45
+ if (typeof prop !== 'string') {
46
+ return undefined;
47
+ }
48
+ if (prop.startsWith('$')) {
49
+ throw new ProcxyError(`Method '${prop}' is reserved and cannot be invoked`);
50
+ }
51
+ if (!isValidIdentifier(prop)) {
52
+ throw new ProcxyError(`Invalid method name '${prop}' (FR-014)`);
53
+ }
54
+ if (ipcClient.hasProperty(prop)) {
55
+ return ipcClient.getPropertySync(prop);
56
+ }
57
+ return (...args) => {
58
+ return ipcClient.sendRequest(prop, args);
59
+ };
60
+ },
61
+ set: (_target, prop, _value) => {
62
+ if (typeof prop !== 'string') {
63
+ return false;
64
+ }
65
+ if (prop.startsWith('$')) {
66
+ throw new ProcxyError(`Property '${prop}' is reserved and cannot be set`);
67
+ }
68
+ if (!isValidIdentifier(prop)) {
69
+ throw new ProcxyError(`Invalid property name '${prop}'`);
70
+ }
71
+ throw new ProcxyError(`Cannot set property '${prop}' from parent. Properties are read-only on parent and can only be modified by child.`);
72
+ }
73
+ });
74
+ return proxy;
75
+ }
76
+ //# sourceMappingURL=parent-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parent-proxy.js","sourceRoot":"","sources":["../../src/parent/parent-proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Constructor } from 'type-fest';
2
+ import type { Procxy } from '../types/procxy.js';
3
+ import type { ProcxyOptions } from '../types/options.js';
4
+ export declare function procxy<T extends Record<string, typeof Object>, C extends keyof T>(className: keyof T, modulePath?: string, options?: ProcxyOptions, ...constructorArgs: T[keyof T] extends Constructor<any> ? ConstructorParameters<T[keyof T]> : never): Promise<T[C] extends Constructor<infer U> ? Procxy<U> : never>;
5
+ export declare function procxy<T extends object>(Class: Constructor<T>, modulePath?: string, options?: ProcxyOptions, ...constructorArgs: ConstructorParameters<Constructor<T>>): Promise<Procxy<T>>;
6
+ //# sourceMappingURL=procxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"procxy.d.ts","sourceRoot":"","sources":["../../src/parent/procxy.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,WAAW,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAwMzD,wBAAsB,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,MAAM,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,EACrF,SAAS,EAAE,MAAM,CAAC,EAClB,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,aAAa,EACvB,GAAG,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,WAAW,CAAC,GAAG,CAAC,GACnD,qBAAqB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GACjC,KAAK,GACR,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AAClE,wBAAsB,MAAM,CAAC,CAAC,SAAS,MAAM,EAC3C,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EACrB,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,aAAa,EACvB,GAAG,eAAe,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GACxD,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,120 @@
1
+ import { fork } from 'node:child_process';
2
+ import { existsSync, statSync } from 'node:fs';
3
+ import { createRequire } from 'node:module';
4
+ import { resolve, dirname } from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { resolveConstructorModule } from '../shared/module-resolver.js';
7
+ import { validateJsonifiableArray } from '../shared/serialization.js';
8
+ import { createParentProxy } from './parent-proxy.js';
9
+ import { IPCClient } from './ipc-client.js';
10
+ import { ChildCrashedError, OptionsValidationError, TimeoutError } from '../shared/errors.js';
11
+ const DEFAULT_TIMEOUT_MS = 30000;
12
+ const DEFAULT_RETRIES = 3;
13
+ const MIN_INIT_TIMEOUT_MS = 1000;
14
+ function validateOptions(options) {
15
+ if (options.timeout !== undefined &&
16
+ (typeof options.timeout !== 'number' || options.timeout <= 0)) {
17
+ throw new OptionsValidationError('timeout', options.timeout, 'must be a positive number');
18
+ }
19
+ if (options.retries !== undefined &&
20
+ (typeof options.retries !== 'number' || options.retries < 0)) {
21
+ throw new OptionsValidationError('retries', options.retries, 'must be a non-negative number');
22
+ }
23
+ if (options.env) {
24
+ for (const [key, value] of Object.entries(options.env)) {
25
+ if (typeof value !== 'string') {
26
+ throw new OptionsValidationError(`env.${key}`, value, 'environment variables must be strings');
27
+ }
28
+ }
29
+ }
30
+ if (options.args) {
31
+ validateJsonifiableArray(options.args, 'ProcxyOptions.args');
32
+ }
33
+ if (options.cwd) {
34
+ if (!existsSync(options.cwd) || !statSync(options.cwd).isDirectory()) {
35
+ throw new OptionsValidationError('cwd', options.cwd, 'must be an existing directory');
36
+ }
37
+ }
38
+ }
39
+ function pickAgentPath() {
40
+ const currentDir = dirname(fileURLToPath(import.meta.url));
41
+ const built = resolve(currentDir, '../child/agent.js');
42
+ if (existsSync(built)) {
43
+ return built;
44
+ }
45
+ return resolve(currentDir, '../child/agent.ts');
46
+ }
47
+ const requireFromHere = createRequire(import.meta.url);
48
+ function pickExecArgv(agentPath) {
49
+ if (!agentPath.endsWith('.ts'))
50
+ return [];
51
+ const tsxImportPath = requireFromHere.resolve('tsx/esm');
52
+ return ['--import', tsxImportPath];
53
+ }
54
+ function toArgStrings(args) {
55
+ if (!args)
56
+ return [];
57
+ return args.map((arg) => (typeof arg === 'string' ? arg : JSON.stringify(arg)));
58
+ }
59
+ async function waitForInitialization(ipcClient, timeoutMs) {
60
+ const effectiveTimeout = Math.max(timeoutMs, MIN_INIT_TIMEOUT_MS);
61
+ return new Promise((resolveInit, rejectInit) => {
62
+ const onSuccess = () => {
63
+ cleanup();
64
+ resolveInit();
65
+ };
66
+ const onFailure = (error) => {
67
+ cleanup();
68
+ rejectInit(error);
69
+ };
70
+ const onExit = (code, signal) => {
71
+ cleanup();
72
+ rejectInit(new ChildCrashedError(code, signal));
73
+ };
74
+ const timer = setTimeout(() => {
75
+ cleanup();
76
+ rejectInit(new TimeoutError('init', effectiveTimeout));
77
+ }, effectiveTimeout);
78
+ const cleanup = () => {
79
+ clearTimeout(timer);
80
+ ipcClient.off('init_success', onSuccess);
81
+ ipcClient.off('init_failure', onFailure);
82
+ ipcClient.off('child_exit', onExit);
83
+ };
84
+ ipcClient.once('init_success', onSuccess);
85
+ ipcClient.once('init_failure', onFailure);
86
+ ipcClient.once('child_exit', onExit);
87
+ });
88
+ }
89
+ export async function procxy(classOrClassName, modulePath, options, ...constructorArgs) {
90
+ validateOptions(options ?? {});
91
+ validateJsonifiableArray(constructorArgs, 'constructor arguments');
92
+ const moduleResolution = resolveConstructorModule(classOrClassName, typeof classOrClassName === 'string'
93
+ ? classOrClassName
94
+ : classOrClassName.name, modulePath);
95
+ const resolvedModulePath = moduleResolution.modulePath.startsWith('file://')
96
+ ? fileURLToPath(moduleResolution.modulePath)
97
+ : resolve(moduleResolution.modulePath);
98
+ const timeout = options?.timeout ?? DEFAULT_TIMEOUT_MS;
99
+ const retries = options?.retries ?? DEFAULT_RETRIES;
100
+ const agentPath = pickAgentPath();
101
+ const execArgv = pickExecArgv(agentPath);
102
+ const forkOptions = {
103
+ stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
104
+ cwd: options?.cwd ?? process.cwd(),
105
+ env: { ...process.env, ...options?.env },
106
+ execArgv
107
+ };
108
+ const child = fork(agentPath, toArgStrings(options?.args), forkOptions);
109
+ const ipcClient = new IPCClient(child, timeout, retries);
110
+ const initMessage = {
111
+ type: 'INIT',
112
+ modulePath: resolvedModulePath,
113
+ className: moduleResolution.className,
114
+ constructorArgs: [...constructorArgs]
115
+ };
116
+ child.send(initMessage);
117
+ await waitForInitialization(ipcClient, timeout);
118
+ return createParentProxy(ipcClient);
119
+ }
120
+ //# sourceMappingURL=procxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"procxy.js","sourceRoot":"","sources":["../../src/parent/procxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export declare class ProcxyError extends Error {
2
+ readonly context?: Record<string, unknown> | undefined;
3
+ constructor(message: string, context?: Record<string, unknown> | undefined);
4
+ }
5
+ export declare class TimeoutError extends ProcxyError {
6
+ readonly methodName: string;
7
+ readonly timeoutMs: number;
8
+ constructor(methodName: string, timeoutMs: number, context?: Record<string, unknown>);
9
+ }
10
+ export declare class ModuleResolutionError extends ProcxyError {
11
+ readonly className: string;
12
+ readonly reason: string;
13
+ constructor(className: string, reason: string, context?: Record<string, unknown>);
14
+ }
15
+ export declare class ChildCrashedError extends ProcxyError {
16
+ readonly exitCode?: number | null | undefined;
17
+ readonly signal?: string | null | undefined;
18
+ constructor(exitCode?: number | null | undefined, signal?: string | null | undefined, context?: Record<string, unknown>);
19
+ }
20
+ export declare class SerializationError extends ProcxyError {
21
+ readonly value: unknown;
22
+ readonly context_: string;
23
+ constructor(value: unknown, context_: string, context?: Record<string, unknown>);
24
+ }
25
+ export declare class OptionsValidationError extends ProcxyError {
26
+ readonly optionName: string;
27
+ readonly optionValue: unknown;
28
+ readonly reason: string;
29
+ constructor(optionName: string, optionValue: unknown, reason: string, context?: Record<string, unknown>);
30
+ }
31
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/shared/errors.ts"],"names":[],"mappings":"AASA,qBAAa,WAAY,SAAQ,KAAK;aAGlB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBADjD,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAMpD;AAMD,qBAAa,YAAa,SAAQ,WAAW;aAEzB,UAAU,EAAE,MAAM;aAClB,SAAS,EAAE,MAAM;gBADjB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAQpC;AAMD,qBAAa,qBAAsB,SAAQ,WAAW;aAElC,SAAS,EAAE,MAAM;aACjB,MAAM,EAAE,MAAM;gBADd,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CASpC;AAMD,qBAAa,iBAAkB,SAAQ,WAAW;aAE9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;aACxB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;gBADtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,YAAA,EACxB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,YAAA,EACtC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAWpC;AAMD,qBAAa,kBAAmB,SAAQ,WAAW;aAE/B,KAAK,EAAE,OAAO;aACd,QAAQ,EAAE,MAAM;gBADhB,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,EAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CASpC;AAMD,qBAAa,sBAAuB,SAAQ,WAAW;aAEnC,UAAU,EAAE,MAAM;aAClB,WAAW,EAAE,OAAO;aACpB,MAAM,EAAE,MAAM;gBAFd,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,OAAO,EACpB,MAAM,EAAE,MAAM,EAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CASpC"}