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