| // A writer for when we don't know what kind of thing |
| // the thing is. That is, it's not explicitly set, |
| // so we're going to make it whatever the thing already |
| // is, or "File" |
| // |
| // Until then, collect all events. |
| |
| module.exports = ProxyWriter |
| |
| var Writer = require('./writer.js') |
| var getType = require('./get-type.js') |
| var inherits = require('inherits') |
| var collect = require('./collect.js') |
| var fs = require('fs') |
| |
| inherits(ProxyWriter, Writer) |
| |
| function ProxyWriter (props) { |
| var self = this |
| if (!(self instanceof ProxyWriter)) { |
| throw new Error('ProxyWriter must be called as constructor.') |
| } |
| |
| self.props = props |
| self._needDrain = false |
| |
| Writer.call(self, props) |
| } |
| |
| ProxyWriter.prototype._stat = function () { |
| var self = this |
| var props = self.props |
| // stat the thing to see what the proxy should be. |
| var stat = props.follow ? 'stat' : 'lstat' |
| |
| fs[stat](props.path, function (er, current) { |
| var type |
| if (er || !current) { |
| type = 'File' |
| } else { |
| type = getType(current) |
| } |
| |
| props[type] = true |
| props.type = self.type = type |
| |
| self._old = current |
| self._addProxy(Writer(props, current)) |
| }) |
| } |
| |
| ProxyWriter.prototype._addProxy = function (proxy) { |
| // console.error("~~ set proxy", this.path) |
| var self = this |
| if (self._proxy) { |
| return self.error('proxy already set') |
| } |
| |
| self._proxy = proxy |
| ;[ |
| 'ready', |
| 'error', |
| 'close', |
| 'pipe', |
| 'drain', |
| 'warn' |
| ].forEach(function (ev) { |
| proxy.on(ev, self.emit.bind(self, ev)) |
| }) |
| |
| self.emit('proxy', proxy) |
| |
| var calls = self._buffer |
| calls.forEach(function (c) { |
| // console.error("~~ ~~ proxy buffered call", c[0], c[1]) |
| proxy[c[0]].apply(proxy, c[1]) |
| }) |
| self._buffer.length = 0 |
| if (self._needsDrain) self.emit('drain') |
| } |
| |
| ProxyWriter.prototype.add = function (entry) { |
| // console.error("~~ proxy add") |
| collect(entry) |
| |
| if (!this._proxy) { |
| this._buffer.push(['add', [entry]]) |
| this._needDrain = true |
| return false |
| } |
| return this._proxy.add(entry) |
| } |
| |
| ProxyWriter.prototype.write = function (c) { |
| // console.error('~~ proxy write') |
| if (!this._proxy) { |
| this._buffer.push(['write', [c]]) |
| this._needDrain = true |
| return false |
| } |
| return this._proxy.write(c) |
| } |
| |
| ProxyWriter.prototype.end = function (c) { |
| // console.error('~~ proxy end') |
| if (!this._proxy) { |
| this._buffer.push(['end', [c]]) |
| return false |
| } |
| return this._proxy.end(c) |
| } |