Skip to content

Commit c7c4549

Browse files
committed
fix(pi-bridge): shut down web server on session end
The web UI ChatController creates its own MeshStore with TCP servers and sockets that were never cleaned up, leaking libuv handles that kept the event loop alive and caused pi -p to hang indefinitely. Store the WebServerHandle from tryStartWebServer() and close the WebSocket server, HTTP server, and ChatController on session_shutdown. The underlying MeshStore.shutdown() now unrefs all handles at init time and before destroying them, so the event loop can exit cleanly.
1 parent c5aa837 commit c7c4549

1 file changed

Lines changed: 10 additions & 3 deletions

File tree

src/bridges/pi/index.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,15 @@ import {
1818
ensureRegistered,
1919
formatDeliveryEvent,
2020
} from "../../core/index.js";
21-
import { tryStartWebServer } from "../user/web/server.js";
21+
import { tryStartWebServer, type WebServerHandle } from "../user/web/server.js";
2222
import { nanoid } from "../../core/nanoid.js";
2323

2424
export default function (pi: ExtensionAPI) {
2525
const store = new MeshStore();
2626
const tool = new CommsTool(store);
2727

2828
let agentId: string | undefined;
29+
let webHandle: WebServerHandle | undefined;
2930

3031
// Incoming messages arrive via TCP mesh — push immediately
3132
store.onDelivery = (_targetId: string, event) => {
@@ -40,8 +41,8 @@ export default function (pi: ExtensionAPI) {
4041
pi.on("session_start", async (_event, ctx) => {
4142
await store.init();
4243

43-
// Auto-start web UI (first bridge to bind port 3000 wins)
44-
await tryStartWebServer();
44+
// Auto-start web UI on a dynamic port
45+
webHandle = tryStartWebServer();
4546

4647
const reg = await ensureRegistered({
4748
store,
@@ -61,6 +62,12 @@ export default function (pi: ExtensionAPI) {
6162
await store.setAgentOffline(agentId);
6263
}
6364
await store.shutdown();
65+
if (webHandle) {
66+
webHandle.wss.close();
67+
webHandle.server.close();
68+
await webHandle.controller.shutdown();
69+
webHandle = undefined;
70+
}
6471
});
6572

6673
// -----------------------------------------------------------------------

0 commit comments

Comments
 (0)