@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.
Files changed (93) hide show
  1. package/dist/JsExecutor/PermissionBuilder.d.ts +13 -0
  2. package/dist/JsExecutor/PermissionBuilder.js +58 -0
  3. package/dist/JsExecutor/PermissionBuilder.js.map +1 -0
  4. package/dist/JsExecutor/constants.d.ts +26 -0
  5. package/dist/JsExecutor/constants.js +30 -0
  6. package/dist/JsExecutor/constants.js.map +1 -0
  7. package/dist/JsExecutor/denoUtils.d.ts +9 -0
  8. package/dist/JsExecutor/denoUtils.js +24 -0
  9. package/dist/JsExecutor/denoUtils.js.map +1 -0
  10. package/dist/JsExecutor/errors.d.ts +39 -0
  11. package/dist/JsExecutor/errors.js +67 -0
  12. package/dist/JsExecutor/errors.js.map +1 -0
  13. package/dist/JsExecutor/examples/basic/index.d.ts +0 -0
  14. package/dist/JsExecutor/examples/basic/index.js +46 -0
  15. package/dist/JsExecutor/examples/basic/index.js.map +1 -0
  16. package/dist/JsExecutor/examples/basic/process.d.ts +0 -0
  17. package/dist/JsExecutor/examples/basic/process.js +34 -0
  18. package/dist/JsExecutor/examples/basic/process.js.map +1 -0
  19. package/dist/JsExecutor/examples/jsExecutor/index.d.ts +1 -0
  20. package/dist/JsExecutor/examples/jsExecutor/index.js +48 -0
  21. package/dist/JsExecutor/examples/jsExecutor/index.js.map +1 -0
  22. package/dist/JsExecutor/examples/jsExecutor/process.d.ts +1 -0
  23. package/dist/JsExecutor/examples/jsExecutor/process.js +59 -0
  24. package/dist/JsExecutor/examples/jsExecutor/process.js.map +1 -0
  25. package/dist/JsExecutor/index.d.ts +6 -0
  26. package/dist/JsExecutor/index.js +36 -0
  27. package/dist/JsExecutor/index.js.map +1 -0
  28. package/dist/JsExecutor/jsExecutor.d.ts +67 -0
  29. package/dist/JsExecutor/jsExecutor.js +159 -0
  30. package/dist/JsExecutor/jsExecutor.js.map +1 -0
  31. package/dist/JsExecutor/jsonRpc/JsonRpcClient.d.ts +164 -0
  32. package/dist/JsExecutor/jsonRpc/JsonRpcClient.js +334 -0
  33. package/dist/JsExecutor/jsonRpc/JsonRpcClient.js.map +1 -0
  34. package/dist/JsExecutor/jsonRpc/JsonRpcServer.d.ts +124 -0
  35. package/dist/JsExecutor/jsonRpc/JsonRpcServer.js +391 -0
  36. package/dist/JsExecutor/jsonRpc/JsonRpcServer.js.map +1 -0
  37. package/dist/JsExecutor/jsonRpc/index.d.ts +3 -0
  38. package/dist/JsExecutor/jsonRpc/index.js +23 -0
  39. package/dist/JsExecutor/jsonRpc/index.js.map +1 -0
  40. package/dist/JsExecutor/jsonRpc/types.d.ts +192 -0
  41. package/dist/JsExecutor/jsonRpc/types.js +37 -0
  42. package/dist/JsExecutor/jsonRpc/types.js.map +1 -0
  43. package/dist/JsExecutor/transport/StdioTransport.d.ts +226 -0
  44. package/dist/JsExecutor/transport/StdioTransport.js +634 -0
  45. package/dist/JsExecutor/transport/StdioTransport.js.map +1 -0
  46. package/dist/JsExecutor/transport/Transport.d.ts +71 -0
  47. package/dist/JsExecutor/transport/Transport.js +14 -0
  48. package/dist/JsExecutor/transport/Transport.js.map +1 -0
  49. package/dist/JsExecutor/transport/base/BaseTransport.d.ts +50 -0
  50. package/dist/JsExecutor/transport/base/BaseTransport.js +68 -0
  51. package/dist/JsExecutor/transport/base/BaseTransport.js.map +1 -0
  52. package/dist/JsExecutor/transport/index.d.ts +12 -0
  53. package/dist/JsExecutor/transport/index.js +36 -0
  54. package/dist/JsExecutor/transport/index.js.map +1 -0
  55. package/dist/JsExecutor/transport/process/ProcessManager.d.ts +95 -0
  56. package/dist/JsExecutor/transport/process/ProcessManager.js +214 -0
  57. package/dist/JsExecutor/transport/process/ProcessManager.js.map +1 -0
  58. package/dist/JsExecutor/transport/stdio/ChildStdioTransport.d.ts +86 -0
  59. package/dist/JsExecutor/transport/stdio/ChildStdioTransport.js +215 -0
  60. package/dist/JsExecutor/transport/stdio/ChildStdioTransport.js.map +1 -0
  61. package/dist/JsExecutor/transport/stdio/ParentStdioTransport.d.ts +80 -0
  62. package/dist/JsExecutor/transport/stdio/ParentStdioTransport.js +263 -0
  63. package/dist/JsExecutor/transport/stdio/ParentStdioTransport.js.map +1 -0
  64. package/dist/JsExecutor/transport/utils/MessageUtils.d.ts +67 -0
  65. package/dist/JsExecutor/transport/utils/MessageUtils.js +135 -0
  66. package/dist/JsExecutor/transport/utils/MessageUtils.js.map +1 -0
  67. package/dist/JsExecutor/types.d.ts +112 -0
  68. package/dist/JsExecutor/types.js +3 -0
  69. package/dist/JsExecutor/types.js.map +1 -0
  70. package/dist/SklEngine.d.ts +9 -5
  71. package/dist/SklEngine.js +79 -87
  72. package/dist/SklEngine.js.map +1 -1
  73. package/dist/SklEngineOptions.d.ts +4 -0
  74. package/dist/constants.d.ts +1 -1
  75. package/dist/executor.js +9 -3
  76. package/dist/index.d.ts +12 -11
  77. package/dist/index.js +17 -15
  78. package/dist/index.js.map +1 -1
  79. package/dist/logger.d.ts +5 -1
  80. package/dist/logger.js +21 -4
  81. package/dist/logger.js.map +1 -1
  82. package/dist/util/Vocabularies/Shared.d.ts +1 -1
  83. package/dist/util/Vocabularies/index.d.ts +1 -1
  84. package/package.json +1 -1
  85. package/dist/Jsexecutor.d.ts +0 -77
  86. package/dist/Jsexecutor.js +0 -184
  87. package/dist/Jsexecutor.js.map +0 -1
  88. package/dist/storage/operator/ArrayEqual.d.ts +0 -3
  89. package/dist/storage/operator/ArrayEqual.js +0 -13
  90. package/dist/storage/operator/ArrayEqual.js.map +0 -1
  91. package/dist/util/Vocabularies/core.d.ts +0 -7
  92. package/dist/util/Vocabularies/core.js +0 -119
  93. 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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"}