32 lines
		
	
	
		
			923 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			32 lines
		
	
	
		
			923 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
export async function headStream(stream, bytes) {
 | 
						|
    let byteLengthCounter = 0;
 | 
						|
    const chunks = [];
 | 
						|
    const reader = stream.getReader();
 | 
						|
    let isDone = false;
 | 
						|
    while (!isDone) {
 | 
						|
        const { done, value } = await reader.read();
 | 
						|
        if (value) {
 | 
						|
            chunks.push(value);
 | 
						|
            byteLengthCounter += value?.byteLength ?? 0;
 | 
						|
        }
 | 
						|
        if (byteLengthCounter >= bytes) {
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        isDone = done;
 | 
						|
    }
 | 
						|
    reader.releaseLock();
 | 
						|
    const collected = new Uint8Array(Math.min(bytes, byteLengthCounter));
 | 
						|
    let offset = 0;
 | 
						|
    for (const chunk of chunks) {
 | 
						|
        if (chunk.byteLength > collected.byteLength - offset) {
 | 
						|
            collected.set(chunk.subarray(0, collected.byteLength - offset), offset);
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            collected.set(chunk, offset);
 | 
						|
        }
 | 
						|
        offset += chunk.length;
 | 
						|
    }
 | 
						|
    return collected;
 | 
						|
}
 |