@mrclrchtr/supi-lsp 1.11.0 → 1.11.2

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 (35) hide show
  1. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +1 -1
  2. package/node_modules/@mrclrchtr/supi-code-runtime/package.json +2 -2
  3. package/node_modules/@mrclrchtr/supi-core/package.json +1 -1
  4. package/node_modules/vscode-jsonrpc/README.md +2 -17
  5. package/node_modules/vscode-jsonrpc/eslint.config.js +12 -0
  6. package/node_modules/vscode-jsonrpc/lib/browser/main.js +10 -3
  7. package/node_modules/vscode-jsonrpc/lib/browser/ril.d.ts +11 -1
  8. package/node_modules/vscode-jsonrpc/lib/browser/ril.js +58 -4
  9. package/node_modules/vscode-jsonrpc/lib/common/api.d.ts +3 -3
  10. package/node_modules/vscode-jsonrpc/lib/common/api.js +10 -4
  11. package/node_modules/vscode-jsonrpc/lib/common/cancellation.js +41 -5
  12. package/node_modules/vscode-jsonrpc/lib/common/connection.d.ts +76 -67
  13. package/node_modules/vscode-jsonrpc/lib/common/connection.js +217 -160
  14. package/node_modules/vscode-jsonrpc/lib/common/events.js +10 -3
  15. package/node_modules/vscode-jsonrpc/lib/common/is.js +7 -8
  16. package/node_modules/vscode-jsonrpc/lib/common/linkedMap.d.ts +3 -1
  17. package/node_modules/vscode-jsonrpc/lib/common/linkedMap.js +17 -3
  18. package/node_modules/vscode-jsonrpc/lib/common/messageBuffer.js +5 -2
  19. package/node_modules/vscode-jsonrpc/lib/common/messageReader.js +52 -3
  20. package/node_modules/vscode-jsonrpc/lib/common/messageWriter.js +45 -3
  21. package/node_modules/vscode-jsonrpc/lib/common/messages.js +147 -17
  22. package/node_modules/vscode-jsonrpc/lib/common/semaphore.js +8 -2
  23. package/node_modules/vscode-jsonrpc/lib/common/sharedArrayCancellation.js +4 -3
  24. package/node_modules/vscode-jsonrpc/lib/node/main.d.ts +0 -5
  25. package/node_modules/vscode-jsonrpc/lib/node/main.js +56 -24
  26. package/node_modules/vscode-jsonrpc/lib/node/ril.d.ts +0 -1
  27. package/node_modules/vscode-jsonrpc/lib/node/ril.js +3 -1
  28. package/node_modules/vscode-jsonrpc/package.json +20 -11
  29. package/node_modules/vscode-jsonrpc/tsconfig.tsbuildinfo +1 -0
  30. package/package.json +4 -4
  31. package/node_modules/vscode-jsonrpc/browser.d.ts +0 -6
  32. package/node_modules/vscode-jsonrpc/browser.js +0 -7
  33. package/node_modules/vscode-jsonrpc/node.cmd +0 -5
  34. package/node_modules/vscode-jsonrpc/node.d.ts +0 -6
  35. package/node_modules/vscode-jsonrpc/node.js +0 -7
@@ -3,10 +3,48 @@
3
3
  * Copyright (c) Microsoft Corporation. All rights reserved.
4
4
  * Licensed under the MIT License. See License.txt in the project root for license information.
5
5
  * ------------------------------------------------------------------------------------------ */
