版博士V2.0程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

134 lines
3.8 KiB

  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. /**
  4. * Reference:
  5. * https://developer.mozilla.org/en-US/docs/Web/API/Blob.
  6. *
  7. * Based on:
  8. * https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/file-api/Blob-impl.js (MIT licensed).
  9. */
  10. class Blob {
  11. /**
  12. * Constructor.
  13. *
  14. * @param bits Bits.
  15. * @param [options] Options.
  16. * @param [options.type] MIME type.
  17. */
  18. constructor(bits, options) {
  19. this._buffer = null;
  20. this.type = '';
  21. const buffers = [];
  22. if (bits) {
  23. for (const bit of bits) {
  24. let buffer;
  25. if (bit instanceof ArrayBuffer) {
  26. buffer = Buffer.from(new Uint8Array(bit));
  27. }
  28. else if (bit instanceof Blob) {
  29. buffer = bit._buffer;
  30. }
  31. else if (bit instanceof Buffer) {
  32. buffer = bit;
  33. }
  34. else if (ArrayBuffer.isView(bit)) {
  35. buffer = Buffer.from(new Uint8Array(bit.buffer, bit.byteOffset, bit.byteLength));
  36. }
  37. else {
  38. buffer = Buffer.from(typeof bit === 'string' ? bit : String(bit));
  39. }
  40. buffers.push(buffer);
  41. }
  42. }
  43. this._buffer = Buffer.concat(buffers);
  44. if (options && options.type && options.type.match(/^[\u0020-\u007E]*$/)) {
  45. this.type = String(options.type).toLowerCase();
  46. }
  47. }
  48. /**
  49. * Returns size.
  50. *
  51. * @returns Size.
  52. */
  53. get size() {
  54. return this._buffer.length;
  55. }
  56. /**
  57. * Slices the blob.
  58. *
  59. * @param start Start.
  60. * @param end End.
  61. * @param contentType Content type.
  62. * @returns New Blob.
  63. */
  64. slice(start = 0, end = null, contentType = '') {
  65. const size = this.size;
  66. let relativeStart;
  67. let relativeEnd;
  68. let relativeContentType;
  69. if (start === undefined) {
  70. relativeStart = 0;
  71. }
  72. else if (start < 0) {
  73. relativeStart = Math.max(size + start, 0);
  74. }
  75. else {
  76. relativeStart = Math.min(start, size);
  77. }
  78. if (end === null) {
  79. relativeEnd = size;
  80. }
  81. else if (end < 0) {
  82. relativeEnd = Math.max(size + end, 0);
  83. }
  84. else {
  85. relativeEnd = Math.min(end, size);
  86. }
  87. if (contentType === undefined) {
  88. relativeContentType = '';
  89. }
  90. else {
  91. // Sanitization (lower case and invalid char check) is done in the
  92. // Constructor
  93. relativeContentType = contentType;
  94. }
  95. const span = Math.max(relativeEnd - relativeStart, 0);
  96. const buffer = this._buffer;
  97. const slicedBuffer = buffer.slice(relativeStart, relativeStart + span);
  98. const blob = new Blob([], { type: relativeContentType });
  99. blob._buffer = slicedBuffer;
  100. return blob;
  101. }
  102. /**
  103. * Returns a Promise that resolves to a ArrayBuffer.
  104. *
  105. * @returns ArrayBuffer.
  106. */
  107. // Reference:
  108. // https://github.com/web-std/io/blob/c88170bf24f064adfbb3586a21fb76650ca5a9ab/packages/blob/src/blob.js#L139-L148
  109. // https://stackoverflow.com/questions/8609289/convert-a-binary-nodejs-buffer-to-javascript-arraybuffer
  110. /**
  111. *
  112. */
  113. async arrayBuffer() {
  114. return new Uint8Array(this._buffer).buffer;
  115. }
  116. /**
  117. * Returns a Promise that resolves to a text.
  118. *
  119. * @returns Text.
  120. */
  121. async text() {
  122. return this._buffer.toString();
  123. }
  124. /**
  125. * Closes the blob.
  126. *
  127. * @returns String.
  128. */
  129. toString() {
  130. return '[object Blob]';
  131. }
  132. }
  133. exports.default = Blob;
  134. //# sourceMappingURL=Blob.js.map