Documentation
¶
Index ¶
- Variables
- func ClientRequestAddRecordRoute(c *Client, r *sip.Request) error
- func ClientRequestAddVia(c *Client, r *sip.Request) error
- func ClientRequestBuild(c *Client, r *sip.Request) error
- func ClientRequestDecreaseMaxForward(c *Client, r *sip.Request) error
- func GenerateTLSConfig(certFile string, keyFile string, rootPems []byte) (*tls.Config, error)
- func Init()
- type AnswerOptions
- type Client
- type ClientOption
- type ClientRequestOption
- type Dialog
- type DialogClient
- func (dc *DialogClient) Invite(ctx context.Context, recipient *sip.Uri, body []byte, headers ...sip.Header) (*DialogClientSession, error)
- func (dc *DialogClient) ReadBye(req *sip.Request, tx sip.ServerTransaction) error
- func (dc *DialogClient) WriteInvite(ctx context.Context, inviteRequest *sip.Request) (*DialogClientSession, error)
- type DialogClientSession
- func (s *DialogClientSession) Ack(ctx context.Context) error
- func (s *DialogClientSession) Bye(ctx context.Context) error
- func (s *DialogClientSession) Close() error
- func (s *DialogClientSession) WaitAnswer(ctx context.Context, opts AnswerOptions) error
- func (s *DialogClientSession) WriteAck(ctx context.Context, ack *sip.Request) error
- func (s *DialogClientSession) WriteBye(ctx context.Context, bye *sip.Request) error
- type DialogServer
- type DialogServerSession
- type ErrDialogResponse
- type ListenReadyCtxValue
- type RequestHandler
- type Server
- func (srv *Server) Close() error
- func (srv *Server) ListenAndServe(ctx context.Context, network string, addr string) error
- func (srv *Server) ListenAndServeTLS(ctx context.Context, network string, addr string, conf *tls.Config) error
- func (srv *Server) OnAck(handler RequestHandler)
- func (srv *Server) OnBye(handler RequestHandler)
- func (srv *Server) OnCancel(handler RequestHandler)
- func (srv *Server) OnInfo(handler RequestHandler)
- func (srv *Server) OnInvite(handler RequestHandler)
- func (srv *Server) OnMessage(handler RequestHandler)
- func (srv *Server) OnNoRoute(handler RequestHandler)
- func (srv *Server) OnNotify(handler RequestHandler)
- func (srv *Server) OnOptions(handler RequestHandler)
- func (srv *Server) OnPrack(handler RequestHandler)
- func (srv *Server) OnPublish(handler RequestHandler)
- func (srv *Server) OnRefer(handler RequestHandler)
- func (srv *Server) OnRegister(handler RequestHandler)
- func (srv *Server) OnRequest(method sip.RequestMethod, handler RequestHandler)
- func (srv *Server) OnSubscribe(handler RequestHandler)
- func (srv *Server) OnUpdate(handler RequestHandler)
- func (srv *Server) RegisteredMethods() []string
- func (srv *Server) ServeRequest(f func(r *sip.Request))
- func (srv *Server) ServeTCP(l net.Listener) error
- func (srv *Server) ServeTLS(l net.Listener) error
- func (srv *Server) ServeUDP(l net.PacketConn) error
- func (srv *Server) ServeWS(l net.Listener) error
- func (srv *Server) ServeWSS(l net.Listener) error
- func (srv *Server) TransportLayer() *sip.TransportLayer
- func (srv *Server) WriteResponse(r *sip.Response) error
- type ServerOption
- type UserAgent
- type UserAgentOption
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( ErrDialogOutsideDialog = errors.New("Call/Transaction outside dialog") ErrDialogDoesNotExists = errors.New("Call/Transaction Does Not Exist") ErrDialogInviteNoContact = errors.New("No Contact header") ErrDialogCanceled = errors.New("Dialog canceled") )
var (
// Used only for testing, better way is to pass listener with Serve{Transport}
ListenReadyCtxKey = "ListenReadyCtxKey"
)
Functions ¶
func ClientRequestAddRecordRoute ¶
ClientRequestAddRecordRoute is option for adding record route header Based on proxy setup https://www.rfc-editor.org/rfc/rfc3261#section-16
func ClientRequestAddVia ¶
ClientRequestAddVia is option for adding via header Based on proxy setup https://www.rfc-editor.org/rfc/rfc3261.html#section-16.6
func ClientRequestBuild ¶ added in v0.16.0
ClientRequestBuild will build missing fields in request This is by default but can be used to combine with other ClientRequestOptions
func ClientRequestDecreaseMaxForward ¶ added in v0.7.0
Based on proxy setup https://www.rfc-editor.org/rfc/rfc3261#section-16 ClientRequestDecreaseMaxForward should be used when forwarding request. It decreases max forward in case of 0 it returnes error
func GenerateTLSConfig ¶ added in v0.7.0
GenerateTLSConfig creates basic tls.Config that you can pass for ServerTLS It needs rootPems for client side
Types ¶
type AnswerOptions ¶ added in v0.15.1
type Client ¶
type Client struct {
*UserAgent
// contains filtered or unexported fields
}
func NewClient ¶
func NewClient(ua *UserAgent, options ...ClientOption) (*Client, error)
NewClient creates client handle for user agent
func (*Client) Close ¶ added in v0.13.0
Close client handle. UserAgent must be closed for full transaction and transport layer closing.
func (*Client) GetHostname ¶ added in v0.11.0
func (*Client) TransactionRequest ¶
func (c *Client) TransactionRequest(ctx context.Context, req *sip.Request, options ...ClientRequestOption) (sip.ClientTransaction, error)
TransactionRequest uses transaction layer to send request and returns transaction NOTE: By default request will not be cloned and it will populate request with missing headers unless options are used
In most cases you want this as you will retry with additional headers
Following header fields will be added if not exist to have correct SIP request: To, From, CSeq, Call-ID, Max-Forwards, Via
Passing options will override this behavior, that is it is expected that you have request fully built This is useful when using client handle in proxy building as request are already parsed
func (*Client) WriteRequest ¶
func (c *Client) WriteRequest(req *sip.Request, options ...ClientRequestOption) error
WriteRequest sends request directly to transport layer Behavior is same as TransactionRequest Non-transaction ACK request should be passed like this
type ClientOption ¶
func WithClientAddr ¶ added in v0.12.0
func WithClientAddr(addr string) ClientOption
WithClientAddr is merge of WithClientHostname and WithClientPort addr is format <host>:<port>
func WithClientHostname ¶ added in v0.11.0
func WithClientHostname(hostname string) ClientOption
WithClientHost allows setting default route host default it will be used user agent IP
func WithClientLogger ¶ added in v0.7.2
func WithClientLogger(logger zerolog.Logger) ClientOption
WithClientLogger allows customizing client logger
func WithClientNAT ¶ added in v0.16.0
func WithClientNAT() ClientOption
WithClientNAT makes client aware that is behind NAT. EXPERIMENTAL
func WithClientPort ¶ added in v0.11.0
func WithClientPort(port int) ClientOption
WithClientPort allows setting default route port
type Dialog ¶ added in v0.15.0
type Dialog struct {
ID string
InviteRequest *sip.Request
InviteResponse *sip.Response
// contains filtered or unexported fields
}
func (*Dialog) State ¶ added in v0.15.1
func (d *Dialog) State() <-chan sip.DialogState
type DialogClient ¶ added in v0.15.0
type DialogClient struct {
// contains filtered or unexported fields
}
func NewDialogClient ¶ added in v0.15.0
func NewDialogClient(client *Client, contactHDR sip.ContactHeader) *DialogClient
NewDialogClient provides handle for managing UAC dialog Contact hdr must be provided for correct invite In case handling different transports you should have multiple instances per transport
func (*DialogClient) Invite ¶ added in v0.15.0
func (dc *DialogClient) Invite(ctx context.Context, recipient *sip.Uri, body []byte, headers ...sip.Header) (*DialogClientSession, error)
Invite sends INVITE request and creates early dialog session. You need to call WaitAnswer after for establishing dialog For passing custom Invite request use WriteInvite
func (*DialogClient) ReadBye ¶ added in v0.15.0
func (dc *DialogClient) ReadBye(req *sip.Request, tx sip.ServerTransaction) error
func (*DialogClient) WriteInvite ¶ added in v0.15.0
func (dc *DialogClient) WriteInvite(ctx context.Context, inviteRequest *sip.Request) (*DialogClientSession, error)
type DialogClientSession ¶ added in v0.15.0
type DialogClientSession struct {
Dialog
// contains filtered or unexported fields
}
func (*DialogClientSession) Ack ¶ added in v0.15.0
func (s *DialogClientSession) Ack(ctx context.Context) error
Ack sends ack. Use WriteAck for more customizing
func (*DialogClientSession) Bye ¶ added in v0.15.0
func (s *DialogClientSession) Bye(ctx context.Context) error
Bye sends bye and terminates session. Use WriteBye if you want to customize bye request
func (*DialogClientSession) Close ¶ added in v0.15.1
func (s *DialogClientSession) Close() error
Close is always good to call for cleanup or terminating dialog state
func (*DialogClientSession) WaitAnswer ¶ added in v0.15.1
func (s *DialogClientSession) WaitAnswer(ctx context.Context, opts AnswerOptions) error
WaitAnswer waits for success response or returns ErrDialogResponse in case non 2xx Canceling context while waiting 2xx will send Cancel request Returns ErrDialogResponse in case non 2xx response
type DialogServer ¶ added in v0.15.0
type DialogServer struct {
// contains filtered or unexported fields
}
func NewDialogServer ¶ added in v0.15.0
func NewDialogServer(client *Client, contactHDR sip.ContactHeader) *DialogServer
NewDialogServer provides handle for managing UAS dialog Contact hdr must be provided for responses Client is needed for termination dialog session In case handling different transports you should have multiple instances per transport
func (*DialogServer) ReadAck ¶ added in v0.15.0
func (s *DialogServer) ReadAck(req *sip.Request, tx sip.ServerTransaction) error
ReadAck should read from your OnAck handler
func (*DialogServer) ReadBye ¶ added in v0.15.0
func (s *DialogServer) ReadBye(req *sip.Request, tx sip.ServerTransaction) error
func (*DialogServer) ReadInvite ¶ added in v0.15.0
func (s *DialogServer) ReadInvite(req *sip.Request, tx sip.ServerTransaction) (*DialogServerSession, error)
ReadInvite should read from your OnInvite handler for which it creates dialog context You need to use DialogServerSession for all further responses
type DialogServerSession ¶ added in v0.15.0
type DialogServerSession struct {
Dialog
// contains filtered or unexported fields
}
func (*DialogServerSession) Bye ¶ added in v0.15.0
func (s *DialogServerSession) Bye(ctx context.Context) error
func (*DialogServerSession) Close ¶ added in v0.15.1
func (s *DialogServerSession) Close() error
Close is always good to call for cleanup or terminating dialog state
func (*DialogServerSession) Respond ¶ added in v0.15.0
func (s *DialogServerSession) Respond(statusCode sip.StatusCode, reason string, body []byte, headers ...sip.Header) error
Respond should be called for Invite request, you may want to call this multiple times like 100 Progress or 180 Ringing 2xx for creating dialog or other code in case failure
In case Cancel request received: ErrDialogCanceled is responded
func (*DialogServerSession) WriteResponse ¶ added in v0.15.0
func (s *DialogServerSession) WriteResponse(res *sip.Response) error
type ErrDialogResponse ¶ added in v0.15.0
func (ErrDialogResponse) Error ¶ added in v0.15.0
func (e ErrDialogResponse) Error() string
type ListenReadyCtxValue ¶ added in v0.14.0
type ListenReadyCtxValue chan struct{}
type RequestHandler ¶
type RequestHandler func(req *sip.Request, tx sip.ServerTransaction)
RequestHandler is a callback that will be called on the incoming request
type Server ¶
type Server struct {
*UserAgent
// contains filtered or unexported fields
}
Server is a SIP server
func NewServer ¶
func NewServer(ua *UserAgent, options ...ServerOption) (*Server, error)
NewServer creates new instance of SIP server handle. Allows creating server transaction handlers It uses User Agent transport and transaction layer
func (*Server) Close ¶ added in v0.8.0
Close server handle. UserAgent must be closed for full transaction and transport layer closing.
func (*Server) ListenAndServe ¶ added in v0.7.0
Serve will fire all listeners Network supported: udp, tcp, ws
func (*Server) ListenAndServeTLS ¶ added in v0.7.0
func (srv *Server) ListenAndServeTLS(ctx context.Context, network string, addr string, conf *tls.Config) error
Serve will fire all listeners that are secured. Network supported: tls, wss
func (*Server) OnAck ¶
func (srv *Server) OnAck(handler RequestHandler)
OnAck registers Ack request handler
func (*Server) OnBye ¶
func (srv *Server) OnBye(handler RequestHandler)
OnBye registers Bye request handler
func (*Server) OnCancel ¶
func (srv *Server) OnCancel(handler RequestHandler)
OnCancel registers Cancel request handler
func (*Server) OnInfo ¶
func (srv *Server) OnInfo(handler RequestHandler)
OnInfo registers Info request handler
func (*Server) OnInvite ¶
func (srv *Server) OnInvite(handler RequestHandler)
OnInvite registers Invite request handler
func (*Server) OnMessage ¶
func (srv *Server) OnMessage(handler RequestHandler)
OnMessage registers Message request handler
func (*Server) OnNoRoute ¶ added in v0.9.0
func (srv *Server) OnNoRoute(handler RequestHandler)
OnNoRoute registers no route handler default is handling is responding 405 Method Not allowed This allows customizing your response for any non handled message
Example ¶
// Creating no route handler allows you to respond for non handled (non routed) requests
ua, _ := NewUA()
srv, _ := NewServer(ua)
srv.OnNoRoute(func(req *sip.Request, tx sip.ServerTransaction) {
res := sip.NewResponseFromRequest(req, 405, "Method Not Allowed", nil)
// Send response directly and let transaction terminate
if err := srv.WriteResponse(res); err != nil {
srv.log.Error().Err(err).Msg("respond '405 Method Not Allowed' failed")
}
})
func (*Server) OnNotify ¶
func (srv *Server) OnNotify(handler RequestHandler)
OnNotify registers Notify request handler
func (*Server) OnOptions ¶
func (srv *Server) OnOptions(handler RequestHandler)
OnOptions registers Options request handler
func (*Server) OnPrack ¶
func (srv *Server) OnPrack(handler RequestHandler)
OnPrack registers Prack request handler
func (*Server) OnPublish ¶
func (srv *Server) OnPublish(handler RequestHandler)
OnPublish registers Publish request handler
func (*Server) OnRefer ¶
func (srv *Server) OnRefer(handler RequestHandler)
OnRefer registers Refer request handler
func (*Server) OnRegister ¶
func (srv *Server) OnRegister(handler RequestHandler)
OnRegister registers Register request handler
func (*Server) OnRequest ¶
func (srv *Server) OnRequest(method sip.RequestMethod, handler RequestHandler)
OnRequest registers new request callback. Can be used as generic way to add handler
func (*Server) OnSubscribe ¶
func (srv *Server) OnSubscribe(handler RequestHandler)
OnSubscribe registers Subscribe request handler
func (*Server) OnUpdate ¶
func (srv *Server) OnUpdate(handler RequestHandler)
OnUpdate registers Update request handler
func (*Server) RegisteredMethods ¶ added in v0.12.1
RegisteredMethods returns list of registered handlers. Can be used for constructing Allow header
func (*Server) ServeRequest ¶
ServeRequest can be used as middleware for preprocessing message
func (*Server) ServeUDP ¶ added in v0.10.0
func (srv *Server) ServeUDP(l net.PacketConn) error
ServeUDP starts serving request on UDP type listener.
func (*Server) TransportLayer ¶
func (srv *Server) TransportLayer() *sip.TransportLayer
Transport is function to get transport layer of server Can be used for modifying
type ServerOption ¶
func WithServerLogger ¶ added in v0.7.2
func WithServerLogger(logger zerolog.Logger) ServerOption
WithServerLogger allows customizing server logger
type UserAgent ¶
type UserAgent struct {
// contains filtered or unexported fields
}
func NewUA ¶
func NewUA(options ...UserAgentOption) (*UserAgent, error)
NewUA creates User Agent User Agent will create transport and transaction layer Check options for customizing user agent
func (*UserAgent) TransportLayer ¶ added in v0.10.0
func (ua *UserAgent) TransportLayer() *sip.TransportLayer
type UserAgentOption ¶
func WithUserAgenTLSConfig ¶ added in v0.12.0
func WithUserAgenTLSConfig(c *tls.Config) UserAgentOption
WithUserAgenTLSConfig allows customizing default tls config.
func WithUserAgent ¶
func WithUserAgent(ua string) UserAgentOption
WithUserAgent changes user agent name Default: sipgo
func WithUserAgentDNSResolver ¶ added in v0.7.2
func WithUserAgentDNSResolver(r *net.Resolver) UserAgentOption
WithUserAgentDNSResolver allows customizing default DNS resolver for transport layer
func WithUserAgentIP ¶ added in v0.7.2
func WithUserAgentIP(ip net.IP) UserAgentOption
WithUserAgentIP sets local IP that will be used in building request If not used IP will be resolved Deprecated: Use on client WithClientHostname WithClientPort