39 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import { Writable } from "stream";
 | 
						|
import { headStream as headWebStream } from "./headStream.browser";
 | 
						|
import { isReadableStream } from "./stream-type-check";
 | 
						|
export const headStream = (stream, bytes) => {
 | 
						|
    if (isReadableStream(stream)) {
 | 
						|
        return headWebStream(stream, bytes);
 | 
						|
    }
 | 
						|
    return new Promise((resolve, reject) => {
 | 
						|
        const collector = new Collector();
 | 
						|
        collector.limit = bytes;
 | 
						|
        stream.pipe(collector);
 | 
						|
        stream.on("error", (err) => {
 | 
						|
            collector.end();
 | 
						|
            reject(err);
 | 
						|
        });
 | 
						|
        collector.on("error", reject);
 | 
						|
        collector.on("finish", function () {
 | 
						|
            const bytes = new Uint8Array(Buffer.concat(this.buffers));
 | 
						|
            resolve(bytes);
 | 
						|
        });
 | 
						|
    });
 | 
						|
};
 | 
						|
class Collector extends Writable {
 | 
						|
    buffers = [];
 | 
						|
    limit = Infinity;
 | 
						|
    bytesBuffered = 0;
 | 
						|
    _write(chunk, encoding, callback) {
 | 
						|
        this.buffers.push(chunk);
 | 
						|
        this.bytesBuffered += chunk.byteLength ?? 0;
 | 
						|
        if (this.bytesBuffered >= this.limit) {
 | 
						|
            const excess = this.bytesBuffered - this.limit;
 | 
						|
            const tailBuffer = this.buffers[this.buffers.length - 1];
 | 
						|
            this.buffers[this.buffers.length - 1] = tailBuffer.subarray(0, tailBuffer.byteLength - excess);
 | 
						|
            this.emit("finish");
 | 
						|
        }
 | 
						|
        callback();
 | 
						|
    }
 | 
						|
}
 |