// the parent class for all fstreams. module.exports = Abstract var Stream = require('stream').Stream var inherits = require('inherits') function Abstract () { Stream.call(this) } inherits(Abstract, Stream) Abstract.prototype.on = function (ev, fn) { if (ev === 'ready' && this.ready) { process.nextTick(fn.bind(this)) } else { Stream.prototype.on.call(this, ev, fn) } return this } Abstract.prototype.abort = function () { this._aborted = true this.emit('abort') } Abstract.prototype.destroy = function () {} Abstract.prototype.warn = function (msg, code) { var self = this var er = decorate(msg, code, self) if (!self.listeners('warn')) { console.error('%s %s\n' + 'path = %s\n' + 'syscall = %s\n' + 'fstream_type = %s\n' + 'fstream_path = %s\n' + 'fstream_unc_path = %s\n' + 'fstream_class = %s\n' + 'fstream_stack =\n%s\n', code || 'UNKNOWN', er.stack, er.path, er.syscall, er.fstream_type, er.fstream_path, er.fstream_unc_path, er.fstream_class, er.fstream_stack.join('\n')) } else { self.emit('warn', er) } } Abstract.prototype.info = function (msg, code) { this.emit('info', msg, code) } Abstract.prototype.error = function (msg, code, th) { var er = decorate(msg, code, this) if (th) throw er else this.emit('error', er) } function decorate (er, code, self) { if (!(er instanceof Error)) er = new Error(er) er.code = er.code || code er.path = er.path || self.path er.fstream_type = er.fstream_type || self.type er.fstream_path = er.fstream_path || self.path if (self._path !== self.path) { er.fstream_unc_path = er.fstream_unc_path || self._path } if (self.linkpath) { er.fstream_linkpath = er.fstream_linkpath || self.linkpath } er.fstream_class = er.fstream_class || self.constructor.name er.fstream_stack = er.fstream_stack || new Error().stack.split(/\n/).slice(3).map(function (s) { return s.replace(/^ {4}at /, '') }) return er }