@signalwire/js
Version:
243 lines (223 loc) • 7.03 kB
text/typescript
import {
CapabilityError,
MemberCommandParams,
MemberCommandWithValueParams,
MemberCommandWithVolumeParams,
Rooms,
SetAudioFlagsParams,
} from '@signalwire/core'
import { FabricRoomSessionConnection } from '../FabricRoomSession'
const isSelfMember = (
params: MemberCommandParams | undefined,
ctx: FabricRoomSessionConnection
) => {
return !params?.memberId || params.memberId === ctx.member.id
}
export function validateAudioMute(
this: FabricRoomSessionConnection,
params?: MemberCommandParams
) {
const isSelf = isSelfMember(params, this)
const capability = isSelf
? this.capabilities?.self.muteAudio.off
: this.capabilities?.member.muteAudio.off
if (!capability) {
throw new CapabilityError('Missing audio mute capability')
}
}
export function validateAudioUnmute(
this: FabricRoomSessionConnection,
params?: MemberCommandParams
) {
const isSelf = isSelfMember(params, this)
const capability = isSelf
? this.capabilities?.self.muteAudio.on
: this.capabilities?.member.muteAudio.on
if (!capability) {
throw new CapabilityError('Missing audio unmute capability')
}
}
export function validateVideoMute(
this: FabricRoomSessionConnection,
params?: MemberCommandParams
) {
const isSelf = isSelfMember(params, this)
const capability = isSelf
? this.capabilities?.self.muteVideo.off
: this.capabilities?.member.muteVideo.off
if (!capability) {
throw new CapabilityError('Missing video mute capability')
}
}
export function validateVideoUnmute(
this: FabricRoomSessionConnection,
params?: MemberCommandParams
) {
const isSelf = isSelfMember(params, this)
const capability = isSelf
? this.capabilities?.self.muteVideo.on
: this.capabilities?.member.muteVideo.on
if (!capability) {
throw new CapabilityError('Missing video unmute capability')
}
}
export function validateDeaf(
this: FabricRoomSessionConnection,
params?: MemberCommandParams
) {
const isSelf = isSelfMember(params, this)
const capability = isSelf
? this.capabilities?.self.deaf.on
: this.capabilities?.member.deaf.on
if (!capability) {
throw new CapabilityError('Missing deaf capability')
}
}
export function validateUndeaf(
this: FabricRoomSessionConnection,
params?: MemberCommandParams
) {
const isSelf = isSelfMember(params, this)
const capability = isSelf
? this.capabilities?.self.deaf.off
: this.capabilities?.member.deaf.off
if (!capability) {
throw new CapabilityError('Missing undeaf capability')
}
}
export function validateRemoveMember(
this: FabricRoomSessionConnection,
params: Required<MemberCommandParams>
) {
if (!params?.memberId) {
throw new TypeError('Invalid or missing "memberId" argument')
}
const capability = this.capabilities?.member.remove
if (!capability) {
throw new CapabilityError('Missing remove member capability')
}
}
export function validateSetRaiseHand(
this: FabricRoomSessionConnection,
params?: Rooms.SetRaisedHandRoomParams
) {
const { raised = true } = params || {}
const self = isSelfMember(params, this)
const raiseCap = self
? this.capabilities?.self.raisehand.on
: this.capabilities?.member.raisehand.on
const lowerCap = self
? this.capabilities?.self.raisehand.off
: this.capabilities?.member.raisehand.off
if (raised && !raiseCap) {
throw new CapabilityError('Missing raisehand capability')
}
if (!raised && !lowerCap) {
throw new CapabilityError('Missing lowerhand capability')
}
}
export function validateSetLayout(this: FabricRoomSessionConnection) {
if (!this.capabilities?.setLayout) {
throw new CapabilityError('Missing setLayout capability')
}
}
export function validateSetInputVolume(
this: FabricRoomSessionConnection,
params: MemberCommandWithVolumeParams
) {
const isSelf = isSelfMember(params, this)
const capability = isSelf
? this.capabilities?.self?.microphoneVolume
: this.capabilities?.member?.microphoneVolume
if (!capability) {
throw new CapabilityError('Missing setInputVolume capability')
}
if (params.volume < -50 || params.volume > 50) {
throw new RangeError('The volume ranges from -50 to 50')
}
}
export function validateSetOutputVolume(
this: FabricRoomSessionConnection,
params: MemberCommandWithVolumeParams
) {
const isSelf = isSelfMember(params, this)
const capability = isSelf
? this.capabilities?.self?.speakerVolume
: this.capabilities?.member?.speakerVolume
if (!capability) {
throw new CapabilityError('Missing setOutputVolume capability')
}
if (params.volume < -50 || params.volume > 50) {
throw new RangeError('The volume ranges from -50 to 50')
}
}
export function validateSetInputSensitivity(
this: FabricRoomSessionConnection,
params: MemberCommandWithValueParams
) {
const isSelf = isSelfMember(params, this)
const capability = isSelf
? this.capabilities?.self.microphoneSensitivity
: this.capabilities?.member.microphoneSensitivity
if (!capability) {
throw new CapabilityError('Missing setInputSensitivity capability')
}
if (params.value < 0 || params.value > 100) {
throw new RangeError('The sensitivity value ranges from 0 to 100')
}
}
export function validateSetPositions(
this: FabricRoomSessionConnection,
params: Rooms.SetPositionsParams
) {
if (params.positions && !Object.keys(params.positions).length) {
throw new TypeError('Invalid positions specified')
}
const hasSelfPositions = Object.keys(params.positions).some((p) =>
['self', `${this.memberId}`].includes(p)
)
const capability = hasSelfPositions
? this.capabilities?.self.position
: this.capabilities?.member.position
if (!capability) {
throw new CapabilityError('Missing setPositions capability')
}
}
export function validateLock(this: FabricRoomSessionConnection) {
if (!this.capabilities?.lock.on) {
throw new CapabilityError('Missing lock capability')
}
}
export function validateUnlock(this: FabricRoomSessionConnection) {
if (!this.capabilities?.lock.off) {
throw new CapabilityError('Missing unlock capability')
}
}
export function validateSetAudioFlags(
this: FabricRoomSessionConnection,
params?: SetAudioFlagsParams
) {
const isSelf = isSelfMember(params, this)
const capability = isSelf
? this.capabilities?.self.audioFlags
: this.capabilities?.member.audioFlags
if (!capability) {
throw new CapabilityError('Missing audio flags capability')
}
const { echoCancellation, autoGain, noiseSuppression } = params || {}
if (
echoCancellation === undefined &&
autoGain === undefined &&
noiseSuppression === undefined
) {
throw new TypeError(
'Invalid parameters: you must specify at least one of `echoCancellation`, `autoGain`, or `noiseSuppression`'
)
}
}
export function validateEnd(this: FabricRoomSessionConnection) {
const capability = this.capabilities?.end
if (!capability) {
throw new CapabilityError("Missing 'end' capability")
}
}