@adminide-stack/extension-api 11.0.1-alpha.7 → 12.0.1-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.
Files changed (93) hide show
  1. package/lib/connections/jsonrpc2/connection.js +507 -525
  2. package/lib/connections/jsonrpc2/connection.js.map +1 -0
  3. package/lib/connections/jsonrpc2/events.js +100 -100
  4. package/lib/connections/jsonrpc2/events.js.map +1 -0
  5. package/lib/connections/jsonrpc2/linkedMap.js +248 -246
  6. package/lib/connections/jsonrpc2/linkedMap.js.map +1 -0
  7. package/lib/connections/jsonrpc2/messages.js +36 -40
  8. package/lib/connections/jsonrpc2/messages.js.map +1 -0
  9. package/lib/connections/jsonrpc2/test-helper.js +35 -21
  10. package/lib/connections/jsonrpc2/test-helper.js.map +1 -0
  11. package/lib/connections/jsonrpc2/trace.js +70 -82
  12. package/lib/connections/jsonrpc2/trace.js.map +1 -0
  13. package/lib/connections/jsonrpc2/transport.js +56 -56
  14. package/lib/connections/jsonrpc2/transport.js.map +1 -0
  15. package/lib/connections/jsonrpc2/transports/webWorker.js +80 -88
  16. package/lib/connections/jsonrpc2/transports/webWorker.js.map +1 -0
  17. package/lib/connections/proxy/proxy.js +46 -47
  18. package/lib/connections/proxy/proxy.js.map +1 -0
  19. package/lib/connections/remote-rpc/browser-remote-rpc.js +55 -54
  20. package/lib/connections/remote-rpc/browser-remote-rpc.js.map +1 -0
  21. package/lib/connections/remote-rpc/rxjs-websockets.js +68 -68
  22. package/lib/connections/remote-rpc/rxjs-websockets.js.map +1 -0
  23. package/lib/constants/action-types.js +27 -27
  24. package/lib/constants/action-types.js.map +1 -0
  25. package/lib/constants/types.js +7 -7
  26. package/lib/constants/types.js.map +1 -0
  27. package/lib/core/expr/evaluator.js +103 -104
  28. package/lib/core/expr/evaluator.js.map +1 -0
  29. package/lib/core/expr/lexer.js +366 -361
  30. package/lib/core/expr/lexer.js.map +1 -0
  31. package/lib/core/expr/parser.js +228 -217
  32. package/lib/core/expr/parser.js.map +1 -0
  33. package/lib/core/types/ext-host-types.js +53 -54
  34. package/lib/core/types/ext-host-types.js.map +1 -0
  35. package/lib/index.js +1 -1
  36. package/lib/index.js.map +1 -0
  37. package/lib/interfaces/contributions/contribution.js +40 -40
  38. package/lib/interfaces/contributions/contribution.js.map +1 -0
  39. package/lib/interfaces/ext-services/ext-services.d.ts +2 -2
  40. package/lib/interfaces/extension-manifest.d.ts +1 -1
  41. package/lib/interfaces/graphql.js +1 -1
  42. package/lib/interfaces/graphql.js.map +1 -0
  43. package/lib/interfaces/model.js +3 -3
  44. package/lib/interfaces/model.js.map +1 -0
  45. package/lib/interfaces/text-document.js +76 -77
  46. package/lib/interfaces/text-document.js.map +1 -0
  47. package/lib/interfaces/webview/webview.d.ts +1 -1
  48. package/lib/interfaces/webview/webview.js +3 -3
  49. package/lib/interfaces/webview/webview.js.map +1 -0
  50. package/lib/middlewares/extensionController.js +9 -5
  51. package/lib/middlewares/extensionController.js.map +1 -0
  52. package/lib/protocol/client.protocol.js +2 -2
  53. package/lib/protocol/client.protocol.js.map +1 -0
  54. package/lib/protocol/common.protocol.d.ts +1 -2
  55. package/lib/protocol/common.protocol.js +50 -48
  56. package/lib/protocol/common.protocol.js.map +1 -0
  57. package/lib/protocol/editor-missing-types.js +4 -4
  58. package/lib/protocol/editor-missing-types.js.map +1 -0
  59. package/lib/protocol/proxy-identifier.js +39 -39
  60. package/lib/protocol/proxy-identifier.js.map +1 -0
  61. package/lib/protocol/rpc-logger.js +39 -43
  62. package/lib/protocol/rpc-logger.js.map +1 -0
  63. package/lib/protocol/rpc-protocol.js +736 -724
  64. package/lib/protocol/rpc-protocol.js.map +1 -0
  65. package/lib/protocol/server.protocol.js +22 -22
  66. package/lib/protocol/server.protocol.js.map +1 -0
  67. package/lib/protocol/shared/editor.js +17 -17
  68. package/lib/protocol/shared/editor.js.map +1 -0
  69. package/lib/protocol/temporary-types.js +16 -16
  70. package/lib/protocol/temporary-types.js.map +1 -0
  71. package/lib/protocol/utils/lazy-promise.js +60 -61
  72. package/lib/protocol/utils/lazy-promise.js.map +1 -0
  73. package/lib/react/components/view-component/ViewComponent.js +31 -26
  74. package/lib/react/components/view-component/ViewComponent.js.map +1 -0
  75. package/lib/react/index.js +1 -1
  76. package/lib/react/index.js.map +1 -0
  77. package/lib/react/useExtensionController.js +13 -11
  78. package/lib/react/useExtensionController.js.map +1 -0
  79. package/lib/utils/abortable-rx.js +73 -70
  80. package/lib/utils/abortable-rx.js.map +1 -0
  81. package/lib/utils/errors.js +10 -10
  82. package/lib/utils/errors.js.map +1 -0
  83. package/lib/utils/extensions.js +11 -11
  84. package/lib/utils/extensions.js.map +1 -0
  85. package/lib/utils/helper.test.js +7 -4
  86. package/lib/utils/helper.test.js.map +1 -0
  87. package/lib/utils/paths-util.js +79 -82
  88. package/lib/utils/paths-util.js.map +1 -0
  89. package/lib/utils/rxjs/combineLatestOrDefault.js +72 -70
  90. package/lib/utils/rxjs/combineLatestOrDefault.js.map +1 -0
  91. package/lib/utils/util.js +24 -25
  92. package/lib/utils/util.js.map +1 -0
  93. package/package.json +6 -6
