65 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const MAX_SHORT_STRING = require('./wasm-hash').MAX_SHORT_STRING;
 | |
| 
 | |
| class BatchedHash {
 | |
|   constructor(hash) {
 | |
|     this.string = undefined;
 | |
|     this.encoding = undefined;
 | |
|     this.hash = hash;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Update hash {@link https://nodejs.org/api/crypto.html#crypto_hash_update_data_inputencoding}
 | |
|    * @param {string|Buffer} data data
 | |
|    * @param {string=} inputEncoding data encoding
 | |
|    * @returns {this} updated hash
 | |
|    */
 | |
|   update(data, inputEncoding) {
 | |
|     if (this.string !== undefined) {
 | |
|       if (
 | |
|         typeof data === 'string' &&
 | |
|         inputEncoding === this.encoding &&
 | |
|         this.string.length + data.length < MAX_SHORT_STRING
 | |
|       ) {
 | |
|         this.string += data;
 | |
| 
 | |
|         return this;
 | |
|       }
 | |
| 
 | |
|       this.hash.update(this.string, this.encoding);
 | |
|       this.string = undefined;
 | |
|     }
 | |
| 
 | |
|     if (typeof data === 'string') {
 | |
|       if (
 | |
|         data.length < MAX_SHORT_STRING &&
 | |
|         // base64 encoding is not valid since it may contain padding chars
 | |
|         (!inputEncoding || !inputEncoding.startsWith('ba'))
 | |
|       ) {
 | |
|         this.string = data;
 | |
|         this.encoding = inputEncoding;
 | |
|       } else {
 | |
|         this.hash.update(data, inputEncoding);
 | |
|       }
 | |
|     } else {
 | |
|       this.hash.update(data);
 | |
|     }
 | |
| 
 | |
|     return this;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Calculates the digest {@link https://nodejs.org/api/crypto.html#crypto_hash_digest_encoding}
 | |
|    * @param {string=} encoding encoding of the return value
 | |
|    * @returns {string|Buffer} digest
 | |
|    */
 | |
|   digest(encoding) {
 | |
|     if (this.string !== undefined) {
 | |
|       this.hash.update(this.string, this.encoding);
 | |
|     }
 | |
| 
 | |
|     return this.hash.digest(encoding);
 | |
|   }
 | |
| }
 | |
| 
 | |
| module.exports = BatchedHash;
 |