diff --git a/doc/api.markdown b/doc/api.markdown index 24ad5ded00..19951e6daa 100644 --- a/doc/api.markdown +++ b/doc/api.markdown @@ -837,6 +837,14 @@ Example of inspecting all properties of the `sys` object: sys.puts(sys.inspect(sys, true, null)); +### sys.pump(readableStream, writeableStream, [callback]) + +Experimental + +Read the data from `readableStream` and send it to the `writableStream`. +When `writeableStream.write(data)` returns `false` `readableStream` will be +paused until the `drain` event occurs on the `writableStream`. `callback` is +called when `writableStream` is closed. ## Timers diff --git a/lib/sys.js b/lib/sys.js index 23b32f400e..f877dad117 100644 --- a/lib/sys.js +++ b/lib/sys.js @@ -283,6 +283,24 @@ exports.exec = function () { }; +exports.pump = function (readStream, writeStream, callback) { + readStream.addListener("data", function (chunk) { + if (writeStream.write(chunk) === false) readStream.pause(); + }); + + writeStream.addListener("drain", function () { + readStream.resume(); + }); + + readStream.addListener("end", function () { + writeStream.end(); + }); + + readStream.addListener("close", function () { + if (callback) callback(); + }); +}; + /** * Inherit the prototype methods from one constructor into another. * diff --git a/test/simple/test-pump-file2tcp.js b/test/simple/test-pump-file2tcp.js new file mode 100644 index 0000000000..8dfa0a05af --- /dev/null +++ b/test/simple/test-pump-file2tcp.js @@ -0,0 +1,43 @@ +require("../common"); +net = require("net"); +fs = require("fs"); +sys = require("sys"); +path = require("path"); +fn = path.join(fixturesDir, 'elipses.txt'); + +expected = fs.readFileSync(fn, 'utf8'); + +server = net.createServer(function (stream) { + error('pump!'); + sys.pump(fs.createReadStream(fn), stream, function () { + error('server stream close'); + error('server close'); + server.close(); + }); +}); + +server.listen(PORT, function () { + conn = net.createConnection(PORT); + conn.setEncoding('utf8'); + conn.addListener("data", function (chunk) { + error('recv data! nchars = ' + chunk.length); + buffer += chunk; + }); + + conn.addListener("end", function () { + conn.end(); + }); + conn.addListener("close", function () { + error('client connection close'); + }); +}); + +var buffer = ''; +count = 0; + +server.addListener('listening', function () { +}); + +process.addListener('exit', function () { + assert.equal(expected, buffer); +});