/** * @param {string} text * @returns {ArrayBufferLike} */ export function b64_decode(text) { const d = atob(text); const u8 = new Uint8Array(d.length); for (let i = 0; i < d.length; i++) { u8[i] = d.charCodeAt(i); } return u8.buffer; } /** * @param {ArrayBuffer} buffer * @returns {string} */ export function b64_encode(buffer) { if (globalThis.Buffer) { return Buffer.from(buffer).toString('base64'); } const little_endian = new Uint8Array(new Uint16Array([1]).buffer)[0] > 0; // The Uint16Array(Uint8Array(...)) ensures the code points are padded with 0's return btoa( new TextDecoder(little_endian ? 'utf-16le' : 'utf-16be').decode( new Uint16Array(new Uint8Array(buffer)) ) ); }