@comake/skl-js-engine 1.0.8 → 1.0.9
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 +79 -87
- package/dist/SklEngine.js.map +1 -1
- package/dist/SklEngineOptions.d.ts +4 -0
- package/dist/constants.d.ts +1 -1
- package/dist/executor.js +9 -3
- package/dist/index.d.ts +12 -11
- package/dist/index.js +17 -15
- 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,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
3
|
+
/* eslint-disable callback-return */
|
|
4
|
+
/* eslint-disable @typescript-eslint/explicit-function-return-type */
|
|
5
|
+
/* eslint-disable func-style */
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.JSExecutor = void 0;
|
|
8
|
+
const errors_1 = require("./errors");
|
|
9
|
+
const transport_1 = require("./transport");
|
|
10
|
+
/**
|
|
11
|
+
* JSExecutor V2 with enhanced abort control for immediate shutdown
|
|
12
|
+
*
|
|
13
|
+
* @example Writing abort-aware callbacks:
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const jsExecutor = new JSExecutorV2(scriptPath, {
|
|
16
|
+
* async myCallback(): Promise<string> {
|
|
17
|
+
* return new Promise((resolve, reject) => {
|
|
18
|
+
* const timeoutId = setTimeout(() => resolve('done'), 5000);
|
|
19
|
+
*
|
|
20
|
+
* // Listen to the global abort signal to clean up resources
|
|
21
|
+
* const abortSignal = JSExecutorV2.getGlobalAbortSignal();
|
|
22
|
+
* const onAbort = () => {
|
|
23
|
+
* clearTimeout(timeoutId);
|
|
24
|
+
* reject(new Error('Operation aborted'));
|
|
25
|
+
* };
|
|
26
|
+
*
|
|
27
|
+
* if (abortSignal.aborted) {
|
|
28
|
+
* onAbort();
|
|
29
|
+
* return;
|
|
30
|
+
* }
|
|
31
|
+
*
|
|
32
|
+
* abortSignal.addEventListener('abort', onAbort);
|
|
33
|
+
* });
|
|
34
|
+
* }
|
|
35
|
+
* });
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
class JSExecutor {
|
|
39
|
+
constructor(executorScriptPath, callbacks) {
|
|
40
|
+
this.executorScriptPath = executorScriptPath;
|
|
41
|
+
this.callbacks = callbacks;
|
|
42
|
+
this.isInitialized = false;
|
|
43
|
+
this.abortController = new AbortController();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Static method to check if any JSExecutor instance is being shut down
|
|
47
|
+
* Callbacks can use this to check if they should abort their operations
|
|
48
|
+
*/
|
|
49
|
+
static isShuttingDown() {
|
|
50
|
+
return JSExecutor.globalAbortController.signal.aborted;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get the global abort signal that callbacks can listen to
|
|
54
|
+
* This allows callbacks to immediately abort when any JSExecutor shuts down
|
|
55
|
+
*/
|
|
56
|
+
static getGlobalAbortSignal() {
|
|
57
|
+
return JSExecutor.globalAbortController.signal;
|
|
58
|
+
}
|
|
59
|
+
async initialize(config, executionOptions) {
|
|
60
|
+
if (this.isInitialized) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
this.server = new transport_1.JsonRpcServer();
|
|
64
|
+
// Register callbacks with the server
|
|
65
|
+
Object.entries(this.callbacks).forEach(([methodName, callback]) => {
|
|
66
|
+
this.server.registerMethod(methodName, this.wrapCallbackWithAbort(callback));
|
|
67
|
+
});
|
|
68
|
+
// Create and initialize the transport once
|
|
69
|
+
this.transport = new transport_1.ParentStdioTransport(this.executorScriptPath, this.server);
|
|
70
|
+
await this.transport.initialize(config, executionOptions);
|
|
71
|
+
this.isInitialized = true;
|
|
72
|
+
}
|
|
73
|
+
async shutdown(options) {
|
|
74
|
+
// Clear any existing shutdown timeout
|
|
75
|
+
if (this.shutdownTimeout) {
|
|
76
|
+
clearTimeout(this.shutdownTimeout);
|
|
77
|
+
this.shutdownTimeout = undefined;
|
|
78
|
+
}
|
|
79
|
+
if (options?.afterTimeout) {
|
|
80
|
+
this.shutdownTimeout = setTimeout(async () => {
|
|
81
|
+
await this.shutdownCore();
|
|
82
|
+
}, options.afterTimeout);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
await this.shutdownCore();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async shutdownCore() {
|
|
89
|
+
// // Signal global abort first
|
|
90
|
+
// JSExecutor.globalAbortController.abort();
|
|
91
|
+
// Then signal this instance's abort
|
|
92
|
+
this.abortController.abort();
|
|
93
|
+
if (this.transport) {
|
|
94
|
+
await this.transport.close();
|
|
95
|
+
this.transport = undefined;
|
|
96
|
+
}
|
|
97
|
+
this.isInitialized = false;
|
|
98
|
+
this.server = undefined;
|
|
99
|
+
}
|
|
100
|
+
async rpcComplaintCallback(callback, args) {
|
|
101
|
+
const result = await callback(...args);
|
|
102
|
+
// RPC expects a result object
|
|
103
|
+
return result ?? {};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Wrap a callback with abort functionality
|
|
107
|
+
* The callback will be automatically aborted if JSExecutor is shut down
|
|
108
|
+
*/
|
|
109
|
+
wrapCallbackWithAbort(callback) {
|
|
110
|
+
return ((...args) => {
|
|
111
|
+
// Check if we're shutting down before executing
|
|
112
|
+
if (this.abortController.signal.aborted || JSExecutor.globalAbortController.signal.aborted) {
|
|
113
|
+
return Promise.reject(new Error('JSExecutor is shutting down'));
|
|
114
|
+
}
|
|
115
|
+
const callbackPromise = Promise.resolve(this.rpcComplaintCallback(callback, args));
|
|
116
|
+
// Create an abort promise
|
|
117
|
+
const abortPromise = new Promise((_, reject) => {
|
|
118
|
+
const onAbort = () => {
|
|
119
|
+
reject(new Error('JSExecutor is shutting down'));
|
|
120
|
+
};
|
|
121
|
+
// Listen to both instance and global abort signals
|
|
122
|
+
this.abortController.signal.addEventListener('abort', onAbort, { once: true });
|
|
123
|
+
JSExecutor.globalAbortController.signal.addEventListener('abort', onAbort, { once: true });
|
|
124
|
+
});
|
|
125
|
+
// Race the callback against the abort signal
|
|
126
|
+
return Promise.race([callbackPromise, abortPromise]);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
async execute(code, args, executionOptions) {
|
|
130
|
+
if (!this.isInitialized) {
|
|
131
|
+
throw new errors_1.NotInitializedError('JSExecutor is not initialized, please call initialize() first');
|
|
132
|
+
}
|
|
133
|
+
if (!this.transport || !this.transport.isReady()) {
|
|
134
|
+
throw new Error('Transport is not ready');
|
|
135
|
+
}
|
|
136
|
+
const response = await this.transport.request(transport_1.STANDARD_METHODS.executeCode, {
|
|
137
|
+
code,
|
|
138
|
+
args,
|
|
139
|
+
functionName: executionOptions.functionName
|
|
140
|
+
}, {
|
|
141
|
+
timeout: executionOptions.timeout,
|
|
142
|
+
retries: executionOptions.retries ?? 0
|
|
143
|
+
});
|
|
144
|
+
return response;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Legacy method for backward compatibility
|
|
148
|
+
* @deprecated Use execute() instead
|
|
149
|
+
*/
|
|
150
|
+
async call(methodName, ...args) {
|
|
151
|
+
if (!this.transport || !this.transport.isReady()) {
|
|
152
|
+
throw new Error('Transport is not ready');
|
|
153
|
+
}
|
|
154
|
+
return this.transport.request(methodName, args);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
exports.JSExecutor = JSExecutor;
|
|
158
|
+
JSExecutor.globalAbortController = new AbortController();
|
|
159
|
+
//# sourceMappingURL=jsExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsExecutor.js","sourceRoot":"","sources":["../../src/JsExecutor/jsExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import type { JsonRpcClientConfig, JsonRpcId, JsonRpcParams, JsonRpcRequest, JsonRpcResponse } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Event emitter interface for JSON-RPC client events
|
|
4
|
+
*/
|
|
5
|
+
export interface JsonRpcClientEvents {
|
|
6
|
+
request: (request: JsonRpcRequest) => void;
|
|
7
|
+
response: (response: JsonRpcResponse) => void;
|
|
8
|
+
error: (error: Error) => void;
|
|
9
|
+
timeout: (request: JsonRpcRequest) => void;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Transport interface for sending messages
|
|
13
|
+
*/
|
|
14
|
+
export interface ClientTransport {
|
|
15
|
+
send: (message: string) => Promise<void>;
|
|
16
|
+
onMessage: (handler: (message: string) => void) => void;
|
|
17
|
+
close: () => Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* JSON-RPC 2.0 Client implementation
|
|
21
|
+
*/
|
|
22
|
+
export declare class JsonRpcClient {
|
|
23
|
+
private readonly config;
|
|
24
|
+
private readonly pendingRequests;
|
|
25
|
+
private readonly listeners;
|
|
26
|
+
private requestIdCounter;
|
|
27
|
+
private transport?;
|
|
28
|
+
constructor(config?: JsonRpcClientConfig);
|
|
29
|
+
/**
|
|
30
|
+
* Set the transport for sending messages
|
|
31
|
+
* @param transport - Transport implementation
|
|
32
|
+
*/
|
|
33
|
+
setTransport(transport: ClientTransport): void;
|
|
34
|
+
/**
|
|
35
|
+
* Send a JSON-RPC request and wait for response
|
|
36
|
+
* @param method - Method name
|
|
37
|
+
* @param params - Method parameters
|
|
38
|
+
* @param options - Request options
|
|
39
|
+
* @returns Promise resolving to the response result
|
|
40
|
+
*/
|
|
41
|
+
request<TParams = JsonRpcParams, TResult = any>(method: string, params?: TParams, options?: {
|
|
42
|
+
timeout?: number;
|
|
43
|
+
retries?: number;
|
|
44
|
+
}): Promise<TResult>;
|
|
45
|
+
/**
|
|
46
|
+
* Send a JSON-RPC notification (no response expected)
|
|
47
|
+
* @param method - Method name
|
|
48
|
+
* @param params - Method parameters
|
|
49
|
+
*/
|
|
50
|
+
notify<TParams = JsonRpcParams>(method: string, params?: TParams): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Send a batch of requests
|
|
53
|
+
* @param requests - Array of request specifications
|
|
54
|
+
* @returns Promise resolving to array of results
|
|
55
|
+
*/
|
|
56
|
+
batch(requests: {
|
|
57
|
+
method: string;
|
|
58
|
+
params?: any;
|
|
59
|
+
id?: JsonRpcId;
|
|
60
|
+
}[]): Promise<any[]>;
|
|
61
|
+
/**
|
|
62
|
+
* Handle incoming message from transport
|
|
63
|
+
* @param messageData - Raw message data
|
|
64
|
+
*/
|
|
65
|
+
handleIncomingMessage(messageData: string): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Handle a single response message
|
|
68
|
+
* @param response - JSON-RPC response
|
|
69
|
+
*/
|
|
70
|
+
private handleResponse;
|
|
71
|
+
/**
|
|
72
|
+
* Send a request with timeout handling
|
|
73
|
+
* @param request - JSON-RPC request
|
|
74
|
+
* @param timeout - Timeout in milliseconds
|
|
75
|
+
* @returns Promise resolving to the result
|
|
76
|
+
*/
|
|
77
|
+
private sendRequestWithTimeout;
|
|
78
|
+
/**
|
|
79
|
+
* Create a pending request promise with timeout
|
|
80
|
+
* @param request - JSON-RPC request
|
|
81
|
+
* @param timeout - Timeout in milliseconds
|
|
82
|
+
* @returns Promise resolving to the result
|
|
83
|
+
*/
|
|
84
|
+
private createPendingRequest;
|
|
85
|
+
/**
|
|
86
|
+
* Create a JSON-RPC request
|
|
87
|
+
* @param method - Method name
|
|
88
|
+
* @param params - Method parameters
|
|
89
|
+
* @param id - Optional request ID
|
|
90
|
+
* @returns JSON-RPC request object
|
|
91
|
+
*/
|
|
92
|
+
private createRequest;
|
|
93
|
+
/**
|
|
94
|
+
* Create a JSON-RPC notification
|
|
95
|
+
* @param method - Method name
|
|
96
|
+
* @param params - Method parameters
|
|
97
|
+
* @returns JSON-RPC notification object
|
|
98
|
+
*/
|
|
99
|
+
private createNotification;
|
|
100
|
+
/**
|
|
101
|
+
* Generate a unique request ID
|
|
102
|
+
* @returns Unique request ID
|
|
103
|
+
*/
|
|
104
|
+
private generateId;
|
|
105
|
+
/**
|
|
106
|
+
* Check if response is a success response
|
|
107
|
+
* @param response - JSON-RPC response
|
|
108
|
+
* @returns True if success response
|
|
109
|
+
*/
|
|
110
|
+
private isSuccessResponse;
|
|
111
|
+
/**
|
|
112
|
+
* Check if an error should not be retried
|
|
113
|
+
* @param error - Error to check
|
|
114
|
+
* @returns True if error should not be retried
|
|
115
|
+
*/
|
|
116
|
+
private shouldNotRetry;
|
|
117
|
+
/**
|
|
118
|
+
* Delay execution for specified milliseconds
|
|
119
|
+
* @param ms - Delay in milliseconds
|
|
120
|
+
* @returns Promise that resolves after delay
|
|
121
|
+
*/
|
|
122
|
+
private delay;
|
|
123
|
+
/**
|
|
124
|
+
* Register event listener
|
|
125
|
+
* @param event - Event name
|
|
126
|
+
* @param listener - Event listener
|
|
127
|
+
*/
|
|
128
|
+
on<TKey extends keyof JsonRpcClientEvents>(event: TKey, listener: JsonRpcClientEvents[TKey]): void;
|
|
129
|
+
/**
|
|
130
|
+
* Remove event listener
|
|
131
|
+
* @param event - Event name
|
|
132
|
+
* @param listener - Event listener
|
|
133
|
+
*/
|
|
134
|
+
off<TKey extends keyof JsonRpcClientEvents>(event: TKey, listener: JsonRpcClientEvents[TKey]): void;
|
|
135
|
+
/**
|
|
136
|
+
* Emit event
|
|
137
|
+
* @param event - Event name
|
|
138
|
+
* @param args - Event arguments
|
|
139
|
+
*/
|
|
140
|
+
private emit;
|
|
141
|
+
/**
|
|
142
|
+
* Get client statistics
|
|
143
|
+
* @returns Client statistics
|
|
144
|
+
*/
|
|
145
|
+
getStats(): {
|
|
146
|
+
pendingRequests: number;
|
|
147
|
+
totalRequests: number;
|
|
148
|
+
config: Required<JsonRpcClientConfig>;
|
|
149
|
+
};
|
|
150
|
+
/**
|
|
151
|
+
* Cancel all pending requests
|
|
152
|
+
*/
|
|
153
|
+
cancelAllRequests(): void;
|
|
154
|
+
/**
|
|
155
|
+
* Cancel a specific request
|
|
156
|
+
* @param id - Request ID to cancel
|
|
157
|
+
* @returns True if request was cancelled
|
|
158
|
+
*/
|
|
159
|
+
cancelRequest(id: JsonRpcId): boolean;
|
|
160
|
+
/**
|
|
161
|
+
* Close the client and cleanup resources
|
|
162
|
+
*/
|
|
163
|
+
close(): Promise<void>;
|
|
164
|
+
}
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.JsonRpcClient = void 0;
|
|
4
|
+
const types_1 = require("./types");
|
|
5
|
+
/**
|
|
6
|
+
* JSON-RPC 2.0 Client implementation
|
|
7
|
+
*/
|
|
8
|
+
class JsonRpcClient {
|
|
9
|
+
constructor(config = {}) {
|
|
10
|
+
this.pendingRequests = new Map();
|
|
11
|
+
this.listeners = {};
|
|
12
|
+
this.requestIdCounter = 0;
|
|
13
|
+
this.config = {
|
|
14
|
+
defaultTimeout: config.defaultTimeout ?? 30000,
|
|
15
|
+
maxRetries: config.maxRetries ?? 3,
|
|
16
|
+
retryDelay: config.retryDelay ?? 1000,
|
|
17
|
+
sequentialIds: config.sequentialIds ?? true
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Set the transport for sending messages
|
|
22
|
+
* @param transport - Transport implementation
|
|
23
|
+
*/
|
|
24
|
+
setTransport(transport) {
|
|
25
|
+
this.transport = transport;
|
|
26
|
+
this.transport.onMessage((message) => {
|
|
27
|
+
this.handleIncomingMessage(message).catch((error) => {
|
|
28
|
+
this.emit('error', error);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Send a JSON-RPC request and wait for response
|
|
34
|
+
* @param method - Method name
|
|
35
|
+
* @param params - Method parameters
|
|
36
|
+
* @param options - Request options
|
|
37
|
+
* @returns Promise resolving to the response result
|
|
38
|
+
*/
|
|
39
|
+
async request(method, params, options = {}) {
|
|
40
|
+
if (!this.transport) {
|
|
41
|
+
throw new Error('Transport not set. Call setTransport() first.');
|
|
42
|
+
}
|
|
43
|
+
const timeout = options.timeout ?? this.config.defaultTimeout;
|
|
44
|
+
const maxRetries = options.retries ?? this.config.maxRetries;
|
|
45
|
+
let lastError;
|
|
46
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
47
|
+
try {
|
|
48
|
+
const request = this.createRequest(method, params);
|
|
49
|
+
const result = await this.sendRequestWithTimeout(request, timeout);
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
lastError = error;
|
|
54
|
+
// Don't retry on certain errors
|
|
55
|
+
if (this.shouldNotRetry(error) || attempt === maxRetries) {
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
// Wait before retrying
|
|
59
|
+
if (attempt < maxRetries) {
|
|
60
|
+
await this.delay(this.config.retryDelay * (attempt + 1));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
throw lastError ?? new Error('Request failed after all retry attempts');
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Send a JSON-RPC notification (no response expected)
|
|
68
|
+
* @param method - Method name
|
|
69
|
+
* @param params - Method parameters
|
|
70
|
+
*/
|
|
71
|
+
async notify(method, params) {
|
|
72
|
+
if (!this.transport) {
|
|
73
|
+
throw new Error('Transport not set. Call setTransport() first.');
|
|
74
|
+
}
|
|
75
|
+
const notification = this.createNotification(method, params);
|
|
76
|
+
await this.transport.send(JSON.stringify(notification));
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Send a batch of requests
|
|
80
|
+
* @param requests - Array of request specifications
|
|
81
|
+
* @returns Promise resolving to array of results
|
|
82
|
+
*/
|
|
83
|
+
async batch(requests) {
|
|
84
|
+
if (!this.transport) {
|
|
85
|
+
throw new Error('Transport not set. Call setTransport() first.');
|
|
86
|
+
}
|
|
87
|
+
const batchRequests = requests.map((req) => {
|
|
88
|
+
const id = req.id ?? this.generateId();
|
|
89
|
+
return this.createRequest(req.method, req.params, id);
|
|
90
|
+
});
|
|
91
|
+
const batchMessage = JSON.stringify(batchRequests);
|
|
92
|
+
// Create pending promises for all requests
|
|
93
|
+
const promises = batchRequests.map((request) => this.createPendingRequest(request, this.config.defaultTimeout));
|
|
94
|
+
// Send the batch
|
|
95
|
+
await this.transport.send(batchMessage);
|
|
96
|
+
// Wait for all responses
|
|
97
|
+
return Promise.all(promises);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Handle incoming message from transport
|
|
101
|
+
* @param messageData - Raw message data
|
|
102
|
+
*/
|
|
103
|
+
async handleIncomingMessage(messageData) {
|
|
104
|
+
try {
|
|
105
|
+
const message = JSON.parse(messageData);
|
|
106
|
+
// Handle batch response
|
|
107
|
+
if (Array.isArray(message)) {
|
|
108
|
+
for (const response of message) {
|
|
109
|
+
this.handleResponse(response);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
this.handleResponse(message);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
this.emit('error', new Error(`Failed to parse incoming message: ${error.message}`));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Handle a single response message
|
|
122
|
+
* @param response - JSON-RPC response
|
|
123
|
+
*/
|
|
124
|
+
handleResponse(response) {
|
|
125
|
+
this.emit('response', response);
|
|
126
|
+
const pendingRequest = this.pendingRequests.get(response.id);
|
|
127
|
+
if (!pendingRequest) {
|
|
128
|
+
// Orphaned response - might be from a timed-out request
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
this.pendingRequests.delete(response.id);
|
|
132
|
+
if (this.isSuccessResponse(response)) {
|
|
133
|
+
pendingRequest.resolve(response.result);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
const error = new Error(response.error.message);
|
|
137
|
+
error.code = response.error.code;
|
|
138
|
+
error.data = response.error.data;
|
|
139
|
+
pendingRequest.reject(error);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Send a request with timeout handling
|
|
144
|
+
* @param request - JSON-RPC request
|
|
145
|
+
* @param timeout - Timeout in milliseconds
|
|
146
|
+
* @returns Promise resolving to the result
|
|
147
|
+
*/
|
|
148
|
+
async sendRequestWithTimeout(request, timeout) {
|
|
149
|
+
const promise = this.createPendingRequest(request, timeout);
|
|
150
|
+
this.emit('request', request);
|
|
151
|
+
await this.transport.send(JSON.stringify(request));
|
|
152
|
+
return promise;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Create a pending request promise with timeout
|
|
156
|
+
* @param request - JSON-RPC request
|
|
157
|
+
* @param timeout - Timeout in milliseconds
|
|
158
|
+
* @returns Promise resolving to the result
|
|
159
|
+
*/
|
|
160
|
+
async createPendingRequest(request, timeout) {
|
|
161
|
+
return new Promise((resolve, reject) => {
|
|
162
|
+
const timeoutId = setTimeout(() => {
|
|
163
|
+
this.pendingRequests.delete(request.id);
|
|
164
|
+
this.emit('timeout', request);
|
|
165
|
+
reject(new Error(`Request ${request.id} timed out after ${timeout}ms`));
|
|
166
|
+
}, timeout);
|
|
167
|
+
const pendingRequest = {
|
|
168
|
+
id: request.id,
|
|
169
|
+
method: request.method,
|
|
170
|
+
timestamp: Date.now(),
|
|
171
|
+
timeout,
|
|
172
|
+
resolve(value) {
|
|
173
|
+
clearTimeout(timeoutId);
|
|
174
|
+
resolve(value);
|
|
175
|
+
},
|
|
176
|
+
reject(error) {
|
|
177
|
+
clearTimeout(timeoutId);
|
|
178
|
+
reject(error);
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
this.pendingRequests.set(request.id, pendingRequest);
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Create a JSON-RPC request
|
|
186
|
+
* @param method - Method name
|
|
187
|
+
* @param params - Method parameters
|
|
188
|
+
* @param id - Optional request ID
|
|
189
|
+
* @returns JSON-RPC request object
|
|
190
|
+
*/
|
|
191
|
+
createRequest(method, params, id) {
|
|
192
|
+
const request = {
|
|
193
|
+
jsonrpc: types_1.JSONRPC_VERSION,
|
|
194
|
+
method,
|
|
195
|
+
id: id ?? this.generateId()
|
|
196
|
+
};
|
|
197
|
+
if (params !== undefined) {
|
|
198
|
+
request.params = params;
|
|
199
|
+
}
|
|
200
|
+
return request;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Create a JSON-RPC notification
|
|
204
|
+
* @param method - Method name
|
|
205
|
+
* @param params - Method parameters
|
|
206
|
+
* @returns JSON-RPC notification object
|
|
207
|
+
*/
|
|
208
|
+
createNotification(method, params) {
|
|
209
|
+
const notification = {
|
|
210
|
+
jsonrpc: types_1.JSONRPC_VERSION,
|
|
211
|
+
method
|
|
212
|
+
};
|
|
213
|
+
if (params !== undefined) {
|
|
214
|
+
notification.params = params;
|
|
215
|
+
}
|
|
216
|
+
return notification;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Generate a unique request ID
|
|
220
|
+
* @returns Unique request ID
|
|
221
|
+
*/
|
|
222
|
+
generateId() {
|
|
223
|
+
if (this.config.sequentialIds) {
|
|
224
|
+
this.requestIdCounter += 1;
|
|
225
|
+
return this.requestIdCounter;
|
|
226
|
+
}
|
|
227
|
+
return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Check if response is a success response
|
|
231
|
+
* @param response - JSON-RPC response
|
|
232
|
+
* @returns True if success response
|
|
233
|
+
*/
|
|
234
|
+
isSuccessResponse(response) {
|
|
235
|
+
return 'result' in response;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Check if an error should not be retried
|
|
239
|
+
* @param error - Error to check
|
|
240
|
+
* @returns True if error should not be retried
|
|
241
|
+
*/
|
|
242
|
+
shouldNotRetry(error) {
|
|
243
|
+
// Don't retry on method not found, invalid params, or parse errors
|
|
244
|
+
const errorCode = error.code;
|
|
245
|
+
return (errorCode === types_1.JsonRpcErrorCode.methodNotFound ||
|
|
246
|
+
errorCode === types_1.JsonRpcErrorCode.invalidParams ||
|
|
247
|
+
errorCode === types_1.JsonRpcErrorCode.parseError ||
|
|
248
|
+
errorCode === types_1.JsonRpcErrorCode.invalidRequest ||
|
|
249
|
+
errorCode === types_1.JsonRpcErrorCode.internalError);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Delay execution for specified milliseconds
|
|
253
|
+
* @param ms - Delay in milliseconds
|
|
254
|
+
* @returns Promise that resolves after delay
|
|
255
|
+
*/
|
|
256
|
+
async delay(ms) {
|
|
257
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Register event listener
|
|
261
|
+
* @param event - Event name
|
|
262
|
+
* @param listener - Event listener
|
|
263
|
+
*/
|
|
264
|
+
on(event, listener) {
|
|
265
|
+
this.listeners[event] = listener;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Remove event listener
|
|
269
|
+
* @param event - Event name
|
|
270
|
+
* @param listener - Event listener
|
|
271
|
+
*/
|
|
272
|
+
off(event, listener) {
|
|
273
|
+
if (this.listeners[event] === listener) {
|
|
274
|
+
Reflect.deleteProperty(this.listeners, event);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Emit event
|
|
279
|
+
* @param event - Event name
|
|
280
|
+
* @param args - Event arguments
|
|
281
|
+
*/
|
|
282
|
+
emit(event, ...args) {
|
|
283
|
+
const listener = this.listeners[event];
|
|
284
|
+
if (listener) {
|
|
285
|
+
listener(...args);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Get client statistics
|
|
290
|
+
* @returns Client statistics
|
|
291
|
+
*/
|
|
292
|
+
getStats() {
|
|
293
|
+
return {
|
|
294
|
+
pendingRequests: this.pendingRequests.size,
|
|
295
|
+
totalRequests: this.requestIdCounter,
|
|
296
|
+
config: { ...this.config }
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Cancel all pending requests
|
|
301
|
+
*/
|
|
302
|
+
cancelAllRequests() {
|
|
303
|
+
const error = new Error('Request cancelled');
|
|
304
|
+
for (const [id, pendingRequest] of this.pendingRequests) {
|
|
305
|
+
pendingRequest.reject(error);
|
|
306
|
+
}
|
|
307
|
+
this.pendingRequests.clear();
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Cancel a specific request
|
|
311
|
+
* @param id - Request ID to cancel
|
|
312
|
+
* @returns True if request was cancelled
|
|
313
|
+
*/
|
|
314
|
+
cancelRequest(id) {
|
|
315
|
+
const pendingRequest = this.pendingRequests.get(id);
|
|
316
|
+
if (pendingRequest) {
|
|
317
|
+
pendingRequest.reject(new Error('Request cancelled'));
|
|
318
|
+
this.pendingRequests.delete(id);
|
|
319
|
+
return true;
|
|
320
|
+
}
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Close the client and cleanup resources
|
|
325
|
+
*/
|
|
326
|
+
async close() {
|
|
327
|
+
this.cancelAllRequests();
|
|
328
|
+
if (this.transport) {
|
|
329
|
+
await this.transport.close();
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
exports.JsonRpcClient = JsonRpcClient;
|
|
334
|
+
//# sourceMappingURL=JsonRpcClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsonRpcClient.js","sourceRoot":"","sources":["../../../src/JsExecutor/jsonRpc/JsonRpcClient.ts"],"names":[],"mappings":"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"}
|