@@ -36,6 +36,7 @@ function toASCIILower(str) {
3636
3737const SOLIDUS = '/' ;
3838const SEMICOLON = ';' ;
39+
3940function parseTypeAndSubtype ( str ) {
4041 // Skip only HTTP whitespace from start
4142 let position = SafeStringPrototypeSearch ( str , END_BEGINNING_WHITESPACE ) ;
@@ -72,12 +73,11 @@ function parseTypeAndSubtype(str) {
7273 throw new ERR_INVALID_MIME_SYNTAX ( 'subtype' , str , trimmedSubtype ) ;
7374 }
7475 const subtype = toASCIILower ( trimmedSubtype ) ;
75- return {
76- __proto__ : null ,
76+ return [
7777 type ,
7878 subtype ,
79- parametersStringIndex : position ,
80- } ;
79+ position ,
80+ ] ;
8181}
8282
8383const EQUALS_SEMICOLON_OR_END = / [ ; = ] | $ / ;
@@ -122,13 +122,29 @@ const encode = (value) => {
122122} ;
123123
124124class MIMEParams {
125- #data = new SafeMap ( ) ;
125+ #data = null ;
126+ #processed = false ;
127+ #string = null ;
128+
129+ constructor ( ) {
130+ this . #data = new SafeMap ( ) ;
131+ this . #processed = true ;
132+ }
133+
134+ static instantiateMimeParams ( str ) {
135+ const instance = new MIMEParams ( ) ;
136+ instance . #string = str ;
137+ instance . #processed = false ;
138+ return instance ;
139+ }
126140
127141 delete ( name ) {
142+ this . #parse( ) ;
128143 this . #data. delete ( name ) ;
129144 }
130145
131146 get ( name ) {
147+ this . #parse( ) ;
132148 const data = this . #data;
133149 if ( data . has ( name ) ) {
134150 return data . get ( name ) ;
@@ -137,10 +153,12 @@ class MIMEParams {
137153 }
138154
139155 has ( name ) {
156+ this . #parse( ) ;
140157 return this . #data. has ( name ) ;
141158 }
142159
143160 set ( name , value ) {
161+ this . #parse( ) ;
144162 const data = this . #data;
145163 name = `${ name } ` ;
146164 value = `${ value } ` ;
@@ -166,18 +184,22 @@ class MIMEParams {
166184 }
167185
168186 * entries ( ) {
187+ this . #parse( ) ;
169188 yield * this . #data. entries ( ) ;
170189 }
171190
172191 * keys ( ) {
192+ this . #parse( ) ;
173193 yield * this . #data. keys ( ) ;
174194 }
175195
176196 * values ( ) {
197+ this . #parse( ) ;
177198 yield * this . #data. values ( ) ;
178199 }
179200
180201 toString ( ) {
202+ this . #parse( ) ;
181203 let ret = '' ;
182204 for ( const { 0 : key , 1 : value } of this . #data) {
183205 const encoded = encode ( value ) ;
@@ -190,8 +212,11 @@ class MIMEParams {
190212
191213 // Used to act as a friendly class to stringifying stuff
192214 // not meant to be exposed to users, could inject invalid values
193- static parseParametersString ( str , position , params ) {
194- const paramsMap = params . #data;
215+ #parse( ) {
216+ if ( this . #processed) return ; // already parsed
217+ const paramsMap = new SafeMap ( ) ;
218+ let position = 0 ;
219+ const str = this . #string;
195220 const endOfSource = SafeStringPrototypeSearch (
196221 StringPrototypeSlice ( str , position ) ,
197222 START_ENDING_WHITESPACE ,
@@ -270,13 +295,14 @@ class MIMEParams {
270295 NOT_HTTP_TOKEN_CODE_POINT ) === - 1 &&
271296 SafeStringPrototypeSearch ( parameterValue ,
272297 NOT_HTTP_QUOTED_STRING_CODE_POINT ) === - 1 &&
273- params . has ( parameterString ) === false
298+ paramsMap . has ( parameterString ) === false
274299 ) {
275300 paramsMap . set ( parameterString , parameterValue ) ;
276301 }
277302 position ++ ;
278303 }
279- return paramsMap ;
304+ this . #data = paramsMap ;
305+ this . #processed = true ;
280306 }
281307}
282308const MIMEParamsStringify = MIMEParams . prototype . toString ;
@@ -293,8 +319,8 @@ ObjectDefineProperty(MIMEParams.prototype, 'toJSON', {
293319 writable : true ,
294320} ) ;
295321
296- const { parseParametersString } = MIMEParams ;
297- delete MIMEParams . parseParametersString ;
322+ const { instantiateMimeParams : instantiateMimeParams } = MIMEParams ;
323+ delete MIMEParams . instantiateMimeParams ;
298324
299325class MIMEType {
300326 #type;
@@ -303,14 +329,9 @@ class MIMEType {
303329 constructor ( string ) {
304330 string = `${ string } ` ;
305331 const data = parseTypeAndSubtype ( string ) ;
306- this . #type = data . type ;
307- this . #subtype = data . subtype ;
308- this . #parameters = new MIMEParams ( ) ;
309- parseParametersString (
310- string ,
311- data . parametersStringIndex ,
312- this . #parameters,
313- ) ;
332+ this . #type = data [ 0 ] ;
333+ this . #subtype = data [ 1 ] ;
334+ this . #parameters = instantiateMimeParams ( StringPrototypeSlice ( string , data [ 2 ] ) ) ;
314335 }
315336
316337 get type ( ) {
@@ -362,6 +383,8 @@ ObjectDefineProperty(MIMEType.prototype, 'toJSON', {
362383} ) ;
363384
364385module . exports = {
386+ toASCIILower,
387+ parseTypeAndSubtype,
365388 MIMEParams,
366389 MIMEType,
367390} ;
0 commit comments