65 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const PassThroughDecoder = require('./lib/pass-through-decoder')
 | |
| const UTF8Decoder = require('./lib/utf8-decoder')
 | |
| 
 | |
| module.exports = class TextDecoder {
 | |
|   constructor (encoding = 'utf8') {
 | |
|     this.encoding = normalizeEncoding(encoding)
 | |
| 
 | |
|     switch (this.encoding) {
 | |
|       case 'utf8':
 | |
|         this.decoder = new UTF8Decoder()
 | |
|         break
 | |
|       case 'utf16le':
 | |
|       case 'base64':
 | |
|         throw new Error('Unsupported encoding: ' + this.encoding)
 | |
|       default:
 | |
|         this.decoder = new PassThroughDecoder(this.encoding)
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   get remaining () {
 | |
|     return this.decoder.remaining
 | |
|   }
 | |
| 
 | |
|   push (data) {
 | |
|     if (typeof data === 'string') return data
 | |
|     return this.decoder.decode(data)
 | |
|   }
 | |
| 
 | |
|   // For Node.js compatibility
 | |
|   write (data) {
 | |
|     return this.push(data)
 | |
|   }
 | |
| 
 | |
|   end (data) {
 | |
|     let result = ''
 | |
|     if (data) result = this.push(data)
 | |
|     result += this.decoder.flush()
 | |
|     return result
 | |
|   }
 | |
| }
 | |
| 
 | |
| function normalizeEncoding (encoding) {
 | |
|   encoding = encoding.toLowerCase()
 | |
| 
 | |
|   switch (encoding) {
 | |
|     case 'utf8':
 | |
|     case 'utf-8':
 | |
|       return 'utf8'
 | |
|     case 'ucs2':
 | |
|     case 'ucs-2':
 | |
|     case 'utf16le':
 | |
|     case 'utf-16le':
 | |
|       return 'utf16le'
 | |
|     case 'latin1':
 | |
|     case 'binary':
 | |
|       return 'latin1'
 | |
|     case 'base64':
 | |
|     case 'ascii':
 | |
|     case 'hex':
 | |
|       return encoding
 | |
|     default:
 | |
|       throw new Error('Unknown encoding: ' + encoding)
 | |
|   }
 | |
| };
 |