You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							111 lines
						
					
					
						
							2.4 KiB
						
					
					
				
			
		
		
	
	
							111 lines
						
					
					
						
							2.4 KiB
						
					
					
				// 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) | 
						|
}
 | 
						|
 |