|
1 | 1 | // Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js
|
2 | 2 | // (MIT licensed)
|
| 3 | +import { TextDecoder } from 'util' |
3 | 4 |
|
4 | 5 | export const BUFFER = Symbol('buffer');
|
5 | 6 | const TYPE = Symbol('type');
|
| 7 | +const decoder = new TextDecoder('utf-8') |
6 | 8 |
|
7 | 9 | export default class Blob {
|
8 | 10 | constructor() {
|
@@ -41,43 +43,31 @@ export default class Blob {
|
41 | 43 | this[TYPE] = type;
|
42 | 44 | }
|
43 | 45 | }
|
44 |
| - get size() { |
| 46 | + get size () { |
45 | 47 | return this[BUFFER].length;
|
46 | 48 | }
|
47 |
| - get type() { |
| 49 | + get type () { |
48 | 50 | return this[TYPE];
|
49 | 51 | }
|
50 |
| - slice() { |
| 52 | + arrayBuffer (start = 0, end) { |
51 | 53 | const size = this.size;
|
52 | 54 |
|
53 |
| - const start = arguments[0]; |
54 |
| - const end = arguments[1]; |
55 |
| - let relativeStart, relativeEnd; |
56 |
| - if (start === undefined) { |
57 |
| - relativeStart = 0; |
58 |
| - } else if (start < 0) { |
59 |
| - relativeStart = Math.max(size + start, 0); |
60 |
| - } else { |
61 |
| - relativeStart = Math.min(start, size); |
62 |
| - } |
63 |
| - if (end === undefined) { |
64 |
| - relativeEnd = size; |
65 |
| - } else if (end < 0) { |
66 |
| - relativeEnd = Math.max(size + end, 0); |
67 |
| - } else { |
68 |
| - relativeEnd = Math.min(end, size); |
69 |
| - } |
70 |
| - const span = Math.max(relativeEnd - relativeStart, 0); |
| 55 | + start = start < 0 ? Math.max(size + start, 0) : (start !== 0 ? Math.min(start, size) : start) |
| 56 | + end = !end ? size : (size < 0 ? Math.max(size + end, 0) : Math.min(end, size)) |
71 | 57 |
|
72 |
| - const buffer = this[BUFFER]; |
73 |
| - const slicedBuffer = buffer.slice( |
74 |
| - relativeStart, |
75 |
| - relativeStart + span |
76 |
| - ); |
| 58 | + const span = Math.max(end - start) |
| 59 | + const buffer = this[BUFFER] |
| 60 | + return buffer.slice(start, start + span) |
| 61 | + } |
| 62 | + slice () { |
| 63 | + const slicedBuffer = this.arrayBuffer(...arguments) |
77 | 64 | const blob = new Blob([], { type: arguments[2] });
|
78 | 65 | blob[BUFFER] = slicedBuffer;
|
79 | 66 | return blob;
|
80 | 67 | }
|
| 68 | + text () { |
| 69 | + return decoder.decode(this[BUFFER]).toString() |
| 70 | + } |
81 | 71 | }
|
82 | 72 |
|
83 | 73 | Object.defineProperties(Blob.prototype, {
|
|
0 commit comments