@comake/skl-js-engine 1.0.8 → 1.1.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.
- package/dist/JsExecutor/PermissionBuilder.d.ts +13 -0
- package/dist/JsExecutor/PermissionBuilder.js +58 -0
- package/dist/JsExecutor/PermissionBuilder.js.map +1 -0
- package/dist/JsExecutor/constants.d.ts +26 -0
- package/dist/JsExecutor/constants.js +30 -0
- package/dist/JsExecutor/constants.js.map +1 -0
- package/dist/JsExecutor/denoUtils.d.ts +9 -0
- package/dist/JsExecutor/denoUtils.js +24 -0
- package/dist/JsExecutor/denoUtils.js.map +1 -0
- package/dist/JsExecutor/errors.d.ts +39 -0
- package/dist/JsExecutor/errors.js +67 -0
- package/dist/JsExecutor/errors.js.map +1 -0
- package/dist/JsExecutor/examples/basic/index.d.ts +0 -0
- package/dist/JsExecutor/examples/basic/index.js +46 -0
- package/dist/JsExecutor/examples/basic/index.js.map +1 -0
- package/dist/JsExecutor/examples/basic/process.d.ts +0 -0
- package/dist/JsExecutor/examples/basic/process.js +34 -0
- package/dist/JsExecutor/examples/basic/process.js.map +1 -0
- package/dist/JsExecutor/examples/jsExecutor/index.d.ts +1 -0
- package/dist/JsExecutor/examples/jsExecutor/index.js +48 -0
- package/dist/JsExecutor/examples/jsExecutor/index.js.map +1 -0
- package/dist/JsExecutor/examples/jsExecutor/process.d.ts +1 -0
- package/dist/JsExecutor/examples/jsExecutor/process.js +59 -0
- package/dist/JsExecutor/examples/jsExecutor/process.js.map +1 -0
- package/dist/JsExecutor/index.d.ts +6 -0
- package/dist/JsExecutor/index.js +36 -0
- package/dist/JsExecutor/index.js.map +1 -0
- package/dist/JsExecutor/jsExecutor.d.ts +67 -0
- package/dist/JsExecutor/jsExecutor.js +159 -0
- package/dist/JsExecutor/jsExecutor.js.map +1 -0
- package/dist/JsExecutor/jsonRpc/JsonRpcClient.d.ts +164 -0
- package/dist/JsExecutor/jsonRpc/JsonRpcClient.js +334 -0
- package/dist/JsExecutor/jsonRpc/JsonRpcClient.js.map +1 -0
- package/dist/JsExecutor/jsonRpc/JsonRpcServer.d.ts +124 -0
- package/dist/JsExecutor/jsonRpc/JsonRpcServer.js +391 -0
- package/dist/JsExecutor/jsonRpc/JsonRpcServer.js.map +1 -0
- package/dist/JsExecutor/jsonRpc/index.d.ts +3 -0
- package/dist/JsExecutor/jsonRpc/index.js +23 -0
- package/dist/JsExecutor/jsonRpc/index.js.map +1 -0
- package/dist/JsExecutor/jsonRpc/types.d.ts +192 -0
- package/dist/JsExecutor/jsonRpc/types.js +37 -0
- package/dist/JsExecutor/jsonRpc/types.js.map +1 -0
- package/dist/JsExecutor/transport/StdioTransport.d.ts +226 -0
- package/dist/JsExecutor/transport/StdioTransport.js +634 -0
- package/dist/JsExecutor/transport/StdioTransport.js.map +1 -0
- package/dist/JsExecutor/transport/Transport.d.ts +71 -0
- package/dist/JsExecutor/transport/Transport.js +14 -0
- package/dist/JsExecutor/transport/Transport.js.map +1 -0
- package/dist/JsExecutor/transport/base/BaseTransport.d.ts +50 -0
- package/dist/JsExecutor/transport/base/BaseTransport.js +68 -0
- package/dist/JsExecutor/transport/base/BaseTransport.js.map +1 -0
- package/dist/JsExecutor/transport/index.d.ts +12 -0
- package/dist/JsExecutor/transport/index.js +36 -0
- package/dist/JsExecutor/transport/index.js.map +1 -0
- package/dist/JsExecutor/transport/process/ProcessManager.d.ts +95 -0
- package/dist/JsExecutor/transport/process/ProcessManager.js +214 -0
- package/dist/JsExecutor/transport/process/ProcessManager.js.map +1 -0
- package/dist/JsExecutor/transport/stdio/ChildStdioTransport.d.ts +86 -0
- package/dist/JsExecutor/transport/stdio/ChildStdioTransport.js +215 -0
- package/dist/JsExecutor/transport/stdio/ChildStdioTransport.js.map +1 -0
- package/dist/JsExecutor/transport/stdio/ParentStdioTransport.d.ts +80 -0
- package/dist/JsExecutor/transport/stdio/ParentStdioTransport.js +263 -0
- package/dist/JsExecutor/transport/stdio/ParentStdioTransport.js.map +1 -0
- package/dist/JsExecutor/transport/utils/MessageUtils.d.ts +67 -0
- package/dist/JsExecutor/transport/utils/MessageUtils.js +135 -0
- package/dist/JsExecutor/transport/utils/MessageUtils.js.map +1 -0
- package/dist/JsExecutor/types.d.ts +112 -0
- package/dist/JsExecutor/types.js +3 -0
- package/dist/JsExecutor/types.js.map +1 -0
- package/dist/SklEngine.d.ts +9 -5
- package/dist/SklEngine.js +84 -87
- package/dist/SklEngine.js.map +1 -1
- package/dist/SklEngineOptions.d.ts +4 -0
- package/dist/constants.d.ts +1 -1
- package/dist/customCapabilities.d.ts +21 -0
- package/dist/customCapabilities.js +45 -0
- package/dist/customCapabilities.js.map +1 -0
- package/dist/examples/customCapabilitiesExample.d.ts +1 -0
- package/dist/examples/customCapabilitiesExample.js +57 -0
- package/dist/examples/customCapabilitiesExample.js.map +1 -0
- package/dist/executor.js +9 -3
- package/dist/index.d.ts +13 -11
- package/dist/index.js +20 -16
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +5 -1
- package/dist/logger.js +21 -4
- package/dist/logger.js.map +1 -1
- package/dist/util/Vocabularies/Shared.d.ts +1 -1
- package/dist/util/Vocabularies/index.d.ts +1 -1
- package/package.json +1 -1
- package/dist/Jsexecutor.d.ts +0 -77
- package/dist/Jsexecutor.js +0 -184
- package/dist/Jsexecutor.js.map +0 -1
- package/dist/storage/operator/ArrayEqual.d.ts +0 -3
- package/dist/storage/operator/ArrayEqual.js +0 -13
- package/dist/storage/operator/ArrayEqual.js.map +0 -1
- package/dist/util/Vocabularies/core.d.ts +0 -7
- package/dist/util/Vocabularies/core.js +0 -119
- package/dist/util/Vocabularies/core.js.map +0 -1
|
@@ -0,0 +1,634 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StdioServerTransport = exports.BidirectionalStdioTransport = exports.StdioClientTransport = exports.StdioTransport = void 0;
|
|
4
|
+
const node_events_1 = require("node:events");
|
|
5
|
+
const logger_1 = require("../../logger");
|
|
6
|
+
const constants_1 = require("../constants");
|
|
7
|
+
const denoUtils_1 = require("../denoUtils");
|
|
8
|
+
const errors_1 = require("../errors");
|
|
9
|
+
const JsonRpcClient_1 = require("../jsonRpc/JsonRpcClient");
|
|
10
|
+
const JsonRpcServer_1 = require("../jsonRpc/JsonRpcServer");
|
|
11
|
+
const types_1 = require("../jsonRpc/types");
|
|
12
|
+
const PermissionBuilder_1 = require("../PermissionBuilder");
|
|
13
|
+
const Transport_1 = require("./Transport");
|
|
14
|
+
/**
|
|
15
|
+
* StdioTransport implementation using stdin/stdout for JSON-RPC communication
|
|
16
|
+
* This is the parent-side transport that manages a child process
|
|
17
|
+
*/
|
|
18
|
+
class StdioTransport extends node_events_1.EventEmitter {
|
|
19
|
+
constructor(executorScriptPath, server) {
|
|
20
|
+
super();
|
|
21
|
+
this._status = Transport_1.TransportStatus.disconnected;
|
|
22
|
+
this.logger = logger_1.Logger.getInstance();
|
|
23
|
+
this.executorScriptPath = executorScriptPath;
|
|
24
|
+
this.server = server;
|
|
25
|
+
this.client = new JsonRpcClient_1.JsonRpcClient();
|
|
26
|
+
this.clientTransport = new StdioClientTransport();
|
|
27
|
+
this.setupServerMethods();
|
|
28
|
+
this.setupEventHandlers();
|
|
29
|
+
}
|
|
30
|
+
setName(name) {
|
|
31
|
+
this.name = name;
|
|
32
|
+
this.logger.setMetadata({ name, transport: 'StdioTransport' });
|
|
33
|
+
}
|
|
34
|
+
get status() {
|
|
35
|
+
return this._status;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Initialize the transport connection
|
|
39
|
+
*/
|
|
40
|
+
async initialize(config, executionOptions) {
|
|
41
|
+
if (this._status !== Transport_1.TransportStatus.disconnected) {
|
|
42
|
+
throw new Error(`Cannot initialize transport in ${this._status} state`);
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
this.setStatus(Transport_1.TransportStatus.connecting);
|
|
46
|
+
const normalizedOptions = this.normalizeOptions(executionOptions);
|
|
47
|
+
const permissionConfig = this.extractPermissionConfig(normalizedOptions);
|
|
48
|
+
// Validate permissions before proceeding
|
|
49
|
+
(0, PermissionBuilder_1.validatePermissionConfig)(permissionConfig);
|
|
50
|
+
const permissions = (0, PermissionBuilder_1.buildDenoPermissions)(permissionConfig);
|
|
51
|
+
const mergedPermissions = [...constants_1.EXECUTION_CONSTANTS.denoFlags];
|
|
52
|
+
permissions.forEach(permission => {
|
|
53
|
+
if (!mergedPermissions.includes(permission)) {
|
|
54
|
+
mergedPermissions.push(permission);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
// Build command arguments (will be updated when we have permission support)
|
|
58
|
+
const commandArgs = [...mergedPermissions, this.executorScriptPath];
|
|
59
|
+
// Spawn the Deno process
|
|
60
|
+
this.childProcess = (0, denoUtils_1.spawnDenoProcess)(commandArgs);
|
|
61
|
+
// Set up client transport
|
|
62
|
+
this.clientTransport.setProcess(this.childProcess.stdout, this.childProcess.stdin);
|
|
63
|
+
this.client.setTransport(this.clientTransport);
|
|
64
|
+
// Set up process communication
|
|
65
|
+
this.setupProcessCommunication();
|
|
66
|
+
// Wait for process to be ready
|
|
67
|
+
await this.waitForReady(config?.timeout ?? 5000);
|
|
68
|
+
this.setStatus(Transport_1.TransportStatus.connected);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
this.setStatus(Transport_1.TransportStatus.error);
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Normalizes execution options with defaults
|
|
77
|
+
* @param options - Raw execution options
|
|
78
|
+
* @returns Normalized options with all required fields
|
|
79
|
+
*/
|
|
80
|
+
normalizeOptions(options) {
|
|
81
|
+
return {
|
|
82
|
+
timeout: options?.timeout ?? constants_1.DEFAULT_EXECUTION_OPTIONS.timeout,
|
|
83
|
+
functionName: options?.functionName ?? constants_1.DEFAULT_EXECUTION_OPTIONS.functionName,
|
|
84
|
+
allowNetwork: options?.allowNetwork ?? constants_1.DEFAULT_EXECUTION_OPTIONS.allowNetwork,
|
|
85
|
+
allowedDomains: options?.allowedDomains ?? [...constants_1.DEFAULT_EXECUTION_OPTIONS.allowedDomains],
|
|
86
|
+
allowEnv: options?.allowEnv ?? constants_1.DEFAULT_EXECUTION_OPTIONS.allowEnv,
|
|
87
|
+
allowRead: options?.allowRead ?? constants_1.DEFAULT_EXECUTION_OPTIONS.allowRead,
|
|
88
|
+
debugMode: options?.debugMode ?? constants_1.DEFAULT_EXECUTION_OPTIONS.debugMode,
|
|
89
|
+
retries: options?.retries ?? constants_1.DEFAULT_EXECUTION_OPTIONS.retries
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Extracts permission configuration from execution options
|
|
94
|
+
* @param options - Normalized execution options
|
|
95
|
+
* @returns Permission configuration object
|
|
96
|
+
*/
|
|
97
|
+
extractPermissionConfig(options) {
|
|
98
|
+
return {
|
|
99
|
+
allowNetwork: options.allowNetwork,
|
|
100
|
+
allowedDomains: options.allowedDomains,
|
|
101
|
+
allowEnv: options.allowEnv,
|
|
102
|
+
allowRead: options.allowRead
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Send a message through the transport
|
|
107
|
+
*/
|
|
108
|
+
async send(message) {
|
|
109
|
+
if (!this.isReady()) {
|
|
110
|
+
throw new Error('Transport is not ready');
|
|
111
|
+
}
|
|
112
|
+
// Expect message to have method and params for direct RPC calls
|
|
113
|
+
const rpcMessage = message;
|
|
114
|
+
if (rpcMessage.method) {
|
|
115
|
+
return this.client.request(rpcMessage.method, rpcMessage.params);
|
|
116
|
+
}
|
|
117
|
+
throw new Error('Message must have a method property for RPC calls');
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Make a direct RPC request to the child process
|
|
121
|
+
*/
|
|
122
|
+
async request(method, params, options) {
|
|
123
|
+
if (!this.isReady()) {
|
|
124
|
+
throw new Error('Transport is not ready');
|
|
125
|
+
}
|
|
126
|
+
return this.client.request(method, params, options);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Send a notification to the child process (no response expected)
|
|
130
|
+
*/
|
|
131
|
+
async notify(method, params) {
|
|
132
|
+
if (!this.isReady()) {
|
|
133
|
+
throw new Error('Transport is not ready');
|
|
134
|
+
}
|
|
135
|
+
return this.client.notify(method, params);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Register a message handler for incoming messages
|
|
139
|
+
*/
|
|
140
|
+
onMessage(handler) {
|
|
141
|
+
this.messageHandler = handler;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Register an event listener
|
|
145
|
+
*/
|
|
146
|
+
on(event, handler) {
|
|
147
|
+
return super.on(event, handler);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Remove an event listener
|
|
151
|
+
*/
|
|
152
|
+
off(event, handler) {
|
|
153
|
+
return super.off(event, handler);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Close the transport connection
|
|
157
|
+
*/
|
|
158
|
+
async close() {
|
|
159
|
+
if (this._status === Transport_1.TransportStatus.disconnected) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
this.setStatus(Transport_1.TransportStatus.disconnected);
|
|
163
|
+
// Close JSON-RPC client
|
|
164
|
+
await this.client.close();
|
|
165
|
+
// Close child process
|
|
166
|
+
if (this.childProcess && !this.childProcess.killed) {
|
|
167
|
+
this.childProcess.kill(constants_1.EXECUTION_CONSTANTS.processSignals.term);
|
|
168
|
+
// Wait for process to exit gracefully
|
|
169
|
+
await new Promise(resolve => {
|
|
170
|
+
const timeout = setTimeout(() => {
|
|
171
|
+
if (this.childProcess && !this.childProcess.killed) {
|
|
172
|
+
this.childProcess.kill('SIGKILL');
|
|
173
|
+
}
|
|
174
|
+
resolve();
|
|
175
|
+
}, 3000);
|
|
176
|
+
this.childProcess.on('exit', () => {
|
|
177
|
+
clearTimeout(timeout);
|
|
178
|
+
resolve();
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
this.childProcess = undefined;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Check if the transport is ready for communication
|
|
186
|
+
*/
|
|
187
|
+
isReady() {
|
|
188
|
+
return this._status === Transport_1.TransportStatus.connected && this.childProcess !== undefined && !this.childProcess.killed;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Set up server methods for handling incoming requests from Deno process
|
|
192
|
+
*/
|
|
193
|
+
setupServerMethods() {
|
|
194
|
+
// Handle status requests
|
|
195
|
+
this.server.registerMethod(types_1.STANDARD_METHODS.getStatus, async () => ({
|
|
196
|
+
status: 'ready',
|
|
197
|
+
uptime: process.uptime() * 1000,
|
|
198
|
+
memoryUsage: {
|
|
199
|
+
used: process.memoryUsage().heapUsed,
|
|
200
|
+
total: process.memoryUsage().heapTotal
|
|
201
|
+
}
|
|
202
|
+
}));
|
|
203
|
+
// Handle ping requests
|
|
204
|
+
this.server.registerMethod(types_1.STANDARD_METHODS.ping, async () => 'pong');
|
|
205
|
+
// Handle log notifications
|
|
206
|
+
this.server.registerMethod(types_1.STANDARD_METHODS.log, async (params) => {
|
|
207
|
+
if (this.messageHandler) {
|
|
208
|
+
await this.messageHandler(params);
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Set up event handlers
|
|
214
|
+
*/
|
|
215
|
+
setupEventHandlers() {
|
|
216
|
+
this.server.on('error', error => {
|
|
217
|
+
this.emit('error', error);
|
|
218
|
+
});
|
|
219
|
+
this.client.on('error', error => {
|
|
220
|
+
this.emit('error', error);
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Set up process communication handlers
|
|
225
|
+
*/
|
|
226
|
+
setupProcessCommunication() {
|
|
227
|
+
if (!this.childProcess) {
|
|
228
|
+
throw new Error('Child process not available');
|
|
229
|
+
}
|
|
230
|
+
let buffer = '';
|
|
231
|
+
// Handle stdout data (responses from Deno process)
|
|
232
|
+
this.childProcess.stdout?.on('data', (data) => {
|
|
233
|
+
buffer += data.toString();
|
|
234
|
+
// Process complete JSON messages
|
|
235
|
+
const lines = buffer.split('\n');
|
|
236
|
+
buffer = lines.pop() ?? ''; // Keep incomplete line in buffer
|
|
237
|
+
for (const line of lines) {
|
|
238
|
+
if (line.trim()) {
|
|
239
|
+
this.logger.log('Received message', line.trim());
|
|
240
|
+
this.handleIncomingMessage(line.trim()).catch(error => {
|
|
241
|
+
this.emit('error', error);
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
// Handle stderr data (errors from Deno process)
|
|
247
|
+
this.childProcess.stderr?.on('data', (data) => {
|
|
248
|
+
this.emit('error', new Error(`Deno process error: ${data.toString()}`));
|
|
249
|
+
});
|
|
250
|
+
// Handle process exit
|
|
251
|
+
this.childProcess.on('exit', (code, signal) => {
|
|
252
|
+
if (this._status === Transport_1.TransportStatus.connected) {
|
|
253
|
+
const error = new Error(`Process exited unexpectedly (code: ${code}, signal: ${signal})`);
|
|
254
|
+
this.setStatus(Transport_1.TransportStatus.error);
|
|
255
|
+
this.emit('error', error);
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
// Handle process errors
|
|
259
|
+
this.childProcess.on('error', error => {
|
|
260
|
+
this.setStatus(Transport_1.TransportStatus.error);
|
|
261
|
+
this.emit('error', new errors_1.ProcessSpawnError(error));
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Handle incoming message from Deno process with bidirectional routing
|
|
266
|
+
*/
|
|
267
|
+
async handleIncomingMessage(messageData) {
|
|
268
|
+
try {
|
|
269
|
+
const message = this.safeParse(messageData);
|
|
270
|
+
if (!message) {
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
// Check if this is a response to our request (has 'result' or 'error' and 'id')
|
|
274
|
+
if (this.isResponse(message)) {
|
|
275
|
+
// This is a response to a request we made - route to client
|
|
276
|
+
this.logger.log('Routing response to parent client', { id: message.id });
|
|
277
|
+
await this.client.handleIncomingMessage(messageData);
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
// This is a request or notification for us - route to server
|
|
281
|
+
this.logger.log('Routing request to parent server', { method: message.method, id: message.id });
|
|
282
|
+
const response = await this.server.processMessage(messageData);
|
|
283
|
+
this.logger.log('Sending response to parent process', response);
|
|
284
|
+
// Only send response if there is one (requests get responses, notifications don't)
|
|
285
|
+
if (response && this.childProcess?.stdin) {
|
|
286
|
+
const responseData = `${JSON.stringify(response)}\n`;
|
|
287
|
+
this.childProcess.stdin.write(responseData);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
this.emit('error', new Error(`Failed to handle incoming message: ${error.message}`));
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
safeParse(message) {
|
|
296
|
+
try {
|
|
297
|
+
return JSON.parse(message);
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
return undefined;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Check if a message is a JSON-RPC response
|
|
305
|
+
*/
|
|
306
|
+
isResponse(message) {
|
|
307
|
+
return message &&
|
|
308
|
+
typeof message === 'object' &&
|
|
309
|
+
('result' in message || 'error' in message) &&
|
|
310
|
+
'id' in message &&
|
|
311
|
+
!('method' in message);
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Wait for the process to be ready
|
|
315
|
+
*/
|
|
316
|
+
async waitForReady(timeout) {
|
|
317
|
+
return new Promise((resolve, reject) => {
|
|
318
|
+
const timeoutId = setTimeout(() => {
|
|
319
|
+
reject(new Error(`Transport initialization timed out after ${timeout}ms`));
|
|
320
|
+
}, timeout);
|
|
321
|
+
// Try to ping the process to check if it's ready
|
|
322
|
+
const checkReady = async () => {
|
|
323
|
+
try {
|
|
324
|
+
await this.client.request(types_1.STANDARD_METHODS.ping, undefined, { timeout: 1000 });
|
|
325
|
+
clearTimeout(timeoutId);
|
|
326
|
+
resolve();
|
|
327
|
+
}
|
|
328
|
+
catch {
|
|
329
|
+
// Process not ready yet, try again
|
|
330
|
+
setTimeout(checkReady, 100);
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
// Start checking after a short delay to let process start
|
|
334
|
+
setTimeout(checkReady, 100);
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Set transport status and emit event
|
|
339
|
+
*/
|
|
340
|
+
setStatus(status) {
|
|
341
|
+
if (this._status !== status) {
|
|
342
|
+
this._status = status;
|
|
343
|
+
this.emit('statusChange', status);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
exports.StdioTransport = StdioTransport;
|
|
348
|
+
/**
|
|
349
|
+
* Client transport implementation for stdio communication
|
|
350
|
+
*/
|
|
351
|
+
class StdioClientTransport {
|
|
352
|
+
constructor() {
|
|
353
|
+
this.logger = logger_1.Logger.getInstance();
|
|
354
|
+
}
|
|
355
|
+
setProcess(stdout, stdin) {
|
|
356
|
+
this.stdout = stdout;
|
|
357
|
+
this.stdin = stdin;
|
|
358
|
+
}
|
|
359
|
+
setName(name) {
|
|
360
|
+
this.name = name;
|
|
361
|
+
this.logger.setMetadata({ name, transport: 'StdioClientTransport' });
|
|
362
|
+
}
|
|
363
|
+
async send(message) {
|
|
364
|
+
if (!this.stdin) {
|
|
365
|
+
throw new Error('Process stdin not available');
|
|
366
|
+
}
|
|
367
|
+
this.logger.log('Sending message', message);
|
|
368
|
+
this.stdin.write(`${message}\n`);
|
|
369
|
+
}
|
|
370
|
+
onMessage(handler) {
|
|
371
|
+
this.messageHandler = handler;
|
|
372
|
+
// Note: Message handling is done in the main StdioTransport class
|
|
373
|
+
// This is here for interface compliance
|
|
374
|
+
}
|
|
375
|
+
async close() {
|
|
376
|
+
this.stdout = undefined;
|
|
377
|
+
this.stdin = undefined;
|
|
378
|
+
this.messageHandler = undefined;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
exports.StdioClientTransport = StdioClientTransport;
|
|
382
|
+
/**
|
|
383
|
+
* Bidirectional StdioTransport for child processes
|
|
384
|
+
* This class handles both server (receiving requests) and client (sending requests) functionality
|
|
385
|
+
* over a single stdio channel with proper message routing.
|
|
386
|
+
*
|
|
387
|
+
* Usage in child process:
|
|
388
|
+
* ```typescript
|
|
389
|
+
* const transport = new BidirectionalStdioTransport();
|
|
390
|
+
*
|
|
391
|
+
* // Register methods that parent can call
|
|
392
|
+
* transport.registerMethod('ping', async () => 'pong');
|
|
393
|
+
*
|
|
394
|
+
* // Make requests to parent
|
|
395
|
+
* const result = await transport.request('getTime');
|
|
396
|
+
* ```
|
|
397
|
+
*/
|
|
398
|
+
class BidirectionalStdioTransport extends node_events_1.EventEmitter {
|
|
399
|
+
constructor() {
|
|
400
|
+
super();
|
|
401
|
+
this.logger = logger_1.Logger.getInstance();
|
|
402
|
+
this.buffer = '';
|
|
403
|
+
this.initialized = false;
|
|
404
|
+
this.server = new JsonRpcServer_1.JsonRpcServer();
|
|
405
|
+
this.client = new JsonRpcClient_1.JsonRpcClient();
|
|
406
|
+
// Set up the client transport that routes through our stdio
|
|
407
|
+
const clientTransport = {
|
|
408
|
+
send: async (message) => {
|
|
409
|
+
this.sendMessage(message);
|
|
410
|
+
},
|
|
411
|
+
onMessage() {
|
|
412
|
+
// The message routing will handle client responses automatically
|
|
413
|
+
},
|
|
414
|
+
async close() {
|
|
415
|
+
// Nothing to close for stdio
|
|
416
|
+
}
|
|
417
|
+
};
|
|
418
|
+
this.client.setTransport(clientTransport);
|
|
419
|
+
this.setupEventHandlers();
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Set a name for this transport (used in logging)
|
|
423
|
+
*/
|
|
424
|
+
setName(name) {
|
|
425
|
+
this.name = name;
|
|
426
|
+
this.logger.setMetadata({ name, transport: 'BidirectionalStdioTransport' });
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Initialize the bidirectional transport
|
|
430
|
+
* This should be called once after setting up all methods
|
|
431
|
+
*/
|
|
432
|
+
async initialize() {
|
|
433
|
+
if (this.initialized) {
|
|
434
|
+
throw new Error('Transport already initialized');
|
|
435
|
+
}
|
|
436
|
+
this.initialized = true;
|
|
437
|
+
this.setupStdioCommunication();
|
|
438
|
+
// Log to stderr to avoid contaminating stdout
|
|
439
|
+
this.logger.log('Transport initialized');
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Register a method that the parent can call
|
|
443
|
+
* @param method - Method name
|
|
444
|
+
* @param handler - Method handler function
|
|
445
|
+
*/
|
|
446
|
+
registerMethod(method, handler) {
|
|
447
|
+
this.server.registerMethod(method, handler);
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Send a request to the parent process
|
|
451
|
+
* @param method - Method name
|
|
452
|
+
* @param params - Method parameters
|
|
453
|
+
* @param options - Request options
|
|
454
|
+
* @returns Promise resolving to the response
|
|
455
|
+
*/
|
|
456
|
+
async request(method, params, options) {
|
|
457
|
+
if (!this.initialized) {
|
|
458
|
+
throw new Error('Transport not initialized. Call initialize() first.');
|
|
459
|
+
}
|
|
460
|
+
return this.client.request(method, params, options);
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Send a notification to the parent process (no response expected)
|
|
464
|
+
* @param method - Method name
|
|
465
|
+
* @param params - Method parameters
|
|
466
|
+
*/
|
|
467
|
+
async notify(method, params) {
|
|
468
|
+
if (!this.initialized) {
|
|
469
|
+
throw new Error('Transport not initialized. Call initialize() first.');
|
|
470
|
+
}
|
|
471
|
+
return this.client.notify(method, params);
|
|
472
|
+
}
|
|
473
|
+
/**
|
|
474
|
+
* Get transport statistics
|
|
475
|
+
*/
|
|
476
|
+
getStats() {
|
|
477
|
+
return {
|
|
478
|
+
serverMethods: 0,
|
|
479
|
+
pendingRequests: this.client.getStats().pendingRequests,
|
|
480
|
+
initialized: this.initialized
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Close the transport and cleanup resources
|
|
485
|
+
*/
|
|
486
|
+
async close() {
|
|
487
|
+
await this.client.close();
|
|
488
|
+
this.initialized = false;
|
|
489
|
+
this.removeAllListeners();
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Set up stdio communication handlers
|
|
493
|
+
*/
|
|
494
|
+
setupStdioCommunication() {
|
|
495
|
+
// Handle incoming data from parent
|
|
496
|
+
process.stdin.on('data', async (data) => {
|
|
497
|
+
this.buffer += data.toString();
|
|
498
|
+
// Process complete JSON messages
|
|
499
|
+
const lines = this.buffer.split('\n');
|
|
500
|
+
this.buffer = lines.pop() ?? ''; // Keep incomplete line in buffer
|
|
501
|
+
for (const line of lines) {
|
|
502
|
+
if (line.trim()) {
|
|
503
|
+
await this.handleIncomingMessage(line.trim());
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
});
|
|
507
|
+
// Handle process termination gracefully
|
|
508
|
+
process.on('SIGTERM', () => {
|
|
509
|
+
this.close().finally(() => process.exit(0));
|
|
510
|
+
});
|
|
511
|
+
process.on('SIGINT', () => {
|
|
512
|
+
this.close().finally(() => process.exit(0));
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
/**
|
|
516
|
+
* Handle incoming message and route to appropriate handler
|
|
517
|
+
*/
|
|
518
|
+
async handleIncomingMessage(messageData) {
|
|
519
|
+
try {
|
|
520
|
+
const message = this.safeParse(messageData);
|
|
521
|
+
if (!message) {
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
524
|
+
// Check if this is a response to our request (has 'result' or 'error' and 'id')
|
|
525
|
+
if (this.isResponse(message)) {
|
|
526
|
+
// This is a response to a request we made - route to client
|
|
527
|
+
this.logger.log(`Routing response to client: ${message.id}`);
|
|
528
|
+
// Manually trigger client's handleIncomingMessage
|
|
529
|
+
await this.client.handleIncomingMessage(messageData);
|
|
530
|
+
}
|
|
531
|
+
else {
|
|
532
|
+
// This is a request or notification for us - route to server
|
|
533
|
+
this.logger.log(`Routing request to server: ${message.method}`);
|
|
534
|
+
const response = await this.server.processMessage(messageData);
|
|
535
|
+
this.logger.log('Sending response to parent process', response);
|
|
536
|
+
// Only send response if there is one (requests get responses, notifications don't)
|
|
537
|
+
if (response) {
|
|
538
|
+
this.sendMessage(JSON.stringify(response));
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
catch (error) {
|
|
543
|
+
process.stderr.write(`Error processing message: ${error.message}\n`);
|
|
544
|
+
this.emit('error', error);
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
safeParse(message) {
|
|
548
|
+
try {
|
|
549
|
+
return JSON.parse(message);
|
|
550
|
+
}
|
|
551
|
+
catch {
|
|
552
|
+
return undefined;
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
/**
|
|
556
|
+
* Check if a message is a JSON-RPC response
|
|
557
|
+
*/
|
|
558
|
+
isResponse(message) {
|
|
559
|
+
return message &&
|
|
560
|
+
typeof message === 'object' &&
|
|
561
|
+
('result' in message || 'error' in message) &&
|
|
562
|
+
'id' in message &&
|
|
563
|
+
!('method' in message);
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* Send a message to the parent process
|
|
567
|
+
*/
|
|
568
|
+
sendMessage(message) {
|
|
569
|
+
// Log to stderr to avoid contaminating stdout JSON-RPC channel
|
|
570
|
+
this.logger.log(`Sending: ${message}`);
|
|
571
|
+
process.stdout.write(`${message}\n`);
|
|
572
|
+
}
|
|
573
|
+
/**
|
|
574
|
+
* Set up event handlers
|
|
575
|
+
*/
|
|
576
|
+
setupEventHandlers() {
|
|
577
|
+
this.server.on('error', (error) => {
|
|
578
|
+
this.logger.error('Server error', error);
|
|
579
|
+
this.emit('error', error);
|
|
580
|
+
});
|
|
581
|
+
this.client.on('error', (error) => {
|
|
582
|
+
this.logger.error('Client error', error);
|
|
583
|
+
this.emit('error', error);
|
|
584
|
+
});
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
exports.BidirectionalStdioTransport = BidirectionalStdioTransport;
|
|
588
|
+
class StdioServerTransport {
|
|
589
|
+
constructor(stdio, stdout, server) {
|
|
590
|
+
this.stdio = stdio;
|
|
591
|
+
this.stdout = stdout;
|
|
592
|
+
this.logger = logger_1.Logger.getInstance();
|
|
593
|
+
this.server = server;
|
|
594
|
+
}
|
|
595
|
+
setName(name) {
|
|
596
|
+
this.name = name;
|
|
597
|
+
this.logger.setMetadata({ name });
|
|
598
|
+
}
|
|
599
|
+
get status() {
|
|
600
|
+
return Transport_1.TransportStatus.connected;
|
|
601
|
+
}
|
|
602
|
+
isReady() {
|
|
603
|
+
return true;
|
|
604
|
+
}
|
|
605
|
+
async initialize() {
|
|
606
|
+
this.logger.log('Initializing transport');
|
|
607
|
+
this.stdio.on('data', async (data) => {
|
|
608
|
+
this.logger.log('Received message', data.toString());
|
|
609
|
+
const response = await this.server.processMessage(data.toString());
|
|
610
|
+
await this.send(JSON.stringify(response));
|
|
611
|
+
});
|
|
612
|
+
}
|
|
613
|
+
async send(message) {
|
|
614
|
+
this.logger.log('Sending message', message);
|
|
615
|
+
return new Promise(resolve => {
|
|
616
|
+
const json = JSON.stringify(message);
|
|
617
|
+
if (this.stdout.write(json)) {
|
|
618
|
+
resolve(undefined);
|
|
619
|
+
}
|
|
620
|
+
else {
|
|
621
|
+
this.stdout.once('drain', resolve);
|
|
622
|
+
}
|
|
623
|
+
});
|
|
624
|
+
}
|
|
625
|
+
onMessage() {
|
|
626
|
+
return void 0;
|
|
627
|
+
}
|
|
628
|
+
async close() {
|
|
629
|
+
this.logger.log('Closing transport');
|
|
630
|
+
this.stdio.destroy();
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
exports.StdioServerTransport = StdioServerTransport;
|
|
634
|
+
//# sourceMappingURL=StdioTransport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StdioTransport.js","sourceRoot":"","sources":["../../../src/JsExecutor/transport/StdioTransport.ts"],"names":[],"mappings":"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"}
|