- );
- }
-}
-
-ToolAreaButton.propTypes =
-{
- toolAreaOpen : PropTypes.bool.isRequired,
- toggleToolArea : PropTypes.func.isRequired,
- unread : PropTypes.number.isRequired,
- visible : PropTypes.bool.isRequired
-};
-
-const mapStateToProps = (state) =>
-{
- return {
- toolAreaOpen : state.toolarea.toolAreaOpen,
- visible : state.room.toolbarsVisible,
- unread : state.toolarea.unreadMessages + state.toolarea.unreadFiles
- };
-};
-
-const mapDispatchToProps = (dispatch) =>
-{
- return {
- toggleToolArea : () =>
- {
- dispatch(stateActions.toggleToolArea());
- }
- };
-};
-
-const ToolAreaButtonContainer = connect(
- mapStateToProps,
- mapDispatchToProps
-)(ToolAreaButton);
-
-export default ToolAreaButtonContainer;
diff --git a/app/lib/components/Chat/scrollToBottom.jsx b/app/lib/components/ToolArea/scrollToBottom.jsx
similarity index 100%
rename from app/lib/components/Chat/scrollToBottom.jsx
rename to app/lib/components/ToolArea/scrollToBottom.jsx
diff --git a/app/lib/components/FullScreenView.jsx b/app/lib/components/VideoContainers/FullScreenView.jsx
similarity index 91%
rename from app/lib/components/FullScreenView.jsx
rename to app/lib/components/VideoContainers/FullScreenView.jsx
index f01ce7a..e60f346 100644
--- a/app/lib/components/FullScreenView.jsx
+++ b/app/lib/components/VideoContainers/FullScreenView.jsx
@@ -2,8 +2,8 @@ import React from 'react';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import classnames from 'classnames';
-import * as appPropTypes from './appPropTypes';
-import * as stateActions from '../redux/stateActions';
+import * as appPropTypes from '../appPropTypes';
+import * as stateActions from '../../redux/stateActions';
import FullView from './FullView';
const FullScreenView = (props) =>
@@ -31,12 +31,11 @@ const FullScreenView = (props) =>
return (
- {consumerVisible && !consumer.supported ?
+
- :null
- }
+
-
- {videoProfile === 'none' ?
-
-
-
- :null
- }
);
}
diff --git a/app/lib/components/PeerView.jsx b/app/lib/components/VideoContainers/PeerView.jsx
similarity index 78%
rename from app/lib/components/PeerView.jsx
rename to app/lib/components/VideoContainers/PeerView.jsx
index 4a512a6..c428634 100644
--- a/app/lib/components/PeerView.jsx
+++ b/app/lib/components/VideoContainers/PeerView.jsx
@@ -1,9 +1,8 @@
import React from 'react';
import PropTypes from 'prop-types';
import classnames from 'classnames';
-import Spinner from 'react-spinner';
-import * as appPropTypes from './appPropTypes';
-import EditableInput from './EditableInput';
+import * as appPropTypes from '../appPropTypes';
+import EditableInput from '../Controls/EditableInput';
export default class PeerView extends React.Component
{
@@ -52,51 +51,50 @@ export default class PeerView extends React.Component
return (
- {advancedMode ?
+
- {audioCodec ?
+
{audioCodec}
- :null
- }
+
- {videoCodec ?
+
{videoCodec} {videoProfile}
- :null
- }
+
- {(videoVisible && videoWidth !== null) ?
+
{videoWidth}x{videoHeight}
- :null
- }
+
- :null
- }
+
- {isMe ?
-
onChangeDisplayName(displayName)}
- />
- :
-
- {peer.displayName}
-
- }
+
+
+ onChangeDisplayName(displayName)}
+ />
+
+
+
+ {peer.displayName}
+
+
+
- {advancedMode ?
+
- :null
- }
+
@@ -124,13 +121,6 @@ export default class PeerView extends React.Component
-
- {videoProfile === 'none' ?
-
-
-
- :null
- }
);
}
diff --git a/app/lib/components/ScreenView.jsx b/app/lib/components/VideoContainers/ScreenView.jsx
similarity index 87%
rename from app/lib/components/ScreenView.jsx
rename to app/lib/components/VideoContainers/ScreenView.jsx
index 719c406..72dc031 100644
--- a/app/lib/components/ScreenView.jsx
+++ b/app/lib/components/VideoContainers/ScreenView.jsx
@@ -1,7 +1,6 @@
import React from 'react';
import PropTypes from 'prop-types';
import classnames from 'classnames';
-import Spinner from 'react-spinner';
export default class ScreenView extends React.Component
{
@@ -41,25 +40,21 @@ export default class ScreenView extends React.Component
return (
- {advancedMode ?
+
- {screenVisible ?
+
- {screenCodec ?
+
{screenCodec} {screenProfile}
- :null
- }
+
- {(screenVisible && screenWidth !== null) ?
+
{screenWidth}x{screenHeight}
- :null
- }
+
- :null
- }
+
- :null
- }
+
-
- {screenProfile === 'none' ?
-
-
-
- :null
- }
);
}
diff --git a/app/lib/components/VideoWindow/VideoWindow.jsx b/app/lib/components/VideoWindow/VideoWindow.jsx
index c5a4a56..ce5ab01 100644
--- a/app/lib/components/VideoWindow/VideoWindow.jsx
+++ b/app/lib/components/VideoWindow/VideoWindow.jsx
@@ -4,7 +4,7 @@ import NewWindow from './NewWindow';
import PropTypes from 'prop-types';
import * as appPropTypes from '../appPropTypes';
import * as stateActions from '../../redux/stateActions';
-import FullView from '../FullView';
+import FullView from '../VideoContainers/FullView';
const VideoWindow = (props) =>
{
diff --git a/app/lib/components/appPropTypes.js b/app/lib/components/appPropTypes.js
index 392e854..74b52e3 100644
--- a/app/lib/components/appPropTypes.js
+++ b/app/lib/components/appPropTypes.js
@@ -76,3 +76,16 @@ export const Message = PropTypes.shape(
text : PropTypes.string,
sender : PropTypes.string
});
+
+export const FileEntryProps = PropTypes.shape(
+ {
+ data : PropTypes.shape({
+ name : PropTypes.string.isRequired,
+ picture : PropTypes.string,
+ file : PropTypes.shape({
+ magnet : PropTypes.string.isRequired
+ }).isRequired,
+ me : PropTypes.bool
+ }).isRequired,
+ notify : PropTypes.func.isRequired
+ });
\ No newline at end of file
diff --git a/app/lib/index.jsx b/app/lib/index.jsx
index 1348b09..3fefebe 100644
--- a/app/lib/index.jsx
+++ b/app/lib/index.jsx
@@ -7,8 +7,9 @@ import { getDeviceInfo } from 'mediasoup-client';
import randomString from 'random-string';
import Logger from './Logger';
import * as utils from './utils';
+import RoomClient from './RoomClient';
+import RoomContext from './RoomContext';
import * as cookiesManager from './cookiesManager';
-import * as requestActions from './redux/requestActions';
import * as stateActions from './redux/stateActions';
import Room from './components/Room';
import { loginEnabled } from '../config';
@@ -16,6 +17,10 @@ import { store } from './store';
const logger = new Logger();
+let roomClient;
+
+RoomClient.init({ store });
+
domready(() =>
{
logger.debug('DOM ready');
@@ -93,39 +98,38 @@ function run()
device.version = undefined;
}
- // NOTE: I don't like this.
store.dispatch(
stateActions.setRoomUrl(roomUrl));
- // NOTE: I don't like this.
store.dispatch(
stateActions.setMe({ peerName, displayName, displayNameSet, device, loginEnabled }));
- // NOTE: I don't like this.
- store.dispatch(
- requestActions.joinRoom(
- { roomId, peerName, displayName, device, useSimulcast, produce }));
+ roomClient = new RoomClient(
+ { roomId, peerName, displayName, device, useSimulcast, produce });
render(
-
+
+
+
,
document.getElementById('multiparty-meeting')
);
}
// TODO: Debugging stuff.
+global.CLIENT = roomClient;
setInterval(() =>
{
- if (!global.CLIENT._room.peers[0])
+ if (!roomClient._room.peers[0])
{
delete global.CONSUMER;
return;
}
- const peer = global.CLIENT._room.peers[0];
+ const peer = roomClient._room.peers[0];
global.CONSUMER = peer.consumers[peer.consumers.length - 1];
}, 2000);
@@ -134,20 +138,20 @@ global.sendSdp = function()
{
logger.debug('---------- SEND_TRANSPORT LOCAL SDP OFFER:');
logger.debug(
- global.CLIENT._sendTransport._handler._pc.localDescription.sdp);
+ roomClient._sendTransport._handler._pc.localDescription.sdp);
logger.debug('---------- SEND_TRANSPORT REMOTE SDP ANSWER:');
logger.debug(
- global.CLIENT._sendTransport._handler._pc.remoteDescription.sdp);
+ roomClient._sendTransport._handler._pc.remoteDescription.sdp);
};
global.recvSdp = function()
{
logger.debug('---------- RECV_TRANSPORT REMOTE SDP OFFER:');
logger.debug(
- global.CLIENT._recvTransport._handler._pc.remoteDescription.sdp);
+ roomClient._recvTransport._handler._pc.remoteDescription.sdp);
logger.debug('---------- RECV_TRANSPORT LOCAL SDP ANSWER:');
logger.debug(
- global.CLIENT._recvTransport._handler._pc.localDescription.sdp);
+ roomClient._recvTransport._handler._pc.localDescription.sdp);
};
diff --git a/app/lib/redux/reducers/files.js b/app/lib/redux/reducers/files.js
new file mode 100644
index 0000000..19d5369
--- /dev/null
+++ b/app/lib/redux/reducers/files.js
@@ -0,0 +1,99 @@
+const files = (state = {}, action) =>
+{
+ switch (action.type)
+ {
+ case 'ADD_FILE':
+ {
+ const { file } = action.payload;
+
+ const newFile = {
+ active : false,
+ progress : 0,
+ files : null,
+ me : false,
+ ...file
+ };
+
+ return { ...state, [file.magnetUri]: newFile };
+ }
+
+ case 'ADD_FILE_HISTORY':
+ {
+ const { fileHistory } = action.payload;
+ const newFileHistory = {};
+
+ fileHistory.map((file) =>
+ {
+ const newFile = {
+ active : false,
+ progress : 0,
+ files : null,
+ me : false,
+ ...file
+ };
+
+ newFileHistory[file.magnetUri] = newFile;
+ });
+
+ return { ...state, ...newFileHistory };
+ }
+
+ case 'SET_FILE_ACTIVE':
+ {
+ const { magnetUri } = action.payload;
+ const file = state[magnetUri];
+
+ const newFile = { ...file, active: true };
+
+ return { ...state, [magnetUri]: newFile };
+ }
+
+ case 'SET_FILE_INACTIVE':
+ {
+ const { magnetUri } = action.payload;
+ const file = state[magnetUri];
+
+ const newFile = { ...file, active: false };
+
+ return { ...state, [magnetUri]: newFile };
+ }
+
+ case 'SET_FILE_PROGRESS':
+ {
+ const { magnetUri, progress } = action.payload;
+ const file = state[magnetUri];
+
+ const newFile = { ...file, progress: progress };
+
+ return { ...state, [magnetUri]: newFile };
+ }
+
+ case 'SET_FILE_DONE':
+ {
+ const { magnetUri, sharedFiles } = action.payload;
+ const file = state[magnetUri];
+
+ const newFile = {
+ ...file,
+ files : sharedFiles,
+ progress : 1,
+ active : false,
+ timeout : false
+ };
+
+ return { ...state, [magnetUri]: newFile };
+ }
+
+ case 'REMOVE_FILE':
+ {
+ const { magnetUri } = action.payload;
+
+ return state.filter((file) => file.magnetUri !== magnetUri);
+ }
+
+ default:
+ return state;
+ }
+};
+
+export default files;
diff --git a/app/lib/redux/reducers/index.js b/app/lib/redux/reducers/index.js
index 1f59ace..fcafba6 100644
--- a/app/lib/redux/reducers/index.js
+++ b/app/lib/redux/reducers/index.js
@@ -8,7 +8,7 @@ import notifications from './notifications';
import chatmessages from './chatmessages';
import chatbehavior from './chatbehavior';
import toolarea from './toolarea';
-import sharing from './sharing';
+import files from './files';
const reducers = combineReducers(
{
@@ -21,7 +21,7 @@ const reducers = combineReducers(
chatmessages,
chatbehavior,
toolarea,
- sharing
+ files
});
export default reducers;
diff --git a/app/lib/redux/reducers/notifications.js b/app/lib/redux/reducers/notifications.js
index bf3e6c0..142308e 100644
--- a/app/lib/redux/reducers/notifications.js
+++ b/app/lib/redux/reducers/notifications.js
@@ -1,6 +1,4 @@
-const initialState = [];
-
-const notifications = (state = initialState, action) =>
+const notifications = (state = [], action) =>
{
switch (action.type)
{
diff --git a/app/lib/redux/reducers/room.js b/app/lib/redux/reducers/room.js
index 89d2b21..eed2e8a 100644
--- a/app/lib/redux/reducers/room.js
+++ b/app/lib/redux/reducers/room.js
@@ -3,6 +3,7 @@ const initialState =
url : null,
state : 'new', // new/connecting/connected/disconnected/closed,
activeSpeakerName : null,
+ torrentSupport : false,
showSettings : false,
advancedMode : false,
fullScreenConsumer : null, // ConsumerID
@@ -41,6 +42,13 @@ const room = (state = initialState, action) =>
return { ...state, activeSpeakerName: peerName };
}
+ case 'FILE_SHARING_SUPPORTED':
+ {
+ const { supported } = action.payload;
+
+ return { ...state, torrentSupport: supported };
+ }
+
case 'TOGGLE_SETTINGS':
{
const showSettings = !state.showSettings;
diff --git a/app/lib/redux/requestActions.js b/app/lib/redux/requestActions.js
index d9ba059..ae2db27 100644
--- a/app/lib/redux/requestActions.js
+++ b/app/lib/redux/requestActions.js
@@ -1,233 +1,5 @@
import randomString from 'random-string';
import * as stateActions from './stateActions';
-import
-{
- createNewMessage
-} from './reducers/helper';
-
-export const joinRoom = (
- { roomId, peerName, displayName, device, useSimulcast, produce }) =>
-{
- return {
- type : 'JOIN_ROOM',
- payload : { roomId, peerName, displayName, device, useSimulcast, produce }
- };
-};
-
-export const leaveRoom = () =>
-{
- return {
- type : 'LEAVE_ROOM'
- };
-};
-
-export const changeDisplayName = (displayName) =>
-{
- return {
- type : 'CHANGE_DISPLAY_NAME',
- payload : { displayName }
- };
-};
-
-export const muteMic = () =>
-{
- return {
- type : 'MUTE_MIC'
- };
-};
-
-export const unmuteMic = () =>
-{
- return {
- type : 'UNMUTE_MIC'
- };
-};
-
-export const enableWebcam = () =>
-{
- return {
- type : 'ENABLE_WEBCAM'
- };
-};
-
-export const disableWebcam = () =>
-{
- return {
- type : 'DISABLE_WEBCAM'
- };
-};
-
-export const changeWebcam = (deviceId) =>
-{
- return {
- type : 'CHANGE_WEBCAM',
- payload : { deviceId }
- };
-};
-
-export const changeAudioDevice = (deviceId) =>
-{
- return {
- type : 'CHANGE_AUDIO_DEVICE',
- payload : { deviceId }
- };
-};
-
-export const enableAudioOnly = () =>
-{
- return {
- type : 'ENABLE_AUDIO_ONLY'
- };
-};
-
-export const disableAudioOnly = () =>
-{
- return {
- type : 'DISABLE_AUDIO_ONLY'
- };
-};
-
-export const mutePeerAudio = (peerName) =>
-{
- return {
- type : 'MUTE_PEER_AUDIO',
- payload : { peerName }
- };
-};
-
-export const unmutePeerAudio = (peerName) =>
-{
- return {
- type : 'UNMUTE_PEER_AUDIO',
- payload : { peerName }
- };
-};
-
-export const pausePeerVideo = (peerName) =>
-{
- return {
- type : 'PAUSE_PEER_VIDEO',
- payload : { peerName }
- };
-};
-
-export const resumePeerVideo = (peerName) =>
-{
- return {
- type : 'RESUME_PEER_VIDEO',
- payload : { peerName }
- };
-};
-
-export const pausePeerScreen = (peerName) =>
-{
- return {
- type : 'PAUSE_PEER_SCREEN',
- payload : { peerName }
- };
-};
-
-export const resumePeerScreen = (peerName) =>
-{
- return {
- type : 'RESUME_PEER_SCREEN',
- payload : { peerName }
- };
-};
-
-export const userLogin = () =>
-{
- return {
- type : 'USER_LOGIN'
- };
-};
-
-export const userLogout = () =>
-{
- return {
- type : 'USER_LOGOUT'
- };
-};
-
-export const raiseHand = () =>
-{
- return {
- type : 'RAISE_HAND'
- };
-};
-
-export const lowerHand = () =>
-{
- return {
- type : 'LOWER_HAND'
- };
-};
-
-export const restartIce = () =>
-{
- return {
- type : 'RESTART_ICE'
- };
-};
-
-export const enableScreenSharing = () =>
-{
- return {
- type : 'ENABLE_SCREEN_SHARING'
- };
-};
-
-export const disableScreenSharing = () =>
-{
- return {
- type : 'DISABLE_SCREEN_SHARING'
- };
-};
-
-export const installExtension = () =>
-{
- return {
- type : 'INSTALL_EXTENSION'
- };
-};
-
-export const toggleHand = (enable) =>
-{
- if (enable)
- return {
- type : 'RAISE_HAND'
- };
- else
- return {
- type : 'LOWER_HAND'
- };
-};
-
-export const sendChatMessage = (text, name, picture) =>
-{
- const message = createNewMessage(text, 'response', name, picture);
-
- return {
- type : 'SEND_CHAT_MESSAGE',
- payload : { message }
- };
-};
-
-export const sendFile = (file, name, picture) =>
-{
- return {
- type : 'SEND_FILE',
- payload : { file, name, picture }
- };
-};
-
-export const setSelectedPeer = (selectedPeerName) =>
-{
- return {
- type : 'REQUEST_SELECTED_PEER',
- payload : { selectedPeerName }
- };
-};
// This returns a redux-thunk action (a function).
export const notify = ({ type = 'info', text, timeout }) =>
diff --git a/app/lib/redux/roomClientMiddleware.js b/app/lib/redux/roomClientMiddleware.js
deleted file mode 100644
index 265c8cb..0000000
--- a/app/lib/redux/roomClientMiddleware.js
+++ /dev/null
@@ -1,253 +0,0 @@
-import RoomClient from '../RoomClient';
-
-export default ({ dispatch, getState }) => (next) =>
-{
- let client;
-
- return (action) =>
- {
- switch (action.type)
- {
- case 'JOIN_ROOM':
- {
- const {
- roomId,
- peerName,
- displayName,
- device,
- useSimulcast,
- produce
- } = action.payload;
-
- client = new RoomClient(
- {
- roomId,
- peerName,
- displayName,
- device,
- useSimulcast,
- produce,
- dispatch,
- getState
- });
-
- // TODO: TMP
- global.CLIENT = client;
-
- break;
- }
-
- case 'LEAVE_ROOM':
- {
- client.close();
-
- break;
- }
-
- case 'CHANGE_DISPLAY_NAME':
- {
- const { displayName } = action.payload;
-
- client.changeDisplayName(displayName);
-
- break;
- }
-
- case 'MUTE_MIC':
- {
- client.muteMic();
-
- break;
- }
-
- case 'UNMUTE_MIC':
- {
- client.unmuteMic();
-
- break;
- }
-
- case 'ENABLE_WEBCAM':
- {
- client.enableWebcam();
-
- break;
- }
-
- case 'DISABLE_WEBCAM':
- {
- client.disableWebcam();
-
- break;
- }
-
- case 'CHANGE_WEBCAM':
- {
- const { deviceId } = action.payload;
-
- client.changeWebcam(deviceId);
-
- break;
- }
-
- case 'CHANGE_AUDIO_DEVICE':
- {
- const { deviceId } = action.payload;
-
- client.changeAudioDevice(deviceId);
-
- break;
- }
-
- case 'ENABLE_AUDIO_ONLY':
- {
- client.enableAudioOnly();
-
- break;
- }
-
- case 'DISABLE_AUDIO_ONLY':
- {
- client.disableAudioOnly();
-
- break;
- }
-
- case 'MUTE_PEER_AUDIO':
- {
- const { peerName } = action.payload;
-
- client.mutePeerAudio(peerName);
-
- break;
- }
-
- case 'UNMUTE_PEER_AUDIO':
- {
- const { peerName } = action.payload;
-
- client.unmutePeerAudio(peerName);
-
- break;
- }
-
- case 'PAUSE_PEER_VIDEO':
- {
- const { peerName } = action.payload;
-
- client.pausePeerVideo(peerName);
-
- break;
- }
-
- case 'RESUME_PEER_VIDEO':
- {
- const { peerName } = action.payload;
-
- client.resumePeerVideo(peerName);
-
- break;
- }
-
- case 'PAUSE_PEER_SCREEN':
- {
- const { peerName } = action.payload;
-
- client.pausePeerScreen(peerName);
-
- break;
- }
-
- case 'RESUME_PEER_SCREEN':
- {
- const { peerName } = action.payload;
-
- client.resumePeerScreen(peerName);
-
- break;
- }
-
- case 'RAISE_HAND':
- {
- client.sendRaiseHandState(true);
-
- break;
- }
-
- case 'USER_LOGIN':
- {
- client.login();
-
- break;
- }
-
- case 'USER_LOGOUT':
- {
- client.logout();
-
- break;
- }
-
- case 'LOWER_HAND':
- {
- client.sendRaiseHandState(false);
-
- break;
- }
-
- case 'RESTART_ICE':
- {
- client.restartIce();
-
- break;
- }
-
- case 'ENABLE_SCREEN_SHARING':
- {
- client.enableScreenSharing();
-
- break;
- }
-
- case 'DISABLE_SCREEN_SHARING':
- {
- client.disableScreenSharing();
-
- break;
- }
-
- case 'INSTALL_EXTENSION':
- {
- client.installExtension();
-
- break;
- }
-
- case 'SEND_CHAT_MESSAGE':
- {
- const { message } = action.payload;
-
- client.sendChatMessage(message);
-
- break;
- }
-
- case 'SEND_FILE':
- {
- client.sendFile(action.payload);
- break;
- }
-
- case 'REQUEST_SELECTED_PEER':
- {
- const { selectedPeerName } = action.payload;
-
- client.setSelectedPeer(selectedPeerName);
-
- break;
- }
- }
-
- return next(action);
- };
-};
diff --git a/app/lib/redux/stateActions.js b/app/lib/redux/stateActions.js
index 3ced6b6..a837631 100644
--- a/app/lib/redux/stateActions.js
+++ b/app/lib/redux/stateActions.js
@@ -70,6 +70,14 @@ export const setWebcamDevices = (devices) =>
};
};
+export const setFileSharingSupported = (supported) =>
+{
+ return {
+ type : 'FILE_SHARING_SUPPORTED',
+ payload : { supported }
+ };
+};
+
export const setDisplayName = (displayName) =>
{
return {
@@ -455,11 +463,11 @@ export const dropMessages = () =>
};
};
-export const addFile = (payload) =>
+export const addFile = (file) =>
{
return {
- type : 'ADD_FILE',
- payload
+ type : 'ADD_FILE',
+ payload : { file }
};
};
@@ -471,6 +479,38 @@ export const addFileHistory = (fileHistory) =>
};
};
+export const setFileActive = (magnetUri) =>
+{
+ return {
+ type : 'SET_FILE_ACTIVE',
+ payload : { magnetUri }
+ };
+};
+
+export const setFileInActive = (magnetUri) =>
+{
+ return {
+ type : 'SET_FILE_INACTIVE',
+ payload : { magnetUri }
+ };
+};
+
+export const setFileProgress = (magnetUri, progress) =>
+{
+ return {
+ type : 'SET_FILE_PROGRESS',
+ payload : { magnetUri, progress }
+ };
+};
+
+export const setFileDone = (magnetUri, sharedFiles) =>
+{
+ return {
+ type : 'SET_FILE_DONE',
+ payload : { magnetUri, sharedFiles }
+ };
+};
+
export const setPicture = (picture) =>
({
type : 'SET_PICTURE',
diff --git a/app/lib/store.js b/app/lib/store.js
index f3652f2..8553661 100644
--- a/app/lib/store.js
+++ b/app/lib/store.js
@@ -6,12 +6,10 @@ import {
import thunk from 'redux-thunk';
import { createLogger } from 'redux-logger';
import reducers from './redux/reducers';
-import roomClientMiddleware from './redux/roomClientMiddleware';
const reduxMiddlewares =
[
- thunk,
- roomClientMiddleware
+ thunk
];
if (process.env.NODE_ENV === 'development')
diff --git a/app/package.json b/app/package.json
index 314e8f2..90ee27d 100644
--- a/app/package.json
+++ b/app/package.json
@@ -47,6 +47,7 @@
"@babel/plugin-transform-runtime": "^7.1.0",
"@babel/preset-env": "^7.1.0",
"@babel/preset-react": "^7.0.0",
+ "babel-plugin-jsx-control-statements": "^3.2.8",
"babel-eslint": "^10.0.1",
"babelify": "^10.0.0",
"browser-sync": "^2.26.3",
diff --git a/app/stylus/components/Chat.styl b/app/stylus/components/Chat.styl
index b6a480d..c495496 100644
--- a/app/stylus/components/Chat.styl
+++ b/app/stylus/components/Chat.styl
@@ -23,7 +23,7 @@
}
> .client, > .response {
- background-color: rgba(#000, 0.1);
+ background-color: var(--chat-message-color);
border-radius: 5px;
max-width: 85%;
display: flex;
@@ -70,8 +70,8 @@
[data-component='Sender'] {
display: flex;
- background-color: #fff;
- color: #000;
+ background-color: var(--chat-input-bg-color);
+ color: var(--chat-input-text-color);
flex-shrink: 0;
margin-top: 0.5rem;
height: 3rem;
@@ -84,7 +84,6 @@
margin-right: 1vmin;
border-radius: 0.5vmin;
padding-left: 1vmin;
- color: #000;
&.focus {
outline: none;
@@ -95,8 +94,7 @@
width: 20%;
box-shadow: 0vmin 0vmin 1vmin 0vmin rgba(17,17,17,0.5);
border: 0;
- background-color: #aef;
- color: #000;
+ background-color: var(--chat-send-bg-color);
font-size: 1rem;
border-radius: 0.5vmin;
}
diff --git a/app/stylus/components/FileSharing.styl b/app/stylus/components/FileSharing.styl
index 1bf88fa..9019bdb 100644
--- a/app/stylus/components/FileSharing.styl
+++ b/app/stylus/components/FileSharing.styl
@@ -7,11 +7,15 @@
> .share-file {
cursor: pointer;
width: 100%;
- background: #aef;
+ background: var(--filesharing-bg-color);
padding: 1rem;
border-radius: 1vmin;
box-shadow: 0vmin 0vmin 1vmin 0vmin rgba(17,17,17,0.5);
+ &:hover {
+ opacity: 0.85;
+ }
+
&.disabled {
cursor: not-allowed;
}
diff --git a/app/stylus/components/Filmstrip.styl b/app/stylus/components/Filmstrip.styl
index 5753049..ab92a9f 100644
--- a/app/stylus/components/Filmstrip.styl
+++ b/app/stylus/components/Filmstrip.styl
@@ -63,13 +63,13 @@
&.active {
> .film-content {
- border-color: #FFF;
+ border-color: var(--active-speaker-border-color);
}
}
&.selected {
> .film-content {
- border-color: #377EFF;
+ border-color: var(--selected-peer-border-color);
}
}
}
diff --git a/app/stylus/components/FullView.styl b/app/stylus/components/FullView.styl
index 251a04a..8c5b799 100644
--- a/app/stylus/components/FullView.styl
+++ b/app/stylus/components/FullView.styl
@@ -69,37 +69,4 @@
filter: blur(5px);
}
}
-
- > .spinner-container {
- position: absolute;
- top: 0
- bottom: 0;
- left: 0;
- right: 0;
- background-color: rgba(#000, 0.75);
-
- .react-spinner {
- position: relative;
- width: 48px;
- height: 48px;
- top: 50%;
- left: 50%;
-
- .react-spinner_bar {
- position: absolute;
- width: 20%;
- height: 7.8%;
- top: -3.9%;
- left: -10%;
- animation: PeerView-spinner 1.2s linear infinite;
- border-radius: 5px;
- background-color: rgba(#fff, 0.5);
- }
- }
- }
-}
-
-@keyframes FullView-spinner {
- 0% { opacity: 1; }
- 100% { opacity: 0.15; }
}
diff --git a/app/stylus/components/HiddenPeersView.styl b/app/stylus/components/HiddenPeers.styl
similarity index 53%
rename from app/stylus/components/HiddenPeersView.styl
rename to app/stylus/components/HiddenPeers.styl
index b87ddf0..6ca7ec8 100644
--- a/app/stylus/components/HiddenPeersView.styl
+++ b/app/stylus/components/HiddenPeers.styl
@@ -1,4 +1,4 @@
-[data-component='HiddenPeersView'] {
+[data-component='HiddenPeers'] {
height: 100%;
width: 100%;
display: flex;
@@ -31,6 +31,8 @@
background-position: bottom;
background-size: auto 85%;
background-repeat: no-repeat;
+ border: var(--peer-border);
+ box-shadow: var(--peer-shadow);
text-align: center;
vertical-align: middle;
line-height: 1.8vmin;
@@ -39,55 +41,28 @@
animation: none;
&.pulse {
- animation: pulse 2s;
+ animation: pulse 0.5s;
}
}
.view-container>p{
transform: translate(0%,50%);
}
-
- .view-container,
- .view-container::before,
- .view-container::after {
- /* Add shadow to distinguish sheets from one another */
- box-shadow: 2px 1px 1px rgba(0,0,0,0.15);
- }
-
- .view-container::before,
- .view-container::after {
- content: "";
- position: absolute;
- width: 100%;
- height: 100%;
- background-color: #2a4b58;
- }
-
- /* Second sheet of paper */
- .view-container::before {
- left: .7vmin;
- top: .7vmin;
- z-index: -1;
- }
-
- /* Third sheet of paper */
- .view-container::after {
- left: 1.4vmin;
- top: 1.4vmin;
- z-index: -2;
- }
}
@keyframes pulse {
- 0% {
- box-shadow: 0 0 0 0 rgba(255, 255, 255, 1.0);
+ 0%
+ {
+ transform: scale3d(1, 1, 1);
}
- 70% {
- box-shadow: 0 0 0 10px rgba(255, 255, 255, 0);
+ 50%
+ {
+ transform: scale3d(1.2, 1.2, 1.2);
}
- 100% {
- box-shadow: 0 0 0 0 rgba(255, 255, 255, 0);
+ 100%
+ {
+ transform: scale3d(1, 1, 1);
}
}
diff --git a/app/stylus/components/Logo.styl b/app/stylus/components/Logo.styl
index b52cabc..f34410a 100644
--- a/app/stylus/components/Logo.styl
+++ b/app/stylus/components/Logo.styl
@@ -1,19 +1,18 @@
[data-component='Logo'] {
- position: absolute;
- height: 4%;
- width: 8%;
+ position: absolute;
+ width: var(--logo-width);
+ height: var(--logo-height);
top: 1%;
left: 1%;
z-index: 20;
background-position: left;
background-size: 100%;
background-repeat: no-repeat;
+
+desktop() {
opacity: 1;
}
- +mobile() {
- }
- background-image: url('/resources/images/logo.svg');
+ background-image: var(--logo);
background-size: contain;
}
diff --git a/app/stylus/components/Me.styl b/app/stylus/components/Me.styl
index 2d70e8f..d4b0a26 100644
--- a/app/stylus/components/Me.styl
+++ b/app/stylus/components/Me.styl
@@ -6,8 +6,8 @@
> .view-container {
position: relative;
- width: 20vmin;
- height: 15vmin;
+ width: var(--me-width);
+ height: var(--me-height);
&.webcam {
order: 2;
@@ -23,9 +23,7 @@
right: 0;
top: 0;
display: flex;
- flex-direction:; row;
- justify-content: flex-start;
- align-items: center;
+ flex-direction: row;
padding: 0.4vmin;
opacity: 0;
transition: opacity 0.3s;
@@ -41,41 +39,37 @@
background-position: center;
background-size: 75%;
background-repeat: no-repeat;
- background-color: rgba(#000, 0.5);
+ background-color: var(--media-control-button-color);
cursor: pointer;
opacity: 0;
transition-property: opacity, background-color;
transition-duration: 0.15s;
+ width: var(--media-control-button-size);
+ height: var(--media-control-button-size);
+
+ &:hover {
+ opacity: 1;
+ }
&.visible {
opacity: 0.85;
}
- +desktop() {
- width: 24px;
- height: 24px;
-
- &:hover {
- opacity: 1;
- }
- }
-
- +mobile() {
- width: 22px;
- height: 22px;
- }
-
&.unsupported {
pointer-events: none;
}
&.disabled {
pointer-events: none;
- opacity: 0.5;
+ background-color: var(--media-control-botton-disabled);
}
&.on {
- background-color: rgba(#fff, 0.7);
+ background-color: var(--media-control-botton-on);
+ }
+
+ &.off {
+ background-color: var(--media-control-botton-off);
}
&.mic {
@@ -85,7 +79,6 @@
&.off {
background-image: url('/resources/images/icon_remote_mic_white_off.svg');
- background-color: rgba(#d42241, 0.7);
}
&.unsupported {
@@ -100,33 +93,12 @@
&.off {
background-image: url('/resources/images/icon_remote_webcam_white_off.svg');
- background-color: rgba(#d42241, 0.7);
}
&.unsupported {
background-image: url('/resources/images/icon_webcam_white_unsupported.svg');
}
}
-
- &.screen {
- &.on {
- background-image: url('/resources/images/share-screen-black.svg');
- }
-
- &.off {
- background-image: url('/resources/images/no-share-screen-white.svg');
- background-color: rgba(#d42241, 0.7);
- }
-
- &.unsupported {
- background-image: url('/resources/images/no-share-screen-white.svg');
- }
- }
-
- &.fullscreen {
- background-image: url('/resources/images/icon_fullscreen_black.svg');
- background-color: rgba(#fff, 0.7);
- }
}
}
}
diff --git a/app/stylus/components/Notifications.styl b/app/stylus/components/Notifications.styl
index b247cb7..fcaeded 100644
--- a/app/stylus/components/Notifications.styl
+++ b/app/stylus/components/Notifications.styl
@@ -84,8 +84,8 @@
}
&.info {
- background-color: rgba(#0a1d26, 0.75);
- color: rgba(#fff, 0.65);
+ background-color: var(--notification-info-bg-color);
+ color: var(--notification-info-text-color);
>.icon {
opacity: 0.65;
@@ -94,8 +94,8 @@
}
&.error {
- background-color: rgba(#ff1914, 0.65);
- color: rgba(#fff, 0.85);
+ background-color: var(--notification-error-bg-color);
+ color: var(--notification-error-text-color);
>.icon {
opacity: 0.85;
diff --git a/app/stylus/components/ParticipantList.styl b/app/stylus/components/ParticipantList.styl
index 06ea717..fefa8da 100644
--- a/app/stylus/components/ParticipantList.styl
+++ b/app/stylus/components/ParticipantList.styl
@@ -51,20 +51,12 @@
background-color: rgba(#000, 0.5);
transition-property: opacity, background-color;
transition-duration: 0.15s;
+ width: var(--media-control-button-size);
+ height: var(--media-control-button-size);
+ opacity: 0.85;
- +desktop() {
- width: 24px;
- height: 24px;
- opacity: 0.85;
-
- &:hover {
- opacity: 1;
- }
- }
-
- +mobile() {
- width: 22px;
- height: 22px;
+ &:hover {
+ opacity: 1;
}
&.on {
@@ -102,19 +94,20 @@
position: absolute;
bottom: 0px;
- &.level0 { height: 0; background-color: rgba(#000, 0.8); }
- &.level1 { height: 0.2vh; background-color: rgba(#000, 0.8); }
- &.level2 { height: 0.4vh; background-color: rgba(#000, 0.8); }
- &.level3 { height: 0.6vh; background-color: rgba(#000, 0.8); }
- &.level4 { height: 0.8vh; background-color: rgba(#000, 0.8); }
- &.level5 { height: 1.0vh; background-color: rgba(#000, 0.8); }
- &.level6 { height: 1.2vh; background-color: rgba(#000, 0.8); }
- &.level7 { height: 1.4vh; background-color: rgba(#000, 0.8); }
- &.level8 { height: 1.6vh; background-color: rgba(#000, 0.8); }
- &.level9 { height: 1.8vh; background-color: rgba(#000, 0.8); }
- &.level10 { height: 2.0vh; background-color: rgba(#000, 0.8); }
+ &.level0 { height: 0; }
+ &.level1 { height: 0.2vh; }
+ &.level2 { height: 0.4vh; }
+ &.level3 { height: 0.6vh; }
+ &.level4 { height: 0.8vh; }
+ &.level5 { height: 1.0vh; }
+ &.level6 { height: 1.2vh; }
+ &.level7 { height: 1.4vh; }
+ &.level8 { height: 1.6vh; }
+ &.level9 { height: 1.8vh; }
+ &.level10 { height: 2.0vh; }
}
}
+
> .controls {
float: right;
display: flex;
@@ -133,20 +126,12 @@
cursor: pointer;
transition-property: opacity, background-color;
transition-duration: 0.15s;
+ width: var(--media-control-button-size);
+ height: var(--media-control-button-size);
+ opacity: 0.85;
- +desktop() {
- width: 24px;
- height: 24px;
- opacity: 0.85;
-
- &:hover {
- opacity: 1;
- }
- }
-
- +mobile() {
- width: 22px;
- height: 22px;
+ &:hover {
+ opacity: 1;
}
&.unsupported {
@@ -155,11 +140,15 @@
&.disabled {
pointer-events: none;
- opacity: 0.5;
+ background-color: var(--media-control-botton-disabled);
}
&.on {
- background-color: rgba(#fff, 0.7);
+ background-color: var(--media-control-botton-on);
+ }
+
+ &.off {
+ background-color: var(--media-control-botton-off);
}
&.mic {
@@ -169,7 +158,6 @@
&.off {
background-image: url('/resources/images/icon_remote_mic_white_off.svg');
- background-color: rgba(#d42241, 0.7);
}
&.unsupported {
@@ -184,7 +172,6 @@
&.off {
background-image: url('/resources/images/icon_remote_webcam_white_off.svg');
- background-color: rgba(#d42241, 0.7);
}
&.unsupported {
@@ -199,7 +186,6 @@
&.off {
background-image: url('/resources/images/no-share-screen-white.svg');
- background-color: rgba(#d42241, 0.7);
}
&.unsupported {
@@ -210,16 +196,16 @@
}
> .avatar {
- border-radius: 50%;
- height: 2rem;
+ border-radius: 50%;
+ height: 2rem;
}
> .peer-info {
- font-size: 1rem;
- border: none;
- display: flex;
- padding-left: 0.5rem;
- flex-grow: 1;
- align-items: center;
+ font-size: 1rem;
+ border: none;
+ display: flex;
+ padding-left: 0.5rem;
+ flex-grow: 1;
+ align-items: center;
}
}
diff --git a/app/stylus/components/Peer.styl b/app/stylus/components/Peer.styl
index 9e38042..b90be85 100644
--- a/app/stylus/components/Peer.styl
+++ b/app/stylus/components/Peer.styl
@@ -54,20 +54,12 @@
background-color: rgba(#000, 0.5);
transition-property: opacity, background-color;
transition-duration: 0.15s;
+ width: var(--media-control-button-size);
+ height: var(--media-control-button-size);
+ opacity: 0.85;
- +desktop() {
- width: 24px;
- height: 24px;
- opacity: 0.85;
-
- &:hover {
- opacity: 1;
- }
- }
-
- +mobile() {
- width: 22px;
- height: 22px;
+ &:hover {
+ opacity: 1;
}
&.on {
@@ -107,24 +99,16 @@
background-position: center;
background-size: 75%;
background-repeat: no-repeat;
- background-color: rgba(#000, 0.5);
+ background-color: var(--media-control-button-color);
cursor: pointer;
transition-property: opacity, background-color;
transition-duration: 0.15s;
+ width: var(--media-control-button-size);
+ height: var(--media-control-button-size);
+ opacity: 0.85;
- +desktop() {
- width: 24px;
- height: 24px;
- opacity: 0.85;
-
- &:hover {
- opacity: 1;
- }
- }
-
- +mobile() {
- width: 22px;
- height: 22px;
+ &:hover {
+ opacity: 1;
}
&.unsupported {
@@ -133,11 +117,15 @@
&.disabled {
pointer-events: none;
- opacity: 0.5;
+ background-color: var(--media-control-botton-disabled);
}
&.on {
- background-color: rgba(#fff, 0.7);
+ background-color: var(--media-control-botton-on);
+ }
+
+ &.off {
+ background-color: var(--media-control-botton-off);
}
&.mic {
@@ -147,7 +135,6 @@
&.off {
background-image: url('/resources/images/icon_remote_mic_white_off.svg');
- background-color: rgba(#d42241, 0.7);
}
&.unsupported {
@@ -155,21 +142,6 @@
}
}
- &.webcam {
- &.on {
- background-image: url('/resources/images/icon_webcam_black_on.svg');
- }
-
- &.off {
- background-image: url('/resources/images/icon_remote_webcam_white_off.svg');
- background-color: rgba(#d42241, 0.7);
- }
-
- &.unsupported {
- background-image: url('/resources/images/icon_webcam_white_unsupported.svg');
- }
- }
-
&.screen {
&.on {
background-image: url('/resources/images/share-screen-black.svg');
@@ -177,7 +149,6 @@
&.off {
background-image: url('/resources/images/no-share-screen-white.svg');
- background-color: rgba(#d42241, 0.7);
}
&.unsupported {
@@ -187,12 +158,10 @@
&.fullscreen {
background-image: url('/resources/images/icon_fullscreen_black.svg');
- background-color: rgba(#fff, 0.7);
}
&.newwindow {
background-image: url('/resources/images/icon_new_window_black.svg');
- background-color: rgba(#fff, 0.7);
}
}
}
diff --git a/app/stylus/components/PeerView.styl b/app/stylus/components/PeerView.styl
index 907c7e2..9a02380 100644
--- a/app/stylus/components/PeerView.styl
+++ b/app/stylus/components/PeerView.styl
@@ -6,15 +6,13 @@
display: flex;
flex-direction: column;
overflow: hidden;
- background-color: rgba(#2a4b58, 0.9);
- background-image: url('/resources/images/buddy.svg');
+ background-color: var(--peer-bg-color);
+ background-image: var(--peer-empty-avatar);
background-position: bottom;
background-size: auto 85%;
background-repeat: no-repeat;
> .info {
- $backgroundTint = #000;
-
position: absolute;
z-index: 10;
top: 0.6vmin;
@@ -178,7 +176,7 @@
user-select: none;
transition-property: opacity;
transition-duration: .15s;
- background-color: rgba(#000, 0.75);
+ background-color: var(--peer-video-bg-color);
&.is-me {
transform: scaleX(-1);
@@ -225,37 +223,4 @@
&.level10 { height: 100%; background-color: rgba(#000, 0.65); }
}
}
-
- > .spinner-container {
- position: absolute;
- top: 0
- bottom: 0;
- left: 0;
- right: 0;
- background-color: rgba(#000, 0.75);
-
- .react-spinner {
- position: relative;
- width: 48px;
- height: 48px;
- top: 50%;
- left: 50%;
-
- .react-spinner_bar {
- position: absolute;
- width: 20%;
- height: 7.8%;
- top: -3.9%;
- left: -10%;
- animation: PeerView-spinner 1.2s linear infinite;
- border-radius: 5px;
- background-color: rgba(#fff, 0.5);
- }
- }
- }
-}
-
-@keyframes PeerView-spinner {
- 0% { opacity: 1; }
- 100% { opacity: 0.15; }
}
diff --git a/app/stylus/components/Peers.styl b/app/stylus/components/Peers.styl
index f9283f0..85ee7c3 100644
--- a/app/stylus/components/Peers.styl
+++ b/app/stylus/components/Peers.styl
@@ -31,18 +31,18 @@
+desktop() {
flex: 0 0 auto;
margin: 6px;
- border: 1px solid rgba(#fff, 0.15);
- box-shadow: 0px 5px 12px 2px rgba(#111, 0.5);
+ border: var(--peer-border);
+ box-shadow: var(--peer-shadow);
transition-property: border-color;
transition-duration: 0.15s;
&.active-speaker {
- border-color: #fff;
+ border-color: var(--active-speaker-border-color);
}
&.selected {
> .peer-content {
- border: 1px solid #377eff;
+ border-color: var(--selected-peer-border-color);
}
}
}
diff --git a/app/stylus/components/Room.styl b/app/stylus/components/Room.styl
index 5984bfb..f107704 100644
--- a/app/stylus/components/Room.styl
+++ b/app/stylus/components/Room.styl
@@ -143,24 +143,15 @@
position: fixed;
z-index: 110;
overflow: hidden;
- box-shadow: 0px 5px 12px 2px rgba(#111, 0.5);
+ box-shadow: var(--me-shadow);
transition-property: border-color;
transition-duration: 0.15s;
+ top: 6%;
+ left:1%;
+ border: var(--me-border);
&.active-speaker {
- border-color: #fff;
- }
-
- +desktop() {
- top: 6%;
- left:1%;
- border: 1px solid rgba(#fff, 0.15);
- }
-
- +mobile() {
- top: 6%;
- left: 1%;
- border: 1px solid rgba(#fff, 0.25);
+ border-color: var(--active-speaker-border-color);
}
}
}
diff --git a/app/stylus/components/ScreenView.styl b/app/stylus/components/ScreenView.styl
index 4c4dc66..84a038c 100644
--- a/app/stylus/components/ScreenView.styl
+++ b/app/stylus/components/ScreenView.styl
@@ -6,15 +6,13 @@
display: flex;
flex-direction: column;
overflow: hidden;
- background-color: rgba(#2a4b58, 0.9);
- background-image: url('/resources/images/buddy.svg');
+ background-color: var(--peer-bg-color);
+ background-image: var(--peer-empty-avatar);
background-position: bottom;
background-size: auto 85%;
background-repeat: no-repeat;
> .info {
- $backgroundTint = #000;
-
position: absolute;
z-index: 10;
top: 0.6vmin;
@@ -58,7 +56,7 @@
user-select: none;
transition-property: opacity;
transition-duration: .15s;
- background-color: rgba(#000, 0.75);
+ background-color: var(--peer-video-bg-color);
&.is-me {
transform: scaleX(-1);
@@ -73,37 +71,4 @@
filter: blur(5px);
}
}
-
- > .spinner-container {
- position: absolute;
- top: 0
- bottom: 0;
- left: 0;
- right: 0;
- background-color: rgba(#000, 0.75);
-
- .react-spinner {
- position: relative;
- width: 48px;
- height: 48px;
- top: 50%;
- left: 50%;
-
- .react-spinner_bar {
- position: absolute;
- width: 20%;
- height: 7.8%;
- top: -3.9%;
- left: -10%;
- animation: PeerView-spinner 1.2s linear infinite;
- border-radius: 5px;
- background-color: rgba(#fff, 0.5);
- }
- }
- }
-}
-
-@keyframes ScreenView-spinner {
- 0% { opacity: 1; }
- 100% { opacity: 0.15; }
}
diff --git a/app/stylus/components/Settings.styl b/app/stylus/components/Settings.styl
deleted file mode 100644
index b5f818d..0000000
--- a/app/stylus/components/Settings.styl
+++ /dev/null
@@ -1,3 +0,0 @@
-[data-component='Settings'] {
-
-}
diff --git a/app/stylus/components/Sidebar.styl b/app/stylus/components/Sidebar.styl
index 0c69fa8..145b80f 100644
--- a/app/stylus/components/Sidebar.styl
+++ b/app/stylus/components/Sidebar.styl
@@ -1,8 +1,8 @@
[data-component='Sidebar'] {
position: fixed;
z-index: 500;
- top: calc(50% - 60px);
- height: 120px;
+ top: 50%;
+ transform: translate(0%, -50%);
display: flex;
flex-direction: column;
justify-content: center;
@@ -24,7 +24,7 @@
background-position: center;
background-size: 75%;
background-repeat: no-repeat;
- background-color: rgba(#fff, 0.3);
+ background-color: var(--circle-button-color);
cursor: pointer;
transition-property: opacity, background-color;
transition-duration: 0.15s;
@@ -32,24 +32,20 @@
display: flex;
align-items: center;
justify-content: center;
-
- +desktop() {
- height: 2.5em;
- width: 2.5em;
- }
-
- +mobile() {
- height: 2.5em;
- width: 2.5em;
- }
+ height: var(--circle-button-size);
+ width: var(--circle-button-size);
&.on {
- background-color: rgba(#fff, 0.7);
+ background-color: var(--circle-button-toggled-color);
+ }
+
+ &.unsupported {
+ background-color: var(--circle-button-unsupported-color);
}
&.disabled {
pointer-events: none;
- opacity: 0.5;
+ background-color: var(--circle-button-diabled-color);
}
&.login {
@@ -93,7 +89,6 @@
&.unsupported {
background-image: url('/resources/images/no-share-screen-white.svg');
- background-color: rgba(#d42241, 0.7);
}
&.need-extension {
diff --git a/app/stylus/components/ToolArea.styl b/app/stylus/components/ToolArea.styl
index 9283d42..154802b 100644
--- a/app/stylus/components/ToolArea.styl
+++ b/app/stylus/components/ToolArea.styl
@@ -19,12 +19,6 @@
}
}
-[data-component='ToolAreaButton'] {
- &.on {
- right: 80%;
- }
-}
-
[data-component='ToolArea'] {
&.open {
width: 80%;
@@ -33,35 +27,6 @@
.toolarea-shade.open {
display: block;
}
- > .button {
- background-position: center;
- background-size: 100%;
- background-repeat: no-repeat;
- background-color: rgba(#aef);
- cursor: pointer;
- border-radius: 15%;
- padding: 1px;
-
- +desktop() {
- height: 36px;
- width: 18px;
- }
-
- +mobile() {
- height: 32px;
- width: 16px;
- }
- &.toolarea-close-button {
- background-image: url('/resources/images/arrow_right.svg');
- position: absolute;
- top: 50%;
- left: -22px;
- display: none;
- &.on {
- display: block;
- }
- }
- }
> .toolarea-button {
text-align: center;
@@ -153,12 +118,6 @@
}
@media (min-width: 600px) {
- [data-component='ToolAreaButton'] {
- &.on {
- right: 60%;
- }
- }
-
[data-component='ToolArea'] {
&.open {
width: 60%;
@@ -167,12 +126,6 @@
}
@media (min-width: 900px) {
- [data-component='ToolAreaButton'] {
- &.on {
- right: 40%;
- }
- }
-
[data-component='ToolArea'] {
&.open {
width: 40%;
@@ -181,12 +134,6 @@
}
@media (min-width: 1500px) {
- [data-component='ToolAreaButton'] {
- &.on {
- right: 25%;
- }
- }
-
[data-component='ToolArea'] {
&.open {
width: 25%;
@@ -194,79 +141,6 @@
}
}
-[data-component='ToolAreaButton'] {
- position: absolute;
- z-index: 1020;
- right: 0;
- height: 36px;
- width: 36px;
- margin: 2rem;
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
- transition: right 0.3s;
-
- > .button {
- flex: 0 0 auto;
- margin: 4px 0;
- background-position: center;
- background-size: 75%;
- background-repeat: no-repeat;
- background-color: rgba(#fff, 0.3);
- cursor: pointer;
- transition-property: opacity, background-color;
- transition-duration: 0.15s;
- border-radius: 100%;
-
- +desktop() {
- height: 36px;
- width: 36px;
- }
-
- +mobile() {
- height: 32px;
- width: 32px;
- }
-
- &.on {
- background-color: rgba(#fff, 0.7);
- }
-
- &.disabled {
- pointer-events: none;
- opacity: 0.5;
- }
-
- &.toolarea-button {
- background-image: url('/resources/images/icon_tool_area_white.svg');
-
- &.on {
- background-image: url('/resources/images/icon_tool_area_black.svg');
- }
- }
- }
-
- > .badge {
- border-radius: 50%;
- font-size: 1rem;
- background: #b12525;
- color: #fff;
- text-align: center;
- margin-top: -8px;
- line-height: 1rem;
- margin-right: -8px;
- position: absolute;
- padding: 0.2rem 0.4rem;
- top: 0;
- right: 0;
-
- &.long {
- border-radius: 25% / 50%;
- }
- }
-}
-
[data-component='ToolArea'] {
width: 100%;
height: 100%;
diff --git a/app/stylus/index.styl b/app/stylus/index.styl
index 309fa2b..ad67260 100644
--- a/app/stylus/index.styl
+++ b/app/stylus/index.styl
@@ -7,6 +7,53 @@ global-reset();
@import './reset';
@import './keyframes';
+:root {
+ --logo: url('/resources/images/logo.svg');
+ --logo-width: 8%;
+ --logo-height: 4%;
+
+ --background: url('/resources/images/background.svg');
+ --background-color: rgba(51, 51, 51, 1.0);
+
+ --circle-button-color: rgba(255, 255, 255, 0.3);
+ --circle-button-toggled-color: rgba(255, 255, 255, 0.7);
+ --circle-button-unsupported-color: rgba(212, 34, 65, 0.7);
+ --circle-button-diabled-color: rgba(255, 255, 255, 0.5);
+ --circle-button-size: 2.5em;
+
+ --media-control-button-color: rgba(255, 255, 255, 0.85);
+ --media-control-botton-on: rgba(255, 255, 255, 0.7);
+ --media-control-botton-off: rgba(212, 34, 65, 0.7);
+ --media-control-botton-disabled: rgba(255, 255, 255, 0.5)
+ --media-control-button-size: 1.5em;
+
+ --me-shadow: 0px 5px 12px 2px rgba(17, 17, 17, 0.5);
+ --me-border: 1px solid rgba(255, 255, 255, 0.15);
+ --me-width: 20vmin;
+ --me-height: 15vmin;
+
+ --peer-shadow: 0px 5px 12px 2px rgba(17, 17, 17, 0.5);
+ --peer-border: 1px solid rgba(255, 255, 255, 0.15);
+ --peer-empty-avatar: url('/resources/images/buddy.svg');
+ --peer-bg-color: rgba(42, 75, 88, 0.9);
+ --peer-video-bg-color: rgba(0, 0, 0, 0.75);
+
+ --chat-message-color: rgba(0, 0, 0, 0.1);
+ --chat-input-bg-color: rgba(255, 255, 255, 1.0);
+ --chat-input-text-color: rgba(0, 0, 0, 1.0);
+ --chat-send-bg-color: rgba(170, 238, 255, 1.0);
+
+ --filesharing-bg-color: rgba(170, 238, 255, 1.0);
+
+ --notification-info-bg-color: rgba(10, 29, 38, 0.75);
+ --notification-info-text-color: rgba(255, 255, 255, 0.65);
+ --notification-error-bg-color: rgba(255, 25, 20, 0.65);
+ --notification-error-text-color: rgba(255, 255, 255, 0.85);
+
+ --active-speaker-border-color: rgba(255, 255, 255, 1.0);
+ --selected-peer-border-color: rgba(55, 126, 255, 1.0);
+}
+
html {
height: 100%;
font-family: 'Roboto';
@@ -23,11 +70,11 @@ body {
height: 100%;
overflow-x: hidden;
overflow-y: hidden;
- background-color: #333;
+ background-color: var(--background-color);
+desktop() {
font-size: 16px;
- background-image: url('/resources/images/background.svg');
+ background-image: var(--background);
background-attachment: fixed;
background-position: center;
background-size: cover;
@@ -48,11 +95,10 @@ body {
@import './components/Peers';
@import './components/Peer';
@import './components/PeerView';
-@import './components/HiddenPeersView';
+@import './components/HiddenPeers';
@import './components/ScreenView';
@import './components/Notifications';
@import './components/Chat';
-@import './components/Settings';
@import './components/ToolArea';
@import './components/ParticipantList';
@import './components/FullScreenView';
diff --git a/app/test/DATA.js b/app/test/DATA.js
deleted file mode 100644
index 350584c..0000000
--- a/app/test/DATA.js
+++ /dev/null
@@ -1,401 +0,0 @@
-/* eslint-disable key-spacing */
-
-exports.ROOM_OPTIONS =
-{
- requestTimeout: 10000,
- transportOptions:
- {
- tcp: false
- },
- __turnServers:
- [
- {
- urls: [ 'turn:worker2.versatica.com:3478?transport=udp' ],
- username: 'testuser1',
- credential: 'testpasswd1'
- }
- ],
- hidden: false
-};
-
-exports.ROOM_RTP_CAPABILITIES =
-{
- codecs:
- [
- {
- name: 'PCMA',
- mimeType: 'audio/PCMA',
- kind: 'audio',
- clockRate: 8000,
- preferredPayloadType: 8,
- rtcpFeedback: [],
- parameters: {}
- },
- {
- name: 'opus',
- mimeType: 'audio/opus',
- kind: 'audio',
- clockRate: 48000,
- channels: 2,
- preferredPayloadType: 96,
- rtcpFeedback: [],
- parameters: {}
- },
- {
- name: 'SILK',
- mimeType: 'audio/SILK',
- kind: 'audio',
- clockRate: 16000,
- preferredPayloadType: 97,
- rtcpFeedback: [],
- parameters: {}
- },
- {
- name: 'VP9',
- mimeType: 'video/VP9',
- kind: 'video',
- clockRate: 90000,
- preferredPayloadType: 102,
- rtcpFeedback:
- [
- {
- parameter: '',
- type: 'nack'
- },
- {
- parameter: 'pli',
- type: 'nack'
- },
- {
- parameter: '',
- type: 'goog-remb'
- },
- {
- parameter: 'bar',
- type: 'foo'
- }
- ],
- parameters: {}
- },
- {
- name: 'rtx',
- mimeType: 'video/rtx',
- kind: 'video',
- clockRate: 90000,
- preferredPayloadType: 103,
- rtcpFeedback: [],
- parameters: {
- apt: 102
- }
- },
- {
- name: 'VP8',
- mimeType: 'video/VP8',
- kind: 'video',
- clockRate: 90000,
- preferredPayloadType: 100,
- rtcpFeedback:
- [
- {
- parameter: '',
- type: 'nack'
- },
- {
- parameter: 'pli',
- type: 'nack'
- },
- {
- parameter: '',
- type: 'goog-remb'
- },
- {
- parameter: 'bar',
- type: 'foo'
- }
- ],
- parameters: {}
- },
- {
- name: 'rtx',
- mimeType: 'video/rtx',
- kind: 'video',
- clockRate: 90000,
- preferredPayloadType: 101,
- rtcpFeedback: [],
- parameters: {
- apt: 100
- }
- }
- ],
- headerExtensions: [
- {
- kind: 'audio',
- uri: 'urn:ietf:params:rtp-hdrext:ssrc-audio-level',
- preferredId: 10
- },
- {
- kind: 'video',
- uri: 'http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time',
- preferredId: 11
- },
- {
- kind: 'video',
- uri: 'http://foo.bar',
- preferredId: 12
- }
- ],
- fecMechanisms: []
-};
-
-exports.QUERY_ROOM_RESPONSE =
-{
- rtpCapabilities: exports.ROOM_RTP_CAPABILITIES
-};
-
-exports.JOIN_ROOM_RESPONSE =
-{
- peers:
- [
- {
- name: 'alice',
- appData: 'Alice iPad Pro',
- consumers:
- [
- {
- id: 3333,
- kind: 'audio',
- paused: false,
- appData: 'ALICE_MIC',
- rtpParameters:
- {
- muxId: null,
- codecs:
- [
- {
- name: 'PCMA',
- mimeType: 'audio/PCMA',
- clockRate: 8000,
- payloadType: 8,
- rtcpFeedback: [],
- parameters: {}
- }
- ],
- headerExtensions:
- [
- {
- uri: 'urn:ietf:params:rtp-hdrext:ssrc-audio-level',
- id: 1
- }
- ],
- encodings:
- [
- {
- ssrc: 33333333
- }
- ],
- rtcp:
- {
- cname: 'ALICECNAME',
- reducedSize: true,
- mux: true
- }
- }
- }
- ]
- },
- {
- name: 'bob',
- appData: 'Bob HP Laptop',
- consumers:
- [
- {
- id: 6666,
- kind: 'audio',
- paused: false,
- appData: 'BOB_MIC',
- rtpParameters:
- {
- muxId: null,
- codecs:
- [
- {
- name: 'opus',
- mimeType: 'audio/opus',
- clockRate: 48000,
- channels: 2,
- payloadType: 96,
- rtcpFeedback: [],
- parameters: {}
- }
- ],
- headerExtensions:
- [
- {
- uri: 'urn:ietf:params:rtp-hdrext:ssrc-audio-level',
- id: 1
- }
- ],
- encodings:
- [
- {
- ssrc: 66666666
- }
- ],
- rtcp:
- {
- cname: 'BOBCNAME',
- reducedSize: true,
- mux: true
- }
- }
- }
- ]
- }
- ]
-};
-
-exports.CREATE_TRANSPORT_1_RESPONSE =
-{
- iceParameters:
- {
- usernameFragment: 'server-usernamefragment-12345678',
- password: 'server-password-xxxxxxxx',
- iceLite: true
- },
- iceCandidates:
- [
- {
- foundation: 'F1',
- priority: 1234,
- ip: '1.2.3.4',
- protocol: 'udp',
- port: 9999,
- type: 'host'
- }
- ],
- dtlsParameters:
- {
- fingerprints:
- [
- {
- algorithm: 'sha-256',
- value: 'FF:FF:39:66:A4:E2:66:60:30:18:A7:59:B3:AF:A5:33:58:5E:7F:69:A4:62:A6:D4:EB:9F:B7:42:05:35:FF:FF'
- }
- ],
- role: 'client'
- }
-};
-
-exports.CREATE_TRANSPORT_2_RESPONSE =
-{
- iceParameters:
- {
- usernameFragment: 'server-usernamefragment-12345678',
- password: 'server-password-xxxxxxxx',
- iceLite: true
- },
- iceCandidates:
- [
- {
- foundation: 'F1',
- priority: 1234,
- ip: '1.2.3.4',
- protocol: 'udp',
- port: 9999,
- type: 'host'
- }
- ],
- dtlsParameters:
- {
- fingerprints:
- [
- {
- algorithm: 'sha-256',
- value: 'FF:FF:39:66:A4:E2:66:60:30:18:A7:59:B3:AF:A5:33:58:5E:7F:69:A4:62:A6:D4:EB:9F:B7:42:05:35:FF:FF'
- }
- ],
- role: 'auto'
- }
-};
-
-exports.ALICE_WEBCAM_NEW_CONSUMER_NOTIFICATION =
-{
- method: 'newConsumer',
- notification: true,
- id: 4444,
- peerName: 'alice',
- kind: 'video',
- paused: true,
- appData: 'ALICE_WEBCAM',
- rtpParameters:
- {
- muxId: null,
- codecs:
- [
- {
- name: 'VP8',
- mimeType: 'video/VP8',
- clockRate: 90000,
- payloadType: 100,
- rtcpFeedback:
- [
- {
- parameter: '',
- type: 'nack'
- },
- {
- parameter: 'pli',
- type: 'nack'
- },
- {
- parameter: '',
- type: 'goog-remb'
- },
- {
- parameter: 'bar',
- type: 'foo'
- }
- ],
- parameters: {}
- },
- {
- name: 'rtx',
- mimeType: 'video/rtx',
- clockRate: 90000,
- payloadType: 101,
- rtcpFeedback: [],
- parameters: {
- apt: 100
- }
- }
- ],
- headerExtensions:
- [
- {
- kind: 'video',
- uri: 'http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time',
- id: 11
- },
- {
- kind: 'video',
- uri: 'http://foo.bar',
- id: 12
- }
- ],
- encodings:
- [
- {
- ssrc: 444444441,
- rtx: {
- ssrc: 444444442
- }
- }
- ],
- rtcp:
- {
- cname: 'ALICECNAME',
- reducedSize: true,
- mux: true
- }
- }
-};
diff --git a/app/test/gulpfile.js b/app/test/gulpfile.js
deleted file mode 100644
index fdeca18..0000000
--- a/app/test/gulpfile.js
+++ /dev/null
@@ -1,145 +0,0 @@
-const path = require('path');
-const gulp = require('gulp');
-const gutil = require('gulp-util');
-const plumber = require('gulp-plumber');
-const rename = require('gulp-rename');
-const browserify = require('browserify');
-const watchify = require('watchify');
-const envify = require('envify/custom');
-const source = require('vinyl-source-stream');
-const buffer = require('vinyl-buffer');
-const eslint = require('gulp-eslint');
-const browserSync = require('browser-sync');
-
-const OUTPUT_DIR = 'output';
-const APP_NAME = 'mediasoup-client-test';
-
-// Node environment.
-process.env.NODE_ENV = 'development';
-
-function logError(error)
-{
- gutil.log(gutil.colors.red(error.stack));
-}
-
-gulp.task('lint', () =>
-{
- const src =
- [
- 'gulpfile.js',
- '**/*.js',
- '**/*.jsx'
- ];
-
- return gulp.src(src)
- .pipe(plumber())
- .pipe(eslint())
- .pipe(eslint.format());
-});
-
-gulp.task('html', () =>
-{
- return gulp.src('index.html')
- .pipe(gulp.dest(OUTPUT_DIR));
-});
-
-gulp.task('bundle', () =>
-{
- const watch = true;
-
- let bundler = browserify(
- {
- entries : 'index.jsx',
- extensions : [ '.js', '.jsx' ],
- // required for sourcemaps (must be false otherwise).
- debug : process.env.NODE_ENV === 'development',
- // required for watchify.
- cache : {},
- // required for watchify.
- packageCache : {},
- // required to be true only for watchify.
- fullPaths : watch
- })
- .transform('babelify',
- {
- presets : [ 'es2015', 'es2017', 'react' ],
- plugins :
- [
- 'transform-runtime',
- 'transform-object-assign',
- 'transform-object-rest-spread'
- ]
- })
- .transform(envify(
- {
- NODE_ENV : process.env.NODE_ENV,
- _ : 'purge'
- }));
-
- if (watch)
- {
- bundler = watchify(bundler);
-
- bundler.on('update', () =>
- {
- const start = Date.now();
-
- gutil.log('bundling...');
- rebundle();
- gutil.log('bundle took %sms', (Date.now() - start));
- });
- }
-
- function rebundle()
- {
- return bundler.bundle()
- .on('error', logError)
- .pipe(plumber())
- .pipe(source(`${APP_NAME}.js`))
- .pipe(buffer())
- .pipe(rename(`${APP_NAME}.js`))
- .pipe(gulp.dest(OUTPUT_DIR));
- }
-
- return rebundle();
-});
-
-gulp.task('livebrowser', (done) =>
-{
- browserSync(
- {
- server :
- {
- baseDir : OUTPUT_DIR
- },
- ghostMode : false,
- files : path.join(OUTPUT_DIR, '**', '*')
- });
-
- done();
-});
-
-gulp.task('watch', (done) =>
-{
- // Watch changes in HTML.
- gulp.watch([ 'index.html' ], gulp.series(
- 'html'
- ));
-
- // Watch changes in JS files.
- gulp.watch([ 'gulpfile.js', '**/*.js', '**/*.jsx' ], gulp.series(
- 'lint'
- ));
-
- done();
-});
-
-gulp.task('live', gulp.series(
- 'lint',
- 'html',
- 'bundle',
- 'watch',
- 'livebrowser'
-));
-
-gulp.task('default', gulp.series('live'));
diff --git a/app/test/index.html b/app/test/index.html
deleted file mode 100644
index 7fba1d4..0000000
--- a/app/test/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
mediasoup-client test
-
-
-
-
-
-
-
-
-
mediasoup-client test
-
-
diff --git a/app/test/index.jsx b/app/test/index.jsx
deleted file mode 100644
index 93e46c8..0000000
--- a/app/test/index.jsx
+++ /dev/null
@@ -1,692 +0,0 @@
-import * as mediasoupClient from 'mediasoup-client';
-import domready from 'domready';
-import Logger from '../lib/Logger';
-const DATA = require('./DATA');
-
-window.mediasoupClient = mediasoupClient;
-
-const logger = new Logger();
-
-
-const SEND = true;
-const SEND_AUDIO = true;
-const SEND_VIDEO = false;
-const RECV = true;
-
-
-domready(() =>
-{
- logger.debug('DOM ready');
-
- run();
-});
-
-function run()
-{
- logger.debug('run() [environment:%s]', process.env.NODE_ENV);
-
- let transport1;
- let transport2;
- let audioTrack;
- let videoTrack;
- let audioProducer1;
- let audioProducer2;
- let videoProducer;
-
- logger.debug('calling room = new mediasoupClient.Room()');
-
- // const room = new mediasoupClient.Room();
- const room = new mediasoupClient.Room(DATA.ROOM_OPTIONS);
-
- window.room = room;
-
- room.on('closed', (originator, appData) =>
- {
- logger.warn(
- 'room "closed" event [originator:%s, appData:%o]', originator, appData);
- });
-
- room.on('request', (request, callback, errback) =>
- {
- logger.warn('sending request [method:%s]:%o', request.method, request);
-
- switch (request.method)
- {
- case 'queryRoom':
- {
- setTimeout(() =>
- {
- callback(DATA.QUERY_ROOM_RESPONSE);
- errback('upppps');
- }, 200);
- break;
- }
-
- case 'joinRoom':
- {
- setTimeout(() =>
- {
- callback(DATA.JOIN_ROOM_RESPONSE);
- // errback('upppps');
- }, 200);
- break;
- }
-
- case 'createTransport':
- {
- setTimeout(() =>
- {
- switch (request.appData)
- {
- case 'TRANSPORT_1':
- callback(DATA.CREATE_TRANSPORT_1_RESPONSE);
- break;
- case 'TRANSPORT_2':
- callback(DATA.CREATE_TRANSPORT_2_RESPONSE);
- break;
- default:
- errback('upppps');
- }
- }, 250);
- break;
- }
-
- case 'createProducer':
- {
- setTimeout(() =>
- {
- callback();
- }, 250);
- break;
- }
-
- case 'enableConsumer':
- {
- setTimeout(() =>
- {
- callback();
- }, 500);
- break;
- }
-
- default:
- errback(`NO IDEA ABOUT REQUEST METHOD "${request.method}"`);
- }
- });
-
- room.on('notify', (notification) =>
- {
- logger.warn(
- 'sending notification [method:%s]:%o', notification.method, notification);
-
- switch (notification.method)
- {
- case 'leaveRoom':
- case 'updateTransport':
- case 'closeTransport':
- case 'closeProducer':
- case 'pauseProducer':
- case 'resumeProducer':
- case 'pauseConsumer':
- case 'resumeConsumer':
- break;
-
- default:
- logger.error(`NO IDEA ABOUT NOTIFICATION METHOD "${notification.method}"`);
- }
- });
-
- room.on('newpeer', (peer) =>
- {
- logger.warn('room "newpeer" event [name:"%s", peer:%o]', peer.name, peer);
-
- handlePeer(peer);
- });
-
- Promise.resolve()
- .then(() =>
- {
- logger.debug('calling room.join()');
-
- const deviceInfo = mediasoupClient.getDeviceInfo();
- const appData =
- {
- device : `${deviceInfo.name} ${deviceInfo.version}`
- };
-
- return room.join(null, appData);
- // return room.join(DATA.ROOM_RTP_CAPABILITIES, appData);
- })
- .then((peers) =>
- {
- if (!RECV)
- return;
-
- logger.debug('room.join() succeeded');
-
- logger.debug('calling transport2 = room.createTransport("recv")');
-
- transport2 = room.createTransport('recv', 'TRANSPORT_2');
- window.transport2 = transport2;
- window.pc2 = transport2._handler._pc;
-
- handleTransport(transport2);
-
- for (const peer of peers)
- {
- handlePeer(peer);
- }
- })
- .then(() =>
- {
- if (!SEND)
- return;
-
- if (room.canSend('audio'))
- logger.debug('can send audio');
- else
- logger.warn('cannot send audio');
-
- if (room.canSend('video'))
- logger.debug('can send video');
- else
- logger.warn('cannot send video');
-
- logger.debug('calling transport1 = room.createTransport("send")');
-
- transport1 = room.createTransport('send', 'TRANSPORT_1');
- window.transport1 = transport1;
- window.pc1 = transport1._handler._pc;
-
- handleTransport(transport1);
-
- logger.debug('calling getUserMedia()');
-
- return navigator.mediaDevices
- .getUserMedia({ audio: SEND_AUDIO, video: SEND_VIDEO });
- })
- .then((stream) =>
- {
- if (!SEND)
- return;
-
- audioTrack = stream.getAudioTracks()[0];
- videoTrack = stream.getVideoTracks()[0];
- window.audioTrack = audioTrack;
- window.videoTrack = videoTrack;
- })
- // Add Producers.
- .then(() =>
- {
- if (audioTrack)
- {
- const deviceId = audioTrack.getSettings().deviceId;
-
- logger.debug('calling audioProducer1 = room.createProducer(audioTrack)');
-
- try
- {
- audioProducer1 = room.createProducer(audioTrack, `${deviceId}-1`);
- window.audioProducer1 = audioProducer1;
-
- handleProducer(audioProducer1);
- }
- catch (error)
- {
- logger.error(error);
- }
-
- logger.debug('calling audioProducer2 = room.createProducer(audioTrack)');
-
- try
- {
- audioProducer2 = room.createProducer(audioTrack, `${deviceId}-2`);
- window.audioProducer2 = audioProducer2;
-
- handleProducer(audioProducer2);
- }
- catch (error)
- {
- logger.error(error);
- }
- }
-
- if (videoTrack)
- {
- const deviceId = videoTrack.getSettings().deviceId;
-
- logger.debug('calling videoProducer = room.createProducer(videoTrack)');
-
- try
- {
- videoProducer = room.createProducer(videoTrack, `${deviceId}-1`);
- window.videoProducer = videoProducer;
-
- handleProducer(videoProducer);
- }
- catch (error)
- {
- logger.error(error);
- }
- }
- })
- // Receive notifications.
- .then(() =>
- {
- if (!RECV)
- return;
-
- setTimeout(() =>
- {
- room.receiveNotification(DATA.ALICE_WEBCAM_NEW_CONSUMER_NOTIFICATION);
- }, 2000);
- });
-}
-
-function handleTransport(transport)
-{
- logger.warn(
- 'handleTransport() [direction:%s, appData:"%s", transport:%o]',
- transport.direction, transport.appData, transport);
-
- transport.on('closed', (originator, appData) =>
- {
- logger.warn(
- 'transport "closed" event [originator:%s, appData:%o, transport:%o]',
- originator, appData, transport);
- });
-
- transport.on('connectionstatechange', (state) =>
- {
- logger.warn(
- 'transport "connectionstatechange" event [direction:%s, state:%s, transport:%o]',
- transport.direction, state, transport);
- });
-
- setInterval(() =>
- {
- const queue = transport._commandQueue._queue;
-
- if (queue.length !== 0)
- logger.error('queue not empty [transport:%o, queue:%o]', transport, queue);
- }, 15000);
-}
-
-function handlePeer(peer)
-{
- logger.warn('handlePeer() [name:"%s", peer:%o]', peer.name, peer);
-
- switch (peer.name)
- {
- case 'alice':
- window.alice = peer;
- break;
- case 'bob':
- window.bob = peer;
- break;
- }
-
- for (const consumer of peer.consumers)
- {
- handleConsumer(consumer);
- }
-
- peer.on('closed', (originator, appData) =>
- {
- logger.warn(
- 'peer "closed" event [name:"%s", originator:%s, appData:%o]',
- peer.name, originator, appData);
- });
-
- peer.on('newconsumer', (consumer) =>
- {
- logger.warn(
- 'peer "newconsumer" event [name:"%s", id:%s, consumer:%o]',
- peer.name, consumer.id, consumer);
-
- handleConsumer(consumer);
- });
-}
-
-function handleProducer(producer)
-{
- const transport1 = window.transport1;
-
- logger.debug(
- 'handleProducer() [id:"%s", appData:%o, producer:%o]',
- producer.id, producer.appData, producer);
-
- logger.debug('handleProducer() | calling transport1.send(producer)');
-
- transport1.send(producer)
- .then(() =>
- {
- logger.debug('transport1.send(producer) succeeded');
- })
- .catch((error) =>
- {
- logger.error('transport1.send(producer) failed: %o', error);
- });
-
- producer.on('closed', (originator, appData) =>
- {
- logger.warn(
- 'producer "closed" event [id:%s, originator:%s, appData:%o, producer:%o]',
- producer.id, originator, appData, producer);
- });
-
- producer.on('paused', (originator, appData) =>
- {
- logger.warn(
- 'producer "paused" event [id:%s, originator:%s, appData:%o, producer:%o]',
- producer.id, originator, appData, producer);
- });
-
- producer.on('resumed', (originator, appData) =>
- {
- logger.warn(
- 'producer "resumed" event [id:%s, originator:%s, appData:%o, producer:%o]',
- producer.id, originator, appData, producer);
- });
-
- producer.on('unhandled', () =>
- {
- logger.warn(
- 'producer "unhandled" event [id:%s, producer:%o]', producer.id, producer);
- });
-}
-
-function handleConsumer(consumer)
-{
- const transport2 = window.transport2;
-
- logger.debug(
- 'handleConsumer() [id:"%s", appData:%o, consumer:%o]',
- consumer.id, consumer.appData, consumer);
-
- switch (consumer.appData)
- {
- case 'ALICE_MIC':
- window.aliceAudioConsumer = consumer;
- break;
- case 'ALICE_WEBCAM':
- window.aliceVideoConsumer = consumer;
- break;
- case 'BOB_MIC':
- window.bobAudioConsumer = consumer;
- break;
- }
-
- logger.debug('handleConsumer() calling transport2.receive(consumer)');
-
- transport2.receive(consumer)
- .then((track) =>
- {
- logger.warn(
- 'transport2.receive(consumer) succeeded [track:%o]', track);
- })
- .catch((error) =>
- {
- logger.error('transport2.receive() failed:%o', error);
- });
-
- consumer.on('closed', (originator, appData) =>
- {
- logger.warn(
- 'consumer "closed" event [id:%s, originator:%s, appData:%o, consumer:%o]',
- consumer.id, originator, appData, consumer);
- });
-
- consumer.on('paused', (originator, appData) =>
- {
- logger.warn(
- 'consumer "paused" event [id:%s, originator:%s, appData:%o, consumer:%o]',
- consumer.id, originator, appData, consumer);
- });
-
- consumer.on('resumed', (originator, appData) =>
- {
- logger.warn(
- 'consumer "resumed" event [id:%s, originator:%s, appData:%o, consumer:%o]',
- consumer.id, originator, appData, consumer);
- });
-
- consumer.on('unhandled', () =>
- {
- logger.warn(
- 'consumer "unhandled" event [id:%s, consumer:%o]', consumer.id, consumer);
- });
-}
-
-
-// NOTE: Trigger server notifications.
-
-window.notifyRoomClosed = function()
-{
- const room = window.room;
- const notification =
- {
- method : 'roomClosed',
- notification : true,
- appData : 'ha cascao la room remota!!!'
- };
-
- room.receiveNotification(notification);
-};
-
-window.notifyTransportClosed = function()
-{
- const room = window.room;
- const notification =
- {
- method : 'transportClosed',
- notification : true,
- id : room.transports[0].id,
- appData : 'admin closed your transport'
- };
-
- room.receiveNotification(notification);
-};
-
-window.notifyAudioProducer1Closed = function()
-{
- const room = window.room;
- const notification =
- {
- method : 'producerClosed',
- notification : true,
- id : window.audioProducer1.id,
- appData : 'te paro el micro por la fuerza'
- };
-
- room.receiveNotification(notification);
-};
-
-window.notifyAudioProducer1Paused = function()
-{
- const room = window.room;
- const notification =
- {
- method : 'producerPaused',
- notification : true,
- id : window.audioProducer1.id,
- appData : 'te pause el micro por la fuerza'
- };
-
- room.receiveNotification(notification);
-};
-
-window.notifyAudioProducer1Resumed = function()
-{
- const room = window.room;
- const notification =
- {
- method : 'producerResumed',
- notification : true,
- id : window.audioProducer1.id,
- appData : 'te resumo el micro'
- };
-
- room.receiveNotification(notification);
-};
-
-window.notifyAlicePeerClosed = function()
-{
- const room = window.room;
- const notification =
- {
- method : 'peerClosed',
- notification : true,
- name : 'alice',
- appData : 'peer left'
- };
-
- room.receiveNotification(notification);
-};
-
-window.notifyAliceAudioConsumerClosed = function()
-{
- const room = window.room;
- const notification =
- {
- method : 'consumerClosed',
- notification : true,
- peerName : 'alice',
- id : 3333,
- appData : 'mic broken'
- };
-
- room.receiveNotification(notification);
-};
-
-window.notifyAliceVideoConsumerClosed = function()
-{
- const room = window.room;
- const notification =
- {
- method : 'consumerClosed',
- notification : true,
- peerName : 'alice',
- id : 4444,
- appData : 'webcam broken'
- };
-
- room.receiveNotification(notification);
-};
-
-window.notifyAliceVideoConsumerPaused = function()
-{
- const room = window.room;
- const notification =
- {
- method : 'consumerPaused',
- notification : true,
- peerName : 'alice',
- id : 4444,
- appData : 'webcam paused'
- };
-
- room.receiveNotification(notification);
-};
-
-window.notifyAliceVideoConsumerResumed = function()
-{
- const room = window.room;
- const notification =
- {
- method : 'consumerResumed',
- notification : true,
- peerName : 'alice',
- id : 4444,
- appData : 'webcam resumed'
- };
-
- room.receiveNotification(notification);
-};
-
-
-// NOTE: Test pause/resume.
-
-window.testPauseResume = function()
-{
- logger.debug('testPauseResume() with audioProducer1');
-
- const producer = window.audioProducer1;
-
- // producer.once('paused', () =>
- // {
- // producer.resume('I RESUME TO FUACK!!!');
- // });
-
- logger.debug('testPauseResume() | (1) calling producer.pause()');
-
- if (producer.pause('I PAUSE (1)'))
- {
- logger.warn(
- 'testPauseResume() | (1) producer.pause() succeeded [locallyPaused:%s]',
- producer.locallyPaused);
- }
- else
- {
- logger.error(
- 'testPauseResume() | (1) producer.pause() failed [locallyPaused:%s]',
- producer.locallyPaused);
- }
-
- logger.debug('testPauseResume() | (2) calling producer.pause()');
-
- if (producer.pause('I PAUSE (2)'))
- {
- logger.warn(
- 'testPauseResume() | (2) producer.pause() succeeded [locallyPaused:%s]',
- producer.locallyPaused);
- }
- else
- {
- logger.error(
- 'testPauseResume() | (2) producer.pause() failed [locallyPaused:%s]',
- producer.locallyPaused);
- }
-
- logger.debug('testPauseResume() | (3) calling producer.resume()');
-
- if (producer.resume('I RESUME (3)'))
- {
- logger.warn(
- 'testPauseResume() | (3) producer.resume() succeeded [locallyPaused:%s]',
- producer.locallyPaused);
- }
- else
- {
- logger.error(
- 'testPauseResume() | (3) producer.resume() failed [locallyPaused:%s]',
- producer.locallyPaused);
- }
-};
-
-
-// NOTE: For debugging.
-
-window.dump1 = function()
-{
- const transport1 = window.transport1;
- const pc1 = transport1._handler._pc;
-
- if (pc1 && pc1.localDescription)
- logger.warn('PC1 SEND LOCAL OFFER:\n%s', pc1.localDescription.sdp);
-
- if (pc1 && pc1.remoteDescription)
- logger.warn('PC1 SEND REMOTE ANSWER:\n%s', pc1.remoteDescription.sdp);
-};
-
-window.dump2 = function()
-{
- const transport2 = window.transport2;
- const pc2 = transport2._handler._pc;
-
- if (pc2 && pc2.remoteDescription)
- logger.warn('PC2 RECV REMOTE OFFER:\n%s', pc2.remoteDescription.sdp);
-
- if (pc2 && pc2.localDescription)
- logger.warn('PC2 RECV LOCAL ANSWER:\n%s', pc2.localDescription.sdp);
-};
diff --git a/app/test/output/index.html b/app/test/output/index.html
deleted file mode 100644
index 7fba1d4..0000000
--- a/app/test/output/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
mediasoup-client test
-
-
-
-
-
-
-
-
-
mediasoup-client test
-
-
diff --git a/app/test/output/mediasoup-client-test.js b/app/test/output/mediasoup-client-test.js
deleted file mode 100644
index d50e1fb..0000000
--- a/app/test/output/mediasoup-client-test.js
+++ /dev/null
@@ -1,14243 +0,0 @@
-(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o
}
- _this._queue = [];
- return _this;
- }
-
- (0, _createClass3.default)(CommandQueue, [{
- key: 'close',
- value: function close() {
- this._closed = true;
- }
- }, {
- key: 'push',
- value: function push(method, data) {
- var _this2 = this;
-
- var command = (0, _extends3.default)({ method: method }, data);
-
- logger.debug('push() [method:%s]', method);
-
- return new _promise2.default(function (resolve, reject) {
- var queue = _this2._queue;
-
- command.resolve = resolve;
- command.reject = reject;
-
- // Append command to the queue.
- queue.push(command);
- _this2._handlePendingCommands();
- });
- }
- }, {
- key: '_handlePendingCommands',
- value: function _handlePendingCommands() {
- var _this3 = this;
-
- if (this._busy) return;
-
- var queue = this._queue;
-
- // Take the first command.
- var command = queue[0];
-
- if (!command) return;
-
- this._busy = true;
-
- // Execute it.
- this._handleCommand(command).then(function () {
- _this3._busy = false;
-
- // Remove the first command (the completed one) from the queue.
- queue.shift();
-
- // And continue.
- _this3._handlePendingCommands();
- });
- }
- }, {
- key: '_handleCommand',
- value: function _handleCommand(command) {
- var _this4 = this;
-
- logger.debug('_handleCommand() [method:%s]', command.method);
-
- if (this._closed) {
- command.reject(new _errors.InvalidStateError('closed'));
-
- return _promise2.default.resolve();
- }
-
- var promiseHolder = { promise: null };
-
- this.emit('exec', command, promiseHolder);
-
- return _promise2.default.resolve().then(function () {
- return promiseHolder.promise;
- }).then(function (result) {
- logger.debug('_handleCommand() | command succeeded [method:%s]', command.method);
-
- if (_this4._closed) {
- command.reject(new _errors.InvalidStateError('closed'));
-
- return;
- }
-
- // Resolve the command with the given result (if any).
- command.resolve(result);
- }).catch(function (error) {
- logger.error('_handleCommand() | command failed [method:%s]: %o', command.method, error);
-
- // Reject the command with the error.
- command.reject(error);
- });
- }
- }]);
- return CommandQueue;
-}(_events.EventEmitter);
-
-exports.default = CommandQueue;
-
-},{"./Logger":"/Users/ibc/src/mediasoup-client/lib/Logger.js","./errors":"/Users/ibc/src/mediasoup-client/lib/errors.js","babel-runtime/core-js/object/get-prototype-of":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/object/get-prototype-of.js","babel-runtime/core-js/promise":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/promise.js","babel-runtime/helpers/classCallCheck":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/classCallCheck.js","babel-runtime/helpers/createClass":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/createClass.js","babel-runtime/helpers/extends":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/extends.js","babel-runtime/helpers/inherits":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/inherits.js","babel-runtime/helpers/possibleConstructorReturn":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/possibleConstructorReturn.js","events":"/Users/ibc/src/mediasoup-demo-2/app/node_modules/events/events.js"}],"/Users/ibc/src/mediasoup-client/lib/Consumer.js":[function(require,module,exports){
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-
-var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
-
-var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
-
-var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
-
-var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
-
-var _createClass2 = require('babel-runtime/helpers/createClass');
-
-var _createClass3 = _interopRequireDefault(_createClass2);
-
-var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
-
-var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
-
-var _inherits2 = require('babel-runtime/helpers/inherits');
-
-var _inherits3 = _interopRequireDefault(_inherits2);
-
-var _Logger = require('./Logger');
-
-var _Logger2 = _interopRequireDefault(_Logger);
-
-var _EnhancedEventEmitter2 = require('./EnhancedEventEmitter');
-
-var _EnhancedEventEmitter3 = _interopRequireDefault(_EnhancedEventEmitter2);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var logger = new _Logger2.default('Consumer');
-
-var Consumer = function (_EnhancedEventEmitter) {
- (0, _inherits3.default)(Consumer, _EnhancedEventEmitter);
-
- /**
- * @private
- *
- * @emits {originator: String, [appData]: Any} paused
- * @emits {originator: String, [appData]: Any} resumed
- * @emits unhandled
- * @emits {originator: String, [appData]: Any} closed
- *
- * @emits {[appData]: Any} @pause
- * @emits {[appData]: Any} @resume
- * @emits {originator: String} @close
- */
- function Consumer(id, kind, rtpParameters, peer, appData) {
- (0, _classCallCheck3.default)(this, Consumer);
-
- // Id.
- // @type {Number}
- var _this = (0, _possibleConstructorReturn3.default)(this, (Consumer.__proto__ || (0, _getPrototypeOf2.default)(Consumer)).call(this));
-
- _this._id = id;
-
- // Closed flag.
- // @type {Boolean}
- _this._closed = false;
-
- // Media kind.
- // @type {String}
- _this._kind = kind;
-
- // RTP parameters.
- // @type {RTCRtpParameters}
- _this._rtpParameters = rtpParameters;
-
- // Associated Peer.
- // @type {Peer}
- _this._peer = peer;
-
- // App custom data.
- // @type {Any}
- _this._appData = appData;
-
- // Whether we can receive this Consumer (based on our RTP capabilities).
- // @type {Boolean}
- _this._supported = false;
-
- // Whether this Consumer is being handled by a Transport.
- // @type {Boolean}
- _this._handled = false;
-
- // Remote track.
- // @type {MediaStreamTrack}
- _this._track = null;
-
- // Locally paused flag.
- // @type {Boolean}
- _this._locallyPaused = false;
-
- // Remotely paused flag.
- // @type {Boolean}
- _this._remotelyPaused = false;
- return _this;
- }
-
- /**
- * Class name.
- *
- * @return {String}
- */
-
-
- (0, _createClass3.default)(Consumer, [{
- key: 'close',
-
-
- /**
- * Closes the Consumer.
- * This is called when the local Room is closed.
- *
- * @private
- */
- value: function close() {
- logger.debug('close()');
-
- if (this._closed) return;
-
- this._closed = true;
-
- this.emit('@close', 'local');
- this.safeEmit('closed', 'local');
-
- this._destroy();
- }
-
- /**
- * My remote Consumer was closed.
- * Invoked via remote notification.
- *
- * @private
- *
- * @param {Any} [appData] - App custom data.
- */
-
- }, {
- key: 'remoteClose',
- value: function remoteClose(appData) {
- logger.debug('remoteClose()');
-
- if (this._closed) return;
-
- this._closed = true;
-
- this.emit('@close', 'remote');
- this.safeEmit('closed', 'remote', appData);
-
- this._destroy();
- }
- }, {
- key: '_destroy',
- value: function _destroy() {
- this._handled = false;
-
- try {
- this._track.stop();
- } catch (error) {}
-
- this._track = null;
- }
-
- /**
- * Pauses receiving media.
- *
- * @param {Any} [appData] - App custom data.
- *
- * @return {Boolean} true if paused.
- */
-
- }, {
- key: 'pause',
- value: function pause(appData) {
- logger.debug('pause()');
-
- if (this._closed) {
- logger.error('pause() | Consumer closed');
-
- return false;
- } else if (!this._handled) {
- logger.error('pause() | Consumer not handled');
-
- return false;
- } else if (this._locallyPaused) {
- return true;
- }
-
- this._locallyPaused = true;
- this._track.enabled = false;
-
- this.emit('@pause', appData);
-
- if (!this._remotelyPaused) this.safeEmit('paused', 'local', appData);
-
- // Return true if really paused.
- return this.paused;
- }
-
- /**
- * My remote Consumer was paused.
- * Invoked via remote notification.
- *
- * @private
- *
- * @param {Any} [appData] - App custom data.
- */
-
- }, {
- key: 'remotePause',
- value: function remotePause(appData) {
- logger.debug('remotePause()');
-
- if (this._closed || this._remotelyPaused) return;
-
- this._remotelyPaused = true;
-
- if (this._track) this._track.enabled = false;
-
- if (!this._locallyPaused) this.safeEmit('paused', 'remote', appData);
- }
-
- /**
- * Resumes receiving media.
- *
- * @param {Any} [appData] - App custom data.
- *
- * @return {Boolean} true if not paused.
- */
-
- }, {
- key: 'resume',
- value: function resume(appData) {
- logger.debug('resume()');
-
- if (this._closed) {
- logger.error('resume() | Consumer closed');
-
- return false;
- } else if (!this._handled) {
- logger.error('pause() | Consumer not handled');
-
- return false;
- } else if (!this._locallyPaused) {
- return true;
- }
-
- this._locallyPaused = false;
-
- this.emit('@resume', appData);
-
- if (!this._remotelyPaused) {
- this._track.enabled = true;
-
- this.safeEmit('resumed', 'local', appData);
- }
-
- // Return true if not paused.
- return !this.paused;
- }
-
- /**
- * My remote Consumer was resumed.
- * Invoked via remote notification.
- *
- * @private
- *
- * @param {Any} [appData] - App custom data.
- */
-
- }, {
- key: 'remoteResume',
- value: function remoteResume(appData) {
- logger.debug('remoteResume()');
-
- if (this._closed || !this._remotelyPaused) return;
-
- this._remotelyPaused = false;
-
- if (!this._locallyPaused) {
- if (this._track) this._track.enabled = false;
-
- this.safeEmit('resumed', 'remote', appData);
- }
- }
-
- /**
- * Mark this Consumer as suitable for reception or not.
- *
- * @private
- *
- * @param {Boolean} flag
- */
-
- }, {
- key: 'setSupported',
- value: function setSupported(flag) {
- this._supported = flag;
- }
-
- /**
- * Set this Consumer as handled or unhandled by a Transport.
- *
- * @private
- *
- * @param {Boolean|String} flag - If 'tmp' (String) it's considered as termporal.
- * @param {track} MediaStreamTrack
- */
-
- }, {
- key: 'setHandled',
- value: function setHandled(flag, track) {
- if (this._closed) return;
-
- var previous = this._handled;
-
- this._handled = flag;
- this._track = track || null;
-
- if (track && this.paused) this._track.enabled = false;
-
- if (flag === false || flag === 'tmp') {
- try {
- this._track.stop();
- } catch (error) {}
-
- this._track = null;
- }
-
- if (previous === true && flag === false) this.safeEmit('unhandled');
- }
- }, {
- key: 'klass',
- get: function get() {
- return 'Consumer';
- }
-
- /**
- * Consumer id.
- *
- * @return {Number}
- */
-
- }, {
- key: 'id',
- get: function get() {
- return this._id;
- }
-
- /**
- * Whether the Consumer is closed.
- *
- * @return {Boolean}
- */
-
- }, {
- key: 'closed',
- get: function get() {
- return this._closed;
- }
-
- /**
- * Media kind.
- *
- * @return {String}
- */
-
- }, {
- key: 'kind',
- get: function get() {
- return this._kind;
- }
-
- /**
- * RTP parameters.
- *
- * @return {RTCRtpParameters}
- */
-
- }, {
- key: 'rtpParameters',
- get: function get() {
- return this._rtpParameters;
- }
-
- /**
- * Associated Peer.
- *
- * @return {Peer}
- */
-
- }, {
- key: 'peer',
- get: function get() {
- return this._peer;
- }
-
- /**
- * App custom data.
- *
- * @return {Any}
- */
-
- }, {
- key: 'appData',
- get: function get() {
- return this._appData;
- }
-
- /**
- * Whether we can receive this Consumer (based on our RTP capabilities).
- *
- * @return {Boolean}
- */
-
- }, {
- key: 'supported',
- get: function get() {
- return this._supported;
- }
-
- /**
- * Whether this is being handled by a Transport.
- *
- * @return {Boolean}
- */
-
- }, {
- key: 'handled',
- get: function get() {
- return Boolean(this._handled);
- }
-
- /**
- * The associated track (if any yet).
- *
- * @return {MediaStreamTrack|Null}
- */
-
- }, {
- key: 'track',
- get: function get() {
- return this._track;
- }
-
- /**
- * Whether the Consumer is locally paused.
- *
- * @return {Boolean}
- */
-
- }, {
- key: 'locallyPaused',
- get: function get() {
- return this._locallyPaused;
- }
-
- /**
- * Whether the Consumer is remotely paused.
- *
- * @return {Boolean}
- */
-
- }, {
- key: 'remotelyPaused',
- get: function get() {
- return this._remotelyPaused;
- }
-
- /**
- * Whether the Consumer is paused.
- *
- * @return {Boolean}
- */
-
- }, {
- key: 'paused',
- get: function get() {
- return this._locallyPaused || this._remotelyPaused;
- }
-
- /**
- * Whether the Consumer is actually receiving media.
- *
- * @return {Boolean}
- */
-
- }, {
- key: 'active',
- get: function get() {
- return !this._closed && this.handled === true && !this.paused;
- }
- }]);
- return Consumer;
-}(_EnhancedEventEmitter3.default);
-
-exports.default = Consumer;
-
-},{"./EnhancedEventEmitter":"/Users/ibc/src/mediasoup-client/lib/EnhancedEventEmitter.js","./Logger":"/Users/ibc/src/mediasoup-client/lib/Logger.js","babel-runtime/core-js/object/get-prototype-of":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/object/get-prototype-of.js","babel-runtime/helpers/classCallCheck":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/classCallCheck.js","babel-runtime/helpers/createClass":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/createClass.js","babel-runtime/helpers/inherits":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/inherits.js","babel-runtime/helpers/possibleConstructorReturn":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/possibleConstructorReturn.js"}],"/Users/ibc/src/mediasoup-client/lib/Device.js":[function(require,module,exports){
-(function (global){
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-
-var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
-
-var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
-
-var _createClass2 = require('babel-runtime/helpers/createClass');
-
-var _createClass3 = _interopRequireDefault(_createClass2);
-
-var _bowser = require('bowser');
-
-var _bowser2 = _interopRequireDefault(_bowser);
-
-var _Logger = require('./Logger');
-
-var _Logger2 = _interopRequireDefault(_Logger);
-
-var _Chrome = require('./handlers/Chrome55');
-
-var _Chrome2 = _interopRequireDefault(_Chrome);
-
-var _Safari = require('./handlers/Safari11');
-
-var _Safari2 = _interopRequireDefault(_Safari);
-
-var _Firefox = require('./handlers/Firefox50');
-
-var _Firefox2 = _interopRequireDefault(_Firefox);
-
-var _Edge = require('./handlers/Edge11');
-
-var _Edge2 = _interopRequireDefault(_Edge);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var logger = new _Logger2.default('Device');
-
-/**
- * Class with static members representing the underlying device or browser.
- */
-
-var Device = function () {
- function Device() {
- (0, _classCallCheck3.default)(this, Device);
- }
-
- (0, _createClass3.default)(Device, null, [{
- key: 'isSupported',
-
-
- /**
- * Whether this device is supported.
- *
- * @return {Boolean}
- */
- value: function isSupported() {
- if (!Device._detected) Device._detect();
-
- return Boolean(Device._handlerClass);
- }
-
- /**
- * Returns a suitable WebRTC handler class.
- *
- * @type {Class}
- */
-
- }, {
- key: '_detect',
-
-
- /**
- * Detects the current device/browser.
- *
- * @private
- */
- value: function _detect() {
- var ua = global.navigator.userAgent;
- var browser = _bowser2.default._detect(ua);
-
- Device._detected = true;
- Device._name = browser.name || 'unknown device';
- Device._version = browser.version || 'unknown vesion';
- Device._handlerClass = null;
-
- // Chrome, Chromium, Opera (desktop and mobile).
- if (_bowser2.default.check({ chrome: '55', chromium: '55', opera: '44' }, true, ua)) {
- Device._handlerClass = _Chrome2.default;
- }
- // Safari (desktop and mobile).
- else if (_bowser2.default.check({ safari: '11' }, true, ua)) {
- Device._handlerClass = _Safari2.default;
- }
- // Firefox (desktop and mobile).
- else if (_bowser2.default.check({ firefox: '50' }, true, ua)) {
- Device._handlerClass = _Firefox2.default;
- }
- // Edge (desktop).
- else if (_bowser2.default.check({ msedge: '11' }, true, ua)) {
- Device._handlerClass = _Edge2.default;
- }
-
- // TODO: More devices.
-
- if (Device.isSupported()) {
- logger.debug('device supported [name:%s, version:%s, handler:%s]', Device._name, Device._version, Device._handlerClass.name);
- } else {
- logger.warn('device not supported [name:%s, version:%s]', Device._name, Device._version);
- }
- }
- }, {
- key: 'name',
-
- /**
- * Get the device name.
- *
- * @return {String}
- */
- get: function get() {
- if (!Device._detected) Device._detect();
-
- return Device._name;
- }
-
- /**
- * Get the device version.
- *
- * @return {String}
- */
-
- }, {
- key: 'version',
- get: function get() {
- if (!Device._detected) Device._detect();
-
- return Device._version;
- }
- }, {
- key: 'Handler',
- get: function get() {
- if (!Device._detected) Device._detect();
-
- return Device._handlerClass;
- }
- }]);
- return Device;
-}();
-
-// Initialized flag.
-// @type {Boolean}
-
-
-exports.default = Device;
-Device._detected = false;
-
-// Device name.
-// @type {String}
-Device._name = undefined;
-
-// Device version.
-// @type {String}
-Device._version = undefined;
-
-// WebRTC hander for this device.
-// @type {Class}
-Device._handlerClass = null;
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-},{"./Logger":"/Users/ibc/src/mediasoup-client/lib/Logger.js","./handlers/Chrome55":"/Users/ibc/src/mediasoup-client/lib/handlers/Chrome55.js","./handlers/Edge11":"/Users/ibc/src/mediasoup-client/lib/handlers/Edge11.js","./handlers/Firefox50":"/Users/ibc/src/mediasoup-client/lib/handlers/Firefox50.js","./handlers/Safari11":"/Users/ibc/src/mediasoup-client/lib/handlers/Safari11.js","babel-runtime/helpers/classCallCheck":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/classCallCheck.js","babel-runtime/helpers/createClass":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/createClass.js","bowser":"/Users/ibc/src/mediasoup-client/node_modules/bowser/src/bowser.js"}],"/Users/ibc/src/mediasoup-client/lib/EnhancedEventEmitter.js":[function(require,module,exports){
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-
-var _promise = require('babel-runtime/core-js/promise');
-
-var _promise2 = _interopRequireDefault(_promise);
-
-var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
-
-var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
-
-var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
-
-var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
-
-var _createClass2 = require('babel-runtime/helpers/createClass');
-
-var _createClass3 = _interopRequireDefault(_createClass2);
-
-var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
-
-var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
-
-var _inherits2 = require('babel-runtime/helpers/inherits');
-
-var _inherits3 = _interopRequireDefault(_inherits2);
-
-var _events = require('events');
-
-var _Logger = require('./Logger');
-
-var _Logger2 = _interopRequireDefault(_Logger);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var logger = new _Logger2.default('EnhancedEventEmitter');
-
-var EnhancedEventEmitter = function (_EventEmitter) {
- (0, _inherits3.default)(EnhancedEventEmitter, _EventEmitter);
-
- function EnhancedEventEmitter() {
- (0, _classCallCheck3.default)(this, EnhancedEventEmitter);
-
- var _this = (0, _possibleConstructorReturn3.default)(this, (EnhancedEventEmitter.__proto__ || (0, _getPrototypeOf2.default)(EnhancedEventEmitter)).call(this));
-
- _this.setMaxListeners(Infinity);
- return _this;
- }
-
- (0, _createClass3.default)(EnhancedEventEmitter, [{
- key: 'safeEmit',
- value: function safeEmit(event) {
- try {
- for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
- args[_key - 1] = arguments[_key];
- }
-
- this.emit.apply(this, [event].concat(args));
- } catch (error) {
- logger.error('event listener threw an error [event:%s]: %o', event, error);
- }
- }
- }, {
- key: 'safeEmitAsPromise',
- value: function safeEmitAsPromise() {
- var _this2 = this;
-
- for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
- args[_key2] = arguments[_key2];
- }
-
- return new _promise2.default(function (resolve, reject) {
- var callback = function callback(result) {
- resolve(result);
- };
-
- var errback = function errback(error) {
- reject(error);
- };
-
- _this2.safeEmit.apply(_this2, args.concat([callback, errback]));
- });
- }
- }]);
- return EnhancedEventEmitter;
-}(_events.EventEmitter);
-
-exports.default = EnhancedEventEmitter;
-
-},{"./Logger":"/Users/ibc/src/mediasoup-client/lib/Logger.js","babel-runtime/core-js/object/get-prototype-of":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/object/get-prototype-of.js","babel-runtime/core-js/promise":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/promise.js","babel-runtime/helpers/classCallCheck":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/classCallCheck.js","babel-runtime/helpers/createClass":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/createClass.js","babel-runtime/helpers/inherits":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/inherits.js","babel-runtime/helpers/possibleConstructorReturn":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/possibleConstructorReturn.js","events":"/Users/ibc/src/mediasoup-demo-2/app/node_modules/events/events.js"}],"/Users/ibc/src/mediasoup-client/lib/Logger.js":[function(require,module,exports){
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-
-var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
-
-var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
-
-var _createClass2 = require('babel-runtime/helpers/createClass');
-
-var _createClass3 = _interopRequireDefault(_createClass2);
-
-var _debug = require('debug');
-
-var _debug2 = _interopRequireDefault(_debug);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var APP_NAME = 'mediasoup-client';
-
-var Logger = function () {
- function Logger(prefix) {
- (0, _classCallCheck3.default)(this, Logger);
-
- if (prefix) {
- this._debug = (0, _debug2.default)(APP_NAME + ':' + prefix);
- this._warn = (0, _debug2.default)(APP_NAME + ':WARN:' + prefix);
- this._error = (0, _debug2.default)(APP_NAME + ':ERROR:' + prefix);
- } else {
- this._debug = (0, _debug2.default)(APP_NAME);
- this._warn = (0, _debug2.default)(APP_NAME + ':WARN');
- this._error = (0, _debug2.default)(APP_NAME + ':ERROR');
- }
-
- /* eslint-disable no-console */
- this._debug.log = console.info.bind(console);
- this._warn.log = console.warn.bind(console);
- this._error.log = console.error.bind(console);
- /* eslint-enable no-console */
- }
-
- (0, _createClass3.default)(Logger, [{
- key: 'debug',
- get: function get() {
- return this._debug;
- }
- }, {
- key: 'warn',
- get: function get() {
- return this._warn;
- }
- }, {
- key: 'error',
- get: function get() {
- return this._error;
- }
- }]);
- return Logger;
-}();
-
-exports.default = Logger;
-
-},{"babel-runtime/helpers/classCallCheck":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/classCallCheck.js","babel-runtime/helpers/createClass":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/createClass.js","debug":"/Users/ibc/src/mediasoup-client/node_modules/debug/src/browser.js"}],"/Users/ibc/src/mediasoup-client/lib/Peer.js":[function(require,module,exports){
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-
-var _from = require('babel-runtime/core-js/array/from');
-
-var _from2 = _interopRequireDefault(_from);
-
-var _getIterator2 = require('babel-runtime/core-js/get-iterator');
-
-var _getIterator3 = _interopRequireDefault(_getIterator2);
-
-var _map = require('babel-runtime/core-js/map');
-
-var _map2 = _interopRequireDefault(_map);
-
-var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
-
-var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
-
-var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
-
-var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
-
-var _createClass2 = require('babel-runtime/helpers/createClass');
-
-var _createClass3 = _interopRequireDefault(_createClass2);
-
-var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
-
-var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
-
-var _inherits2 = require('babel-runtime/helpers/inherits');
-
-var _inherits3 = _interopRequireDefault(_inherits2);
-
-var _Logger = require('./Logger');
-
-var _Logger2 = _interopRequireDefault(_Logger);
-
-var _EnhancedEventEmitter2 = require('./EnhancedEventEmitter');
-
-var _EnhancedEventEmitter3 = _interopRequireDefault(_EnhancedEventEmitter2);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var logger = new _Logger2.default('Peer');
-
-var Peer = function (_EnhancedEventEmitter) {
- (0, _inherits3.default)(Peer, _EnhancedEventEmitter);
-
- /**
- * @private
- *
- * @emits {consumer: Consumer} newconsumer
- * @emits {originator: String, [appData]: Any} closed
- * @emits {originator: String} @close
- */
- function Peer(name, appData) {
- (0, _classCallCheck3.default)(this, Peer);
-
- // Name.
- // @type {String}
- var _this = (0, _possibleConstructorReturn3.default)(this, (Peer.__proto__ || (0, _getPrototypeOf2.default)(Peer)).call(this));
-
- _this._name = name;
-
- // Closed flag.
- // @type {Boolean}
- _this._closed = false;
-
- // App custom data.
- // @type {Any}
- _this._appData = appData;
-
- // Map of Consumers indexed by id.
- // @type {map}
- _this._consumers = new _map2.default();
- return _this;
- }
-
- /**
- * Peer name.
- *
- * @return {String}
- */
-
-
- (0, _createClass3.default)(Peer, [{
- key: 'close',
-
-
- /**
- * Closes the Peer.
- * This is called when the local Room is closed.
- *
- * @private
- */
- value: function close() {
- logger.debug('close()');
-
- if (this._closed) return;
-
- this._closed = true;
-
- this.emit('@close', 'local');
- this.safeEmit('closed', 'local');
-
- // Close all the Consumers.
- var _iteratorNormalCompletion = true;
- var _didIteratorError = false;
- var _iteratorError = undefined;
-
- try {
- for (var _iterator = (0, _getIterator3.default)(this._consumers.values()), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
- var consumer = _step.value;
-
- consumer.close();
- }
- } catch (err) {
- _didIteratorError = true;
- _iteratorError = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion && _iterator.return) {
- _iterator.return();
- }
- } finally {
- if (_didIteratorError) {
- throw _iteratorError;
- }
- }
- }
- }
-
- /**
- * The remote Peer or Room was closed.
- * Invoked via remote notification.
- *
- * @private
- *
- * @param {Any} [appData] - App custom data.
- */
-
- }, {
- key: 'remoteClose',
- value: function remoteClose(appData) {
- logger.debug('remoteClose()');
-
- if (this._closed) return;
-
- this._closed = true;
-
- this.emit('@close', 'remote');
- this.safeEmit('closed', 'remote', appData);
-
- // Close all the Consumers.
- var _iteratorNormalCompletion2 = true;
- var _didIteratorError2 = false;
- var _iteratorError2 = undefined;
-
- try {
- for (var _iterator2 = (0, _getIterator3.default)(this._consumers.values()), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
- var consumer = _step2.value;
-
- consumer.remoteClose();
- }
- } catch (err) {
- _didIteratorError2 = true;
- _iteratorError2 = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion2 && _iterator2.return) {
- _iterator2.return();
- }
- } finally {
- if (_didIteratorError2) {
- throw _iteratorError2;
- }
- }
- }
- }
-
- /**
- * Get the Consumer with the given id.
- *
- * @param {Number} id
- *
- * @return {Consumer}
- */
-
- }, {
- key: 'getConsumerById',
- value: function getConsumerById(id) {
- return this._consumers.get(id);
- }
-
- /**
- * Add an associated Consumer.
- *
- * @private
- *
- * @param {Consumer} consumer
- */
-
- }, {
- key: 'addConsumer',
- value: function addConsumer(consumer) {
- var _this2 = this;
-
- if (this._consumers.has(consumer.id)) throw new Error('Consumer already exists [id:' + consumer.id + ']');
-
- // Store it.
- this._consumers.set(consumer.id, consumer);
-
- // Handle it.
- consumer.on('@close', function () {
- _this2._consumers.delete(consumer.id);
- });
-
- // Emit event.
- this.safeEmit('newconsumer', consumer);
- }
- }, {
- key: 'name',
- get: function get() {
- return this._name;
- }
-
- /**
- * Whether the Peer is closed.
- *
- * @return {Boolean}
- */
-
- }, {
- key: 'closed',
- get: function get() {
- return this._closed;
- }
-
- /**
- * App custom data.
- *
- * @return {Any}
- */
-
- }, {
- key: 'appData',
- get: function get() {
- return this._appData;
- }
-
- /**
- * The list of Consumers.
- *
- * @return {Array}
- */
-
- }, {
- key: 'consumers',
- get: function get() {
- return (0, _from2.default)(this._consumers.values());
- }
- }]);
- return Peer;
-}(_EnhancedEventEmitter3.default);
-
-exports.default = Peer;
-
-},{"./EnhancedEventEmitter":"/Users/ibc/src/mediasoup-client/lib/EnhancedEventEmitter.js","./Logger":"/Users/ibc/src/mediasoup-client/lib/Logger.js","babel-runtime/core-js/array/from":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/array/from.js","babel-runtime/core-js/get-iterator":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/get-iterator.js","babel-runtime/core-js/map":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/map.js","babel-runtime/core-js/object/get-prototype-of":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/object/get-prototype-of.js","babel-runtime/helpers/classCallCheck":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/classCallCheck.js","babel-runtime/helpers/createClass":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/createClass.js","babel-runtime/helpers/inherits":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/inherits.js","babel-runtime/helpers/possibleConstructorReturn":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/possibleConstructorReturn.js"}],"/Users/ibc/src/mediasoup-client/lib/Producer.js":[function(require,module,exports){
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-
-var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
-
-var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
-
-var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
-
-var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
-
-var _createClass2 = require('babel-runtime/helpers/createClass');
-
-var _createClass3 = _interopRequireDefault(_createClass2);
-
-var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
-
-var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
-
-var _inherits2 = require('babel-runtime/helpers/inherits');
-
-var _inherits3 = _interopRequireDefault(_inherits2);
-
-var _Logger = require('./Logger');
-
-var _Logger2 = _interopRequireDefault(_Logger);
-
-var _EnhancedEventEmitter2 = require('./EnhancedEventEmitter');
-
-var _EnhancedEventEmitter3 = _interopRequireDefault(_EnhancedEventEmitter2);
-
-var _utils = require('./utils');
-
-var utils = _interopRequireWildcard(_utils);
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var logger = new _Logger2.default('Producer');
-
-var Producer = function (_EnhancedEventEmitter) {
- (0, _inherits3.default)(Producer, _EnhancedEventEmitter);
-
- /**
- * @private
- *
- * @emits {originator: String, [appData]: Any} paused
- * @emits {originator: String, [appData]: Any} resumed
- * @emits unhandled
- * @emits {originator: String, [appData]: Any} closed
- *
- * @emits {[appData]: Any} @pause
- * @emits {[appData]: Any} @resume
- * @emits {originator: String, [appData]: Any} @close
- *
- */
- function Producer(track, appData) {
- (0, _classCallCheck3.default)(this, Producer);
-
- // Id.
- // @type {Number}
- var _this = (0, _possibleConstructorReturn3.default)(this, (Producer.__proto__ || (0, _getPrototypeOf2.default)(Producer)).call(this));
-
- _this._id = utils.randomNumber();
-
- // Closed flag.
- // @type {Boolean}
- _this._closed = false;
-
- // Original track.
- // @type {MediaStreamTrack}
- _this._originalTrack = track;
-
- // Track cloned from the original one.
- // @type {MediaStreamTrack}
- _this._track = track.clone();
-
- // App custom data.
- // @type {Any}
- _this._appData = appData;
-
- // Whether this Producer is being handled by a Transport.
- // @type {Boolean}
- _this._handled = false;
-
- // RTP parameters.
- // @type {RTCRtpParameters}
- _this._rtpParameters = null;
-
- // Locally paused flag.
- // @type {Boolean}
- _this._locallyPaused = !_this._track.enabled;
-
- // Remotely paused flag.
- // @type {Boolean}
- _this._remotelyPaused = false;
- return _this;
- }
-
- /**
- * Class name.
- *
- * @return {String}
- */
-
-
- (0, _createClass3.default)(Producer, [{
- key: 'close',
-
-
- /**
- * Closes the Producer.
- *
- * @param {Any} [appData] - App custom data.
- */
- value: function close(appData) {
- logger.debug('close()');
-
- if (this._closed) return;
-
- this._closed = true;
-
- this.emit('@close', 'local', appData);
- this.safeEmit('closed', 'local', appData);
-
- this._destroy();
- }
-
- /**
- * My remote Producer was closed.
- * Invoked via remote notification.
- *
- * @private
- *
- * @param {Any} [appData] - App custom data.
- */
-
- }, {
- key: 'remoteClose',
- value: function remoteClose(appData) {
- logger.debug('remoteClose()');
-
- if (this._closed) return;
-
- this._closed = true;
-
- this.emit('@close', 'remote', appData);
- this.safeEmit('closed', 'remote', appData);
-
- this._destroy();
- }
- }, {
- key: '_destroy',
- value: function _destroy() {
- this._closed = true;
- this._handled = false;
- this._rtpParameters = null;
-
- try {
- this._track.stop();
- } catch (error) {}
- }
-
- /**
- * Pauses sending media.
- *
- * @param {Any} [appData] - App custom data.
- *
- * @return {Boolean} true if paused.
- */
-
- }, {
- key: 'pause',
- value: function pause(appData) {
- logger.debug('pause()');
-
- if (this._closed) {
- logger.error('pause() | Producer closed');
-
- return false;
- } else if (!this._handled) {
- logger.error('pause() | Producer not handled');
-
- return false;
- } else if (this._locallyPaused) {
- return true;
- }
-
- this._locallyPaused = true;
- this._track.enabled = false;
-
- this.emit('@pause', appData);
-
- if (!this._remotelyPaused) this.safeEmit('paused', 'local', appData);
-
- // Return true if really paused.
- return this.paused;
- }
-
- /**
- * My remote Producer was paused.
- * Invoked via remote notification.
- *
- * @private
- *
- * @param {Any} [appData] - App custom data.
- */
-
- }, {
- key: 'remotePause',
- value: function remotePause(appData) {
- logger.debug('remotePause()');
-
- if (this._closed || !this._handled || this._remotelyPaused) return;
-
- this._remotelyPaused = true;
- this._track.enabled = false;
-
- if (!this._locallyPaused) this.safeEmit('paused', 'remote', appData);
- }
-
- /**
- * Resumes sending media.
- *
- * @param {Any} [appData] - App custom data.
- *
- * @return {Boolean} true if not paused.
- */
-
- }, {
- key: 'resume',
- value: function resume(appData) {
- logger.debug('resume()');
-
- if (this._closed) {
- logger.error('resume() | Producer closed');
-
- return false;
- } else if (!this._handled) {
- logger.error('pause() | Producer not handled');
-
- return false;
- } else if (!this._locallyPaused) {
- return true;
- }
-
- this._locallyPaused = false;
-
- this.emit('@resume', appData);
-
- if (!this._remotelyPaused) {
- this._track.enabled = true;
-
- this.safeEmit('resumed', 'local', appData);
- }
-
- // Return true if not paused.
- return !this.paused;
- }
-
- /**
- * My remote Producer was resumed.
- * Invoked via remote notification.
- *
- * @private
- *
- * @param {Any} [appData] - App custom data.
- */
-
- }, {
- key: 'remoteResume',
- value: function remoteResume(appData) {
- logger.debug('remoteResume()');
-
- if (this._closed || !this._handled || !this._remotelyPaused) return;
-
- this._remotelyPaused = false;
-
- if (!this._locallyPaused) {
- this._track.enabled = true;
-
- this.safeEmit('resumed', 'remote', appData);
- }
- }
-
- /**
- * Set this Producer as handled or unhandled by a Transport.
- *
- * @private
- *
- * @param {Boolean|String} flag - If 'tmp' (String) it's considered as termporal.
- * @param {RTCRtpParameters} rtpParameters
- */
-
- }, {
- key: 'setHandled',
- value: function setHandled(flag, rtpParameters) {
- if (this._closed) return;
-
- var previous = this._handled;
-
- this._handled = flag;
- this._rtpParameters = rtpParameters;
-
- if (flag === false || flag === 'tmp') this._rtpParameters = null;
-
- if (previous === true && flag === false) this.safeEmit('unhandled');
- }
- }, {
- key: 'klass',
- get: function get() {
- return 'Producer';
- }
-
- /**
- * Producer id.
- *
- * @return {Number}
- */
-
- }, {
- key: 'id',
- get: function get() {
- return this._id;
- }
-
- /**
- * Whether the Producer is closed.
- *
- * @return {Boolean}
- */
-
- }, {
- key: 'closed',
- get: function get() {
- return this._closed;
- }
-
- /**
- * Media kind.
- *
- * @return {String}
- */
-
- }, {
- key: 'kind',
- get: function get() {
- return this._track.kind;
- }
-
- /**
- * The associated track.
- *
- * @return {MediaStreamTrack}
- */
-
- }, {
- key: 'track',
- get: function get() {
- return this._track;
- }
-
- /**
- * The associated original track.
- *
- * @return {MediaStreamTrack}
- */
-
- }, {
- key: 'originalTrack',
- get: function get() {
- return this._originalTrack;
- }
-
- /**
- * App custom data.
- *
- * @return {Any}
- */
-
- }, {
- key: 'appData',
- get: function get() {
- return this._appData;
- }
-
- /**
- * Whether this is being handled by a Transport.
- *
- * @return {Boolean}
- */
-
- }, {
- key: 'handled',
- get: function get() {
- return Boolean(this._handled);
- }
-
- /**
- * RTP parameters.
- *
- * @return {RTCRtpParameters}
- */
-
- }, {
- key: 'rtpParameters',
- get: function get() {
- return this._rtpParameters;
- }
-
- /**
- * Whether the Producer is locally paused.
- *
- * @return {Boolean}
- */
-
- }, {
- key: 'locallyPaused',
- get: function get() {
- return this._locallyPaused;
- }
-
- /**
- * Whether the Producer is remotely paused.
- *
- * @return {Boolean}
- */
-
- }, {
- key: 'remotelyPaused',
- get: function get() {
- return this._remotelyPaused;
- }
-
- /**
- * Whether the Producer is paused.
- *
- * @return {Boolean}
- */
-
- }, {
- key: 'paused',
- get: function get() {
- return this._locallyPaused || this._remotelyPaused;
- }
-
- /**
- * Whether the Producer is actually sending media.
- *
- * @return {Boolean}
- */
-
- }, {
- key: 'active',
- get: function get() {
- return !this._closed && this.handled === true && !this.paused;
- }
- }]);
- return Producer;
-}(_EnhancedEventEmitter3.default);
-
-exports.default = Producer;
-
-},{"./EnhancedEventEmitter":"/Users/ibc/src/mediasoup-client/lib/EnhancedEventEmitter.js","./Logger":"/Users/ibc/src/mediasoup-client/lib/Logger.js","./utils":"/Users/ibc/src/mediasoup-client/lib/utils.js","babel-runtime/core-js/object/get-prototype-of":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/object/get-prototype-of.js","babel-runtime/helpers/classCallCheck":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/classCallCheck.js","babel-runtime/helpers/createClass":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/createClass.js","babel-runtime/helpers/inherits":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/inherits.js","babel-runtime/helpers/possibleConstructorReturn":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/possibleConstructorReturn.js"}],"/Users/ibc/src/mediasoup-client/lib/Room.js":[function(require,module,exports){
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-
-var _from = require('babel-runtime/core-js/array/from');
-
-var _from2 = _interopRequireDefault(_from);
-
-var _extends2 = require('babel-runtime/helpers/extends');
-
-var _extends3 = _interopRequireDefault(_extends2);
-
-var _typeof2 = require('babel-runtime/helpers/typeof');
-
-var _typeof3 = _interopRequireDefault(_typeof2);
-
-var _getIterator2 = require('babel-runtime/core-js/get-iterator');
-
-var _getIterator3 = _interopRequireDefault(_getIterator2);
-
-var _promise = require('babel-runtime/core-js/promise');
-
-var _promise2 = _interopRequireDefault(_promise);
-
-var _map = require('babel-runtime/core-js/map');
-
-var _map2 = _interopRequireDefault(_map);
-
-var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
-
-var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
-
-var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
-
-var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
-
-var _createClass2 = require('babel-runtime/helpers/createClass');
-
-var _createClass3 = _interopRequireDefault(_createClass2);
-
-var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
-
-var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
-
-var _inherits2 = require('babel-runtime/helpers/inherits');
-
-var _inherits3 = _interopRequireDefault(_inherits2);
-
-var _Logger = require('./Logger');
-
-var _Logger2 = _interopRequireDefault(_Logger);
-
-var _EnhancedEventEmitter2 = require('./EnhancedEventEmitter');
-
-var _EnhancedEventEmitter3 = _interopRequireDefault(_EnhancedEventEmitter2);
-
-var _errors = require('./errors');
-
-var _utils = require('./utils');
-
-var utils = _interopRequireWildcard(_utils);
-
-var _Device = require('./Device');
-
-var _Device2 = _interopRequireDefault(_Device);
-
-var _Transport = require('./Transport');
-
-var _Transport2 = _interopRequireDefault(_Transport);
-
-var _Producer = require('./Producer');
-
-var _Producer2 = _interopRequireDefault(_Producer);
-
-var _Peer = require('./Peer');
-
-var _Peer2 = _interopRequireDefault(_Peer);
-
-var _Consumer = require('./Consumer');
-
-var _Consumer2 = _interopRequireDefault(_Consumer);
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var logger = new _Logger2.default('Room');
-
-var RoomState = {
- new: 'new',
- joining: 'joining',
- joined: 'joined',
- closed: 'closed'
-};
-
-/**
- * An instance of Room represents a remote multi conference and a local
- * peer that joins it.
- */
-
-var Room = function (_EnhancedEventEmitter) {
- (0, _inherits3.default)(Room, _EnhancedEventEmitter);
-
- /**
- * Room class.
- *
- * @param {Object} [options]
- * @param {Number} [options.requestTimeout=10000] - Timeout for sent requests
- * (in milliseconds). Defaults to 10000 (10 seconds).
- * @param {Object} [options.transportOptions] - Transport options for mediasoup.
- * @param {Array} [options.turnServers] - Array of TURN servers.
- * @param {Boolean} [hidden=false] - If true no remote Peers will be notified.
- *
- * @throws {Error} if device is not supported.
- *
- * @emits {request: Object, callback: Function, errback: Function} request
- * @emits {notification: Object} notify
- * @emits {peer: Peer} newpeer
- * @emits {originator: String, [appData]: Any} closed
- */
- function Room(options) {
- (0, _classCallCheck3.default)(this, Room);
-
- logger.debug('constructor() [options:%o]', options);
-
- var _this = (0, _possibleConstructorReturn3.default)(this, (Room.__proto__ || (0, _getPrototypeOf2.default)(Room)).call(this));
-
- if (!_Device2.default.isSupported()) throw new Error('current browser/device not supported');
-
- options = options || {};
-
- // Computed settings.
- // @type {Object}
- _this._settings = {
- requestTimeout: options.requestTimeout || 10000,
- transportOptions: options.transportOptions || {},
- turnServers: options.turnServers || [],
- hidden: Boolean(options.hidden)
- };
-
- // Room state.
- // @type {Boolean}
- _this._state = RoomState.new;
-
- // Map of Transports indexed by id.
- // @type {map}
- _this._transports = new _map2.default();
-
- // Map of Producers indexed by id.
- // @type {map}
- _this._producers = new _map2.default();
-
- // Map of Peers indexed by name.
- // @type {map}
- _this._peers = new _map2.default();
-
- // Extended RTP capabilities.
- // @type {Object}
- _this._extendedRtpCapabilities = null;
-
- // Whether we can send audio/video based on computed extended RTP
- // capabilities.
- // @type {Object}
- _this._canSendByKind = {
- audio: false,
- video: false
- };
- return _this;
- }
-
- /**
- * Whether the Room is joined.
- *
- * @return {Boolean}
- */
-
-
- (0, _createClass3.default)(Room, [{
- key: 'join',
-
-
- /**
- * Start the procedures to join a remote room.
- *
- * @param {RTCRtpCapabilities} [roomRtpCapabilities] Remote room RTP capabilities.
- * If given, no request is sent to the server to discover them.
- * @param {Any} [appData] - App custom data.
- * @return {Promise}
- */
- value: function join(roomRtpCapabilities, appData) {
- var _this2 = this;
-
- if (!roomRtpCapabilities) logger.debug('join()');else logger.debug('join() [roomRtpCapabilities:%o]', roomRtpCapabilities);
-
- if (this._state !== RoomState.new) {
- return _promise2.default.reject(new _errors.InvalidStateError('invalid state "' + this._state + '"'));
- }
-
- this._state = RoomState.joining;
-
- var remoteRtpCapabilities = void 0;
- var localRtpCapabilities = void 0;
-
- return _promise2.default.resolve().then(function () {
- if (roomRtpCapabilities) return roomRtpCapabilities;
-
- return _this2._sendRequest('queryRoom').then(function (response) {
- var rtpCapabilities = response.rtpCapabilities;
-
-
- logger.debug('join() | got Room RTP capabilities:%o', rtpCapabilities);
-
- return rtpCapabilities;
- });
- }).then(function (rtpCapabilities) {
- remoteRtpCapabilities = rtpCapabilities;
-
- return _Device2.default.Handler.getLocalRtpCapabilities();
- }).then(function (rtpCapabilities) {
- localRtpCapabilities = rtpCapabilities;
-
- // Get extended RTP capabilities.
- _this2._extendedRtpCapabilities = utils.getExtendedRtpCapabilities(localRtpCapabilities, remoteRtpCapabilities);
-
- // Check whether we can send audio/video.
- _this2._canSendByKind.audio = utils.canSend('audio', _this2._extendedRtpCapabilities);
- _this2._canSendByKind.video = utils.canSend('video', _this2._extendedRtpCapabilities);
-
- // Generate our effective RTP capabilities for receiving media.
- var effectiveLocalRtpCapabilities = utils.getRtpCapabilities(_this2._extendedRtpCapabilities);
-
- logger.debug('join() | effective local RTP capabilities:%o', effectiveLocalRtpCapabilities);
-
- var data = {
- rtpCapabilities: effectiveLocalRtpCapabilities,
- appData: appData
- };
-
- return _this2._sendRequest('joinRoom', data).then(function (response) {
- return response.peers;
- });
- }).then(function (peers) {
- if (!_this2._settings.hidden) {
- // Handle Peers already existing in the room.
- var _iteratorNormalCompletion = true;
- var _didIteratorError = false;
- var _iteratorError = undefined;
-
- try {
- for (var _iterator = (0, _getIterator3.default)(peers || []), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
- var peerData = _step.value;
-
- try {
- _this2._handlePeerData(peerData);
- } catch (error) {
- logger.error('join() | error handling Peer:%o', error);
- }
- }
- } catch (err) {
- _didIteratorError = true;
- _iteratorError = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion && _iterator.return) {
- _iterator.return();
- }
- } finally {
- if (_didIteratorError) {
- throw _iteratorError;
- }
- }
- }
- } else if (peers.length > 0) {
- logger.error('join() | should not receive Peer list in hidden mode');
- }
-
- _this2._state = RoomState.joined;
-
- logger.debug('join() | joined the Room');
-
- // Return the list of already existing Peers.
- return _this2.peers;
- }).catch(function (error) {
- _this2._state = RoomState.new;
-
- throw error;
- });
- }
-
- /**
- * Leave the Room.
- *
- * @param {Any} [appData] - App custom data.
- */
-
- }, {
- key: 'leave',
- value: function leave(appData) {
- logger.debug('leave()');
-
- if (this.closed) return;
-
- // Send a notification.
- this._sendNotification('leaveRoom', { appData: appData });
-
- // Set closed state after sending the notification (otherwise the
- // notification won't be sent).
- this._state = RoomState.closed;
-
- this.safeEmit('closed', 'local', appData);
-
- // Close all the Transports.
- var _iteratorNormalCompletion2 = true;
- var _didIteratorError2 = false;
- var _iteratorError2 = undefined;
-
- try {
- for (var _iterator2 = (0, _getIterator3.default)(this._transports.values()), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
- var transport = _step2.value;
-
- transport.close();
- }
-
- // Close all the Producers.
- } catch (err) {
- _didIteratorError2 = true;
- _iteratorError2 = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion2 && _iterator2.return) {
- _iterator2.return();
- }
- } finally {
- if (_didIteratorError2) {
- throw _iteratorError2;
- }
- }
- }
-
- var _iteratorNormalCompletion3 = true;
- var _didIteratorError3 = false;
- var _iteratorError3 = undefined;
-
- try {
- for (var _iterator3 = (0, _getIterator3.default)(this._producers.values()), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
- var producer = _step3.value;
-
- producer.close();
- }
-
- // Close all the Peers.
- } catch (err) {
- _didIteratorError3 = true;
- _iteratorError3 = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion3 && _iterator3.return) {
- _iterator3.return();
- }
- } finally {
- if (_didIteratorError3) {
- throw _iteratorError3;
- }
- }
- }
-
- var _iteratorNormalCompletion4 = true;
- var _didIteratorError4 = false;
- var _iteratorError4 = undefined;
-
- try {
- for (var _iterator4 = (0, _getIterator3.default)(this._peers.values()), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
- var peer = _step4.value;
-
- peer.close();
- }
- } catch (err) {
- _didIteratorError4 = true;
- _iteratorError4 = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion4 && _iterator4.return) {
- _iterator4.return();
- }
- } finally {
- if (_didIteratorError4) {
- throw _iteratorError4;
- }
- }
- }
- }
-
- /**
- * The remote Room was closed or our remote Peer has been closed.
- * Invoked via remote notification.
- *
- * @private
- * @param {Any} [appData] - App custom data.
- */
-
- }, {
- key: 'remoteClose',
- value: function remoteClose(appData) {
- logger.debug('remoteClose()');
-
- if (this.closed) return;
-
- this._state = RoomState.closed;
-
- this.safeEmit('closed', 'remote', appData);
-
- // Close all the Transports.
- var _iteratorNormalCompletion5 = true;
- var _didIteratorError5 = false;
- var _iteratorError5 = undefined;
-
- try {
- for (var _iterator5 = (0, _getIterator3.default)(this._transports.values()), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
- var transport = _step5.value;
-
- transport.remoteClose();
- }
-
- // Close all the Producers.
- } catch (err) {
- _didIteratorError5 = true;
- _iteratorError5 = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion5 && _iterator5.return) {
- _iterator5.return();
- }
- } finally {
- if (_didIteratorError5) {
- throw _iteratorError5;
- }
- }
- }
-
- var _iteratorNormalCompletion6 = true;
- var _didIteratorError6 = false;
- var _iteratorError6 = undefined;
-
- try {
- for (var _iterator6 = (0, _getIterator3.default)(this._producers.values()), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
- var producer = _step6.value;
-
- producer.remoteClose();
- }
-
- // Close all the Peers.
- } catch (err) {
- _didIteratorError6 = true;
- _iteratorError6 = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion6 && _iterator6.return) {
- _iterator6.return();
- }
- } finally {
- if (_didIteratorError6) {
- throw _iteratorError6;
- }
- }
- }
-
- var _iteratorNormalCompletion7 = true;
- var _didIteratorError7 = false;
- var _iteratorError7 = undefined;
-
- try {
- for (var _iterator7 = (0, _getIterator3.default)(this._peers.values()), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {
- var peer = _step7.value;
-
- peer.remoteClose();
- }
- } catch (err) {
- _didIteratorError7 = true;
- _iteratorError7 = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion7 && _iterator7.return) {
- _iterator7.return();
- }
- } finally {
- if (_didIteratorError7) {
- throw _iteratorError7;
- }
- }
- }
- }
-
- /**
- * Whether we can send audio/video.
- *
- * @param {String} kind - 'audio' or 'video'.
- *
- * @return {Boolean}
- */
-
- }, {
- key: 'canSend',
- value: function canSend(kind) {
- if (!this.joined) throw new _errors.InvalidStateError('invalid state "' + this._state + '"');else if (kind !== 'audio' && kind !== 'video') throw new TypeError('invalid kind "' + kind + '"');
-
- return this._canSendByKind[kind];
- }
-
- /**
- * Creates a Transport.
- *
- * @param {String} direction - Must be 'send' or 'recv'.
- * @param {Any} [appData] - App custom data.
- *
- * @return {Transport}
- *
- * @throws {InvalidStateError} if not joined.
- * @throws {TypeError} if wrong arguments.
- */
-
- }, {
- key: 'createTransport',
- value: function createTransport(direction, appData) {
- var _this3 = this;
-
- logger.debug('createTransport() [direction:%s]', direction);
-
- if (!this.joined) throw new _errors.InvalidStateError('invalid state "' + this._state + '"');else if (direction !== 'send' && direction !== 'recv') throw new TypeError('invalid direction "' + direction + '"');
-
- // Create a new Transport.
- var transport = new _Transport2.default(direction, this._extendedRtpCapabilities, this._settings, appData);
-
- // Store it.
- this._transports.set(transport.id, transport);
-
- transport.on('@request', function (method, data, callback, errback) {
- _this3._sendRequest(method, data).then(callback || function () {}).catch(errback || function () {});
- });
-
- transport.on('@notify', function (method, data) {
- _this3._sendNotification(method, data);
- });
-
- transport.on('@close', function () {
- _this3._transports.delete(transport.id);
- });
-
- return transport;
- }
-
- /**
- * Creates a Producer.
- *
- * @param {MediaStreamTrack} track
- * @param {Any} [appData] - App custom data.
- *
- * @return {Producer}
- *
- * @throws {InvalidStateError} if not joined.
- * @throws {TypeError} if wrong arguments.
- * @throws {Error} if cannot send the given kind.
- */
-
- }, {
- key: 'createProducer',
- value: function createProducer(track, appData) {
- var _this4 = this;
-
- logger.debug('createProducer() [track:%o]', track);
-
- if (!this.joined) throw new _errors.InvalidStateError('invalid state "' + this._state + '"');else if (!(track instanceof MediaStreamTrack)) throw new TypeError('track is not a MediaStreamTrack');else if (!this._canSendByKind[track.kind]) throw new Error('cannot send ' + track.kind);else if (track.readyState === 'ended') throw new Error('track.readyState is "ended"');
-
- // Create a new Producer.
- var producer = new _Producer2.default(track, appData);
-
- // Store it.
- this._producers.set(producer.id, producer);
-
- producer.on('@close', function () {
- _this4._producers.delete(producer.id);
- });
-
- return producer;
- }
-
- /**
- * Get the Transport with the given id.
- *
- * @param {Number} id
- *
- * @return {Transport}
- */
-
- }, {
- key: 'getTransportById',
- value: function getTransportById(id) {
- return this._transports.get(id);
- }
-
- /**
- * Get the Producer with the given id.
- *
- * @param {Number} id
- *
- * @return {Producer}
- */
-
- }, {
- key: 'getProducerById',
- value: function getProducerById(id) {
- return this._producers.get(id);
- }
-
- /**
- * Get the Peer with the given name.
- *
- * @param {String} name
- *
- * @return {Peer}
- */
-
- }, {
- key: 'getPeerById',
- value: function getPeerById(name) {
- return this._peers.get(name);
- }
-
- /**
- * Provide the local Room with a notification generated by mediasoup server.
- *
- * @param {Object} notification
- */
-
- }, {
- key: 'receiveNotification',
- value: function receiveNotification(notification) {
- try {
- if (this.closed) throw new _errors.InvalidStateError('Room closed');else if ((typeof notification === 'undefined' ? 'undefined' : (0, _typeof3.default)(notification)) !== 'object') throw new TypeError('wrong notification Object');else if (notification.notification !== true) throw new TypeError('not a notification');else if (typeof notification.method !== 'string') throw new TypeError('wrong/missing notification method');
-
- var method = notification.method;
-
- logger.debug('receiveNotification() [method:%s, notification:%o]', method, notification);
-
- switch (method) {
- case 'roomClosed':
- {
- var appData = notification.appData;
-
-
- this.remoteClose(appData);
-
- break;
- }
-
- case 'transportClosed':
- {
- var id = notification.id,
- _appData = notification.appData;
-
- var transport = this._transports.get(id);
-
- if (!transport) throw new Error('Transport does not exist [id:"' + id + '"]');
-
- transport.remoteClose(_appData);
-
- break;
- }
-
- case 'newPeer':
- {
- this._ensureNotHidden();
-
- var name = notification.name;
-
-
- if (this._peers.has(name)) throw new Error('Peer already exists [name:"' + name + '"]');
-
- var peerData = notification;
-
- this._handlePeerData(peerData);
-
- break;
- }
-
- case 'peerClosed':
- {
- this._ensureNotHidden();
-
- var peerName = notification.name;
- var _appData2 = notification.appData;
-
- var peer = this._peers.get(peerName);
-
- if (!peer) throw new Error('no Peer found [name:"' + peerName + '"]');
-
- peer.remoteClose(_appData2);
-
- break;
- }
-
- case 'producerClosed':
- {
- var _id = notification.id,
- _appData3 = notification.appData;
-
- var producer = this._producers.get(_id);
-
- if (!producer) throw new Error('Producer not found [id:' + _id + ']');
-
- producer.remoteClose(_appData3);
-
- break;
- }
-
- case 'producerPaused':
- {
- var _id2 = notification.id,
- _appData4 = notification.appData;
-
- var _producer = this._producers.get(_id2);
-
- if (!_producer) throw new Error('Producer not found [id:' + _id2 + ']');
-
- _producer.remotePause(_appData4);
-
- break;
- }
-
- case 'producerResumed':
- {
- var _id3 = notification.id,
- _appData5 = notification.appData;
-
- var _producer2 = this._producers.get(_id3);
-
- if (!_producer2) throw new Error('Producer not found [id:' + _id3 + ']');
-
- _producer2.remoteResume(_appData5);
-
- break;
- }
-
- case 'newConsumer':
- {
- this._ensureNotHidden();
-
- var _peerName = notification.peerName;
-
- var _peer = this._peers.get(_peerName);
-
- if (!_peer) throw new Error('no Peer found [name:"' + _peerName + '"]');
-
- var consumerData = notification;
-
- this._handleConsumerData(consumerData, _peer);
-
- break;
- }
-
- case 'consumerClosed':
- {
- this._ensureNotHidden();
-
- var _id4 = notification.id,
- _peerName2 = notification.peerName,
- _appData6 = notification.appData;
-
- var _peer2 = this._peers.get(_peerName2);
-
- if (!_peer2) throw new Error('no Peer found [name:"' + _peerName2 + '"]');
-
- var consumer = _peer2.getConsumerById(_id4);
-
- if (!consumer) throw new Error('Consumer not found [id:' + _id4 + ']');
-
- consumer.remoteClose(_appData6);
-
- break;
- }
-
- case 'consumerPaused':
- {
- this._ensureNotHidden();
-
- var _id5 = notification.id,
- _peerName3 = notification.peerName,
- _appData7 = notification.appData;
-
- var _peer3 = this._peers.get(_peerName3);
-
- if (!_peer3) throw new Error('no Peer found [name:"' + _peerName3 + '"]');
-
- var _consumer = _peer3.getConsumerById(_id5);
-
- if (!_consumer) throw new Error('Consumer not found [id:' + _id5 + ']');
-
- _consumer.remotePause(_appData7);
-
- break;
- }
-
- case 'consumerResumed':
- {
- this._ensureNotHidden();
-
- var _id6 = notification.id,
- _peerName4 = notification.peerName,
- _appData8 = notification.appData;
-
- var _peer4 = this._peers.get(_peerName4);
-
- var _consumer2 = _peer4.getConsumerById(_id6);
-
- if (!_consumer2) throw new Error('Consumer not found [id:' + _id6 + ']');
-
- _consumer2.remoteResume(_appData8);
-
- break;
- }
-
- default:
- throw new Error('unknown notification method "' + method + '"');
- }
- } catch (error) {
- logger.error('receiveNotification() failed [notification:%o]: %s', notification, error.toString());
- }
- }
- }, {
- key: '_sendRequest',
- value: function _sendRequest(method, data) {
- var _this5 = this;
-
- var request = (0, _extends3.default)({ method: method }, data);
-
- // Should never happen.
- // Ignore if closed.
- if (this.closed) {
- logger.error('_sendRequest() | Room closed [method:%s, request:%o]', method, request);
-
- return _promise2.default.reject(new _errors.InvalidStateError('Room closed'));
- }
-
- logger.debug('_sendRequest() [method:%s, request:%o]', method, request);
-
- return new _promise2.default(function (resolve, reject) {
- var done = false;
-
- var timer = setTimeout(function () {
- logger.error('request failed [method:%s]: timeout', method);
-
- done = true;
- reject(new _errors.TimeoutError('timeout'));
- }, _this5._settings.requestTimeout);
-
- // TODO: We could also handle room 'closed' event here.
-
- var callback = function callback(response) {
- if (done) return;
-
- done = true;
- clearTimeout(timer);
-
- if (_this5.closed) {
- logger.error('request failed [method:%s]: Room closed', method);
-
- reject(new Error('Room closed'));
-
- return;
- }
-
- logger.debug('request succeeded [method:%s, response:%o]', method, response);
-
- resolve(response);
- };
-
- var errback = function errback(message) {
- if (done) return;
-
- done = true;
- clearTimeout(timer);
-
- if (_this5.closed) {
- logger.error('request failed [method:%s]: Room closed', method);
-
- reject(new Error('Room closed'));
-
- return;
- }
-
- // Make sure message is a String.
- message = String(message);
-
- logger.error('request failed [method:%s]: %s', method, message);
-
- reject(new Error(message));
- };
-
- _this5.safeEmit('request', request, callback, errback);
- });
- }
- }, {
- key: '_sendNotification',
- value: function _sendNotification(method, data) {
- // Ignore if closed.
- if (this.closed) return;
-
- var notification = (0, _extends3.default)({ method: method, notification: true }, data);
-
- logger.debug('_sendNotification() [method:%s, notification:%o]', method, notification);
-
- this.safeEmit('notify', notification);
- }
- }, {
- key: '_ensureNotHidden',
- value: function _ensureNotHidden() {
- if (this._settings.hidden) throw new Error('hidden mode set');
- }
- }, {
- key: '_handlePeerData',
- value: function _handlePeerData(peerData) {
- var _this6 = this;
-
- var name = peerData.name,
- consumers = peerData.consumers,
- appData = peerData.appData;
-
- var peer = new _Peer2.default(name, appData);
-
- // Store it.
- this._peers.set(peer.name, peer);
-
- peer.on('@close', function () {
- _this6._peers.delete(peer.name);
- });
-
- // Add consumers.
- var _iteratorNormalCompletion8 = true;
- var _didIteratorError8 = false;
- var _iteratorError8 = undefined;
-
- try {
- for (var _iterator8 = (0, _getIterator3.default)(consumers), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) {
- var consumerData = _step8.value;
-
- try {
- this._handleConsumerData(consumerData, peer);
- } catch (error) {
- logger.error('error handling existing Consumer in Peer:%o', error);
- }
- }
-
- // If already joined emit event.
- } catch (err) {
- _didIteratorError8 = true;
- _iteratorError8 = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion8 && _iterator8.return) {
- _iterator8.return();
- }
- } finally {
- if (_didIteratorError8) {
- throw _iteratorError8;
- }
- }
- }
-
- if (this.joined) this.safeEmit('newpeer', peer);
- }
- }, {
- key: '_handleConsumerData',
- value: function _handleConsumerData(producerData, peer) {
- var id = producerData.id,
- kind = producerData.kind,
- rtpParameters = producerData.rtpParameters,
- paused = producerData.paused,
- appData = producerData.appData;
-
- var consumer = new _Consumer2.default(id, kind, rtpParameters, peer, appData);
- var supported = utils.canReceive(consumer.rtpParameters, this._extendedRtpCapabilities);
-
- if (supported) consumer.setSupported(true);
-
- if (paused) consumer.remotePause();
-
- peer.addConsumer(consumer);
- }
- }, {
- key: 'joined',
- get: function get() {
- return this._state === RoomState.joined;
- }
-
- /**
- * Whether the Room is closed.
- *
- * @return {Boolean}
- */
-
- }, {
- key: 'closed',
- get: function get() {
- return this._state === RoomState.closed;
- }
-
- /**
- * The list of Transports.
- *
- * @return {Array}
- */
-
- }, {
- key: 'transports',
- get: function get() {
- return (0, _from2.default)(this._transports.values());
- }
-
- /**
- * The list of Producers.
- *
- * @return {Array}
- */
-
- }, {
- key: 'producers',
- get: function get() {
- return (0, _from2.default)(this._producers.values());
- }
-
- /**
- * The list of Peers.
- *
- * @return {Array}
- */
-
- }, {
- key: 'peers',
- get: function get() {
- return (0, _from2.default)(this._peers.values());
- }
- }]);
- return Room;
-}(_EnhancedEventEmitter3.default);
-
-exports.default = Room;
-
-},{"./Consumer":"/Users/ibc/src/mediasoup-client/lib/Consumer.js","./Device":"/Users/ibc/src/mediasoup-client/lib/Device.js","./EnhancedEventEmitter":"/Users/ibc/src/mediasoup-client/lib/EnhancedEventEmitter.js","./Logger":"/Users/ibc/src/mediasoup-client/lib/Logger.js","./Peer":"/Users/ibc/src/mediasoup-client/lib/Peer.js","./Producer":"/Users/ibc/src/mediasoup-client/lib/Producer.js","./Transport":"/Users/ibc/src/mediasoup-client/lib/Transport.js","./errors":"/Users/ibc/src/mediasoup-client/lib/errors.js","./utils":"/Users/ibc/src/mediasoup-client/lib/utils.js","babel-runtime/core-js/array/from":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/array/from.js","babel-runtime/core-js/get-iterator":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/get-iterator.js","babel-runtime/core-js/map":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/map.js","babel-runtime/core-js/object/get-prototype-of":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/object/get-prototype-of.js","babel-runtime/core-js/promise":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/promise.js","babel-runtime/helpers/classCallCheck":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/classCallCheck.js","babel-runtime/helpers/createClass":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/createClass.js","babel-runtime/helpers/extends":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/extends.js","babel-runtime/helpers/inherits":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/inherits.js","babel-runtime/helpers/possibleConstructorReturn":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/possibleConstructorReturn.js","babel-runtime/helpers/typeof":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/typeof.js"}],"/Users/ibc/src/mediasoup-client/lib/Transport.js":[function(require,module,exports){
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-
-var _promise = require('babel-runtime/core-js/promise');
-
-var _promise2 = _interopRequireDefault(_promise);
-
-var _getIterator2 = require('babel-runtime/core-js/get-iterator');
-
-var _getIterator3 = _interopRequireDefault(_getIterator2);
-
-var _map = require('babel-runtime/core-js/map');
-
-var _map2 = _interopRequireDefault(_map);
-
-var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
-
-var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
-
-var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
-
-var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
-
-var _createClass2 = require('babel-runtime/helpers/createClass');
-
-var _createClass3 = _interopRequireDefault(_createClass2);
-
-var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
-
-var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
-
-var _inherits2 = require('babel-runtime/helpers/inherits');
-
-var _inherits3 = _interopRequireDefault(_inherits2);
-
-var _Logger = require('./Logger');
-
-var _Logger2 = _interopRequireDefault(_Logger);
-
-var _EnhancedEventEmitter2 = require('./EnhancedEventEmitter');
-
-var _EnhancedEventEmitter3 = _interopRequireDefault(_EnhancedEventEmitter2);
-
-var _utils = require('./utils');
-
-var utils = _interopRequireWildcard(_utils);
-
-var _Device = require('./Device');
-
-var _Device2 = _interopRequireDefault(_Device);
-
-var _CommandQueue = require('./CommandQueue');
-
-var _CommandQueue2 = _interopRequireDefault(_CommandQueue);
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var logger = new _Logger2.default('Transport');
-
-var Transport = function (_EnhancedEventEmitter) {
- (0, _inherits3.default)(Transport, _EnhancedEventEmitter);
-
- /**
- * @private
- *
- * @emits {state: String} connectionstatechange
- * @emits {originator: String, [appData]: Any} closed
- * @emits {method: String, [data]: Object, callback: Function, errback: Function} @request
- * @emits {method: String, [data]: Object} @notify
- * @emits {originator: String} @close
- */
- function Transport(direction, extendedRtpCapabilities, settings, appData) {
- (0, _classCallCheck3.default)(this, Transport);
-
- logger.debug('constructor() [direction:%s, extendedRtpCapabilities:%o]', direction, extendedRtpCapabilities);
-
- // Id.
- // @type {Number}
- var _this = (0, _possibleConstructorReturn3.default)(this, (Transport.__proto__ || (0, _getPrototypeOf2.default)(Transport)).call(this));
-
- _this._id = utils.randomNumber();
-
- // Closed flag.
- // @type {Boolean}
- _this._closed = false;
-
- // Direction.
- // @type {String}
- _this._direction = direction;
-
- // Room settings.
- // @type {Object}
- _this._settings = settings;
-
- // App custom data.
- // @type {Any}
- _this._appData = appData;
-
- // Map of Producers indexed by id.
- // @type {map}
- _this._producers = new _map2.default();
-
- // Map of Consumers indexed by id.
- // @type {map}
- _this._consumers = new _map2.default();
-
- // Commands handler.
- // @type {CommandQueue}
- _this._commandQueue = new _CommandQueue2.default();
-
- // Device specific handler.
- _this._handler = new _Device2.default.Handler(direction, extendedRtpCapabilities, settings);
-
- // Transport state. Values can be:
- // 'new'/'connecting'/'connected'/'failed'/'disconnected'/'closed'
- // @type {String}
- _this._connectionState = 'new';
-
- _this._commandQueue.on('exec', _this._execCommand.bind(_this));
- _this._handleHandler();
- return _this;
- }
-
- /**
- * Transport id.
- *
- * @return {Number}
- */
-
-
- (0, _createClass3.default)(Transport, [{
- key: 'close',
-
-
- /**
- * Close the Transport.
- *
- * @param {Any} [appData] - App custom data.
- */
- value: function close(appData) {
- logger.debug('close()');
-
- if (this._closed) return;
-
- this._closed = true;
-
- this.safeEmit('@notify', 'closeTransport', { id: this._id, appData: appData });
-
- this.emit('@close', 'local');
- this.safeEmit('closed', 'local', appData);
-
- this._destroy();
- }
-
- /**
- * My remote Transport was closed.
- * Invoked via remote notification.
- *
- * @param {Any} [appData] - App custom data.
- */
-
- }, {
- key: 'remoteClose',
- value: function remoteClose(appData) {
- logger.debug('remoteClose()');
-
- if (this._closed) return;
-
- this._closed = true;
-
- this.emit('@close', 'remote');
- this.safeEmit('closed', 'remote', appData);
-
- this._destroy();
- }
- }, {
- key: '_destroy',
- value: function _destroy() {
- // Close the CommandQueue.
- this._commandQueue.close();
-
- // Close the handler.
- this._handler.close();
-
- // Unhandle all the Producers.
- var _iteratorNormalCompletion = true;
- var _didIteratorError = false;
- var _iteratorError = undefined;
-
- try {
- for (var _iterator = (0, _getIterator3.default)(this._producers.values()), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
- var producer = _step.value;
-
- producer.setHandled(false);
- }
-
- // Unhandle all the Consumers.
- } catch (err) {
- _didIteratorError = true;
- _iteratorError = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion && _iterator.return) {
- _iterator.return();
- }
- } finally {
- if (_didIteratorError) {
- throw _iteratorError;
- }
- }
- }
-
- var _iteratorNormalCompletion2 = true;
- var _didIteratorError2 = false;
- var _iteratorError2 = undefined;
-
- try {
- for (var _iterator2 = (0, _getIterator3.default)(this._consumers.values()), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
- var consumer = _step2.value;
-
- consumer.setHandled(false);
- }
- } catch (err) {
- _didIteratorError2 = true;
- _iteratorError2 = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion2 && _iterator2.return) {
- _iterator2.return();
- }
- } finally {
- if (_didIteratorError2) {
- throw _iteratorError2;
- }
- }
- }
- }
-
- /**
- * Send the given Producer over this Transport.
- *
- * @param {Producer} producer
- *
- * @return {Promise}
- *
- * @example
- * transport.send(videoProducer)
- * .then(() => {
- * // Done
- * });
- */
-
- }, {
- key: 'send',
- value: function send(producer) {
- logger.debug('send() [producer:%o]', producer);
-
- if (this._direction !== 'send') return _promise2.default.reject(new Error('cannot send on a receiving Transport'));else if (!producer || producer.klass !== 'Producer') return _promise2.default.reject(new TypeError('wrong Producer'));
-
- // Enqueue command.
- return this._commandQueue.push('addProducer', { producer: producer });
- }
-
- /**
- * Receive the given Consumer over this Transport.
- *
- * @param {Consumer} consumer
- *
- * @return {Promise}
- *
- * @example
- * transport.receive(aliceVideoConsumer)
- * .then(() => {
- * // Done
- * });
- */
-
- }, {
- key: 'receive',
- value: function receive(consumer) {
- logger.debug('receive() [consumer:%o]', consumer);
-
- if (this._direction !== 'recv') return _promise2.default.reject(new Error('cannot receive on a sending Transport'));else if (!consumer || consumer.klass !== 'Consumer') return _promise2.default.reject(new TypeError('wrong Consumer'));
-
- // Enqueue command.
- return this._commandQueue.push('addConsumer', { consumer: consumer });
- }
- }, {
- key: '_handleHandler',
- value: function _handleHandler() {
- var _this2 = this;
-
- var handler = this._handler;
-
- handler.on('@connectionstatechange', function (state) {
- if (_this2._connectionState === state) return;
-
- _this2._connectionState = state;
-
- if (!_this2._closed) _this2.safeEmit('connectionstatechange', state);
- });
-
- handler.on('@needcreatetransport', function (transportLocalParameters, callback, errback) {
- var data = {
- id: _this2._id,
- options: _this2._settings.transportOptions,
- appData: _this2._appData
- };
-
- if (transportLocalParameters) data.dtlsParameters = transportLocalParameters.dtlsParameters;
-
- _this2.safeEmit('@request', 'createTransport', data, callback, errback);
- });
-
- handler.on('@needupdatetransport', function (transportLocalParameters) {
- var data = {
- id: _this2._id,
- dtlsParameters: transportLocalParameters.dtlsParameters
- };
-
- _this2.safeEmit('@notify', 'updateTransport', data);
- });
- }
- }, {
- key: '_execCommand',
- value: function _execCommand(command, promiseHolder) {
- var promise = void 0;
-
- try {
- switch (command.method) {
- case 'addProducer':
- {
- var producer = command.producer;
-
-
- promise = this._execAddProducer(producer);
- break;
- }
-
- case 'removeProducer':
- {
- var _producer = command.producer;
-
-
- promise = this._execRemoveProducer(_producer);
- break;
- }
-
- case 'addConsumer':
- {
- var consumer = command.consumer;
-
-
- promise = this._execAddConsumer(consumer);
- break;
- }
-
- case 'removeConsumer':
- {
- var _consumer = command.consumer;
-
-
- promise = this._execRemoveConsumer(_consumer);
- break;
- }
-
- default:
- {
- promise = _promise2.default.reject(new Error('unknown command method "' + command.method + '"'));
- }
- }
- } catch (error) {
- promise = _promise2.default.reject(error);
- }
-
- // Fill the given Promise holder.
- promiseHolder.promise = promise;
- }
- }, {
- key: '_execAddProducer',
- value: function _execAddProducer(producer) {
- var _this3 = this;
-
- logger.debug('_execAddProducer()');
-
- if (producer.closed) return _promise2.default.reject(new Error('Producer closed'));else if (producer.handled) return _promise2.default.reject(new Error('Producer already handled by a Transport'));
-
- var producerRtpParameters = void 0;
-
- producer.setHandled('tmp');
-
- // Call the handler.
- return _promise2.default.resolve().then(function () {
- return _this3._handler.addProducer(producer);
- }).then(function (rtpParameters) {
- producerRtpParameters = rtpParameters;
-
- var data = {
- id: producer.id,
- kind: producer.kind,
- transportId: _this3._id,
- rtpParameters: rtpParameters,
- appData: producer.appData
- };
-
- return _this3.safeEmitAsPromise('@request', 'createProducer', data);
- }).then(function () {
- producer.setHandled(true, producerRtpParameters);
- _this3._producers.set(producer.id, producer);
- _this3._handleProducer(producer);
- }).catch(function (error) {
- producer.setHandled(false);
-
- throw error;
- });
- }
- }, {
- key: '_execRemoveProducer',
- value: function _execRemoveProducer(producer) {
- logger.debug('_execRemoveProducer()');
-
- // Call the handler.
- return this._handler.removeProducer(producer);
- }
- }, {
- key: '_execAddConsumer',
- value: function _execAddConsumer(consumer) {
- var _this4 = this;
-
- logger.debug('_execAddConsumer()');
-
- if (consumer.closed) return _promise2.default.reject(new Error('Consumer closed'));else if (consumer.handled) return _promise2.default.reject(new Error('Consumer already handled by a Transport'));
-
- // Check whether we can receive this Consumer.
- if (!consumer.supported) {
- return _promise2.default.reject(new Error('cannot receive this Consumer, unsupported codecs'));
- }
-
- var consumerTrack = void 0;
-
- consumer.setHandled('tmp');
-
- // Call the handler.
- return _promise2.default.resolve().then(function () {
- return _this4._handler.addConsumer(consumer);
- }).then(function (track) {
- consumerTrack = track;
-
- var data = {
- id: consumer.id
- };
-
- return _this4.safeEmitAsPromise('@request', 'enableConsumer', data);
- }).then(function () {
- consumer.setHandled(true, consumerTrack);
- _this4._consumers.set(consumer.id, consumer);
- _this4._handleConsumer(consumer);
-
- return consumerTrack;
- }).catch(function (error) {
- consumer.setHandled(false);
-
- throw error;
- });
- }
- }, {
- key: '_execRemoveConsumer',
- value: function _execRemoveConsumer(consumer) {
- logger.debug('_execRemoveConsumer()');
-
- // Call the handler.
- return this._handler.removeConsumer(consumer);
- }
- }, {
- key: '_handleProducer',
- value: function _handleProducer(producer) {
- var _this5 = this;
-
- producer.on('@close', function (originator, appData) {
- _this5._producers.delete(producer.id);
-
- // Enqueue command.
- _this5._commandQueue.push('removeProducer', { producer: producer }).catch(function () {});
-
- if (originator === 'local') {
- _this5.safeEmit('@notify', 'closeProducer', { id: producer.id, appData: appData });
- }
- });
-
- producer.on('@pause', function (appData) {
- var data = {
- id: producer.id,
- appData: appData
- };
-
- _this5.safeEmit('@notify', 'pauseProducer', data);
- });
-
- producer.on('@resume', function (appData) {
- var data = {
- id: producer.id,
- appData: appData
- };
-
- _this5.safeEmit('@notify', 'resumeProducer', data);
- });
- }
- }, {
- key: '_handleConsumer',
- value: function _handleConsumer(consumer) {
- var _this6 = this;
-
- consumer.on('@close', function () {
- _this6._consumers.delete(consumer.id);
-
- // Enqueue command.
- _this6._commandQueue.push('removeConsumer', { consumer: consumer }).catch(function () {});
- });
-
- consumer.on('@pause', function (appData) {
- var data = {
- id: consumer.id,
- appData: appData
- };
-
- _this6.safeEmit('@notify', 'pauseConsumer', data);
- });
-
- consumer.on('@resume', function (appData) {
- var data = {
- id: consumer.id,
- appData: appData
- };
-
- _this6.safeEmit('@notify', 'resumeConsumer', data);
- });
- }
- }, {
- key: 'id',
- get: function get() {
- return this._id;
- }
-
- /**
- * Whether the Transport is closed.
- *
- * @return {Boolean}
- */
-
- }, {
- key: 'closed',
- get: function get() {
- return this._closed;
- }
-
- /**
- * Transport direction.
- *
- * @return {String}
- */
-
- }, {
- key: 'direction',
- get: function get() {
- return this._direction;
- }
-
- /**
- * App custom data.
- *
- * @return {Any}
- */
-
- }, {
- key: 'appData',
- get: function get() {
- return this._appData;
- }
-
- /**
- * Connection state.
- *
- * @return {String}
- */
-
- }, {
- key: 'connectionState',
- get: function get() {
- return this._connectionState;
- }
- }]);
- return Transport;
-}(_EnhancedEventEmitter3.default);
-
-exports.default = Transport;
-
-},{"./CommandQueue":"/Users/ibc/src/mediasoup-client/lib/CommandQueue.js","./Device":"/Users/ibc/src/mediasoup-client/lib/Device.js","./EnhancedEventEmitter":"/Users/ibc/src/mediasoup-client/lib/EnhancedEventEmitter.js","./Logger":"/Users/ibc/src/mediasoup-client/lib/Logger.js","./utils":"/Users/ibc/src/mediasoup-client/lib/utils.js","babel-runtime/core-js/get-iterator":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/get-iterator.js","babel-runtime/core-js/map":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/map.js","babel-runtime/core-js/object/get-prototype-of":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/object/get-prototype-of.js","babel-runtime/core-js/promise":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/promise.js","babel-runtime/helpers/classCallCheck":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/classCallCheck.js","babel-runtime/helpers/createClass":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/createClass.js","babel-runtime/helpers/inherits":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/inherits.js","babel-runtime/helpers/possibleConstructorReturn":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/possibleConstructorReturn.js"}],"/Users/ibc/src/mediasoup-client/lib/errors.js":[function(require,module,exports){
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.TimeoutError = exports.InvalidStateError = undefined;
-
-var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
-
-var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
-
-var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
-
-var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
-
-var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
-
-var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
-
-var _inherits2 = require('babel-runtime/helpers/inherits');
-
-var _inherits3 = _interopRequireDefault(_inherits2);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Error produced when calling a method in an invalid state.
- */
-var InvalidStateError = exports.InvalidStateError = function (_Error) {
- (0, _inherits3.default)(InvalidStateError, _Error);
-
- function InvalidStateError(message) {
- (0, _classCallCheck3.default)(this, InvalidStateError);
-
- var _this = (0, _possibleConstructorReturn3.default)(this, (InvalidStateError.__proto__ || (0, _getPrototypeOf2.default)(InvalidStateError)).call(this, message));
-
- Object.defineProperty(_this, 'name', {
- enumerable: false,
- writable: false,
- value: 'InvalidStateError'
- });
-
- if (Error.hasOwnProperty('captureStackTrace')) // Just in V8.
- {
- Error.captureStackTrace(_this, InvalidStateError);
- } else {
- Object.defineProperty(_this, 'stack', {
- enumerable: false,
- writable: false,
- value: new Error(message).stack
- });
- }
- return _this;
- }
-
- return InvalidStateError;
-}(Error);
-
-/**
- * Error produced when a Promise is rejected due to a timeout.
- */
-
-
-var TimeoutError = exports.TimeoutError = function (_Error2) {
- (0, _inherits3.default)(TimeoutError, _Error2);
-
- function TimeoutError(message) {
- (0, _classCallCheck3.default)(this, TimeoutError);
-
- var _this2 = (0, _possibleConstructorReturn3.default)(this, (TimeoutError.__proto__ || (0, _getPrototypeOf2.default)(TimeoutError)).call(this, message));
-
- Object.defineProperty(_this2, 'name', {
- enumerable: false,
- writable: false,
- value: 'TimeoutError'
- });
-
- if (Error.hasOwnProperty('captureStackTrace')) // Just in V8.
- {
- Error.captureStackTrace(_this2, TimeoutError);
- } else {
- Object.defineProperty(_this2, 'stack', {
- enumerable: false,
- writable: false,
- value: new Error(message).stack
- });
- }
- return _this2;
- }
-
- return TimeoutError;
-}(Error);
-
-},{"babel-runtime/core-js/object/get-prototype-of":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/object/get-prototype-of.js","babel-runtime/helpers/classCallCheck":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/classCallCheck.js","babel-runtime/helpers/inherits":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/inherits.js","babel-runtime/helpers/possibleConstructorReturn":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/possibleConstructorReturn.js"}],"/Users/ibc/src/mediasoup-client/lib/handlers/Chrome55.js":[function(require,module,exports){
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-
-var _from = require('babel-runtime/core-js/array/from');
-
-var _from2 = _interopRequireDefault(_from);
-
-var _map = require('babel-runtime/core-js/map');
-
-var _map2 = _interopRequireDefault(_map);
-
-var _set = require('babel-runtime/core-js/set');
-
-var _set2 = _interopRequireDefault(_set);
-
-var _promise = require('babel-runtime/core-js/promise');
-
-var _promise2 = _interopRequireDefault(_promise);
-
-var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
-
-var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
-
-var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
-
-var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
-
-var _createClass2 = require('babel-runtime/helpers/createClass');
-
-var _createClass3 = _interopRequireDefault(_createClass2);
-
-var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
-
-var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
-
-var _inherits2 = require('babel-runtime/helpers/inherits');
-
-var _inherits3 = _interopRequireDefault(_inherits2);
-
-var _sdpTransform = require('sdp-transform');
-
-var _sdpTransform2 = _interopRequireDefault(_sdpTransform);
-
-var _Logger = require('../Logger');
-
-var _Logger2 = _interopRequireDefault(_Logger);
-
-var _EnhancedEventEmitter2 = require('../EnhancedEventEmitter');
-
-var _EnhancedEventEmitter3 = _interopRequireDefault(_EnhancedEventEmitter2);
-
-var _utils = require('../utils');
-
-var utils = _interopRequireWildcard(_utils);
-
-var _commonUtils = require('./sdp/commonUtils');
-
-var sdpCommonUtils = _interopRequireWildcard(_commonUtils);
-
-var _planBUtils = require('./sdp/planBUtils');
-
-var sdpPlanBUtils = _interopRequireWildcard(_planBUtils);
-
-var _RemotePlanBSdp = require('./sdp/RemotePlanBSdp');
-
-var _RemotePlanBSdp2 = _interopRequireDefault(_RemotePlanBSdp);
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var logger = new _Logger2.default('Chrome55');
-
-var Handler = function (_EnhancedEventEmitter) {
- (0, _inherits3.default)(Handler, _EnhancedEventEmitter);
-
- function Handler(direction, rtpParametersByKind, settings) {
- (0, _classCallCheck3.default)(this, Handler);
-
- // RTCPeerConnection instance.
- // @type {RTCPeerConnection}
- var _this = (0, _possibleConstructorReturn3.default)(this, (Handler.__proto__ || (0, _getPrototypeOf2.default)(Handler)).call(this));
-
- _this._pc = new RTCPeerConnection({
- iceServers: settings.turnServers || [],
- iceTransportPolicy: 'relay',
- bundlePolicy: 'max-bundle',
- rtcpMuxPolicy: 'require'
- });
-
- // Generic sending RTP parameters for audio and video.
- // @type {Object}
- _this._rtpParametersByKind = rtpParametersByKind;
-
- // Remote SDP handler.
- // @type {RemotePlanBSdp}
- _this._remoteSdp = new _RemotePlanBSdp2.default(direction, rtpParametersByKind);
-
- // Handle RTCPeerConnection connection status.
- _this._pc.addEventListener('iceconnectionstatechange', function () {
- switch (_this._pc.iceConnectionState) {
- case 'checking':
- _this.emit('@connectionstatechange', 'connecting');
- break;
- case 'connected':
- case 'completed':
- _this.emit('@connectionstatechange', 'connected');
- break;
- case 'failed':
- _this.emit('@connectionstatechange', 'failed');
- break;
- case 'disconnected':
- _this.emit('@connectionstatechange', 'disconnected');
- break;
- case 'closed':
- _this.emit('@connectionstatechange', 'closed');
- break;
- }
- });
- return _this;
- }
-
- (0, _createClass3.default)(Handler, [{
- key: 'close',
- value: function close() {
- logger.debug('close()');
-
- // Close RTCPeerConnection.
- try {
- this._pc.close();
- } catch (error) {}
- }
- }]);
- return Handler;
-}(_EnhancedEventEmitter3.default);
-
-var SendHandler = function (_Handler) {
- (0, _inherits3.default)(SendHandler, _Handler);
-
- function SendHandler(rtpParametersByKind, settings) {
- (0, _classCallCheck3.default)(this, SendHandler);
-
- // Got transport local and remote parameters.
- // @type {Boolean}
- var _this2 = (0, _possibleConstructorReturn3.default)(this, (SendHandler.__proto__ || (0, _getPrototypeOf2.default)(SendHandler)).call(this, 'send', rtpParametersByKind, settings));
-
- _this2._transportReady = false;
-
- // Local stream.
- // @type {MediaStream}
- _this2._stream = new MediaStream();
- return _this2;
- }
-
- (0, _createClass3.default)(SendHandler, [{
- key: 'addProducer',
- value: function addProducer(producer) {
- var _this3 = this;
-
- var track = producer.track;
-
-
- logger.debug('addProducer() [id:%s, kind:%s, trackId:%s]', producer.id, producer.kind, track.id);
-
- var localSdpObj = void 0;
-
- return _promise2.default.resolve().then(function () {
- // Add the track to the local stream.
- _this3._stream.addTrack(track);
-
- // Add the stream to the PeerConnection.
- _this3._pc.addStream(_this3._stream);
-
- return _this3._pc.createOffer();
- }).then(function (offer) {
- return _this3._pc.setLocalDescription(offer);
- }).then(function () {
- if (!_this3._transportReady) return _this3._setupTransport();
- }).then(function () {
- localSdpObj = _sdpTransform2.default.parse(_this3._pc.localDescription.sdp);
-
- var remoteSdp = _this3._remoteSdp.createAnswerSdp(localSdpObj);
- var answer = { type: 'answer', sdp: remoteSdp };
-
- return _this3._pc.setRemoteDescription(answer);
- }).then(function () {
- var rtpParameters = utils.clone(_this3._rtpParametersByKind[producer.kind]);
-
- // Fill the RTP parameters for this track.
- sdpPlanBUtils.fillRtpParametersForTrack(rtpParameters, localSdpObj, track);
-
- return rtpParameters;
- }).catch(function (error) {
- // Panic here. Try to undo things.
-
- _this3._stream.removeTrack(track);
- _this3._pc.addStream(_this3._stream);
-
- throw error;
- });
- }
- }, {
- key: 'removeProducer',
- value: function removeProducer(producer) {
- var _this4 = this;
-
- var track = producer.track;
-
-
- logger.debug('removeProducer() [id:%s, kind:%s, trackId:%s]', producer.id, producer.kind, track.id);
-
- return _promise2.default.resolve().then(function () {
- // Remove the track from the local stream.
- _this4._stream.removeTrack(track);
-
- // Add the stream to the PeerConnection.
- _this4._pc.addStream(_this4._stream);
-
- return _this4._pc.createOffer();
- }).then(function (offer) {
- return _this4._pc.setLocalDescription(offer);
- }).catch(function (error) {
- // NOTE: If there are no sending tracks, setLocalDescription() will fail with
- // "Failed to create channels". If so, ignore it.
- if (_this4._stream.getTracks().length === 0) {
- logger.warn('removeProducer() | ignoring expected error due no sending tracks: %s', error.toString());
-
- return;
- }
-
- throw error;
- }).then(function () {
- if (_this4._pc.signalingState === 'stable') return;
-
- var localSdpObj = _sdpTransform2.default.parse(_this4._pc.localDescription.sdp);
- var remoteSdp = _this4._remoteSdp.createAnswerSdp(localSdpObj);
- var answer = { type: 'answer', sdp: remoteSdp };
-
- return _this4._pc.setRemoteDescription(answer);
- });
- }
- }, {
- key: '_setupTransport',
- value: function _setupTransport() {
- var _this5 = this;
-
- logger.debug('_setupTransport()');
-
- return _promise2.default.resolve().then(function () {
- // Get our local DTLS parameters.
- var transportLocalParameters = {};
- var sdp = _this5._pc.localDescription.sdp;
- var sdpObj = _sdpTransform2.default.parse(sdp);
- var dtlsParameters = sdpCommonUtils.extractDtlsParameters(sdpObj);
-
- // Let's decide that we'll be DTLS server (because we can).
- dtlsParameters.role = 'server';
-
- transportLocalParameters.dtlsParameters = dtlsParameters;
-
- // Provide the remote SDP handler with transport local parameters.
- _this5._remoteSdp.setTransportLocalParameters(transportLocalParameters);
-
- // We need transport remote parameters.
- return _this5.safeEmitAsPromise('@needcreatetransport', transportLocalParameters);
- }).then(function (transportRemoteParameters) {
- // Provide the remote SDP handler with transport remote parameters.
- _this5._remoteSdp.setTransportRemoteParameters(transportRemoteParameters);
-
- _this5._transportReady = true;
- });
- }
- }]);
- return SendHandler;
-}(Handler);
-
-var RecvHandler = function (_Handler2) {
- (0, _inherits3.default)(RecvHandler, _Handler2);
-
- function RecvHandler(rtpParametersByKind, settings) {
- (0, _classCallCheck3.default)(this, RecvHandler);
-
- // Got transport remote parameters.
- // @type {Boolean}
- var _this6 = (0, _possibleConstructorReturn3.default)(this, (RecvHandler.__proto__ || (0, _getPrototypeOf2.default)(RecvHandler)).call(this, 'recv', rtpParametersByKind, settings));
-
- _this6._transportCreated = false;
-
- // Got transport local parameters.
- // @type {Boolean}
- _this6._transportUpdated = false;
-
- // Seen media kinds.
- // @type {Set}
- _this6._kinds = new _set2.default();
-
- // Map of Consumers information indexed by consumer.id.
- // - kind {String}
- // - trackId {String}
- // - ssrc {Number}
- // - rtxSsrc {Number}
- // - cname {String}
- // @type {Map}
- _this6._consumerInfos = new _map2.default();
- return _this6;
- }
-
- (0, _createClass3.default)(RecvHandler, [{
- key: 'addConsumer',
- value: function addConsumer(consumer) {
- var _this7 = this;
-
- logger.debug('addConsumer() [id:%s, kind:%s]', consumer.id, consumer.kind);
-
- if (this._consumerInfos.has(consumer.id)) return _promise2.default.reject('Consumer already added');
-
- var encoding = consumer.rtpParameters.encodings[0];
- var cname = consumer.rtpParameters.rtcp.cname;
- var consumerInfo = {
- kind: consumer.kind,
- trackId: 'consumer-' + consumer.kind + '-' + consumer.id,
- ssrc: encoding.ssrc,
- cname: cname
- };
-
- if (encoding.rtx && encoding.rtx.ssrc) consumerInfo.rtxSsrc = encoding.rtx.ssrc;
-
- this._consumerInfos.set(consumer.id, consumerInfo);
- this._kinds.add(consumer.kind);
-
- return _promise2.default.resolve().then(function () {
- if (!_this7._transportCreated) return _this7._setupTransport();
- }).then(function () {
- var remoteSdp = _this7._remoteSdp.createOfferSdp((0, _from2.default)(_this7._kinds), (0, _from2.default)(_this7._consumerInfos.values()));
- var offer = { type: 'offer', sdp: remoteSdp };
-
- return _this7._pc.setRemoteDescription(offer);
- }).then(function () {
- return _this7._pc.createAnswer();
- }).then(function (answer) {
- return _this7._pc.setLocalDescription(answer);
- }).then(function () {
- if (!_this7._transportUpdated) return _this7._updateTransport();
- }).then(function () {
- var stream = _this7._pc.getRemoteStreams()[0];
- var track = stream.getTrackById(consumerInfo.trackId);
-
- if (!track) throw new Error('remote track not found');
-
- return track;
- });
- }
- }, {
- key: 'removeConsumer',
- value: function removeConsumer(consumer) {
- var _this8 = this;
-
- logger.debug('removeConsumer() [id:%s, kind:%s]', consumer.id, consumer.kind);
-
- if (!this._consumerInfos.has(consumer.id)) return _promise2.default.reject('Consumer not found');
-
- this._consumerInfos.delete(consumer.id);
-
- return _promise2.default.resolve().then(function () {
- var remoteSdp = _this8._remoteSdp.createOfferSdp((0, _from2.default)(_this8._kinds), (0, _from2.default)(_this8._consumerInfos.values()));
- var offer = { type: 'offer', sdp: remoteSdp };
-
- return _this8._pc.setRemoteDescription(offer);
- }).then(function () {
- return _this8._pc.createAnswer();
- }).then(function (answer) {
- return _this8._pc.setLocalDescription(answer);
- });
- }
- }, {
- key: '_setupTransport',
- value: function _setupTransport() {
- var _this9 = this;
-
- logger.debug('_setupTransport()');
-
- return _promise2.default.resolve().then(function () {
- // We need transport remote parameters.
- return _this9.safeEmitAsPromise('@needcreatetransport', null);
- }).then(function (transportRemoteParameters) {
- // Provide the remote SDP handler with transport remote parameters.
- _this9._remoteSdp.setTransportRemoteParameters(transportRemoteParameters);
-
- _this9._transportCreated = true;
- });
- }
- }, {
- key: '_updateTransport',
- value: function _updateTransport() {
- logger.debug('_updateTransport()');
-
- // Get our local DTLS parameters.
- // const transportLocalParameters = {};
- var sdp = this._pc.localDescription.sdp;
- var sdpObj = _sdpTransform2.default.parse(sdp);
- var dtlsParameters = sdpCommonUtils.extractDtlsParameters(sdpObj);
- var transportLocalParameters = { dtlsParameters: dtlsParameters };
-
- // We need to provide transport local parameters.
- this.safeEmit('@needupdatetransport', transportLocalParameters);
-
- this._transportUpdated = true;
- }
- }]);
- return RecvHandler;
-}(Handler);
-
-var Chrome55 = function () {
- (0, _createClass3.default)(Chrome55, null, [{
- key: 'getLocalRtpCapabilities',
- value: function getLocalRtpCapabilities() {
- logger.debug('getLocalRtpCapabilities()');
-
- var pc = new RTCPeerConnection({
- iceServers: [],
- iceTransportPolicy: 'relay',
- bundlePolicy: 'max-bundle',
- rtcpMuxPolicy: 'require'
- });
-
- return pc.createOffer({
- offerToReceiveAudio: true,
- offerToReceiveVideo: true
- }).then(function (offer) {
- try {
- pc.close();
- } catch (error) {}
-
- var sdpObj = _sdpTransform2.default.parse(offer.sdp);
- var localRtpCapabilities = sdpCommonUtils.extractRtpCapabilities(sdpObj);
-
- return localRtpCapabilities;
- }).catch(function (error) {
- try {
- pc.close();
- } catch (error2) {}
-
- throw error;
- });
- }
- }, {
- key: 'name',
- get: function get() {
- return 'Chrome55';
- }
- }]);
-
- function Chrome55(direction, extendedRtpCapabilities, settings) {
- (0, _classCallCheck3.default)(this, Chrome55);
-
- logger.debug('constructor() [direction:%s, extendedRtpCapabilities:%o]', direction, extendedRtpCapabilities);
-
- var rtpParametersByKind = void 0;
-
- switch (direction) {
- case 'send':
- {
- rtpParametersByKind = {
- audio: utils.getSendingRtpParameters('audio', extendedRtpCapabilities),
- video: utils.getSendingRtpParameters('video', extendedRtpCapabilities)
- };
-
- return new SendHandler(rtpParametersByKind, settings);
- }
- case 'recv':
- {
- rtpParametersByKind = {
- audio: utils.getReceivingFullRtpParameters('audio', extendedRtpCapabilities),
- video: utils.getReceivingFullRtpParameters('video', extendedRtpCapabilities)
- };
-
- return new RecvHandler(rtpParametersByKind, settings);
- }
- }
- }
-
- return Chrome55;
-}();
-
-exports.default = Chrome55;
-
-},{"../EnhancedEventEmitter":"/Users/ibc/src/mediasoup-client/lib/EnhancedEventEmitter.js","../Logger":"/Users/ibc/src/mediasoup-client/lib/Logger.js","../utils":"/Users/ibc/src/mediasoup-client/lib/utils.js","./sdp/RemotePlanBSdp":"/Users/ibc/src/mediasoup-client/lib/handlers/sdp/RemotePlanBSdp.js","./sdp/commonUtils":"/Users/ibc/src/mediasoup-client/lib/handlers/sdp/commonUtils.js","./sdp/planBUtils":"/Users/ibc/src/mediasoup-client/lib/handlers/sdp/planBUtils.js","babel-runtime/core-js/array/from":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/array/from.js","babel-runtime/core-js/map":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/map.js","babel-runtime/core-js/object/get-prototype-of":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/object/get-prototype-of.js","babel-runtime/core-js/promise":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/promise.js","babel-runtime/core-js/set":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/set.js","babel-runtime/helpers/classCallCheck":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/classCallCheck.js","babel-runtime/helpers/createClass":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/createClass.js","babel-runtime/helpers/inherits":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/inherits.js","babel-runtime/helpers/possibleConstructorReturn":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/possibleConstructorReturn.js","sdp-transform":"/Users/ibc/src/mediasoup-client/node_modules/sdp-transform/lib/index.js"}],"/Users/ibc/src/mediasoup-client/lib/handlers/Edge11.js":[function(require,module,exports){
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-
-var _promise = require('babel-runtime/core-js/promise');
-
-var _promise2 = _interopRequireDefault(_promise);
-
-var _getIterator2 = require('babel-runtime/core-js/get-iterator');
-
-var _getIterator3 = _interopRequireDefault(_getIterator2);
-
-var _map = require('babel-runtime/core-js/map');
-
-var _map2 = _interopRequireDefault(_map);
-
-var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
-
-var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
-
-var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
-
-var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
-
-var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
-
-var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
-
-var _createClass2 = require('babel-runtime/helpers/createClass');
-
-var _createClass3 = _interopRequireDefault(_createClass2);
-
-var _inherits2 = require('babel-runtime/helpers/inherits');
-
-var _inherits3 = _interopRequireDefault(_inherits2);
-
-var _Logger = require('../Logger');
-
-var _Logger2 = _interopRequireDefault(_Logger);
-
-var _EnhancedEventEmitter2 = require('../EnhancedEventEmitter');
-
-var _EnhancedEventEmitter3 = _interopRequireDefault(_EnhancedEventEmitter2);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-// import * as utils from '../utils';
-
-/* global RTCIceGatherer, RTCIceTransport, RTCDtlsTransport, RTCRtpReceiver */
-
-var logger = new _Logger2.default('Edge11');
-
-// const CNAME = `cname-${utils.randomNumber()}`;
-
-var Edge11 = function (_EnhancedEventEmitter) {
- (0, _inherits3.default)(Edge11, _EnhancedEventEmitter);
- (0, _createClass3.default)(Edge11, null, [{
- key: 'getLocalRtpCapabilities',
- value: function getLocalRtpCapabilities() {
- logger.debug('getLocalRtpCapabilities()');
-
- // TODO: Not enough since Edge does not set mimeType, etc.
- return RTCRtpReceiver.getCapabilities();
- }
- }, {
- key: 'name',
- get: function get() {
- return 'Edge11';
- }
- }]);
-
- function Edge11(direction, extendedRtpCapabilities, settings) {
- (0, _classCallCheck3.default)(this, Edge11);
-
- logger.debug('constructor() [direction:%s, extendedRtpCapabilities:%o]', direction, extendedRtpCapabilities);
-
- // Got transport local and remote parameters.
- // @type {Boolean}
- var _this = (0, _possibleConstructorReturn3.default)(this, (Edge11.__proto__ || (0, _getPrototypeOf2.default)(Edge11)).call(this));
-
- _this._transportReady = false;
-
- // ICE gatherer.
- _this._iceGatherer = null;
-
- // ICE transport.
- _this._iceTransport = null;
-
- // DTLS transport.
- // @type {RTCDtlsTransport}
- _this._dtlsTransport = null;
-
- // Map of RTCRtpSenders indexed by Producer.id.
- // @type {Map}
- _this6._consumerInfos = new _map2.default();
- return _this6;
- }
-
- (0, _createClass3.default)(RecvHandler, [{
- key: 'addConsumer',
- value: function addConsumer(consumer) {
- var _this7 = this;
-
- logger.debug('addConsumer() [id:%s, kind:%s]', consumer.id, consumer.kind);
-
- if (this._consumerInfos.has(consumer.id)) return _promise2.default.reject('Consumer already added');
-
- var encoding = consumer.rtpParameters.encodings[0];
- var cname = consumer.rtpParameters.rtcp.cname;
- var consumerInfo = {
- mid: 'consumer-' + consumer.kind + '-' + consumer.id,
- kind: consumer.kind,
- closed: consumer.closed,
- trackId: 'consumer-' + consumer.kind + '-' + consumer.id,
- ssrc: encoding.ssrc,
- cname: cname
- };
-
- if (encoding.rtx && encoding.rtx.ssrc) consumerInfo.rtxSsrc = encoding.rtx.ssrc;
-
- this._consumerInfos.set(consumer.id, consumerInfo);
-
- return _promise2.default.resolve().then(function () {
- if (!_this7._transportCreated) return _this7._setupTransport();
- }).then(function () {
- var remoteSdp = _this7._remoteSdp.createOfferSdp((0, _from2.default)(_this7._consumerInfos.values()));
- var offer = { type: 'offer', sdp: remoteSdp };
-
- return _this7._pc.setRemoteDescription(offer);
- }).then(function () {
- return _this7._pc.createAnswer();
- }).then(function (answer) {
- return _this7._pc.setLocalDescription(answer);
- }).then(function () {
- if (!_this7._transportUpdated) return _this7._updateTransport();
- }).then(function () {
- var newRtpReceiver = _this7._pc.getReceivers().find(function (rtpReceiver) {
- var track = rtpReceiver.track;
-
-
- if (!track) return false;
-
- return track.id === consumerInfo.trackId;
- });
-
- if (!newRtpReceiver) throw new Error('remote track not found');
-
- return newRtpReceiver.track;
- });
- }
- }, {
- key: 'removeConsumer',
- value: function removeConsumer(consumer) {
- var _this8 = this;
-
- // TODO: If this is the last active Consumer, Firefox will close the DTLS.
- // This is noted in the TODO.md file.
-
- logger.debug('removeConsumer() [id:%s, kind:%s]', consumer.id, consumer.kind);
-
- var consumerInfo = this._consumerInfos.get(consumer.id);
-
- if (!consumerInfo) return _promise2.default.reject('Consumer not found');
-
- consumerInfo.closed = true;
-
- return _promise2.default.resolve().then(function () {
- var remoteSdp = _this8._remoteSdp.createOfferSdp((0, _from2.default)(_this8._consumerInfos.values()));
- var offer = { type: 'offer', sdp: remoteSdp };
-
- return _this8._pc.setRemoteDescription(offer);
- }).then(function () {
- return _this8._pc.createAnswer();
- }).then(function (answer) {
- return _this8._pc.setLocalDescription(answer);
- });
- }
- }, {
- key: '_setupTransport',
- value: function _setupTransport() {
- var _this9 = this;
-
- logger.debug('_setupTransport()');
-
- return _promise2.default.resolve().then(function () {
- // We need transport remote parameters.
- return _this9.safeEmitAsPromise('@needcreatetransport', null);
- }).then(function (transportRemoteParameters) {
- // Provide the remote SDP handler with transport remote parameters.
- _this9._remoteSdp.setTransportRemoteParameters(transportRemoteParameters);
-
- _this9._transportCreated = true;
- });
- }
- }, {
- key: '_updateTransport',
- value: function _updateTransport() {
- logger.debug('_updateTransport()');
-
- // Get our local DTLS parameters.
- // const transportLocalParameters = {};
- var sdp = this._pc.localDescription.sdp;
- var sdpObj = _sdpTransform2.default.parse(sdp);
- var dtlsParameters = sdpCommonUtils.extractDtlsParameters(sdpObj);
- var transportLocalParameters = { dtlsParameters: dtlsParameters };
-
- // We need to provide transport local parameters.
- this.safeEmit('@needupdatetransport', transportLocalParameters);
-
- this._transportUpdated = true;
- }
- }]);
- return RecvHandler;
-}(Handler);
-
-var Firefox50 = function () {
- (0, _createClass3.default)(Firefox50, null, [{
- key: 'getLocalRtpCapabilities',
- value: function getLocalRtpCapabilities() {
- logger.debug('getLocalRtpCapabilities()');
-
- var pc = new RTCPeerConnection({
- iceServers: [],
- iceTransportPolicy: 'relay',
- bundlePolicy: 'max-bundle',
- rtcpMuxPolicy: 'require'
- });
-
- return pc.createOffer({
- offerToReceiveAudio: true,
- offerToReceiveVideo: true
- }).then(function (offer) {
- try {
- pc.close();
- } catch (error) {}
-
- var sdpObj = _sdpTransform2.default.parse(offer.sdp);
- var localRtpCapabilities = sdpCommonUtils.extractRtpCapabilities(sdpObj);
-
- return localRtpCapabilities;
- }).catch(function (error) {
- try {
- pc.close();
- } catch (error2) {}
-
- throw error;
- });
- }
- }, {
- key: 'name',
- get: function get() {
- return 'Firefox50';
- }
- }]);
-
- function Firefox50(direction, extendedRtpCapabilities, settings) {
- (0, _classCallCheck3.default)(this, Firefox50);
-
- logger.debug('constructor() [direction:%s, extendedRtpCapabilities:%o]', direction, extendedRtpCapabilities);
-
- var rtpParametersByKind = void 0;
-
- switch (direction) {
- case 'send':
- {
- rtpParametersByKind = {
- audio: utils.getSendingRtpParameters('audio', extendedRtpCapabilities),
- video: utils.getSendingRtpParameters('video', extendedRtpCapabilities)
- };
-
- return new SendHandler(rtpParametersByKind, settings);
- }
- case 'recv':
- {
- rtpParametersByKind = {
- audio: utils.getReceivingFullRtpParameters('audio', extendedRtpCapabilities),
- video: utils.getReceivingFullRtpParameters('video', extendedRtpCapabilities)
- };
-
- return new RecvHandler(rtpParametersByKind, settings);
- }
- }
- }
-
- return Firefox50;
-}();
-
-exports.default = Firefox50;
-
-},{"../EnhancedEventEmitter":"/Users/ibc/src/mediasoup-client/lib/EnhancedEventEmitter.js","../Logger":"/Users/ibc/src/mediasoup-client/lib/Logger.js","../utils":"/Users/ibc/src/mediasoup-client/lib/utils.js","./sdp/RemoteUnifiedPlanSdp":"/Users/ibc/src/mediasoup-client/lib/handlers/sdp/RemoteUnifiedPlanSdp.js","./sdp/commonUtils":"/Users/ibc/src/mediasoup-client/lib/handlers/sdp/commonUtils.js","./sdp/unifiedPlanUtils":"/Users/ibc/src/mediasoup-client/lib/handlers/sdp/unifiedPlanUtils.js","babel-runtime/core-js/array/from":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/array/from.js","babel-runtime/core-js/map":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/map.js","babel-runtime/core-js/object/get-prototype-of":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/object/get-prototype-of.js","babel-runtime/core-js/promise":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/promise.js","babel-runtime/helpers/classCallCheck":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/classCallCheck.js","babel-runtime/helpers/createClass":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/createClass.js","babel-runtime/helpers/inherits":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/inherits.js","babel-runtime/helpers/possibleConstructorReturn":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/possibleConstructorReturn.js","sdp-transform":"/Users/ibc/src/mediasoup-client/node_modules/sdp-transform/lib/index.js"}],"/Users/ibc/src/mediasoup-client/lib/handlers/Safari11.js":[function(require,module,exports){
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-
-var _from = require('babel-runtime/core-js/array/from');
-
-var _from2 = _interopRequireDefault(_from);
-
-var _map = require('babel-runtime/core-js/map');
-
-var _map2 = _interopRequireDefault(_map);
-
-var _set = require('babel-runtime/core-js/set');
-
-var _set2 = _interopRequireDefault(_set);
-
-var _promise = require('babel-runtime/core-js/promise');
-
-var _promise2 = _interopRequireDefault(_promise);
-
-var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
-
-var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
-
-var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
-
-var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
-
-var _createClass2 = require('babel-runtime/helpers/createClass');
-
-var _createClass3 = _interopRequireDefault(_createClass2);
-
-var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
-
-var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
-
-var _inherits2 = require('babel-runtime/helpers/inherits');
-
-var _inherits3 = _interopRequireDefault(_inherits2);
-
-var _sdpTransform = require('sdp-transform');
-
-var _sdpTransform2 = _interopRequireDefault(_sdpTransform);
-
-var _Logger = require('../Logger');
-
-var _Logger2 = _interopRequireDefault(_Logger);
-
-var _EnhancedEventEmitter2 = require('../EnhancedEventEmitter');
-
-var _EnhancedEventEmitter3 = _interopRequireDefault(_EnhancedEventEmitter2);
-
-var _utils = require('../utils');
-
-var utils = _interopRequireWildcard(_utils);
-
-var _commonUtils = require('./sdp/commonUtils');
-
-var sdpCommonUtils = _interopRequireWildcard(_commonUtils);
-
-var _planBUtils = require('./sdp/planBUtils');
-
-var sdpPlanBUtils = _interopRequireWildcard(_planBUtils);
-
-var _RemotePlanBSdp = require('./sdp/RemotePlanBSdp');
-
-var _RemotePlanBSdp2 = _interopRequireDefault(_RemotePlanBSdp);
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var logger = new _Logger2.default('Safari11');
-
-var Handler = function (_EnhancedEventEmitter) {
- (0, _inherits3.default)(Handler, _EnhancedEventEmitter);
-
- function Handler(direction, rtpParametersByKind, settings) {
- (0, _classCallCheck3.default)(this, Handler);
-
- // RTCPeerConnection instance.
- // @type {RTCPeerConnection}
- var _this = (0, _possibleConstructorReturn3.default)(this, (Handler.__proto__ || (0, _getPrototypeOf2.default)(Handler)).call(this));
-
- _this._pc = new RTCPeerConnection({
- iceServers: settings.turnServers || [],
- iceTransportPolicy: 'relay',
- bundlePolicy: 'max-bundle',
- rtcpMuxPolicy: 'require'
- });
-
- // Generic sending RTP parameters for audio and video.
- // @type {Object}
- _this._rtpParametersByKind = rtpParametersByKind;
-
- // Remote SDP handler.
- // @type {RemotePlanBSdp}
- _this._remoteSdp = new _RemotePlanBSdp2.default(direction, rtpParametersByKind);
-
- // Handle RTCPeerConnection connection status.
- _this._pc.addEventListener('iceconnectionstatechange', function () {
- switch (_this._pc.iceConnectionState) {
- case 'checking':
- _this.emit('@connectionstatechange', 'connecting');
- break;
- case 'connected':
- case 'completed':
- _this.emit('@connectionstatechange', 'connected');
- break;
- case 'failed':
- _this.emit('@connectionstatechange', 'failed');
- break;
- case 'disconnected':
- _this.emit('@connectionstatechange', 'disconnected');
- break;
- case 'closed':
- _this.emit('@connectionstatechange', 'closed');
- break;
- }
- });
- return _this;
- }
-
- (0, _createClass3.default)(Handler, [{
- key: 'close',
- value: function close() {
- logger.debug('close()');
-
- // Close RTCPeerConnection.
- try {
- this._pc.close();
- } catch (error) {}
- }
- }]);
- return Handler;
-}(_EnhancedEventEmitter3.default);
-
-var SendHandler = function (_Handler) {
- (0, _inherits3.default)(SendHandler, _Handler);
-
- function SendHandler(rtpParametersByKind, settings) {
- (0, _classCallCheck3.default)(this, SendHandler);
-
- // Got transport local and remote parameters.
- // @type {Boolean}
- var _this2 = (0, _possibleConstructorReturn3.default)(this, (SendHandler.__proto__ || (0, _getPrototypeOf2.default)(SendHandler)).call(this, 'send', rtpParametersByKind, settings));
-
- _this2._transportReady = false;
-
- // Local stream.
- // @type {MediaStream}
- _this2._stream = new MediaStream();
- return _this2;
- }
-
- (0, _createClass3.default)(SendHandler, [{
- key: 'addProducer',
- value: function addProducer(producer) {
- var _this3 = this;
-
- var track = producer.track;
-
-
- logger.debug('addProducer() [id:%s, kind:%s, trackId:%s]', producer.id, producer.kind, track.id);
-
- var rtpSender = void 0;
- var localSdpObj = void 0;
-
- return _promise2.default.resolve().then(function () {
- _this3._stream.addTrack(track);
-
- // Add the stream to the PeerConnection.
- rtpSender = _this3._pc.addTrack(track, _this3._stream);
-
- return _this3._pc.createOffer();
- }).then(function (offer) {
- return _this3._pc.setLocalDescription(offer);
- }).then(function () {
- if (!_this3._transportReady) return _this3._setupTransport();
- }).then(function () {
- localSdpObj = _sdpTransform2.default.parse(_this3._pc.localDescription.sdp);
-
- var remoteSdp = _this3._remoteSdp.createAnswerSdp(localSdpObj);
- var answer = { type: 'answer', sdp: remoteSdp };
-
- return _this3._pc.setRemoteDescription(answer);
- }).then(function () {
- var rtpParameters = utils.clone(_this3._rtpParametersByKind[producer.kind]);
-
- // Fill the RTP parameters for this track.
- sdpPlanBUtils.fillRtpParametersForTrack(rtpParameters, localSdpObj, track);
-
- return rtpParameters;
- }).catch(function (error) {
- // Panic here. Try to undo things.
-
- try {
- _this3._pc.removeTrack(rtpSender);
- } catch (error2) {}
-
- _this3._stream.removeTrack(track);
-
- throw error;
- });
- }
- }, {
- key: 'removeProducer',
- value: function removeProducer(producer) {
- var _this4 = this;
-
- var track = producer.track;
-
-
- logger.debug('removeProducer() [id:%s, kind:%s, trackId:%s]', producer.id, producer.kind, track.id);
-
- return _promise2.default.resolve().then(function () {
- // Get the associated RTCRtpSender.
- var rtpSender = _this4._pc.getSenders().find(function (s) {
- return s.track === track;
- });
-
- if (!rtpSender) throw new Error('local track not found');
-
- // Remove the associated RtpSender.
- _this4._pc.removeTrack(rtpSender);
-
- // Remove the track from the local stream.
- _this4._stream.removeTrack(track);
-
- return _this4._pc.createOffer();
- }).then(function (offer) {
- return _this4._pc.setLocalDescription(offer);
- }).catch(function (error) {
- // NOTE: If there are no sending tracks, setLocalDescription() will fail with
- // "Failed to create channels". If so, ignore it.
- if (_this4._stream.getTracks().length === 0) {
- logger.warn('removeLocalTrack() | ignoring expected error due no sending tracks: %s', error.toString());
-
- return;
- }
-
- throw error;
- }).then(function () {
- if (_this4._pc.signalingState === 'stable') return;
-
- var localSdpObj = _sdpTransform2.default.parse(_this4._pc.localDescription.sdp);
- var remoteSdp = _this4._remoteSdp.createAnswerSdp(localSdpObj);
- var answer = { type: 'answer', sdp: remoteSdp };
-
- return _this4._pc.setRemoteDescription(answer);
- });
- }
- }, {
- key: '_setupTransport',
- value: function _setupTransport() {
- var _this5 = this;
-
- logger.debug('_setupTransport()');
-
- return _promise2.default.resolve().then(function () {
- // Get our local DTLS parameters.
- var transportLocalParameters = {};
- var sdp = _this5._pc.localDescription.sdp;
- var sdpObj = _sdpTransform2.default.parse(sdp);
- var dtlsParameters = sdpCommonUtils.extractDtlsParameters(sdpObj);
-
- // Let's decide that we'll be DTLS server (because we can).
- dtlsParameters.role = 'server';
-
- transportLocalParameters.dtlsParameters = dtlsParameters;
-
- // Provide the remote SDP handler with transport local parameters.
- _this5._remoteSdp.setTransportLocalParameters(transportLocalParameters);
-
- // We need transport remote parameters.
- return _this5.safeEmitAsPromise('@needcreatetransport', transportLocalParameters);
- }).then(function (transportRemoteParameters) {
- // Provide the remote SDP handler with transport remote parameters.
- _this5._remoteSdp.setTransportRemoteParameters(transportRemoteParameters);
-
- _this5._transportReady = true;
- });
- }
- }]);
- return SendHandler;
-}(Handler);
-
-var RecvHandler = function (_Handler2) {
- (0, _inherits3.default)(RecvHandler, _Handler2);
-
- function RecvHandler(rtpParametersByKind, settings) {
- (0, _classCallCheck3.default)(this, RecvHandler);
-
- // Got transport remote parameters.
- // @type {Boolean}
- var _this6 = (0, _possibleConstructorReturn3.default)(this, (RecvHandler.__proto__ || (0, _getPrototypeOf2.default)(RecvHandler)).call(this, 'recv', rtpParametersByKind, settings));
-
- _this6._transportCreated = false;
-
- // Got transport local parameters.
- // @type {Boolean}
- _this6._transportUpdated = false;
-
- // Seen media kinds.
- // @type {Set}
- _this6._kinds = new _set2.default();
-
- // Map of Consumers information indexed by consumer.id.
- // - kind {String}
- // - trackId {String}
- // - ssrc {Number}
- // - rtxSsrc {Number}
- // - cname {String}
- // @type {Map}
- _this6._consumerInfos = new _map2.default();
- return _this6;
- }
-
- (0, _createClass3.default)(RecvHandler, [{
- key: 'addConsumer',
- value: function addConsumer(consumer) {
- var _this7 = this;
-
- logger.debug('addConsumer() [id:%s, kind:%s]', consumer.id, consumer.kind);
-
- if (this._consumerInfos.has(consumer.id)) return _promise2.default.reject('Consumer already added');
-
- var encoding = consumer.rtpParameters.encodings[0];
- var cname = consumer.rtpParameters.rtcp.cname;
- var consumerInfo = {
- kind: consumer.kind,
- trackId: 'consumer-' + consumer.kind + '-' + consumer.id,
- ssrc: encoding.ssrc,
- cname: cname
- };
-
- if (encoding.rtx && encoding.rtx.ssrc) consumerInfo.rtxSsrc = encoding.rtx.ssrc;
-
- this._consumerInfos.set(consumer.id, consumerInfo);
- this._kinds.add(consumer.kind);
-
- return _promise2.default.resolve().then(function () {
- if (!_this7._transportCreated) return _this7._setupTransport();
- }).then(function () {
- var remoteSdp = _this7._remoteSdp.createOfferSdp((0, _from2.default)(_this7._kinds), (0, _from2.default)(_this7._consumerInfos.values()));
- var offer = { type: 'offer', sdp: remoteSdp };
-
- return _this7._pc.setRemoteDescription(offer);
- }).then(function () {
- return _this7._pc.createAnswer();
- }).then(function (answer) {
- return _this7._pc.setLocalDescription(answer);
- }).then(function () {
- if (!_this7._transportUpdated) return _this7._updateTransport();
- }).then(function () {
- var newRtpReceiver = _this7._pc.getReceivers().find(function (rtpReceiver) {
- var track = rtpReceiver.track;
-
-
- if (!track) return false;
-
- return track.id === consumerInfo.trackId;
- });
-
- if (!newRtpReceiver) throw new Error('remote track not found');
-
- return newRtpReceiver.track;
- });
- }
- }, {
- key: 'removeConsumer',
- value: function removeConsumer(consumer) {
- var _this8 = this;
-
- logger.debug('removeConsumer() [id:%s, kind:%s]', consumer.id, consumer.kind);
-
- if (!this._consumerInfos.has(consumer.id)) return _promise2.default.reject('Consumer not found');
-
- this._consumerInfos.delete(consumer.id);
-
- return _promise2.default.resolve().then(function () {
- var remoteSdp = _this8._remoteSdp.createOfferSdp((0, _from2.default)(_this8._kinds), (0, _from2.default)(_this8._consumerInfos.values()));
- var offer = { type: 'offer', sdp: remoteSdp };
-
- return _this8._pc.setRemoteDescription(offer);
- }).then(function () {
- return _this8._pc.createAnswer();
- }).then(function (answer) {
- return _this8._pc.setLocalDescription(answer);
- });
- }
- }, {
- key: '_setupTransport',
- value: function _setupTransport() {
- var _this9 = this;
-
- logger.debug('_setupTransport()');
-
- return _promise2.default.resolve().then(function () {
- // We need transport remote parameters.
- return _this9.safeEmitAsPromise('@needcreatetransport', null);
- }).then(function (transportRemoteParameters) {
- // Provide the remote SDP handler with transport remote parameters.
- _this9._remoteSdp.setTransportRemoteParameters(transportRemoteParameters);
-
- _this9._transportCreated = true;
- });
- }
- }, {
- key: '_updateTransport',
- value: function _updateTransport() {
- logger.debug('_updateTransport()');
-
- // Get our local DTLS parameters.
- // const transportLocalParameters = {};
- var sdp = this._pc.localDescription.sdp;
- var sdpObj = _sdpTransform2.default.parse(sdp);
- var dtlsParameters = sdpCommonUtils.extractDtlsParameters(sdpObj);
- var transportLocalParameters = { dtlsParameters: dtlsParameters };
-
- // We need to provide transport local parameters.
- this.safeEmit('@needupdatetransport', transportLocalParameters);
-
- this._transportUpdated = true;
- }
- }]);
- return RecvHandler;
-}(Handler);
-
-var Safari11 = function () {
- (0, _createClass3.default)(Safari11, null, [{
- key: 'getLocalRtpCapabilities',
- value: function getLocalRtpCapabilities() {
- logger.debug('getLocalRtpCapabilities()');
-
- var pc = new RTCPeerConnection({
- iceServers: [],
- iceTransportPolicy: 'relay',
- bundlePolicy: 'max-bundle',
- rtcpMuxPolicy: 'require'
- });
-
- pc.addTransceiver('audio');
- pc.addTransceiver('video');
-
- return pc.createOffer().then(function (offer) {
- try {
- pc.close();
- } catch (error) {}
-
- var sdpObj = _sdpTransform2.default.parse(offer.sdp);
- var localRtpCapabilities = sdpCommonUtils.extractRtpCapabilities(sdpObj);
-
- return localRtpCapabilities;
- }).catch(function (error) {
- try {
- pc.close();
- } catch (error2) {}
-
- throw error;
- });
- }
- }, {
- key: 'name',
- get: function get() {
- return 'Safari11';
- }
- }]);
-
- function Safari11(direction, extendedRtpCapabilities, settings) {
- (0, _classCallCheck3.default)(this, Safari11);
-
- logger.debug('constructor() [direction:%s, extendedRtpCapabilities:%o]', direction, extendedRtpCapabilities);
-
- var rtpParametersByKind = void 0;
-
- switch (direction) {
- case 'send':
- {
- rtpParametersByKind = {
- audio: utils.getSendingRtpParameters('audio', extendedRtpCapabilities),
- video: utils.getSendingRtpParameters('video', extendedRtpCapabilities)
- };
-
- return new SendHandler(rtpParametersByKind, settings);
- }
- case 'recv':
- {
- rtpParametersByKind = {
- audio: utils.getReceivingFullRtpParameters('audio', extendedRtpCapabilities),
- video: utils.getReceivingFullRtpParameters('video', extendedRtpCapabilities)
- };
-
- return new RecvHandler(rtpParametersByKind, settings);
- }
- }
- }
-
- return Safari11;
-}();
-
-exports.default = Safari11;
-
-},{"../EnhancedEventEmitter":"/Users/ibc/src/mediasoup-client/lib/EnhancedEventEmitter.js","../Logger":"/Users/ibc/src/mediasoup-client/lib/Logger.js","../utils":"/Users/ibc/src/mediasoup-client/lib/utils.js","./sdp/RemotePlanBSdp":"/Users/ibc/src/mediasoup-client/lib/handlers/sdp/RemotePlanBSdp.js","./sdp/commonUtils":"/Users/ibc/src/mediasoup-client/lib/handlers/sdp/commonUtils.js","./sdp/planBUtils":"/Users/ibc/src/mediasoup-client/lib/handlers/sdp/planBUtils.js","babel-runtime/core-js/array/from":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/array/from.js","babel-runtime/core-js/map":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/map.js","babel-runtime/core-js/object/get-prototype-of":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/object/get-prototype-of.js","babel-runtime/core-js/promise":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/promise.js","babel-runtime/core-js/set":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/core-js/set.js","babel-runtime/helpers/classCallCheck":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/classCallCheck.js","babel-runtime/helpers/createClass":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/createClass.js","babel-runtime/helpers/inherits":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/inherits.js","babel-runtime/helpers/possibleConstructorReturn":"/Users/ibc/src/mediasoup-client/node_modules/babel-runtime/helpers/possibleConstructorReturn.js","sdp-transform":"/Users/ibc/src/mediasoup-client/node_modules/sdp-transform/lib/index.js"}],"/Users/ibc/src/mediasoup-client/lib/handlers/sdp/RemotePlanBSdp.js":[function(require,module,exports){
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-
-var _keys = require('babel-runtime/core-js/object/keys');
-
-var _keys2 = _interopRequireDefault(_keys);
-
-var _getIterator2 = require('babel-runtime/core-js/get-iterator');
-
-var _getIterator3 = _interopRequireDefault(_getIterator2);
-
-var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
-
-var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
-
-var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
-
-var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
-
-var _inherits2 = require('babel-runtime/helpers/inherits');
-
-var _inherits3 = _interopRequireDefault(_inherits2);
-
-var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
-
-var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
-
-var _createClass2 = require('babel-runtime/helpers/createClass');
-
-var _createClass3 = _interopRequireDefault(_createClass2);
-
-var _sdpTransform = require('sdp-transform');
-
-var _sdpTransform2 = _interopRequireDefault(_sdpTransform);
-
-var _Logger = require('../../Logger');
-
-var _Logger2 = _interopRequireDefault(_Logger);
-
-var _utils = require('../../utils');
-
-var utils = _interopRequireWildcard(_utils);
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var logger = new _Logger2.default('RemotePlanBSdp');
-
-var RemoteSdp = function () {
- function RemoteSdp(rtpParametersByKind) {
- (0, _classCallCheck3.default)(this, RemoteSdp);
-
- // Generic sending RTP parameters for audio and video.
- // @type {Object}
- this._rtpParametersByKind = rtpParametersByKind;
-
- // Transport local parameters, including DTLS parameteres.
- // @type {Object}
- this._transportLocalParameters = null;
-
- // Transport remote parameters, including ICE parameters, ICE candidates
- // and DTLS parameteres.
- // @type {Object}
- this._transportRemoteParameters = null;
-
- // SDP global fields.
- // @type {Object}
- this._sdpGlobalFields = {
- id: utils.randomNumber(),
- version: 0
- };
- }
-
- (0, _createClass3.default)(RemoteSdp, [{
- key: 'setTransportLocalParameters',
- value: function setTransportLocalParameters(transportLocalParameters) {
- logger.debug('setTransportLocalParameters() [transportLocalParameters:%o]', transportLocalParameters);
-
- this._transportLocalParameters = transportLocalParameters;
- }
- }, {
- key: 'setTransportRemoteParameters',
- value: function setTransportRemoteParameters(transportRemoteParameters) {
- logger.debug('setTransportRemoteParameters() [transportRemoteParameters:%o]', transportRemoteParameters);
-
- this._transportRemoteParameters = transportRemoteParameters;
- }
- }]);
- return RemoteSdp;
-}();
-
-var SendRemoteSdp = function (_RemoteSdp) {
- (0, _inherits3.default)(SendRemoteSdp, _RemoteSdp);
-
- function SendRemoteSdp(rtpParametersByKind) {
- (0, _classCallCheck3.default)(this, SendRemoteSdp);
- return (0, _possibleConstructorReturn3.default)(this, (SendRemoteSdp.__proto__ || (0, _getPrototypeOf2.default)(SendRemoteSdp)).call(this, rtpParametersByKind));
- }
-
- (0, _createClass3.default)(SendRemoteSdp, [{
- key: 'createAnswerSdp',
- value: function createAnswerSdp(localSdpObj) {
- logger.debug('createAnswerSdp()');
-
- if (!this._transportLocalParameters) throw new Error('no transport local parameters');else if (!this._transportRemoteParameters) throw new Error('no transport remote parameters');
-
- var localDtlsParameters = this._transportLocalParameters.dtlsParameters;
- var remoteIceParameters = this._transportRemoteParameters.iceParameters;
- var remoteIceCandidates = this._transportRemoteParameters.iceCandidates;
- var remoteDtlsParameters = this._transportRemoteParameters.dtlsParameters;
- var sdpObj = {};
- var mids = (localSdpObj.media || []).map(function (m) {
- return m.mid;
- });
-
- // Increase our SDP version.
- this._sdpGlobalFields.version++;
-
- sdpObj.version = 0;
- sdpObj.origin = {
- address: '0.0.0.0',
- ipVer: 4,
- netType: 'IN',
- sessionId: this._sdpGlobalFields.id,
- sessionVersion: this._sdpGlobalFields.version,
- username: 'mediasoup-client'
- };
- sdpObj.name = '-';
- sdpObj.timing = { start: 0, stop: 0 };
- sdpObj.icelite = remoteIceParameters.iceLite ? 'ice-lite' : null;
- sdpObj.msidSemantic = {
- semantic: 'WMS',
- token: '*'
- };
- sdpObj.groups = [{
- type: 'BUNDLE',
- mids: mids.join(' ')
- }];
- sdpObj.media = [];
-
- sdpObj.fingerprint = {
- type: remoteDtlsParameters.fingerprints[0].algorithm,
- hash: remoteDtlsParameters.fingerprints[0].value
- };
-
- var _iteratorNormalCompletion = true;
- var _didIteratorError = false;
- var _iteratorError = undefined;
-
- try {
- for (var _iterator = (0, _getIterator3.default)(localSdpObj.media || []), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
- var localMediaObj = _step.value;
-
- var kind = localMediaObj.type;
- var codecs = this._rtpParametersByKind[kind].codecs;
- var headerExtensions = this._rtpParametersByKind[kind].headerExtensions;
- var remoteMediaObj = {};
-
- remoteMediaObj.type = localMediaObj.type;
- remoteMediaObj.port = 7;
- remoteMediaObj.protocol = 'RTP/SAVPF';
- remoteMediaObj.connection = { ip: '127.0.0.1', version: 4 };
- remoteMediaObj.mid = localMediaObj.mid;
-
- remoteMediaObj.iceUfrag = remoteIceParameters.usernameFragment;
- remoteMediaObj.icePwd = remoteIceParameters.password;
- remoteMediaObj.candidates = [];
-
- var _iteratorNormalCompletion2 = true;
- var _didIteratorError2 = false;
- var _iteratorError2 = undefined;
-
- try {
- for (var _iterator2 = (0, _getIterator3.default)(remoteIceCandidates), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
- var candidate = _step2.value;
-
- var candidateObj = {};
-
- // mediasoup does not support non rtcp-mux so candidates component is
- // always RTP (1).
- candidateObj.component = 1;
- candidateObj.foundation = candidate.foundation;
- candidateObj.ip = candidate.ip;
- candidateObj.port = candidate.port;
- candidateObj.priority = candidate.priority;
- candidateObj.transport = candidate.protocol;
- candidateObj.type = candidate.type;
- if (candidate.tcpType) candidateObj.tcptype = candidate.tcpType;
-
- remoteMediaObj.candidates.push(candidateObj);
- }
- } catch (err) {
- _didIteratorError2 = true;
- _iteratorError2 = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion2 && _iterator2.return) {
- _iterator2.return();
- }
- } finally {
- if (_didIteratorError2) {
- throw _iteratorError2;
- }
- }
- }
-
- remoteMediaObj.endOfCandidates = 'end-of-candidates';
-
- // Announce support for ICE renomination.
- // https://tools.ietf.org/html/draft-thatcher-ice-renomination
- remoteMediaObj.iceOptions = 'renomination';
-
- switch (localDtlsParameters.role) {
- case 'client':
- remoteMediaObj.setup = 'active';
- break;
- case 'server':
- remoteMediaObj.setup = 'passive';
- break;
- }
-
- switch (localMediaObj.direction) {
- case 'sendrecv':
- case 'sendonly':
- remoteMediaObj.direction = 'recvonly';
- break;
- case 'recvonly':
- case 'inactive':
- remoteMediaObj.direction = 'inactive';
- break;
- }
-
- remoteMediaObj.rtp = [];
- remoteMediaObj.rtcpFb = [];
- remoteMediaObj.fmtp = [];
-
- var _iteratorNormalCompletion3 = true;
- var _didIteratorError3 = false;
- var _iteratorError3 = undefined;
-
- try {
- for (var _iterator3 = (0, _getIterator3.default)(codecs), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
- var codec = _step3.value;
-
- var rtp = {
- payload: codec.payloadType,
- codec: codec.name,
- rate: codec.clockRate
- };
-
- if (codec.channels > 1) rtp.encoding = codec.channels;
-
- remoteMediaObj.rtp.push(rtp);
-
- if (codec.parameters) {
- var paramFmtp = {
- payload: codec.payloadType,
- config: ''
- };
-
- var _iteratorNormalCompletion5 = true;
- var _didIteratorError5 = false;
- var _iteratorError5 = undefined;
-
- try {
- for (var _iterator5 = (0, _getIterator3.default)((0, _keys2.default)(codec.parameters)), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
- var key = _step5.value;
-
- if (paramFmtp.config) paramFmtp.config += ';';
-
- paramFmtp.config += key + '=' + codec.parameters[key];
- }
- } catch (err) {
- _didIteratorError5 = true;
- _iteratorError5 = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion5 && _iterator5.return) {
- _iterator5.return();
- }
- } finally {
- if (_didIteratorError5) {
- throw _iteratorError5;
- }
- }
- }
-
- if (paramFmtp.config) remoteMediaObj.fmtp.push(paramFmtp);
- }
-
- if (codec.rtcpFeedback) {
- var _iteratorNormalCompletion6 = true;
- var _didIteratorError6 = false;
- var _iteratorError6 = undefined;
-
- try {
- for (var _iterator6 = (0, _getIterator3.default)(codec.rtcpFeedback), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
- var fb = _step6.value;
-
- remoteMediaObj.rtcpFb.push({
- payload: codec.payloadType,
- type: fb.type,
- subtype: fb.parameter
- });
- }
- } catch (err) {
- _didIteratorError6 = true;
- _iteratorError6 = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion6 && _iterator6.return) {
- _iterator6.return();
- }
- } finally {
- if (_didIteratorError6) {
- throw _iteratorError6;
- }
- }
- }
- }
- }
- } catch (err) {
- _didIteratorError3 = true;
- _iteratorError3 = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion3 && _iterator3.return) {
- _iterator3.return();
- }
- } finally {
- if (_didIteratorError3) {
- throw _iteratorError3;
- }
- }
- }
-
- remoteMediaObj.payloads = codecs.map(function (codec) {
- return codec.payloadType;
- }).join(' ');
-
- remoteMediaObj.ext = [];
-
- var _iteratorNormalCompletion4 = true;
- var _didIteratorError4 = false;
- var _iteratorError4 = undefined;
-
- try {
- for (var _iterator4 = (0, _getIterator3.default)(headerExtensions), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
- var ext = _step4.value;
-
- remoteMediaObj.ext.push({
- uri: ext.uri,
- value: ext.id
- });
- }
- } catch (err) {
- _didIteratorError4 = true;
- _iteratorError4 = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion4 && _iterator4.return) {
- _iterator4.return();
- }
- } finally {
- if (_didIteratorError4) {
- throw _iteratorError4;
- }
- }
- }
-
- remoteMediaObj.rtcpMux = 'rtcp-mux';
- remoteMediaObj.rtcpRsize = 'rtcp-rsize';
-
- // Push it.
- sdpObj.media.push(remoteMediaObj);
- }
- } catch (err) {
- _didIteratorError = true;
- _iteratorError = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion && _iterator.return) {
- _iterator.return();
- }
- } finally {
- if (_didIteratorError) {
- throw _iteratorError;
- }
- }
- }
-
- var sdp = _sdpTransform2.default.write(sdpObj);
-
- return sdp;
- }
- }]);
- return SendRemoteSdp;
-}(RemoteSdp);
-
-var RecvRemoteSdp = function (_RemoteSdp2) {
- (0, _inherits3.default)(RecvRemoteSdp, _RemoteSdp2);
-
- function RecvRemoteSdp(rtpParametersByKind) {
- (0, _classCallCheck3.default)(this, RecvRemoteSdp);
-
- // Id of the unique MediaStream for all the remote tracks.
- var _this2 = (0, _possibleConstructorReturn3.default)(this, (RecvRemoteSdp.__proto__ || (0, _getPrototypeOf2.default)(RecvRemoteSdp)).call(this, rtpParametersByKind));
-
- _this2._streamId = 'recv-stream-' + utils.randomNumber();
- return _this2;
- }
-
- /**
- * @param {Array} kinds - Media kinds.
- * @param {Array