// 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) }