@signalwire/js
Version:
89 lines (80 loc) • 2.86 kB
text/typescript
import {
getLogger,
SagaIterator,
CallJoinedEvent,
sagaEffects,
MemberPosition,
stripNamespacePrefix,
} from '@signalwire/core'
import {
createFabricRoomSessionMemberObject,
FabricRoomSessionMember,
} from '../FabricRoomSessionMember'
import { FabricWorkerParams } from './fabricWorker'
import { fabricMemberWorker } from './fabricMemberWorker'
import { mapCapabilityPayload } from '../utils/capabilitiesHelpers'
import { mapCallJoinedToRoomSubscribedEventParams } from '../utils/eventMappers'
export const callJoinWorker = function* (
options: FabricWorkerParams<CallJoinedEvent>
): SagaIterator {
getLogger().trace('callJoinWorker started')
const { action, instanceMap, instance: cfRoomSession } = options
const { payload } = action
const { get, set } = instanceMap
yield sagaEffects.fork(MemberPosition.memberPositionWorker, {
...options,
/**
* The {@link memberPositionWorker} worker understands only the Video SDK events.
* So, we need to map CF SDK event to Video SDK event.
* Similar to what we do in the {@link callSegmentWorker}, for member events.
*/
initialState: mapCallJoinedToRoomSubscribedEventParams(payload),
dispatcher: function* (subType, subPayload) {
/**
* The {@link memberPositionWorker} dispatches the Video SDK events.
* We need to convert it back to CF SDK event before emitting to the user.
*/
const fabricType = stripNamespacePrefix(subType, 'video') as any
const fabricPaylod = {
...subPayload,
member: {
...subPayload.member,
member_id: subPayload.member.id,
},
}
yield sagaEffects.fork(fabricMemberWorker, {
...options,
action: { type: fabricType, payload: fabricPaylod },
})
},
})
payload.room_session.members?.forEach((member: any) => {
let memberInstance = get<FabricRoomSessionMember>(member.member_id!)
if (!memberInstance) {
memberInstance = createFabricRoomSessionMemberObject({
store: cfRoomSession.store,
payload: {
member: member,
room_id: payload.room_id,
room_session_id: payload.room_session_id,
},
})
} else {
memberInstance.setPayload({
member: member,
room_id: payload.room_id,
room_session_id: payload.room_session_id,
})
}
set<FabricRoomSessionMember>(member.member_id, memberInstance)
})
cfRoomSession.member = get<FabricRoomSessionMember>(payload.member_id)
// the server send the capabilities payload as an array of string
cfRoomSession.capabilities = mapCapabilityPayload(payload.capabilities)
const fabricEvent = {
...payload,
capabilities: cfRoomSession.capabilities,
}
cfRoomSession.emit('call.joined', fabricEvent)
getLogger().trace('callJoinWorker ended')
}