sip

package
v1.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 9, 2025 License: Apache-2.0 Imports: 61 Imported by: 0

Documentation

Index

Constants

View Source
const (
	RoomSampleRate = 48000
	RoomResample   = false
)
View Source
const (
	AttrSIPCallIDFull = livekit.AttrSIPPrefix + "callIDFull"
	AttrSIPCallTag    = livekit.AttrSIPPrefix + "callTag"
)
View Source
const (
	CallDialing
	CallRinging
	CallAutomation
	CallActive
	CallHangup
)
View Source
const (
	AuthNotFound = AuthResult(iota)
	AuthDrop
	AuthPassword
	AuthAccept
	AuthQuotaExceeded
	AuthNoTrunkFound
)
View Source
const (
	DispatchAccept = DispatchResult(iota)
	DispatchRequestPin
	DispatchNoRuleReject // reject the call with an error
	DispatchNoRuleDrop   // silently drop the call
)
View Source
const (
	TransportUDP = Transport("udp")
	TransportTCP = Transport("tcp")
	TransportTLS = Transport("tls")
)
View Source
const (
	UserAgent = "LiveKit"
)

Variables

This section is empty.

Functions

func AttrsToHeaders

func AttrsToHeaders(attrs, attrToHdr, headers map[string]string) map[string]string

func ConfigureTLS

func ConfigureTLS(c *tls.Config)

func HeadersToAttrs

func HeadersToAttrs(attrs, hdrToAttr map[string]string, opts livekit.SIPHeaderOptions, c Signaling, headers Headers) map[string]string

func LoggerWithHeaders

func LoggerWithHeaders(log logger.Logger, c Signaling) logger.Logger

func LoggerWithParams

func LoggerWithParams(log logger.Logger, c Signaling) logger.Logger

func NewReferRequest

func NewReferRequest(inviteRequest *sip.Request, inviteResponse *sip.Response, contactHeader *sip.ContactHeader, referToUrl string, headers map[string]string) *sip.Request

func SIPTransportFrom

func SIPTransportFrom(t Transport) livekit.SIPTransport

func SelectValue

func SelectValue[T any](then, els T, probElse float64) T

func SelectValueBool

func SelectValueBool(then bool, probElse float64) bool

func ToSIPUri

func ToSIPUri(ip string, u sip.Uri) *livekit.SIPUri

Types

type ActiveCalls

type ActiveCalls struct {
	Inbound   int
	Outbound  int
	SampleIDs []string
}

func (ActiveCalls) Total

func (st ActiveCalls) Total() int

type AuthInfo

type AuthInfo struct {
	Result       AuthResult
	ProjectID    string
	TrunkID      string
	Username     string
	Password     string
	ProviderInfo *livekit.ProviderInfo
}

type AuthResult

type AuthResult int

type CallDispatch

type CallDispatch struct {
	Result              DispatchResult
	Room                RoomConfig
	ProjectID           string
	TrunkID             string
	DispatchRuleID      string
	Headers             map[string]string
	HeadersToAttributes map[string]string
	IncludeHeaders      livekit.SIPHeaderOptions
	AttributesToHeaders map[string]string
	EnabledFeatures     []livekit.SIPFeature
	RingingTimeout      time.Duration
	MaxCallDuration     time.Duration
	MediaEncryption     livekit.SIPMediaEncryption
}

type CallIdentifier

type CallIdentifier struct {
	TraceID   traceid.ID
	ProjectID string
	CallID    string
	SipCallID string
}

type CallInfo

type CallInfo struct {
	TrunkID string
	Call    *rpc.SIPCall
	Pin     string
	NoPin   bool
}

type CallState

type CallState struct {
	// contains filtered or unexported fields
}

func NewCallState

func NewCallState(cli StateUpdater, initial *livekit.SIPCallInfo) *CallState

func (*CallState) DeferUpdate

func (s *CallState) DeferUpdate(update func(info *livekit.SIPCallInfo))

func (*CallState) EndTransfer

func (s *CallState) EndTransfer(ctx context.Context, transferID string, inErr error)

func (*CallState) Flush

func (s *CallState) Flush(ctx context.Context)

