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