6
+ /// <reference path="../../typings/thenable.d.ts" preserve="true"/>
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ var __importDefault = (this && this.__importDefault) || function (mod) {
41
+ return (mod && mod.__esModule) ? mod : { "default": mod };
42
+ };
6
43
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.createMessageConnection = exports.ConnectionOptions = exports.MessageStrategy = exports.CancellationStrategy = exports.CancellationSenderStrategy = exports.CancellationReceiverStrategy = exports.RequestCancellationReceiverStrategy = exports.IdCancellationReceiverStrategy = exports.ConnectionStrategy = exports.ConnectionError = exports.ConnectionErrors = exports.LogTraceNotification = exports.SetTraceNotification = exports.TraceFormat = exports.TraceValues = exports.Trace = exports.NullLogger = exports.ProgressType = exports.ProgressToken = void 0;
8
- const ral_1 = require("./ral");
9
- const Is = require("./is");
44
+ exports.ConnectionOptions = exports.MessageStrategy = exports.CancellationStrategy = exports.CancellationSenderStrategy = exports.CancellationReceiverStrategy = exports.RequestCancellationReceiverStrategy = exports.IdCancellationReceiverStrategy = exports.ConnectionStrategy = exports.ConnectionError = exports.ConnectionErrors = exports.LogTraceNotification = exports.SetTraceNotification = exports.TraceFormat = exports.TraceValues = exports.TraceValue = exports.Trace = exports.NullLogger = exports.ProgressType = exports.ProgressToken = void 0;
45
+ exports.createMessageConnection = createMessageConnection;
46
+ const ral_1 = __importDefault(require("./ral"));
47
+ const Is = __importStar(require("./is"));
10
48
  const messages_1 = require("./messages");
11
49
  const linkedMap_1 = require("./linkedMap");
12
50
  const events_1 = require("./events");
@@ -27,6 +65,12 @@ var ProgressNotification;
27
65
  ProgressNotification.type = new messages_1.NotificationType('$/progress');
28
66
  })(ProgressNotification || (ProgressNotification = {}));
29
67
  class ProgressType {
68
+ /**
69
+ * Clients must not use these properties. They are here to ensure correct typing.
70
+ * in TypeScript
71
+ */
72
+ __;
73
+ _pr;
30
74
  constructor() {
31
75
  }
32
76
  }
@@ -51,25 +95,29 @@ var Trace;
51
95
  Trace[Trace["Compact"] = 2] = "Compact";
52
96
  Trace[Trace["Verbose"] = 3] = "Verbose";
53
97
  })(Trace || (exports.Trace = Trace = {}));
