Skip to content

Commit 4aa8b93

Browse files
authored
Added missing Blob.arrayBuffer and Blob.text methods to be more compliant with CloudFlare workers/browser environments.
1 parent adcaea7 commit 4aa8b93

File tree

1 file changed

+16
-26
lines changed

1 file changed

+16
-26
lines changed

src/blob.js

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js
22
// (MIT licensed)
3+
import { TextDecoder } from 'util'
34

45
export const BUFFER = Symbol('buffer');
56
const TYPE = Symbol('type');
7+
const decoder = new TextDecoder('utf-8')
68

79
export default class Blob {
810
constructor() {
@@ -41,43 +43,31 @@ export default class Blob {
4143
this[TYPE] = type;
4244
}
4345
}
44-
get size() {
46+
get size () {
4547
return this[BUFFER].length;
4648
}
47-
get type() {
49+
get type () {
4850
return this[TYPE];
4951
}
50-
slice() {
52+
arrayBuffer (start = 0, end) {
5153
const size = this.size;
5254

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))
7157

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)
7764
const blob = new Blob([], { type: arguments[2] });
7865
blob[BUFFER] = slicedBuffer;
7966
return blob;
8067
}
68+
text () {
69+
return decoder.decode(this[BUFFER]).toString()
70+
}
8171
}
8272

8373
Object.defineProperties(Blob.prototype, {

0 commit comments

Comments
 (0)