From fff5cc4561690081c6626dd2a537b836bda35d43 Mon Sep 17 00:00:00 2001 From: kjagosz <63209438+kjagosz@users.noreply.github.com> Date: Thu, 8 Jan 2026 19:26:05 +0100 Subject: [PATCH] Add `OnRegisterStateChange` callback to track registration state changes. --- diago.go | 2 +- register_transaction.go | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/diago.go b/diago.go index 15edbb0..40dc00b 100644 --- a/diago.go +++ b/diago.go @@ -793,13 +793,13 @@ func (dg *Diago) Register(ctx context.Context, recipient sip.Uri, opts RegisterO } } } - if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { return err } t.expiry = retryAfter } + return nil } // Register transaction creates register transaction object that can be used for Register Unregister requests diff --git a/register_transaction.go b/register_transaction.go index 45d0d4d..20fba3e 100644 --- a/register_transaction.go +++ b/register_transaction.go @@ -42,7 +42,8 @@ type RegisterOptions struct { RetryInterval time.Duration AllowHeaders []string - OnRegistered func() + OnRegistered func() + OnRegisterStateChange func(bool, error) // Useragent default will be used on what is provided as NewUA() // UserAgent string @@ -96,12 +97,18 @@ func newRegisterTransaction(client *sipgo.Client, recipient sip.Uri, contact sip func (t *RegisterTransaction) Register(ctx context.Context) error { if err := t.register(ctx); err != nil { + if t.opts.OnRegisterStateChange != nil { + t.opts.OnRegisterStateChange(false, err) + } return err } if t.opts.OnRegistered != nil { t.opts.OnRegistered() } + if t.opts.OnRegisterStateChange != nil { + t.opts.OnRegisterStateChange(true, nil) + } return nil } func (t *RegisterTransaction) register(ctx context.Context) error { @@ -187,7 +194,14 @@ func (t *RegisterTransaction) reregisterLoop(ctx context.Context, retry time.Dur expiry := t.expiry err := t.Qualify(ctx) if err != nil { + if t.opts.OnRegisterStateChange != nil { + t.opts.OnRegisterStateChange(false, nil) + } return err + } else { + if t.opts.OnRegisterStateChange != nil { + t.opts.OnRegisterStateChange(true, nil) + } } if t.expiry != expiry {