diff --git a/Jakefile.js b/Jakefile.js
index bf20bf29275..2c3f9f3a2fd 100644
--- a/Jakefile.js
+++ b/Jakefile.js
@@ -110,6 +110,12 @@ var serverCoreSources = [
return path.join(serverDirectory, f);
});
+var cancellationTokenSources = [
+ "cancellationToken.ts"
+].map(function (f) {
+ return path.join(serverDirectory, f);
+});
+
var serverSources = serverCoreSources.concat(servicesSources);
var languageServiceLibrarySources = [
@@ -517,8 +523,11 @@ compileFile(servicesFile, servicesSources,[builtLocalDirectory, copyright].conca
});
+var cancellationTokenFile = path.join(builtLocalDirectory, "cancellationToken.js");
+compileFile(cancellationTokenFile, cancellationTokenSources, [builtLocalDirectory].concat(cancellationTokenSources), /*prefixes*/ [copyright], /*useBuiltCompiler*/ true, { outDir: builtLocalDirectory, noOutFile: true });
+
var serverFile = path.join(builtLocalDirectory, "tsserver.js");
-compileFile(serverFile, serverSources,[builtLocalDirectory, copyright].concat(serverSources), /*prefixes*/ [copyright], /*useBuiltCompiler*/ true);
+compileFile(serverFile, serverSources,[builtLocalDirectory, copyright, cancellationTokenFile].concat(serverSources), /*prefixes*/ [copyright], /*useBuiltCompiler*/ true);
var tsserverLibraryFile = path.join(builtLocalDirectory, "tsserverlibrary.js");
var tsserverLibraryDefinitionFile = path.join(builtLocalDirectory, "tsserverlibrary.d.ts");
diff --git a/src/server/cancellationToken.ts b/src/server/cancellationToken.ts
new file mode 100644
index 00000000000..ac5adeab6d7
--- /dev/null
+++ b/src/server/cancellationToken.ts
@@ -0,0 +1,34 @@
+///
+
+
+// TODO: extract services types
+interface HostCancellationToken {
+ isCancellationRequested(): boolean;
+}
+
+const fs: typeof NodeJS.fs = require("fs");
+
+function createCancellationToken(args: string[]): HostCancellationToken {
+ let cancellationPipeName: string;
+ for (let i = 0; i < args.length - 1; i++) {
+ if (args[i] === "--cancellationPipeName") {
+ cancellationPipeName = args[i + 1];
+ break;
+ }
+ }
+ if (!cancellationPipeName) {
+ return { isCancellationRequested: () => false };
+ }
+ return {
+ isCancellationRequested() {
+ try {
+ fs.statSync(cancellationPipeName);
+ return true;
+ }
+ catch(e) {
+ return false;
+ }
+ }
+ };
+}
+export = createCancellationToken
\ No newline at end of file
diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts
index f2e5eabb4e3..87ae34ca239 100644
--- a/src/server/editorServices.ts
+++ b/src/server/editorServices.ts
@@ -129,7 +129,7 @@ namespace ts.server {
private resolvedTypeReferenceDirectives: ts.FileMap