You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.6 KiB
62 lines
1.6 KiB
"use strict"; |
|
|
|
/** |
|
* btoa() as defined by the HTML and Infra specs, which mostly just references |
|
* RFC 4648. |
|
*/ |
|
function btoa(s) { |
|
if (arguments.length === 0) { |
|
throw new TypeError("1 argument required, but only 0 present."); |
|
} |
|
|
|
let i; |
|
// String conversion as required by Web IDL. |
|
s = `${s}`; |
|
// "The btoa() method must throw an "InvalidCharacterError" DOMException if |
|
// data contains any character whose code point is greater than U+00FF." |
|
for (i = 0; i < s.length; i++) { |
|
if (s.charCodeAt(i) > 255) { |
|
return null; |
|
} |
|
} |
|
let out = ""; |
|
for (i = 0; i < s.length; i += 3) { |
|
const groupsOfSix = [undefined, undefined, undefined, undefined]; |
|
groupsOfSix[0] = s.charCodeAt(i) >> 2; |
|
groupsOfSix[1] = (s.charCodeAt(i) & 0x03) << 4; |
|
if (s.length > i + 1) { |
|
groupsOfSix[1] |= s.charCodeAt(i + 1) >> 4; |
|
groupsOfSix[2] = (s.charCodeAt(i + 1) & 0x0f) << 2; |
|
} |
|
if (s.length > i + 2) { |
|
groupsOfSix[2] |= s.charCodeAt(i + 2) >> 6; |
|
groupsOfSix[3] = s.charCodeAt(i + 2) & 0x3f; |
|
} |
|
for (let j = 0; j < groupsOfSix.length; j++) { |
|
if (typeof groupsOfSix[j] === "undefined") { |
|
out += "="; |
|
} else { |
|
out += btoaLookup(groupsOfSix[j]); |
|
} |
|
} |
|
} |
|
return out; |
|
} |
|
|
|
/** |
|
* Lookup table for btoa(), which converts a six-bit number into the |
|
* corresponding ASCII character. |
|
*/ |
|
const keystr = |
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; |
|
|
|
function btoaLookup(index) { |
|
if (index >= 0 && index < 64) { |
|
return keystr[index]; |
|
} |
|
|
|
// Throw INVALID_CHARACTER_ERR exception here -- won't be hit in the tests. |
|
return undefined; |
|
} |
|
|
|
module.exports = btoa;
|
|
|