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