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 "";
|
|
}
|
|
}
|