@adminide-stack/extension-api 0.0.2-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +39 -0
- package/README.md +9 -0
- package/lib/connections/jsonrpc2/connection.d.ts +55 -0
- package/lib/connections/jsonrpc2/connection.js +575 -0
- package/lib/connections/jsonrpc2/connection.js.map +1 -0
- package/lib/connections/jsonrpc2/connection.test.d.ts +1 -0
- package/lib/connections/jsonrpc2/connection.test.js +443 -0
- package/lib/connections/jsonrpc2/connection.test.js.map +1 -0
- package/lib/connections/jsonrpc2/events.d.ts +24 -0
- package/lib/connections/jsonrpc2/events.js +117 -0
- package/lib/connections/jsonrpc2/events.js.map +1 -0
- package/lib/connections/jsonrpc2/index.d.ts +5 -0
- package/lib/connections/jsonrpc2/index.js +24 -0
- package/lib/connections/jsonrpc2/index.js.map +1 -0
- package/lib/connections/jsonrpc2/linkedMap.d.ts +29 -0
- package/lib/connections/jsonrpc2/linkedMap.js +254 -0
- package/lib/connections/jsonrpc2/linkedMap.js.map +1 -0
- package/lib/connections/jsonrpc2/linkedMap.test.d.ts +1 -0
- package/lib/connections/jsonrpc2/linkedMap.test.js +62 -0
- package/lib/connections/jsonrpc2/linkedMap.test.js.map +1 -0
- package/lib/connections/jsonrpc2/messages.d.ts +117 -0
- package/lib/connections/jsonrpc2/messages.js +72 -0
- package/lib/connections/jsonrpc2/messages.js.map +1 -0
- package/lib/connections/jsonrpc2/test-helper.d.ts +8 -0
- package/lib/connections/jsonrpc2/test-helper.js +36 -0
- package/lib/connections/jsonrpc2/test-helper.js.map +1 -0
- package/lib/connections/jsonrpc2/trace.d.ts +30 -0
- package/lib/connections/jsonrpc2/trace.js +96 -0
- package/lib/connections/jsonrpc2/trace.js.map +1 -0
- package/lib/connections/jsonrpc2/transport.d.ts +36 -0
- package/lib/connections/jsonrpc2/transport.js +66 -0
- package/lib/connections/jsonrpc2/transport.js.map +1 -0
- package/lib/connections/jsonrpc2/transports/browser-websocket.d.ts +0 -0
- package/lib/connections/jsonrpc2/transports/browser-websocket.js +189 -0
- package/lib/connections/jsonrpc2/transports/browser-websocket.js.map +1 -0
- package/lib/connections/jsonrpc2/transports/merged.d.ts +0 -0
- package/lib/connections/jsonrpc2/transports/merged.js +239 -0
- package/lib/connections/jsonrpc2/transports/merged.js.map +1 -0
- package/lib/connections/jsonrpc2/transports/webSocket.d.ts +0 -0
- package/lib/connections/jsonrpc2/transports/webSocket.js +138 -0
- package/lib/connections/jsonrpc2/transports/webSocket.js.map +1 -0
- package/lib/connections/jsonrpc2/transports/webWorker.d.ts +22 -0
- package/lib/connections/jsonrpc2/transports/webWorker.js +111 -0
- package/lib/connections/jsonrpc2/transports/webWorker.js.map +1 -0
- package/lib/connections/proxy/index.d.ts +1 -0
- package/lib/connections/proxy/index.js +18 -0
- package/lib/connections/proxy/index.js.map +1 -0
- package/lib/connections/proxy/proxy.d.ts +49 -0
- package/lib/connections/proxy/proxy.js +108 -0
- package/lib/connections/proxy/proxy.js.map +1 -0
- package/lib/connections/proxy/proxy.test.d.ts +1 -0
- package/lib/connections/proxy/proxy.test.js +55 -0
- package/lib/connections/proxy/proxy.test.js.map +1 -0
- package/lib/connections/remote-rpc/browser-remote-rpc.d.ts +12 -0
- package/lib/connections/remote-rpc/browser-remote-rpc.js +62 -0
- package/lib/connections/remote-rpc/browser-remote-rpc.js.map +1 -0
- package/lib/connections/remote-rpc/browser-server-rpc.test.d.ts +0 -0
- package/lib/connections/remote-rpc/browser-server-rpc.test.js +317 -0
- package/lib/connections/remote-rpc/browser-server-rpc.test.js.map +1 -0
- package/lib/connections/remote-rpc/index.d.ts +1 -0
- package/lib/connections/remote-rpc/index.js +18 -0
- package/lib/connections/remote-rpc/index.js.map +1 -0
- package/lib/connections/remote-rpc/old-browser-remote-rpc.d.ts +12 -0
- package/lib/connections/remote-rpc/old-browser-remote-rpc.js +41 -0
- package/lib/connections/remote-rpc/old-browser-remote-rpc.js.map +1 -0
- package/lib/connections/remote-rpc/rxjs-websockets.d.ts +18 -0
- package/lib/connections/remote-rpc/rxjs-websockets.js +80 -0
- package/lib/connections/remote-rpc/rxjs-websockets.js.map +1 -0
- package/lib/constants/action-types.d.ts +30 -0
- package/lib/constants/action-types.js +38 -0
- package/lib/constants/action-types.js.map +1 -0
- package/lib/constants/index.d.ts +2 -0
- package/lib/constants/index.js +19 -0
- package/lib/constants/index.js.map +1 -0
- package/lib/constants/types.d.ts +8 -0
- package/lib/constants/types.js +12 -0
- package/lib/constants/types.js.map +1 -0
- package/lib/core/expr/evaluator.d.ts +27 -0
- package/lib/core/expr/evaluator.js +144 -0
- package/lib/core/expr/evaluator.js.map +1 -0
- package/lib/core/expr/evaluator.test.d.ts +1 -0
- package/lib/core/expr/evaluator.test.js +52 -0
- package/lib/core/expr/evaluator.test.js.map +1 -0
- package/lib/core/expr/index.d.ts +3 -0
- package/lib/core/expr/index.js +20 -0
- package/lib/core/expr/index.js.map +1 -0
- package/lib/core/expr/lexer.d.ts +114 -0
- package/lib/core/expr/lexer.js +418 -0
- package/lib/core/expr/lexer.js.map +1 -0
- package/lib/core/expr/parser.d.ts +52 -0
- package/lib/core/expr/parser.js +242 -0
- package/lib/core/expr/parser.js.map +1 -0
- package/lib/core/index.d.ts +2 -0
- package/lib/core/index.js +19 -0
- package/lib/core/index.js.map +1 -0
- package/lib/core/types/ext-host-types-bk.d.ts +0 -0
- package/lib/core/types/ext-host-types-bk.js +1275 -0
- package/lib/core/types/ext-host-types-bk.js.map +1 -0
- package/lib/core/types/ext-host-types.d.ts +32 -0
- package/lib/core/types/ext-host-types.js +71 -0
- package/lib/core/types/ext-host-types.js.map +1 -0
- package/lib/core/types/index.d.ts +1 -0
- package/lib/core/types/index.js +18 -0
- package/lib/core/types/index.js.map +1 -0
- package/lib/errors/errors.d.ts +1 -0
- package/lib/errors/errors.js +13 -0
- package/lib/errors/errors.js.map +1 -0
- package/lib/errors/index.d.ts +1 -0
- package/lib/errors/index.js +18 -0
- package/lib/errors/index.js.map +1 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.js +24 -0
- package/lib/index.js.map +1 -0
- package/lib/interfaces/command.d.ts +28 -0
- package/lib/interfaces/command.js +3 -0
- package/lib/interfaces/command.js.map +1 -0
- package/lib/interfaces/configuration.d.ts +36 -0
- package/lib/interfaces/configuration.js +3 -0
- package/lib/interfaces/configuration.js.map +1 -0
- package/lib/interfaces/connection.d.ts +12 -0
- package/lib/interfaces/connection.js +3 -0
- package/lib/interfaces/connection.js.map +1 -0
- package/lib/interfaces/context.d.ts +12 -0
- package/lib/interfaces/context.js +3 -0
- package/lib/interfaces/context.js.map +1 -0
- package/lib/interfaces/contributions/contribution-service.d.ts +20 -0
- package/lib/interfaces/contributions/contribution-service.js +3 -0
- package/lib/interfaces/contributions/contribution-service.js.map +1 -0
- package/lib/interfaces/contributions/contribution.d.ts +383 -0
- package/lib/interfaces/contributions/contribution.js +49 -0
- package/lib/interfaces/contributions/contribution.js.map +1 -0
- package/lib/interfaces/contributions/index.d.ts +2 -0
- package/lib/interfaces/contributions/index.js +19 -0
- package/lib/interfaces/contributions/index.js.map +1 -0
- package/lib/interfaces/controller.d.ts +30 -0
- package/lib/interfaces/controller.js +3 -0
- package/lib/interfaces/controller.js.map +1 -0
- package/lib/interfaces/errors.d.ts +5 -0
- package/lib/interfaces/errors.js +3 -0
- package/lib/interfaces/errors.js.map +1 -0
- package/lib/interfaces/ext-services/contributon-registry.d.ts +45 -0
- package/lib/interfaces/ext-services/contributon-registry.js +3 -0
- package/lib/interfaces/ext-services/contributon-registry.js.map +1 -0
- package/lib/interfaces/ext-services/ext-services.d.ts +23 -0
- package/lib/interfaces/ext-services/ext-services.js +3 -0
- package/lib/interfaces/ext-services/ext-services.js.map +1 -0
- package/lib/interfaces/ext-services/extension-service.d.ts +8 -0
- package/lib/interfaces/ext-services/extension-service.js +3 -0
- package/lib/interfaces/ext-services/extension-service.js.map +1 -0
- package/lib/interfaces/ext-services/index.d.ts +8 -0
- package/lib/interfaces/ext-services/index.js +25 -0
- package/lib/interfaces/ext-services/index.js.map +1 -0
- package/lib/interfaces/ext-services/model-service.d.ts +89 -0
- package/lib/interfaces/ext-services/model-service.js +3 -0
- package/lib/interfaces/ext-services/model-service.js.map +1 -0
- package/lib/interfaces/ext-services/panel-view-registry.d.ts +21 -0
- package/lib/interfaces/ext-services/panel-view-registry.js +3 -0
- package/lib/interfaces/ext-services/panel-view-registry.js.map +1 -0
- package/lib/interfaces/ext-services/settings-service.d.ts +18 -0
- package/lib/interfaces/ext-services/settings-service.js +3 -0
- package/lib/interfaces/ext-services/settings-service.js.map +1 -0
- package/lib/interfaces/ext-services/view-service.d.ts +65 -0
- package/lib/interfaces/ext-services/view-service.js +4 -0
- package/lib/interfaces/ext-services/view-service.js.map +1 -0
- package/lib/interfaces/ext-services/viewer-service.d.ts +125 -0
- package/lib/interfaces/ext-services/viewer-service.js +5 -0
- package/lib/interfaces/ext-services/viewer-service.js.map +1 -0
- package/lib/interfaces/extension-manifest.d.ts +8 -0
- package/lib/interfaces/extension-manifest.js +3 -0
- package/lib/interfaces/extension-manifest.js.map +1 -0
- package/lib/interfaces/extension.d.ts +72 -0
- package/lib/interfaces/extension.js +3 -0
- package/lib/interfaces/extension.js.map +1 -0
- package/lib/interfaces/generated-models.d.ts +3716 -0
- package/lib/interfaces/generated-models.js +648 -0
- package/lib/interfaces/generated-models.js.map +1 -0
- package/lib/interfaces/graphql.d.ts +17 -0
- package/lib/interfaces/graphql.js +5 -0
- package/lib/interfaces/graphql.js.map +1 -0
- package/lib/interfaces/index.d.ts +21 -0
- package/lib/interfaces/index.js +38 -0
- package/lib/interfaces/index.js.map +1 -0
- package/lib/interfaces/languages-types.d.ts +65 -0
- package/lib/interfaces/languages-types.js +3 -0
- package/lib/interfaces/languages-types.js.map +1 -0
- package/lib/interfaces/model.d.ts +51 -0
- package/lib/interfaces/model.js +9 -0
- package/lib/interfaces/model.js.map +1 -0
- package/lib/interfaces/plain-types.d.ts +4 -0
- package/lib/interfaces/plain-types.js +6 -0
- package/lib/interfaces/plain-types.js.map +1 -0
- package/lib/interfaces/plainTypes.d.ts +68 -0
- package/lib/interfaces/plainTypes.js +3 -0
- package/lib/interfaces/plainTypes.js.map +1 -0
- package/lib/interfaces/platform-context.d.ts +82 -0
- package/lib/interfaces/platform-context.js +3 -0
- package/lib/interfaces/platform-context.js.map +1 -0
- package/lib/interfaces/react-props/action-item.d.ts +20 -0
- package/lib/interfaces/react-props/action-item.js +3 -0
- package/lib/interfaces/react-props/action-item.js.map +1 -0
- package/lib/interfaces/react-props/extension-controller.d.ts +11 -0
- package/lib/interfaces/react-props/extension-controller.js +3 -0
- package/lib/interfaces/react-props/extension-controller.js.map +1 -0
- package/lib/interfaces/react-props/index.d.ts +3 -0
- package/lib/interfaces/react-props/index.js +20 -0
- package/lib/interfaces/react-props/index.js.map +1 -0
- package/lib/interfaces/react-props/platform-context.d.ts +7 -0
- package/lib/interfaces/react-props/platform-context.js +3 -0
- package/lib/interfaces/react-props/platform-context.js.map +1 -0
- package/lib/interfaces/registry-extension.d.ts +21 -0
- package/lib/interfaces/registry-extension.js +3 -0
- package/lib/interfaces/registry-extension.js.map +1 -0
- package/lib/interfaces/settings.d.ts +51 -0
- package/lib/interfaces/settings.js +3 -0
- package/lib/interfaces/settings.js.map +1 -0
- package/lib/interfaces/text-document.d.ts +57 -0
- package/lib/interfaces/text-document.js +119 -0
- package/lib/interfaces/text-document.js.map +1 -0
- package/lib/interfaces/webview/index.d.ts +3 -0
- package/lib/interfaces/webview/index.js +20 -0
- package/lib/interfaces/webview/index.js.map +1 -0
- package/lib/interfaces/webview/webview-manager-service.d.ts +22 -0
- package/lib/interfaces/webview/webview-manager-service.js +3 -0
- package/lib/interfaces/webview/webview-manager-service.js.map +1 -0
- package/lib/interfaces/webview/webview-port-mapping.d.ts +4 -0
- package/lib/interfaces/webview/webview-port-mapping.js +3 -0
- package/lib/interfaces/webview/webview-port-mapping.js.map +1 -0
- package/lib/interfaces/webview/webview.d.ts +99 -0
- package/lib/interfaces/webview/webview.js +9 -0
- package/lib/interfaces/webview/webview.js.map +1 -0
- package/lib/main.d.ts +0 -0
- package/lib/main.js +3 -0
- package/lib/main.js.map +1 -0
- package/lib/protocol/client.protocol.d.ts +99 -0
- package/lib/protocol/client.protocol.js +8 -0
- package/lib/protocol/client.protocol.js.map +1 -0
- package/lib/protocol/common.protocol.d.ts +289 -0
- package/lib/protocol/common.protocol.js +68 -0
- package/lib/protocol/common.protocol.js.map +1 -0
- package/lib/protocol/editor-missing-types.d.ts +87 -0
- package/lib/protocol/editor-missing-types.js +10 -0
- package/lib/protocol/editor-missing-types.js.map +1 -0
- package/lib/protocol/index.d.ts +6 -0
- package/lib/protocol/index.js +24 -0
- package/lib/protocol/index.js.map +1 -0
- package/lib/protocol/proxy-identifier.d.ts +51 -0
- package/lib/protocol/proxy-identifier.js +59 -0
- package/lib/protocol/proxy-identifier.js.map +1 -0
- package/lib/protocol/rpc-logger.d.ts +8 -0
- package/lib/protocol/rpc-logger.js +60 -0
- package/lib/protocol/rpc-logger.js.map +1 -0
- package/lib/protocol/rpc-protocol.d.ts +148 -0
- package/lib/protocol/rpc-protocol.js +750 -0
- package/lib/protocol/rpc-protocol.js.map +1 -0
- package/lib/protocol/rpc-protocol.test.d.ts +1 -0
- package/lib/protocol/rpc-protocol.test.js +171 -0
- package/lib/protocol/rpc-protocol.test.js.map +1 -0
- package/lib/protocol/server.protocol-bk.d.ts +0 -0
- package/lib/protocol/server.protocol-bk.js +719 -0
- package/lib/protocol/server.protocol-bk.js.map +1 -0
- package/lib/protocol/server.protocol.d.ts +91 -0
- package/lib/protocol/server.protocol.js +31 -0
- package/lib/protocol/server.protocol.js.map +1 -0
- package/lib/protocol/shared/editor.d.ts +4 -0
- package/lib/protocol/shared/editor.js +28 -0
- package/lib/protocol/shared/editor.js.map +1 -0
- package/lib/protocol/shared/tasks.d.ts +104 -0
- package/lib/protocol/shared/tasks.js +4 -0
- package/lib/protocol/shared/tasks.js.map +1 -0
- package/lib/protocol/temporary-types.d.ts +198 -0
- package/lib/protocol/temporary-types.js +30 -0
- package/lib/protocol/temporary-types.js.map +1 -0
- package/lib/protocol/utils/index.d.ts +1 -0
- package/lib/protocol/utils/index.js +18 -0
- package/lib/protocol/utils/index.js.map +1 -0
- package/lib/protocol/utils/lazy-promise.d.ts +18 -0
- package/lib/protocol/utils/lazy-promise.js +69 -0
- package/lib/protocol/utils/lazy-promise.js.map +1 -0
- package/lib/utils/errors.d.ts +6 -0
- package/lib/utils/errors.js +19 -0
- package/lib/utils/errors.js.map +1 -0
- package/lib/utils/extensions.d.ts +9 -0
- package/lib/utils/extensions.js +25 -0
- package/lib/utils/extensions.js.map +1 -0
- package/lib/utils/helper.test.d.ts +9 -0
- package/lib/utils/helper.test.js +15 -0
- package/lib/utils/helper.test.js.map +1 -0
- package/lib/utils/index.d.ts +7 -0
- package/lib/utils/index.js +25 -0
- package/lib/utils/index.js.map +1 -0
- package/lib/utils/paths-util.d.ts +27 -0
- package/lib/utils/paths-util.js +127 -0
- package/lib/utils/paths-util.js.map +1 -0
- package/lib/utils/rxjs/combineLatestOrDefault.d.ts +28 -0
- package/lib/utils/rxjs/combineLatestOrDefault.js +111 -0
- package/lib/utils/rxjs/combineLatestOrDefault.js.map +1 -0
- package/lib/utils/rxjs/combineLatestOrDefault.test.d.ts +1 -0
- package/lib/utils/rxjs/combineLatestOrDefault.test.js +52 -0
- package/lib/utils/rxjs/combineLatestOrDefault.test.js.map +1 -0
- package/lib/utils/rxjs/index.d.ts +1 -0
- package/lib/utils/rxjs/index.js +18 -0
- package/lib/utils/rxjs/index.js.map +1 -0
- package/lib/utils/util.d.ts +19 -0
- package/lib/utils/util.js +57 -0
- package/lib/utils/util.js.map +1 -0
- package/lib/worker-lib/MessageTypes.d.ts +5 -0
- package/lib/worker-lib/MessageTypes.js +9 -0
- package/lib/worker-lib/MessageTypes.js.map +1 -0
- package/lib/worker-lib/index.d.ts +2 -0
- package/lib/worker-lib/index.js +19 -0
- package/lib/worker-lib/index.js.map +1 -0
- package/lib/worker-lib/webWorkerLink.d.ts +12 -0
- package/lib/worker-lib/webWorkerLink.js +96 -0
- package/lib/worker-lib/webWorkerLink.js.map +1 -0
- package/lib/worker-lib/workerUtils.d.ts +11 -0
- package/lib/worker-lib/workerUtils.js +178 -0
- package/lib/worker-lib/workerUtils.js.map +1 -0
- package/package.json +60 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
The CDEBase Enterprise license (the “Enterprise License”)
|
|
2
|
+
Copyright (c) 2018 cdebase LLC.
|
|
3
|
+
|
|
4
|
+
With regard to the CDEBase Software:
|
|
5
|
+
|
|
6
|
+
This software and associated documentation files (the "Software") may only be
|
|
7
|
+
used in production, if you (and any entity that you represent) have agreed to,
|
|
8
|
+
and are in compliance with, the CDEBase Terms of Service, available
|
|
9
|
+
at https://about.cdebase.com/terms (the “Enterprise Terms”), or other
|
|
10
|
+
agreement governing the use of the Software, as agreed by you and CDEBase,
|
|
11
|
+
and otherwise have a valid CDEBase Enterprise subscription for the
|
|
12
|
+
correct number of user seats. Subject to the foregoing sentence, you are free to
|
|
13
|
+
modify this Software and publish patches to the Software. You agree that CDEBase
|
|
14
|
+
and/or its licensors (as applicable) retain all right, title and interest in and
|
|
15
|
+
to all such modifications and/or patches, and all such modifications and/or
|
|
16
|
+
patches may only be used, copied, modified, displayed, distributed, or otherwise
|
|
17
|
+
exploited with a valid CDEBase Enterprise subscription for the correct
|
|
18
|
+
number of user seats. Notwithstanding the foregoing, you may copy and modify
|
|
19
|
+
the Software for development and testing purposes, without requiring a
|
|
20
|
+
subscription. You agree that CDEBase and/or its licensors (as applicable) retain
|
|
21
|
+
all right, title and interest in and to all such modifications. You are not
|
|
22
|
+
granted any other rights beyond what is expressly stated herein. Subject to the
|
|
23
|
+
foregoing, it is forbidden to copy, merge, publish, distribute, sublicense,
|
|
24
|
+
and/or sell the Software.
|
|
25
|
+
|
|
26
|
+
The full text of this Enterprise License shall be included in all copies or
|
|
27
|
+
substantial portions of the Software.
|
|
28
|
+
|
|
29
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
30
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
31
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
32
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
33
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
34
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
35
|
+
SOFTWARE.
|
|
36
|
+
|
|
37
|
+
For all third party components incorporated into the CDEBase Software, those
|
|
38
|
+
components are licensed under the original license provided by the owner of the
|
|
39
|
+
applicable component.
|
package/README.md
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Observable, Unsubscribable } from 'rxjs';
|
|
2
|
+
import { Event } from './events';
|
|
3
|
+
import { Message, NotificationMessage, ResponseError } from './messages';
|
|
4
|
+
import { Tracer } from './trace';
|
|
5
|
+
import { MessageReader, MessageWriter } from './transport';
|
|
6
|
+
export interface Logger {
|
|
7
|
+
error(message: string): void;
|
|
8
|
+
warn(message: string): void;
|
|
9
|
+
info(message: string): void;
|
|
10
|
+
log(message: string): void;
|
|
11
|
+
}
|
|
12
|
+
export declare enum ConnectionErrors {
|
|
13
|
+
/**
|
|
14
|
+
* The connection is closed.
|
|
15
|
+
*/
|
|
16
|
+
Closed = 1,
|
|
17
|
+
/**
|
|
18
|
+
* The connection got unsubscribed (i.e., disposed).
|
|
19
|
+
*/
|
|
20
|
+
Unsubscribed = 2,
|
|
21
|
+
/**
|
|
22
|
+
* The connection is already in listening mode.
|
|
23
|
+
*/
|
|
24
|
+
AlreadyListening = 3
|
|
25
|
+
}
|
|
26
|
+
export declare class ConnectionError extends Error {
|
|
27
|
+
readonly code: ConnectionErrors;
|
|
28
|
+
constructor(code: ConnectionErrors, message: string);
|
|
29
|
+
}
|
|
30
|
+
declare type HandlerResult<R, E> = R | ResponseError<E> | Promise<R> | Promise<ResponseError<E>> | Promise<R | ResponseError<E>> | Observable<R>;
|
|
31
|
+
declare type StarRequestHandler = (method: string, params?: any, signal?: AbortSignal) => HandlerResult<any, any>;
|
|
32
|
+
declare type GenericRequestHandler<R, E> = (params?: any, signal?: AbortSignal, methodName?: string) => HandlerResult<R, E>;
|
|
33
|
+
declare type StarNotificationHandler = (method: string, params?: any) => void;
|
|
34
|
+
declare type GenericNotificationHandler = (params: any) => void;
|
|
35
|
+
export interface Connection extends Unsubscribable {
|
|
36
|
+
sendRequest<R>(method: string, params?: any[], signal?: AbortSignal, toSecondary?: boolean): Promise<R>;
|
|
37
|
+
observeRequest<R>(method: string, params?: any[]): Observable<R>;
|
|
38
|
+
onRequest<R, E>(method: string, handler: GenericRequestHandler<R, E>): void;
|
|
39
|
+
onRequest(handler: StarRequestHandler): void;
|
|
40
|
+
sendNotification(method: string, params?: any[], toSecondary?: boolean): void;
|
|
41
|
+
onNotification(method: string, handler: GenericNotificationHandler): void;
|
|
42
|
+
onNotification(handler: StarNotificationHandler): void;
|
|
43
|
+
trace(tracer: Tracer | null): void;
|
|
44
|
+
onError: Event<[Error, Message | undefined, number | undefined]>;
|
|
45
|
+
onClose: Event<void>;
|
|
46
|
+
onUnhandledNotification: Event<NotificationMessage>;
|
|
47
|
+
listen(): void;
|
|
48
|
+
onUnsubscribe: Event<void>;
|
|
49
|
+
}
|
|
50
|
+
export interface MessageTransports {
|
|
51
|
+
reader: MessageReader;
|
|
52
|
+
writer: MessageWriter;
|
|
53
|
+
}
|
|
54
|
+
export declare function createConnection(transports: MessageTransports, logger?: Logger): Connection;
|
|
55
|
+
export {};
|
|
@@ -0,0 +1,575 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createConnection = exports.ConnectionError = exports.ConnectionErrors = void 0;
|
|
4
|
+
const abortable_rx_1 = require("abortable-rx");
|
|
5
|
+
const rxjs_1 = require("rxjs");
|
|
6
|
+
const utils_1 = require("../../utils");
|
|
7
|
+
const events_1 = require("./events");
|
|
8
|
+
const linkedMap_1 = require("./linkedMap");
|
|
9
|
+
const abort_controller_1 = require("abort-controller");
|
|
10
|
+
const messages_1 = require("./messages");
|
|
11
|
+
const trace_1 = require("./trace");
|
|
12
|
+
const NullLogger = Object.freeze({
|
|
13
|
+
error: () => {
|
|
14
|
+
/* noop */
|
|
15
|
+
},
|
|
16
|
+
warn: () => {
|
|
17
|
+
/* noop */
|
|
18
|
+
},
|
|
19
|
+
info: () => {
|
|
20
|
+
/* noop */
|
|
21
|
+
},
|
|
22
|
+
log: () => {
|
|
23
|
+
/* noop */
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
var ConnectionErrors;
|
|
27
|
+
(function (ConnectionErrors) {
|
|
28
|
+
/**
|
|
29
|
+
* The connection is closed.
|
|
30
|
+
*/
|
|
31
|
+
ConnectionErrors[ConnectionErrors["Closed"] = 1] = "Closed";
|
|
32
|
+
/**
|
|
33
|
+
* The connection got unsubscribed (i.e., disposed).
|
|
34
|
+
*/
|
|
35
|
+
ConnectionErrors[ConnectionErrors["Unsubscribed"] = 2] = "Unsubscribed";
|
|
36
|
+
/**
|
|
37
|
+
* The connection is already in listening mode.
|
|
38
|
+
*/
|
|
39
|
+
ConnectionErrors[ConnectionErrors["AlreadyListening"] = 3] = "AlreadyListening";
|
|
40
|
+
})(ConnectionErrors = exports.ConnectionErrors || (exports.ConnectionErrors = {}));
|
|
41
|
+
class ConnectionError extends Error {
|
|
42
|
+
constructor(code, message) {
|
|
43
|
+
super(message);
|
|
44
|
+
this.code = code;
|
|
45
|
+
Object.setPrototypeOf(this, ConnectionError.prototype);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.ConnectionError = ConnectionError;
|
|
49
|
+
function createConnection(transports, logger) {
|
|
50
|
+
if (!logger) {
|
|
51
|
+
logger = NullLogger;
|
|
52
|
+
}
|
|
53
|
+
return _createConnection(transports, logger);
|
|
54
|
+
}
|
|
55
|
+
exports.createConnection = createConnection;
|
|
56
|
+
var ConnectionState;
|
|
57
|
+
(function (ConnectionState) {
|
|
58
|
+
ConnectionState[ConnectionState["New"] = 1] = "New";
|
|
59
|
+
ConnectionState[ConnectionState["Listening"] = 2] = "Listening";
|
|
60
|
+
ConnectionState[ConnectionState["Closed"] = 3] = "Closed";
|
|
61
|
+
ConnectionState[ConnectionState["Unsubscribed"] = 4] = "Unsubscribed";
|
|
62
|
+
})(ConnectionState || (ConnectionState = {}));
|
|
63
|
+
const ABORT_REQUEST_METHOD = '$/abortRequest';
|
|
64
|
+
function _createConnection(transports, logger) {
|
|
65
|
+
let sequenceNumber = 0;
|
|
66
|
+
let notificationSquenceNumber = 0;
|
|
67
|
+
let unknownResponseSquenceNumber = 0;
|
|
68
|
+
const version = '2.0';
|
|
69
|
+
let starRequestHandler;
|
|
70
|
+
const requestHandlers = Object.create(null);
|
|
71
|
+
let starNotificationHandler;
|
|
72
|
+
const notificationHandlers = Object.create(null);
|
|
73
|
+
let timer = false;
|
|
74
|
+
let messageQueue = new linkedMap_1.LinkedMap();
|
|
75
|
+
let responseObservables = Object.create(null);
|
|
76
|
+
let requestAbortControllers = Object.create(null);
|
|
77
|
+
let tracer = trace_1.noopTracer;
|
|
78
|
+
let state = ConnectionState.New;
|
|
79
|
+
const errorEmitter = new events_1.Emitter();
|
|
80
|
+
const closeEmitter = new events_1.Emitter();
|
|
81
|
+
const unhandledNotificationEmitter = new events_1.Emitter();
|
|
82
|
+
const unsubscribeEmitter = new events_1.Emitter();
|
|
83
|
+
function createRequestQueueKey(id) {
|
|
84
|
+
return 'req-' + id.toString();
|
|
85
|
+
}
|
|
86
|
+
function createResponseQueueKey(id) {
|
|
87
|
+
if (id === null) {
|
|
88
|
+
return 'res-unknown-' + (++unknownResponseSquenceNumber).toString();
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
return 'res-' + id.toString();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function createNotificationQueueKey() {
|
|
95
|
+
return 'not-' + (++notificationSquenceNumber).toString();
|
|
96
|
+
}
|
|
97
|
+
function addMessageToQueue(queue, message) {
|
|
98
|
+
if ((0, messages_1.isRequestMessage)(message)) {
|
|
99
|
+
queue.set(createRequestQueueKey(message.id), message);
|
|
100
|
+
}
|
|
101
|
+
else if ((0, messages_1.isResponseMessage)(message)) {
|
|
102
|
+
const key = createResponseQueueKey(message.id) + Math.random(); // TODO(sqs)
|
|
103
|
+
queue.set(key, message);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
queue.set(createNotificationQueueKey(), message);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function isListening() {
|
|
110
|
+
return state === ConnectionState.Listening;
|
|
111
|
+
}
|
|
112
|
+
function isClosed() {
|
|
113
|
+
return state === ConnectionState.Closed;
|
|
114
|
+
}
|
|
115
|
+
function isUnsubscribed() {
|
|
116
|
+
return state === ConnectionState.Unsubscribed;
|
|
117
|
+
}
|
|
118
|
+
function closeHandler() {
|
|
119
|
+
if (state === ConnectionState.New || state === ConnectionState.Listening) {
|
|
120
|
+
state = ConnectionState.Closed;
|
|
121
|
+
closeEmitter.fire(undefined);
|
|
122
|
+
}
|
|
123
|
+
// If the connection is unsubscribed don't sent close events.
|
|
124
|
+
}
|
|
125
|
+
function readErrorHandler(error) {
|
|
126
|
+
errorEmitter.fire([error, undefined, undefined]);
|
|
127
|
+
}
|
|
128
|
+
function writeErrorHandler(data) {
|
|
129
|
+
errorEmitter.fire(data);
|
|
130
|
+
}
|
|
131
|
+
transports.reader.onClose(closeHandler);
|
|
132
|
+
transports.reader.onError(readErrorHandler);
|
|
133
|
+
transports.writer.onClose(closeHandler);
|
|
134
|
+
transports.writer.onError(writeErrorHandler);
|
|
135
|
+
function triggerMessageQueue() {
|
|
136
|
+
if (timer || messageQueue.size === 0) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
timer = true;
|
|
140
|
+
setImmediateCompat(() => {
|
|
141
|
+
timer = false;
|
|
142
|
+
processMessageQueue();
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
function processMessageQueue() {
|
|
146
|
+
if (messageQueue.size === 0) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const message = messageQueue.shift();
|
|
150
|
+
try {
|
|
151
|
+
if ((0, messages_1.isRequestMessage)(message)) {
|
|
152
|
+
handleRequest(message);
|
|
153
|
+
}
|
|
154
|
+
else if ((0, messages_1.isNotificationMessage)(message)) {
|
|
155
|
+
handleNotification(message);
|
|
156
|
+
}
|
|
157
|
+
else if ((0, messages_1.isResponseMessage)(message)) {
|
|
158
|
+
handleResponse(message);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
handleInvalidMessage(message);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
finally {
|
|
165
|
+
triggerMessageQueue();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const callback = (message) => {
|
|
169
|
+
console.log("[callback.ON_MESSAGE]: ", { transports, message });
|
|
170
|
+
try {
|
|
171
|
+
// We have received an abort signal. Check if the message is still in the queue and abort it if allowed
|
|
172
|
+
// to do so.
|
|
173
|
+
if ((0, messages_1.isNotificationMessage)(message) && message.method === ABORT_REQUEST_METHOD) {
|
|
174
|
+
const key = createRequestQueueKey(message.params[0]);
|
|
175
|
+
const toAbort = messageQueue.get(key);
|
|
176
|
+
if ((0, messages_1.isRequestMessage)(toAbort)) {
|
|
177
|
+
messageQueue.delete(key);
|
|
178
|
+
const response = {
|
|
179
|
+
jsonrpc: '2.0',
|
|
180
|
+
id: toAbort.id,
|
|
181
|
+
error: { code: messages_1.ErrorCodes.RequestAborted, message: 'request aborted' },
|
|
182
|
+
};
|
|
183
|
+
tracer.responseAborted(response, toAbort, message);
|
|
184
|
+
transports.writer.write(response);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
addMessageToQueue(messageQueue, message);
|
|
189
|
+
}
|
|
190
|
+
finally {
|
|
191
|
+
triggerMessageQueue();
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
function handleRequest(requestMessage) {
|
|
195
|
+
if (isUnsubscribed()) {
|
|
196
|
+
// we return here silently since we fired an event when the
|
|
197
|
+
// connection got unsubscribed.
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
const startTime = Date.now();
|
|
201
|
+
function reply(resultOrError, complete) {
|
|
202
|
+
const message = {
|
|
203
|
+
jsonrpc: version,
|
|
204
|
+
id: requestMessage.id,
|
|
205
|
+
complete,
|
|
206
|
+
};
|
|
207
|
+
if (resultOrError instanceof messages_1.ResponseError) {
|
|
208
|
+
message.error = resultOrError.toJSON();
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
message.result = resultOrError === undefined ? null : resultOrError;
|
|
212
|
+
}
|
|
213
|
+
tracer.responseSent(message, requestMessage, startTime);
|
|
214
|
+
transports.writer.write(message);
|
|
215
|
+
}
|
|
216
|
+
function replyError(error) {
|
|
217
|
+
const message = {
|
|
218
|
+
jsonrpc: version,
|
|
219
|
+
id: requestMessage.id,
|
|
220
|
+
error: error.toJSON(),
|
|
221
|
+
complete: true,
|
|
222
|
+
};
|
|
223
|
+
tracer.responseSent(message, requestMessage, startTime);
|
|
224
|
+
transports.writer.write(message);
|
|
225
|
+
}
|
|
226
|
+
function replySuccess(result) {
|
|
227
|
+
// The JSON RPC defines that a response must either have a result or an error
|
|
228
|
+
// So we can't treat undefined as a valid response result.
|
|
229
|
+
if (result === undefined) {
|
|
230
|
+
result = null;
|
|
231
|
+
}
|
|
232
|
+
const message = {
|
|
233
|
+
jsonrpc: version,
|
|
234
|
+
id: requestMessage.id,
|
|
235
|
+
result,
|
|
236
|
+
complete: true,
|
|
237
|
+
};
|
|
238
|
+
tracer.responseSent(message, requestMessage, startTime);
|
|
239
|
+
transports.writer.write(message);
|
|
240
|
+
}
|
|
241
|
+
function replyComplete() {
|
|
242
|
+
const message = {
|
|
243
|
+
jsonrpc: version,
|
|
244
|
+
id: requestMessage.id,
|
|
245
|
+
complete: true,
|
|
246
|
+
};
|
|
247
|
+
tracer.responseSent(message, requestMessage, startTime);
|
|
248
|
+
transports.writer.write(message);
|
|
249
|
+
}
|
|
250
|
+
tracer.requestReceived(requestMessage);
|
|
251
|
+
const element = requestHandlers[requestMessage.method] || requestHandlers[matchedStartActor(Object.keys(requestHandlers), requestMessage.method)];
|
|
252
|
+
const requestHandler = element && element.handler;
|
|
253
|
+
if (requestHandler || starRequestHandler) {
|
|
254
|
+
const abortController = new abort_controller_1.default();
|
|
255
|
+
const signalKey = String(requestMessage.id);
|
|
256
|
+
requestAbortControllers[signalKey] = abortController;
|
|
257
|
+
try {
|
|
258
|
+
const params = requestMessage.params !== undefined ? requestMessage.params : null;
|
|
259
|
+
const handlerResult = requestHandler
|
|
260
|
+
? requestHandler(params, abortController.signal, requestMessage.method)
|
|
261
|
+
: starRequestHandler(requestMessage.method, params, abortController.signal);
|
|
262
|
+
if (!handlerResult) {
|
|
263
|
+
delete requestAbortControllers[signalKey];
|
|
264
|
+
replySuccess(handlerResult);
|
|
265
|
+
}
|
|
266
|
+
else if ((0, utils_1.isPromise)(handlerResult) || (0, rxjs_1.isObservable)(handlerResult)) {
|
|
267
|
+
const onComplete = () => {
|
|
268
|
+
delete requestAbortControllers[signalKey];
|
|
269
|
+
};
|
|
270
|
+
(0, rxjs_1.from)(handlerResult).subscribe(value => reply(value, false), error => {
|
|
271
|
+
onComplete();
|
|
272
|
+
if (error instanceof messages_1.ResponseError) {
|
|
273
|
+
replyError(error);
|
|
274
|
+
}
|
|
275
|
+
else if (error && typeof error.message === 'string') {
|
|
276
|
+
replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, error.message, Object.assign({ stack: error.stack }, error)));
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`));
|
|
280
|
+
}
|
|
281
|
+
}, () => {
|
|
282
|
+
onComplete();
|
|
283
|
+
replyComplete();
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
delete requestAbortControllers[signalKey];
|
|
288
|
+
reply(handlerResult, true);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
console.log('[ERROR]: ', error);
|
|
293
|
+
delete requestAbortControllers[signalKey];
|
|
294
|
+
if (error instanceof messages_1.ResponseError) {
|
|
295
|
+
reply(error, true);
|
|
296
|
+
}
|
|
297
|
+
else if (error && typeof error.message === 'string') {
|
|
298
|
+
replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, error.message, Object.assign({ stack: error.stack }, error)));
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`));
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
replyError(new messages_1.ResponseError(messages_1.ErrorCodes.MethodNotFound, `Unhandled method ${requestMessage.method}`));
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
function handleResponse(responseMessage) {
|
|
310
|
+
if (isUnsubscribed()) {
|
|
311
|
+
// See handle request.
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
if (responseMessage.id === null) {
|
|
315
|
+
if (responseMessage.error) {
|
|
316
|
+
logger.error(`Received response message without id: Error is: \n${JSON.stringify(responseMessage.error, undefined, 4)}`);
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
logger.error(`Received response message without id. No further error information provided.`);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
const key = String(responseMessage.id);
|
|
324
|
+
const responseObservable = responseObservables[key];
|
|
325
|
+
if (responseObservable) {
|
|
326
|
+
tracer.responseReceived(responseMessage, responseObservable.request || responseObservable.method, responseObservable.timerStart);
|
|
327
|
+
try {
|
|
328
|
+
if (responseMessage.error) {
|
|
329
|
+
const { code, message, data } = responseMessage.error;
|
|
330
|
+
const err = new messages_1.ResponseError(code, message, data);
|
|
331
|
+
if (data && data.stack) {
|
|
332
|
+
err.stack = data.stack;
|
|
333
|
+
}
|
|
334
|
+
responseObservable.observer.error(err);
|
|
335
|
+
}
|
|
336
|
+
else if (responseMessage.result !== undefined) {
|
|
337
|
+
responseObservable.observer.next(responseMessage.result);
|
|
338
|
+
}
|
|
339
|
+
if (responseMessage.complete) {
|
|
340
|
+
responseObservable.complete = true;
|
|
341
|
+
responseObservable.observer.complete();
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
catch (error) {
|
|
345
|
+
if (error.message) {
|
|
346
|
+
logger.error(`Response handler '${responseObservable.method}' failed with message: ${error.message}`);
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
logger.error(`Response handler '${responseObservable.method}' failed unexpectedly.`);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
finally {
|
|
353
|
+
if (responseMessage.complete) {
|
|
354
|
+
delete responseObservables[key];
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
tracer.unknownResponseReceived(responseMessage);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
function handleNotification(message) {
|
|
364
|
+
if (isUnsubscribed()) {
|
|
365
|
+
// See handle request.
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
let notificationHandler;
|
|
369
|
+
if (message.method === ABORT_REQUEST_METHOD) {
|
|
370
|
+
notificationHandler = (params) => {
|
|
371
|
+
const id = params[0];
|
|
372
|
+
const abortController = requestAbortControllers[String(id)];
|
|
373
|
+
if (abortController) {
|
|
374
|
+
abortController.abort();
|
|
375
|
+
}
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
const element = notificationHandlers[message.method];
|
|
380
|
+
if (element) {
|
|
381
|
+
notificationHandler = element.handler;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
if (notificationHandler || starNotificationHandler) {
|
|
385
|
+
try {
|
|
386
|
+
console.log('handleNotification.notificationHandler');
|
|
387
|
+
tracer.notificationReceived(message);
|
|
388
|
+
notificationHandler
|
|
389
|
+
? notificationHandler(message.params)
|
|
390
|
+
: starNotificationHandler(message.method, message.params);
|
|
391
|
+
}
|
|
392
|
+
catch (error) {
|
|
393
|
+
if (error.message) {
|
|
394
|
+
logger.error(`Notification handler '${message.method}' failed with message: ${error.message}`);
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
logger.error(`Notification handler '${message.method}' failed unexpectedly.`);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
console.log('handleNotification.notificationHandler.else', { notificationHandlers });
|
|
403
|
+
unhandledNotificationEmitter.fire(message);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
function handleInvalidMessage(message) {
|
|
407
|
+
if (!message) {
|
|
408
|
+
logger.error('Received empty message.');
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
logger.error(`Received message which is neither a response nor a notification message:\n${JSON.stringify(message, null, 4)}`);
|
|
412
|
+
// Test whether we find an id to reject the promise
|
|
413
|
+
const responseMessage = message;
|
|
414
|
+
if (typeof responseMessage.id === 'string' || typeof responseMessage.id === 'number') {
|
|
415
|
+
const key = String(responseMessage.id);
|
|
416
|
+
const responseHandler = responseObservables[key];
|
|
417
|
+
if (responseHandler) {
|
|
418
|
+
responseHandler.observer.error(new Error('The received response has neither a result nor an error property.'));
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
function throwIfClosedOrUnsubscribed() {
|
|
423
|
+
if (isClosed()) {
|
|
424
|
+
throw new ConnectionError(ConnectionErrors.Closed, 'Connection is closed.');
|
|
425
|
+
}
|
|
426
|
+
if (isUnsubscribed()) {
|
|
427
|
+
throw new ConnectionError(ConnectionErrors.Unsubscribed, 'Connection is unsubscribed.');
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
function throwIfListening() {
|
|
431
|
+
if (isListening()) {
|
|
432
|
+
throw new ConnectionError(ConnectionErrors.AlreadyListening, 'Connection is already listening');
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
function throwIfNotListening() {
|
|
436
|
+
if (!isListening()) {
|
|
437
|
+
throw new Error('Call listen() first.');
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
const sendNotification = (method, params, toSecondary = false) => {
|
|
441
|
+
throwIfClosedOrUnsubscribed();
|
|
442
|
+
const notificationMessage = {
|
|
443
|
+
jsonrpc: version,
|
|
444
|
+
method,
|
|
445
|
+
params,
|
|
446
|
+
};
|
|
447
|
+
tracer.notificationSent(notificationMessage);
|
|
448
|
+
transports.writer.write(notificationMessage);
|
|
449
|
+
};
|
|
450
|
+
/**
|
|
451
|
+
* @returns a hot observable with the result of sending the request
|
|
452
|
+
*/
|
|
453
|
+
const requestHelper = (method, params, toSecondary) => {
|
|
454
|
+
const id = sequenceNumber++;
|
|
455
|
+
const requestMessage = {
|
|
456
|
+
jsonrpc: version,
|
|
457
|
+
id,
|
|
458
|
+
method,
|
|
459
|
+
params,
|
|
460
|
+
toSecondary,
|
|
461
|
+
};
|
|
462
|
+
const subject = new rxjs_1.Subject();
|
|
463
|
+
const responseObserver = {
|
|
464
|
+
method,
|
|
465
|
+
request: requestMessage,
|
|
466
|
+
timerStart: Date.now(),
|
|
467
|
+
complete: false,
|
|
468
|
+
observer: subject,
|
|
469
|
+
};
|
|
470
|
+
tracer.requestSent(requestMessage);
|
|
471
|
+
try {
|
|
472
|
+
transports.writer.write(requestMessage);
|
|
473
|
+
responseObservables[String(id)] = responseObserver;
|
|
474
|
+
}
|
|
475
|
+
catch (e) {
|
|
476
|
+
responseObserver.observer.error(new messages_1.ResponseError(messages_1.ErrorCodes.MessageWriteError, e.message ? e.message : 'Unknown reason'));
|
|
477
|
+
}
|
|
478
|
+
return new rxjs_1.Observable(observer => {
|
|
479
|
+
subject.subscribe(observer).add(() => {
|
|
480
|
+
if (!isUnsubscribed() &&
|
|
481
|
+
responseObserver &&
|
|
482
|
+
!responseObserver.complete &&
|
|
483
|
+
!responseObserver.observer.closed) {
|
|
484
|
+
sendNotification(ABORT_REQUEST_METHOD, [id]);
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
});
|
|
488
|
+
};
|
|
489
|
+
const connection = {
|
|
490
|
+
sendNotification,
|
|
491
|
+
onNotification: (type, handler) => {
|
|
492
|
+
throwIfClosedOrUnsubscribed();
|
|
493
|
+
if (typeof type === 'function') {
|
|
494
|
+
starNotificationHandler = type;
|
|
495
|
+
}
|
|
496
|
+
else if (handler) {
|
|
497
|
+
notificationHandlers[type] = { type: undefined, handler };
|
|
498
|
+
}
|
|
499
|
+
},
|
|
500
|
+
sendRequest: (method, params, signal, toSecondary = false) => {
|
|
501
|
+
throwIfClosedOrUnsubscribed();
|
|
502
|
+
throwIfNotListening();
|
|
503
|
+
return (0, abortable_rx_1.toPromise)(requestHelper(method, params, toSecondary), signal);
|
|
504
|
+
},
|
|
505
|
+
observeRequest: (method, params) => {
|
|
506
|
+
throwIfClosedOrUnsubscribed();
|
|
507
|
+
throwIfNotListening();
|
|
508
|
+
return requestHelper(method, params);
|
|
509
|
+
},
|
|
510
|
+
onRequest: (type, handler) => {
|
|
511
|
+
throwIfClosedOrUnsubscribed();
|
|
512
|
+
if (typeof type === 'function') {
|
|
513
|
+
starRequestHandler = type;
|
|
514
|
+
}
|
|
515
|
+
else if (handler) {
|
|
516
|
+
requestHandlers[type] = { type: undefined, handler };
|
|
517
|
+
}
|
|
518
|
+
},
|
|
519
|
+
trace: (_tracer) => {
|
|
520
|
+
if (_tracer) {
|
|
521
|
+
tracer = _tracer;
|
|
522
|
+
}
|
|
523
|
+
else {
|
|
524
|
+
tracer = trace_1.noopTracer;
|
|
525
|
+
}
|
|
526
|
+
},
|
|
527
|
+
onError: errorEmitter.event,
|
|
528
|
+
onClose: closeEmitter.event,
|
|
529
|
+
onUnhandledNotification: unhandledNotificationEmitter.event,
|
|
530
|
+
onUnsubscribe: unsubscribeEmitter.event,
|
|
531
|
+
unsubscribe: () => {
|
|
532
|
+
if (isUnsubscribed()) {
|
|
533
|
+
return;
|
|
534
|
+
}
|
|
535
|
+
state = ConnectionState.Unsubscribed;
|
|
536
|
+
unsubscribeEmitter.fire(undefined);
|
|
537
|
+
for (const key of Object.keys(responseObservables)) {
|
|
538
|
+
responseObservables[key].observer.error(new ConnectionError(ConnectionErrors.Unsubscribed, `The underlying JSON-RPC connection got unsubscribed while responding to this ${responseObservables[key].method} request.`));
|
|
539
|
+
}
|
|
540
|
+
responseObservables = Object.create(null);
|
|
541
|
+
requestAbortControllers = Object.create(null);
|
|
542
|
+
messageQueue = new linkedMap_1.LinkedMap();
|
|
543
|
+
transports.writer.unsubscribe();
|
|
544
|
+
transports.reader.unsubscribe();
|
|
545
|
+
},
|
|
546
|
+
listen: () => {
|
|
547
|
+
throwIfClosedOrUnsubscribed();
|
|
548
|
+
throwIfListening();
|
|
549
|
+
state = ConnectionState.Listening;
|
|
550
|
+
transports.reader.listen(callback);
|
|
551
|
+
},
|
|
552
|
+
};
|
|
553
|
+
return connection;
|
|
554
|
+
}
|
|
555
|
+
/** Support browser and node environments without needing a transpiler. */
|
|
556
|
+
function setImmediateCompat(f) {
|
|
557
|
+
if (typeof setImmediate !== 'undefined') {
|
|
558
|
+
setImmediate(f);
|
|
559
|
+
return;
|
|
560
|
+
}
|
|
561
|
+
setTimeout(f, 0);
|
|
562
|
+
}
|
|
563
|
+
function matchedStartActor(requestHandlersKeys, method) {
|
|
564
|
+
try {
|
|
565
|
+
return requestHandlersKeys.filter(name => {
|
|
566
|
+
let methodName = method.split('/')[0];
|
|
567
|
+
return `${methodName}/*` === name;
|
|
568
|
+
})[0];
|
|
569
|
+
}
|
|
570
|
+
catch (e) {
|
|
571
|
+
console.log('no matched value');
|
|
572
|
+
return null;
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
//# sourceMappingURL=connection.js.map
|