diff --git a/packages/react-client/src/devices/mediaInitializer.ts b/packages/react-client/src/devices/mediaInitializer.ts index 60154002..6d2c9f89 100644 --- a/packages/react-client/src/devices/mediaInitializer.ts +++ b/packages/react-client/src/devices/mediaInitializer.ts @@ -26,9 +26,8 @@ const getSingleMedia = async ( const stream = await navigator.mediaDevices.getUserMedia({ ...baseConstraints, [type]: constraints }); return [stream, null]; } catch (err) { - if (!(err instanceof DOMException)) return [null, UNHANDLED_ERROR]; - - return [null, errorMap[err.name] ?? UNHANDLED_ERROR]; + const name = err instanceof Error ? err.name : ""; + return [null, errorMap[name] ?? UNHANDLED_ERROR]; } }; @@ -50,23 +49,23 @@ export const getAvailableMedia = async ( try { return { stream: await navigator.mediaDevices.getUserMedia(constraints), errors }; } catch (err: unknown) { - if (err instanceof DOMException) { - switch (err.name) { - case errors.audio?.name: - case errors.video?.name: - return { stream: null, errors }; - case "NotFoundError": - return tryToGetAudioOnlyThenVideoOnly(constraints, PERMISSION_DENIED); - case "OverconstrainedError": - return getAvailableMedia( - { audio: unspecifyDevice(constraints.audio), video: unspecifyDevice(constraints.video) }, - { audio: OVERCONSTRAINED_ERROR, video: OVERCONSTRAINED_ERROR }, - ); - case "NotAllowedError": - return tryToGetAudioOnlyThenVideoOnly(constraints, PERMISSION_DENIED); - } + const name = err instanceof Error ? err.name : ""; + switch (name) { + case errors.audio?.name: + case errors.video?.name: + return { stream: null, errors }; + case "NotFoundError": + return tryToGetAudioOnlyThenVideoOnly(constraints, PERMISSION_DENIED); + case "OverconstrainedError": + return getAvailableMedia( + { audio: unspecifyDevice(constraints.audio), video: unspecifyDevice(constraints.video) }, + { audio: OVERCONSTRAINED_ERROR, video: OVERCONSTRAINED_ERROR }, + ); + case "NotAllowedError": + return tryToGetAudioOnlyThenVideoOnly(constraints, PERMISSION_DENIED); + default: + return { stream: null, errors: { audio: UNHANDLED_ERROR, video: UNHANDLED_ERROR } }; } - return { stream: null, errors: { audio: UNHANDLED_ERROR, video: UNHANDLED_ERROR } }; } }; diff --git a/packages/react-client/src/utils/errors.ts b/packages/react-client/src/utils/errors.ts index cc5afe25..73272796 100644 --- a/packages/react-client/src/utils/errors.ts +++ b/packages/react-client/src/utils/errors.ts @@ -10,18 +10,16 @@ export const UNHANDLED_ERROR: DeviceError = { name: "UNHANDLED_ERROR" }; // https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia#exceptions // OverconstrainedError has higher priority than NotAllowedError export const parseUserMediaError = (error: unknown, logger: ReturnType): DeviceError => { - if (!(error instanceof DOMException)) { - logger.warn({ name: "Unhandled getUserMedia error", error }); - return UNHANDLED_ERROR; + const name = error instanceof Error ? error.name : ""; + switch (name) { + case "NotAllowedError": + return PERMISSION_DENIED; + case "OverconstrainedError": + return OVERCONSTRAINED_ERROR; + case "NotFoundError": + return NOT_FOUND_ERROR; + default: + logger.warn({ name: "Unhandled getUserMedia error", error }); + return UNHANDLED_ERROR; } - - if (error.name === "NotAllowedError") { - return PERMISSION_DENIED; - } else if (error.name === "OverconstrainedError") { - return OVERCONSTRAINED_ERROR; - } else if (error.name === "NotFoundError") { - return NOT_FOUND_ERROR; - } - - return UNHANDLED_ERROR; };