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)
}
};