atmosphere explorer pds.ls
tool typescript atproto

show websocket close event

authored by bas.sh and committed by

Tangled 827e3507 7f0903b2

+33
+20
src/utils/websocket.ts
··· 1 + const _websocketCloseReasons = { 2 + 1000: "Normal Closure", 3 + 1001: "Going Away", 4 + 1002: "Protocol Error", 5 + 1003: "Unsupported Data", 6 + 1005: "No Status Received", 7 + 1006: "Abnormal Closure", 8 + 1007: "Invalid frame payload data", 9 + 1008: "Policy Violation", 10 + 1009: "Message too big", 11 + 1010: "Missing Extension", 12 + 1011: "Internal Error", 13 + 1012: "Service Restart", 14 + 1013: "Try Again Later", 15 + 1014: "Bad Gateway", 16 + 1015: "TLS Handshake", 17 + } as const; 18 + 19 + export const websocketCloseReasons = _websocketCloseReasons as typeof _websocketCloseReasons & 20 + Record<string, string>;
+13
src/views/stream/index.tsx
··· 7 7 import { JSONValue } from "../../components/json"; 8 8 import { TextInput } from "../../components/text-input"; 9 9 import { addToClipboard } from "../../utils/copy"; 10 + import { websocketCloseReasons } from "../../utils/websocket"; 10 11 import { getStreamType, STREAM_CONFIGS, STREAM_TYPES, StreamType } from "./config"; 11 12 import { StreamStats, StreamStatsPanel } from "./stats"; 12 13 ··· 183 184 setStats((prev) => ({ ...prev, eventsPerSecond: 0 })); 184 185 }; 185 186 187 + const onWebsocketClose = (event: CloseEvent) => { 188 + const code = event.code.toString(); 189 + if (code === "1000" || code === "1005") return; 190 + 191 + setNotice(`Connection closed: ${websocketCloseReasons[code] ?? "Unknown reason"}`); 192 + disconnect(); 193 + }; 194 + 186 195 const connectStream = async (formData: FormData) => { 187 196 setNotice(""); 188 197 if (connected()) { ··· 251 260 if (!isFilteredEvent || streamType !== "jetstream" || searchParams.allEvents === "on") 252 261 addRecord(rec); 253 262 }); 263 + socket.addEventListener("close", onWebsocketClose); 254 264 socket.addEventListener("error", () => { 265 + socket.removeEventListener("close", onWebsocketClose); 255 266 setNotice("Connection error"); 256 267 disconnect(); 257 268 }); ··· 262 273 cursor: cursor, 263 274 autoReconnect: false, 264 275 }); 276 + firehose.ws.addEventListener("close", onWebsocketClose); 265 277 firehose.on("error", (err) => { 278 + firehose.ws.removeEventListener("close", onWebsocketClose); 266 279 console.error(err); 267 280 const message = err instanceof Error ? err.message : "Unknown error"; 268 281 setNotice(`Connection error: ${message}`);