UNPKG

@trap_stevo/legendarybuilderproreact-ui

Version:

The legendary UI & utility API that makes your application a legendary application. ~ Created by Steven Compton

293 lines 10.6 kB
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator"; import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray"; import _slicedToArray from "@babel/runtime/helpers/slicedToArray"; import _regeneratorRuntime from "@babel/runtime/regenerator"; import { useEffect, useRef, useState, useCallback } from "react"; import io from "socket.io-client"; import Peer from "simple-peer"; var useHUDCallSession = function useHUDCallSession(serverUrl, roomId, callerID) { var streamSource = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; var customSocketListeners = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; var _useState = useState([]), _useState2 = _slicedToArray(_useState, 2), connectedUserIDs = _useState2[0], setConnectedUserIDs = _useState2[1]; var _useState3 = useState(""), _useState4 = _slicedToArray(_useState3, 2), currentUserID = _useState4[0], setCurrentUserID = _useState4[1]; var _useState5 = useState([]), _useState6 = _slicedToArray(_useState5, 2), peers = _useState6[0], setPeers = _useState6[1]; var userStreamRef = useRef(null); var socketRef = useRef(null); var connectToNewUsers = useCallback(function (users, stream) { users.forEach(function (userID) { if (!peers.some(function (p) { return p.peerID === userID; })) { connectToPeer(userID, stream, true); } }); }, [peers]); var connectToPeer = useCallback(function (userID, stream, initiator) { var incomingSignal = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; setPeers(function (prevPeers) { if (prevPeers.some(function (p) { return p.peerID === userID; })) { console.log(currentUserID + " already connected to: ", userID); return prevPeers; } var peer = new Peer({ initiator: initiator, trickle: false, stream: stream }); if (incomingSignal) { try { peer.signal(incomingSignal); } catch (error) { console.log(error); } } peer.on("signal", function (signal) { try { socketRef.current.emit("sending signal", { userToSignal: userID, signal: signal, senderID: socketRef.current.id }); } catch (error) { console.log(error); } }); peer.on("stream", function (newStream) { console.log("Stream added for: ".concat(userID)); }); peer.on("close", function () { console.log("User connection closed: ", userID); setPeers(function (peers) { return peers.filter(function (p) { return p.peerID !== userID; }); }); }); return [].concat(_toConsumableArray(prevPeers), [{ peerID: userID, peer: peer }]); }); }, []); var removePeer = useCallback(function (peerID) { var peer = peers.find(function (p) { return p.peerID === peerID; }); if (peer) { try { peer.peer.destroy(); } catch (error) { console.log(error); } } setPeers(function (prevPeers) { return prevPeers.filter(function (p) { return p.peerID !== peerID; }); }); setConnectedUserIDs(function (prevIDs) { return prevIDs.filter(function (id) { return id !== peerID; }); }); }, [peers]); var getStreamFromServer = /*#__PURE__*/function () { var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(streamSource) { var response, streamData, pc; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: _context.prev = 0; _context.next = 3; return fetch(streamSource); case 3: response = _context.sent; _context.next = 6; return response.json(); case 6: streamData = _context.sent; pc = new RTCPeerConnection(); _context.next = 10; return pc.setRemoteDescription(new RTCSessionDescription(streamData.sdp)); case 10: pc.onicecandidate = function (event) { if (event.candidate) { pc.addIceCandidate(event.candidate); } }; return _context.abrupt("return", new Promise(function (resolve) { pc.ontrack = function (event) { var _event$streams = _slicedToArray(event.streams, 1), stream = _event$streams[0]; resolve(stream); }; })); case 14: _context.prev = 14; _context.t0 = _context["catch"](0); console.log(_context.t0); case 17: case "end": return _context.stop(); } }, _callee, null, [[0, 14]]); })); return function getStreamFromServer(_x) { return _ref.apply(this, arguments); }; }(); useEffect(function () { function setUpMediaAndSocket() { return _setUpMediaAndSocket.apply(this, arguments); } function _setUpMediaAndSocket() { _setUpMediaAndSocket = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3() { var stream, socket; return _regeneratorRuntime.wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: if (!socketRef.current) { _context3.next = 2; break; } return _context3.abrupt("return"); case 2: console.log("Setting up media and socket: ", peers); stream = null; _context3.prev = 4; if (!streamSource) { _context3.next = 12; break; } _context3.next = 8; return getStreamFromServer(streamSource); case 8: stream = _context3.sent; userStreamRef.current = stream; _context3.next = 17; break; case 12: if (!(streamSource === null || streamSource === undefined)) { _context3.next = 17; break; } _context3.next = 15; return navigator.mediaDevices.getUserMedia({ video: true, audio: true }); case 15: stream = _context3.sent; userStreamRef.current = stream; case 17: _context3.next = 22; break; case 19: _context3.prev = 19; _context3.t0 = _context3["catch"](4); console.log(_context3.t0); case 22: socket = io(serverUrl); socketRef.current = socket; socket.on("connect", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() { return _regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: console.log("Local user id: ", callerID); setCurrentUserID(callerID); socket.emit("join room", roomId, callerID); case 3: case "end": return _context2.stop(); } }, _callee2); }))); socket.on("room joined", function (userID, roomName) { console.log("".concat(userID, " joined ").concat(callerID, " in the room: "), userID); }); socket.on("user joined", function (userID, signal) { console.log("User ".concat(userID, " joined the room: "), roomId); connectToPeer(userID, stream, false, signal); }); socket.on("user left", function (userID) { console.log("User ".concat(userID, " left the room: "), roomId); removePeer(userID); }); socket.on("all users", function (users) { console.log("Other users currently in the room: ", users); var otherUsers = users.filter(function (id) { return id !== currentUserID; }); setConnectedUserIDs(otherUsers); connectToNewUsers(otherUsers, stream); }); socket.on("receiving returned signal", function (_ref3) { var signal = _ref3.signal, id = _ref3.id; var peer = peers.find(function (p) { return p.peerID === id; }); if (peer) { try { peer.peer.signal(signal); } catch (error) { console.log(error); } } }); Object.entries(customSocketListeners).forEach(function (_ref4) { var _ref5 = _slicedToArray(_ref4, 2), event = _ref5[0], handler = _ref5[1]; socket.on(event, handler); }); return _context3.abrupt("return", function () { socket.off("room joined"); socket.off("user joined"); socket.off("all users"); socket.off("user left"); Object.keys(customSocketListeners).forEach(function (event) { socket.off(event); }); socket.disconnect(); }); case 32: case "end": return _context3.stop(); } }, _callee3, null, [[4, 19]]); })); return _setUpMediaAndSocket.apply(this, arguments); } setUpMediaAndSocket(); return function () { if (peers.length > 0) { peers.forEach(function (peer) { try { peer.peer.destroy(); } catch (error) { console.log(error); } }); } }; }, [serverUrl, roomId, callerID, streamSource, customSocketListeners]); return { peers: peers, connectedUserIDs: connectedUserIDs, currentUserID: currentUserID, userStreamRef: userStreamRef }; }; export default useHUDCallSession;