initial support for compressing responses

This commit is contained in:
Vladimir Matveev
2016-07-06 00:28:24 -07:00
parent 71a3d0a42f
commit e14a7ca0bc
9 changed files with 94 additions and 31 deletions

View File

@@ -4,8 +4,10 @@
/* tslint:disable:no-null-keyword */
namespace ts.server {
const readline: NodeJS.ReadLine = require("readline");
const fs: typeof NodeJS.fs = require("fs");
const zlib: typeof NodeJS.zlib = require("zlib");
const rl = readline.createInterface({
input: process.stdin,
@@ -13,6 +15,11 @@ namespace ts.server {
terminal: false,
});
function compress(s: string): CompressedData {
const gzip = zlib.createGZip();
return <CompressedData><any>gzip.gzipSync(new Buffer(s, "utf8"));
}
class Logger implements ts.server.Logger {
private fd = -1;
private seq = 0;
@@ -92,7 +99,7 @@ namespace ts.server {
class IOSession extends Session {
constructor(host: ServerHost, cancellationToken: HostCancellationToken, useSingleInferredProject: boolean, logger: ts.server.Logger) {
super(host, cancellationToken, useSingleInferredProject, Buffer.byteLength, process.hrtime, logger);
super(host, cancellationToken, useSingleInferredProject, Buffer.byteLength, compress, process.hrtime, logger);
}
exit() {
@@ -260,15 +267,16 @@ namespace ts.server {
const pollingWatchedFileSet = createPollingWatchedFileSet();
const logger = createLoggerFromEnv();
const pending: string[] = [];
const pending: Buffer[] = [];
let canWrite = true;
function writeMessage(s: string) {
function writeMessage(buf: Buffer) {
if (!canWrite) {
pending.push(s);
pending.push(buf);
}
else {
canWrite = false;
process.stdout.write(new Buffer(s, "utf8"), setCanWriteFlagAndWriteMessageIfNecessary);
process.stdout.write(buf, setCanWriteFlagAndWriteMessageIfNecessary);
}
}
@@ -279,10 +287,16 @@ namespace ts.server {
}
}
function writeCompressedData(prefix: string, compressed: CompressedData, suffix: string): void {
sys.write(prefix);
writeMessage(<Buffer><any>compressed);
sys.write(suffix);
}
const sys = <ServerHost>ts.sys;
// Override sys.write because fs.writeSync is not reliable on Node 4
sys.write = (s: string) => writeMessage(s);
sys.write = (s: string) => writeMessage(new Buffer(s, "utf8"));
sys.watchFile = (fileName, callback) => {
const watchedFile = pollingWatchedFileSet.addFile(fileName, callback);
return {
@@ -294,6 +308,7 @@ namespace ts.server {
sys.clearTimeout = clearTimeout;
sys.setImmediate = setImmediate;
sys.clearImmediate = clearImmediate;
sys.writeCompressedData = writeCompressedData;
let cancellationToken: HostCancellationToken;
try {