@better-auth/utils
Version:
A collection of utilities for better-auth
78 lines (76 loc) • 2.3 kB
JavaScript
function getAlphabet(urlSafe) {
return urlSafe ? "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
}
function base64Encode(data, alphabet, padding) {
let result = "";
let buffer = 0;
let shift = 0;
for (const byte of data) {
buffer = buffer << 8 | byte;
shift += 8;
while (shift >= 6) {
shift -= 6;
result += alphabet[buffer >> shift & 63];
}
}
if (shift > 0) {
result += alphabet[buffer << 6 - shift & 63];
}
if (padding) {
const padCount = (4 - result.length % 4) % 4;
result += "=".repeat(padCount);
}
return result;
}
function base64Decode(data, alphabet) {
const decodeMap = /* @__PURE__ */ new Map();
for (let i = 0; i < alphabet.length; i++) {
decodeMap.set(alphabet[i], i);
}
const result = [];
let buffer = 0;
let bitsCollected = 0;
for (const char of data) {
if (char === "=")
break;
const value = decodeMap.get(char);
if (value === void 0) {
throw new Error(`Invalid Base64 character: ${char}`);
}
buffer = buffer << 6 | value;
bitsCollected += 6;
if (bitsCollected >= 8) {
bitsCollected -= 8;
result.push(buffer >> bitsCollected & 255);
}
}
return Uint8Array.from(result);
}
const base64 = {
encode(data, options = {}) {
const alphabet = getAlphabet(false);
const buffer = typeof data === "string" ? new TextEncoder().encode(data) : new Uint8Array(data);
return base64Encode(buffer, alphabet, options.padding ?? true);
},
decode(data) {
if (typeof data !== "string") {
data = new TextDecoder().decode(data);
}
const urlSafe = data.includes("-") || data.includes("_");
const alphabet = getAlphabet(urlSafe);
return base64Decode(data, alphabet);
}
};
const base64Url = {
encode(data, options = {}) {
const alphabet = getAlphabet(true);
const buffer = typeof data === "string" ? new TextEncoder().encode(data) : new Uint8Array(data);
return base64Encode(buffer, alphabet, options.padding ?? true);
},
decode(data) {
const urlSafe = data.includes("-") || data.includes("_");
const alphabet = getAlphabet(urlSafe);
return base64Decode(data, alphabet);
}
};
export { base64, base64Url };