@@ -162,12 +162,59 @@ export class Devaluator {
162162 }
163163
164164 case "bytes" : {
165- let bytes = value as Uint8Array ;
166- if ( bytes . toBase64 ) {
167- return [ "bytes" , bytes . toBase64 ( { omitPadding : true } ) ] ;
165+ let alternateTypeName : string | undefined ;
166+ let bytes : Uint8Array | undefined ;
167+ switch ( Object . getPrototypeOf ( value ) ) {
168+ case ArrayBuffer . prototype :
169+ alternateTypeName = "ArrayBuffer" ;
170+ bytes = new Uint8Array ( value as ArrayBuffer ) ;
171+ break ;
172+ case DataView . prototype :
173+ alternateTypeName = "DataView" ;
174+ break ;
175+ case Int8Array . prototype :
176+ alternateTypeName = "Int8Array" ;
177+ break ;
178+ case Uint8ClampedArray . prototype :
179+ alternateTypeName = "Uint8ClampedArray" ;
180+ break ;
181+ case Int16Array . prototype :
182+ alternateTypeName = "Int16Array" ;
183+ break ;
184+ case Uint16Array . prototype :
185+ alternateTypeName = "Uint16Array" ;
186+ break ;
187+ case Int32Array . prototype :
188+ alternateTypeName = "Int32Array" ;
189+ break ;
190+ case Uint32Array . prototype :
191+ alternateTypeName = "Uint32Array" ;
192+ break ;
193+ case BigInt64Array . prototype :
194+ alternateTypeName = "BigInt64Array" ;
195+ break ;
196+ case BigUint64Array . prototype :
197+ alternateTypeName = "BigUint64Array" ;
198+ break ;
199+ case Float32Array . prototype :
200+ alternateTypeName = "Float32Array" ;
201+ break ;
202+ case Float64Array . prototype :
203+ alternateTypeName = "Float64Array" ;
204+ break ;
205+ default :
206+ bytes = value as Uint8Array ;
207+ break ;
208+ }
209+ if ( bytes === undefined ) {
210+ let view = value as ArrayBufferView ;
211+ bytes = new Uint8Array ( view . buffer , view . byteOffset , view . byteLength ) ;
168212 }
213+
169214 let b64 : string ;
170- if ( typeof Buffer !== "undefined" ) {
215+ if ( bytes . toBase64 ) {
216+ b64 = bytes . toBase64 ( { omitPadding : true } ) ;
217+ } else if ( typeof Buffer !== "undefined" ) {
171218 let buf = bytes instanceof Buffer ? bytes
172219 : Buffer . from ( bytes . buffer , bytes . byteOffset , bytes . byteLength ) ;
173220 b64 = buf . toString ( "base64" ) ;
@@ -178,7 +225,8 @@ export class Devaluator {
178225 }
179226 b64 = btoa ( binary ) ;
180227 }
181- return [ "bytes" , b64 . replace ( / = + $ / , "" ) ] ;
228+ b64 = b64 . replace ( / = + $ / , "" ) ;
229+ return alternateTypeName === undefined ? [ "bytes" , b64 ] : [ "bytes" , b64 , alternateTypeName ] ;
182230 }
183231
184232 case "headers" :
@@ -601,19 +649,45 @@ export class Evaluator {
601649 break ;
602650 case "bytes" : {
603651 if ( typeof value [ 1 ] == "string" ) {
652+ let bytes : Uint8Array ;
604653 if ( typeof Buffer !== "undefined" ) {
605- return Buffer . from ( value [ 1 ] , "base64" ) ;
654+ bytes = Buffer . from ( value [ 1 ] , "base64" ) ;
606655 } else if ( Uint8Array . fromBase64 ) {
607- return Uint8Array . fromBase64 ( value [ 1 ] ) ;
656+ bytes = Uint8Array . fromBase64 ( value [ 1 ] ) ;
608657 } else {
609658 let bs = atob ( value [ 1 ] ) ;
610659 let len = bs . length ;
611- let bytes = new Uint8Array ( len ) ;
660+ bytes = new Uint8Array ( len ) ;
612661 for ( let i = 0 ; i < len ; i ++ ) {
613662 bytes [ i ] = bs . charCodeAt ( i ) ;
614663 }
664+ }
665+ if ( value . length === 2 ) {
615666 return bytes ;
616667 }
668+ if ( typeof value [ 2 ] !== "string" ) {
669+ throw new TypeError ( `Unknown bytes type marker type: ${ typeof value [ 2 ] } ` ) ;
670+ }
671+
672+ let buffer = bytes . buffer . slice ( bytes . byteOffset , bytes . byteOffset + bytes . byteLength ) ;
673+ switch ( value [ 2 ] ) {
674+ case "ArrayBuffer" : return buffer ;
675+ case "DataView" : return new DataView ( buffer ) ;
676+ case "Int8Array" : return new Int8Array ( buffer ) ;
677+ case "Uint8ClampedArray" : return new Uint8ClampedArray ( buffer ) ;
678+ case "Int16Array" : return new Int16Array ( buffer ) ;
679+ case "Uint16Array" : return new Uint16Array ( buffer ) ;
680+ case "Int32Array" : return new Int32Array ( buffer ) ;
681+ case "Uint32Array" : return new Uint32Array ( buffer ) ;
682+ case "BigInt64Array" : return new BigInt64Array ( buffer ) ;
683+ case "BigUint64Array" : return new BigUint64Array ( buffer ) ;
684+ case "Float32Array" : return new Float32Array ( buffer ) ;
685+ case "Float64Array" : return new Float64Array ( buffer ) ;
686+ default : {
687+ let marker = value [ 2 ] . slice ( 0 , 64 ) ;
688+ throw new TypeError ( `Unknown bytes type marker: ${ marker } ` ) ;
689+ }
690+ }
617691 }
618692 break ;
619693 }
0 commit comments