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.
		
		
		
		
		
			
		
			
				
					112 lines
				
				2.4 KiB
			
		
		
			
		
	
	
					112 lines
				
				2.4 KiB
			| 
											2 years ago
										 | // 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) | ||
|  | } |