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.
		
		
		
		
		
			
		
			
				
					52 lines
				
				1.9 KiB
			
		
		
			
		
	
	
					52 lines
				
				1.9 KiB
			| 
											2 years ago
										 | import { EndOfStreamError } from 'peek-readable'; | ||
|  | import { AbstractTokenizer } from './AbstractTokenizer.js'; | ||
|  | export class BufferTokenizer extends AbstractTokenizer { | ||
|  |     /** | ||
|  |      * Construct BufferTokenizer | ||
|  |      * @param uint8Array - Uint8Array to tokenize | ||
|  |      * @param fileInfo - Pass additional file information to the tokenizer | ||
|  |      */ | ||
|  |     constructor(uint8Array, fileInfo) { | ||
|  |         super(fileInfo); | ||
|  |         this.uint8Array = uint8Array; | ||
|  |         this.fileInfo.size = this.fileInfo.size ? this.fileInfo.size : uint8Array.length; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Read buffer from tokenizer | ||
|  |      * @param uint8Array - Uint8Array to tokenize | ||
|  |      * @param options - Read behaviour options | ||
|  |      * @returns {Promise<number>} | ||
|  |      */ | ||
|  |     async readBuffer(uint8Array, options) { | ||
|  |         if (options && options.position) { | ||
|  |             if (options.position < this.position) { | ||
|  |                 throw new Error('`options.position` must be equal or greater than `tokenizer.position`'); | ||
|  |             } | ||
|  |             this.position = options.position; | ||
|  |         } | ||
|  |         const bytesRead = await this.peekBuffer(uint8Array, options); | ||
|  |         this.position += bytesRead; | ||
|  |         return bytesRead; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Peek (read ahead) buffer from tokenizer | ||
|  |      * @param uint8Array | ||
|  |      * @param options - Read behaviour options | ||
|  |      * @returns {Promise<number>} | ||
|  |      */ | ||
|  |     async peekBuffer(uint8Array, options) { | ||
|  |         const normOptions = this.normalizeOptions(uint8Array, options); | ||
|  |         const bytes2read = Math.min(this.uint8Array.length - normOptions.position, normOptions.length); | ||
|  |         if ((!normOptions.mayBeLess) && bytes2read < normOptions.length) { | ||
|  |             throw new EndOfStreamError(); | ||
|  |         } | ||
|  |         else { | ||
|  |             uint8Array.set(this.uint8Array.subarray(normOptions.position, normOptions.position + bytes2read), normOptions.offset); | ||
|  |             return bytes2read; | ||
|  |         } | ||
|  |     } | ||
|  |     async close() { | ||
|  |         // empty
 | ||
|  |     } | ||
|  | } |