Skip to content

Commit 5350d6d

Browse files
committed
fix(SSR): shim webrtc after component mounted
Apply webrtc-adapter shim not before the component is mounted so that the `window` object is guaranteed to be available. During server side rendering or prerendering `window` is not available causing reference errors.
1 parent e0ce7cc commit 5350d6d

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

src/misc/camera.js

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import adapterFactory from "webrtc-adapter/src/js/adapter_factory.js";
12
import { StreamApiNotSupportedError } from "./errors.js";
23
import { imageDataFromVideo } from "./image-data.js";
34
import { hasFired } from "./promisify.js";
@@ -17,13 +18,25 @@ class Camera {
1718
}
1819
}
1920

21+
const STREAM_API_SUPPORTED =
22+
navigator &&
23+
(navigator.getUserMedia ||
24+
(navigator.mediaDevices && navigator.mediaDevices.getUserMedia));
25+
26+
let streamApiShimApplied = false;
27+
2028
export default async function(constraints, videoEl) {
21-
if (!(navigator.mediaDevices && navigator.mediaDevices.getUserMedia)) {
29+
if (STREAM_API_SUPPORTED === false) {
2230
throw new StreamApiNotSupportedError();
2331
}
2432

33+
if (streamApiShimApplied === false) {
34+
adapterFactory({ window });
35+
streamApiShimApplied = true;
36+
}
37+
2538
const stream = await navigator.mediaDevices.getUserMedia(constraints);
26-
const streamLoaded = hasFired(videoEl, "loadeddata");
39+
const streamLoaded = hasFired(videoEl, "loadeddata", "error");
2740

2841
if (videoEl.srcObject !== undefined) {
2942
videoEl.srcObject = stream;

src/misc/scanner.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import "webrtc-adapter";
21
import { hasFired } from "./promisify.js";
32
import Worker from "./worker.js";
43

0 commit comments

Comments
 (0)