Skip to content

Commit

Permalink
Add sys.pump
Browse files Browse the repository at this point in the history
  • Loading branch information
mikeal authored and ry committed Jun 23, 2010
1 parent 20905d9 commit f62979d
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 0 deletions.
8 changes: 8 additions & 0 deletions doc/api.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
18 changes: 18 additions & 0 deletions lib/sys.js
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
Expand Down
43 changes: 43 additions & 0 deletions test/simple/test-pump-file2tcp.js
Original file line number Diff line number Diff line change
@@ -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);
});

0 comments on commit f62979d

Please sign in to comment.