54
- var TraceValues;
55
- (function (TraceValues) {
98
+ var TraceValue;
99
+ (function (TraceValue) {
56
100
  /**
57
101
  * Turn tracing off.
58
102
  */
59
- TraceValues.Off = 'off';
103
+ TraceValue.Off = 'off';
60
104
  /**
61
105
  * Trace messages only.
62
106
  */
63
- TraceValues.Messages = 'messages';
107
+ TraceValue.Messages = 'messages';
64
108
  /**
65
109
  * Compact message tracing.
66
110
  */
67
- TraceValues.Compact = 'compact';
111
+ TraceValue.Compact = 'compact';
68
112
  /**
69
113
  * Verbose message tracing.
70
114
  */
71
- TraceValues.Verbose = 'verbose';
72
- })(TraceValues || (exports.TraceValues = TraceValues = {}));
115
+ TraceValue.Verbose = 'verbose';
116
+ })(TraceValue || (exports.TraceValue = TraceValue = {}));
117
+ /**
118
+ * @deprecated Use TraceValue instead
119
+ */
120
+ exports.TraceValues = TraceValue;
73
121
  (function (Trace) {
74
122
  function fromString(value) {
75
123
  if (!Is.string(value)) {
@@ -150,6 +198,7 @@ var ConnectionErrors;
150
198
  ConnectionErrors[ConnectionErrors["AlreadyListening"] = 3] = "AlreadyListening";
151
199
  })(ConnectionErrors || (exports.ConnectionErrors = ConnectionErrors = {}));
152
200
  class ConnectionError extends Error {
201
+ code;
153
202
  constructor(code, message) {
154
203
  super(message);
155
204
  this.code = code;
@@ -231,7 +280,8 @@ var ConnectionOptions;
231
280
  (function (ConnectionOptions) {
232
281
  function is(value) {
233
282
  const candidate = value;
234
- return candidate && (CancellationStrategy.is(candidate.cancellationStrategy) || ConnectionStrategy.is(candidate.connectionStrategy) || MessageStrategy.is(candidate.messageStrategy));
283
+ return candidate
284
+ && (CancellationStrategy.is(candidate.cancellationStrategy) || ConnectionStrategy.is(candidate.connectionStrategy) || MessageStrategy.is(candidate.messageStrategy) || Is.number(candidate.maxParallelism));
235
285
  }
236
286
  ConnectionOptions.is = is;
237
287
  })(ConnectionOptions || (exports.ConnectionOptions = ConnectionOptions = {}));
@@ -248,6 +298,8 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
248
298
  let notificationSequenceNumber = 0;
249
299
  let unknownResponseSequenceNumber = 0;
250
300
  const version = '2.0';
301
+ const maxParallelism = options?.maxParallelism ?? -1;
302
+ let inFlight = 0;
251
303
  let starRequestHandler = undefined;
252
304
  const requestHandlers = new Map();
253
305
  let starNotificationHandler = undefined;
@@ -268,34 +320,6 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
268
320
  const unhandledProgressEmitter = new events_1.Emitter();
269
321
  const disposeEmitter = new events_1.Emitter();
270
322
  const cancellationStrategy = (options && options.cancellationStrategy) ? options.cancellationStrategy : CancellationStrategy.Message;
271
- function createRequestQueueKey(id) {
272
- if (id === null) {
273
- throw new Error(`Can't send requests with id null since the response can't be correlated.`);
274
- }
275
- return 'req-' + id.toString();
276
- }
277
- function createResponseQueueKey(id) {
278
- if (id === null) {
279
- return 'res-unknown-' + (++unknownResponseSequenceNumber).toString();
280
- }
281
- else {
282
- return 'res-' + id.toString();
283
- }
284
- }
285
- function createNotificationQueueKey() {
286
- return 'not-' + (++notificationSequenceNumber).toString();
287
- }
288
- function addMessageToQueue(queue, message) {
289
- if (messages_1.Message.isRequest(message)) {
290
- queue.set(createRequestQueueKey(message.id), message);
291
- }
292
- else if (messages_1.Message.isResponse(message)) {
293
- queue.set(createResponseQueueKey(message.id), message);
294
- }
295
- else {
296
- queue.set(createNotificationQueueKey(), message);
297
- }
298
- }
299
323
  function cancelUndispatched(_message) {
300
324
  return undefined;
301
325
  }
@@ -325,45 +349,101 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
325
349
  messageReader.onError(readErrorHandler);
326
350
  messageWriter.onClose(closeHandler);
327
351
  messageWriter.onError(writeErrorHandler);
328
- function triggerMessageQueue() {
329
- if (timer || messageQueue.size === 0) {
330
- return;
352
+ function createRequestQueueKey(id) {
353
+ if (id === null) {
354
+ throw new Error(`Can't send requests with id null since the response can't be correlated.`);
331
355
  }
332
- timer = (0, ral_1.default)().timer.setImmediate(() => {
333
- timer = undefined;
334
- processMessageQueue();
335
- });
356
+ return 'req-' + id.toString();
336
357
  }
337
- function handleMessage(message) {
338
- if (messages_1.Message.isRequest(message)) {
339
- handleRequest(message);
358
+ function createResponseQueueKey(id) {
359
+ if (id === null) {
360
+ return 'res-unknown-' + (++unknownResponseSequenceNumber).toString();
340
361
  }
341
- else if (messages_1.Message.isNotification(message)) {
342
- handleNotification(message);
362
+ else {
363
+ return 'res-' + id.toString();
364
+ }
365
+ }
366
+ function createNotificationQueueKey() {
367
+ return 'not-' + (++notificationSequenceNumber).toString();
368
+ }
369
+ function addMessageToQueue(queue, message) {
370
+ if (messages_1.Message.isRequest(message)) {
371
+ queue.set(createRequestQueueKey(message.id), message);
343
372
  }
344
373
  else if (messages_1.Message.isResponse(message)) {
345
- handleResponse(message);
374
+ // If we have unlimited parallelism we queue the response to keep
375
+ // the previous semantics.
376
+ if (maxParallelism === -1) {
377
+ queue.set(createResponseQueueKey(message.id), message);
378
+ }
379
+ else {
380
+ // If we have limited parallelism we resolve responses to avoid
381
+ // dead locks.
382
+ handleResponse(message);
383
+ }
346
384
  }
347
385
  else {
348
- handleInvalidMessage(message);
386
+ queue.set(createNotificationQueueKey(), message);
349
387
  }
350
388
  }
351
- function processMessageQueue() {
352
- if (messageQueue.size === 0) {
389
+ function triggerMessageQueue() {
390
+ if (timer || messageQueue.size === 0) {
353
391
  return;
354
392
  }
355
- const message = messageQueue.shift();
356
- try {
357
- const messageStrategy = options?.messageStrategy;
358
- if (MessageStrategy.is(messageStrategy)) {
359
- messageStrategy.handleMessage(message, handleMessage);
393
+ if (maxParallelism !== -1 && inFlight >= maxParallelism) {
394
+ return;
395
+ }
396
+ timer = (0, ral_1.default)().timer.setImmediate(async () => {
397
+ timer = undefined;
398
+ if (messageQueue.size === 0) {
399
+ return;
360
400
  }
361
- else {
362
- handleMessage(message);
401
+ if (maxParallelism !== -1 && inFlight >= maxParallelism) {
402
+ return;
403
+ }
404
+ const message = messageQueue.shift();
405
+ let result;
406
+ try {
407
+ inFlight++;
408
+ const messageStrategy = options?.messageStrategy;
409
+ if (MessageStrategy.is(messageStrategy)) {
410
+ result = messageStrategy.handleMessage(message, handleMessage);
411
+ }
412
+ else {
413
+ result = handleMessage(message);
414
+ }
415
+ }
416
+ catch (error) {
417
+ logger.error(`Processing message queue failed: ${error.toString()}`);
418
+ }
419
+ finally {
420
+ if (result instanceof Promise) {
421
+ result.then(() => {
422
+ inFlight--;
423
+ triggerMessageQueue();
424
+ }).catch((error) => {
425
+ logger.error(`Processing message queue failed: ${error.toString()}`);
426
+ });
427
+ }
428
+ else {
429
+ inFlight--;
430
+ }
431
+ triggerMessageQueue();
363
432
  }
433
+ });
434
+ }
435
+ async function handleMessage(message) {
436
+ if (messages_1.Message.isRequest(message)) {
437
+ return handleRequest(message);
364
438
  }
365
- finally {
366
- triggerMessageQueue();
439
+ else if (messages_1.Message.isNotification(message)) {
440
+ return handleNotification(message);
441
+ }
442
+ else if (messages_1.Message.isResponse(message)) {
443
+ return handleResponse(message);
444
+ }
445
+ else {
446
+ return handleInvalidMessage(message);
367
447
  }
368
448
  }
369
449
  const callback = (message) => {
@@ -405,11 +485,11 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
405
485
  triggerMessageQueue();
406
486
  }
407
487
  };
408
- function handleRequest(requestMessage) {
488
+ async function handleRequest(requestMessage) {
409
489
  if (isDisposed()) {
410
490
  // we return here silently since we fired an event when the
411
491
  // connection got disposed.
412
- return;
492
+ return Promise.resolve();
413
493
  }
414
494
  function reply(resultOrError, method, startTime) {
415
495
  const message = {
@@ -423,7 +503,7 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
423
503
  message.result = resultOrError === undefined ? null : resultOrError;
424
504
  }
425
505
  traceSendingResponse(message, method, startTime);
426
- messageWriter.write(message).catch(() => logger.error(`Sending response failed.`));
506
+ return messageWriter.write(message);
427
507
  }
428
508
  function replyError(error, method, startTime) {
429
509
  const message = {
@@ -432,21 +512,7 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
432
512
  error: error.toJson()
433
513
  };
434
514
  traceSendingResponse(message, method, startTime);
435
- messageWriter.write(message).catch(() => logger.error(`Sending response failed.`));
436
- }
437
- function replySuccess(result, method, startTime) {
438
- // The JSON RPC defines that a response must either have a result or an error
439
- // So we can't treat undefined as a valid response result.
440
- if (result === undefined) {
441
- result = null;
442
- }
443
- const message = {
444
- jsonrpc: version,
445
- id: requestMessage.id,
446
- result: result
447
- };
448
- traceSendingResponse(message, method, startTime);
449
- messageWriter.write(message).catch(() => logger.error(`Sending response failed.`));
515
+ return messageWriter.write(message);
450
516
  }
451
517
  traceReceivedRequest(requestMessage);
452
518
  const element = requestHandlers.get(requestMessage.method);
@@ -473,22 +539,19 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
473
539
  if (requestHandler) {
474
540
  if (requestMessage.params === undefined) {
475
541
  if (type !== undefined && type.numberOfParams !== 0) {
476
- replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InvalidParams, `Request ${requestMessage.method} defines ${type.numberOfParams} params but received none.`), requestMessage.method, startTime);
477
- return;
542
+ return replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InvalidParams, `Request ${requestMessage.method} defines ${type.numberOfParams} params but received none.`), requestMessage.method, startTime);
478
543
  }
479
544
  handlerResult = requestHandler(cancellationSource.token);
480
545
  }
481
546
  else if (Array.isArray(requestMessage.params)) {
482
547
  if (type !== undefined && type.parameterStructures === messages_1.ParameterStructures.byName) {
483
- replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InvalidParams, `Request ${requestMessage.method} defines parameters by name but received parameters by position`), requestMessage.method, startTime);
484
- return;
548
+ return replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InvalidParams, `Request ${requestMessage.method} defines parameters by name but received parameters by position`), requestMessage.method, startTime);
485
549
  }
486
550
  handlerResult = requestHandler(...requestMessage.params, cancellationSource.token);
487
551
  }
488
552
  else {
489
553
  if (type !== undefined && type.parameterStructures === messages_1.ParameterStructures.byPosition) {
490
- replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InvalidParams, `Request ${requestMessage.method} defines parameters by position but received parameters by name`), requestMessage.method, startTime);
491
- return;
554
+ return replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InvalidParams, `Request ${requestMessage.method} defines parameters by position but received parameters by name`), requestMessage.method, startTime);
492
555
  }
493
556
  handlerResult = requestHandler(requestMessage.params, cancellationSource.token);
494
557
  }
@@ -496,48 +559,26 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
496
559
  else if (starRequestHandler) {
497
560
  handlerResult = starRequestHandler(requestMessage.method, requestMessage.params, cancellationSource.token);
498
561
  }
499
- const promise = handlerResult;
500
- if (!handlerResult) {
501
- requestTokens.delete(tokenKey);
502
- replySuccess(handlerResult, requestMessage.method, startTime);
503
- }
504
- else if (promise.then) {
505
- promise.then((resultOrError) => {
506
- requestTokens.delete(tokenKey);
507
- reply(resultOrError, requestMessage.method, startTime);
508
- }, error => {
509
- requestTokens.delete(tokenKey);
510
- if (error instanceof messages_1.ResponseError) {
511
- replyError(error, requestMessage.method, startTime);
512
- }
513
- else if (error && Is.string(error.message)) {
514
- replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed with message: ${error.message}`), requestMessage.method, startTime);
515
- }
516
- else {
517
- replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`), requestMessage.method, startTime);
518
- }
519
- });
520
- }
521
- else {
522
- requestTokens.delete(tokenKey);
523
- reply(handlerResult, requestMessage.method, startTime);
524
- }
562
+ const resultOrError = await handlerResult;
563
+ await reply(resultOrError, requestMessage.method, startTime);
525
564
  }
526
565
  catch (error) {
527
- requestTokens.delete(tokenKey);
528
566
  if (error instanceof messages_1.ResponseError) {
529
- reply(error, requestMessage.method, startTime);
567
+ await reply(error, requestMessage.method, startTime);
530
568
  }
531
569
  else if (error && Is.string(error.message)) {
532
- replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed with message: ${error.message}`), requestMessage.method, startTime);
570
+ await replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed with message: ${error.message}`), requestMessage.method, startTime);
533
571
  }
534
572
  else {
535
- replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`), requestMessage.method, startTime);
573
+ await replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`), requestMessage.method, startTime);
536
574
  }
