text: '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')
      }
    }
  }
  