typescript-language-server
Version:
Language Server Protocol (LSP) implementation for TypeScript using tsserver
74 lines • 2.65 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
/*
* Copyright (C) 2022 TypeFox and others.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*/
export var RequestQueueingType;
(function (RequestQueueingType) {
/**
* Normal request that is executed in order.
*/
RequestQueueingType[RequestQueueingType["Normal"] = 1] = "Normal";
/**
* Request that normal requests jump in front of in the queue.
*/
RequestQueueingType[RequestQueueingType["LowPriority"] = 2] = "LowPriority";
/**
* A fence that blocks request reordering.
*
* Fences are not reordered. Unlike a normal request, a fence will never jump in front of a low priority request
* in the request queue.
*/
RequestQueueingType[RequestQueueingType["Fence"] = 3] = "Fence";
})(RequestQueueingType = RequestQueueingType || (RequestQueueingType = {}));
export class RequestQueue {
constructor() {
this.queue = [];
this.sequenceNumber = 0;
}
get length() {
return this.queue.length;
}
enqueue(item) {
if (item.queueingType === RequestQueueingType.Normal) {
let index = this.queue.length - 1;
while (index >= 0) {
if (this.queue[index].queueingType !== RequestQueueingType.LowPriority) {
break;
}
--index;
}
this.queue.splice(index + 1, 0, item);
}
else {
// Only normal priority requests can be reordered. All other requests just go to the end.
this.queue.push(item);
}
}
dequeue() {
return this.queue.shift();
}
tryDeletePendingRequest(seq) {
for (let i = 0; i < this.queue.length; i++) {
if (this.queue[i].request.seq === seq) {
this.queue.splice(i, 1);
return true;
}
}
return false;
}
createRequest(command, args) {
return {
seq: this.sequenceNumber++,
type: 'request',
command: command,
arguments: args,
};
}
}
//# sourceMappingURL=requestQueue.js.map