Skip to content

Instantly share code, notes, and snippets.

@adampweb
Created July 13, 2023 08:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save adampweb/5d3ed609f5b247a6fb74a05397b13ae6 to your computer and use it in GitHub Desktop.
Save adampweb/5d3ed609f5b247a6fb74a05397b13ae6 to your computer and use it in GitHub Desktop.
Cross-browser Base64 object
/**
* @see https://stackoverflow.com/a/26514148/6087422
* @description Cross-browser Base64 object (compatible with TypeScript). Based on the attached StackOverflow answer by <a href="https://stackoverflow.com/users/1922144/davidcondrey" target="_blank">davidcondrey</a>
* Use case: This script is an alternative to the <a href="https://nodejs.org/docs/latest-v18.x/api/crypto.html" target="_blank">crypto</a> <b>Node.js module</b> in <a href="https://nextjs.org/docs/messages/node-module-in-edge-runtime" target="_blank">Next.js Edge functions (e.g.: middleware)</a>
*/
const Base64 = {
_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
encode:function(e: any){
let t="";
let n,r,i,s,o,u,a;
let f=0;
e=Base64._utf8_encode(e);
while(f<e.length){
n=e.charCodeAt(f++);
r=e.charCodeAt(f++);
i=e.charCodeAt(f++);
s=n>>2;
o=(n&3)<<4|r>>4;
u=(r&15)<<2|i>>6;
a=i&63;
if(isNaN(r)){u=a=64}
else if(isNaN(i)){a=64}
t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)
}
return t
},
decode:function(e: any){
let t="";
let n,r,i;
let s,o,u,a;
let f=0;
e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");
while(f<e.length){
s=this._keyStr.indexOf(e.charAt(f++));
o=this._keyStr.indexOf(e.charAt(f++));
u=this._keyStr.indexOf(e.charAt(f++));
a=this._keyStr.indexOf(e.charAt(f++));
n=s<<2|o>>4;
r=(o&15)<<4|u>>2;
i=(u&3)<<6|a;
t=t+String.fromCharCode(n);
if(u!=64){t=t+String.fromCharCode(r)}
if(a!=64){t=t+String.fromCharCode(i)}
}
t=Base64._utf8_decode(t);
return t
},
_utf8_encode:function(e: any){
e=e.replace(/\r\n/g,"\n");
let t="";
for(let n=0;n<e.length;n++){
let r=e.charCodeAt(n);
if(r<128){
t+=String.fromCharCode(r)
}
else if(r>127&&r<2048){
t+=String.fromCharCode(r>>6|192);
t+=String.fromCharCode(r&63|128)
}
else{t+=String.fromCharCode(r>>12|224);
t+=String.fromCharCode(r>>6&63|128);
t+=String.fromCharCode(r&63|128)}
}
return t
},
_utf8_decode:function(e: any){
let t="";
let n=0;
let c1, c2, c3 = 0;
let r=c1=c2=0;
while(n<e.length){
r=e.charCodeAt(n);
if(r<128){
t+=String.fromCharCode(r);
n++
}else if(r>191&&r<224){
c2=e.charCodeAt(n+1);
t+=String.fromCharCode((r&31)<<6|c2&63);
n+=2
}else{
c2=e.charCodeAt(n+1);
c3=e.charCodeAt(n+2);
t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);
n+=3
}
}
return t
}
}
export default Base64;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment