39 lines
		
	
	
		
			897 B
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			897 B
		
	
	
	
		
			JavaScript
		
	
	
	
| // @ts-check
 | |
| 
 | |
| /**
 | |
|  * Convert a `Uint8Array` to a URL-safe base64 string.
 | |
|  * @param {Uint8Array} bytes
 | |
|  * @returns {string}
 | |
|  */
 | |
| export const stringify = (bytes) => {
 | |
|   const string = String.fromCharCode(...bytes);
 | |
|   const base64 = btoa(string);
 | |
|   return base64
 | |
|     .replaceAll("+", "-")
 | |
|     .replaceAll("/", "_")
 | |
|     .replaceAll("=", "");
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Convert a URL-safe base64 string to a `Uint8Array`.
 | |
|  * Returns `null` if the string is invalid.
 | |
|  * @param {string} text
 | |
|  * @returns {null | Uint8Array}
 | |
|  */
 | |
| export const parse = (text) => {
 | |
|   const normalizedText = text
 | |
|     .replaceAll("-", "+")
 | |
|     .replaceAll("_", "/")
 | |
|     .replaceAll(" ", "+");
 | |
|   try {
 | |
|     const string = atob(normalizedText);
 | |
|     const bytes = new Uint8Array(string.length);
 | |
|     for (let i = 0; i < string.length; i++) {
 | |
|       bytes[i] = string.charCodeAt(i);
 | |
|     }
 | |
|     return bytes;
 | |
|   } catch (_err) {
 | |
|     return null;
 | |
|   }
 | |
| };
 |