| // Copied from https://github.com/strophe/strophejs/blob/e06d027/src/polyfills.js#L149 |
| |
| // This code was written by Tyler Akins and has been placed in the |
| // public domain. It would be nice if you left this header intact. |
| // Base64 code from Tyler Akins -- http://rumkin.com |
| |
| /** |
| * Decodes a base64 string. |
| * @param {string} input The string to decode. |
| */ |
| var decodeBase64 = typeof atob == 'function' ? atob : function (input) { |
| var keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; |
| |
| var output = ''; |
| var chr1, chr2, chr3; |
| var enc1, enc2, enc3, enc4; |
| var i = 0; |
| // remove all characters that are not A-Z, a-z, 0-9, +, /, or = |
| input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ''); |
| do { |
| enc1 = keyStr.indexOf(input.charAt(i++)); |
| enc2 = keyStr.indexOf(input.charAt(i++)); |
| enc3 = keyStr.indexOf(input.charAt(i++)); |
| enc4 = keyStr.indexOf(input.charAt(i++)); |
| |
| chr1 = (enc1 << 2) | (enc2 >> 4); |
| chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); |
| chr3 = ((enc3 & 3) << 6) | enc4; |
| |
| output = output + String.fromCharCode(chr1); |
| |
| if (enc3 !== 64) { |
| output = output + String.fromCharCode(chr2); |
| } |
| if (enc4 !== 64) { |
| output = output + String.fromCharCode(chr3); |
| } |
| } while (i < input.length); |
| return output; |
| }; |
| |
| // Converts a string of base64 into a byte array. |
| // Throws error on invalid input. |
| function intArrayFromBase64(s) { |
| #if ENVIRONMENT_MAY_BE_NODE |
| if (typeof ENVIRONMENT_IS_NODE == 'boolean' && ENVIRONMENT_IS_NODE) { |
| var buf = Buffer.from(s, 'base64'); |
| return new Uint8Array(buf['buffer'], buf['byteOffset'], buf['byteLength']); |
| } |
| #endif |
| |
| try { |
| var decoded = decodeBase64(s); |
| var bytes = new Uint8Array(decoded.length); |
| for (var i = 0 ; i < decoded.length ; ++i) { |
| bytes[i] = decoded.charCodeAt(i); |
| } |
| return bytes; |
| } catch (_) { |
| throw new Error('Converting base64 string to bytes failed.'); |
| } |
| } |
| |
| // If filename is a base64 data URI, parses and returns data (Buffer on node, |
| // Uint8Array otherwise). If filename is not a base64 data URI, returns undefined. |
| function tryParseAsDataURI(filename) { |
| if (!isDataURI(filename)) { |
| return; |
| } |
| |
| return intArrayFromBase64(filename.slice(dataURIPrefix.length)); |
| } |