46 lines
1.4 KiB
TypeScript
46 lines
1.4 KiB
TypeScript
////
|
|
// Dispatch client->server Messages received via WebSocket
|
|
|
|
import { basename } from "path"
|
|
import type { Message, InputMessage, SaveFileMessage } from "./shared/types"
|
|
import { runCommand } from "./shell"
|
|
import { send } from "./websocket"
|
|
import { setState } from "./state"
|
|
|
|
export async function dispatchMessage(ws: any, msg: Message) {
|
|
// console.log("<- receive", msg)
|
|
switch (msg.type) {
|
|
case "input":
|
|
await inputMessage(ws, msg); break
|
|
|
|
case "save-file":
|
|
await saveFileMessage(ws, msg); break
|
|
|
|
case "session:update":
|
|
for (const key of Object.keys(msg.data))
|
|
setState(key, msg.data[key]);
|
|
break
|
|
|
|
default:
|
|
send(ws, { type: "error", data: `unknown message: ${msg.type}` })
|
|
}
|
|
}
|
|
|
|
async function inputMessage(ws: any, msg: InputMessage) {
|
|
const result = await runCommand(msg.session, msg.id, msg.data as string, ws)
|
|
|
|
if (typeof result.output === "object" && "game" in result.output) {
|
|
send(ws, { id: msg.id, type: "game:start", data: result.output.game })
|
|
} else {
|
|
send(ws, { id: msg.id, type: "output", data: result })
|
|
}
|
|
}
|
|
|
|
async function saveFileMessage(ws: any, msg: SaveFileMessage) {
|
|
if (msg.id && typeof msg.data === "string") {
|
|
await Bun.write(msg.id.replace("..", ""), msg.data, { createPath: true })
|
|
send(ws, { type: "output", data: { status: "ok", output: `saved ${basename(msg.id)}` } })
|
|
}
|
|
}
|
|
|