package webrtc
import (
"fmt"
"sync/atomic"
"github.com/pion/webrtc/v4/pkg/rtcerr"
)
type stateChangeOp int
const (
stateChangeOpSetLocal stateChangeOp = iota + 1
stateChangeOpSetRemote
)
func (op stateChangeOp ) String () string {
switch op {
case stateChangeOpSetLocal :
return "SetLocal"
case stateChangeOpSetRemote :
return "SetRemote"
default :
return "Unknown State Change Operation"
}
}
type SignalingState int32
const (
SignalingStateUnknown SignalingState = iota
SignalingStateStable
SignalingStateHaveLocalOffer
SignalingStateHaveRemoteOffer
SignalingStateHaveLocalPranswer
SignalingStateHaveRemotePranswer
SignalingStateClosed
)
const (
signalingStateStableStr = "stable"
signalingStateHaveLocalOfferStr = "have-local-offer"
signalingStateHaveRemoteOfferStr = "have-remote-offer"
signalingStateHaveLocalPranswerStr = "have-local-pranswer"
signalingStateHaveRemotePranswerStr = "have-remote-pranswer"
signalingStateClosedStr = "closed"
)
func newSignalingState(raw string ) SignalingState {
switch raw {
case signalingStateStableStr :
return SignalingStateStable
case signalingStateHaveLocalOfferStr :
return SignalingStateHaveLocalOffer
case signalingStateHaveRemoteOfferStr :
return SignalingStateHaveRemoteOffer
case signalingStateHaveLocalPranswerStr :
return SignalingStateHaveLocalPranswer
case signalingStateHaveRemotePranswerStr :
return SignalingStateHaveRemotePranswer
case signalingStateClosedStr :
return SignalingStateClosed
default :
return SignalingStateUnknown
}
}
func (t SignalingState ) String () string {
switch t {
case SignalingStateStable :
return signalingStateStableStr
case SignalingStateHaveLocalOffer :
return signalingStateHaveLocalOfferStr
case SignalingStateHaveRemoteOffer :
return signalingStateHaveRemoteOfferStr
case SignalingStateHaveLocalPranswer :
return signalingStateHaveLocalPranswerStr
case SignalingStateHaveRemotePranswer :
return signalingStateHaveRemotePranswerStr
case SignalingStateClosed :
return signalingStateClosedStr
default :
return ErrUnknownType .Error()
}
}
func (t *SignalingState ) Get () SignalingState {
return SignalingState (atomic .LoadInt32 ((*int32 )(t )))
}
func (t *SignalingState ) Set (state SignalingState ) {
atomic .StoreInt32 ((*int32 )(t ), int32 (state ))
}
func checkNextSignalingState(cur , next SignalingState , op stateChangeOp , sdpType SDPType ) (SignalingState , error ) {
if sdpType == SDPTypeRollback && cur == SignalingStateStable {
return cur , &rtcerr .InvalidModificationError {
Err : errSignalingStateCannotRollback ,
}
}
switch cur {
case SignalingStateStable :
switch op {
case stateChangeOpSetLocal :
if sdpType == SDPTypeOffer && next == SignalingStateHaveLocalOffer {
return next , nil
}
case stateChangeOpSetRemote :
if sdpType == SDPTypeOffer && next == SignalingStateHaveRemoteOffer {
return next , nil
}
}
case SignalingStateHaveLocalOffer :
if op == stateChangeOpSetRemote {
switch sdpType {
case SDPTypeAnswer :
if next == SignalingStateStable {
return next , nil
}
case SDPTypePranswer :
if next == SignalingStateHaveRemotePranswer {
return next , nil
}
}
}
case SignalingStateHaveRemotePranswer :
if op == stateChangeOpSetRemote && sdpType == SDPTypeAnswer {
if next == SignalingStateStable {
return next , nil
}
}
case SignalingStateHaveRemoteOffer :
if op == stateChangeOpSetLocal {
switch sdpType {
case SDPTypeAnswer :
if next == SignalingStateStable {
return next , nil
}
case SDPTypePranswer :
if next == SignalingStateHaveLocalPranswer {
return next , nil
}
}
}
case SignalingStateHaveLocalPranswer :
if op == stateChangeOpSetLocal && sdpType == SDPTypeAnswer {
if next == SignalingStateStable {
return next , nil
}
}
}
return cur , &rtcerr .InvalidModificationError {
Err : fmt .Errorf ("%w: %s->%s(%s)->%s" , errSignalingStateProposedTransitionInvalid , cur , op , sdpType , next ),
}
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .