var emu = require("./js/emulate"); var ipc = require("./js/ipc"); var shell = require("./js/shell"); var udev = require("./udev"); var pathlib = require("path"); var fs = require("fs"); var mountdir = "/tmp/emuboy.mnt" process.on("unhandledRejection", evt => { console.trace(evt); process.exit(1); }); var rompath = mountdir+"/roms"; var games = []; function updateGames() { if (driveMounted) { var rx = /\.(gba|gbc|nds)$/; fs.readdir(rompath, (err, list) => { if (err) throw err; games = list.filter(x => rx.test(x)); ipc.sendGameList(games); }); } else { games = []; ipc.sendGameList(games); } } var driveMounted = false; async function onblock(evt) { if (evt.DEVTYPE !== "partition") return; if (evt.PARTN !== "1") return; if (evt.ID_BUS !== "usb") return; if (!evt.ACTION || evt.ACTION === "add") { await shell.safe("mkdir", "-p", mountdir); if (await shell("mountpoint", "-q", mountdir) === 0) await shell.safe("sudo", "umount", mountdir); await shell.safe( "sudo", "mount", "-o", "uid="+process.env.USER, evt.DEVNAME, mountdir); await shell.safe("mkdir", "-p", rompath); driveMounted = true; updateGames(); } else if (evt.ACTION === "remove") { driveMounted = false; console.log("Unmounted drive", evt.DEVNAME); updateGames(); } } udev.init(); udev.monitor("block", onblock); udev.list("block", x => x.forEach(onblock)); ipc.init(8085, () => { console.log("Server started"); ipc.on("run", async function(name) { try { ipc.sendGameStart(); await emu.run(pathlib.join(rompath, name)); } catch (err) { ipc.error(err.toString()); console.trace(err); } ipc.sendGameStopped(); }); ipc.on("connection", () => { updateGames(); }); });