UNPKG

sugar

Version:

A Javascript utility library for working with native objects.

109 lines (101 loc) 2.9 kB
'use strict'; var chr = require('../../common/var/chr'); var encodeBase64, decodeBase64; function buildBase64() { var encodeAscii, decodeAscii; // istanbul ignore next function catchEncodingError(fn) { return function(str) { try { return fn(str); } catch(e) { return ''; } }; } // istanbul ignore if if (typeof Buffer !== 'undefined') { encodeBase64 = function(str) { return Buffer.from(str).toString('base64'); }; decodeBase64 = function(str) { return Buffer.from(str, 'base64').toString('utf8'); }; return; } // istanbul ignore if if (typeof btoa !== 'undefined') { encodeAscii = catchEncodingError(btoa); decodeAscii = catchEncodingError(atob); } else { var key = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; var base64reg = /[^A-Za-z0-9\+\/\=]/g; encodeAscii = function(str) { var output = ''; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; do { chr1 = str.charCodeAt(i++); chr2 = str.charCodeAt(i++); chr3 = str.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output += key.charAt(enc1); output += key.charAt(enc2); output += key.charAt(enc3); output += key.charAt(enc4); chr1 = chr2 = chr3 = ''; enc1 = enc2 = enc3 = enc4 = ''; } while (i < str.length); return output; }; decodeAscii = function(input) { var output = ''; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; if (input.match(base64reg)) { return ''; } input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ''); do { enc1 = key.indexOf(input.charAt(i++)); enc2 = key.indexOf(input.charAt(i++)); enc3 = key.indexOf(input.charAt(i++)); enc4 = key.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + chr(chr1); if (enc3 != 64) { output = output + chr(chr2); } if (enc4 != 64) { output = output + chr(chr3); } chr1 = chr2 = chr3 = ''; enc1 = enc2 = enc3 = enc4 = ''; } while (i < input.length); return output; }; } encodeBase64 = function(str) { return encodeAscii(unescape(encodeURIComponent(str))); }; decodeBase64 = function(str) { return decodeURIComponent(escape(decodeAscii(str))); }; } buildBase64(); module.exports = { encodeBase64: encodeBase64, decodeBase64: decodeBase64 };