Files
blb-throne-of-the-bone-king/socket/server.mjs
T

84 lines
1.8 KiB
JavaScript

import 'dotenv/config';
import { createServer } from 'node:http';
import { Server } from 'socket.io';
const defaultWebOrigin = 'http://127.0.0.1:5173';
const host = process.env.TOOLKIT_SOCKET_HOST ?? '127.0.0.1';
const port = Number.parseInt(process.env.TOOLKIT_SOCKET_PORT ?? '5174', 10);
const allowedOrigins = (
process.env.TOOLKIT_SOCKET_CORS_ORIGIN ?? defaultWebOrigin
)
.split(',')
.map(origin => origin.trim())
.filter(Boolean);
if (Number.isNaN(port)) {
throw new Error('TOOLKIT_SOCKET_PORT must be a valid number.');
}
const httpServer = createServer((request, response) => {
if (request.url === '/health') {
response.writeHead(200, {
'Content-Type': 'application/json',
});
response.end(
JSON.stringify({
ok: true,
service: 'blb-toolkit-socket',
}),
);
return;
}
response.writeHead(404, {
'Content-Type': 'application/json',
});
response.end(
JSON.stringify({
ok: false,
service: 'blb-toolkit-socket',
}),
);
});
const io = new Server(httpServer, {
cors: {
methods: ['GET', 'POST'],
origin: allowedOrigins,
},
});
io.on('connection', socket => {
socket.emit('toolkit:ready', {
connectedAt: new Date().toISOString(),
socketId: socket.id,
});
socket.on('toolkit:event', payload => {
socket.broadcast.emit('toolkit:event', payload);
});
});
function closeServer(signal) {
console.log(`[toolkit-socket] received ${signal}; shutting down`);
io.close(() => {
httpServer.close(() => {
process.exit(0);
});
});
}
process.on('SIGINT', () => closeServer('SIGINT'));
process.on('SIGTERM', () => closeServer('SIGTERM'));
httpServer.listen(port, host, () => {
console.log(
`[toolkit-socket] listening at http://${host}:${port} with CORS ${allowedOrigins.join(
', ',
)}`,
);
});