@comake/skl-js-engine 1.5.4 → 1.5.5
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 +14 -0
- package/dist/JsExecutor/PermissionBuilder.d.ts.map +1 -0
- package/dist/JsExecutor/PermissionBuilder.js +58 -0
- package/dist/JsExecutor/PermissionBuilder.js.map +1 -0
- package/dist/JsExecutor/constants.d.ts +27 -0
- package/dist/JsExecutor/constants.d.ts.map +1 -0
- package/dist/JsExecutor/constants.js +30 -0
- package/dist/JsExecutor/constants.js.map +1 -0
- package/dist/JsExecutor/denoUtils.d.ts +10 -0
- package/dist/JsExecutor/denoUtils.d.ts.map +1 -0
- package/dist/JsExecutor/denoUtils.js +24 -0
- package/dist/JsExecutor/denoUtils.js.map +1 -0
- package/dist/JsExecutor/errors.d.ts +40 -0
- package/dist/JsExecutor/errors.d.ts.map +1 -0
- package/dist/JsExecutor/errors.js +67 -0
- package/dist/JsExecutor/errors.js.map +1 -0
- package/dist/JsExecutor/examples/basic/index.d.ts +1 -0
- package/dist/JsExecutor/examples/basic/index.d.ts.map +1 -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 +1 -0
- package/dist/JsExecutor/examples/basic/process.d.ts.map +1 -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 +2 -0
- package/dist/JsExecutor/examples/jsExecutor/index.d.ts.map +1 -0
- package/dist/JsExecutor/examples/jsExecutor/index.js +47 -0
- package/dist/JsExecutor/examples/jsExecutor/index.js.map +1 -0
- package/dist/JsExecutor/examples/jsExecutor/process.d.ts +2 -0
- package/dist/JsExecutor/examples/jsExecutor/process.d.ts.map +1 -0
- package/dist/JsExecutor/examples/jsExecutor/process.js +58 -0
- package/dist/JsExecutor/examples/jsExecutor/process.js.map +1 -0
- package/dist/JsExecutor/index.d.ts +7 -0
- package/dist/JsExecutor/index.d.ts.map +1 -0
- package/dist/JsExecutor/index.js +36 -0
- package/dist/JsExecutor/index.js.map +1 -0
- package/dist/JsExecutor/jsExecutor.d.ts +68 -0
- package/dist/JsExecutor/jsExecutor.d.ts.map +1 -0
- package/dist/JsExecutor/jsExecutor.js +171 -0
- package/dist/JsExecutor/jsExecutor.js.map +1 -0
- package/dist/JsExecutor/jsonRpc/JsonRpcClient.d.ts +165 -0
- package/dist/JsExecutor/jsonRpc/JsonRpcClient.d.ts.map +1 -0
- package/dist/JsExecutor/jsonRpc/JsonRpcClient.js +335 -0
- package/dist/JsExecutor/jsonRpc/JsonRpcClient.js.map +1 -0
- package/dist/JsExecutor/jsonRpc/JsonRpcServer.d.ts +125 -0
- package/dist/JsExecutor/jsonRpc/JsonRpcServer.d.ts.map +1 -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 +4 -0
- package/dist/JsExecutor/jsonRpc/index.d.ts.map +1 -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 +193 -0
- package/dist/JsExecutor/jsonRpc/types.d.ts.map +1 -0
- package/dist/JsExecutor/jsonRpc/types.js +37 -0
- package/dist/JsExecutor/jsonRpc/types.js.map +1 -0
- package/dist/JsExecutor/transport/Transport.d.ts +74 -0
- package/dist/JsExecutor/transport/Transport.d.ts.map +1 -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 +51 -0
- package/dist/JsExecutor/transport/base/BaseTransport.d.ts.map +1 -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 +13 -0
- package/dist/JsExecutor/transport/index.d.ts.map +1 -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 +96 -0
- package/dist/JsExecutor/transport/process/ProcessManager.d.ts.map +1 -0
- package/dist/JsExecutor/transport/process/ProcessManager.js +219 -0
- package/dist/JsExecutor/transport/process/ProcessManager.js.map +1 -0
- package/dist/JsExecutor/transport/stdio/ChildStdioTransport.d.ts +87 -0
- package/dist/JsExecutor/transport/stdio/ChildStdioTransport.d.ts.map +1 -0
- package/dist/JsExecutor/transport/stdio/ChildStdioTransport.js +219 -0
- package/dist/JsExecutor/transport/stdio/ChildStdioTransport.js.map +1 -0
- package/dist/JsExecutor/transport/stdio/ParentStdioTransport.d.ts +81 -0
- package/dist/JsExecutor/transport/stdio/ParentStdioTransport.d.ts.map +1 -0
- package/dist/JsExecutor/transport/stdio/ParentStdioTransport.js +259 -0
- package/dist/JsExecutor/transport/stdio/ParentStdioTransport.js.map +1 -0
- package/dist/JsExecutor/transport/utils/MessageUtils.d.ts +68 -0
- package/dist/JsExecutor/transport/utils/MessageUtils.d.ts.map +1 -0
- package/dist/JsExecutor/transport/utils/MessageUtils.js +135 -0
- package/dist/JsExecutor/transport/utils/MessageUtils.js.map +1 -0
- package/dist/JsExecutor/transport/utils/PollingUtils.d.ts +53 -0
- package/dist/JsExecutor/transport/utils/PollingUtils.d.ts.map +1 -0
- package/dist/JsExecutor/transport/utils/PollingUtils.js +92 -0
- package/dist/JsExecutor/transport/utils/PollingUtils.js.map +1 -0
- package/dist/JsExecutor/types.d.ts +113 -0
- package/dist/JsExecutor/types.d.ts.map +1 -0
- package/dist/JsExecutor/types.js +3 -0
- package/dist/JsExecutor/types.js.map +1 -0
- package/dist/SklEngine.d.ts +132 -0
- package/dist/SklEngine.d.ts.map +1 -0
- package/dist/SklEngine.js +1508 -0
- package/dist/SklEngine.js.map +1 -0
- package/dist/SklEngineOptions.d.ts +58 -0
- package/dist/SklEngineOptions.d.ts.map +1 -0
- package/dist/SklEngineOptions.js +3 -0
- package/dist/SklEngineOptions.js.map +1 -0
- package/dist/constants.d.ts +96 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +103 -0
- package/dist/constants.js.map +1 -0
- package/dist/customCapabilities.d.ts +22 -0
- package/dist/customCapabilities.d.ts.map +1 -0
- package/dist/customCapabilities.js +45 -0
- package/dist/customCapabilities.js.map +1 -0
- package/dist/examples/customCapabilitiesExample.d.ts +2 -0
- package/dist/examples/customCapabilitiesExample.d.ts.map +1 -0
- package/dist/examples/customCapabilitiesExample.js +59 -0
- package/dist/examples/customCapabilitiesExample.js.map +1 -0
- package/dist/executor.js +216 -0
- package/dist/hooks/globalHooks.d.ts +50 -0
- package/dist/hooks/globalHooks.d.ts.map +1 -0
- package/dist/hooks/globalHooks.js +164 -0
- package/dist/hooks/globalHooks.js.map +1 -0
- package/dist/hooks/types.d.ts +9 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +3 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +35 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +119 -0
- package/dist/logger.js.map +1 -0
- package/dist/mapping/Mapper.d.ts +13 -0
- package/dist/mapping/Mapper.d.ts.map +1 -0
- package/dist/mapping/Mapper.js +64 -0
- package/dist/mapping/Mapper.js.map +1 -0
- package/dist/storage/FindOperator.d.ts +19 -0
- package/dist/storage/FindOperator.d.ts.map +1 -0
- package/dist/storage/FindOperator.js +23 -0
- package/dist/storage/FindOperator.js.map +1 -0
- package/dist/storage/FindOptionsTypes.d.ts +79 -0
- package/dist/storage/FindOptionsTypes.d.ts.map +1 -0
- package/dist/storage/FindOptionsTypes.js +3 -0
- package/dist/storage/FindOptionsTypes.js.map +1 -0
- package/dist/storage/GroupOptionTypes.d.ts +29 -0
- package/dist/storage/GroupOptionTypes.d.ts.map +1 -0
- package/dist/storage/GroupOptionTypes.js +3 -0
- package/dist/storage/GroupOptionTypes.js.map +1 -0
- package/dist/storage/operator/And.d.ts +4 -0
- package/dist/storage/operator/And.d.ts.map +1 -0
- package/dist/storage/operator/And.js +13 -0
- package/dist/storage/operator/And.js.map +1 -0
- package/dist/storage/operator/Contains.d.ts +3 -0
- package/dist/storage/operator/Contains.d.ts.map +1 -0
- package/dist/storage/operator/Contains.js +13 -0
- package/dist/storage/operator/Contains.js.map +1 -0
- package/dist/storage/operator/Equal.d.ts +5 -0
- package/dist/storage/operator/Equal.d.ts.map +1 -0
- package/dist/storage/operator/Equal.js +13 -0
- package/dist/storage/operator/Equal.js.map +1 -0
- package/dist/storage/operator/Exists.d.ts +3 -0
- package/dist/storage/operator/Exists.d.ts.map +1 -0
- package/dist/storage/operator/Exists.js +10 -0
- package/dist/storage/operator/Exists.js.map +1 -0
- package/dist/storage/operator/GreaterThan.d.ts +4 -0
- package/dist/storage/operator/GreaterThan.d.ts.map +1 -0
- package/dist/storage/operator/GreaterThan.js +13 -0
- package/dist/storage/operator/GreaterThan.js.map +1 -0
- package/dist/storage/operator/GreaterThanOrEqual.d.ts +4 -0
- package/dist/storage/operator/GreaterThanOrEqual.d.ts.map +1 -0
- package/dist/storage/operator/GreaterThanOrEqual.js +13 -0
- package/dist/storage/operator/GreaterThanOrEqual.js.map +1 -0
- package/dist/storage/operator/In.d.ts +4 -0
- package/dist/storage/operator/In.d.ts.map +1 -0
- package/dist/storage/operator/In.js +13 -0
- package/dist/storage/operator/In.js.map +1 -0
- package/dist/storage/operator/Inverse.d.ts +3 -0
- package/dist/storage/operator/Inverse.d.ts.map +1 -0
- package/dist/storage/operator/Inverse.js +13 -0
- package/dist/storage/operator/Inverse.js.map +1 -0
- package/dist/storage/operator/InversePath.d.ts +7 -0
- package/dist/storage/operator/InversePath.d.ts.map +1 -0
- package/dist/storage/operator/InversePath.js +13 -0
- package/dist/storage/operator/InversePath.js.map +1 -0
- package/dist/storage/operator/InverseRelation.d.ts +9 -0
- package/dist/storage/operator/InverseRelation.d.ts.map +1 -0
- package/dist/storage/operator/InverseRelation.js +13 -0
- package/dist/storage/operator/InverseRelation.js.map +1 -0
- package/dist/storage/operator/InverseRelationOrder.d.ts +8 -0
- package/dist/storage/operator/InverseRelationOrder.d.ts.map +1 -0
- package/dist/storage/operator/InverseRelationOrder.js +13 -0
- package/dist/storage/operator/InverseRelationOrder.js.map +1 -0
- package/dist/storage/operator/LessThan.d.ts +4 -0
- package/dist/storage/operator/LessThan.d.ts.map +1 -0
- package/dist/storage/operator/LessThan.js +13 -0
- package/dist/storage/operator/LessThan.js.map +1 -0
- package/dist/storage/operator/LessThanOrEqual.d.ts +4 -0
- package/dist/storage/operator/LessThanOrEqual.d.ts.map +1 -0
- package/dist/storage/operator/LessThanOrEqual.js +13 -0
- package/dist/storage/operator/LessThanOrEqual.js.map +1 -0
- package/dist/storage/operator/Not.d.ts +3 -0
- package/dist/storage/operator/Not.d.ts.map +1 -0
- package/dist/storage/operator/Not.js +13 -0
- package/dist/storage/operator/Not.js.map +1 -0
- package/dist/storage/operator/OneOrMorePath.d.ts +7 -0
- package/dist/storage/operator/OneOrMorePath.d.ts.map +1 -0
- package/dist/storage/operator/OneOrMorePath.js +13 -0
- package/dist/storage/operator/OneOrMorePath.js.map +1 -0
- package/dist/storage/operator/Or.d.ts +4 -0
- package/dist/storage/operator/Or.d.ts.map +1 -0
- package/dist/storage/operator/Or.js +13 -0
- package/dist/storage/operator/Or.js.map +1 -0
- package/dist/storage/operator/Sequence.d.ts +3 -0
- package/dist/storage/operator/Sequence.d.ts.map +1 -0
- package/dist/storage/operator/Sequence.js +13 -0
- package/dist/storage/operator/Sequence.js.map +1 -0
- package/dist/storage/operator/SequencePath.d.ts +7 -0
- package/dist/storage/operator/SequencePath.d.ts.map +1 -0
- package/dist/storage/operator/SequencePath.js +13 -0
- package/dist/storage/operator/SequencePath.js.map +1 -0
- package/dist/storage/operator/ZeroOrMorePath.d.ts +7 -0
- package/dist/storage/operator/ZeroOrMorePath.d.ts.map +1 -0
- package/dist/storage/operator/ZeroOrMorePath.js +13 -0
- package/dist/storage/operator/ZeroOrMorePath.js.map +1 -0
- package/dist/storage/query-adapter/QueryAdapter.d.ts +99 -0
- package/dist/storage/query-adapter/QueryAdapter.d.ts.map +1 -0
- package/dist/storage/query-adapter/QueryAdapter.js +3 -0
- package/dist/storage/query-adapter/QueryAdapter.js.map +1 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryAdapter.d.ts +40 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryAdapter.d.ts.map +1 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryAdapter.js +315 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryAdapter.js.map +1 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryAdapterOptions.d.ts +34 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryAdapterOptions.d.ts.map +1 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryAdapterOptions.js +3 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryAdapterOptions.js.map +1 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryBuilder.d.ts +104 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryBuilder.d.ts.map +1 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryBuilder.js +1210 -0
- package/dist/storage/query-adapter/sparql/SparqlQueryBuilder.js.map +1 -0
- package/dist/storage/query-adapter/sparql/SparqlUpdateBuilder.d.ts +44 -0
- package/dist/storage/query-adapter/sparql/SparqlUpdateBuilder.d.ts.map +1 -0
- package/dist/storage/query-adapter/sparql/SparqlUpdateBuilder.js +397 -0
- package/dist/storage/query-adapter/sparql/SparqlUpdateBuilder.js.map +1 -0
- package/dist/storage/query-adapter/sparql/VariableGenerator.d.ts +5 -0
- package/dist/storage/query-adapter/sparql/VariableGenerator.d.ts.map +1 -0
- package/dist/storage/query-adapter/sparql/VariableGenerator.js +14 -0
- package/dist/storage/query-adapter/sparql/VariableGenerator.js.map +1 -0
- package/dist/storage/query-adapter/sparql/query-executor/InMemorySparqlQueryExecutor.d.ts +19 -0
- package/dist/storage/query-adapter/sparql/query-executor/InMemorySparqlQueryExecutor.d.ts.map +1 -0
- package/dist/storage/query-adapter/sparql/query-executor/InMemorySparqlQueryExecutor.js +90 -0
- package/dist/storage/query-adapter/sparql/query-executor/InMemorySparqlQueryExecutor.js.map +1 -0
- package/dist/storage/query-adapter/sparql/query-executor/SparqlEndpointQueryExecutor.d.ts +27 -0
- package/dist/storage/query-adapter/sparql/query-executor/SparqlEndpointQueryExecutor.d.ts.map +1 -0
- package/dist/storage/query-adapter/sparql/query-executor/SparqlEndpointQueryExecutor.js +116 -0
- package/dist/storage/query-adapter/sparql/query-executor/SparqlEndpointQueryExecutor.js.map +1 -0
- package/dist/storage/query-adapter/sparql/query-executor/SparqlQueryExecutor.d.ts +34 -0
- package/dist/storage/query-adapter/sparql/query-executor/SparqlQueryExecutor.d.ts.map +1 -0
- package/dist/storage/query-adapter/sparql/query-executor/SparqlQueryExecutor.js +3 -0
- package/dist/storage/query-adapter/sparql/query-executor/SparqlQueryExecutor.js.map +1 -0
- package/dist/tools/explain-findall-sparql.d.ts +2 -0
- package/dist/tools/explain-findall-sparql.d.ts.map +1 -0
- package/dist/tools/explain-findall-sparql.js +303 -0
- package/dist/tools/explain-findall-sparql.js.map +1 -0
- package/dist/util/PerformanceLogger.d.ts +28 -0
- package/dist/util/PerformanceLogger.d.ts.map +1 -0
- package/dist/util/PerformanceLogger.js +223 -0
- package/dist/util/PerformanceLogger.js.map +1 -0
- package/dist/util/ReadCacheHelper.d.ts +14 -0
- package/dist/util/ReadCacheHelper.d.ts.map +1 -0
- package/dist/util/ReadCacheHelper.js +61 -0
- package/dist/util/ReadCacheHelper.js.map +1 -0
- package/dist/util/SparqlUtil.d.ts +72 -0
- package/dist/util/SparqlUtil.d.ts.map +1 -0
- package/dist/util/SparqlUtil.js +456 -0
- package/dist/util/SparqlUtil.js.map +1 -0
- package/dist/util/TripleUtil.d.ts +10 -0
- package/dist/util/TripleUtil.d.ts.map +1 -0
- package/dist/util/TripleUtil.js +414 -0
- package/dist/util/TripleUtil.js.map +1 -0
- package/dist/util/Types.d.ts +271 -0
- package/dist/util/Types.d.ts.map +1 -0
- package/dist/util/Types.js +3 -0
- package/dist/util/Types.js.map +1 -0
- package/dist/util/Util.d.ts +26 -0
- package/dist/util/Util.d.ts.map +1 -0
- package/dist/util/Util.js +138 -0
- package/dist/util/Util.js.map +1 -0
- package/dist/util/Vocabularies/Shared.d.ts +13 -0
- package/dist/util/Vocabularies/Shared.d.ts.map +1 -0
- package/dist/util/Vocabularies/Shared.js +96 -0
- package/dist/util/Vocabularies/Shared.js.map +1 -0
- package/dist/util/Vocabularies/helper.d.ts +5 -0
- package/dist/util/Vocabularies/helper.d.ts.map +1 -0
- package/dist/util/Vocabularies/helper.js +10 -0
- package/dist/util/Vocabularies/helper.js.map +1 -0
- package/dist/util/Vocabularies/index.d.ts +8 -0
- package/dist/util/Vocabularies/index.d.ts.map +1 -0
- package/dist/util/Vocabularies/index.js +114 -0
- package/dist/util/Vocabularies/index.js.map +1 -0
- package/dist/util/safeJsonStringify.d.ts +1 -0
- package/dist/util/safeJsonStringify.d.ts.map +1 -0
- package/dist/util/safeJsonStringify.js +19 -0
- package/dist/util/safeJsonStringify.js.map +1 -0
- package/package.json +1 -1
- package/src/storage/query-adapter/sparql/SparqlUpdateBuilder.ts +106 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/JsExecutor/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,sBAAsB;AACtB,YAAY;AACZ,yCAA6E;AAApE,sHAAA,yBAAyB,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AACvD,gBAAgB;AAChB,mCAA4G;AAAnG,4GAAA,kBAAkB,OAAA;AAAE,+GAAA,qBAAqB,OAAA;AAAE,4GAAA,kBAAkB,OAAA;AAAE,2GAAA,iBAAiB,OAAA;AACzF,2CAA0C;AAAjC,wGAAA,UAAU,OAAA;AACnB,yCAAyC;AACzC,yDAAqF;AAA5E,yHAAA,oBAAoB,OAAA;AAAE,6HAAA,wBAAwB,OAAA;AACvD,8CAA4B","sourcesContent":["// Main executor class\n// Constants\nexport { DEFAULT_EXECUTION_OPTIONS, EXECUTION_CONSTANTS } from './constants';\n// Error classes\nexport { CodeExecutionError, ExecutionTimeoutError, OutputParsingError, ProcessSpawnError } from './errors';\nexport { JSExecutor } from './jsExecutor';\n// Utility functions (for advanced usage)\nexport { buildDenoPermissions, validatePermissionConfig } from './PermissionBuilder';\nexport * from './transport';\n// Types and interfaces\nexport type {\n ExecutionOptions,\n ExecutionResult,\n ExecutorInput,\n ExecutorOutput,\n PermissionConfig,\n ProcessCommunicationData\n} from './types';\n\n"]}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { TransportConfig } from './transport';
|
|
2
|
+
import type { ExecutionOptions, IShutdownOptions } from './types';
|
|
3
|
+
export declare type IJSCallbacks = Record<string, (...args: any[]) => any>;
|
|
4
|
+
/**
|
|
5
|
+
* JSExecutor V2 with enhanced abort control for immediate shutdown
|
|
6
|
+
*
|
|
7
|
+
* @example Writing abort-aware callbacks:
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const jsExecutor = new JSExecutorV2(scriptPath, {
|
|
10
|
+
* async myCallback(): Promise<string> {
|
|
11
|
+
* return new Promise((resolve, reject) => {
|
|
12
|
+
* const timeoutId = setTimeout(() => resolve('done'), 5000);
|
|
13
|
+
*
|
|
14
|
+
* // Listen to the global abort signal to clean up resources
|
|
15
|
+
* const abortSignal = JSExecutorV2.getGlobalAbortSignal();
|
|
16
|
+
* const onAbort = () => {
|
|
17
|
+
* clearTimeout(timeoutId);
|
|
18
|
+
* reject(new Error('Operation aborted'));
|
|
19
|
+
* };
|
|
20
|
+
*
|
|
21
|
+
* if (abortSignal.aborted) {
|
|
22
|
+
* onAbort();
|
|
23
|
+
* return;
|
|
24
|
+
* }
|
|
25
|
+
*
|
|
26
|
+
* abortSignal.addEventListener('abort', onAbort);
|
|
27
|
+
* });
|
|
28
|
+
* }
|
|
29
|
+
* });
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare class JSExecutor {
|
|
33
|
+
private readonly executorScriptPath;
|
|
34
|
+
private readonly callbacks;
|
|
35
|
+
private isInitialized;
|
|
36
|
+
private server?;
|
|
37
|
+
private transport?;
|
|
38
|
+
private readonly abortController;
|
|
39
|
+
private static readonly globalAbortController;
|
|
40
|
+
private shutdownTimeout?;
|
|
41
|
+
constructor(executorScriptPath: string, callbacks: Record<string, (...args: any[]) => any>);
|
|
42
|
+
/**
|
|
43
|
+
* Static method to check if any JSExecutor instance is being shut down
|
|
44
|
+
* Callbacks can use this to check if they should abort their operations
|
|
45
|
+
*/
|
|
46
|
+
static isShuttingDown(): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Get the global abort signal that callbacks can listen to
|
|
49
|
+
* This allows callbacks to immediately abort when any JSExecutor shuts down
|
|
50
|
+
*/
|
|
51
|
+
static getGlobalAbortSignal(): AbortSignal;
|
|
52
|
+
initialize(config?: TransportConfig, executionOptions?: ExecutionOptions): Promise<void>;
|
|
53
|
+
shutdown(options?: IShutdownOptions): Promise<void>;
|
|
54
|
+
private shutdownCore;
|
|
55
|
+
private rpcComplaintCallback;
|
|
56
|
+
/**
|
|
57
|
+
* Wrap a callback with abort functionality
|
|
58
|
+
* The callback will be automatically aborted if JSExecutor is shut down
|
|
59
|
+
*/
|
|
60
|
+
private wrapCallbackWithAbort;
|
|
61
|
+
execute(code: string, args: Record<string, any>, executionOptions: ExecutionOptions): Promise<any>;
|
|
62
|
+
/**
|
|
63
|
+
* Legacy method for backward compatibility
|
|
64
|
+
* @deprecated Use execute() instead
|
|
65
|
+
*/
|
|
66
|
+
call(methodName: string, ...args: any[]): Promise<any>;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=jsExecutor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsExecutor.d.ts","sourceRoot":"","sources":["../../src/JsExecutor/jsExecutor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAElE,oBAAY,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;AAEnE;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,UAAU;IASnB,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAT5B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAC,CAAgB;IAC/B,OAAO,CAAC,SAAS,CAAC,CAAuB;IACzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IACzD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAyB;IACtE,OAAO,CAAC,eAAe,CAAC,CAAiB;gBAGtB,kBAAkB,EAAE,MAAM,EAC1B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IAGrE;;;OAGG;WACW,cAAc,IAAI,OAAO;IAIvC;;;OAGG;WACW,oBAAoB,IAAI,WAAW;IAIpC,UAAU,CAAC,MAAM,CAAC,EAAE,eAAe,EAAE,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBxF,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;YAgBlD,YAAY;YAgBZ,oBAAoB;IAMlC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAqChB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC;IAwB/G;;;OAGG;IACU,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;CAMpE"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
3
|
+
/* eslint-disable callback-return */
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.JSExecutor = void 0;
|
|
6
|
+
const errors_1 = require("./errors");
|
|
7
|
+
const transport_1 = require("./transport");
|
|
8
|
+
/**
|
|
9
|
+
* JSExecutor V2 with enhanced abort control for immediate shutdown
|
|
10
|
+
*
|
|
11
|
+
* @example Writing abort-aware callbacks:
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const jsExecutor = new JSExecutorV2(scriptPath, {
|
|
14
|
+
* async myCallback(): Promise<string> {
|
|
15
|
+
* return new Promise((resolve, reject) => {
|
|
16
|
+
* const timeoutId = setTimeout(() => resolve('done'), 5000);
|
|
17
|
+
*
|
|
18
|
+
* // Listen to the global abort signal to clean up resources
|
|
19
|
+
* const abortSignal = JSExecutorV2.getGlobalAbortSignal();
|
|
20
|
+
* const onAbort = () => {
|
|
21
|
+
* clearTimeout(timeoutId);
|
|
22
|
+
* reject(new Error('Operation aborted'));
|
|
23
|
+
* };
|
|
24
|
+
*
|
|
25
|
+
* if (abortSignal.aborted) {
|
|
26
|
+
* onAbort();
|
|
27
|
+
* return;
|
|
28
|
+
* }
|
|
29
|
+
*
|
|
30
|
+
* abortSignal.addEventListener('abort', onAbort);
|
|
31
|
+
* });
|
|
32
|
+
* }
|
|
33
|
+
* });
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
class JSExecutor {
|
|
37
|
+
constructor(executorScriptPath, callbacks) {
|
|
38
|
+
this.executorScriptPath = executorScriptPath;
|
|
39
|
+
this.callbacks = callbacks;
|
|
40
|
+
this.isInitialized = false;
|
|
41
|
+
this.abortController = new AbortController();
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Static method to check if any JSExecutor instance is being shut down
|
|
45
|
+
* Callbacks can use this to check if they should abort their operations
|
|
46
|
+
*/
|
|
47
|
+
static isShuttingDown() {
|
|
48
|
+
return JSExecutor.globalAbortController.signal.aborted;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get the global abort signal that callbacks can listen to
|
|
52
|
+
* This allows callbacks to immediately abort when any JSExecutor shuts down
|
|
53
|
+
*/
|
|
54
|
+
static getGlobalAbortSignal() {
|
|
55
|
+
return JSExecutor.globalAbortController.signal;
|
|
56
|
+
}
|
|
57
|
+
async initialize(config, executionOptions) {
|
|
58
|
+
if (this.isInitialized) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this.server = new transport_1.JsonRpcServer({
|
|
62
|
+
// 1 hour
|
|
63
|
+
requestTimeout: 60 * 60 * 1000
|
|
64
|
+
});
|
|
65
|
+
// Register callbacks with the server
|
|
66
|
+
Object.entries(this.callbacks).forEach(([methodName, callback]) => {
|
|
67
|
+
this.server.registerMethod(methodName, this.wrapCallbackWithAbort(callback));
|
|
68
|
+
});
|
|
69
|
+
// Create and initialize the transport once
|
|
70
|
+
this.transport = new transport_1.ParentStdioTransport(this.executorScriptPath, this.server);
|
|
71
|
+
await this.transport.initialize(config, executionOptions);
|
|
72
|
+
this.isInitialized = true;
|
|
73
|
+
}
|
|
74
|
+
async shutdown(options) {
|
|
75
|
+
// Clear any existing shutdown timeout
|
|
76
|
+
if (this.shutdownTimeout) {
|
|
77
|
+
clearTimeout(this.shutdownTimeout);
|
|
78
|
+
this.shutdownTimeout = undefined;
|
|
79
|
+
}
|
|
80
|
+
if (options?.afterTimeout) {
|
|
81
|
+
this.shutdownTimeout = setTimeout(async () => {
|
|
82
|
+
await this.shutdownCore();
|
|
83
|
+
}, options.afterTimeout);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
await this.shutdownCore();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async shutdownCore() {
|
|
90
|
+
// // Signal global abort first
|
|
91
|
+
// JSExecutor.globalAbortController.abort();
|
|
92
|
+
// Then signal this instance's abort
|
|
93
|
+
this.abortController.abort();
|
|
94
|
+
if (this.transport) {
|
|
95
|
+
await this.transport.close();
|
|
96
|
+
this.transport = undefined;
|
|
97
|
+
}
|
|
98
|
+
this.isInitialized = false;
|
|
99
|
+
this.server = undefined;
|
|
100
|
+
}
|
|
101
|
+
async rpcComplaintCallback(callback, args) {
|
|
102
|
+
const result = await callback(...args);
|
|
103
|
+
// RPC expects a result object
|
|
104
|
+
return result ?? {};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Wrap a callback with abort functionality
|
|
108
|
+
* The callback will be automatically aborted if JSExecutor is shut down
|
|
109
|
+
*/
|
|
110
|
+
wrapCallbackWithAbort(callback) {
|
|
111
|
+
return ((...args) => {
|
|
112
|
+
// Check if we're shutting down before executing
|
|
113
|
+
if (this.abortController.signal.aborted || JSExecutor.globalAbortController.signal.aborted) {
|
|
114
|
+
return Promise.reject(new Error('JSExecutor is shutting down'));
|
|
115
|
+
}
|
|
116
|
+
const callbackPromise = Promise.resolve(this.rpcComplaintCallback(callback, args));
|
|
117
|
+
const instanceAbortSignal = this.abortController.signal;
|
|
118
|
+
const globalAbortSignal = JSExecutor.globalAbortController.signal;
|
|
119
|
+
let onAbort;
|
|
120
|
+
// Create an abort promise
|
|
121
|
+
const abortPromise = new Promise((_, reject) => {
|
|
122
|
+
onAbort = () => {
|
|
123
|
+
reject(new Error('JSExecutor is shutting down'));
|
|
124
|
+
};
|
|
125
|
+
// Listen to both instance and global abort signals
|
|
126
|
+
// NOTE: `{ once: true }` removes listeners only if abort fires. In normal request flow,
|
|
127
|
+
// abort rarely happens, so these listeners would otherwise accumulate per-call.
|
|
128
|
+
instanceAbortSignal.addEventListener('abort', onAbort, { once: true });
|
|
129
|
+
globalAbortSignal.addEventListener('abort', onAbort, { once: true });
|
|
130
|
+
});
|
|
131
|
+
// Race the callback against the abort signal
|
|
132
|
+
return Promise.race([callbackPromise, abortPromise]).finally(() => {
|
|
133
|
+
// If the callback completes, remove abort listeners to prevent a listener leak.
|
|
134
|
+
if (onAbort) {
|
|
135
|
+
instanceAbortSignal.removeEventListener('abort', onAbort);
|
|
136
|
+
globalAbortSignal.removeEventListener('abort', onAbort);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
async execute(code, args, executionOptions) {
|
|
142
|
+
if (!this.isInitialized) {
|
|
143
|
+
throw new errors_1.NotInitializedError('JSExecutor is not initialized, please call initialize() first');
|
|
144
|
+
}
|
|
145
|
+
if (!this.transport || !this.transport.isReady()) {
|
|
146
|
+
throw new Error('Transport is not ready');
|
|
147
|
+
}
|
|
148
|
+
const response = await this.transport.request(transport_1.STANDARD_METHODS.executeCode, {
|
|
149
|
+
code,
|
|
150
|
+
args,
|
|
151
|
+
functionName: executionOptions.functionName
|
|
152
|
+
}, {
|
|
153
|
+
timeout: executionOptions.timeout,
|
|
154
|
+
retries: executionOptions.retries ?? 0
|
|
155
|
+
});
|
|
156
|
+
return response;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Legacy method for backward compatibility
|
|
160
|
+
* @deprecated Use execute() instead
|
|
161
|
+
*/
|
|
162
|
+
async call(methodName, ...args) {
|
|
163
|
+
if (!this.transport || !this.transport.isReady()) {
|
|
164
|
+
throw new Error('Transport is not ready');
|
|
165
|
+
}
|
|
166
|
+
return this.transport.request(methodName, args);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
exports.JSExecutor = JSExecutor;
|
|
170
|
+
JSExecutor.globalAbortController = new AbortController();
|
|
171
|
+
//# 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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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\n/* eslint-disable callback-return */\n\n \n\nimport { NotInitializedError } from './errors';\nimport type { TransportConfig } from './transport';\nimport { JsonRpcServer, ParentStdioTransport, STANDARD_METHODS } from './transport';\nimport type { ExecutionOptions, IShutdownOptions } from './types';\n\nexport type IJSCallbacks = Record<string, (...args: any[]) => any>;\n\n/**\n * JSExecutor V2 with enhanced abort control for immediate shutdown\n *\n * @example Writing abort-aware callbacks:\n * ```typescript\n * const jsExecutor = new JSExecutorV2(scriptPath, {\n * async myCallback(): Promise<string> {\n * return new Promise((resolve, reject) => {\n * const timeoutId = setTimeout(() => resolve('done'), 5000);\n *\n * // Listen to the global abort signal to clean up resources\n * const abortSignal = JSExecutorV2.getGlobalAbortSignal();\n * const onAbort = () => {\n * clearTimeout(timeoutId);\n * reject(new Error('Operation aborted'));\n * };\n *\n * if (abortSignal.aborted) {\n * onAbort();\n * return;\n * }\n *\n * abortSignal.addEventListener('abort', onAbort);\n * });\n * }\n * });\n * ```\n */\nexport class JSExecutor {\n private isInitialized = false;\n private server?: JsonRpcServer;\n private transport?: ParentStdioTransport;\n private readonly abortController = new AbortController();\n private static readonly globalAbortController = new AbortController();\n private shutdownTimeout?: NodeJS.Timeout;\n\n public constructor(\n private readonly executorScriptPath: string,\n private readonly callbacks: Record<string, (...args: any[]) => any>\n ) {}\n\n /**\n * Static method to check if any JSExecutor instance is being shut down\n * Callbacks can use this to check if they should abort their operations\n */\n public static isShuttingDown(): boolean {\n return JSExecutor.globalAbortController.signal.aborted;\n }\n\n /**\n * Get the global abort signal that callbacks can listen to\n * This allows callbacks to immediately abort when any JSExecutor shuts down\n */\n public static getGlobalAbortSignal(): AbortSignal {\n return JSExecutor.globalAbortController.signal;\n }\n\n public async initialize(config?: TransportConfig, executionOptions?: ExecutionOptions): Promise<void> {\n if (this.isInitialized) {\n return;\n }\n\n this.server = new JsonRpcServer({\n // 1 hour\n requestTimeout: 60 * 60 * 1000\n });\n\n // Register callbacks with the server\n Object.entries(this.callbacks).forEach(([ methodName, callback ]) => {\n this.server!.registerMethod(methodName, this.wrapCallbackWithAbort(callback));\n });\n\n // Create and initialize the transport once\n this.transport = new ParentStdioTransport(this.executorScriptPath, this.server);\n\n await this.transport.initialize(config, executionOptions);\n\n this.isInitialized = true;\n }\n\n public async shutdown(options?: IShutdownOptions): Promise<void> {\n // Clear any existing shutdown timeout\n if (this.shutdownTimeout) {\n clearTimeout(this.shutdownTimeout);\n this.shutdownTimeout = undefined;\n }\n\n if (options?.afterTimeout) {\n this.shutdownTimeout = setTimeout(async() => {\n await this.shutdownCore();\n }, options.afterTimeout);\n } else {\n await this.shutdownCore();\n }\n }\n\n private async shutdownCore(): Promise<void> {\n // // Signal global abort first\n // JSExecutor.globalAbortController.abort();\n\n // Then signal this instance's abort\n this.abortController.abort();\n\n if (this.transport) {\n await this.transport.close();\n this.transport = undefined;\n }\n\n this.isInitialized = false;\n this.server = undefined;\n }\n\n private async rpcComplaintCallback(callback: (...args: any[]) => any, args: any[]): Promise<any> {\n const result = await callback(...args);\n // RPC expects a result object\n return result ?? {};\n }\n\n /**\n * Wrap a callback with abort functionality\n * The callback will be automatically aborted if JSExecutor is shut down\n */\n private wrapCallbackWithAbort<T extends (...args: any[]) => any>(callback: T): T {\n return ((...args: any[]) => {\n // Check if we're shutting down before executing\n if (this.abortController.signal.aborted || JSExecutor.globalAbortController.signal.aborted) {\n return Promise.reject(new Error('JSExecutor is shutting down'));\n }\n\n const callbackPromise = Promise.resolve(this.rpcComplaintCallback(callback, args));\n\n const instanceAbortSignal = this.abortController.signal;\n const globalAbortSignal = JSExecutor.globalAbortController.signal;\n let onAbort: (() => void) | undefined;\n\n // Create an abort promise\n const abortPromise = new Promise((_, reject) => {\n onAbort = (): void => {\n reject(new Error('JSExecutor is shutting down'));\n };\n\n // Listen to both instance and global abort signals\n // NOTE: `{ once: true }` removes listeners only if abort fires. In normal request flow,\n // abort rarely happens, so these listeners would otherwise accumulate per-call.\n instanceAbortSignal.addEventListener('abort', onAbort, { once: true });\n globalAbortSignal.addEventListener('abort', onAbort, { once: true });\n });\n\n // Race the callback against the abort signal\n return Promise.race([ callbackPromise, abortPromise ]).finally(() => {\n // If the callback completes, remove abort listeners to prevent a listener leak.\n if (onAbort) {\n instanceAbortSignal.removeEventListener('abort', onAbort);\n globalAbortSignal.removeEventListener('abort', onAbort);\n }\n });\n }) as T;\n }\n\n public async execute(code: string, args: Record<string, any>, executionOptions: ExecutionOptions): Promise<any> {\n if (!this.isInitialized) {\n throw new NotInitializedError('JSExecutor is not initialized, please call initialize() first');\n }\n\n if (!this.transport || !this.transport.isReady()) {\n throw new Error('Transport is not ready');\n }\n\n const response = await this.transport.request(\n STANDARD_METHODS.executeCode,\n {\n code,\n args,\n functionName: executionOptions.functionName\n },\n {\n timeout: executionOptions.timeout,\n retries: executionOptions.retries ?? 0\n }\n );\n return response;\n }\n\n /**\n * Legacy method for backward compatibility\n * @deprecated Use execute() instead\n */\n public async call(methodName: string, ...args: any[]): Promise<any> {\n if (!this.transport || !this.transport.isReady()) {\n throw new Error('Transport is not ready');\n }\n return this.transport.request(methodName, args);\n }\n}\n"]}
|
|
@@ -0,0 +1,165 @@
|
|
|
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
|
+
}
|
|
165
|
+
//# sourceMappingURL=JsonRpcClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsonRpcClient.d.ts","sourceRoot":"","sources":["../../../src/JsExecutor/jsonRpc/JsonRpcClient.ts"],"names":[],"mappings":"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"}
|