--- /dev/null
+'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,
+}