537
575
  }
576
+ finally {
577
+ requestTokens.delete(tokenKey);
578
+ }
538
579
  }
539
580
  else {
540
- replyError(new messages_1.ResponseError(messages_1.ErrorCodes.MethodNotFound, `Unhandled method ${requestMessage.method}`), requestMessage.method, startTime);
581
+ await replyError(new messages_1.ResponseError(messages_1.ErrorCodes.MethodNotFound, `Unhandled method ${requestMessage.method}`), requestMessage.method, startTime);
541
582
  }
542
583
  }
543
584
  function handleResponse(responseMessage) {
@@ -582,7 +623,7 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
582
623
  }
583
624
  }
584
625
  }
585
- function handleNotification(message) {
626
+ async function handleNotification(message) {
586
627
  if (isDisposed()) {
587
628
  // See handle request.
588
629
  return;
@@ -612,14 +653,14 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
612
653
  logger.error(`Notification ${message.method} defines ${type.numberOfParams} params but received none.`);
613
654
  }
614
655
  }
615
- notificationHandler();
656
+ await notificationHandler();
616
657
  }
617
658
  else if (Array.isArray(message.params)) {
618
659
  // There are JSON-RPC libraries that send progress message as positional params although
619
660
  // specified as named. So convert them if this is the case.
620
661
  const params = message.params;
621
662
  if (message.method === ProgressNotification.type.method && params.length === 2 && ProgressToken.is(params[0])) {
622
- notificationHandler({ token: params[0], value: params[1] });
663
+ await notificationHandler({ token: params[0], value: params[1] });
623
664
  }
624
665
  else {
625
666
  if (type !== undefined) {
@@ -630,18 +671,18 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
630
671
  logger.error(`Notification ${message.method} defines ${type.numberOfParams} params but received ${params.length} arguments`);
631
672
  }
632
673
  }
633
- notificationHandler(...params);
674
+ await notificationHandler(...params);
634
675
  }
635
676
  }
636
677
  else {
637
678
  if (type !== undefined && type.parameterStructures === messages_1.ParameterStructures.byPosition) {
638
679
  logger.error(`Notification ${message.method} defines parameters by position but received parameters by name`);
639
680
  }
640
- notificationHandler(message.params);
681
+ await notificationHandler(message.params);
641
682
  }
642
683
  }
643
684
  else if (starNotificationHandler) {
644
- starNotificationHandler(message.method, message.params);
685
+ await starNotificationHandler(message.method, message.params);
645
686
  }
646
687
  }
647
688
  catch (error) {
@@ -693,7 +734,7 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
693
734
  if (traceFormat === TraceFormat.Text) {
694
735
  let data = undefined;
695
736
  if ((trace === Trace.Verbose || trace === Trace.Compact) && message.params) {
696
- data = `Params: ${stringifyTrace(message.params)}\n\n`;
737
+ data = `Params: ${stringifyTrace(message.params)}`;
697
738
  }
698
739
  tracer.log(`Sending request '${message.method} - (${message.id})'.`, data);
699
740
  }
@@ -709,10 +750,10 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
709
750
  let data = undefined;
710
751
  if (trace === Trace.Verbose || trace === Trace.Compact) {
711
752
  if (message.params) {
712
- data = `Params: ${stringifyTrace(message.params)}\n\n`;
753
+ data = `Params: ${stringifyTrace(message.params)}`;
713
754
  }
714
755
  else {
715
- data = 'No parameters provided.\n\n';
756
+ data = 'No parameters provided.';
716
757
  }
717
758
  }
718
759
  tracer.log(`Sending notification '${message.method}'.`, data);
@@ -729,14 +770,14 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
729
770
  let data = undefined;
730
771
  if (trace === Trace.Verbose || trace === Trace.Compact) {
731
772
  if (message.error && message.error.data) {
732
- data = `Error data: ${stringifyTrace(message.error.data)}\n\n`;
773
+ data = `Error data: ${stringifyTrace(message.error.data)}`;
733
774
  }
734
775
  else {
735
776
  if (message.result) {
736
- data = `Result: ${stringifyTrace(message.result)}\n\n`;
777
+ data = `Result: ${stringifyTrace(message.result)}`;
737
778
  }
738
779
  else if (message.error === undefined) {
739
- data = 'No result returned.\n\n';
780
+ data = 'No result returned.';
740
781
  }
741
782
  }
742
783
  }
@@ -753,7 +794,7 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
753
794
  if (traceFormat === TraceFormat.Text) {
754
795
  let data = undefined;
755
796
  if ((trace === Trace.Verbose || trace === Trace.Compact) && message.params) {
756
- data = `Params: ${stringifyTrace(message.params)}\n\n`;
797
+ data = `Params: ${stringifyTrace(message.params)}`;
757
798
  }
758
799
  tracer.log(`Received request '${message.method} - (${message.id})'.`, data);
759
800
  }
@@ -769,10 +810,10 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
769
810
  let data = undefined;
770
811
  if (trace === Trace.Verbose || trace === Trace.Compact) {
771
812
  if (message.params) {
772
- data = `Params: ${stringifyTrace(message.params)}\n\n`;
813
+ data = `Params: ${stringifyTrace(message.params)}`;
773
814
  }
774
815
  else {
775
- data = 'No parameters provided.\n\n';
816
+ data = 'No parameters provided.';
776
817
  }
777
818
  }
778
819
  tracer.log(`Received notification '${message.method}'.`, data);
@@ -789,14 +830,14 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
789
830
  let data = undefined;
790
831
  if (trace === Trace.Verbose || trace === Trace.Compact) {
791
832
  if (message.error && message.error.data) {
792
- data = `Error data: ${stringifyTrace(message.error.data)}\n\n`;
833
+ data = `Error data: ${stringifyTrace(message.error.data)}`;
793
834
  }
794
835
  else {
795
836
  if (message.result) {
796
- data = `Result: ${stringifyTrace(message.result)}\n\n`;
837
+ data = `Result: ${stringifyTrace(message.result)}`;
797
838
  }
798
839
  else if (message.error === undefined) {
799
- data = 'No result returned.\n\n';
840
+ data = 'No result returned.';
800
841
  }
801
842
  }
802
843
  }
@@ -919,7 +960,7 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
919
960
  paramStart = 1;
920
961
  parameterStructures = first;
921
962
  }
