Files
Kmake/lib/internal/test_runner/reporter/v8-serializer.js
2026-05-26 23:36:42 -07:00

46 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;
}
};