X-Git-Url: http://git.squeep.com/?p=squeep-base64url;a=blobdiff_plain;f=lib%2Fbase64url.js;fp=lib%2Fbase64url.js;h=9a494c01f334de6c5783944a22a3c16c87438513;hp=0000000000000000000000000000000000000000;hb=3a5f50494917a415f5fb3d43f3b0cacb961186f9;hpb=f1afc4fcf3f63ff8bfb6f65aee24c64fa5359502 diff --git a/lib/base64url.js b/lib/base64url.js new file mode 100644 index 0000000..9a494c0 --- /dev/null +++ b/lib/base64url.js @@ -0,0 +1,50 @@ +'use strict'; + +const reEqual = /=/g; +const rePlus = /\+/g; +const reSlash = /\//g; +const reDash = /-/g; +const reUnder = /_/g; +const blockSize = 4; + +/** + * Convert Base64 to Base64URL. + * @param {String} input + * @returns {String} + */ +const base64ToBase64URL = (input) => { + return input + .replace(reEqual, '') + .replace(rePlus, '-') + .replace(reSlash, '_'); +}; + +/** + * Convert Base64URL to normal Base64. + * @param {String} input + * @returns {String} + */ +const base64URLToBase64 = (input) => { + return base64RePad(input) + .replace(reDash, '+') + .replace(reUnder, '/'); +}; + +/** + * Add any missing trailing padding which may have been removed from Base64URL encoding. + * @param {String} input + */ +const base64RePad = (input) => { + const lastBlockSize = input.length % blockSize; + if (lastBlockSize) { + const missing = blockSize - lastBlockSize; + return input + '='.repeat(missing); + } + return input; +}; + +module.exports = { + base64ToBase64URL, + base64URLToBase64, + base64RePad, +}