Blob.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. "use strict";
  2. /*! Based on fetch-blob. MIT License. Jimmy Wärting <https://jimmy.warting.se/opensource> & David Frank */
  3. var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
  4. if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
  5. if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
  6. return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
  7. };
  8. var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
  9. if (kind === "m") throw new TypeError("Private method is not writable");
  10. if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
  11. if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
  12. return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
  13. };
  14. var _Blob_parts, _Blob_type, _Blob_size;
  15. Object.defineProperty(exports, "__esModule", { value: true });
  16. exports.Blob = void 0;
  17. const web_streams_polyfill_1 = require("web-streams-polyfill");
  18. const isFunction_1 = require("./isFunction");
  19. const blobHelpers_1 = require("./blobHelpers");
  20. class Blob {
  21. constructor(blobParts = [], options = {}) {
  22. _Blob_parts.set(this, []);
  23. _Blob_type.set(this, "");
  24. _Blob_size.set(this, 0);
  25. options !== null && options !== void 0 ? options : (options = {});
  26. if (typeof blobParts !== "object" || blobParts === null) {
  27. throw new TypeError("Failed to construct 'Blob': "
  28. + "The provided value cannot be converted to a sequence.");
  29. }
  30. if (!(0, isFunction_1.isFunction)(blobParts[Symbol.iterator])) {
  31. throw new TypeError("Failed to construct 'Blob': "
  32. + "The object must have a callable @@iterator property.");
  33. }
  34. if (typeof options !== "object" && !(0, isFunction_1.isFunction)(options)) {
  35. throw new TypeError("Failed to construct 'Blob': parameter 2 cannot convert to dictionary.");
  36. }
  37. const encoder = new TextEncoder();
  38. for (const raw of blobParts) {
  39. let part;
  40. if (ArrayBuffer.isView(raw)) {
  41. part = new Uint8Array(raw.buffer.slice(raw.byteOffset, raw.byteOffset + raw.byteLength));
  42. }
  43. else if (raw instanceof ArrayBuffer) {
  44. part = new Uint8Array(raw.slice(0));
  45. }
  46. else if (raw instanceof Blob) {
  47. part = raw;
  48. }
  49. else {
  50. part = encoder.encode(String(raw));
  51. }
  52. __classPrivateFieldSet(this, _Blob_size, __classPrivateFieldGet(this, _Blob_size, "f") + (ArrayBuffer.isView(part) ? part.byteLength : part.size), "f");
  53. __classPrivateFieldGet(this, _Blob_parts, "f").push(part);
  54. }
  55. const type = options.type === undefined ? "" : String(options.type);
  56. __classPrivateFieldSet(this, _Blob_type, /^[\x20-\x7E]*$/.test(type) ? type : "", "f");
  57. }
  58. static [(_Blob_parts = new WeakMap(), _Blob_type = new WeakMap(), _Blob_size = new WeakMap(), Symbol.hasInstance)](value) {
  59. return Boolean(value
  60. && typeof value === "object"
  61. && (0, isFunction_1.isFunction)(value.constructor)
  62. && ((0, isFunction_1.isFunction)(value.stream)
  63. || (0, isFunction_1.isFunction)(value.arrayBuffer))
  64. && /^(Blob|File)$/.test(value[Symbol.toStringTag]));
  65. }
  66. get type() {
  67. return __classPrivateFieldGet(this, _Blob_type, "f");
  68. }
  69. get size() {
  70. return __classPrivateFieldGet(this, _Blob_size, "f");
  71. }
  72. slice(start, end, contentType) {
  73. return new Blob((0, blobHelpers_1.sliceBlob)(__classPrivateFieldGet(this, _Blob_parts, "f"), this.size, start, end), {
  74. type: contentType
  75. });
  76. }
  77. async text() {
  78. const decoder = new TextDecoder();
  79. let result = "";
  80. for await (const chunk of (0, blobHelpers_1.consumeBlobParts)(__classPrivateFieldGet(this, _Blob_parts, "f"))) {
  81. result += decoder.decode(chunk, { stream: true });
  82. }
  83. result += decoder.decode();
  84. return result;
  85. }
  86. async arrayBuffer() {
  87. const view = new Uint8Array(this.size);
  88. let offset = 0;
  89. for await (const chunk of (0, blobHelpers_1.consumeBlobParts)(__classPrivateFieldGet(this, _Blob_parts, "f"))) {
  90. view.set(chunk, offset);
  91. offset += chunk.length;
  92. }
  93. return view.buffer;
  94. }
  95. stream() {
  96. const iterator = (0, blobHelpers_1.consumeBlobParts)(__classPrivateFieldGet(this, _Blob_parts, "f"), true);
  97. return new web_streams_polyfill_1.ReadableStream({
  98. async pull(controller) {
  99. const { value, done } = await iterator.next();
  100. if (done) {
  101. return queueMicrotask(() => controller.close());
  102. }
  103. controller.enqueue(value);
  104. },
  105. async cancel() {
  106. await iterator.return();
  107. }
  108. });
  109. }
  110. get [Symbol.toStringTag]() {
  111. return "Blob";
  112. }
  113. }
  114. exports.Blob = Blob;
  115. Object.defineProperties(Blob.prototype, {
  116. type: { enumerable: true },
  117. size: { enumerable: true },
  118. slice: { enumerable: true },
  119. stream: { enumerable: true },
  120. text: { enumerable: true },
  121. arrayBuffer: { enumerable: true }
  122. });