|
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