func (*CallState) ForceFlush

func (s *CallState) ForceFlush(ctx context.Context)

func (*CallState) StartTransfer

func (s *CallState) StartTransfer(ctx context.Context, transferTo string) string

func (*CallState) Update

func (s *CallState) Update(ctx context.Context, update func(info *livekit.SIPCallInfo))

type CallStatus

type CallStatus int

func (CallStatus) Attribute

func (v CallStatus) Attribute() string

func (CallStatus) DisconnectReason

func (v CallStatus) DisconnectReason() livekit.DisconnectReason

func (CallStatus) SIPStatus

func (v CallStatus) SIPStatus() (sip.StatusCode, string)

type Client

type Client struct {
	// contains filtered or unexported fields
}

func NewClient

func NewClient(region string, conf *config.Config, log logger.Logger, mon *stats.Monitor, getIOClient GetIOInfoClient) *Client

func (*Client) ContactURI

func (c *Client) ContactURI(tr Transport) URI

func (*Client) DeregisterTransferSIPParticipant

func (c *Client) DeregisterTransferSIPParticipant(sipCallID string)

func (*Client) OnRequest

func (c *Client) OnRequest(req *sip.Request, tx sip.ServerTransaction) bool

func (*Client) RegisterTransferSIPParticipant

func (c *Client) RegisterTransferSIPParticipant(sipCallID string, o *outboundCall) error

func (*Client) SetHandler

func (c *Client) SetHandler(handler Handler)

func (*Client) Start

func (c *Client) Start(agent *sipgo.UserAgent, sc *ServiceConfig) error

func (*Client) Stop

func (c *Client) Stop()

type DispatchResult

type DispatchResult int

type GetIOInfoClient

type GetIOInfoClient func(projectID string) rpc.IOInfoClient

type Handler

type Handler interface {
	GetAuthCredentials(ctx context.Context, call *rpc.SIPCall) (AuthInfo, error)
	DispatchCall(ctx context.Context, info *CallInfo) CallDispatch
	GetMediaProcessor(features []livekit.SIPFeature) msdk.PCM16Processor

	RegisterTransferSIPParticipantTopic(sipCallId string) error
	DeregisterTransferSIPParticipantTopic(sipCallId string)

	OnSessionEnd(ctx context.Context, callIdentifier *CallIdentifier, callInfo *livekit.SIPCallInfo, reason string)
}

type Headers

type Headers []sip.Header

func (Headers) GetHeader

func (h Headers) GetHeader(name string) sip.Header

type LocalTag

type LocalTag string

type MediaConf

type MediaConf struct {
	sdp.MediaConfig
	Processor msdk.PCM16Processor
}

type MediaOptions

type MediaOptions struct {
	IP                  netip.Addr
	Ports               rtcconfig.PortRange
	MediaTimeoutInitial time.Duration
	MediaTimeout        time.Duration
	Stats               *PortStats
	EnableJitterBuffer  bool
	NoInputResample     bool
}

type MediaPort

type MediaPort struct {
	// contains filtered or unexported fields
}

MediaPort combines all functionality related to sending and accepting SIP media.

func NewMediaPort

func NewMediaPort(tid traceid.ID, log logger.Logger, mon *stats.CallMonitor, opts *MediaOptions, sampleRate int) (*MediaPort, error)

func NewMediaPortWith

func NewMediaPortWith(tid traceid.ID, log logger.Logger, mon *stats.CallMonitor, conn UDPConn, opts *MediaOptions, sampleRate int) (*MediaPort, error)

func (*MediaPort) Close

func (p *MediaPort) Close()

func (*MediaPort) Config

func (p *MediaPort) Config() *MediaConf

func (*MediaPort) DisableOut

func (p *MediaPort) DisableOut()

func (*MediaPort) EnableOut

func (p *MediaPort) EnableOut()

func (*MediaPort) EnableTimeout

func (p *MediaPort) EnableTimeout(enabled bool)

func (*MediaPort) GetAudioWriter

func (p *MediaPort) GetAudioWriter() msdk.PCM16Writer

GetAudioWriter returns audio writer that will send PCM to the destination via RTP.

