1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-28 10:09:20 -05:00
denoland-deno/ext/web/05_base64.js
2022-01-11 17:31:13 +01:00

75 lines
1.9 KiB
JavaScript

// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
// @ts-check
/// <reference path="../../core/internal.d.ts" />
/// <reference path="../webidl/internal.d.ts" />
/// <reference path="../web/internal.d.ts" />
/// <reference lib="esnext" />
"use strict";
((window) => {
const webidl = window.__bootstrap.webidl;
const {
forgivingBase64Encode,
forgivingBase64Decode,
} = window.__bootstrap.infra;
const { DOMException } = window.__bootstrap.domException;
const {
ArrayPrototypeMap,
StringPrototypeCharCodeAt,
ArrayPrototypeJoin,
StringFromCharCode,
TypedArrayFrom,
Uint8Array,
} = window.__bootstrap.primordials;
/**
* @param {string} data
* @returns {string}
*/
function atob(data) {
const prefix = "Failed to execute 'atob'";
webidl.requiredArguments(arguments.length, 1, { prefix });
data = webidl.converters.DOMString(data, {
prefix,
context: "Argument 1",
});
const uint8Array = forgivingBase64Decode(data);
const result = ArrayPrototypeMap(
[...uint8Array],
(byte) => StringFromCharCode(byte),
);
return ArrayPrototypeJoin(result, "");
}
/**
* @param {string} data
* @returns {string}
*/
function btoa(data) {
const prefix = "Failed to execute 'btoa'";
webidl.requiredArguments(arguments.length, 1, { prefix });
data = webidl.converters.DOMString(data, {
prefix,
context: "Argument 1",
});
const byteArray = ArrayPrototypeMap([...data], (char) => {
const charCode = StringPrototypeCharCodeAt(char, 0);
if (charCode > 0xff) {
throw new DOMException(
"The string to be encoded contains characters outside of the Latin1 range.",
"InvalidCharacterError",
);
}
return charCode;
});
return forgivingBase64Encode(TypedArrayFrom(Uint8Array, byteArray));
}
window.__bootstrap.base64 = {
atob,
btoa,
};
})(globalThis);