web: subscribe console on route changes

This commit is contained in:
2026-08-02 03:43:53 +09:00
parent e5f3c20f64
commit 606cd5fa31
3 changed files with 38 additions and 18 deletions
@@ -140,11 +140,12 @@
let reloadToken = $state(0);
type ConsoleTarget = {
workspaceId: string;
runtimeId: string;
workerId: string;
};
const consoleTarget = $derived({ runtimeId, workerId });
const consoleTarget = $derived({ workspaceId, runtimeId, workerId });
const lines = $derived(consoleProjection.lines);
const timelineLayout = $derived(
@@ -179,17 +180,20 @@
return response.json() as Promise<T>;
}
async function loadWorker(target: ConsoleTarget) {
async function loadWorker(target: ConsoleTarget, token: number) {
workerError = null;
try {
const payload = await getJson<Worker>(
workerApiPath(
workspaceApiPath(
target.workspaceId,
`/runtimes/${encodeURIComponent(target.runtimeId)}/workers/${encodeURIComponent(target.workerId)}`,
),
);
if (token !== reloadToken) return;
worker = payload;
liveWorkerState = payload.state;
} catch (error) {
if (token !== reloadToken) return;
workerError =
error instanceof Error ? error.message : String(error);
worker = null;
@@ -197,10 +201,6 @@
}
}
async function loadConsoleData(target: ConsoleTarget) {
if (!worker) await loadWorker(target);
}
function advanceReloadToken(): number {
nextReloadToken += 1;
reloadToken = nextReloadToken;
@@ -515,7 +515,7 @@
return;
}
protocolState = "connecting";
const subscription = workspaceMultiplexer(workspaceId).subscribe(
const subscription = workspaceMultiplexer(target.workspaceId).subscribe(
{
topic: "worker_protocol",
worker_id: target.workerId,
@@ -1083,11 +1083,16 @@
$effect(() => {
const target = consoleTarget;
const targetWorker = data.worker;
const targetWorkerError = data.workerError;
resetObservedEvents();
liveWorkerState = null;
worker = targetWorker;
workerError = targetWorkerError;
liveWorkerState = targetWorker?.state ?? null;
streamDiagnostics = [];
advanceReloadToken();
void loadConsoleData(target);
protocolState = "connecting";
const token = advanceReloadToken();
if (!targetWorker) void loadWorker(target, token);
});
$effect(() => connectProtocolTransport(worker, reloadToken, consoleTarget));