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.
		
		
		
		
		
			
		
			
				
					86 lines
				
				2.0 KiB
			
		
		
			
		
	
	
					86 lines
				
				2.0 KiB
			| 
											2 years ago
										 | // 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 | ||
|  | } |