@cloudflare/puppeteer
Version:
A high-level API to control headless Chrome over the DevTools Protocol
61 lines • 2.52 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.chunksToMessage = exports.messageToChunks = void 0;
/**
* @license
* Copyright 2025 Google Inc.
* SPDX-License-Identifier: Apache-2.0
*/
const HEADER_SIZE = 4; // Uint32
const MAX_MESSAGE_SIZE = 1048575; // Workers size is < 1MB
const FIRST_CHUNK_DATA_SIZE = MAX_MESSAGE_SIZE - HEADER_SIZE;
const messageToChunks = (data) => {
const encoder = new TextEncoder();
const encodedUint8Array = encoder.encode(data);
// We only include the header into the first chunk
const firstChunk = new Uint8Array(Math.min(MAX_MESSAGE_SIZE, HEADER_SIZE + encodedUint8Array.length));
const view = new DataView(firstChunk.buffer);
view.setUint32(0, encodedUint8Array.length, true);
firstChunk.set(encodedUint8Array.slice(0, FIRST_CHUNK_DATA_SIZE), HEADER_SIZE);
const chunks = [firstChunk];
for (let i = FIRST_CHUNK_DATA_SIZE; i < data.length; i += MAX_MESSAGE_SIZE) {
chunks.push(encodedUint8Array.slice(i, i + MAX_MESSAGE_SIZE));
}
return chunks;
};
exports.messageToChunks = messageToChunks;
const chunksToMessage = (chunks, sessionid) => {
if (chunks.length === 0) {
return null;
}
const emptyBuffer = new Uint8Array(0);
const firstChunk = chunks[0] || emptyBuffer;
const view = new DataView(firstChunk.buffer);
const expectedBytes = view.getUint32(0, true);
let totalBytes = -HEADER_SIZE;
for (let i = 0; i < chunks.length; ++i) {
const curChunk = chunks[i] || emptyBuffer;
totalBytes += curChunk.length;
if (totalBytes > expectedBytes) {
throw new Error(`Should have gotten the exact number of bytes but we got more. SessionID: ${sessionid}`);
}
if (totalBytes === expectedBytes) {
const chunksToCombine = chunks.splice(0, i + 1);
chunksToCombine[0] = firstChunk.subarray(HEADER_SIZE);
const combined = new Uint8Array(expectedBytes);
let offset = 0;
for (let j = 0; j <= i; ++j) {
const chunk = chunksToCombine[j] || emptyBuffer;
combined.set(chunk, offset);
offset += chunk.length;
}
const decoder = new TextDecoder();
// return decoder.decode(combined)
const message = decoder.decode(combined);
return message;
}
}
return null;
};
exports.chunksToMessage = chunksToMessage;
//# sourceMappingURL=chunking.js.map