84 lines
1.8 KiB
JavaScript
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(
|
|
', ',
|
|
)}`,
|
|
);
|
|
});
|