Skip to content

Commit f661efc

Browse files
chdeskurdsinghvi
authored andcommitted
feat: keep local development alive (#2672)
1 parent 174b575 commit f661efc

File tree

1 file changed

+22
-12
lines changed

1 file changed

+22
-12
lines changed

packages/fern-docs/bundle/src/components/websocket-refresh.tsx

+22-12
Original file line numberDiff line numberDiff line change
@@ -7,33 +7,38 @@ import { isLocal } from "@/server/isLocal";
77
export function WebSocketRefresh() {
88
useEffect(() => {
99
let ws: WebSocket | null = null;
10-
let timeout: NodeJS.Timeout | null = null;
10+
let connectionTimeout: NodeJS.Timeout | null = null;
1111

1212
const setupWebSocket = async (): Promise<void> => {
1313
if (!isLocal()) {
1414
console.log("Not in local mode, skipping WebSocket connection");
1515
return;
1616
}
1717

18-
// Ensure we're in a browser environment
1918
if (typeof window === "undefined") {
2019
console.log(
2120
"Not in browser environment, skipping WebSocket connection"
2221
);
2322
return;
2423
}
2524

26-
// Ensure WebSocket is available
2725
if (typeof WebSocket === "undefined") {
2826
console.error("WebSocket is not available in this environment");
2927
return;
3028
}
3129

32-
const response = await fetch("/api/fern-docs/env-local");
33-
if (!response.ok) {
34-
throw new Error(`HTTP error! status: ${response.status}`);
30+
// revalidate the page first to clear any cached content
31+
const revalidateResponse = await fetch("/api/fern-docs/revalidate-local");
32+
if (!revalidateResponse.ok) {
33+
throw new Error(`HTTP error! status: ${revalidateResponse.status}`);
3534
}
36-
const data = await response.json();
35+
console.log("Client: Successfully revalidated");
36+
37+
const envResponse = await fetch("/api/fern-docs/env-local");
38+
if (!envResponse.ok) {
39+
throw new Error(`HTTP error! status: ${envResponse.status}`);
40+
}
41+
const data = await envResponse.json();
3742

3843
if (!data.backendPort) {
3944
console.error("No port found in env-local response");
@@ -58,6 +63,8 @@ export function WebSocketRefresh() {
5863
const message = JSON.parse(event.data);
5964
console.log("Client: Parsed message:", message);
6065

66+
// revalidate the docs when a change has been detected
67+
// todo: only revalidate the relevant part of the docs (e.g. the page that changed)
6168
if (message.type === "finishReload") {
6269
console.log(
6370
"Client: Received finishReload message, calling revalidate-local endpoint"
@@ -68,12 +75,16 @@ export function WebSocketRefresh() {
6875
throw new Error(`HTTP error! status: ${response.status}`);
6976
}
7077
console.log("Client: Successfully revalidated");
71-
// Reload the page after revalidation
7278
window.location.reload();
7379
} catch (error) {
7480
console.error("Client: Failed to revalidate:", error);
7581
}
7682
}
83+
84+
if (message.type === "ping" && ws?.readyState === WebSocket.OPEN) {
85+
console.log("Client: Received ping, sending pong");
86+
ws.send(JSON.stringify({ type: "pong" }));
87+
}
7788
} catch (error) {
7889
console.error("Client: Failed to parse WebSocket message:", error);
7990
}
@@ -89,8 +100,7 @@ export function WebSocketRefresh() {
89100
);
90101
};
91102

92-
// Add connection timeout check
93-
timeout = setTimeout(() => {
103+
connectionTimeout = setTimeout(() => {
94104
if (ws?.readyState !== WebSocket.OPEN) {
95105
console.error(
96106
"Client: WebSocket connection failed to establish within 5 seconds"
@@ -106,8 +116,8 @@ export function WebSocketRefresh() {
106116

107117
return () => {
108118
console.log("Client: Cleaning up WebSocket connection");
109-
if (timeout) {
110-
clearTimeout(timeout);
119+
if (connectionTimeout) {
120+
clearTimeout(connectionTimeout);
111121
}
112122
if (ws) {
113123
ws.close();

0 commit comments

Comments
 (0)