diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2021-08-11 12:27:05 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-11 12:27:05 +0200 |
commit | a0285e2eb88f6254f6494b0ecd1878db3a3b2a58 (patch) | |
tree | 90671b004537e20f9493fd3277ffd21d30b39a0e /ext/web/05_base64.js | |
parent | 3a6994115176781b3a93d70794b1b81bc95e42b4 (diff) |
Rename extensions/ directory to ext/ (#11643)
Diffstat (limited to 'ext/web/05_base64.js')
-rw-r--r-- | ext/web/05_base64.js | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/ext/web/05_base64.js b/ext/web/05_base64.js new file mode 100644 index 000000000..9c9c23b0f --- /dev/null +++ b/ext/web/05_base64.js @@ -0,0 +1,73 @@ +// Copyright 2018-2021 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) { + data = webidl.converters.DOMString(data, { + prefix: "Failed to execute 'atob'", + 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); |