You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

139 lines
2.7 KiB

const initialState = {};
const peers = (state = initialState, action) =>
{
switch (action.type)
{
case 'SET_ROOM_STATE':
{
const roomState = action.payload.state;
if (roomState === 'closed')
return {};
else
return state;
}
case 'ADD_PEER':
{
const { peer } = action.payload;
return { ...state, [peer.id]: peer };
}
case 'REMOVE_PEER':
{
const { peerId } = action.payload;
const newState = { ...state };
delete newState[peerId];
return newState;
}
case 'SET_PEER_DISPLAY_NAME':
{
const { displayName, peerId } = action.payload;
const peer = state[peerId];
if (!peer)
throw new Error('no Peer found');
const newPeer = { ...peer, displayName };
return { ...state, [newPeer.id]: newPeer };
}
case 'ADD_CONSUMER':
{
const { consumer, peerId } = action.payload;
const peer = state[peerId];
if (!peer)
throw new Error('no Peer found for new Consumer');
const newConsumers = [ ...peer.consumers, consumer.id ];
const newPeer = { ...peer, consumers: newConsumers };
return { ...state, [newPeer.id]: newPeer };
}
case 'REMOVE_CONSUMER':
{
const { consumerId, peerId } = action.payload;
const peer = state[peerId];
// NOTE: This means that the Peer was closed before, so it's ok.
if (!peer)
return state;
const idx = peer.consumers.indexOf(consumerId);
if (idx === -1)
throw new Error('Consumer not found');
const newConsumers = peer.consumers.slice();
newConsumers.splice(idx, 1);
const newPeer = { ...peer, consumers: newConsumers };
return { ...state, [newPeer.id]: newPeer };
}
case 'ADD_DATA_CONSUMER':
{
const { dataConsumer, peerId } = action.payload;
// special case for bot DataConsumer.
if (!peerId)
return state;
const peer = state[peerId];
if (!peer)
throw new Error('no Peer found for new DataConsumer');
const newDataConsumers = [ ...peer.dataConsumers, dataConsumer.id ];
const newPeer = { ...peer, dataConsumers: newDataConsumers };
return { ...state, [newPeer.id]: newPeer };
}
case 'REMOVE_DATA_CONSUMER':
{
const { dataConsumerId, peerId } = action.payload;
// special case for bot DataConsumer.
if (!peerId)
return state;
const peer = state[peerId];
// NOTE: This means that the Peer was closed before, so it's ok.
if (!peer)
return state;
const idx = peer.dataConsumers.indexOf(dataConsumerId);
if (idx === -1)
throw new Error('DataConsumer not found');
const newDataConsumers = peer.dataConsumers.slice();
newDataConsumers.splice(idx, 1);
const newPeer = { ...peer, dataConsumers: newDataConsumers };
return { ...state, [newPeer.id]: newPeer };
}
default:
{
return state;
}
}
};
export default peers;