3
3
4
4
const { Readable : ReadableStream } = require ( 'stream' ) ;
5
5
6
- const BUFFER = Symbol ( 'buffer' ) ;
7
- const TYPE = Symbol ( 'type' ) ;
6
+ const wm = new WeakMap ( ) ;
8
7
9
8
class Blob {
10
- constructor ( ...args ) {
11
- this [ TYPE ] = '' ;
12
-
13
- const blobParts = args [ 0 ] ;
14
- const options = args [ 1 ] ;
15
-
9
+ constructor ( blobParts = [ ] , options = { type : '' } ) {
16
10
const buffers = [ ] ;
17
- /* eslint-disable-next-line no-unused-vars */
18
11
let size = 0 ;
19
12
20
- if ( blobParts ) {
21
- blobParts . forEach ( element => {
22
- let buffer ;
23
- if ( element instanceof Buffer ) {
24
- buffer = element ;
25
- } else if ( ArrayBuffer . isView ( element ) ) {
26
- buffer = Buffer . from ( element . buffer , element . byteOffset , element . byteLength ) ;
27
- } else if ( element instanceof ArrayBuffer ) {
28
- buffer = Buffer . from ( element ) ;
29
- } else if ( element instanceof Blob ) {
30
- buffer = element [ BUFFER ] ;
31
- } else {
32
- buffer = Buffer . from ( typeof element === 'string' ? element : String ( element ) ) ;
33
- }
34
-
35
- size += buffer . length ;
36
- buffers . push ( buffer ) ;
37
- } ) ;
38
- }
39
-
40
- this [ BUFFER ] = Buffer . concat ( buffers ) ;
41
-
42
- const type = options && options . type !== undefined && String ( options . type ) . toLowerCase ( ) ;
43
- if ( type && ! / [ ^ \u0020 - \u007E ] / . test ( type ) ) {
44
- this [ TYPE ] = type ;
45
- }
46
-
47
- if ( options && Buffer . isBuffer ( options . buffer ) ) {
48
- this [ BUFFER ] = options . buffer ;
49
- }
13
+ blobParts . forEach ( element => {
14
+ let buffer ;
15
+ if ( element instanceof Buffer ) {
16
+ buffer = element ;
17
+ } else if ( ArrayBuffer . isView ( element ) ) {
18
+ buffer = Buffer . from ( element . buffer , element . byteOffset , element . byteLength ) ;
19
+ } else if ( element instanceof ArrayBuffer ) {
20
+ buffer = Buffer . from ( element ) ;
21
+ } else if ( element instanceof Blob ) {
22
+ buffer = wm . get ( element ) . buffer ;
23
+ } else {
24
+ buffer = Buffer . from ( typeof element === 'string' ? element : String ( element ) ) ;
25
+ }
26
+
27
+ size += buffer . length ;
28
+ buffers . push ( buffer ) ;
29
+ } ) ;
30
+
31
+ const buffer = Buffer . concat ( buffers , size ) ;
32
+
33
+ const type = options . type === undefined ? '' : String ( options . type ) . toLowerCase ( ) ;
34
+
35
+ wm . set ( this , {
36
+ type : / [ ^ \u0020 - \u007E ] / . test ( type ) ? '' : type ,
37
+ size,
38
+ buffer
39
+ } ) ;
50
40
}
51
41
52
42
get size ( ) {
53
- return this [ BUFFER ] . length ;
43
+ return wm . get ( this ) . size ;
54
44
}
55
45
56
46
get type ( ) {
57
- return this [ TYPE ] ;
47
+ return wm . get ( this ) . type ;
58
48
}
59
49
60
50
text ( ) {
61
- return Promise . resolve ( this [ BUFFER ] . toString ( ) ) ;
51
+ return Promise . resolve ( wm . get ( this ) . buffer . toString ( ) ) ;
62
52
}
63
53
64
54
arrayBuffer ( ) {
65
- const buf = this [ BUFFER ] ;
55
+ const buf = wm . get ( this ) . buffer ;
66
56
const ab = buf . buffer . slice ( buf . byteOffset , buf . byteOffset + buf . byteLength ) ;
67
57
return Promise . resolve ( ab ) ;
68
58
}
69
59
70
60
stream ( ) {
71
61
const readable = new ReadableStream ( ) ;
72
62
readable . _read = ( ) => { } ;
73
- readable . push ( this [ BUFFER ] ) ;
63
+ readable . push ( wm . get ( this ) . buffer ) ;
74
64
readable . push ( null ) ;
75
65
return readable ;
76
66
}
@@ -88,30 +78,29 @@ class Blob {
88
78
let relativeEnd ;
89
79
90
80
if ( start === undefined ) {
91
- relativeStart = 0 ;
81
+ relativeStart = 0 ; //
92
82
} else if ( start < 0 ) {
93
- relativeStart = Math . max ( size + start , 0 ) ;
83
+ relativeStart = Math . max ( size + start , 0 ) ; //
94
84
} else {
95
85
relativeStart = Math . min ( start , size ) ;
96
86
}
97
87
98
88
if ( end === undefined ) {
99
- relativeEnd = size ;
89
+ relativeEnd = size ; //
100
90
} else if ( end < 0 ) {
101
- relativeEnd = Math . max ( size + end , 0 ) ;
91
+ relativeEnd = Math . max ( size + end , 0 ) ; //
102
92
} else {
103
93
relativeEnd = Math . min ( end , size ) ;
104
94
}
105
95
106
96
const span = Math . max ( relativeEnd - relativeStart , 0 ) ;
107
-
108
- const buffer = this [ BUFFER ] ;
109
- const slicedBuffer = buffer . slice (
97
+ const slicedBuffer = wm . get ( this ) . buffer . slice (
110
98
relativeStart ,
111
99
relativeStart + span
112
100
) ;
113
101
const blob = new Blob ( [ ] , { type : args [ 2 ] } ) ;
114
- blob [ BUFFER ] = slicedBuffer ;
102
+ const _ = wm . get ( blob ) ;
103
+ _ . buffer = slicedBuffer ;
115
104
return blob ;
116
105
}
117
106
}
0 commit comments