func (*MediaPort) HandleDTMF

func (p *MediaPort) HandleDTMF(h func(ev dtmf.Event))

HandleDTMF sets an incoming DTMF handler.

func (*MediaPort) NewOffer

func (p *MediaPort) NewOffer(encrypted sdp.Encryption) (*sdp.Offer, error)

NewOffer generates an SDP offer for the media.

func (*MediaPort) Port

func (p *MediaPort) Port() int

func (*MediaPort) Received

func (p *MediaPort) Received() <-chan struct{}

func (*MediaPort) SetAnswer

func (p *MediaPort) SetAnswer(offer *sdp.Offer, answerData []byte, enc sdp.Encryption) (*MediaConf, error)

SetAnswer decodes and applies SDP answer for offer from NewOffer. SetConfig must be called with the decoded configuration.

func (*MediaPort) SetConfig

func (p *MediaPort) SetConfig(c *MediaConf) error

func (*MediaPort) SetDTMFAudio

func (p *MediaPort) SetDTMFAudio(enabled bool)

SetDTMFAudio forces SIP to generate audio dTMF tones in addition to digital signals.

func (*MediaPort) SetOffer

func (p *MediaPort) SetOffer(offerData []byte, enc sdp.Encryption) (*sdp.Answer, *MediaConf, error)

SetOffer decodes the offer from another party and returns encoded answer. To accept the offer, call SetConfig.

func (*MediaPort) SetTimeout

func (p *MediaPort) SetTimeout(initial, general time.Duration)

func (*MediaPort) Timeout

func (p *MediaPort) Timeout() <-chan struct{}

func (*MediaPort) WriteAudioTo

func (p *MediaPort) WriteAudioTo(w msdk.PCM16Writer)

WriteAudioTo sets audio writer that will receive decoded PCM from incoming RTP packets.

func (*MediaPort) WriteDTMF

func (p *MediaPort) WriteDTMF(ctx context.Context, digits string) error

type MixerStatsSnapshot

type MixerStatsSnapshot struct {
	Tracks      int64  `json:"tracks"`
	TracksTotal uint64 `json:"tracks_total"`
	Restarts    uint64 `json:"restarts"`

	Mixes      uint64 `json:"mixes"`
	TimedMixes uint64 `json:"mixes_timed"`
	JumpMixes  uint64 `json:"mixes_jump"`
	ZeroMixes  uint64 `json:"mixes_zero"`

	InputSamples uint64 `json:"input_samples"`
	InputFrames  uint64 `json:"input_frames"`

	MixedSamples uint64 `json:"mixed_samples"`
	MixedFrames  uint64 `json:"mixed_frames"`

	OutputSamples uint64 `json:"output_samples"`
	OutputFrames  uint64 `json:"output_frames"`
}

type ParticipantConfig

type ParticipantConfig struct {
	Identity   string
	Name       string
	Metadata   string
	Attributes map[string]string
}

type ParticipantInfo

type ParticipantInfo struct {
	ID       string
	RoomName string
	Identity string
	Name     string
}

type PortStats

type PortStats struct {
	Streams        atomic.Uint64
	Packets        atomic.Uint64
	IgnoredPackets atomic.Uint64
	InputPackets   atomic.Uint64

	MuxPackets atomic.Uint64
	MuxBytes   atomic.Uint64

	AudioPackets atomic.Uint64
	AudioBytes   atomic.Uint64

	DTMFPackets atomic.Uint64
	DTMFBytes   atomic.Uint64

	Closed atomic.Bool
}

type PortStatsSnapshot

type PortStatsSnapshot struct {
	Streams        uint64 `json:"streams"`
	Packets        uint64 `json:"packets"`
	IgnoredPackets uint64 `json:"packets_ignored"`
	InputPackets   uint64 `json:"packets_input"`

	MuxPackets uint64 `json:"mux_packets"`
	MuxBytes   uint64 `json:"mux_bytes"`

	AudioPackets uint64 `json:"audio_packets"`
	AudioBytes   uint64 `json:"audio_bytes"`

	DTMFPackets uint64 `json:"dtmf_packets"`
	DTMFBytes   uint64 `json:"dtmf_bytes"`

	Closed bool `json:"closed"`
}

