78 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import * as zstd from "zstddec";
 | |
| import { KeyEvent, controlKeyFromJSON, ControlKey } from "./message";
 | |
| import { KEY_MAP, LANGS } from "./gen_js_from_hbb";
 | |
| 
 | |
| let decompressor: zstd.ZSTDDecoder;
 | |
| 
 | |
| export async function initZstd() {
 | |
|   const tmp = new zstd.ZSTDDecoder();
 | |
|   await tmp.init();
 | |
|   console.log("zstd ready");
 | |
|   decompressor = tmp;
 | |
| }
 | |
| 
 | |
| export async function decompress(compressedArray: Uint8Array) {
 | |
|   const MAX = 1024 * 1024 * 64;
 | |
|   const MIN = 1024 * 1024;
 | |
|   let n = 30 * compressedArray.length;
 | |
|   if (n > MAX) {
 | |
|     n = MAX;
 | |
|   }
 | |
|   if (n < MIN) {
 | |
|     n = MIN;
 | |
|   }
 | |
|   try {
 | |
|     if (!decompressor) {
 | |
|       await initZstd();
 | |
|     }
 | |
|     return decompressor.decode(compressedArray, n);
 | |
|   } catch (e) {
 | |
|     console.error("decompress failed: " + e);
 | |
|     return undefined;
 | |
|   }
 | |
| }
 | |
| 
 | |
| const LANG = getLang();
 | |
| 
 | |
| export function translate(locale: string, text: string): string {
 | |
|   const lang = LANG || locale.substring(locale.length - 2).toLowerCase();
 | |
|   let en = LANGS.en as any;
 | |
|   let dict = (LANGS as any)[lang];
 | |
|   if (!dict) dict = en;
 | |
|   let res = dict[text];
 | |
|   if (!res && lang != "en") res = en[text];
 | |
|   return res || text;
 | |
| }
 | |
| 
 | |
| const zCode = "z".charCodeAt(0);
 | |
| const aCode = "a".charCodeAt(0);
 | |
| 
 | |
| export function mapKey(name: string, isDesktop: Boolean) {
 | |
|   const tmp = KEY_MAP[name] || name;
 | |
|   if (tmp.length == 1) {
 | |
|     const chr = tmp.charCodeAt(0);
 | |
|     if (!isDesktop && (chr > zCode || chr < aCode))
 | |
|       return KeyEvent.fromPartial({ unicode: chr });
 | |
|     else return KeyEvent.fromPartial({ chr });
 | |
|   }
 | |
|   const control_key = controlKeyFromJSON(tmp);
 | |
|   if (control_key == ControlKey.UNRECOGNIZED) {
 | |
|     console.error("Unknown control key " + tmp);
 | |
|   }
 | |
|   return KeyEvent.fromPartial({ control_key });
 | |
| }
 | |
| 
 | |
| export async function sleep(ms: number) {
 | |
|   await new Promise((r) => setTimeout(r, ms));
 | |
| }
 | |
| 
 | |
| function getLang(): string {
 | |
|   try {
 | |
|     const queryString = window.location.search;
 | |
|     const urlParams = new URLSearchParams(queryString);
 | |
|     return urlParams.get("lang") || "";
 | |
|   } catch (e) {
 | |
|     return "";
 | |
|   }
 | |
| }
 |