Skip to content

Commit a925559

Browse files
committed
Check that WHIP/WHEP returns 201 in Web
Gives user better error handling when Auth fails
1 parent 2bb6f6d commit a925559

2 files changed

Lines changed: 24 additions & 8 deletions

File tree

web/src/components/broadcast/Broadcast.tsx

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ function BrowserBroadcaster() {
4444
const [currentViewersCount, setCurrentViewersCount] = useState<number>(0)
4545
const [hasPacketLoss, setHasPacketLoss] = useState<boolean>(false)
4646
const [hasSignal, setHasSignal] = useState<boolean>(false);
47-
47+
const [connectFailed, setConnectFailed] = useState<boolean>(false)
48+
4849
const peerConnectionRef = useRef<RTCPeerConnection | null>(null);
4950
const videoRef = useRef<HTMLVideoElement>(null)
5051
const hasSignalRef = useRef<boolean>(false);
@@ -159,14 +160,21 @@ function BrowserBroadcaster() {
159160
Authorization: `Bearer ${streamKey}`,
160161
'Content-Type': 'application/sdp'
161162
}
162-
}).then(r => r.text())
163-
.then(answer => {
164-
peerConnectionRef.current!.setRemoteDescription({
165-
sdp: answer,
166-
type: 'answer'
167-
})
168-
.catch((err) => console.error("SetRemoveDescription", err))
163+
}).then(r => {
164+
setConnectFailed(r.status !== 201)
165+
if (connectFailed) {
166+
throw new DOMException("WHIP endpoint did not return 201");
167+
}
168+
169+
return r.text()
170+
})
171+
.then(answer => {
172+
peerConnectionRef.current!.setRemoteDescription({
173+
sdp: answer,
174+
type: 'answer'
169175
})
176+
.catch((err) => console.error("SetRemoveDescription", err))
177+
})
170178
})
171179
}, (reason: ErrorMessageEnum) => {
172180
setMediaAccessError(() => reason)
@@ -226,6 +234,7 @@ function BrowserBroadcaster() {
226234
<div className='container mx-auto'>
227235
{mediaAccessError != null && <PlayerHeader headerType={"Error"}> {getMediaErrorMessage(mediaAccessError)} </PlayerHeader>}
228236
{peerConnectionDisconnected && <PlayerHeader headerType={"Error"}> WebRTC has disconnected or failed to connect at all 😭 </PlayerHeader>}
237+
{connectFailed && <PlayerHeader headerType={"Error"}> Failed to start Broadcast Box session 👮 </PlayerHeader>}
229238
{hasPacketLoss && <PlayerHeader headerType={"Warning"}> WebRTC is experiencing packet loss</PlayerHeader>}
230239
{publishSuccess && <PlayerHeader headerType={"Success"}> Live: Currently streaming to <a href={window.location.href.replace('publish/', '')} target="_blank" rel="noreferrer" className="hover:underline">{window.location.href.replace('publish/', '')}</a> </PlayerHeader>}
231240

web/src/components/player/Player.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ const Player = (props: PlayerProps) => {
2020
const [hasSignal, setHasSignal] = useState<boolean>(false);
2121
const [hasPacketLoss, setHasPacketLoss] = useState<boolean>(false)
2222
const [videoOverlayVisible, setVideoOverlayVisible] = useState<boolean>(false)
23+
const [connectFailed, setConnectFailed] = useState<boolean>(false)
2324

2425
const videoRef = useRef<HTMLVideoElement>(null);
2526
const layerEndpointRef = useRef<string>('');
@@ -166,6 +167,11 @@ const Player = (props: PlayerProps) => {
166167
'Content-Type': 'application/sdp'
167168
}
168169
}).then(r => {
170+
setConnectFailed(r.status !== 201)
171+
if (connectFailed) {
172+
throw new DOMException("WHEP endpoint did not return 201");
173+
}
174+
169175
const parsedLinkHeader = parseLinkHeader(r.headers.get('Link'))
170176

171177
if (parsedLinkHeader === null || parsedLinkHeader === undefined) {
@@ -200,6 +206,7 @@ const Player = (props: PlayerProps) => {
200206
maxHeight: '100vh',
201207
maxWidth: '100vw',
202208
} : {}}>
209+
{connectFailed && <p className='bg-red-700 text-white text-lg text-center p-4 rounded-t-lg whitespace-pre-wrap'>Failed to start Broadcast Box session 👮 </p>}
203210
<div
204211
onClick={handleVideoPlayerClick}
205212
onDoubleClick={handleVideoPlayerDoubleClick}

0 commit comments

Comments
 (0)