type ReasonHeader

type ReasonHeader struct {
	Type  string
	Cause int
	Text  string
}

func ParseReasonHeader

func ParseReasonHeader(header string) (ReasonHeader, error)

func (ReasonHeader) IsNormal

func (r ReasonHeader) IsNormal() bool

func (ReasonHeader) IsZero

func (r ReasonHeader) IsZero() bool

func (ReasonHeader) String

func (r ReasonHeader) String() string

type RemoteTag

type RemoteTag string

type RequestHandler

type RequestHandler func(req *sip.Request, tx sip.ServerTransaction) bool

type Room

type Room struct {
	// contains filtered or unexported fields
}

func NewRoom

func NewRoom(log logger.Logger, st *RoomStats) *Room

func (*Room) Close

func (r *Room) Close() error

func (*Room) CloseOutput

func (r *Room) CloseOutput() error

func (*Room) CloseWithReason

func (r *Room) CloseWithReason(reason livekit.DisconnectReason) error

func (*Room) Closed

func (r *Room) Closed() <-chan struct{}

func (*Room) Connect

func (r *Room) Connect(conf *config.Config, rconf RoomConfig) error

func (*Room) NewParticipantTrack

func (r *Room) NewParticipantTrack(sampleRate int) (msdk.WriteCloser[msdk.PCM16Sample], error)

func (*Room) NewTrack

func (r *Room) NewTrack() *mixer.Input

func (*Room) Output

func (r *Room) Output() msdk.Writer[msdk.PCM16Sample]

func (*Room) Participant

func (r *Room) Participant() ParticipantInfo

func (*Room) Room

func (r *Room) Room() *lksdk.Room

func (*Room) SendData

func (r *Room) SendData(data lksdk.DataPacket, opts ...lksdk.DataPublishOption) error

func (*Room) SetDTMFOutput

func (r *Room) SetDTMFOutput(w dtmf.Writer)

func (*Room) Subscribe

func (r *Room) Subscribe()

func (*Room) Subscribed

func (r *Room) Subscribed() <-chan struct{}

func (*Room) SwapOutput

func (r *Room) SwapOutput(out msdk.PCM16Writer) msdk.PCM16Writer

SwapOutput sets room audio output and returns the old one. Caller is responsible for closing the old writer.

type RoomConfig

type RoomConfig struct {
	WsUrl       string
	Token       string
	RoomName    string
	Participant ParticipantConfig
	RoomPreset  string
	RoomConfig  *livekit.RoomConfiguration
	JitterBuf   bool
}

type RoomStats

type RoomStats struct {
	InputPackets atomic.Uint64
	InputBytes   atomic.Uint64
	DTMFPackets  atomic.Uint64

	MixerFrames  atomic.Uint64
	MixerSamples atomic.Uint64

	Mixer mixer.Stats

	OutputFrames  atomic.Uint64
	OutputSamples atomic.Uint64

	Closed atomic.Bool
}

type RoomStatsSnapshot

type RoomStatsSnapshot struct {
	InputPackets uint64 `json:"input_packets"`
	InputBytes   uint64 `json:"input_bytes"`
	DTMFPackets  uint64 `json:"dtmf_packets"`

	MixerSamples uint64 `json:"mixer_samples"`
	MixerFrames  uint64 `json:"mixer_frames"`

	OutputSamples uint64 `json:"output_samples"`
	OutputFrames  uint64 `json:"output_frames"`

	Closed bool `json:"closed"`
}

type Server

type Server struct {
	// contains filtered or unexported fields
}

func NewServer

func NewServer(region string, conf *config.Config, log logger.Logger, mon *stats.Monitor, getIOClient GetIOInfoClient) *Server

func (*Server) ContactURI

func (s *Server) ContactURI(tr Transport) URI

func (*Server) DeregisterTransferSIPParticipant

func (s *Server) DeregisterTransferSIPParticipant(sipCallID LocalTag)

func (*Server) OnNoRoute

func (s *Server) OnNoRoute(log *slog.Logger, req *sip.Request, tx sip.ServerTransaction)

