33
44const { Readable : ReadableStream } = require ( 'stream' ) ;
55
6- const BUFFER = Symbol ( 'buffer' ) ;
7- const TYPE = Symbol ( 'type' ) ;
6+ const wm = new WeakMap ( ) ;
87
98class Blob {
10- constructor ( ...args ) {
11- this [ TYPE ] = '' ;
12-
13- const blobParts = args [ 0 ] ;
14- const options = args [ 1 ] ;
15-
9+ constructor ( blobParts = [ ] , options = { type : '' } ) {
1610 const buffers = [ ] ;
17- /* eslint-disable-next-line no-unused-vars */
1811 let size = 0 ;
1912
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+ } ) ;
5040 }
5141
5242 get size ( ) {
53- return this [ BUFFER ] . length ;
43+ return wm . get ( this ) . size ;
5444 }
5545
5646 get type ( ) {
57- return this [ TYPE ] ;
47+ return wm . get ( this ) . type ;
5848 }
5949
6050 text ( ) {
61- return Promise . resolve ( this [ BUFFER ] . toString ( ) ) ;
51+ return Promise . resolve ( wm . get ( this ) . buffer . toString ( ) ) ;
6252 }
6353
6454 arrayBuffer ( ) {
65- const buf = this [ BUFFER ] ;
55+ const buf = wm . get ( this ) . buffer ;
6656 const ab = buf . buffer . slice ( buf . byteOffset , buf . byteOffset + buf . byteLength ) ;
6757 return Promise . resolve ( ab ) ;
6858 }
6959
7060 stream ( ) {
7161 const readable = new ReadableStream ( ) ;
7262 readable . _read = ( ) => { } ;
73- readable . push ( this [ BUFFER ] ) ;
63+ readable . push ( wm . get ( this ) . buffer ) ;
7464 readable . push ( null ) ;
7565 return readable ;
7666 }
@@ -88,30 +78,29 @@ class Blob {
8878 let relativeEnd ;
8979
9080 if ( start === undefined ) {
91- relativeStart = 0 ;
81+ relativeStart = 0 ; //
9282 } else if ( start < 0 ) {
93- relativeStart = Math . max ( size + start , 0 ) ;
83+ relativeStart = Math . max ( size + start , 0 ) ; //
9484 } else {
9585 relativeStart = Math . min ( start , size ) ;
9686 }
9787
9888 if ( end === undefined ) {
99- relativeEnd = size ;
89+ relativeEnd = size ; //
10090 } else if ( end < 0 ) {
101- relativeEnd = Math . max ( size + end , 0 ) ;
91+ relativeEnd = Math . max ( size + end , 0 ) ; //
10292 } else {
10393 relativeEnd = Math . min ( end , size ) ;
10494 }
10595
10696 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 (
11098 relativeStart ,
11199 relativeStart + span
112100 ) ;
113101 const blob = new Blob ( [ ] , { type : args [ 2 ] } ) ;
114- blob [ BUFFER ] = slicedBuffer ;
102+ const _ = wm . get ( blob ) ;
103+ _ . buffer = slicedBuffer ;
115104 return blob ;
116105 }
117106}
0 commit comments