async start()

in client/src/components/camera-preview/camera-preview.ts [77:126]


  async start(): Promise<any> {
    if (!cameraStreamIsAvailable()) {
      throw new Error('User media not supported');
    } else if (this.status !== CameraPreviewStatus.Stopped) {
      throw new Error('Video stream already started');
    } else if (!this.video) {
      throw new Error('Component not ready');
    }
    logger.log('Starting video stream');
    this._status = CameraPreviewStatus.Starting;
    // assume full window size
    const windowWidth = window.innerWidth;
    const windowHeight = window.innerHeight;
    let desiredWidth = windowWidth * window.devicePixelRatio;
    let desiredHeight = windowHeight * window.devicePixelRatio;
    if (desiredWidth < desiredHeight) {
      // have to flip requested video dimensions when in portrait mode
      const tmp = desiredWidth;
      desiredWidth = desiredHeight;
      desiredHeight = tmp;
    }
    const video = this.video;
    logger.log(`Requesting video at ${desiredWidth}x${desiredHeight}`);
    try {
      const stream = await navigator.mediaDevices.getUserMedia({ audio: false, video:
          { width: desiredWidth, height: desiredHeight, facingMode: 'environment' } });
      this.videoStream = stream;
      video.srcObject = stream;
    } catch (err) {
      if (err instanceof DOMException) {
        logger.warn('Unable to get video stream with ideal dimensions, trying default dimensions.', err);
        const stream = await navigator.mediaDevices.getUserMedia({ audio: false, video: { facingMode: 'environment' } });
        this.videoStream = stream;
        video.srcObject = stream;
      } else {
        logger.warn('Unable to start video stream.', err);
        throw err;
      }
    }
    await video.play();
    logger.log(`Video stream started at ${video.videoWidth}x${video.videoHeight}`);
    this._status = CameraPreviewStatus.Started;
    for (const track of this.videoStream.getTracks()) {
      track.addEventListener('ended', this.onVideoStreamEnded);
    }
    if (windowWidth !== window.innerWidth || windowHeight !== window.innerHeight) {
      logger.log('Window size has changed - restarting video');
      await this.restart();
    }
  }