프로젝트

일반

사용자정보

통계
| 개정판:

root / HServer / 00.Server / 00.Program / node_modules / blob / index.js

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

1
/**
2
 * Create a blob builder even when vendor prefixes exist
3
 */
4

    
5
var BlobBuilder = global.BlobBuilder
6
  || global.WebKitBlobBuilder
7
  || global.MSBlobBuilder
8
  || global.MozBlobBuilder;
9

    
10
/**
11
 * Check if Blob constructor is supported
12
 */
13

    
14
var blobSupported = (function() {
15
  try {
16
    var a = new Blob(['hi']);
17
    return a.size === 2;
18
  } catch(e) {
19
    return false;
20
  }
21
})();
22

    
23
/**
24
 * Check if Blob constructor supports ArrayBufferViews
25
 * Fails in Safari 6, so we need to map to ArrayBuffers there.
26
 */
27

    
28
var blobSupportsArrayBufferView = blobSupported && (function() {
29
  try {
30
    var b = new Blob([new Uint8Array([1,2])]);
31
    return b.size === 2;
32
  } catch(e) {
33
    return false;
34
  }
35
})();
36

    
37
/**
38
 * Check if BlobBuilder is supported
39
 */
40

    
41
var blobBuilderSupported = BlobBuilder
42
  && BlobBuilder.prototype.append
43
  && BlobBuilder.prototype.getBlob;
44

    
45
/**
46
 * Helper function that maps ArrayBufferViews to ArrayBuffers
47
 * Used by BlobBuilder constructor and old browsers that didn't
48
 * support it in the Blob constructor.
49
 */
50

    
51
function mapArrayBufferViews(ary) {
52
  for (var i = 0; i < ary.length; i++) {
53
    var chunk = ary[i];
54
    if (chunk.buffer instanceof ArrayBuffer) {
55
      var buf = chunk.buffer;
56

    
57
      // if this is a subarray, make a copy so we only
58
      // include the subarray region from the underlying buffer
59
      if (chunk.byteLength !== buf.byteLength) {
60
        var copy = new Uint8Array(chunk.byteLength);
61
        copy.set(new Uint8Array(buf, chunk.byteOffset, chunk.byteLength));
62
        buf = copy.buffer;
63
      }
64

    
65
      ary[i] = buf;
66
    }
67
  }
68
}
69

    
70
function BlobBuilderConstructor(ary, options) {
71
  options = options || {};
72

    
73
  var bb = new BlobBuilder();
74
  mapArrayBufferViews(ary);
75

    
76
  for (var i = 0; i < ary.length; i++) {
77
    bb.append(ary[i]);
78
  }
79

    
80
  return (options.type) ? bb.getBlob(options.type) : bb.getBlob();
81
};
82

    
83
function BlobConstructor(ary, options) {
84
  mapArrayBufferViews(ary);
85
  return new Blob(ary, options || {});
86
};
87

    
88
module.exports = (function() {
89
  if (blobSupported) {
90
    return blobSupportsArrayBufferView ? global.Blob : BlobConstructor;
91
  } else if (blobBuilderSupported) {
92
    return BlobBuilderConstructor;
93
  } else {
94
    return undefined;
95
  }
96
})();