| var fs = require('fs'); |
| var Writable = require('readable-stream/writable'); |
| |
| var exists = function(path) { |
| try { |
| return fs.existsSync(path); |
| } catch (err) { |
| return false; |
| } |
| }; |
| |
| module.exports = function() { |
| var s = new Writable({highWaterMark:0}); |
| |
| var cb; |
| var data; |
| var tries = 0; |
| var offset = 0; |
| |
| var write = function() { |
| fs.write(1, data, offset, data.length - offset, null, onwrite); |
| }; |
| |
| var onwrite = function(err, written) { |
| if (err && err.code === 'EPIPE') return cb() |
| if (err && err.code === 'EAGAIN' && tries++ < 30) return setTimeout(write, 10); |
| if (err) return cb(err); |
| |
| tries = 0; |
| if (offset + written >= data.length) return cb(); |
| |
| offset += written; |
| write(); |
| }; |
| |
| s._write = function(_data, enc, _cb) { |
| offset = 0; |
| cb = _cb; |
| data = _data; |
| write(); |
| }; |
| |
| s._isStdio = true; |
| s.isTTY = process.stdout.isTTY; |
| |
| s.on('finish', function() { |
| fs.close(1, function(err) { |
| if (err) s.emit('error', err); |
| }); |
| }); |
| |
| return s; |
| }(); |