mirror of
https://github.com/nodejs/node.git
synced 2025-08-17 14:48:58 +02:00

PR-URL: https://github.com/nodejs/node/pull/55065 Reviewed-By: Chemi Atlow <chemi@atlow.co.il> Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: LiviaMedeiros <livia@cirno.name> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
45 lines
1.4 KiB
JavaScript
45 lines
1.4 KiB
JavaScript
'use strict';
|
|
|
|
const {
|
|
TypedArrayPrototypeGetLength,
|
|
} = primordials;
|
|
const { DefaultSerializer } = require('v8');
|
|
const { Buffer } = require('buffer');
|
|
const { serializeError } = require('internal/error_serdes');
|
|
|
|
|
|
module.exports = async function* v8Reporter(source) {
|
|
const serializer = new DefaultSerializer();
|
|
serializer.writeHeader();
|
|
const headerLength = TypedArrayPrototypeGetLength(serializer.releaseBuffer());
|
|
|
|
for await (const item of source) {
|
|
const originalError = item.data.details?.error;
|
|
if (originalError) {
|
|
// Error is overridden with a serialized version, so that it can be
|
|
// deserialized in the parent process.
|
|
// Error is restored after serialization.
|
|
item.data.details.error = serializeError(originalError);
|
|
}
|
|
serializer.writeHeader();
|
|
// Add 4 bytes, to later populate with message length
|
|
serializer.writeRawBytes(Buffer.allocUnsafe(4));
|
|
serializer.writeHeader();
|
|
serializer.writeValue(item);
|
|
|
|
if (originalError) {
|
|
item.data.details.error = originalError;
|
|
}
|
|
|
|
const serializedMessage = serializer.releaseBuffer();
|
|
const serializedMessageLength = serializedMessage.length - (4 + headerLength);
|
|
|
|
serializedMessage.set([
|
|
serializedMessageLength >> 24 & 0xFF,
|
|
serializedMessageLength >> 16 & 0xFF,
|
|
serializedMessageLength >> 8 & 0xFF,
|
|
serializedMessageLength & 0xFF,
|
|
], headerLength);
|
|
yield serializedMessage;
|
|
}
|
|
};
|