mcgrizz/routes/api/manage.ts

51 lines
1.5 KiB
TypeScript

import { Handlers } from "$fresh/server.ts";
import { SERVER_STATE } from "../../state/serverState.ts";
export enum ManageAction {
start = "start",
stop = "stop",
restart = "restart",
}
export const handler: Handlers = {
async POST(req) {
const body: ManageAction & string = await req.text() as ManageAction;
switch (body) {
case ManageAction.start:
SERVER_STATE.startMCServer();
return new Response("started");
case ManageAction.stop:
SERVER_STATE.gracefullyStopMCServer();
return new Response("stopped");
case ManageAction.restart:
SERVER_STATE.restartMCServer();
return new Response("restarted");
default:
SERVER_STATE.sendStdIn(body);
return new Response("action done");
}
},
GET(_req, _ctx) {
let listener: (e: CustomEvent) => void;
const body = new ReadableStream({
async start(controller){
const event = `event: status\ndata: ${SERVER_STATE.status}\n\n`
controller.enqueue(event);
listener = (e) => {
const event = `event: status\ndata: ${e.detail}\n\n`
controller.enqueue(event);
};
globalThis.addEventListener('serverstatuschange' as any, listener)
},
cancel() {
globalThis.removeEventListener('serverstatuschange' as any, listener);
}
})
return new Response(body.pipeThrough(new TextEncoderStream()), { headers: {
"Content-Type": "text/event-stream",
"cache-control": "no-cache"
}});
}
};