ts-migrate-server
Version:
A package that contains the main migration runner and spawns a TSServer process
86 lines • 3.18 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/**
* Modeled after https://github.com/Microsoft/vscode/blob/92f9f50a93ba278f7bb637386ac1ffcdfd38a55e/extensions/typescript-language-features/src/utils/wireProtocol.ts#L17
*/
const DEFAULT_SIZE = 8192;
const CONTENT_LENGTH = 'Content-Length: ';
const CONTENT_LENGTH_SIZE = Buffer.byteLength(CONTENT_LENGTH, 'utf8');
const BLANK = Buffer.from(' ', 'utf8')[0];
const BACKSLASH_R = Buffer.from('\r', 'utf8')[0];
const BACKSLASH_N = Buffer.from('\n', 'utf8')[0];
class ProtocolBuffer {
constructor() {
this.index = 0;
this.buffer = Buffer.allocUnsafe(DEFAULT_SIZE);
}
append(data) {
let toAppend = null;
if (Buffer.isBuffer(data)) {
toAppend = data;
}
else {
toAppend = Buffer.from(data, 'utf8');
}
if (this.buffer.length - this.index >= toAppend.length) {
toAppend.copy(this.buffer, this.index, 0, toAppend.length);
}
else {
const newSize = (Math.ceil((this.index + toAppend.length) / DEFAULT_SIZE) + 1) * DEFAULT_SIZE;
if (this.index === 0) {
this.buffer = Buffer.allocUnsafe(newSize);
toAppend.copy(this.buffer, 0, 0, toAppend.length);
}
else {
this.buffer = Buffer.concat([this.buffer.slice(0, this.index), toAppend], newSize);
}
}
this.index += toAppend.length;
}
tryReadContentLength() {
let result = -1;
let current = 0;
// we are utf8 encoding...
while (current < this.index &&
(this.buffer[current] === BLANK ||
this.buffer[current] === BACKSLASH_R ||
this.buffer[current] === BACKSLASH_N)) {
current += 1;
}
if (this.index < current + CONTENT_LENGTH_SIZE) {
return result;
}
current += CONTENT_LENGTH_SIZE;
const start = current;
while (current < this.index && this.buffer[current] !== BACKSLASH_R) {
current += 1;
}
if (current + 3 >= this.index ||
this.buffer[current + 1] !== BACKSLASH_N ||
this.buffer[current + 2] !== BACKSLASH_R ||
this.buffer[current + 3] !== BACKSLASH_N) {
return result;
}
const data = this.buffer.toString('utf8', start, current);
result = parseInt(data, 10);
this.buffer = this.buffer.slice(current + 4);
this.index -= current + 4;
return result;
}
tryReadContent(length) {
if (this.index < length) {
return null;
}
const result = this.buffer.toString('utf8', 0, length);
let sourceStart = length;
while (sourceStart < this.index &&
(this.buffer[sourceStart] === BACKSLASH_R || this.buffer[sourceStart] === BACKSLASH_N)) {
sourceStart += 1;
}
this.buffer.copy(this.buffer, 0, sourceStart);
this.index -= sourceStart;
return result;
}
}
exports.default = ProtocolBuffer;
//# sourceMappingURL=ProtocolBuffer.js.map