@trap_stevo/legendarybuilderproreact-ui
Version: 
The legendary UI & utility API that makes your application a legendary application. ~ Created by Steven Compton
1,133 lines • 49.6 kB
JavaScript
import _extends from "@babel/runtime/helpers/extends";
import _defineProperty from "@babel/runtime/helpers/defineProperty";
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
import _regeneratorRuntime from "@babel/runtime/regenerator";
import React, { useState, useEffect, useRef, useCallback } from "react";
import { HUDUniversalHUDUtilityManager, ConvertURLToIP, Countdown, Delay } from "../HUDManagers/HUDUniversalHUDUtilityManager.js";
import HUDOperationsUtilityManager from "../HUDManagers/HUDOperationsUtilityManager.js";
import { useIdleDetection, useTimeout } from "../HUDManagers/HUDUniversalHUDEventEffectsManager.js";
import PropTypes from "prop-types";
var styles = {
  container: {
    display: "flex",
    flexDirection: "column",
    alignItems: "center",
    justifyContent: "center",
    fontFamily: "'Orbitron', sans-serif",
    backgroundColor: "#1a1a1a",
    color: "#00ffcc",
    height: "100vh",
    width: "100vw"
  },
  actionContainer: {
    display: "flex",
    flexDirection: "column",
    justifyContent: "center",
    alignItems: "center",
    gap: "10px"
  },
  videoContainer: {
    position: "relative",
    width: "100%"
  },
  video: {
    borderRadius: "10px",
    boxShadow: "0 0 20px rgba(0, 255, 204, 0.569)",
    width: "100%"
  },
  overlay: {
    position: "absolute",
    display: "flex",
    alignItems: "center",
    justifyContent: "center",
    backgroundColor: "rgba(0, 0, 0, 0.569)",
    borderRadius: "10px",
    height: "100%",
    width: "100%",
    zIndex: 1,
    left: 0,
    top: 0
  },
  message: {
    fontSize: "1.69rem",
    color: "#00ffcc",
    textShadow: "0 0 10px rgba(0, 255, 204, 0.7)"
  },
  loadingSpinner: {
    border: "6px solid rgba(0, 255, 204, 0.2)",
    borderTop: "6px solid #00ffcc",
    borderRadius: "50%",
    animation: "spin 1s linear infinite",
    height: "69px",
    width: "69px",
    marginBottom: "15px",
    marginTop: "20px"
  }
};
var keyframes = "\n  @keyframes spin {\n    0% { transform : rotate(0deg); }\n    100% { transform : rotate(360deg); }\n  }\n";
function log(type) {
  var enableLogging = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
  var onLog = arguments.length > 2 ? arguments[2] : undefined;
  var now = new Date();
  var timestamp = now.toLocaleString();
  for (var _len = arguments.length, message = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
    message[_key - 3] = arguments[_key];
  }
  if (onLog) {
    onLog.apply(void 0, ["[".concat(timestamp, "] ").concat(type.toUpperCase() !== "LOG" ? "[".concat(type.toUpperCase(), "]") : "", " :: ")].concat(message));
  }
  if (!enableLogging) {
    return;
  }
  var logMethod = {
    log: console.log,
    info: console.info,
    warn: console.warn,
    error: console.error,
    debug: console.debug
  }[type] || console.log;
  logMethod.apply(void 0, ["[".concat(timestamp, "] ").concat(type.toUpperCase() !== "LOG" ? "[".concat(type.toUpperCase(), "]") : "", " :: ")].concat(message));
}
;
function startStream(_x) {
  return _startStream.apply(this, arguments);
}
function _startStream() {
  _startStream = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee13(signalURL) {
    var streamsURL,
      streamId,
      channelId,
      videoRef,
      peerConnectionRef,
      startCountdown,
      stopCountdown,
      setConnected,
      connecting,
      webRTSPStreaming,
      enableLogging,
      onWebRTSPLog,
      onWebRTSPConnect,
      streamSignalURL,
      streamSignalSRC,
      config,
      peerConnection,
      remoteDesc,
      _args13 = arguments;
    return _regeneratorRuntime.wrap(function _callee13$(_context13) {
      while (1) switch (_context13.prev = _context13.next) {
        case 0:
          streamsURL = _args13.length > 1 && _args13[1] !== undefined ? _args13[1] : null;
          streamId = _args13.length > 2 ? _args13[2] : undefined;
          channelId = _args13.length > 3 ? _args13[3] : undefined;
          videoRef = _args13.length > 4 ? _args13[4] : undefined;
          peerConnectionRef = _args13.length > 5 ? _args13[5] : undefined;
          startCountdown = _args13.length > 6 ? _args13[6] : undefined;
          stopCountdown = _args13.length > 7 ? _args13[7] : undefined;
          setConnected = _args13.length > 8 ? _args13[8] : undefined;
          connecting = _args13.length > 9 ? _args13[9] : undefined;
          webRTSPStreaming = _args13.length > 10 ? _args13[10] : undefined;
          enableLogging = _args13.length > 11 ? _args13[11] : undefined;
          onWebRTSPLog = _args13.length > 12 ? _args13[12] : undefined;
          onWebRTSPConnect = _args13.length > 13 ? _args13[13] : undefined;
          _context13.prev = 13;
          streamSignalURL = streamsURL ? streamsURL : "http://".concat(ConvertURLToIP(signalURL), ":8083");
          streamSignalSRC = "".concat(streamSignalURL, "/stream/").concat(streamId, "/channel/").concat(channelId, "/webrtc");
          connecting.current = true;
          log("log", enableLogging, onWebRTSPLog, "WEBRTSP Connection ~ Connecting to source ~ ".concat(streamSignalURL, "..."));
          config = {
            iceServers: [{
              urls: "stun:stun.l.google.com:19302"
            }]
          };
          peerConnection = new RTCPeerConnection(config);
          _context13.next = 22;
          return prepareNewTrack(streamSignalSRC, peerConnection, videoRef, webRTSPStreaming, stopCountdown);
        case 22:
          remoteDesc = _context13.sent;
          log("log", enableLogging, onWebRTSPLog, "WEBRTSP Connection ~ Got stream connection signal!");
          peerConnection.oniceconnectionstatechange = function () {
            log("log", enableLogging, onWebRTSPLog, "WEBRTSP Connection ~ Connection state ~ ", peerConnection.iceConnectionState);
            if (peerConnection.iceConnectionState === "connected") {
              log("log", enableLogging, onWebRTSPLog, "WEBRTSP Connection ~ Connected to source ~ ".concat(streamSignalURL, "!"));
              connecting.current = false;
              setConnected(true);
              webRTSPStreaming();
              if (onWebRTSPConnect) {
                onWebRTSPConnect();
              }
              return;
            }
            if (peerConnection.iceConnectionState === "checking" || peerConnection.iceConnectionState === "connecting") {
              connecting.current = true;
              webRTSPStreaming();
              stopCountdown();
              return;
            }
            if (peerConnection.iceConnectionState === "disconnected") {
              connecting.current = true;
              setConnected(false);
              startCountdown();
            }
          };
          _context13.next = 27;
          return peerConnection.setRemoteDescription(remoteDesc);
        case 27:
          peerConnectionRef.current = peerConnection;
          _context13.next = 35;
          break;
        case 30:
          _context13.prev = 30;
          _context13.t0 = _context13["catch"](13);
          log("error", enableLogging, onWebRTSPLog, "WEBRTSP Connection ~ Did not start stream ~ ", _context13.t0);
          connecting.current = true;
          setConnected(false);
        case 35:
        case "end":
          return _context13.stop();
      }
    }, _callee13, null, [[13, 30]]);
  }));
  return _startStream.apply(this, arguments);
}
;
var prepareNewTrack = /*#__PURE__*/function () {
  var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(streamSignalSRC, peerConnection, videoRef, webRTSPStreaming, stopCountdown) {
    var offer, sdpOfferBase64, response, sdpAnswerBase64, sdpAnswer, remoteDesc;
    return _regeneratorRuntime.wrap(function _callee$(_context) {
      while (1) switch (_context.prev = _context.next) {
        case 0:
          _context.next = 2;
          return peerConnection.createOffer({
            offerToReceiveVideo: true
          });
        case 2:
          offer = _context.sent;
          _context.next = 5;
          return peerConnection.setLocalDescription(offer);
        case 5:
          sdpOfferBase64 = btoa(offer.sdp);
          _context.next = 8;
          return fetch(streamSignalSRC, {
            method: "POST",
            headers: {
              "Content-Type": "application/x-www-form-urlencoded"
            },
            body: new URLSearchParams({
              data: sdpOfferBase64
            })
          });
        case 8:
          response = _context.sent;
          if (response.ok) {
            _context.next = 11;
            break;
          }
          throw new Error("Did not get SDP answer ~ ".concat(response.statusText));
        case 11:
          _context.next = 13;
          return response.text();
        case 13:
          sdpAnswerBase64 = _context.sent;
          sdpAnswer = atob(sdpAnswerBase64);
          remoteDesc = new RTCSessionDescription({
            type: "answer",
            sdp: sdpAnswer
          });
          peerConnection.ontrack = function (event) {
            var track = event.track;
            webRTSPStreaming();
            if (videoRef.current) {
              stopCountdown();
              var remoteStream = new MediaStream();
              remoteStream.addTrack(track);
              videoRef.current.srcObject = remoteStream;
            }
          };
          return _context.abrupt("return", remoteDesc);
        case 18:
        case "end":
          return _context.stop();
      }
    }, _callee);
  }));
  return function prepareNewTrack(_x2, _x3, _x4, _x5, _x6) {
    return _ref.apply(this, arguments);
  };
}();
var closePeerConnection = function closePeerConnection(peerConnection) {
  if (peerConnection) {
    peerConnection.close();
    peerConnection = null;
  }
};
function rtspToWebStreamDetails(data) {
  var result = {};
  for (var streamID in data.payload) {
    var streamData = data.payload[streamID];
    for (var channel in streamData.channels) {
      var channelData = streamData.channels[channel];
      result[channelData.url] = {
        streamID: streamID,
        channel: channel
      };
    }
  }
  return result;
}
;
function getRTSPToWebStreamDetails(_x7) {
  return _getRTSPToWebStreamDetails.apply(this, arguments);
}
function _getRTSPToWebStreamDetails() {
  _getRTSPToWebStreamDetails = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee14(signalURL) {
    var streamsURL,
      signalName,
      signalID,
      enableLogging,
      onWebRTSPLog,
      url,
      headers,
      credentials,
      response,
      data,
      _args14 = arguments;
    return _regeneratorRuntime.wrap(function _callee14$(_context14) {
      while (1) switch (_context14.prev = _context14.next) {
        case 0:
          streamsURL = _args14.length > 1 && _args14[1] !== undefined ? _args14[1] : null;
          signalName = _args14.length > 2 && _args14[2] !== undefined ? _args14[2] : "demo";
          signalID = _args14.length > 3 && _args14[3] !== undefined ? _args14[3] : "demo";
          enableLogging = _args14.length > 4 ? _args14[4] : undefined;
          onWebRTSPLog = _args14.length > 5 ? _args14[5] : undefined;
          url = streamsURL ? "".concat(streamsURL, "/streams") : "http://".concat(ConvertURLToIP(signalURL), ":8083/streams");
          _context14.prev = 6;
          headers = new Headers();
          credentials = btoa("".concat(signalName, ":").concat(signalID));
          headers.set("Authorization", "Basic ".concat(credentials));
          _context14.next = 12;
          return fetch(url, {
            headers: headers
          });
        case 12:
          response = _context14.sent;
          if (response.ok) {
            _context14.next = 15;
            break;
          }
          throw new Error("".concat(response.statusText));
        case 15:
          _context14.next = 17;
          return response.json();
        case 17:
          data = _context14.sent;
          return _context14.abrupt("return", rtspToWebStreamDetails(data));
        case 21:
          _context14.prev = 21;
          _context14.t0 = _context14["catch"](6);
          log("error", enableLogging, onWebRTSPLog, "WEBRTSP Connection ~ Did not get streams ~ ".concat(_context14.t0));
          return _context14.abrupt("return", null);
        case 25:
        case "end":
          return _context14.stop();
      }
    }, _callee14, null, [[6, 21]]);
  }));
  return _getRTSPToWebStreamDetails.apply(this, arguments);
}
;
function HUDRTSCViewer(_ref2) {
  var _ref2$actionContainer = _ref2.actionContainerConfigurationSettings,
    actionContainerConfigurationSettings = _ref2$actionContainer === void 0 ? {} : _ref2$actionContainer,
    _ref2$videoContainerC = _ref2.videoContainerConfigurationSettings,
    videoContainerConfigurationSettings = _ref2$videoContainerC === void 0 ? {} : _ref2$videoContainerC,
    _ref2$loadingSpinnerC = _ref2.loadingSpinnerConfigurationSettings,
    loadingSpinnerConfigurationSettings = _ref2$loadingSpinnerC === void 0 ? {} : _ref2$loadingSpinnerC,
    _ref2$containerConfig = _ref2.containerConfigurationSettings,
    containerConfigurationSettings = _ref2$containerConfig === void 0 ? {} : _ref2$containerConfig,
    _ref2$messageConfigur = _ref2.messageConfigurationSettings,
    messageConfigurationSettings = _ref2$messageConfigur === void 0 ? {} : _ref2$messageConfigur,
    _ref2$overlayConfigur = _ref2.overlayConfigurationSettings,
    overlayConfigurationSettings = _ref2$overlayConfigur === void 0 ? {} : _ref2$overlayConfigur,
    _ref2$videoConfigurat = _ref2.videoConfigurationSettings,
    videoConfigurationSettings = _ref2$videoConfigurat === void 0 ? {} : _ref2$videoConfigurat,
    _ref2$webRTSPStreamCo = _ref2.webRTSPStreamConfigurations,
    webRTSPStreamConfigurations = _ref2$webRTSPStreamCo === void 0 ? {} : _ref2$webRTSPStreamCo,
    _ref2$containerConfig2 = _ref2.containerConfigurations,
    containerConfigurations = _ref2$containerConfig2 === void 0 ? {} : _ref2$containerConfig2,
    _ref2$clientStreamSet = _ref2.clientStreamSettings,
    clientStreamSettings = _ref2$clientStreamSet === void 0 ? {
      hardwareAccelerationActivated: true,
      enableMaxPerformance: true,
      leakyDownstream: false,
      maxSizeBuffers: 2,
      maxSizeBytes: 10485760,
      protocols: "tcp"
    } : _ref2$clientStreamSet,
    _ref2$clientDetails = _ref2.clientDetails,
    clientDetails = _ref2$clientDetails === void 0 ? {} : _ref2$clientDetails,
    _ref2$sessionID = _ref2.sessionID,
    sessionID = _ref2$sessionID === void 0 ? HUDUniversalHUDUtilityManager.GenerateUUID() : _ref2$sessionID,
    _ref2$signalName = _ref2.signalName,
    signalName = _ref2$signalName === void 0 ? "demo" : _ref2$signalName,
    _ref2$signalID = _ref2.signalID,
    signalID = _ref2$signalID === void 0 ? "demo" : _ref2$signalID,
    _ref2$signalURL = _ref2.signalURL,
    signalURL = _ref2$signalURL === void 0 ? "http://localhost:5069" : _ref2$signalURL,
    _ref2$streamsURL = _ref2.streamsURL,
    streamsURL = _ref2$streamsURL === void 0 ? null : _ref2$streamsURL,
    _ref2$rtspURL = _ref2.rtspURL,
    rtspURL = _ref2$rtspURL === void 0 ? "rtsp://localhost:8554" : _ref2$rtspURL,
    _ref2$autoDisconnects = _ref2.autoDisconnectsWhenHidden,
    autoDisconnectsWhenHidden = _ref2$autoDisconnects === void 0 ? false : _ref2$autoDisconnects,
    _ref2$autoDisconnectT = _ref2.autoDisconnectThreshold,
    autoDisconnectThreshold = _ref2$autoDisconnectT === void 0 ? 0.169 : _ref2$autoDisconnectT,
    _ref2$idleReconnectio = _ref2.idleReconnectionInterval,
    idleReconnectionInterval = _ref2$idleReconnectio === void 0 ? "2s" : _ref2$idleReconnectio,
    _ref2$reconnectionInt = _ref2.reconnectionInterval,
    reconnectionInterval = _ref2$reconnectionInt === void 0 ? 3000 : _ref2$reconnectionInt,
    _ref2$restartStreamOn = _ref2.restartStreamOnIdle,
    restartStreamOnIdle = _ref2$restartStreamOn === void 0 ? true : _ref2$restartStreamOn,
    _ref2$preventSignalCo = _ref2.preventSignalConnections,
    preventSignalConnections = _ref2$preventSignalCo === void 0 ? false : _ref2$preventSignalCo,
    _ref2$triggerConnecti = _ref2.triggerConnectionClosure,
    triggerConnectionClosure = _ref2$triggerConnecti === void 0 ? 0 : _ref2$triggerConnecti,
    _ref2$closeSignalConn = _ref2.closeSignalConnection,
    closeSignalConnection = _ref2$closeSignalConn === void 0 ? null : _ref2$closeSignalConn,
    _ref2$webRTSPIdleTime = _ref2.webRTSPIdleTimeLimit,
    webRTSPIdleTimeLimit = _ref2$webRTSPIdleTime === void 0 ? 5000 : _ref2$webRTSPIdleTime,
    _ref2$useRTSPToWebCon = _ref2.useRTSPToWebConnection,
    useRTSPToWebConnection = _ref2$useRTSPToWebCon === void 0 ? false : _ref2$useRTSPToWebCon,
    _ref2$enableLogging = _ref2.enableLogging,
    enableLogging = _ref2$enableLogging === void 0 ? false : _ref2$enableLogging,
    _ref2$loadingComponen = _ref2.loadingComponent,
    loadingComponent = _ref2$loadingComponen === void 0 ? null : _ref2$loadingComponen,
    _ref2$errorComponent = _ref2.errorComponent,
    errorComponent = _ref2$errorComponent === void 0 ? null : _ref2$errorComponent,
    _ref2$onWebRTSPStream = _ref2.onWebRTSPStreamPreparation,
    onWebRTSPStreamPreparation = _ref2$onWebRTSPStream === void 0 ? null : _ref2$onWebRTSPStream,
    _ref2$onWebRTSPDiscon = _ref2.onWebRTSPDisconnect,
    onWebRTSPDisconnect = _ref2$onWebRTSPDiscon === void 0 ? null : _ref2$onWebRTSPDiscon,
    _ref2$onWebRTSPStream2 = _ref2.onWebRTSPStreamPlay,
    onWebRTSPStreamPlay = _ref2$onWebRTSPStream2 === void 0 ? null : _ref2$onWebRTSPStream2,
    _ref2$onWebRTSPStream3 = _ref2.onWebRTSPStreaming,
    onWebRTSPStreaming = _ref2$onWebRTSPStream3 === void 0 ? null : _ref2$onWebRTSPStream3,
    _ref2$onWebRTSPConnec = _ref2.onWebRTSPConnect,
    onWebRTSPConnect = _ref2$onWebRTSPConnec === void 0 ? null : _ref2$onWebRTSPConnec,
    _ref2$onWebRTSPIdle = _ref2.onWebRTSPIdle,
    onWebRTSPIdle = _ref2$onWebRTSPIdle === void 0 ? null : _ref2$onWebRTSPIdle,
    _ref2$onWebRTSPLog = _ref2.onWebRTSPLog,
    onWebRTSPLog = _ref2$onWebRTSPLog === void 0 ? null : _ref2$onWebRTSPLog,
    _ref2$height = _ref2.height,
    height = _ref2$height === void 0 ? 1080 : _ref2$height,
    _ref2$width = _ref2.width,
    width = _ref2$width === void 0 ? 1280 : _ref2$width;
  var _useTimeout = useTimeout(),
    schedule = _useTimeout.schedule;
  var _useState = useState(false),
    _useState2 = _slicedToArray(_useState, 2),
    waitingForData = _useState2[0],
    setWaitingForData = _useState2[1];
  var _useState3 = useState(false),
    _useState4 = _slicedToArray(_useState3, 2),
    streamPaused = _useState4[0],
    setStreamPaused = _useState4[1];
  var _useState5 = useState("Connecting"),
    _useState6 = _slicedToArray(_useState5, 2),
    status = _useState6[0],
    setStatus = _useState6[1];
  var _useState7 = useState(false),
    _useState8 = _slicedToArray(_useState7, 2),
    connected = _useState8[0],
    setConnected = _useState8[1];
  var connectionAttempts = useRef(sessionStorage.getItem("WEBRTSPConnectionAttempts") !== null ? parseFloat(sessionStorage.getItem("WEBRTSPConnectionAttempts")) : 0);
  var signalingSocketRef = useRef(null);
  var peerConnectionRef = useRef(null);
  var _useState9 = useState(rtspURL),
    _useState10 = _slicedToArray(_useState9, 2),
    currentRTSPURL = _useState10[0],
    setCurrentRTSPURL = _useState10[1];
  var clientRegistrationProtocol = useRef(null);
  var currentViewObserver = useRef();
  var currentStreamID = useRef(null);
  var currentChannel = useRef(0);
  var playingStream = useRef(false);
  var connecting = useRef(false);
  var videoRef = useRef(null);
  var webRTSPStreaming = useIdleDetection(function () {
    if (streamPaused) {
      log("log", enableLogging, onWebRTSPLog, "WEBRTSP Connection ~ Reconnection prevented; stream paused.");
      return;
    }
    if (connecting.current) {
      log("log", enableLogging, onWebRTSPLog, "WEBRTSP Connection ~ Connection in progress....");
      return;
    }
    if (!connected || preventSignalConnections) {
      schedule(function () {
        if (connected || playingStream.current) {
          return;
        }
        startCountdown();
      }, reconnectionInterval || 2869);
      return;
    }
    if (restartStreamOnIdle && !useRTSPToWebConnection) {
      closeWebRTSPConnection(true);
      sessionStorage.setItem("WEBRTSPConnected", false);
      connecting.current = true;
      setConnected(false);
      log("log", enableLogging, onWebRTSPLog, "WEBRTSP Connection ~ Reconnecting to ".concat(rtspURL, "..."));
      connectToSignalingServer();
    }
    if (restartStreamOnIdle && useRTSPToWebConnection) {
      log("log", enableLogging, onWebRTSPLog, "WEBRTSP Connection ~ ".concat(rtspURL, " unresponsive."));
      sessionStorage.setItem("WEBRTSPConnected", false);
      connecting.current = true;
      setConnected(false);
      if (connectionAttempts.current <= 0) {
        setStatus("Unresponsive");
      }
      schedule(function () {
        startCountdown();
      }, 1269);
    }
    if (onWebRTSPIdle) {
      onWebRTSPIdle(sessionID, status, connected, waitingForData, connectionAttempts);
    }
  }, webRTSPIdleTimeLimit);
  var closeWebRTSPConnection = useCallback( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
    var omitConnectionClosure,
      _args2 = arguments;
    return _regeneratorRuntime.wrap(function _callee2$(_context2) {
      while (1) switch (_context2.prev = _context2.next) {
        case 0:
          omitConnectionClosure = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : false;
          if (!(!omitConnectionClosure && triggerConnectionClosure === 0)) {
            _context2.next = 3;
            break;
          }
          return _context2.abrupt("return");
        case 3:
          clearVideoSRC();
          if (signalingSocketRef.current) {
            signalingSocketRef.current.close();
            signalingSocketRef.current = null;
          }
          closePeerConnection(peerConnectionRef.current);
          log("log", enableLogging, onWebRTSPLog, "WEBRTSP Connection ~ Disconnected from source ~ ".concat(rtspURL, "."));
        case 7:
        case "end":
          return _context2.stop();
      }
    }, _callee2);
  })), [triggerConnectionClosure, closePeerConnection]);
  var updateRetryDisplay = useCallback(function (remainingTime) {
    var connectionT = "".concat(remainingTime.seconds, ":").concat(remainingTime.milliseconds);
    setStatus(connectionAttempts.current >= 30 ? "Retrying connection in ".concat(connectionT, " ~ ").concat(connectionAttempts.current, ": possibly offline") : "Retrying connection in ".concat(connectionT, " ~ ").concat(connectionAttempts.current));
  }, []);
  var onVideoTimeUpdate = useCallback(function (seekEvent) {
    var video = videoRef.current;
    webRTSPStreaming();
    if (video && video.currentTime === 0) {
      setStatus("Preparing");
      if (onWebRTSPStreamPreparation) {
        onWebRTSPStreamPreparation(status, connected, playingStream);
      }
      return;
    }
  }, [videoRef]);
  var _Countdown = Countdown(idleReconnectionInterval, function () {
      if (preventSignalConnections) {
        setStatus("No Signal");
        return;
      }
      connectionAttempts.current += 1;
      if (!useRTSPToWebConnection) {
        connectToSignalingServer();
        return;
      }
      launchRTSPToWebStreams();
    }, updateRetryDisplay),
    remainingTime = _Countdown.remainingTime,
    completed = _Countdown.completed,
    startCountdown = _Countdown.startCountdown,
    stopCountdown = _Countdown.stopCountdown,
    resetCountdown = _Countdown.resetCountdown;
  var connectToSignalingServer = function connectToSignalingServer() {
    if (useRTSPToWebConnection || HUDOperationsUtilityManager.checkOperation("".concat(sessionID, " >> Connecting to WebRTSP session ~ ").concat(rtspURL)) && connected && rtspURL === null || preventSignalConnections) {
      return;
    }
    connecting.current = true;
    var currentUrl = rtspURL;
    setStatus("Connecting");
    if (signalingSocketRef.current) {
      signalingSocketRef.current.close();
    }
    var signalingSocket = new WebSocket(signalURL);
    signalingSocketRef.current = signalingSocket;
    signalingSocket.onopen = function () {
      if (currentUrl !== rtspURL || preventSignalConnections) {
        signalingSocket.close();
        return;
      }
      log("log", enableLogging, onWebRTSPLog, "WEBRTSP Connection ~ Connected to source!");
      connecting.current = false;
      setStatus("Preparing");
      stopCountdown();
      initializePeerConnection();
      if (!clientRegistrationProtocol.current) {
        clientRegistrationProtocol.current = setInterval(function () {
          signalingSocket.send(JSON.stringify({
            type: "register-client",
            sessionID: sessionID,
            rtspURL: rtspURL,
            clientDetails: clientDetails
          }));
        }, 1000);
      }
      if (onWebRTSPConnect) {
        onWebRTSPConnect(sessionID, rtspURL, clientDetails, playingStream);
      }
    };
    signalingSocket.onmessage = /*#__PURE__*/function () {
      var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee8(message) {
        var socketMessageProtocols, data;
        return _regeneratorRuntime.wrap(function _callee8$(_context8) {
          while (1) switch (_context8.prev = _context8.next) {
            case 0:
              socketMessageProtocols = {
                "stream-connection-error": function () {
                  var _streamConnectionError = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(data) {
                    return _regeneratorRuntime.wrap(function _callee3$(_context3) {
                      while (1) switch (_context3.prev = _context3.next) {
                        case 0:
                          setStatus("Connection stalling...Retrying stream...");
                          playingStream.current = false;
                          _context3.next = 4;
                          return Delay(1269);
                        case 4:
                          startCountdown();
                        case 5:
                        case "end":
                          return _context3.stop();
                      }
                    }, _callee3);
                  }));
                  function streamConnectionError(_x9) {
                    return _streamConnectionError.apply(this, arguments);
                  }
                  return streamConnectionError;
                }(),
                "stream-error": function () {
                  var _streamError = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(data) {
                    return _regeneratorRuntime.wrap(function _callee4$(_context4) {
                      while (1) switch (_context4.prev = _context4.next) {
                        case 0:
                          setStatus("Stream encountered an error...Retrying stream...");
                          playingStream.current = false;
                          _context4.next = 4;
                          return Delay(1269);
                        case 4:
                          startCountdown();
                        case 5:
                        case "end":
                          return _context4.stop();
                      }
                    }, _callee4);
                  }));
                  function streamError(_x10) {
                    return _streamError.apply(this, arguments);
                  }
                  return streamError;
                }(),
                "stream-exited": function () {
                  var _streamExited = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5(data) {
                    return _regeneratorRuntime.wrap(function _callee5$(_context5) {
                      while (1) switch (_context5.prev = _context5.next) {
                        case 0:
                          playingStream.current = false;
                          schedule(function () {
                            setStatus("Stream exited");
                          }, 869);
                          schedule(function () {
                            startCountdown();
                          }, 1269);
                        case 3:
                        case "end":
                          return _context5.stop();
                      }
                    }, _callee5);
                  }));
                  function streamExited(_x11) {
                    return _streamExited.apply(this, arguments);
                  }
                  return streamExited;
                }(),
                "client-registration-acknowledged": function clientRegistrationAcknowledged() {
                  if (clientRegistrationProtocol.current) {
                    clearInterval(clientRegistrationProtocol.current);
                    clientRegistrationProtocol.current = null;
                    createAndSendOffer();
                  }
                },
                "candidate": function () {
                  var _candidate = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee6(data) {
                    var candidate;
                    return _regeneratorRuntime.wrap(function _callee6$(_context6) {
                      while (1) switch (_context6.prev = _context6.next) {
                        case 0:
                          log("log", enableLogging, onWebRTSPLog, "WEBRTSP Connection ~ Received ICE candidate!");
                          candidate = new RTCIceCandidate(data.candidate);
                          _context6.next = 4;
                          return peerConnectionRef.current.addIceCandidate(candidate);
                        case 4:
                        case "end":
                          return _context6.stop();
                      }
                    }, _callee6);
                  }));
                  function candidate(_x12) {
                    return _candidate.apply(this, arguments);
                  }
                  return candidate;
                }(),
                "answer": function () {
                  var _answer = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee7(data) {
                    var remoteDesc;
                    return _regeneratorRuntime.wrap(function _callee7$(_context7) {
                      while (1) switch (_context7.prev = _context7.next) {
                        case 0:
                          log("log", enableLogging, onWebRTSPLog, "WEBRTSP Connection ~ Received SDP answer!");
                          setStatus("Preparing");
                          remoteDesc = new RTCSessionDescription(data);
                          _context7.next = 5;
                          return peerConnectionRef.current.setRemoteDescription(remoteDesc);
                        case 5:
                        case "end":
                          return _context7.stop();
                      }
                    }, _callee7);
                  }));
                  function answer(_x13) {
                    return _answer.apply(this, arguments);
                  }
                  return answer;
                }()
              };
              data = JSON.parse(message.data);
              if (data.type && socketMessageProtocols[data.type]) {
                socketMessageProtocols[data.type](data);
              }
            case 3:
            case "end":
              return _context8.stop();
          }
        }, _callee8);
      }));
      return function (_x8) {
        return _ref4.apply(this, arguments);
      };
    }();
    signalingSocket.onerror = function (error) {
      if (preventSignalConnections) {
        signalingSocket.close();
        return;
      }
      log("error", enableLogging, onWebRTSPLog, "WEBRTSP: Error: ", error);
      playingStream.current = false;
      setStatus("error");
      startCountdown();
    };
    signalingSocket.onclose = function () {
      log("log", enableLogging, onWebRTSPLog, "WEBRTSCP Connection ~ Disconnected from source.");
      if (videoRef.current) {
        videoRef.current.srcObject = null;
      }
      playingStream.current = false;
      connecting.current = true;
      if (preventSignalConnections) {
        setStatus("No Signal");
        return;
      }
      setStatus("Connecting");
      setConnected(false);
      if (triggerConnectionClosure === 0) {
        schedule(function () {
          if (!connecting.current || playingStream.current) {
            return;
          }
          startCountdown();
        }, reconnectionInterval || 2869);
      }
      if (onWebRTSPDisconnect) {
        onWebRTSPDisconnect(sessionID, rtspURL, clientDetails);
      }
    };
    connecting.current = true;
    setStatus("loading");
  };
  var createAndSendOffer = useCallback( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee9() {
    var offer;
    return _regeneratorRuntime.wrap(function _callee9$(_context9) {
      while (1) switch (_context9.prev = _context9.next) {
        case 0:
          if (!HUDOperationsUtilityManager.checkOperation("".concat(sessionID, " >> Sending offer to WebRTSP source ~ ").concat(rtspURL))) {
            _context9.next = 2;
            break;
          }
          return _context9.abrupt("return");
        case 2:
          _context9.next = 4;
          return peerConnectionRef.current.createOffer({
            offerToReceiveVideo: true
          });
        case 4:
          offer = _context9.sent;
          _context9.next = 7;
          return peerConnectionRef.current.setLocalDescription(offer);
        case 7:
          try {
            signalingSocketRef.current.send(JSON.stringify({
              type: "offer",
              sdp: peerConnectionRef.current.localDescription.sdp,
              config: {
                clientStreamConfigurations: clientStreamSettings,
                frameHeight: height,
                frameWidth: width,
                clientDetails: clientDetails,
                rtspURL: rtspURL
              }
            }));
          } catch (error) {}
        case 8:
        case "end":
          return _context9.stop();
      }
    }, _callee9);
  })), [rtspURL, height, width]);
  var initializePeerConnection = useCallback(function () {
    if (HUDOperationsUtilityManager.checkOperation("".concat(sessionID, " >> Initializing peer connection in WebRTSP session ~ ").concat(rtspURL))) {
      return;
    }
    var peerConnection = new RTCPeerConnection({
      iceServers: [{
        urls: "stun:stun.l.google.com:19302"
      }]
    });
    peerConnection.ontrack = function (event) {
      log("log", enableLogging, onWebRTSPLog, "WEBRTSP Media ~ Received remote track!");
      var track = event.track;
      setStatus("streaming");
      if (videoRef.current && videoRef.current.srcObject == null) {
        var remoteStream = new MediaStream();
        remoteStream.addTrack(track);
        videoRef.current.srcObject = remoteStream;
      }
    };
    peerConnection.oniceconnectionstatechange = function () {
      log("log", enableLogging, onWebRTSPLog, "Connection state ~ ", peerConnection.iceConnectionState);
    };
    peerConnection.onicecandidate = function (event) {
      if (event.candidate) {
        setStatus("Preparing");
        try {
          signalingSocketRef.current.send(JSON.stringify({
            type: "candidate",
            candidate: event.candidate
          }));
        } catch (error) {}
      }
    };
    peerConnectionRef.current = peerConnection;
  }, [sessionID, rtspURL]);
  var launchRTSPToWebStreams = useCallback( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee10() {
    var streamDetails;
    return _regeneratorRuntime.wrap(function _callee10$(_context10) {
      while (1) switch (_context10.prev = _context10.next) {
        case 0:
          _context10.next = 2;
          return getRTSPToWebStreamDetails(signalURL, streamsURL, signalName, signalID);
        case 2:
          streamDetails = _context10.sent;
          if (!(!streamDetails || !streamDetails[rtspURL])) {
            _context10.next = 6;
            break;
          }
          log("log", enableLogging, onWebRTSPLog, "Stream details not found for ~ ".concat(rtspURL));
          return _context10.abrupt("return");
        case 6:
          _context10.next = 8;
          return closeWebRTSPConnection(true);
        case 8:
          addVideoEvents();
          currentStreamID.current = streamDetails[rtspURL].streamID;
          currentChannel.current = streamDetails[rtspURL].channel;
          _context10.next = 13;
          return startStream(signalURL, streamsURL, streamDetails[rtspURL].streamID, streamDetails[rtspURL].channel, videoRef, peerConnectionRef, startCountdown, stopCountdown, setConnected, connecting, webRTSPStreaming, enableLogging, onWebRTSPLog, function () {
            log("log", enableLogging, onWebRTSPLog, "WEBRTSP ~ Preparing stream ~ ".concat(rtspURL, "."));
            setStatus("Preparing");
            if (onWebRTSPConnect) {
              onWebRTSPConnect(sessionID, rtspURL, clientDetails, streamDetails[rtspURL].streamID, streamDetails[rtspURL].channel, playingStream);
            }
          });
        case 13:
        case "end":
          return _context10.stop();
      }
    }, _callee10);
  })), [signalURL, streamsURL, rtspURL, signalName, signalID, enableLogging]);
  var clearVideoEvents = useCallback(function () {
    if (videoRef.current) {
      videoRef.current.removeEventListener("timeupdate", onVideoTimeUpdate);
      videoRef.current.removeEventListener("playing", onPlaying);
      videoRef.current.removeEventListener("stalled", onStalled);
      videoRef.current.removeEventListener("pause", onPause);
      videoRef.current.removeEventListener("ended", onEnded);
      videoRef.current.removeEventListener("play", onPlay);
    }
  }, [videoRef]);
  var clearVideoSRC = useCallback(function () {
    if (videoRef.current && videoRef.current.srcObject) {
      var oldStream = videoRef.current.srcObject;
      oldStream.getTracks().forEach(function (track) {
        return track.stop();
      });
      videoRef.current.srcObject = null;
      playingStream.current = false;
      if (onWebRTSPStreaming) {
        onWebRTSPStreaming(status, connected, playingStream);
      }
    }
  }, []);
  var addVideoEvents = useCallback(function () {
    if (videoRef.current) {
      videoRef.current.addEventListener("timeupdate", onVideoTimeUpdate);
      videoRef.current.addEventListener("playing", onPlaying);
      videoRef.current.addEventListener("stalled", onStalled);
      videoRef.current.addEventListener("pause", onPause);
      videoRef.current.addEventListener("ended", onEnded);
      videoRef.current.addEventListener("play", onPlay);
    }
  }, []);
  var disconnectStream = useCallback(function () {
    setStreamPaused(true);
    closeWebRTSPConnection(true);
  }, []);
  var resumeStream = useCallback( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee11() {
    return _regeneratorRuntime.wrap(function _callee11$(_context11) {
      while (1) switch (_context11.prev = _context11.next) {
        case 0:
          setStreamPaused(false);
          launchRTSPToWebStreams();
        case 2:
        case "end":
          return _context11.stop();
      }
    }, _callee11);
  })), []);
  var onPlaying = useCallback(function () {
    log("log", enableLogging, onWebRTSPLog, "WEBRTSP: ".concat(rtspURL, " streaming."));
    sessionStorage.setItem("WEBRTSPConnectionAttempts", 0);
    sessionStorage.setItem("WEBRTSPConnected", true);
    connectionAttempts.current = 0;
    playingStream.current = true;
    setStatus("streaming");
    webRTSPStreaming();
    setConnected(true);
    if (onWebRTSPStreaming) {
      onWebRTSPStreaming(status, connected, playingStream);
    }
  }, [setConnected, connectionAttempts]);
  var onStalled = useCallback(function () {
    log("log", enableLogging, onWebRTSPLog, "WEBRTSP: ".concat(rtspURL, " stalling."));
    setStatus("Idle");
    schedule(function () {
      startCountdown();
    }, 1269);
  }, [connectionAttempts]);
  var onPause = useCallback(function () {
    log("log", enableLogging, onWebRTSPLog, "WEBRTSP: ".concat(rtspURL, " idle."));
    setStatus("Idle");
  }, [connectionAttempts]);
  var onEnded = useCallback(function () {
    log("log", enableLogging, onWebRTSPLog, "WEBRTSP: ".concat(rtspURL, " exited."));
    setStatus("Stream exited...");
    schedule(function () {
      startCountdown();
    }, 1269);
  }, [connectionAttempts]);
  var onPlay = useCallback(function () {
    log("log", enableLogging, onWebRTSPLog, "WEBRTSP: ".concat(rtspURL, " starting."));
    setStatus("Connecting");
    webRTSPStreaming();
    if (onWebRTSPStreamPlay) {
      onWebRTSPStreamPlay(status, connected, playingStream);
    }
  }, [setStatus]);
  var checkVisibilityOnLoad = useCallback(function () {
    if (videoRef.current) {
      var rect = videoRef.current.getBoundingClientRect();
      var viewerVisible = rect.top < window.innerHeight && rect.bottom > 0 && rect.left < window.innerWidth && rect.right > 0;
      if (viewerVisible) {
        resumeStream();
        return;
      }
      disconnectStream();
    }
  }, [disconnectStream, resumeStream]);
  var viewerAutoDisconnector = useCallback(function (entries) {
    entries.forEach(function (entry) {
      if (!autoDisconnectsWhenHidden) {
        return;
      }
      if (entry.isIntersecting) {
        resumeStream();
      } else {
        disconnectStream();
      }
    });
  }, [disconnectStream, resumeStream, autoDisconnectsWhenHidden]);
  useEffect(function () {
    if (useRTSPToWebConnection || HUDOperationsUtilityManager.checkOperation("".concat(sessionID, " >> Loading RTSC ~ ").concat(rtspURL)) || preventSignalConnections) {
      return;
    }
    if (closeSignalConnection) {
      closeSignalConnection.current = closeWebRTSPConnection;
    }
    closeWebRTSPConnection(true);
    connectToSignalingServer();
    addVideoEvents();
    return function () {
      closeWebRTSPConnection(true);
      clearVideoEvents();
    };
  }, [signalURL, rtspURL, width, height, useRTSPToWebConnection, preventSignalConnections]);
  useEffect(function () {
    if (!useRTSPToWebConnection || HUDOperationsUtilityManager.checkOperation("".concat(sessionID, " >> Loading RTSC ~ ").concat(rtspURL))) {
      return;
    }
    if (closeSignalConnection) {
      closeSignalConnection.current = closeWebRTSPConnection;
    }
    connecting.current = true;
    setStatus("Connecting");
    launchRTSPToWebStreams();
    return function () {
      closeWebRTSPConnection(true);
      clearVideoEvents();
    };
  }, [useRTSPToWebConnection, signalURL, signalName, signalID, rtspURL, preventSignalConnections]);
  useEffect(function () {
    var _videoRef$current;
    if (!autoDisconnectsWhenHidden) {
      return;
    }
    currentViewObserver.current = new IntersectionObserver(viewerAutoDisconnector, {
      threshold: autoDisconnectThreshold
    });
    var element = (_videoRef$current = videoRef.current) === null || _videoRef$current === void 0 ? void 0 : _videoRef$current.parentElement;
    if (element) {
      currentViewObserver.current.observe(element);
      checkVisibilityOnLoad();
    }
    return function () {
      if (currentViewObserver.current) {
        currentViewObserver.current.disconnect();
      }
    };
  }, [viewerAutoDisconnector, checkVisibilityOnLoad, autoDisconnectsWhenHidden, autoDisconnectThreshold]);
  useEffect(function () {
    if (triggerConnectionClosure === 0) {
      return;
    }
    closeWebRTSPConnection(false);
  }, [triggerConnectionClosure]);
  useEffect(function () {
    if (!preventSignalConnections) {
      return;
    }
    closeWebRTSPConnection(true);
    setStatus("No Signal");
  }, [preventSignalConnections]);
  return /*#__PURE__*/React.createElement("div", _extends({
    style: _objectSpread(_objectSpread({}, styles.container), containerConfigurationSettings)
  }, containerConfigurations), /*#__PURE__*/React.createElement("style", null, keyframes), /*#__PURE__*/React.createElement("div", {
    style: _objectSpread(_objectSpread({}, styles.videoContainer), videoContainerConfigurationSettings)
  }, status !== "streaming" && status !== "error" && status !== "Idle" && status !== "No Signal" && /*#__PURE__*/React.createElement("div", {
    style: _objectSpread(_objectSpread({}, styles.overlay), overlayConfigurationSettings)
  }, /*#__PURE__*/React.createElement("div", {
    style: _objectSpread(_objectSpread({}, styles.actionContainer), actionContainerConfigurationSettings)
  }, loadingComponent ? loadingComponent : /*#__PURE__*/React.createElement("div", {
    style: _objectSpread(_objectSpread({}, styles.loadingSpinner), loadingSpinnerConfigurationSettings)
  }), /*#__PURE__*/React.createElement("div", {
    style: _objectSpread(_objectSpread({}, styles.message), messageConfigurationSettings)
  }, "".concat(status, "...")))), status === "No Signal" && /*#__PURE__*/React.createElement("div", {
    style: _objectSpread(_objectSpread({}, styles.overlay), overlayConfigurationSettings)
  }, /*#__PURE__*/React.createElement("div", {
    style: _objectSpread(_objectSpread({}, styles.actionContainer), actionContainerConfigurationSettings)
  }, loadingComponent ? loadingComponent : /*#__PURE__*/React.createElement("div", {
    style: _objectSpread(_objectSpread({}, styles.loadingSpinner), loadingSpinnerConfigurationSettings)
  }), /*#__PURE__*/React.createElement("div", {
    style: _objectSpread(_objectSpread({}, styles.message), messageConfigurationSettings)
  }, status))), waitingForData && status === "streaming" && /*#__PURE__*/React.createElement("div", {
    style: _objectSpread(_objectSpread({}, styles.overlay), {}, {
      backgroundColor: "rgba(0, 0, 0, 0.169)"
    }, overlayConfigurationSettings)
  }, /*#__PURE__*/React.createElement("div", {
    style: _objectSpread(_objectSpread({}, styles.actionContainer), actionContainerConfigurationSettings)
  }, loadingComponent ? loadingComponent : /*#__PURE__*/React.createElement("div", {
    style: _objectSpread(_objectSpread({}, styles.loadingSpinner), loadingSpinnerConfigurationSettings)
  }), /*#__PURE__*/React.createElement("div", {
    style: _objectSpread(_objectSpread({}, styles.message), messageConfigurationSettings)
  }, "Idle..."))), /*#__PURE__*/React.createElement("video", {
    ref: videoRef,
    style: _objectSpread(_objectSpread(_objectSpread({}, styles.video), videoConfigurationSettings), {}, {
      visibility: status === "streaming" || status === "Idle" || status === "Unresponsive" ? "visible" : "hidden"
    }),
    playsInline: true,
    autoPlay: true,
    muted: true,
    onError: ( /*#__PURE__*/function () {
      var _ref8 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee12(e) {
        return _regeneratorRuntime.wrap(function _callee12$(_context12) {
          while (1) switch (_context12.prev = _context12.next) {
            case 0:
              log("error", enableLogging, onWebRTSPLog, "Video error ~ ".concat(e));
              playingStream.current = false;
              setStatus("error");
            case 3:
            case "end":
              return _context12.stop();
          }
        }, _callee12);
      }));
      return function (_x14) {
        return _ref8.apply(this, arguments);
      };
    }())
  }), status === "error" && /*#__PURE__*/React.createElement("div", {
    style: _objectSpread(_objectSpread({}, styles.overlay), overlayConfigurationSettings)
  }, /*#__PURE__*/React.createElement("div", {
    style: _objectSpread(_objectSpread({}, styles.actionContainer), actionContainerConfigurationSettings)
  }, errorComponent && errorComponent, /*#__PURE__*/React.createElement("div", {
    style: _objectSpread(_objectSpread({}, styles.message), messageConfigurationSettings)
  }, "Error occurred during playback.")))));
}
;
HUDRTSCViewer.propTypes = {
  actionContainerConfigurationSettings: PropTypes.object,
  videoContainerConfigurationSettings: PropTypes.object,
  loadingSpinnerConfigurationSettings: PropTypes.object,
  containerConfigurationSettings: PropTypes.object,
  messageConfigurationSettings: PropTypes.object,
  overlayConfigurationSettings: PropTypes.object,
  videoConfigurationSettings: PropTypes.object,
  signalURL: PropTypes.string,
  rtspURL: PropTypes.string,
  height: PropTypes.string,
  width: PropTypes.string
};
export default HUDRTSCViewer;