11cb0ef41Sopenharmony_ci'use strict';
21cb0ef41Sopenharmony_ci
31cb0ef41Sopenharmony_ciconst {
41cb0ef41Sopenharmony_ci  TypedArrayPrototypeGetLength,
51cb0ef41Sopenharmony_ci} = primordials;
61cb0ef41Sopenharmony_ciconst { DefaultSerializer } = require('v8');
71cb0ef41Sopenharmony_ciconst { Buffer } = require('buffer');
81cb0ef41Sopenharmony_ciconst { serializeError } = require('internal/error_serdes');
91cb0ef41Sopenharmony_ci
101cb0ef41Sopenharmony_ci
111cb0ef41Sopenharmony_cimodule.exports = async function* v8Reporter(source) {
121cb0ef41Sopenharmony_ci  const serializer = new DefaultSerializer();
131cb0ef41Sopenharmony_ci  serializer.writeHeader();
141cb0ef41Sopenharmony_ci  const headerLength = TypedArrayPrototypeGetLength(serializer.releaseBuffer());
151cb0ef41Sopenharmony_ci
161cb0ef41Sopenharmony_ci  for await (const item of source) {
171cb0ef41Sopenharmony_ci    const originalError = item.data.details?.error;
181cb0ef41Sopenharmony_ci    if (originalError) {
191cb0ef41Sopenharmony_ci      // Error is overriden with a serialized version, so that it can be
201cb0ef41Sopenharmony_ci      // deserialized in the parent process.
211cb0ef41Sopenharmony_ci      // Error is restored after serialization.
221cb0ef41Sopenharmony_ci      item.data.details.error = serializeError(originalError);
231cb0ef41Sopenharmony_ci    }
241cb0ef41Sopenharmony_ci    serializer.writeHeader();
251cb0ef41Sopenharmony_ci    // Add 4 bytes, to later populate with message length
261cb0ef41Sopenharmony_ci    serializer.writeRawBytes(Buffer.allocUnsafe(4));
271cb0ef41Sopenharmony_ci    serializer.writeHeader();
281cb0ef41Sopenharmony_ci    serializer.writeValue(item);
291cb0ef41Sopenharmony_ci
301cb0ef41Sopenharmony_ci    if (originalError) {
311cb0ef41Sopenharmony_ci      item.data.details.error = originalError;
321cb0ef41Sopenharmony_ci    }
331cb0ef41Sopenharmony_ci
341cb0ef41Sopenharmony_ci    const serializedMessage = serializer.releaseBuffer();
351cb0ef41Sopenharmony_ci    const serializedMessageLength = serializedMessage.length - (4 + headerLength);
361cb0ef41Sopenharmony_ci
371cb0ef41Sopenharmony_ci    serializedMessage.set([
381cb0ef41Sopenharmony_ci      serializedMessageLength >> 24 & 0xFF,
391cb0ef41Sopenharmony_ci      serializedMessageLength >> 16 & 0xFF,
401cb0ef41Sopenharmony_ci      serializedMessageLength >> 8 & 0xFF,
411cb0ef41Sopenharmony_ci      serializedMessageLength & 0xFF,
421cb0ef41Sopenharmony_ci    ], headerLength);
431cb0ef41Sopenharmony_ci    yield serializedMessage;
441cb0ef41Sopenharmony_ci  }
451cb0ef41Sopenharmony_ci};
46