tangled
alpha
login
or
join now
pds.ls
/
pdsls
398
fork
atom
atmosphere explorer
pds.ls
tool
typescript
atproto
398
fork
atom
overview
issues
1
pulls
pipelines
show websocket close event
authored by
bas.sh
and committed by
Tangled
2 weeks ago
827e3507
7f0903b2
+33
2 changed files
expand all
collapse all
unified
split
src
utils
websocket.ts
views
stream
index.tsx
+20
src/utils/websocket.ts
···
1
1
+
const _websocketCloseReasons = {
2
2
+
1000: "Normal Closure",
3
3
+
1001: "Going Away",
4
4
+
1002: "Protocol Error",
5
5
+
1003: "Unsupported Data",
6
6
+
1005: "No Status Received",
7
7
+
1006: "Abnormal Closure",
8
8
+
1007: "Invalid frame payload data",
9
9
+
1008: "Policy Violation",
10
10
+
1009: "Message too big",
11
11
+
1010: "Missing Extension",
12
12
+
1011: "Internal Error",
13
13
+
1012: "Service Restart",
14
14
+
1013: "Try Again Later",
15
15
+
1014: "Bad Gateway",
16
16
+
1015: "TLS Handshake",
17
17
+
} as const;
18
18
+
19
19
+
export const websocketCloseReasons = _websocketCloseReasons as typeof _websocketCloseReasons &
20
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
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
187
+
const onWebsocketClose = (event: CloseEvent) => {
188
188
+
const code = event.code.toString();
189
189
+
if (code === "1000" || code === "1005") return;
190
190
+
191
191
+
setNotice(`Connection closed: ${websocketCloseReasons[code] ?? "Unknown reason"}`);
192
192
+
disconnect();
193
193
+
};
194
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
263
+
socket.addEventListener("close", onWebsocketClose);
254
264
socket.addEventListener("error", () => {
265
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
276
+
firehose.ws.addEventListener("close", onWebsocketClose);
265
277
firehose.on("error", (err) => {
278
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}`);