diff --git a/src/index.js b/src/index.js
index ce45a04..3d34cd2 100755
--- a/src/index.js
+++ b/src/index.js
@@ -70,28 +70,36 @@
 
 const EmojiRegex = require('emoji-regex');
 const emojiRegex = EmojiRegex();
+const { once } = require('events');
 const readline = require('readline');
 global.header = '';
+global.fileheader = '';
 global.standalone = false
 
 
 const rl = readline.createInterface({
   input: process.stdin,
-  output: process.stdout,
   terminal: false,
 
 });
 
 
-function parseConllu(line) {
+async function writeOutput(text) {
+  if (!process.stdout.write(text)) {
+    await once(process.stdout, 'drain');
+  }
+}
+
+
+async function parseConllu(line) {
   if (line.match('#\\s*foundry')) {
     if (line.match('=\\s*base')) {
       if (options.sparse) {
         global.standalone = true
       }
-      process.stdout.write("# foundry = cmc\n");
+      await writeOutput("# foundry = cmc\n");
     } else {
-      process.stdout.write(`${line}\n`);
+      await writeOutput(`${line}\n`);
     }
     return
   }
@@ -104,21 +112,21 @@
       global.fileheader += `${line}\n`;
       return;
     } else if (line.match('^#\\s*eo[ft]')) {
-      process.stdout.write(`${line}\n`);
+      await writeOutput(`${line}\n`);
       return;
     } else if (line.match('^#')) {
       global.header += `${line}\n`;
       return;
     } else if (line.trim().match('^$')) {
       if (global.header == "") {
-        process.stdout.write("\n");
+        await writeOutput("\n");
       }
       global.header = '';
       return
     }
   } else {
     if (!line.match('^\\d+')) {
-      process.stdout.write(`${line}\n`);
+      await writeOutput(`${line}\n`);
       return;
     }
   }
@@ -128,7 +136,7 @@
   const word = columns[1];
   // Guard clause: if word is undefined, just output the line as-is
   if (!word) {
-    process.stdout.write(`${line}\n`);
+    await writeOutput(`${line}\n`);
     return;
   }
 
@@ -167,16 +175,24 @@
       }
     }
     if (global.standalone) {
-      process.stdout.write(fileheader);
-      process.stdout.write(header);
+      await writeOutput(fileheader);
+      await writeOutput(header);
       new_tag = null;
       header = fileheader = '';
     }
-    process.stdout.write(columns.join('\t') + '\n');
+    await writeOutput(columns.join('\t') + '\n');
   } else if (!global.standalone) {
-    process.stdout.write(`${line}\n`);
+    await writeOutput(`${line}\n`);
   }
 }
 
-rl.on('line', parseConllu);
-rl.on('close', () => process.exit(0)); // important to exit, otherwise the process will hang
+async function main() {
+  for await (const line of rl) {
+    await parseConllu(line);
+  }
+}
+
+main().catch((error) => {
+  console.error(error);
+  process.exit(1);
+});
