프로젝트

일반

사용자정보

통계
| 개정판:

root / HServer / 00.Server / 00.Program / node_modules / concat-stream / index.js

이력 | 보기 | 이력해설 | 다운로드 (3.65 KB)

1
var Writable = require('readable-stream').Writable
2
var inherits = require('inherits')
3

    
4
if (typeof Uint8Array === 'undefined') {
5
  var U8 = require('typedarray').Uint8Array
6
} else {
7
  var U8 = Uint8Array
8
}
9

    
10
function ConcatStream(opts, cb) {
11
  if (!(this instanceof ConcatStream)) return new ConcatStream(opts, cb)
12

    
13
  if (typeof opts === 'function') {
14
    cb = opts
15
    opts = {}
16
  }
17
  if (!opts) opts = {}
18

    
19
  var encoding = opts.encoding
20
  var shouldInferEncoding = false
21

    
22
  if (!encoding) {
23
    shouldInferEncoding = true
24
  } else {
25
    encoding =  String(encoding).toLowerCase()
26
    if (encoding === 'u8' || encoding === 'uint8') {
27
      encoding = 'uint8array'
28
    }
29
  }
30

    
31
  Writable.call(this, { objectMode: true })
32

    
33
  this.encoding = encoding
34
  this.shouldInferEncoding = shouldInferEncoding
35

    
36
  if (cb) this.on('finish', function () { cb(this.getBody()) })
37
  this.body = []
38
}
39

    
40
module.exports = ConcatStream
41
inherits(ConcatStream, Writable)
42

    
43
ConcatStream.prototype._write = function(chunk, enc, next) {
44
  this.body.push(chunk)
45
  next()
46
}
47

    
48
ConcatStream.prototype.inferEncoding = function (buff) {
49
  var firstBuffer = buff === undefined ? this.body[0] : buff;
50
  if (Buffer.isBuffer(firstBuffer)) return 'buffer'
51
  if (typeof Uint8Array !== 'undefined' && firstBuffer instanceof Uint8Array) return 'uint8array'
52
  if (Array.isArray(firstBuffer)) return 'array'
53
  if (typeof firstBuffer === 'string') return 'string'
54
  if (Object.prototype.toString.call(firstBuffer) === "[object Object]") return 'object'
55
  return 'buffer'
56
}
57

    
58
ConcatStream.prototype.getBody = function () {
59
  if (!this.encoding && this.body.length === 0) return []
60
  if (this.shouldInferEncoding) this.encoding = this.inferEncoding()
61
  if (this.encoding === 'array') return arrayConcat(this.body)
62
  if (this.encoding === 'string') return stringConcat(this.body)
63
  if (this.encoding === 'buffer') return bufferConcat(this.body)
64
  if (this.encoding === 'uint8array') return u8Concat(this.body)
65
  return this.body
66
}
67

    
68
var isArray = Array.isArray || function (arr) {
69
  return Object.prototype.toString.call(arr) == '[object Array]'
70
}
71

    
72
function isArrayish (arr) {
73
  return /Array\]$/.test(Object.prototype.toString.call(arr))
74
}
75

    
76
function isBufferish (p) {
77
  return typeof p === 'string' || isArrayish(p) || (p && typeof p.subarray === 'function')
78
}
79

    
80
function stringConcat (parts) {
81
  var strings = []
82
  var needsToString = false
83
  for (var i = 0; i < parts.length; i++) {
84
    var p = parts[i]
85
    if (typeof p === 'string') {
86
      strings.push(p)
87
    } else if (Buffer.isBuffer(p)) {
88
      strings.push(p)
89
    } else if (isBufferish(p)) {
90
      strings.push(new Buffer(p))
91
    } else {
92
      strings.push(new Buffer(String(p)))
93
    }
94
  }
95
  if (Buffer.isBuffer(parts[0])) {
96
    strings = Buffer.concat(strings)
97
    strings = strings.toString('utf8')
98
  } else {
99
    strings = strings.join('')
100
  }
101
  return strings
102
}
103

    
104
function bufferConcat (parts) {
105
  var bufs = []
106
  for (var i = 0; i < parts.length; i++) {
107
    var p = parts[i]
108
    if (Buffer.isBuffer(p)) {
109
      bufs.push(p)
110
    } else if (isBufferish(p)) {
111
      bufs.push(new Buffer(p))
112
    } else {
113
      bufs.push(new Buffer(String(p)))
114
    }
115
  }
116
  return Buffer.concat(bufs)
117
}
118

    
119
function arrayConcat (parts) {
120
  var res = []
121
  for (var i = 0; i < parts.length; i++) {
122
    res.push.apply(res, parts[i])
123
  }
124
  return res
125
}
126

    
127
function u8Concat (parts) {
128
  var len = 0
129
  for (var i = 0; i < parts.length; i++) {
130
    if (typeof parts[i] === 'string') {
131
      parts[i] = new Buffer(parts[i])
132
    }
133
    len += parts[i].length
134
  }
135
  var u8 = new U8(len)
136
  for (var i = 0, offset = 0; i < parts.length; i++) {
137
    var part = parts[i]
138
    for (var j = 0; j < part.length; j++) {
139
      u8[offset++] = part[j]
140
    }
141
  }
142
  return u8
143
}