it's alive

This commit is contained in:
Chris Wanstrath 2025-09-20 19:16:45 -07:00
parent 4c65c6f4ed
commit 24ce536873
3 changed files with 44 additions and 5 deletions

3
nose/bin/echo.ts Normal file
View File

@ -0,0 +1,3 @@
export default function (...args: string[]): string {
return args.join(" ")
}

View File

@ -54,12 +54,12 @@ app.on("GET", ["/js/:path{.+}", "/shared/:path{.+}"], async c => {
const wsConnections: any[] = []
app.get("/ws", upgradeWebSocket((c) => {
app.get("/ws", upgradeWebSocket(async c => {
return {
onOpen(_e, ws) {
wsConnections.push(ws)
},
onMessage(event, ws) {
async onMessage(event, ws) {
let data: Message | undefined
try {
@ -72,7 +72,7 @@ app.get("/ws", upgradeWebSocket((c) => {
if (!data) return
const result = runCommand(data.data as string)
const result = await runCommand(data.data as string)
ws.send(JSON.stringify({ id: data.id, type: "output", data: result }))
},
onClose: () => console.log('Connection closed'),

View File

@ -2,8 +2,44 @@
// runs commands and such.
import type { CommandResult } from "./shared/types"
import { join, resolve } from "path"
import { NOSE_BIN } from "./config"
import { isFile } from "./utils"
export function runCommand(input: string): CommandResult {
return { status: "ok", output: "command: " + input }
export async function runCommand(input: string): Promise<CommandResult> {
const [cmd = "", ...args] = input.split(" ")
if (!commandExists(cmd)) {
return { status: "error", output: `${cmd} not found` }
}
let status: "ok" | "error" = "ok"
let output = ""
try {
[status, output] = await exec(cmd, args)
} catch (err) {
status = "error"
output = err instanceof Error ? err.message : String(err)
}
console.log("cmd", cmd)
console.log("args", args)
return { status, output }
}
function commandExists(cmd: string): boolean {
return isFile(join(NOSE_BIN, cmd + ".ts"))
}
async function exec(cmd: string, args: string[]): Promise<["ok" | "error", string]> {
const path = join(NOSE_BIN, cmd + ".ts")
const module = await import(path + "?t+" + Date.now())
if (!module || !module.default) {
return ["error", `${cmd} has no default export`]
}
return ["ok", await module.default(...args)]
}