@@ -98,6 +98,47 @@ const deserializerTypeError =
98
98
assert . strictEqual ( des . readValue ( ) . val , hostObject ) ;
99
99
}
100
100
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
+
101
142
{
102
143
const ser = new v8 . DefaultSerializer ( ) ;
103
144
ser . _writeHostObject = common . mustCall ( ( object ) => {
@@ -146,3 +187,46 @@ const deserializerTypeError =
146
187
assert . throws ( v8 . Serializer , serializerTypeError ) ;
147
188
assert . throws ( v8 . Deserializer , deserializerTypeError ) ;
148
189
}
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