1
0

stun.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package libbox
  2. import (
  3. "context"
  4. "github.com/sagernet/sing-box/common/stun"
  5. )
  6. type STUNTest struct {
  7. ctx context.Context
  8. cancel context.CancelFunc
  9. }
  10. func NewSTUNTest() *STUNTest {
  11. ctx, cancel := context.WithCancel(context.Background())
  12. return &STUNTest{ctx: ctx, cancel: cancel}
  13. }
  14. func (t *STUNTest) Start(server string, handler STUNTestHandler) {
  15. go func() {
  16. result, err := stun.Run(stun.Options{
  17. Server: server,
  18. Context: t.ctx,
  19. OnProgress: func(p stun.Progress) {
  20. handler.OnProgress(&STUNTestProgress{
  21. Phase: int32(p.Phase),
  22. ExternalAddr: p.ExternalAddr,
  23. LatencyMs: p.LatencyMs,
  24. NATMapping: int32(p.NATMapping),
  25. NATFiltering: int32(p.NATFiltering),
  26. })
  27. },
  28. })
  29. if err != nil {
  30. handler.OnError(err.Error())
  31. return
  32. }
  33. handler.OnResult(&STUNTestResult{
  34. ExternalAddr: result.ExternalAddr,
  35. LatencyMs: result.LatencyMs,
  36. NATMapping: int32(result.NATMapping),
  37. NATFiltering: int32(result.NATFiltering),
  38. NATTypeSupported: result.NATTypeSupported,
  39. })
  40. }()
  41. }
  42. func (t *STUNTest) Cancel() {
  43. t.cancel()
  44. }