Skip to content

Commit 9329fe0

Browse files
committed
Don't crash the agent if prismarine-viewer can't bind its port
mineflayerViewer() creates an http server on 3000+count_id but doesn't expose it, so EADDRINUSE (e.g. something already on :3000, or two agents racing) becomes an uncaught exception that kills the agent process. Probe the port first and fall back to a warning + no viewer.
1 parent 07fbcbb commit 9329fe0

1 file changed

Lines changed: 26 additions & 3 deletions

File tree

src/agent/vision/browser_viewer.js

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,31 @@
11
import settings from '../settings.js';
2+
import http from 'http';
23
import prismarineViewer from 'prismarine-viewer';
34
const mineflayerViewer = prismarineViewer.mineflayer;
45

56
export function addBrowserViewer(bot, count_id) {
6-
if (settings.render_bot_view)
7-
mineflayerViewer(bot, { port: 3000+count_id, firstPerson: true, });
8-
}
7+
if (!settings.render_bot_view) return;
8+
const port = 3000 + count_id;
9+
10+
const fail = (err) => {
11+
console.warn(`prismarine-viewer failed on port ${port}: ${err.message}. Continuing without viewer.`);
12+
};
13+
14+
// mineflayerViewer creates its own http server and never exposes it, so a
15+
// listen failure (e.g. EADDRINUSE) surfaces as an unhandled 'error' event
16+
// that kills the process. Hook createServer just long enough to attach an
17+
// error listener to that server.
18+
const origCreateServer = http.createServer;
19+
http.createServer = (...args) => {
20+
const server = origCreateServer(...args);
21+
server.on('error', fail);
22+
return server;
23+
};
24+
try {
25+
mineflayerViewer(bot, { port, firstPerson: true });
26+
} catch (err) {
27+
fail(err);
28+
} finally {
29+
http.createServer = origCreateServer;
30+
}
31+
}

0 commit comments

Comments
 (0)