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

Commit 009bb97

Browse files
committed
Recover from RTC errors
1 parent e8f4e83 commit 009bb97

File tree

5 files changed

+36
-36
lines changed

5 files changed

+36
-36
lines changed

assets/package-lock.json

+11-13
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

assets/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"preview": "vite preview"
1212
},
1313
"dependencies": {
14-
"@fishjam-dev/react-client": "^0.4.0",
14+
"@fishjam-dev/react-client": "github:fishjam-dev/react-client-sdk",
1515
"@mediapipe/tasks-vision": "^0.10.12",
1616
"axios": "^1.6.8",
1717
"chartist": "^1.3.0",

assets/src/features/devices/LocalPeerMediaContext.tsx

+11-9
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ import {
55
VIDEO_TRACK_CONSTRAINTS
66
} from "../../pages/room/consts";
77
import { PeerMetadata, TrackMetadata, useCamera, useClient, useMicrophone, useSetupMedia } from "../../fishjam";
8-
import { ClientEvents, UseCameraResult, SimulcastConfig } from "@fishjam-dev/react-client";
8+
import { ClientEvents, CameraAPI, SimulcastConfig } from "@fishjam-dev/react-client";
99
import { BlurProcessor } from "./BlurProcessor";
1010
import { selectBandwidthLimit } from "../../pages/room/bandwidth.tsx";
1111
import { useDeveloperInfo } from "../../contexts/DeveloperInfoContext.tsx";
1212
import { useUser } from "../../contexts/UserContext.tsx";
1313

1414
export type LocalPeerContext = {
15-
video: UseCameraResult<TrackMetadata>;
15+
video: CameraAPI<TrackMetadata>;
1616
init: () => void;
1717
blur: boolean;
1818
setBlur: (status: boolean, restart: boolean) => void;
@@ -67,6 +67,7 @@ export const LocalPeerMediaProvider = ({ children }: Props) => {
6767
});
6868

6969
const video = useCamera();
70+
const microphone = useMicrophone();
7071

7172
const [blur, setBlur] = useState(false);
7273
const processor = useRef<BlurProcessor | null>(null);
@@ -127,6 +128,9 @@ export const LocalPeerMediaProvider = ({ children }: Props) => {
127128
.some((track) => track?.metadata?.type === "camera");
128129

129130
const newTrack = trackRef.current;
131+
132+
const newMetadata = { active: metadataActive, type: "camera", displayName } as const;
133+
130134
if (!lastCameraTrack && streamRef.current && newTrack) {
131135
const mediaStream = new MediaStream();
132136
mediaStream.addTrack(newTrack);
@@ -140,8 +144,7 @@ export const LocalPeerMediaProvider = ({ children }: Props) => {
140144

141145
remoteTrackIdRef.current = await client.addTrack(
142146
newTrack,
143-
mediaStream,
144-
{ active: metadataActive, type: "camera", displayName },
147+
newMetadata,
145148
simulcastConfig,
146149
selectBandwidthLimit("camera", simulcastEnabled)
147150
);
@@ -152,7 +155,6 @@ export const LocalPeerMediaProvider = ({ children }: Props) => {
152155
// todo
153156
// When you replaceTrack, this does not affect the stream, so the local peer doesn't know that something has changed.
154157
// add localTrackReplaced event
155-
const newMetadata: TrackMetadata = { active: metadataActive, type: "camera", displayName };
156158
await client.replaceTrack(remoteTrackIdRef.current, trackRef.current, newMetadata);
157159
} else if (remoteTrackIdRef.current && !stream) {
158160
await client.removeTrack(remoteTrackIdRef.current);
@@ -263,7 +265,6 @@ export const LocalPeerMediaProvider = ({ children }: Props) => {
263265
client.removeListener("devicesReady", devicesReady);
264266
client.removeListener("deviceStopped", deviceStopped);
265267
client.removeListener("disconnected", disconnected);
266-
267268
};
268269
}, [simulcast.status]);
269270

@@ -276,12 +277,15 @@ export const LocalPeerMediaProvider = ({ children }: Props) => {
276277

277278
const noop: () => Promise<any> = useCallback((..._args) => Promise.resolve(), []);
278279

279-
const newVideo: UseCameraResult<TrackMetadata> = useMemo(() => ({
280+
const newVideo: CameraAPI<TrackMetadata> = useMemo(() => ({
280281
stream: stream || null,
281282
track: track || null,
282283
addTrack: noop,
283284
removeTrack: noop,
284285
replaceTrack: noop,
286+
updateTrackMetadata: noop,
287+
muteTrack: noop,
288+
unmuteTrack: noop,
285289
broadcast: video.broadcast,
286290
deviceInfo: video.deviceInfo,
287291
devices: video.devices,
@@ -295,8 +299,6 @@ export const LocalPeerMediaProvider = ({ children }: Props) => {
295299
mediaStatus: video.mediaStatus
296300
}), [stream, track]);
297301

298-
const microphone = useMicrophone();
299-
300302
const setDevice = useCallback(async (cameraId: string | null, microphoneId: string | null, blur: boolean) => {
301303
if (microphoneId && microphoneIntentionRef.current) {
302304
microphone.start(microphoneId);

assets/src/fishjam.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ export const {
3838
peerMetadataParser: (obj) => peerMetadataSchema.parse(obj),
3939
trackMetadataParser: (obj) => trackMetadataSchema.parse(obj),
4040
reconnect: {
41-
initialDelay: 10, // ms
42-
delay: 200, // ms
43-
maxAttempts: 1,
41+
initialDelay: 200, // ms
42+
delay: 500, // ms
43+
maxAttempts: 5,
4444
}
4545
}, { storage: true });
4646

assets/src/pages/room/components/MediaControlButtons.tsx

+10-10
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import {
2222
useMicrophone,
2323
useScreenShare
2424
} from "../../../fishjam.ts";
25-
import { UseCameraResult, UseMicrophoneResult, UseScreenShareResult, Client } from "@fishjam-dev/react-client";
25+
import { CameraAPI, MicrophoneAPI, ScreenShareAPI, Client } from "@fishjam-dev/react-client";
2626
import { LocalPeerContext, useLocalPeer } from "../../../features/devices/LocalPeerMediaContext.tsx";
2727
import { useUser } from "../../../contexts/UserContext.tsx";
2828

@@ -40,9 +40,9 @@ const getAutomaticControls = (
4040
isSidebarOpen: boolean,
4141
openSidebar: () => void,
4242
isMobileViewport: boolean,
43-
microphone: UseMicrophoneResult<TrackMetadata>,
44-
screenShare: UseScreenShareResult<TrackMetadata>,
45-
camera: UseCameraResult<TrackMetadata>,
43+
microphone: MicrophoneAPI<TrackMetadata>,
44+
screenShare: ScreenShareAPI<TrackMetadata>,
45+
camera: CameraAPI<TrackMetadata>,
4646
localPeerContext: LocalPeerContext
4747
): ControlButton[] => [
4848
camera.stream
@@ -130,9 +130,9 @@ const getAutomaticControls = (
130130
// todo fix manual mode
131131
const getManualControls = (
132132
navigate: NavigateFunction,
133-
microphone: UseMicrophoneResult<TrackMetadata>,
134-
screenShare: UseScreenShareResult<TrackMetadata>,
135-
camera: UseCameraResult<TrackMetadata>,
133+
microphone: MicrophoneAPI<TrackMetadata>,
134+
screenShare: ScreenShareAPI<TrackMetadata>,
135+
camera: CameraAPI<TrackMetadata>,
136136
client: Client<PeerMetadata, TrackMetadata>,
137137
displayName: string,
138138
roomId?: string
@@ -402,9 +402,9 @@ const MediaControlButtons: FC<MediaControlButtonsProps> =
402402

403403
const navigate = useNavigate();
404404

405-
const camera: UseCameraResult<TrackMetadata> = useCamera();
406-
const microphone: UseMicrophoneResult<TrackMetadata> = useMicrophone();
407-
const screenShare: UseScreenShareResult<TrackMetadata> = useScreenShare();
405+
const camera: CameraAPI<TrackMetadata> = useCamera();
406+
const microphone: MicrophoneAPI<TrackMetadata> = useMicrophone();
407+
const screenShare: ScreenShareAPI<TrackMetadata> = useScreenShare();
408408
const client = useClient();
409409

410410
const localPeerContext = useLocalPeer();

0 commit comments

Comments
 (0)