@@ -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 { toPromise } = abortableRx; // to support vite esm
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
- error: () => {
4
- /* noop */
5
- },
6
- warn: () => {
7
- /* noop */
8
- },
9
- info: () => {
10
- /* noop */
11
- },
12
- log: () => {
13
- /* noop */
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
- * The connection is closed.
20
- */
21
- ConnectionErrors[ConnectionErrors["Closed"] = 1] = "Closed";
22
- /**
23
- * The connection got unsubscribed (i.e., disposed).
24
- */
25
- ConnectionErrors[ConnectionErrors["Unsubscribed"] = 2] = "Unsubscribed";
26
- /**
27
- * The connection is already in listening mode.
28
- */
29
- ConnectionErrors[ConnectionErrors["AlreadyListening"] = 3] = "AlreadyListening";
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
- code;
33
- constructor(code, message) {
34
- super(message);
35
- this.code = code;
36
- Object.setPrototypeOf(this, ConnectionError.prototype);
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
- if (!logger) {
41
- logger = NullLogger;
42
- }
43
- return _createConnection(transports, logger);
42
+ if (!logger) {
43
+ logger = NullLogger;
44
+ }
45
+ return _createConnection(transports, logger);
44
46
  }
45
47
  var ConnectionState;
46
48
  (function (ConnectionState) {
47
- ConnectionState[ConnectionState["New"] = 1] = "New";
48
- ConnectionState[ConnectionState["Listening"] = 2] = "Listening";
49
- ConnectionState[ConnectionState["Closed"] = 3] = "Closed";
50
- ConnectionState[ConnectionState["Unsubscribed"] = 4] = "Unsubscribed";
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
- let sequenceNumber = 0;
55
- let notificationSquenceNumber = 0;
56
- let unknownResponseSquenceNumber = 0;
57
- const version = '2.0';
58
- let starRequestHandler;
59
- const requestHandlers = Object.create(null);
60
- let starNotificationHandler;
61
- const notificationHandlers = Object.create(null);
62
- let timer = false;
63
- let messageQueue = new LinkedMap();
64
- let responseObservables = Object.create(null);
65
- let requestAbortControllers = Object.create(null);
66
- let tracer = noopTracer;
67
- let state = ConnectionState.New;
68
- const errorEmitter = new Emitter();
69
- const closeEmitter = new Emitter();
70
- const unhandledNotificationEmitter = new Emitter();
71
- const unsubscribeEmitter = new Emitter();
72
- function createRequestQueueKey(id) {
73
- return 'req-' + id.toString();
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
- function createResponseQueueKey(id) {
76
- if (id === null) {
77
- return 'res-unknown-' + (++unknownResponseSquenceNumber).toString();
78
- }
79
- else {
80
- return 'res-' + id.toString();
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
- function createNotificationQueueKey() {
84
- return 'not-' + (++notificationSquenceNumber).toString();
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
- function addMessageToQueue(queue, message) {
87
- if (isRequestMessage(message)) {
88
- queue.set(createRequestQueueKey(message.id), message);
89
- }
90
- else if (isResponseMessage(message)) {
91
- const key = createResponseQueueKey(message.id) + Math.random(); // TODO(sqs)
92
- queue.set(key, message);
93
- }
94
- else {
95
- queue.set(createNotificationQueueKey(), message);
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
- function isListening() {
99
- return state === ConnectionState.Listening;
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
- function isClosed() {
102
- return state === ConnectionState.Closed;
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
- function isUnsubscribed() {
105
- return state === ConnectionState.Unsubscribed;
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
- function closeHandler() {
108
- if (state === ConnectionState.New || state === ConnectionState.Listening) {
109
- state = ConnectionState.Closed;
110
- closeEmitter.fire(undefined);
111
- }
112
- // If the connection is unsubscribed don't sent close events.
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 readErrorHandler(error) {
115
- errorEmitter.fire([error, undefined, undefined]);
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 writeErrorHandler(data) {
118
- errorEmitter.fire(data);
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
- transports.reader.onClose(closeHandler);
121
- transports.reader.onError(readErrorHandler);
122
- transports.writer.onClose(closeHandler);
123
- transports.writer.onError(writeErrorHandler);
124
- function triggerMessageQueue() {
125
- if (timer || messageQueue.size === 0) {
126
- return;
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
- function processMessageQueue() {
135
- if (messageQueue.size === 0) {
136
- return;
137
- }
138
- const message = messageQueue.shift();
139
- try {
140
- if (isRequestMessage(message)) {
141
- handleRequest(message);
142
- }
143
- else if (isNotificationMessage(message)) {
144
- handleNotification(message);
145
- }
146
- else if (isResponseMessage(message)) {
147
- handleResponse(message);
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
- else {
150
- handleInvalidMessage(message);
151
- }
152
- }
153
- finally {
154
- triggerMessageQueue();
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
- const callback = (message) => {
158
- console.log('[callback.ON_MESSAGE]: ', { transports, message });
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
- // We have received an abort signal. Check if the message is still in the queue and abort it if allowed
161
- // to do so.
162
- if (isNotificationMessage(message) && message.method === ABORT_REQUEST_METHOD) {
163
- const key = createRequestQueueKey(message.params[0]);
164
- const toAbort = messageQueue.get(key);
165
- if (isRequestMessage(toAbort)) {
166
- messageQueue.delete(key);
167
- const response = {
168
- jsonrpc: '2.0',
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
- else {
302
- replyError(new ResponseError(ErrorCodes.MethodNotFound, `Unhandled method ${requestMessage.method}`));
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
- function handleResponse(responseMessage) {
306
- if (isUnsubscribed()) {
307
- // See handle request.
308
- return;
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
- function handleNotification(message) {
360
- if (isUnsubscribed()) {
361
- // See handle request.
362
- return;
363
- }
364
- let notificationHandler;
365
- if (message.method === ABORT_REQUEST_METHOD) {
366
- notificationHandler = (params) => {
367
- const id = params[0];
368
- const abortController = requestAbortControllers[String(id)];
369
- if (abortController) {
370
- abortController.abort();
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
- function handleInvalidMessage(message) {
403
- if (!message) {
404
- logger.error('Received empty message.');
405
- return;
406
- }
407
- logger.error(`Received message which is neither a response nor a notification message:\n${JSON.stringify(message, null, 4)}`);
408
- // Test whether we find an id to reject the promise
409
- const responseMessage = message;
410
- if (typeof responseMessage.id === 'string' || typeof responseMessage.id === 'number') {
411
- const key = String(responseMessage.id);
412
- const responseHandler = responseObservables[key];
413
- if (responseHandler) {
414
- responseHandler.observer.error(new Error('The received response has neither a result nor an error property.'));
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
- function throwIfClosedOrUnsubscribed() {
419
- if (isClosed()) {
420
- throw new ConnectionError(ConnectionErrors.Closed, 'Connection is closed.');
421
- }
422
- if (isUnsubscribed()) {
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
- function throwIfListening() {
427
- if (isListening()) {
428
- throw new ConnectionError(ConnectionErrors.AlreadyListening, 'Connection is already listening');
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
- function throwIfNotListening() {
432
- if (!isListening()) {
433
- throw new Error('Call listen() first.');
434
- }
398
+ }
399
+ function throwIfClosedOrUnsubscribed() {
400
+ if (isClosed()) {
401
+ throw new ConnectionError(ConnectionErrors.Closed, 'Connection is closed.');
435
402
  }
436
- const sendNotification = (method, params, toSecondary = false) => {
437
- throwIfClosedOrUnsubscribed();
438
- const notificationMessage = {
439
- jsonrpc: version,
440
- method,
441
- params,
442
- };
443
- tracer.notificationSent(notificationMessage);
444
- transports.writer.write(notificationMessage);
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
- * @returns a hot observable with the result of sending the request
448
- */
449
- const requestHelper = (method, params, toSecondary) => {
450
- const id = sequenceNumber++;
451
- const requestMessage = {
452
- jsonrpc: version,
453
- id,
454
- method,
455
- params,
456
- toSecondary,
457
- };
458
- const subject = new Subject();
459
- const responseObserver = {
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 connection = {
485
- sendNotification,
486
- onNotification: (type, handler) => {
487
- throwIfClosedOrUnsubscribed();
488
- if (typeof type === 'function') {
489
- starNotificationHandler = type;
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
- return connection;
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
- if (typeof setImmediate !== 'undefined') {
553
- setImmediate(f);
554
- return;
555
- }
556
- setTimeout(f, 0);
535
+ if (typeof setImmediate !== 'undefined') {
536
+ setImmediate(f);
537
+ return;
538
+ }
539
+ setTimeout(f, 0);
557
540
  }
558
541
  function matchedStartActor(requestHandlersKeys, method) {
559
- try {
560
- return requestHandlersKeys.filter((name) => {
561
- let methodName = method.split('/')[0];
562
- return `${methodName}/*` === name;
563
- })[0];
564
- }
565
- catch (e) {
566
- console.log('no matched value');
567
- return null;
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