@@ -98,6 +98,47 @@ const deserializerTypeError =
9898 assert . strictEqual ( des . readValue ( ) . val , hostObject ) ;
9999}
100100
101+ // This test ensures that `v8.Serializer.writeRawBytes()` support
102+ // `TypedArray` and `DataView`.
103+ {
104+ const text = 'hostObjectTag' ;
105+ const data = Buffer . from ( text ) ;
106+ const arrayBufferViews = common . getArrayBufferViews ( data ) ;
107+
108+ // `buf` is one of `TypedArray` or `DataView`.
109+ function testWriteRawBytes ( buf ) {
110+ let writeHostObjectCalled = false ;
111+ const ser = new v8 . DefaultSerializer ( ) ;
112+
113+ ser . _writeHostObject = common . mustCall ( ( object ) => {
114+ writeHostObjectCalled = true ;
115+ ser . writeUint32 ( buf . byteLength ) ;
116+ ser . writeRawBytes ( buf ) ;
117+ } ) ;
118+
119+ ser . writeHeader ( ) ;
120+ ser . writeValue ( { val : hostObject } ) ;
121+
122+ const des = new v8 . DefaultDeserializer ( ser . releaseBuffer ( ) ) ;
123+ des . _readHostObject = common . mustCall ( ( ) => {
124+ assert . strictEqual ( writeHostObjectCalled , true ) ;
125+ const length = des . readUint32 ( ) ;
126+ const buf = des . readRawBytes ( length ) ;
127+ assert . strictEqual ( buf . toString ( ) , text ) ;
128+
129+ return hostObject ;
130+ } ) ;
131+
132+ des . readHeader ( ) ;
133+
134+ assert . strictEqual ( des . readValue ( ) . val , hostObject ) ;
135+ }
136+
137+ arrayBufferViews . forEach ( ( buf ) => {
138+ testWriteRawBytes ( buf ) ;
139+ } ) ;
140+ }
141+
101142{
102143 const ser = new v8 . DefaultSerializer ( ) ;
103144 ser . _writeHostObject = common . mustCall ( ( object ) => {
@@ -146,3 +187,46 @@ const deserializerTypeError =
146187 assert . throws ( v8 . Serializer , serializerTypeError ) ;
147188 assert . throws ( v8 . Deserializer , deserializerTypeError ) ;
148189}
190+
191+
192+ // `v8.deserialize()` and `new v8.Deserializer()` should support both
193+ // `TypedArray` and `DataView`.
194+ {
195+ for ( const obj of objects ) {
196+ const buf = v8 . serialize ( obj ) ;
197+
198+ for ( const arrayBufferView of common . getArrayBufferViews ( buf ) ) {
199+ assert . deepStrictEqual ( v8 . deserialize ( arrayBufferView ) , obj ) ;
200+ }
201+
202+ for ( const arrayBufferView of common . getArrayBufferViews ( buf ) ) {
203+ const deserializer = new v8 . DefaultDeserializer ( arrayBufferView ) ;
204+ deserializer . readHeader ( ) ;
205+ const value = deserializer . readValue ( ) ;
206+ assert . deepStrictEqual ( value , obj ) ;
207+
208+ const serializer = new v8 . DefaultSerializer ( ) ;
209+ serializer . writeHeader ( ) ;
210+ serializer . writeValue ( value ) ;
211+ assert . deepStrictEqual ( buf , serializer . releaseBuffer ( ) ) ;
212+ }
213+ }
214+ }
215+
216+ {
217+ const INVALID_SOURCE = 'INVALID_SOURCE_TYPE' ;
218+ const serializer = new v8 . Serializer ( ) ;
219+ serializer . writeHeader ( ) ;
220+ assert . throws (
221+ ( ) => serializer . writeRawBytes ( INVALID_SOURCE ) ,
222+ / ^ T y p e E r r o r : s o u r c e m u s t b e a T y p e d A r r a y o r a D a t a V i e w $ / ,
223+ ) ;
224+ assert . throws (
225+ ( ) => v8 . deserialize ( INVALID_SOURCE ) ,
226+ / ^ T y p e E r r o r : b u f f e r m u s t b e a T y p e d A r r a y o r a D a t a V i e w $ / ,
227+ ) ;
228+ assert . throws (
229+ ( ) => new v8 . Deserializer ( INVALID_SOURCE ) ,
230+ / ^ T y p e E r r o r : b u f f e r m u s t b e a T y p e d A r r a y o r a D a t a V i e w $ / ,
231+ ) ;
232+ }
0 commit comments