1
1
// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js
2
- // Also based on https://github.com/bitinn/node-fetch/blob/v2.5.0/src/blob.js
3
2
// (MIT licensed)
4
3
5
4
const Stream = require ( 'stream' ) ;
6
- const Readable = Stream . Readable ;
5
+
6
+ // Fix for "Readable" isn't a named export issue
7
+ const { Readable} = Stream ;
7
8
8
9
const BUFFER = Symbol ( 'buffer' ) ;
9
10
const TYPE = Symbol ( 'type' ) ;
10
11
11
12
class Blob {
12
- constructor ( ) {
13
+ constructor ( ... args ) {
13
14
this [ TYPE ] = '' ;
14
15
15
- const blobParts = arguments [ 0 ] ;
16
- const options = arguments [ 1 ] ;
16
+ const blobParts = args [ 0 ] ;
17
+ const options = args [ 1 ] ;
17
18
18
19
const buffers = [ ] ;
20
+ /* eslint-disable-next-line no-unused-vars */
19
21
let size = 0 ;
20
22
21
23
if ( blobParts ) {
22
- const a = blobParts ;
23
- const length = Number ( a . length ) ;
24
- for ( let i = 0 ; i < length ; i ++ ) {
25
- const element = a [ i ] ;
24
+ blobParts . forEach ( element => {
26
25
let buffer ;
27
26
if ( element instanceof Buffer ) {
28
27
buffer = element ;
@@ -35,81 +34,95 @@ class Blob {
35
34
} else {
36
35
buffer = Buffer . from ( typeof element === 'string' ? element : String ( element ) ) ;
37
36
}
37
+
38
38
size += buffer . length ;
39
39
buffers . push ( buffer ) ;
40
- }
40
+ } ) ;
41
41
}
42
42
43
43
this [ BUFFER ] = Buffer . concat ( buffers ) ;
44
44
45
- let type = options &&
46
- options . type !== undefined &&
47
- String ( options . type ) . toLowerCase ( ) ;
45
+ const type = options && options . type !== undefined && String ( options . type ) . toLowerCase ( ) ;
48
46
if ( type && ! / [ ^ \u0020 - \u007E ] / . test ( type ) ) {
49
47
this [ TYPE ] = type ;
50
48
}
49
+
50
+ if ( options && Buffer . isBuffer ( options . buffer ) ) {
51
+ this [ BUFFER ] = options . buffer ;
52
+ }
51
53
}
54
+
52
55
get size ( ) {
53
56
return this [ BUFFER ] . length ;
54
57
}
58
+
55
59
get type ( ) {
56
60
return this [ TYPE ] ;
57
61
}
62
+
58
63
text ( ) {
59
- return Promise . resolve ( this [ BUFFER ] . toString ( ) )
64
+ return Promise . resolve ( this [ BUFFER ] . toString ( ) ) ;
60
65
}
66
+
61
67
arrayBuffer ( ) {
62
68
const buf = this [ BUFFER ] ;
63
69
const ab = buf . buffer . slice ( buf . byteOffset , buf . byteOffset + buf . byteLength ) ;
64
70
return Promise . resolve ( ab ) ;
65
71
}
72
+
66
73
stream ( ) {
67
74
const readable = new Readable ( ) ;
68
- readable . _read = ( ) => { } ;
75
+ readable . _read = ( ) => { } ;
69
76
readable . push ( this [ BUFFER ] ) ;
70
77
readable . push ( null ) ;
71
78
return readable ;
72
79
}
80
+
73
81
toString ( ) {
74
- return '[object Blob]'
82
+ return '[object Blob]' ;
75
83
}
76
- slice ( ) {
77
- const size = this . size ;
78
84
79
- const start = arguments [ 0 ] ;
80
- const end = arguments [ 1 ] ;
81
- let relativeStart , relativeEnd ;
85
+ slice ( ...args ) {
86
+ const { size} = this ;
87
+
88
+ const start = args [ 0 ] ;
89
+ const end = args [ 1 ] ;
90
+ let relativeStart ;
91
+ let relativeEnd ;
92
+
82
93
if ( start === undefined ) {
83
94
relativeStart = 0 ;
84
95
} else if ( start < 0 ) {
85
96
relativeStart = Math . max ( size + start , 0 ) ;
86
97
} else {
87
98
relativeStart = Math . min ( start , size ) ;
88
99
}
100
+
89
101
if ( end === undefined ) {
90
102
relativeEnd = size ;
91
103
} else if ( end < 0 ) {
92
104
relativeEnd = Math . max ( size + end , 0 ) ;
93
105
} else {
94
106
relativeEnd = Math . min ( end , size ) ;
95
107
}
108
+
96
109
const span = Math . max ( relativeEnd - relativeStart , 0 ) ;
97
110
98
111
const buffer = this [ BUFFER ] ;
99
112
const slicedBuffer = buffer . slice (
100
113
relativeStart ,
101
114
relativeStart + span
102
115
) ;
103
- const blob = new Blob ( [ ] , { type : arguments [ 2 ] } ) ;
116
+ const blob = new Blob ( [ ] , { type : args [ 2 ] } ) ;
104
117
blob [ BUFFER ] = slicedBuffer ;
105
118
return blob ;
106
119
}
107
120
}
108
121
109
122
Object . defineProperties ( Blob . prototype , {
110
- size : { enumerable : true } ,
111
- type : { enumerable : true } ,
112
- slice : { enumerable : true }
123
+ size : { enumerable : true } ,
124
+ type : { enumerable : true } ,
125
+ slice : { enumerable : true }
113
126
} ) ;
114
127
115
128
Object . defineProperty ( Blob . prototype , Symbol . toStringTag , {
0 commit comments