922
- let paramEnd = args.length;
963
+ const paramEnd = args.length;
923
964
  const numberOfParams = paramEnd - paramStart;
924
965
  switch (numberOfParams) {
925
966
  case 0:
@@ -971,9 +1012,11 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
971
1012
  return {
972
1013
  dispose: () => {
973
1014
  if (method !== undefined) {
974
- notificationHandlers.delete(method);
1015
+ if (notificationHandlers.get(method)?.handler === handler) {
1016
+ notificationHandlers.delete(method);
1017
+ }
975
1018
  }
976
- else {
1019
+ else if (starNotificationHandler === type) {
977
1020
  starNotificationHandler = undefined;
978
1021
  }
979
1022
  }
@@ -986,7 +1029,9 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
986
1029
  progressHandlers.set(token, handler);
987
1030
  return {
988
1031
  dispose: () => {
989
- progressHandlers.delete(token);
1032
+ if (progressHandlers.get(token) === handler) {
1033
+ progressHandlers.delete(token);
1034
+ }
990
1035
  }
991
1036
  };
992
1037
  },
@@ -999,6 +1044,17 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
999
1044
  sendRequest: (type, ...args) => {
1000
1045
  throwIfClosedOrDisposed();
1001
1046
  throwIfNotListening();
1047
+ function sendCancellation(connection, id) {
1048
+ const p = cancellationStrategy.sender.sendCancellation(connection, id);
1049
+ if (p === undefined) {
1050
+ logger.log(`Received no promise from cancellation strategy when cancelling id ${id}`);
1051
+ }
1052
+ else {
1053
+ p.catch(() => {
1054
+ logger.log(`Sending cancellation messages for id ${id} failed.`);
1055
+ });
1056
+ }
1057
+ }
1002
1058
  let method;
1003
1059
  let messageParams;
1004
1060
  let token = undefined;
@@ -1042,19 +1098,16 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
1042
1098
  }
1043
1099
  const id = sequenceNumber++;
1044
1100
  let disposable;
1045
- if (token) {
1046
- disposable = token.onCancellationRequested(() => {
1047
- const p = cancellationStrategy.sender.sendCancellation(connection, id);
1048
- if (p === undefined) {
1049
- logger.log(`Received no promise from cancellation strategy when cancelling id ${id}`);
1050
- return Promise.resolve();
1051
- }
1052
- else {
1053
- return p.catch(() => {
1054
- logger.log(`Sending cancellation messages for id ${id} failed`);
1055
- });
1056
- }
1057
- });
1101
+ let tokenWasCancelled = false;
1102
+ if (token !== undefined) {
1103
+ if (token.isCancellationRequested) {
1104
+ tokenWasCancelled = true;
1105
+ }
1106
+ else {
1107
+ disposable = token.onCancellationRequested(() => {
1108
+ sendCancellation(connection, id);
1109
+ });
1110
+ }
1058
1111
  }
1059
1112
  const requestMessage = {
1060
1113
  jsonrpc: version,
@@ -1066,6 +1119,7 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
1066
1119
  if (typeof cancellationStrategy.sender.enableCancellation === 'function') {
1067
1120
  cancellationStrategy.sender.enableCancellation(requestMessage);
1068
1121
  }
1122
+ // eslint-disable-next-line no-async-promise-executor
1069
1123
  return new Promise(async (resolve, reject) => {
1070
1124
  const resolveWithCleanup = (r) => {
1071
1125
  resolve(r);
@@ -1081,6 +1135,9 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
1081
1135
  try {
1082
1136
  responsePromises.set(id, responsePromise);
1083
1137
  await messageWriter.write(requestMessage);
1138
+ if (tokenWasCancelled) {
1139
+ sendCancellation(connection, id);
1140
+ }
1084
1141
  }
1085
1142
  catch (error) {
1086
1143
  // Writing the message failed. So we need to delete it from the response promises and
@@ -1118,9 +1175,11 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
1118
1175
  return;
1119
1176
  }
1120
1177
  if (method !== undefined) {
1121
- requestHandlers.delete(method);
1178
+ if (requestHandlers.get(method)?.handler === handler) {
1179
+ requestHandlers.delete(method);
1180
+ }
1122
1181
  }
1123
- else {
1182
+ else if (starRequestHandler === type) {
1124
1183
  starRequestHandler = undefined;
1125
1184
  }
1126
1185
  }
@@ -1189,7 +1248,6 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
1189
1248
  messageReader.listen(callback);
1190
1249
  },
1191
1250
  inspect: () => {
1192
- // eslint-disable-next-line no-console
1193
1251
  (0, ral_1.default)().console.log('inspect');
1194
1252
  }
1195
1253
  };
@@ -1200,10 +1258,10 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
1200
1258
  const verbose = trace === Trace.Verbose || trace === Trace.Compact;
1201
1259
  tracer.log(params.message, verbose ? params.verbose : undefined);
1202
1260
  });
1203
- connection.onNotification(ProgressNotification.type, (params) => {
1261
+ connection.onNotification(ProgressNotification.type, async (params) => {
1204
1262
  const handler = progressHandlers.get(params.token);
1205
1263
  if (handler) {
1206
- handler(params.value);
1264
+ await handler(params.value);
1207
1265
  }
1208
1266
  else {
1209
1267
  unhandledProgressEmitter.fire(params);
@@ -1211,4 +1269,3 @@ function createMessageConnection(messageReader, messageWriter, _logger, options)
1211
1269
  });
1212
1270
  return connection;
1213
1271
  }
1214
- exports.createMessageConnection = createMessageConnection;