45 lines
1.1 KiB
JavaScript
45 lines
1.1 KiB
JavaScript
'use strict'
|
|
const { Buffer } = require('buffer')
|
|
|
|
module.exports = function base64 (alphabet) {
|
|
// The alphabet is only used to know:
|
|
// 1. If padding is enabled (must contain '=')
|
|
// 2. If the output must be url-safe (must contain '-' and '_')
|
|
// 3. If the input of the output function is valid
|
|
// The alphabets from RFC 4648 are always used.
|
|
const padding = alphabet.indexOf('=') > -1
|
|
const url = alphabet.indexOf('-') > -1 && alphabet.indexOf('_') > -1
|
|
|
|
return {
|
|
encode (input) {
|
|
let output = ''
|
|
|
|
if (typeof input === 'string') {
|
|
output = Buffer.from(input).toString('base64')
|
|
} else {
|
|
output = input.toString('base64')
|
|
}
|
|
|
|
if (url) {
|
|
output = output.replace(/\+/g, '-').replace(/\//g, '_')
|
|
}
|
|
|
|
const pad = output.indexOf('=')
|
|
if (pad > 0 && !padding) {
|
|
output = output.substring(0, pad)
|
|
}
|
|
|
|
return output
|
|
},
|
|
decode (input) {
|
|
for (const char of input) {
|
|
if (alphabet.indexOf(char) < 0) {
|
|
throw new Error('invalid base64 character')
|
|
}
|
|
}
|
|
|
|
return Buffer.from(input, 'base64')
|
|
}
|
|
}
|
|
}
|