44 lines
1.5 KiB
TypeScript
44 lines
1.5 KiB
TypeScript
import { Handlers } from "$fresh/server.ts";
|
|
import { SERVER_STATE } from "../../state/serverState.ts";
|
|
import { getActivePlayers } from "../../util/players.ts";
|
|
|
|
export const handler: Handlers = {
|
|
GET(_req, _ctx) {
|
|
let listener: (e: CustomEvent) => void;
|
|
const body = new ReadableStream({
|
|
async start(controller){
|
|
console.log('did the thing')
|
|
if (SERVER_STATE.status !== 'running') return;
|
|
const players = await getActivePlayers();
|
|
|
|
const event = `event:players\ndata:${JSON.stringify(players)}\n\n`
|
|
|
|
controller.enqueue(event);
|
|
console.log('sent the thing')
|
|
|
|
listener = async (e: CustomEvent<string>) => {
|
|
console.log('message received')
|
|
if (e.detail.includes('joined the game') || e.detail.includes('lost connection')) {
|
|
console.log('connection change')
|
|
const players = await getActivePlayers();
|
|
const event = `event: players\ndata: ${JSON.stringify(players)}\n\n`
|
|
|
|
controller.enqueue(event);
|
|
}
|
|
}
|
|
|
|
globalThis.addEventListener('stdoutmsg' as any, listener);
|
|
console.log('listened the thing')
|
|
},
|
|
cancel() {
|
|
console.log('cancelled')
|
|
globalThis.removeEventListener('stdoutmsg' as any, listener);
|
|
}
|
|
})
|
|
|
|
return new Response(body.pipeThrough(new TextEncoderStream()), { headers: {
|
|
"Content-Type": "text/event-stream",
|
|
"cache-control": "no-cache"
|
|
}});
|
|
}
|
|
} |