UNPKG

compact-base64

Version:

Base64 encoding and decoding for Node.JS and browsers without polyfills

63 lines (51 loc) 1.76 kB
'use strict'; /** * Note on encode and replace functions: * These is for Unicode support * https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem */ var encode = function (source, inputEncoding) { var raw = ''; var data = []; if (/^utf-?(8|16)$/i.test(inputEncoding) || !inputEncoding) { encodeURIComponent(source).replace(/%([0-9A-F]{2})|./g, function(m, p1) { data.push(p1 ? parseInt(p1, 16) : m.charCodeAt(0)); }); } else if (inputEncoding === 'hex') { source.replace(/[0-9A-F]{2}/gi, function(m) { data.push(parseInt(m, 16)); }); } else if (inputEncoding === 'binary') { data = source; } else { throw new Error('Invalid inputEncoding supplied'); } // map + join generates invalid results for binary data data.forEach(function(b) { var hex = ('00' + b.toString(16)).slice(-2); raw += String.fromCharCode('0x' + hex); }); return btoa(raw); }; var decode = function (encoded, outputEncoding) { var data = Array.prototype.map.call(atob(encoded), function(c) { return c.charCodeAt(0); }); if (outputEncoding === 'binary') return data; if (outputEncoding === 'hex') { return data.map(function(b) { return ('00' + b.toString(16)).slice(-2); }).join(''); } if (/^utf-?(8|16)$/i.test(outputEncoding) || !outputEncoding) { return decodeURIComponent(data.map(function(c) { return '%' + ('00' + c.toString(16)).slice(-2); }).join('')); } throw new Error('Invalid outputEncoding supplied'); }; module.exports = require('./common')(encode, decode);