var cwd = "/home" var stdout = "" var stdin = "" var disable_stdin = true var silent_stdin = false var processes = [] const RENDER_STDIN = 1 const SILENT_STDIN = 2 const DISABLE_STDIN = 3 const ENABLE_STDIN = 4 async function readLine(on_key=(key, ctrl, alt, shift, content, pos) => [content, pos]) { setStdinFlag(ENABLE_STDIN) let start_cursor_pos = getCursor() let pos = 0 let content = "" while (true) { let event = await pollStdinEvent() console.log(event) if (event.type == "key") { if (event.key == "Backspace") { if (content.length >= 1) { content = content.substring(0, content.length-1) trimTerminal(1) } } else if (event.key == "ArrowLeft") { let cursor = getCursor() if (cursor[0] > start_cursor_pos[0]) { setCursor(cursor[0]-1, cursor[1]) pos -= 1 } } else if (event.key == "ArrowRight") { let cursor = getCursor() if (cursor[0] < start_cursor_pos[0] + content.length) { setCursor(cursor[0]+1, cursor[1]) pos += 1 } } else { let res = on_key(event.key, event.ctrl, event.alt, event.shift, content, pos) terminal_text = terminal_text.slice(0, terminal_text.length - content.length) + res[0] updateTerminal() setCursor(start_cursor_pos[0] + res[1], start_cursor_pos[1]) content = res[0] pos = res[1] } continue } else if (event.type == "char") { if (event.char == "\n") break content = content.slice(0, pos) + event.char + content.slice(pos) pos += 1 } } setStdinFlag(DISABLE_STDIN) return content } async function pollStdinEvent() { let char = await readStdin() if (char == "\r") { let key = "" char = await readStdin() while (char != "\r") { key += char char = await readStdin() } let is_ctrl = key.charAt(0) == "1" let is_alt = key.charAt(1) == "1" let is_shift = key.charAt(2) == "1" key = key.slice(3) return { "type": "key", "ctrl": is_ctrl, "alt": is_alt, "shift": is_shift, "key": key } } return { "type": "char", "char": char } } async function readStdin() { while (stdin.length == 0) { await new Promise(resolve => setTimeout(resolve, 10)) } let was_stdin = stdin.charAt(0) stdin = stdin.slice(1) return was_stdin } async function writeStdout(content) { stdout += content writeTerminal(content) } function setStdinFlag(flag) { if (flag == 1) { silent_stdin = true } else if (flag == 2) { silent_stdin = false } else if (flag == 3) { disable_stdin = true } else if (flag == 4) { disable_stdin = false } } function executeCommand(args, read=readStdin, write=writeStdout) { let id = new Date().getMilliseconds().toString()+(Math.random()*100) let func_content = readFile(args[0]) if (func_content == null || !func_content.includes("function main")) return let func = new Function("args", "readStdin", "writeStdout", func_content+"\n\nreturn main(args)") let process = { "id": id, "name": args.join(" "), "promise": new Promise((resolve, reject) => { setTimeout(() => { try { resolve(func(args, read, write)) } catch (e) { console.log(e) reject(e) } }, 0) }).then(o => { processes = processes.filter(x => x.id != id) return o }) } processes.push(process) return process } function loadApp(name) { fetch("app/"+name+".js") .then(o => o.text()) .then(o => { writeFile("/app/"+name+".js", o) }) } function loadAppAndExecute(name) { fetch("app/"+name+".js") .then(o => o.text()) .then(o => { writeFile("/app/"+name+".js", o) }) } async function resetSystem() { clearFileSystem() createFolder("/") createFolder("/home") createFolder("/app") createFolder("/config") createFolder("/temp") createFolder("/etc") await installPackage("app/hello") await installPackage("app/posh") await installPackage("app/ppm") await installPackage("app/putils") await installPackage("app/reset") await installPackage("app/vget") await installPackage("app/woman") } if (Object.keys(fs_mapping).length == 0) { resetSystem() } executeCommand(["/app/posh.js"]) var start_date = new Date()