| // A reader for when we don't yet know what kind of thing |
| // the thing is. |
| |
| module.exports = ProxyReader |
| |
| var Reader = require('./reader.js') |
| var getType = require('./get-type.js') |
| var inherits = require('inherits') |
| var fs = require('graceful-fs') |
| |
| inherits(ProxyReader, Reader) |
| |
| function ProxyReader (props) { |
| var self = this |
| if (!(self instanceof ProxyReader)) { |
| throw new Error('ProxyReader must be called as constructor.') |
| } |
| |
| self.props = props |
| self._buffer = [] |
| self.ready = false |
| |
| Reader.call(self, props) |
| } |
| |
| ProxyReader.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(Reader(props, current)) |
| }) |
| } |
| |
| ProxyReader.prototype._addProxy = function (proxy) { |
| var self = this |
| if (self._proxyTarget) { |
| return self.error('proxy already set') |
| } |
| |
| self._proxyTarget = proxy |
| proxy._proxy = self |
| |
| ;[ |
| 'error', |
| 'data', |
| 'end', |
| 'close', |
| 'linkpath', |
| 'entry', |
| 'entryEnd', |
| 'child', |
| 'childEnd', |
| 'warn', |
| 'stat' |
| ].forEach(function (ev) { |
| // console.error('~~ proxy event', ev, self.path) |
| proxy.on(ev, self.emit.bind(self, ev)) |
| }) |
| |
| self.emit('proxy', proxy) |
| |
| proxy.on('ready', function () { |
| // console.error("~~ proxy is ready!", self.path) |
| self.ready = true |
| self.emit('ready') |
| }) |
| |
| var calls = self._buffer |
| self._buffer.length = 0 |
| calls.forEach(function (c) { |
| proxy[c[0]].apply(proxy, c[1]) |
| }) |
| } |
| |
| ProxyReader.prototype.pause = function () { |
| return this._proxyTarget ? this._proxyTarget.pause() : false |
| } |
| |
| ProxyReader.prototype.resume = function () { |
| return this._proxyTarget ? this._proxyTarget.resume() : false |
| } |