You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							51 lines
						
					
					
						
							1.9 KiB
						
					
					
				
			
		
		
	
	
							51 lines
						
					
					
						
							1.9 KiB
						
					
					
				import { AbstractTokenizer } from './AbstractTokenizer.js';
 | 
						|
import { EndOfStreamError } from 'peek-readable';
 | 
						|
import * as fs from './FsPromise.js';
 | 
						|
export class FileTokenizer extends AbstractTokenizer {
 | 
						|
    constructor(fd, fileInfo) {
 | 
						|
        super(fileInfo);
 | 
						|
        this.fd = fd;
 | 
						|
    }
 | 
						|
    /**
 | 
						|
     * Read buffer from file
 | 
						|
     * @param uint8Array - Uint8Array to write result to
 | 
						|
     * @param options - Read behaviour options
 | 
						|
     * @returns Promise number of bytes read
 | 
						|
     */
 | 
						|
    async readBuffer(uint8Array, options) {
 | 
						|
        const normOptions = this.normalizeOptions(uint8Array, options);
 | 
						|
        this.position = normOptions.position;
 | 
						|
        const res = await fs.read(this.fd, uint8Array, normOptions.offset, normOptions.length, normOptions.position);
 | 
						|
        this.position += res.bytesRead;
 | 
						|
        if (res.bytesRead < normOptions.length && (!options || !options.mayBeLess)) {
 | 
						|
            throw new EndOfStreamError();
 | 
						|
        }
 | 
						|
        return res.bytesRead;
 | 
						|
    }
 | 
						|
    /**
 | 
						|
     * Peek buffer from file
 | 
						|
     * @param uint8Array - Uint8Array (or Buffer) to write data to
 | 
						|
     * @param options - Read behaviour options
 | 
						|
     * @returns Promise number of bytes read
 | 
						|
     */
 | 
						|
    async peekBuffer(uint8Array, options) {
 | 
						|
        const normOptions = this.normalizeOptions(uint8Array, options);
 | 
						|
        const res = await fs.read(this.fd, uint8Array, normOptions.offset, normOptions.length, normOptions.position);
 | 
						|
        if ((!normOptions.mayBeLess) && res.bytesRead < normOptions.length) {
 | 
						|
            throw new EndOfStreamError();
 | 
						|
        }
 | 
						|
        return res.bytesRead;
 | 
						|
    }
 | 
						|
    async close() {
 | 
						|
        return fs.close(this.fd);
 | 
						|
    }
 | 
						|
}
 | 
						|
export async function fromFile(sourceFilePath) {
 | 
						|
    const stat = await fs.stat(sourceFilePath);
 | 
						|
    if (!stat.isFile) {
 | 
						|
        throw new Error(`File not a file: ${sourceFilePath}`);
 | 
						|
    }
 | 
						|
    const fd = await fs.open(sourceFilePath, 'r');
 | 
						|
    return new FileTokenizer(fd, { path: sourceFilePath, size: stat.size });
 | 
						|
}
 |