// Compare two Uint8Arrays. function compareArrays(actual, expected) { assert_true(actual instanceof Uint8Array, 'actual is Uint8Array'); assert_true(expected instanceof Uint8Array, 'expected is Uint8Array'); assert_equals(actual.byteLength, expected.byteLength, 'lengths equal'); for (let i = 0; i < expected.byteLength; ++i) assert_equals(actual[i], expected[i], `Mismatch at position ${i}.`); } // Reads from |reader| until at least |targetLength| is read or the stream is // closed. The data is returned as a combined Uint8Array. async function readWithLength(reader, targetLength) { const chunks = []; let actualLength = 0; while (true) { let {value, done} = await reader.read(); chunks.push(value); actualLength += value.byteLength; if (actualLength >= targetLength || done) { // It would be better to allocate |buffer| up front with the number of // of bytes expected but this is the best that can be done without a // BYOB reader to control the amount of data read. const buffer = new Uint8Array(actualLength); chunks.reduce((offset, chunk) => { buffer.set(chunk, offset); return offset + chunk.byteLength; }, 0); return buffer; } } }