112 lines
2.4 KiB
JavaScript
112 lines
2.4 KiB
JavaScript
|
// 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)
|
||
|
}
|