Support async worker functions in the tsc_wrapped/worker.ts helper library.

PiperOrigin-RevId: 265120467
diff --git a/internal/tsc_wrapped/package.json b/internal/tsc_wrapped/package.json
index 64940e1..1f78bd4 100644
--- a/internal/tsc_wrapped/package.json
+++ b/internal/tsc_wrapped/package.json
@@ -2,7 +2,7 @@
   "description": "legacy build-time dependencies to compile and run tsc_wrapped",
   "devDependencies": {
     "@types/jasmine": "2.8.2",
-    "@types/node": "7.0.18",
+    "@types/node": "10.12.20",
     "@types/tmp": "0.0.33",
     "protobufjs": "5.0.3",
     "tmp": "0.0.33",
diff --git a/internal/tsc_wrapped/tsconfig.json b/internal/tsc_wrapped/tsconfig.json
index 830ed18..8c22290 100644
--- a/internal/tsc_wrapped/tsconfig.json
+++ b/internal/tsc_wrapped/tsconfig.json
@@ -16,7 +16,10 @@
       "es2015.core",
       "es2015.collection",
       "es2015.iterable",
-      "es2015.promise"
+      "es2015.promise",
+      // This will need to become es2018.asynciterable when
+      // bumping the version of TypeScript in rules_typescript/package.json
+      "esnext.asynciterable"
     ]
   }
 }
diff --git a/internal/tsc_wrapped/worker.ts b/internal/tsc_wrapped/worker.ts
index dc50055..0bdb04c 100644
--- a/internal/tsc_wrapped/worker.ts
+++ b/internal/tsc_wrapped/worker.ts
@@ -115,12 +115,15 @@
  * data, and dispatches into `runOneBuild` for the actual compilation to happen.
  *
  * The compilation handler is parameterized so that this code can be used by
- * different compiler entry points (currently TypeScript compilation and Angular
- * compilation).
+ * different compiler entry points (currently TypeScript compilation, Angular
+ * compilation, and the contrib vulcanize worker).
+ *
+ * It's also exposed publicly as an npm package:
+ *   https://www.npmjs.com/package/@bazel/worker
  */
-export function runWorkerLoop(
+export async function runWorkerLoop(
     runOneBuild: (args: string[], inputs?: {[path: string]: string}) =>
-        boolean) {
+        boolean | Promise<boolean>) {
   // Hook all output to stderr and write it to a buffer, then include
   // that buffer's in the worker protcol proto's textual output.  This
   // means you can log via console.error() and it will appear to the
@@ -142,10 +145,8 @@
   // it exits and waits for more input. If a message has been read, it strips
   // its data of this buffer.
   let buf: Buffer = Buffer.alloc(0);
-  process.stdin.on('readable', () => {
-    const chunk = process.stdin.read() as Buffer;
-    if (!chunk) return;
-    buf = Buffer.concat([buf, chunk]);
+  stdinLoop: for await (const chunk of process.stdin) {
+    buf = Buffer.concat([buf, chunk as Buffer]);
     try {
       const reader = new protobufjs.Reader(buf);
       // Read all requests that have accumulated in the buffer.
@@ -154,7 +155,7 @@
         const msgLength: number = reader.uint32();
         // chunk might be an incomplete read from stdin. If there are not enough
         // bytes for the next full message, wait for more input.
-        if ((reader.len - reader.pos) < msgLength) return;
+        if ((reader.len - reader.pos) < msgLength) continue stdinLoop;
 
         const req = workerpb.WorkRequest.decode(reader, msgLength) as
             workerProto.WorkRequest;
@@ -170,7 +171,7 @@
           inputs[input.path] = input.digest.toString('hex');
         }
         debug('Compiling with:\n\t' + args.join('\n\t'));
-        const exitCode = runOneBuild(args, inputs) ? 0 : 1;
+        const exitCode = (await runOneBuild(args, inputs)) ? 0 : 1;
         process.stdout.write((workerpb.WorkResponse.encodeDelimited({
                                exitCode,
                                output: consoleOutput,
@@ -196,5 +197,5 @@
       // Clear buffer so the next build won't read an incomplete request.
       buf = Buffer.alloc(0);
     }
-  });
+  }
 }
diff --git a/package.json b/package.json
index 42bdbd7..9a86e26 100644
--- a/package.json
+++ b/package.json
@@ -10,7 +10,7 @@
         "@bazel/typescript": "^0.32.0",
         "@types/jasmine": "^2.8.2",
         "@types/long": "^4.0.0",
-        "@types/node": "7.0.18",
+        "@types/node": "10.12.20",
         "@types/source-map": "^0.5.1",
         "@types/tmp": "^0.0.33",
         "clang-format": "1.0.49",