bufferbuilder.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. var binaryFeatures = {};
  2. binaryFeatures.useBlobBuilder = (function(){
  3. try {
  4. new Blob([]);
  5. return false;
  6. } catch (e) {
  7. return true;
  8. }
  9. })();
  10. binaryFeatures.useArrayBufferView = !binaryFeatures.useBlobBuilder && (function(){
  11. try {
  12. return (new Blob([new Uint8Array([])])).size === 0;
  13. } catch (e) {
  14. return true;
  15. }
  16. })();
  17. exports.binaryFeatures = binaryFeatures;
  18. exports.BlobBuilder = window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder || window.BlobBuilder;
  19. function BufferBuilder(){
  20. this._pieces = [];
  21. this._parts = [];
  22. }
  23. BufferBuilder.prototype.append = function(data) {
  24. if(typeof data === 'number') {
  25. this._pieces.push(data);
  26. } else {
  27. this._flush();
  28. this._parts.push(data);
  29. }
  30. };
  31. BufferBuilder.prototype._flush = function() {
  32. if (this._pieces.length > 0) {
  33. var buf = new Uint8Array(this._pieces);
  34. if(!binaryFeatures.useArrayBufferView) {
  35. buf = buf.buffer;
  36. }
  37. this._parts.push(buf);
  38. this._pieces = [];
  39. }
  40. };
  41. BufferBuilder.prototype.getBuffer = function() {
  42. this._flush();
  43. if(binaryFeatures.useBlobBuilder) {
  44. var builder = new BlobBuilder();
  45. for(var i = 0, ii = this._parts.length; i < ii; i++) {
  46. builder.append(this._parts[i]);
  47. }
  48. return builder.getBlob();
  49. } else {
  50. return new Blob(this._parts);
  51. }
  52. };