diff options
author | timonson <54777088+timonson@users.noreply.github.com> | 2020-06-03 15:44:51 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-03 09:44:51 -0400 |
commit | 9a97e61b78fcec4ac9bb3da3e49afd0a2f849b9a (patch) | |
tree | 0a8b5faa4ef53e54509120a53deaa221c2d3d5e9 /std/encoding/base64url.ts | |
parent | a1915a0d4fd7d760c234e209967d842f851628d5 (diff) |
feat(std/encoding): add base64url module (#5976)
Diffstat (limited to 'std/encoding/base64url.ts')
-rw-r--r-- | std/encoding/base64url.ts | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/std/encoding/base64url.ts b/std/encoding/base64url.ts new file mode 100644 index 000000000..726ea2eb8 --- /dev/null +++ b/std/encoding/base64url.ts @@ -0,0 +1,45 @@ +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. + +import { + decode as convertBase64ToArrayBuffer, + encode as convertArrayBufferToBase64, +} from "./base64.ts"; + +/* + * Some variants allow or require omitting the padding '=' signs: + * https://en.wikipedia.org/wiki/Base64#URL_applications + */ +export function addPaddingToBase64url(base64url: string): string { + if (base64url.length % 4 === 2) return base64url + "=="; + if (base64url.length % 4 === 3) return base64url + "="; + if (base64url.length % 4 === 1) + throw new TypeError("Illegal base64url string!"); + return base64url; +} + +function convertBase64urlToBase64(base64url: string): string { + return addPaddingToBase64url(base64url) + .replace(/\-/g, "+") + .replace(/_/g, "/"); +} + +function convertBase64ToBase64url(base64: string): string { + return base64.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_"); +} + +/** + * Converts given data with base64url encoding. + * Removes paddings '='. + * @param data input to encode + */ +export function encode(data: string | ArrayBuffer): string { + return convertBase64ToBase64url(convertArrayBufferToBase64(data)); +} + +/** + * Converts given base64url encoded data back to original + * @param data input to decode + */ +export function decode(data: string): ArrayBuffer { + return convertBase64ToArrayBuffer(convertBase64urlToBase64(data)); +} |