stockfish-api / main.ts
T1ckbase
first commit
0d3b73e
const command = new Deno.Command(Deno.build.os === 'windows' ? './stockfish-windows-x86-64-avx2' : './stockfish-ubuntu-x86-64', {
stdin: 'piped',
stdout: 'piped',
});
Deno.serve({ port: 7860 }, (req) => {
if (req.headers.get('upgrade') != 'websocket') return new Response(Deno.env.get('SPACE_HOST'));
const { socket, response } = Deno.upgradeWebSocket(req);
const stockfish = command.spawn();
stockfish.status.then((status) => {
console.log(`Stockfish process exited with code: ${status.code}`);
if (socket.readyState === WebSocket.OPEN) {
socket.close(1011, `Stockfish process terminated with exit code ${status.code}`);
}
});
const stockfishWriter = stockfish.stdin.getWriter();
const stockfishReader = stockfish.stdout.pipeThrough(new TextDecoderStream()).getReader();
socket.addEventListener('open', async () => {
console.log('a client connected!');
try {
while (true) {
const { value, done } = await stockfishReader.read();
if (done) break;
socket.send(value);
console.log(value);
}
} catch (error) {
console.error('Error reading from stockfish stdout:', error);
if (socket.readyState === WebSocket.OPEN) socket.close();
}
});
socket.addEventListener('message', async (event) => {
const message = event.data;
await stockfishWriter.write(new TextEncoder().encode(message + '\n'));
});
socket.addEventListener('close', () => {
console.log('A client disconnected, cleaning up Stockfish process.');
try {
stockfish.kill();
} catch (_) {
console.log('Could not kill Stockfish, it likely already exited.');
}
});
return response;
});