• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1var toString = Object.prototype.toString
2
3var isModern = (
4  typeof Buffer.alloc === 'function' &&
5  typeof Buffer.allocUnsafe === 'function' &&
6  typeof Buffer.from === 'function'
7)
8
9function isArrayBuffer (input) {
10  return toString.call(input).slice(8, -1) === 'ArrayBuffer'
11}
12
13function fromArrayBuffer (obj, byteOffset, length) {
14  byteOffset >>>= 0
15
16  var maxLength = obj.byteLength - byteOffset
17
18  if (maxLength < 0) {
19    throw new RangeError("'offset' is out of bounds")
20  }
21
22  if (length === undefined) {
23    length = maxLength
24  } else {
25    length >>>= 0
26
27    if (length > maxLength) {
28      throw new RangeError("'length' is out of bounds")
29    }
30  }
31
32  return isModern
33    ? Buffer.from(obj.slice(byteOffset, byteOffset + length))
34    : new Buffer(new Uint8Array(obj.slice(byteOffset, byteOffset + length)))
35}
36
37function fromString (string, encoding) {
38  if (typeof encoding !== 'string' || encoding === '') {
39    encoding = 'utf8'
40  }
41
42  if (!Buffer.isEncoding(encoding)) {
43    throw new TypeError('"encoding" must be a valid string encoding')
44  }
45
46  return isModern
47    ? Buffer.from(string, encoding)
48    : new Buffer(string, encoding)
49}
50
51function bufferFrom (value, encodingOrOffset, length) {
52  if (typeof value === 'number') {
53    throw new TypeError('"value" argument must not be a number')
54  }
55
56  if (isArrayBuffer(value)) {
57    return fromArrayBuffer(value, encodingOrOffset, length)
58  }
59
60  if (typeof value === 'string') {
61    return fromString(value, encodingOrOffset)
62  }
63
64  return isModern
65    ? Buffer.from(value)
66    : new Buffer(value)
67}
68
69module.exports = bufferFrom
70