Handle writeStream errors in sys.pump
authorRyan Dahl <ry@tinyclouds.org>
Thu, 16 Sep 2010 21:40:41 +0000 (14:40 -0700)
committerRyan Dahl <ry@tinyclouds.org>
Thu, 16 Sep 2010 21:40:41 +0000 (14:40 -0700)
lib/sys.js

index 1d34713..1054c30 100644 (file)
@@ -328,6 +328,15 @@ exports.exec = function () {
 
 
 exports.pump = function (readStream, writeStream, callback) {
+  var callbackCalled = false;
+
+  function call (a, b, c) {
+    if (callback && !callbackCalled) {
+      callback(a, b, c);
+      callbackCalled = true;
+    }
+  }
+
   if (!readStream.pause) readStream.pause = function () {readStream.emit("pause")};
   if (!readStream.resume) readStream.resume = function () {readStream.emit("resume")};
 
@@ -352,12 +361,17 @@ exports.pump = function (readStream, writeStream, callback) {
   });
 
   readStream.addListener("close", function () {
-    if (callback) callback();
+    call();
   });
 
-  readStream.addListener("error", function(err) {
+  readStream.addListener("error", function (err) {
     writeStream.end();
-    if (callback) callback(err);
+    call(err);
+  });
+
+  writeStream.addListener("error", function (err) {
+    readStream.destroy();
+    call(err);
   });
 };