@adminide-stack/extension-api 11.0.1-alpha.0 → 11.0.1-alpha.12
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/lib/connections/jsonrpc2/connection.js +507 -525
- package/lib/connections/jsonrpc2/connection.js.map +1 -0
- package/lib/connections/jsonrpc2/events.js +100 -100
- package/lib/connections/jsonrpc2/events.js.map +1 -0
- package/lib/connections/jsonrpc2/linkedMap.js +248 -246
- package/lib/connections/jsonrpc2/linkedMap.js.map +1 -0
- package/lib/connections/jsonrpc2/messages.js +36 -40
- package/lib/connections/jsonrpc2/messages.js.map +1 -0
- package/lib/connections/jsonrpc2/test-helper.js +35 -21
- package/lib/connections/jsonrpc2/test-helper.js.map +1 -0
- package/lib/connections/jsonrpc2/trace.js +70 -82
- package/lib/connections/jsonrpc2/trace.js.map +1 -0
- package/lib/connections/jsonrpc2/transport.js +56 -56
- package/lib/connections/jsonrpc2/transport.js.map +1 -0
- package/lib/connections/jsonrpc2/transports/webWorker.js +80 -88
- package/lib/connections/jsonrpc2/transports/webWorker.js.map +1 -0
- package/lib/connections/proxy/proxy.js +46 -47
- package/lib/connections/proxy/proxy.js.map +1 -0
- package/lib/connections/remote-rpc/browser-remote-rpc.js +55 -54
- package/lib/connections/remote-rpc/browser-remote-rpc.js.map +1 -0
- package/lib/connections/remote-rpc/rxjs-websockets.js +68 -68
- package/lib/connections/remote-rpc/rxjs-websockets.js.map +1 -0
- package/lib/constants/action-types.js +27 -27
- package/lib/constants/action-types.js.map +1 -0
- package/lib/constants/types.js +7 -7
- package/lib/constants/types.js.map +1 -0
- package/lib/core/expr/evaluator.js +103 -104
- package/lib/core/expr/evaluator.js.map +1 -0
- package/lib/core/expr/lexer.js +366 -361
- package/lib/core/expr/lexer.js.map +1 -0
- package/lib/core/expr/parser.js +228 -217
- package/lib/core/expr/parser.js.map +1 -0
- package/lib/core/types/ext-host-types.js +53 -54
- package/lib/core/types/ext-host-types.js.map +1 -0
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -0
- package/lib/interfaces/contributions/contribution.js +40 -40
- package/lib/interfaces/contributions/contribution.js.map +1 -0
- package/lib/interfaces/ext-services/ext-services.d.ts +2 -2
- package/lib/interfaces/extension-manifest.d.ts +1 -1
- package/lib/interfaces/graphql.js +1 -1
- package/lib/interfaces/graphql.js.map +1 -0
- package/lib/interfaces/model.js +3 -3
- package/lib/interfaces/model.js.map +1 -0
- package/lib/interfaces/text-document.js +76 -77
- package/lib/interfaces/text-document.js.map +1 -0
- package/lib/interfaces/webview/webview.d.ts +1 -1
- package/lib/interfaces/webview/webview.js +3 -3
- package/lib/interfaces/webview/webview.js.map +1 -0
- package/lib/middlewares/extensionController.js +9 -5
- package/lib/middlewares/extensionController.js.map +1 -0
- package/lib/protocol/client.protocol.js +2 -2
- package/lib/protocol/client.protocol.js.map +1 -0
- package/lib/protocol/common.protocol.d.ts +1 -2
- package/lib/protocol/common.protocol.js +50 -48
- package/lib/protocol/common.protocol.js.map +1 -0
- package/lib/protocol/editor-missing-types.js +4 -4
- package/lib/protocol/editor-missing-types.js.map +1 -0
- package/lib/protocol/proxy-identifier.js +39 -39
- package/lib/protocol/proxy-identifier.js.map +1 -0
- package/lib/protocol/rpc-logger.js +39 -43
- package/lib/protocol/rpc-logger.js.map +1 -0
- package/lib/protocol/rpc-protocol.js +736 -724
- package/lib/protocol/rpc-protocol.js.map +1 -0
- package/lib/protocol/server.protocol.js +22 -22
- package/lib/protocol/server.protocol.js.map +1 -0
- package/lib/protocol/shared/editor.js +17 -17
- package/lib/protocol/shared/editor.js.map +1 -0
- package/lib/protocol/temporary-types.js +16 -16
- package/lib/protocol/temporary-types.js.map +1 -0
- package/lib/protocol/utils/lazy-promise.js +60 -61
- package/lib/protocol/utils/lazy-promise.js.map +1 -0
- package/lib/react/components/view-component/ViewComponent.js +31 -26
- package/lib/react/components/view-component/ViewComponent.js.map +1 -0
- package/lib/react/index.js +1 -1
- package/lib/react/index.js.map +1 -0
- package/lib/react/useExtensionController.js +13 -11
- package/lib/react/useExtensionController.js.map +1 -0
- package/lib/utils/abortable-rx.js +73 -70
- package/lib/utils/abortable-rx.js.map +1 -0
- package/lib/utils/errors.js +10 -10
- package/lib/utils/errors.js.map +1 -0
- package/lib/utils/extensions.js +11 -11
- package/lib/utils/extensions.js.map +1 -0
- package/lib/utils/helper.test.js +7 -4
- package/lib/utils/helper.test.js.map +1 -0
- package/lib/utils/paths-util.js +79 -82
- package/lib/utils/paths-util.js.map +1 -0
- package/lib/utils/rxjs/combineLatestOrDefault.js +72 -70
- package/lib/utils/rxjs/combineLatestOrDefault.js.map +1 -0
- package/lib/utils/util.js +24 -25
- package/lib/utils/util.js.map +1 -0
- package/package.json +5 -5
@@ -1,569 +1,551 @@
|
|
1
|
-
import*as abortableRx from'../../utils/abortable-rx.js';import {Subject,Observable,isObservable,from}from'rxjs';import {isPromise}from'../../utils/util.js';import'@vscode-alt/monaco-editor/esm/vs/base/common/path.js';import {Emitter}from'./events.js';import {LinkedMap}from'./linkedMap.js';import AbortController from'abort-controller';import {isNotificationMessage,isRequestMessage,ErrorCodes,ResponseError,isResponseMessage}from'./messages.js';import {noopTracer}from'./trace.js';const {
|
1
|
+
import*as abortableRx from'../../utils/abortable-rx.js';import {Subject,Observable,isObservable,from}from'rxjs';import {isPromise}from'../../utils/util.js';import'@vscode-alt/monaco-editor/esm/vs/base/common/path.js';import {Emitter}from'./events.js';import {LinkedMap}from'./linkedMap.js';import AbortController from'abort-controller';import {isNotificationMessage,isRequestMessage,ErrorCodes,ResponseError,isResponseMessage}from'./messages.js';import {noopTracer}from'./trace.js';const {
|
2
|
+
toPromise
|
3
|
+
} = abortableRx; // to support vite esm
|
2
4
|
const NullLogger = Object.freeze({
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
5
|
+
error: () => {
|
6
|
+
/* noop */
|
7
|
+
},
|
8
|
+
warn: () => {
|
9
|
+
/* noop */
|
10
|
+
},
|
11
|
+
info: () => {
|
12
|
+
/* noop */
|
13
|
+
},
|
14
|
+
log: () => {
|
15
|
+
/* noop */
|
16
|
+
}
|
15
17
|
});
|
16
18
|
var ConnectionErrors;
|
17
19
|
(function (ConnectionErrors) {
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
20
|
+
/**
|
21
|
+
* The connection is closed.
|
22
|
+
*/
|
23
|
+
ConnectionErrors[ConnectionErrors["Closed"] = 1] = "Closed";
|
24
|
+
/**
|
25
|
+
* The connection got unsubscribed (i.e., disposed).
|
26
|
+
*/
|
27
|
+
ConnectionErrors[ConnectionErrors["Unsubscribed"] = 2] = "Unsubscribed";
|
28
|
+
/**
|
29
|
+
* The connection is already in listening mode.
|
30
|
+
*/
|
31
|
+
ConnectionErrors[ConnectionErrors["AlreadyListening"] = 3] = "AlreadyListening";
|
30
32
|
})(ConnectionErrors || (ConnectionErrors = {}));
|
31
33
|
class ConnectionError extends Error {
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
34
|
+
code;
|
35
|
+
constructor(code, message) {
|
36
|
+
super(message);
|
37
|
+
this.code = code;
|
38
|
+
Object.setPrototypeOf(this, ConnectionError.prototype);
|
39
|
+
}
|
38
40
|
}
|
39
41
|
function createConnection(transports, logger) {
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
42
|
+
if (!logger) {
|
43
|
+
logger = NullLogger;
|
44
|
+
}
|
45
|
+
return _createConnection(transports, logger);
|
44
46
|
}
|
45
47
|
var ConnectionState;
|
46
48
|
(function (ConnectionState) {
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
49
|
+
ConnectionState[ConnectionState["New"] = 1] = "New";
|
50
|
+
ConnectionState[ConnectionState["Listening"] = 2] = "Listening";
|
51
|
+
ConnectionState[ConnectionState["Closed"] = 3] = "Closed";
|
52
|
+
ConnectionState[ConnectionState["Unsubscribed"] = 4] = "Unsubscribed";
|
51
53
|
})(ConnectionState || (ConnectionState = {}));
|
52
54
|
const ABORT_REQUEST_METHOD = '$/abortRequest';
|
53
55
|
function _createConnection(transports, logger) {
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
56
|
+
let sequenceNumber = 0;
|
57
|
+
let notificationSquenceNumber = 0;
|
58
|
+
let unknownResponseSquenceNumber = 0;
|
59
|
+
const version = '2.0';
|
60
|
+
let starRequestHandler;
|
61
|
+
const requestHandlers = Object.create(null);
|
62
|
+
let starNotificationHandler;
|
63
|
+
const notificationHandlers = Object.create(null);
|
64
|
+
let timer = false;
|
65
|
+
let messageQueue = new LinkedMap();
|
66
|
+
let responseObservables = Object.create(null);
|
67
|
+
let requestAbortControllers = Object.create(null);
|
68
|
+
let tracer = noopTracer;
|
69
|
+
let state = ConnectionState.New;
|
70
|
+
const errorEmitter = new Emitter();
|
71
|
+
const closeEmitter = new Emitter();
|
72
|
+
const unhandledNotificationEmitter = new Emitter();
|
73
|
+
const unsubscribeEmitter = new Emitter();
|
74
|
+
function createRequestQueueKey(id) {
|
75
|
+
return 'req-' + id.toString();
|
76
|
+
}
|
77
|
+
function createResponseQueueKey(id) {
|
78
|
+
if (id === null) {
|
79
|
+
return 'res-unknown-' + (++unknownResponseSquenceNumber).toString();
|
80
|
+
} else {
|
81
|
+
return 'res-' + id.toString();
|
74
82
|
}
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
83
|
+
}
|
84
|
+
function createNotificationQueueKey() {
|
85
|
+
return 'not-' + (++notificationSquenceNumber).toString();
|
86
|
+
}
|
87
|
+
function addMessageToQueue(queue, message) {
|
88
|
+
if (isRequestMessage(message)) {
|
89
|
+
queue.set(createRequestQueueKey(message.id), message);
|
90
|
+
} else if (isResponseMessage(message)) {
|
91
|
+
const key = createResponseQueueKey(message.id) + Math.random(); // TODO(sqs)
|
92
|
+
queue.set(key, message);
|
93
|
+
} else {
|
94
|
+
queue.set(createNotificationQueueKey(), message);
|
82
95
|
}
|
83
|
-
|
84
|
-
|
96
|
+
}
|
97
|
+
function isListening() {
|
98
|
+
return state === ConnectionState.Listening;
|
99
|
+
}
|
100
|
+
function isClosed() {
|
101
|
+
return state === ConnectionState.Closed;
|
102
|
+
}
|
103
|
+
function isUnsubscribed() {
|
104
|
+
return state === ConnectionState.Unsubscribed;
|
105
|
+
}
|
106
|
+
function closeHandler() {
|
107
|
+
if (state === ConnectionState.New || state === ConnectionState.Listening) {
|
108
|
+
state = ConnectionState.Closed;
|
109
|
+
closeEmitter.fire(undefined);
|
85
110
|
}
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
111
|
+
// If the connection is unsubscribed don't sent close events.
|
112
|
+
}
|
113
|
+
function readErrorHandler(error) {
|
114
|
+
errorEmitter.fire([error, undefined, undefined]);
|
115
|
+
}
|
116
|
+
function writeErrorHandler(data) {
|
117
|
+
errorEmitter.fire(data);
|
118
|
+
}
|
119
|
+
transports.reader.onClose(closeHandler);
|
120
|
+
transports.reader.onError(readErrorHandler);
|
121
|
+
transports.writer.onClose(closeHandler);
|
122
|
+
transports.writer.onError(writeErrorHandler);
|
123
|
+
function triggerMessageQueue() {
|
124
|
+
if (timer || messageQueue.size === 0) {
|
125
|
+
return;
|
126
|
+
}
|
127
|
+
timer = true;
|
128
|
+
setImmediateCompat(() => {
|
129
|
+
timer = false;
|
130
|
+
processMessageQueue();
|
131
|
+
});
|
132
|
+
}
|
133
|
+
function processMessageQueue() {
|
134
|
+
if (messageQueue.size === 0) {
|
135
|
+
return;
|
97
136
|
}
|
98
|
-
|
99
|
-
|
137
|
+
const message = messageQueue.shift();
|
138
|
+
try {
|
139
|
+
if (isRequestMessage(message)) {
|
140
|
+
handleRequest(message);
|
141
|
+
} else if (isNotificationMessage(message)) {
|
142
|
+
handleNotification(message);
|
143
|
+
} else if (isResponseMessage(message)) {
|
144
|
+
handleResponse(message);
|
145
|
+
} else {
|
146
|
+
handleInvalidMessage(message);
|
147
|
+
}
|
148
|
+
} finally {
|
149
|
+
triggerMessageQueue();
|
100
150
|
}
|
101
|
-
|
102
|
-
|
151
|
+
}
|
152
|
+
const callback = message => {
|
153
|
+
console.log('[callback.ON_MESSAGE]: ', {
|
154
|
+
transports,
|
155
|
+
message
|
156
|
+
});
|
157
|
+
try {
|
158
|
+
// We have received an abort signal. Check if the message is still in the queue and abort it if allowed
|
159
|
+
// to do so.
|
160
|
+
if (isNotificationMessage(message) && message.method === ABORT_REQUEST_METHOD) {
|
161
|
+
const key = createRequestQueueKey(message.params[0]);
|
162
|
+
const toAbort = messageQueue.get(key);
|
163
|
+
if (isRequestMessage(toAbort)) {
|
164
|
+
messageQueue.delete(key);
|
165
|
+
const response = {
|
166
|
+
jsonrpc: '2.0',
|
167
|
+
id: toAbort.id,
|
168
|
+
error: {
|
169
|
+
code: ErrorCodes.RequestAborted,
|
170
|
+
message: 'request aborted'
|
171
|
+
}
|
172
|
+
};
|
173
|
+
tracer.responseAborted(response, toAbort, message);
|
174
|
+
transports.writer.write(response);
|
175
|
+
return;
|
176
|
+
}
|
177
|
+
}
|
178
|
+
addMessageToQueue(messageQueue, message);
|
179
|
+
} finally {
|
180
|
+
triggerMessageQueue();
|
103
181
|
}
|
104
|
-
|
105
|
-
|
182
|
+
};
|
183
|
+
function handleRequest(requestMessage) {
|
184
|
+
if (isUnsubscribed()) {
|
185
|
+
// we return here silently since we fired an event when the
|
186
|
+
// connection got unsubscribed.
|
187
|
+
return;
|
106
188
|
}
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
189
|
+
const startTime = Date.now();
|
190
|
+
function reply(resultOrError, complete) {
|
191
|
+
const message = {
|
192
|
+
jsonrpc: version,
|
193
|
+
id: requestMessage.id,
|
194
|
+
complete
|
195
|
+
};
|
196
|
+
if (resultOrError instanceof ResponseError) {
|
197
|
+
message.error = resultOrError.toJSON();
|
198
|
+
} else {
|
199
|
+
message.result = resultOrError === undefined ? null : resultOrError;
|
200
|
+
}
|
201
|
+
tracer.responseSent(message, requestMessage, startTime);
|
202
|
+
transports.writer.write(message);
|
113
203
|
}
|
114
|
-
function
|
115
|
-
|
204
|
+
function replyError(error) {
|
205
|
+
const message = {
|
206
|
+
jsonrpc: version,
|
207
|
+
id: requestMessage.id,
|
208
|
+
error: error.toJSON(),
|
209
|
+
complete: true
|
210
|
+
};
|
211
|
+
tracer.responseSent(message, requestMessage, startTime);
|
212
|
+
transports.writer.write(message);
|
116
213
|
}
|
117
|
-
function
|
118
|
-
|
214
|
+
function replySuccess(result) {
|
215
|
+
// The JSON RPC defines that a response must either have a result or an error
|
216
|
+
// So we can't treat undefined as a valid response result.
|
217
|
+
if (result === undefined) {
|
218
|
+
result = null;
|
219
|
+
}
|
220
|
+
const message = {
|
221
|
+
jsonrpc: version,
|
222
|
+
id: requestMessage.id,
|
223
|
+
result,
|
224
|
+
complete: true
|
225
|
+
};
|
226
|
+
tracer.responseSent(message, requestMessage, startTime);
|
227
|
+
transports.writer.write(message);
|
119
228
|
}
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
timer = true;
|
129
|
-
setImmediateCompat(() => {
|
130
|
-
timer = false;
|
131
|
-
processMessageQueue();
|
132
|
-
});
|
229
|
+
function replyComplete() {
|
230
|
+
const message = {
|
231
|
+
jsonrpc: version,
|
232
|
+
id: requestMessage.id,
|
233
|
+
complete: true
|
234
|
+
};
|
235
|
+
tracer.responseSent(message, requestMessage, startTime);
|
236
|
+
transports.writer.write(message);
|
133
237
|
}
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
238
|
+
tracer.requestReceived(requestMessage);
|
239
|
+
const element = requestHandlers[requestMessage.method] || requestHandlers[matchedStartActor(Object.keys(requestHandlers), requestMessage.method)];
|
240
|
+
const requestHandler = element && element.handler;
|
241
|
+
if (requestHandler || starRequestHandler) {
|
242
|
+
const abortController = new AbortController();
|
243
|
+
const signalKey = String(requestMessage.id);
|
244
|
+
requestAbortControllers[signalKey] = abortController;
|
245
|
+
try {
|
246
|
+
const params = requestMessage.params !== undefined ? requestMessage.params : null;
|
247
|
+
const handlerResult = requestHandler ? requestHandler(params, abortController.signal, requestMessage.method) : starRequestHandler(requestMessage.method, params, abortController.signal);
|
248
|
+
if (!handlerResult) {
|
249
|
+
delete requestAbortControllers[signalKey];
|
250
|
+
replySuccess(handlerResult);
|
251
|
+
} else if (isPromise(handlerResult) || isObservable(handlerResult)) {
|
252
|
+
const onComplete = () => {
|
253
|
+
delete requestAbortControllers[signalKey];
|
254
|
+
};
|
255
|
+
from(handlerResult).subscribe(value => reply(value, false), error => {
|
256
|
+
onComplete();
|
257
|
+
if (error instanceof ResponseError) {
|
258
|
+
replyError(error);
|
259
|
+
} else if (error && typeof error.message === 'string') {
|
260
|
+
replyError(new ResponseError(ErrorCodes.InternalError, error.message, {
|
261
|
+
stack: error.stack,
|
262
|
+
...error
|
263
|
+
}));
|
264
|
+
} else {
|
265
|
+
replyError(new ResponseError(ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`));
|
148
266
|
}
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
267
|
+
}, () => {
|
268
|
+
onComplete();
|
269
|
+
replyComplete();
|
270
|
+
});
|
271
|
+
} else {
|
272
|
+
delete requestAbortControllers[signalKey];
|
273
|
+
reply(handlerResult, true);
|
274
|
+
}
|
275
|
+
} catch (error) {
|
276
|
+
console.log('[ERROR]: ', error);
|
277
|
+
delete requestAbortControllers[signalKey];
|
278
|
+
if (error instanceof ResponseError) {
|
279
|
+
reply(error, true);
|
280
|
+
} else if (error && typeof error.message === 'string') {
|
281
|
+
replyError(new ResponseError(ErrorCodes.InternalError, error.message, {
|
282
|
+
stack: error.stack,
|
283
|
+
...error
|
284
|
+
}));
|
285
|
+
} else {
|
286
|
+
replyError(new ResponseError(ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`));
|
287
|
+
}
|
288
|
+
}
|
289
|
+
} else {
|
290
|
+
replyError(new ResponseError(ErrorCodes.MethodNotFound, `Unhandled method ${requestMessage.method}`));
|
156
291
|
}
|
157
|
-
|
158
|
-
|
292
|
+
}
|
293
|
+
function handleResponse(responseMessage) {
|
294
|
+
if (isUnsubscribed()) {
|
295
|
+
// See handle request.
|
296
|
+
return;
|
297
|
+
}
|
298
|
+
if (responseMessage.id === null) {
|
299
|
+
if (responseMessage.error) {
|
300
|
+
logger.error(`Received response message without id: Error is: \n${JSON.stringify(responseMessage.error, undefined, 4)}`);
|
301
|
+
} else {
|
302
|
+
logger.error(`Received response message without id. No further error information provided.`);
|
303
|
+
}
|
304
|
+
} else {
|
305
|
+
const key = String(responseMessage.id);
|
306
|
+
const responseObservable = responseObservables[key];
|
307
|
+
if (responseObservable) {
|
308
|
+
tracer.responseReceived(responseMessage, responseObservable.request || responseObservable.method, responseObservable.timerStart);
|
159
309
|
try {
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
id: toAbort.id,
|
170
|
-
error: { code: ErrorCodes.RequestAborted, message: 'request aborted' },
|
171
|
-
};
|
172
|
-
tracer.responseAborted(response, toAbort, message);
|
173
|
-
transports.writer.write(response);
|
174
|
-
return;
|
175
|
-
}
|
176
|
-
}
|
177
|
-
addMessageToQueue(messageQueue, message);
|
178
|
-
}
|
179
|
-
finally {
|
180
|
-
triggerMessageQueue();
|
181
|
-
}
|
182
|
-
};
|
183
|
-
function handleRequest(requestMessage) {
|
184
|
-
if (isUnsubscribed()) {
|
185
|
-
// we return here silently since we fired an event when the
|
186
|
-
// connection got unsubscribed.
|
187
|
-
return;
|
188
|
-
}
|
189
|
-
const startTime = Date.now();
|
190
|
-
function reply(resultOrError, complete) {
|
191
|
-
const message = {
|
192
|
-
jsonrpc: version,
|
193
|
-
id: requestMessage.id,
|
194
|
-
complete,
|
195
|
-
};
|
196
|
-
if (resultOrError instanceof ResponseError) {
|
197
|
-
message.error = resultOrError.toJSON();
|
198
|
-
}
|
199
|
-
else {
|
200
|
-
message.result = resultOrError === undefined ? null : resultOrError;
|
201
|
-
}
|
202
|
-
tracer.responseSent(message, requestMessage, startTime);
|
203
|
-
transports.writer.write(message);
|
204
|
-
}
|
205
|
-
function replyError(error) {
|
206
|
-
const message = {
|
207
|
-
jsonrpc: version,
|
208
|
-
id: requestMessage.id,
|
209
|
-
error: error.toJSON(),
|
210
|
-
complete: true,
|
211
|
-
};
|
212
|
-
tracer.responseSent(message, requestMessage, startTime);
|
213
|
-
transports.writer.write(message);
|
214
|
-
}
|
215
|
-
function replySuccess(result) {
|
216
|
-
// The JSON RPC defines that a response must either have a result or an error
|
217
|
-
// So we can't treat undefined as a valid response result.
|
218
|
-
if (result === undefined) {
|
219
|
-
result = null;
|
220
|
-
}
|
221
|
-
const message = {
|
222
|
-
jsonrpc: version,
|
223
|
-
id: requestMessage.id,
|
224
|
-
result,
|
225
|
-
complete: true,
|
226
|
-
};
|
227
|
-
tracer.responseSent(message, requestMessage, startTime);
|
228
|
-
transports.writer.write(message);
|
229
|
-
}
|
230
|
-
function replyComplete() {
|
231
|
-
const message = {
|
232
|
-
jsonrpc: version,
|
233
|
-
id: requestMessage.id,
|
234
|
-
complete: true,
|
235
|
-
};
|
236
|
-
tracer.responseSent(message, requestMessage, startTime);
|
237
|
-
transports.writer.write(message);
|
238
|
-
}
|
239
|
-
tracer.requestReceived(requestMessage);
|
240
|
-
const element = requestHandlers[requestMessage.method] ||
|
241
|
-
requestHandlers[matchedStartActor(Object.keys(requestHandlers), requestMessage.method)];
|
242
|
-
const requestHandler = element && element.handler;
|
243
|
-
if (requestHandler || starRequestHandler) {
|
244
|
-
const abortController = new AbortController();
|
245
|
-
const signalKey = String(requestMessage.id);
|
246
|
-
requestAbortControllers[signalKey] = abortController;
|
247
|
-
try {
|
248
|
-
const params = requestMessage.params !== undefined ? requestMessage.params : null;
|
249
|
-
const handlerResult = requestHandler
|
250
|
-
? requestHandler(params, abortController.signal, requestMessage.method)
|
251
|
-
: starRequestHandler(requestMessage.method, params, abortController.signal);
|
252
|
-
if (!handlerResult) {
|
253
|
-
delete requestAbortControllers[signalKey];
|
254
|
-
replySuccess(handlerResult);
|
255
|
-
}
|
256
|
-
else if (isPromise(handlerResult) || isObservable(handlerResult)) {
|
257
|
-
const onComplete = () => {
|
258
|
-
delete requestAbortControllers[signalKey];
|
259
|
-
};
|
260
|
-
from(handlerResult).subscribe((value) => reply(value, false), (error) => {
|
261
|
-
onComplete();
|
262
|
-
if (error instanceof ResponseError) {
|
263
|
-
replyError(error);
|
264
|
-
}
|
265
|
-
else if (error && typeof error.message === 'string') {
|
266
|
-
replyError(new ResponseError(ErrorCodes.InternalError, error.message, {
|
267
|
-
stack: error.stack,
|
268
|
-
...error,
|
269
|
-
}));
|
270
|
-
}
|
271
|
-
else {
|
272
|
-
replyError(new ResponseError(ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`));
|
273
|
-
}
|
274
|
-
}, () => {
|
275
|
-
onComplete();
|
276
|
-
replyComplete();
|
277
|
-
});
|
278
|
-
}
|
279
|
-
else {
|
280
|
-
delete requestAbortControllers[signalKey];
|
281
|
-
reply(handlerResult, true);
|
282
|
-
}
|
283
|
-
}
|
284
|
-
catch (error) {
|
285
|
-
console.log('[ERROR]: ', error);
|
286
|
-
delete requestAbortControllers[signalKey];
|
287
|
-
if (error instanceof ResponseError) {
|
288
|
-
reply(error, true);
|
289
|
-
}
|
290
|
-
else if (error && typeof error.message === 'string') {
|
291
|
-
replyError(new ResponseError(ErrorCodes.InternalError, error.message, {
|
292
|
-
stack: error.stack,
|
293
|
-
...error,
|
294
|
-
}));
|
295
|
-
}
|
296
|
-
else {
|
297
|
-
replyError(new ResponseError(ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`));
|
298
|
-
}
|
310
|
+
if (responseMessage.error) {
|
311
|
+
const {
|
312
|
+
code,
|
313
|
+
message,
|
314
|
+
data
|
315
|
+
} = responseMessage.error;
|
316
|
+
const err = new ResponseError(code, message, data);
|
317
|
+
if (data && data.stack) {
|
318
|
+
err.stack = data.stack;
|
299
319
|
}
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
320
|
+
responseObservable.observer.error(err);
|
321
|
+
} else if (responseMessage.result !== undefined) {
|
322
|
+
responseObservable.observer.next(responseMessage.result);
|
323
|
+
}
|
324
|
+
if (responseMessage.complete) {
|
325
|
+
responseObservable.complete = true;
|
326
|
+
responseObservable.observer.complete();
|
327
|
+
}
|
328
|
+
} catch (error) {
|
329
|
+
if (error.message) {
|
330
|
+
logger.error(`Response handler '${responseObservable.method}' failed with message: ${error.message}`);
|
331
|
+
} else {
|
332
|
+
logger.error(`Response handler '${responseObservable.method}' failed unexpectedly.`);
|
333
|
+
}
|
334
|
+
} finally {
|
335
|
+
if (responseMessage.complete) {
|
336
|
+
delete responseObservables[key];
|
337
|
+
}
|
338
|
+
}
|
339
|
+
} else {
|
340
|
+
tracer.unknownResponseReceived(responseMessage);
|
341
|
+
}
|
304
342
|
}
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
if (responseMessage.id === null) {
|
311
|
-
if (responseMessage.error) {
|
312
|
-
logger.error(`Received response message without id: Error is: \n${JSON.stringify(responseMessage.error, undefined, 4)}`);
|
313
|
-
}
|
314
|
-
else {
|
315
|
-
logger.error(`Received response message without id. No further error information provided.`);
|
316
|
-
}
|
317
|
-
}
|
318
|
-
else {
|
319
|
-
const key = String(responseMessage.id);
|
320
|
-
const responseObservable = responseObservables[key];
|
321
|
-
if (responseObservable) {
|
322
|
-
tracer.responseReceived(responseMessage, responseObservable.request || responseObservable.method, responseObservable.timerStart);
|
323
|
-
try {
|
324
|
-
if (responseMessage.error) {
|
325
|
-
const { code, message, data } = responseMessage.error;
|
326
|
-
const err = new ResponseError(code, message, data);
|
327
|
-
if (data && data.stack) {
|
328
|
-
err.stack = data.stack;
|
329
|
-
}
|
330
|
-
responseObservable.observer.error(err);
|
331
|
-
}
|
332
|
-
else if (responseMessage.result !== undefined) {
|
333
|
-
responseObservable.observer.next(responseMessage.result);
|
334
|
-
}
|
335
|
-
if (responseMessage.complete) {
|
336
|
-
responseObservable.complete = true;
|
337
|
-
responseObservable.observer.complete();
|
338
|
-
}
|
339
|
-
}
|
340
|
-
catch (error) {
|
341
|
-
if (error.message) {
|
342
|
-
logger.error(`Response handler '${responseObservable.method}' failed with message: ${error.message}`);
|
343
|
-
}
|
344
|
-
else {
|
345
|
-
logger.error(`Response handler '${responseObservable.method}' failed unexpectedly.`);
|
346
|
-
}
|
347
|
-
}
|
348
|
-
finally {
|
349
|
-
if (responseMessage.complete) {
|
350
|
-
delete responseObservables[key];
|
351
|
-
}
|
352
|
-
}
|
353
|
-
}
|
354
|
-
else {
|
355
|
-
tracer.unknownResponseReceived(responseMessage);
|
356
|
-
}
|
357
|
-
}
|
343
|
+
}
|
344
|
+
function handleNotification(message) {
|
345
|
+
if (isUnsubscribed()) {
|
346
|
+
// See handle request.
|
347
|
+
return;
|
358
348
|
}
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
}
|
374
|
-
else {
|
375
|
-
const element = notificationHandlers[message.method];
|
376
|
-
if (element) {
|
377
|
-
notificationHandler = element.handler;
|
378
|
-
}
|
379
|
-
}
|
380
|
-
if (notificationHandler || starNotificationHandler) {
|
381
|
-
try {
|
382
|
-
console.log('handleNotification.notificationHandler');
|
383
|
-
tracer.notificationReceived(message);
|
384
|
-
notificationHandler
|
385
|
-
? notificationHandler(message.params)
|
386
|
-
: starNotificationHandler(message.method, message.params);
|
387
|
-
}
|
388
|
-
catch (error) {
|
389
|
-
if (error.message) {
|
390
|
-
logger.error(`Notification handler '${message.method}' failed with message: ${error.message}`);
|
391
|
-
}
|
392
|
-
else {
|
393
|
-
logger.error(`Notification handler '${message.method}' failed unexpectedly.`);
|
394
|
-
}
|
395
|
-
}
|
396
|
-
}
|
397
|
-
else {
|
398
|
-
console.log('handleNotification.notificationHandler.else', { notificationHandlers });
|
399
|
-
unhandledNotificationEmitter.fire(message);
|
400
|
-
}
|
349
|
+
let notificationHandler;
|
350
|
+
if (message.method === ABORT_REQUEST_METHOD) {
|
351
|
+
notificationHandler = params => {
|
352
|
+
const id = params[0];
|
353
|
+
const abortController = requestAbortControllers[String(id)];
|
354
|
+
if (abortController) {
|
355
|
+
abortController.abort();
|
356
|
+
}
|
357
|
+
};
|
358
|
+
} else {
|
359
|
+
const element = notificationHandlers[message.method];
|
360
|
+
if (element) {
|
361
|
+
notificationHandler = element.handler;
|
362
|
+
}
|
401
363
|
}
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
364
|
+
if (notificationHandler || starNotificationHandler) {
|
365
|
+
try {
|
366
|
+
console.log('handleNotification.notificationHandler');
|
367
|
+
tracer.notificationReceived(message);
|
368
|
+
notificationHandler ? notificationHandler(message.params) : starNotificationHandler(message.method, message.params);
|
369
|
+
} catch (error) {
|
370
|
+
if (error.message) {
|
371
|
+
logger.error(`Notification handler '${message.method}' failed with message: ${error.message}`);
|
372
|
+
} else {
|
373
|
+
logger.error(`Notification handler '${message.method}' failed unexpectedly.`);
|
374
|
+
}
|
375
|
+
}
|
376
|
+
} else {
|
377
|
+
console.log('handleNotification.notificationHandler.else', {
|
378
|
+
notificationHandlers
|
379
|
+
});
|
380
|
+
unhandledNotificationEmitter.fire(message);
|
417
381
|
}
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
throw new ConnectionError(ConnectionErrors.Unsubscribed, 'Connection is unsubscribed.');
|
424
|
-
}
|
382
|
+
}
|
383
|
+
function handleInvalidMessage(message) {
|
384
|
+
if (!message) {
|
385
|
+
logger.error('Received empty message.');
|
386
|
+
return;
|
425
387
|
}
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
388
|
+
logger.error(`Received message which is neither a response nor a notification message:\n${JSON.stringify(message, null, 4)}`);
|
389
|
+
// Test whether we find an id to reject the promise
|
390
|
+
const responseMessage = message;
|
391
|
+
if (typeof responseMessage.id === 'string' || typeof responseMessage.id === 'number') {
|
392
|
+
const key = String(responseMessage.id);
|
393
|
+
const responseHandler = responseObservables[key];
|
394
|
+
if (responseHandler) {
|
395
|
+
responseHandler.observer.error(new Error('The received response has neither a result nor an error property.'));
|
396
|
+
}
|
430
397
|
}
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
398
|
+
}
|
399
|
+
function throwIfClosedOrUnsubscribed() {
|
400
|
+
if (isClosed()) {
|
401
|
+
throw new ConnectionError(ConnectionErrors.Closed, 'Connection is closed.');
|
435
402
|
}
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
403
|
+
if (isUnsubscribed()) {
|
404
|
+
throw new ConnectionError(ConnectionErrors.Unsubscribed, 'Connection is unsubscribed.');
|
405
|
+
}
|
406
|
+
}
|
407
|
+
function throwIfListening() {
|
408
|
+
if (isListening()) {
|
409
|
+
throw new ConnectionError(ConnectionErrors.AlreadyListening, 'Connection is already listening');
|
410
|
+
}
|
411
|
+
}
|
412
|
+
function throwIfNotListening() {
|
413
|
+
if (!isListening()) {
|
414
|
+
throw new Error('Call listen() first.');
|
415
|
+
}
|
416
|
+
}
|
417
|
+
const sendNotification = (method, params, toSecondary = false) => {
|
418
|
+
throwIfClosedOrUnsubscribed();
|
419
|
+
const notificationMessage = {
|
420
|
+
jsonrpc: version,
|
421
|
+
method,
|
422
|
+
params
|
445
423
|
};
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
method,
|
461
|
-
request: requestMessage,
|
462
|
-
timerStart: Date.now(),
|
463
|
-
complete: false,
|
464
|
-
observer: subject,
|
465
|
-
};
|
466
|
-
tracer.requestSent(requestMessage);
|
467
|
-
try {
|
468
|
-
transports.writer.write(requestMessage);
|
469
|
-
responseObservables[String(id)] = responseObserver;
|
470
|
-
}
|
471
|
-
catch (e) {
|
472
|
-
responseObserver.observer.error(new ResponseError(ErrorCodes.MessageWriteError, e.message ? e.message : 'Unknown reason'));
|
473
|
-
}
|
474
|
-
return new Observable((observer) => {
|
475
|
-
const subscription = subject.subscribe(observer);
|
476
|
-
subscription.add(() => {
|
477
|
-
if (!isUnsubscribed() && responseObserver && !responseObserver.complete && !subscription.closed) {
|
478
|
-
sendNotification(ABORT_REQUEST_METHOD, [id]);
|
479
|
-
}
|
480
|
-
});
|
481
|
-
return subscription;
|
482
|
-
});
|
424
|
+
tracer.notificationSent(notificationMessage);
|
425
|
+
transports.writer.write(notificationMessage);
|
426
|
+
};
|
427
|
+
/**
|
428
|
+
* @returns a hot observable with the result of sending the request
|
429
|
+
*/
|
430
|
+
const requestHelper = (method, params, toSecondary) => {
|
431
|
+
const id = sequenceNumber++;
|
432
|
+
const requestMessage = {
|
433
|
+
jsonrpc: version,
|
434
|
+
id,
|
435
|
+
method,
|
436
|
+
params,
|
437
|
+
toSecondary
|
483
438
|
};
|
484
|
-
const
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
else if (handler) {
|
492
|
-
notificationHandlers[type] = { type: undefined, handler };
|
493
|
-
}
|
494
|
-
},
|
495
|
-
sendRequest: (method, params, signal, toSecondary = false) => {
|
496
|
-
throwIfClosedOrUnsubscribed();
|
497
|
-
throwIfNotListening();
|
498
|
-
return toPromise(requestHelper(method, params, toSecondary), signal);
|
499
|
-
},
|
500
|
-
observeRequest: (method, params) => {
|
501
|
-
throwIfClosedOrUnsubscribed();
|
502
|
-
throwIfNotListening();
|
503
|
-
return requestHelper(method, params);
|
504
|
-
},
|
505
|
-
onRequest: (type, handler) => {
|
506
|
-
throwIfClosedOrUnsubscribed();
|
507
|
-
if (typeof type === 'function') {
|
508
|
-
starRequestHandler = type;
|
509
|
-
}
|
510
|
-
else if (handler) {
|
511
|
-
requestHandlers[type] = { type: undefined, handler };
|
512
|
-
}
|
513
|
-
},
|
514
|
-
trace: (_tracer) => {
|
515
|
-
if (_tracer) {
|
516
|
-
tracer = _tracer;
|
517
|
-
}
|
518
|
-
else {
|
519
|
-
tracer = noopTracer;
|
520
|
-
}
|
521
|
-
},
|
522
|
-
onError: errorEmitter.event,
|
523
|
-
onClose: closeEmitter.event,
|
524
|
-
onUnhandledNotification: unhandledNotificationEmitter.event,
|
525
|
-
onUnsubscribe: unsubscribeEmitter.event,
|
526
|
-
unsubscribe: () => {
|
527
|
-
if (isUnsubscribed()) {
|
528
|
-
return;
|
529
|
-
}
|
530
|
-
state = ConnectionState.Unsubscribed;
|
531
|
-
unsubscribeEmitter.fire(undefined);
|
532
|
-
for (const key of Object.keys(responseObservables)) {
|
533
|
-
responseObservables[key].observer.error(new ConnectionError(ConnectionErrors.Unsubscribed, `The underlying JSON-RPC connection got unsubscribed while responding to this ${responseObservables[key].method} request.`));
|
534
|
-
}
|
535
|
-
responseObservables = Object.create(null);
|
536
|
-
requestAbortControllers = Object.create(null);
|
537
|
-
messageQueue = new LinkedMap();
|
538
|
-
transports.writer.unsubscribe();
|
539
|
-
transports.reader.unsubscribe();
|
540
|
-
},
|
541
|
-
listen: () => {
|
542
|
-
throwIfClosedOrUnsubscribed();
|
543
|
-
throwIfListening();
|
544
|
-
state = ConnectionState.Listening;
|
545
|
-
transports.reader.listen(callback);
|
546
|
-
},
|
439
|
+
const subject = new Subject();
|
440
|
+
const responseObserver = {
|
441
|
+
method,
|
442
|
+
request: requestMessage,
|
443
|
+
timerStart: Date.now(),
|
444
|
+
complete: false,
|
445
|
+
observer: subject
|
547
446
|
};
|
548
|
-
|
447
|
+
tracer.requestSent(requestMessage);
|
448
|
+
try {
|
449
|
+
transports.writer.write(requestMessage);
|
450
|
+
responseObservables[String(id)] = responseObserver;
|
451
|
+
} catch (e) {
|
452
|
+
responseObserver.observer.error(new ResponseError(ErrorCodes.MessageWriteError, e.message ? e.message : 'Unknown reason'));
|
453
|
+
}
|
454
|
+
return new Observable(observer => {
|
455
|
+
const subscription = subject.subscribe(observer);
|
456
|
+
subscription.add(() => {
|
457
|
+
if (!isUnsubscribed() && responseObserver && !responseObserver.complete && !subscription.closed) {
|
458
|
+
sendNotification(ABORT_REQUEST_METHOD, [id]);
|
459
|
+
}
|
460
|
+
});
|
461
|
+
return subscription;
|
462
|
+
});
|
463
|
+
};
|
464
|
+
const connection = {
|
465
|
+
sendNotification,
|
466
|
+
onNotification: (type, handler) => {
|
467
|
+
throwIfClosedOrUnsubscribed();
|
468
|
+
if (typeof type === 'function') {
|
469
|
+
starNotificationHandler = type;
|
470
|
+
} else if (handler) {
|
471
|
+
notificationHandlers[type] = {
|
472
|
+
type: undefined,
|
473
|
+
handler
|
474
|
+
};
|
475
|
+
}
|
476
|
+
},
|
477
|
+
sendRequest: (method, params, signal, toSecondary = false) => {
|
478
|
+
throwIfClosedOrUnsubscribed();
|
479
|
+
throwIfNotListening();
|
480
|
+
return toPromise(requestHelper(method, params, toSecondary), signal);
|
481
|
+
},
|
482
|
+
observeRequest: (method, params) => {
|
483
|
+
throwIfClosedOrUnsubscribed();
|
484
|
+
throwIfNotListening();
|
485
|
+
return requestHelper(method, params);
|
486
|
+
},
|
487
|
+
onRequest: (type, handler) => {
|
488
|
+
throwIfClosedOrUnsubscribed();
|
489
|
+
if (typeof type === 'function') {
|
490
|
+
starRequestHandler = type;
|
491
|
+
} else if (handler) {
|
492
|
+
requestHandlers[type] = {
|
493
|
+
type: undefined,
|
494
|
+
handler
|
495
|
+
};
|
496
|
+
}
|
497
|
+
},
|
498
|
+
trace: _tracer => {
|
499
|
+
if (_tracer) {
|
500
|
+
tracer = _tracer;
|
501
|
+
} else {
|
502
|
+
tracer = noopTracer;
|
503
|
+
}
|
504
|
+
},
|
505
|
+
onError: errorEmitter.event,
|
506
|
+
onClose: closeEmitter.event,
|
507
|
+
onUnhandledNotification: unhandledNotificationEmitter.event,
|
508
|
+
onUnsubscribe: unsubscribeEmitter.event,
|
509
|
+
unsubscribe: () => {
|
510
|
+
if (isUnsubscribed()) {
|
511
|
+
return;
|
512
|
+
}
|
513
|
+
state = ConnectionState.Unsubscribed;
|
514
|
+
unsubscribeEmitter.fire(undefined);
|
515
|
+
for (const key of Object.keys(responseObservables)) {
|
516
|
+
responseObservables[key].observer.error(new ConnectionError(ConnectionErrors.Unsubscribed, `The underlying JSON-RPC connection got unsubscribed while responding to this ${responseObservables[key].method} request.`));
|
517
|
+
}
|
518
|
+
responseObservables = Object.create(null);
|
519
|
+
requestAbortControllers = Object.create(null);
|
520
|
+
messageQueue = new LinkedMap();
|
521
|
+
transports.writer.unsubscribe();
|
522
|
+
transports.reader.unsubscribe();
|
523
|
+
},
|
524
|
+
listen: () => {
|
525
|
+
throwIfClosedOrUnsubscribed();
|
526
|
+
throwIfListening();
|
527
|
+
state = ConnectionState.Listening;
|
528
|
+
transports.reader.listen(callback);
|
529
|
+
}
|
530
|
+
};
|
531
|
+
return connection;
|
549
532
|
}
|
550
533
|
/** Support browser and node environments without needing a transpiler. */
|
551
534
|
function setImmediateCompat(f) {
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
535
|
+
if (typeof setImmediate !== 'undefined') {
|
536
|
+
setImmediate(f);
|
537
|
+
return;
|
538
|
+
}
|
539
|
+
setTimeout(f, 0);
|
557
540
|
}
|
558
541
|
function matchedStartActor(requestHandlersKeys, method) {
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
}export{ConnectionError,ConnectionErrors,createConnection};
|
542
|
+
try {
|
543
|
+
return requestHandlersKeys.filter(name => {
|
544
|
+
let methodName = method.split('/')[0];
|
545
|
+
return `${methodName}/*` === name;
|
546
|
+
})[0];
|
547
|
+
} catch (e) {
|
548
|
+
console.log('no matched value');
|
549
|
+
return null;
|
550
|
+
}
|
551
|
+
}export{ConnectionError,ConnectionErrors,createConnection};//# sourceMappingURL=connection.js.map
|