func (*Server) RegisterTransferSIPParticipant

func (s *Server) RegisterTransferSIPParticipant(sipCallID LocalTag, i *inboundCall) error

func (*Server) SetHandler

func (s *Server) SetHandler(handler Handler)

func (*Server) Start

func (s *Server) Start(agent *sipgo.UserAgent, sc *ServiceConfig, tlsConf *tls.Config, unhandled RequestHandler) error

func (*Server) Stop

func (s *Server) Stop()

type Service

type Service struct {
	// contains filtered or unexported fields
}

func NewService

func NewService(region string, conf *config.Config, mon *stats.Monitor, log logger.Logger, getIOClient GetIOInfoClient) (*Service, error)

func (*Service) ActiveCalls

func (s *Service) ActiveCalls() ActiveCalls

func (*Service) CreateSIPParticipantAffinity

func (s *Service) CreateSIPParticipantAffinity(ctx context.Context, req *rpc.InternalCreateSIPParticipantRequest) float32

func (*Service) SetHandler

func (s *Service) SetHandler(handler Handler)

func (*Service) Start

func (s *Service) Start() error

func (*Service) Stop

func (s *Service) Stop()

func (*Service) TransferSIPParticipant

func (s *Service) TransferSIPParticipant(ctx context.Context, req *rpc.InternalTransferSIPParticipantRequest) (*emptypb.Empty, error)

type ServiceConfig

type ServiceConfig struct {
	SignalingIP      netip.Addr
	SignalingIPLocal netip.Addr
	MediaIP          netip.Addr
}

func GetServiceConfig

func GetServiceConfig(conf *config.Config) (*ServiceConfig, error)

type Signaling

type Signaling interface {
	Address() sip.Uri
	From() sip.Uri
	To() sip.Uri
	ID() LocalTag
	Tag() RemoteTag
	SIPCallID() string
	RemoteHeaders() Headers

	WriteRequest(req *sip.Request) error
	Transaction(req *sip.Request) (sip.ClientTransaction, error)

	Drop()
}

type StateUpdater

type StateUpdater interface {
	UpdateSIPCallState(ctx context.Context, req *rpc.UpdateSIPCallStateRequest, opts ...psrpc.RequestOption) (*emptypb.Empty, error)
}

type Stats

type Stats struct {
	Port   PortStats
	Room   RoomStats
	Closed atomic.Bool
}

func (*Stats) Load

func (s *Stats) Load() StatsSnapshot

func (*Stats) MarshalJSON

func (s *Stats) MarshalJSON() ([]byte, error)

type StatsSnapshot

type StatsSnapshot struct {
	Port   PortStatsSnapshot  `json:"port"`
	Room   RoomStatsSnapshot  `json:"room"`
	Mixer  MixerStatsSnapshot `json:"mixer"`
	Closed bool               `json:"closed"`
}

type Transport

type Transport string

func TransportFrom

func TransportFrom(t livekit.SIPTransport) Transport

type UDPConn

type UDPConn interface {
	net.Conn
	ReadFromUDPAddrPort(b []byte) (n int, addr netip.AddrPort, err error)
	WriteToUDPAddrPort(b []byte, addr netip.AddrPort) (int, error)
}

type URI

type URI struct {
	User      string
	Host      string
	Addr      netip.AddrPort
	Transport Transport
}

func ConvertURI

func ConvertURI(u *sip.Uri) URI

func CreateURIFromUserAndAddress

func CreateURIFromUserAndAddress(user string, address string, transport Transport) URI

func (URI) GetContactURI

func (u URI) GetContactURI() *sip.Uri

func (URI) GetDest

func (u URI) GetDest() string

func (URI) GetHost

func (u URI) GetHost() string

func (URI) GetHostPort

func (u URI) GetHostPort() string

func (URI) GetPort

func (u URI) GetPort() int

func (URI) GetPortOrNone

func (u URI) GetPortOrNone() int

func (URI) GetURI

func (u URI) GetURI() *sip.Uri

func (URI) Normalize

func (u URI) Normalize() URI

func (URI) ToSIPUri

func (u URI) ToSIPUri() *livekit.SIPUri

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL