sugar
Version:
A Javascript utility library for working with native objects.
109 lines (101 loc) • 2.9 kB
JavaScript
;
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
};