Blame view

node_modules/fstream/lib/abstract.js 1.98 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
  // 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
  }