Skip to content
This repository was archived by the owner on Jun 28, 2024. It is now read-only.

Commit a69cdc1

Browse files
Reconnect on network change (#105)
## Description fishjam-dev/ts-client-sdk#53
1 parent 02d89a8 commit a69cdc1

File tree

14 files changed

+630
-439
lines changed

14 files changed

+630
-439
lines changed

examples/use-camera-and-microphone-example/package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,12 @@
1-
import type { PeerStatus } from "@fishjam-dev/react-client";
2-
31
type Props = {
4-
status: PeerStatus;
5-
};
6-
7-
const getBadgeColor = (status: PeerStatus) => {
8-
switch (status) {
9-
case "joined":
10-
return "badge-success";
11-
case "error":
12-
return "badge-error";
13-
case "authenticated":
14-
case "connected":
15-
return "badge-info";
16-
case "connecting":
17-
return "badge-warning";
18-
}
2+
name: string;
3+
status: string | null;
4+
className: string;
195
};
206

21-
export const Badge = ({ status }: Props) => (
7+
export const Badge = ({ name, status, className }: Props) => (
228
<div className="flex items-center gap-1">
23-
<span>Status:</span>
24-
<span className={`badge ${getBadgeColor(status)}`}>{status}</span>
9+
<span>{name}</span>
10+
<span className={`badge ${className}`}>{status}</span>
2511
</div>
2612
);

examples/use-camera-and-microphone-example/src/MainControls.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
useConnect,
1212
useDisconnect,
1313
useMicrophone,
14+
useReconnection,
1415
useScreenShare,
1516
useSelector,
1617
useSetupMedia,
@@ -26,6 +27,8 @@ import { AUDIO_TRACK_CONSTRAINTS, VIDEO_TRACK_CONSTRAINTS } from "@fishjam-dev/r
2627
import { Badge } from "./Badge";
2728
import { DeviceControls } from "./DeviceControls";
2829
import { Radio } from "./Radio";
30+
import { useReconnectLogs } from "./utils/useReconnectLogs";
31+
import { getPeerStatusBadgeColor, getReconnectionStatusBadgeColor } from "./utils/BadgeUtils";
2932

3033
type OnDeviceChange = "remove" | "replace" | undefined;
3134
type OnDeviceStop = "remove" | "mute" | undefined;
@@ -62,8 +65,12 @@ const autostartAtom = atomWithStorage<boolean>("autostart", false, undefined, {
6265
export const MainControls = () => {
6366
const [token, setToken] = useAtom(tokenAtom);
6467

68+
// for debugging
69+
useReconnectLogs();
70+
6571
const connect = useConnect();
6672
const disconnect = useDisconnect();
73+
const reconnection = useReconnection();
6774

6875
const local = useSelector((s) => Object.values(s.local?.tracks || {}));
6976
const client = useClient();
@@ -203,7 +210,13 @@ export const MainControls = () => {
203210
</div>
204211

205212
<div className="flex w-full flex-row flex-wrap items-center gap-2">
206-
<Badge status={status} />
213+
<Badge name="Connection status:" status={status} className={getPeerStatusBadgeColor(status)} />
214+
215+
<Badge
216+
name="Reconnection status:"
217+
status={reconnection.status}
218+
className={getReconnectionStatusBadgeColor(reconnection.status)}
219+
/>
207220

208221
{authError && (
209222
<div className="flex items-center gap-1">

examples/use-camera-and-microphone-example/src/fishjamSetup.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,15 @@ export const {
6161
useScreenShare,
6262
useSelector,
6363
useClient,
64+
useReconnection,
6465
} = create<PeerMetadata, TrackMetadata>({
6566
peerMetadataParser: (obj) => peerMetadataSchema.parse(obj),
6667
trackMetadataParser: (obj) => trackMetadataSchema.passthrough().parse(obj),
68+
reconnect: {
69+
delay: 1000,
70+
initialDelay: 500,
71+
maxAttempts: 1000,
72+
},
6773
});
6874

6975
export const useAuthErrorReason = () => {
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import type { PeerStatus } from "@fishjam-dev/react-client";
2+
import type { ReconnectionStatus } from "@fishjam-dev/ts-client";
3+
4+
export const getPeerStatusBadgeColor = (status: PeerStatus): string => {
5+
switch (status) {
6+
case "joined":
7+
return "badge-success";
8+
case "error":
9+
return "badge-error";
10+
case "authenticated":
11+
case "connected":
12+
return "badge-info";
13+
case "connecting":
14+
return "badge-warning";
15+
}
16+
return "";
17+
};
18+
19+
export const getReconnectionStatusBadgeColor = (status: ReconnectionStatus) => {
20+
switch (status) {
21+
case "idle":
22+
return "badge-info";
23+
case "error":
24+
return "badge-error";
25+
case "reconnecting":
26+
return "badge-warning";
27+
}
28+
};
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import type { ClientEvents } from "@fishjam-dev/react-client";
2+
import type { PeerMetadata, TrackMetadata } from "../fishjamSetup";
3+
import { useClient } from "../fishjamSetup";
4+
import { useEffect } from "react";
5+
6+
/* eslint-disable no-console */
7+
export const useReconnectLogs = () => {
8+
const client = useClient();
9+
10+
useEffect(() => {
11+
if (!client) return;
12+
13+
const onReconnectionStarted: ClientEvents<PeerMetadata, TrackMetadata>["reconnectionStarted"] = () => {
14+
console.log("%c" + "reconnectionStarted", "color:green");
15+
};
16+
17+
const onReconnected: ClientEvents<PeerMetadata, TrackMetadata>["reconnected"] = () => {
18+
console.log("%cReconnected", "color:green");
19+
};
20+
21+
const onReconnectionRetriesLimitReached: ClientEvents<
22+
PeerMetadata,
23+
TrackMetadata
24+
>["reconnectionRetriesLimitReached"] = () => {
25+
console.log("%cReconnectionRetriesLimitReached", "color:red");
26+
};
27+
28+
const onSocketError: ClientEvents<PeerMetadata, TrackMetadata>["socketError"] = (error: Event) => {
29+
console.warn(error);
30+
};
31+
32+
const onConnectionError: ClientEvents<PeerMetadata, TrackMetadata>["connectionError"] = (error, client) => {
33+
if (client.isReconnecting()) {
34+
console.log("%c" + "During reconnection: connectionError %o", "color:gray", {
35+
error,
36+
// @ts-expect-error
37+
iceConnectionState: error?.event?.target?.["iceConnectionState"],
38+
});
39+
} else {
40+
// @ts-expect-error
41+
console.warn({ error, state: error?.event?.target?.["iceConnectionState"] });
42+
}
43+
};
44+
45+
const onJoinError: ClientEvents<PeerMetadata, TrackMetadata>["joinError"] = (event) => {
46+
console.log(event);
47+
};
48+
49+
const onAuthError: ClientEvents<PeerMetadata, TrackMetadata>["authError"] = (reason) => {
50+
if (client.isReconnecting()) {
51+
console.log("%c" + "During reconnection: authError: " + reason, "color:gray");
52+
}
53+
};
54+
55+
const onSocketClose: ClientEvents<PeerMetadata, TrackMetadata>["socketClose"] = (event) => {
56+
if (client.isReconnecting()) {
57+
console.log("%c" + "During reconnection: Signaling socket closed", "color:gray");
58+
} else {
59+
console.warn(event);
60+
}
61+
};
62+
63+
client.on("reconnectionStarted", onReconnectionStarted);
64+
client.on("reconnected", onReconnected);
65+
client.on("reconnectionRetriesLimitReached", onReconnectionRetriesLimitReached);
66+
67+
client.on("socketError", onSocketError);
68+
client.on("connectionError", onConnectionError);
69+
client.on("joinError", onJoinError);
70+
client.on("authError", onAuthError);
71+
client.on("socketClose", onSocketClose);
72+
73+
return () => {
74+
client.off("reconnectionStarted", onReconnectionStarted);
75+
client.off("reconnected", onReconnected);
76+
client.off("reconnectionRetriesLimitReached", onReconnectionRetriesLimitReached);
77+
78+
client.off("socketError", onSocketError);
79+
client.off("connectionError", onConnectionError);
80+
client.off("joinError", onJoinError);
81+
client.off("authError", onAuthError);
82+
client.off("socketClose", onSocketClose);
83+
};
84+
}, [client]);
85+
};

package-lock.json

Lines changed: 2 additions & 41 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
"typescript": "5.4.5"
6666
},
6767
"dependencies": {
68-
"@fishjam-dev/ts-client": "github:fishjam-dev/ts-client-sdk",
68+
"@fishjam-dev/ts-client": "github:fishjam-dev/ts-client-sdk#main",
6969
"events": "3.3.0",
7070
"lodash.isequal": "4.5.0"
7171
},

0 commit comments

Comments
 (0)