networkquality.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package libbox
  2. import (
  3. "context"
  4. "time"
  5. "github.com/sagernet/sing-box/common/networkquality"
  6. )
  7. type NetworkQualityTest struct {
  8. ctx context.Context
  9. cancel context.CancelFunc
  10. }
  11. func NewNetworkQualityTest() *NetworkQualityTest {
  12. ctx, cancel := context.WithCancel(context.Background())
  13. return &NetworkQualityTest{ctx: ctx, cancel: cancel}
  14. }
  15. func (t *NetworkQualityTest) Start(configURL string, serial bool, maxRuntimeSeconds int32, http3 bool, handler NetworkQualityTestHandler) {
  16. go func() {
  17. httpClient := networkquality.NewHTTPClient(nil)
  18. defer httpClient.CloseIdleConnections()
  19. measurementClientFactory, err := networkquality.NewOptionalHTTP3Factory(nil, http3)
  20. if err != nil {
  21. handler.OnError(err.Error())
  22. return
  23. }
  24. result, err := networkquality.Run(networkquality.Options{
  25. ConfigURL: configURL,
  26. HTTPClient: httpClient,
  27. NewMeasurementClient: measurementClientFactory,
  28. Serial: serial,
  29. MaxRuntime: time.Duration(maxRuntimeSeconds) * time.Second,
  30. Context: t.ctx,
  31. OnProgress: func(p networkquality.Progress) {
  32. handler.OnProgress(&NetworkQualityProgress{
  33. Phase: int32(p.Phase),
  34. DownloadCapacity: p.DownloadCapacity,
  35. UploadCapacity: p.UploadCapacity,
  36. DownloadRPM: p.DownloadRPM,
  37. UploadRPM: p.UploadRPM,
  38. IdleLatencyMs: p.IdleLatencyMs,
  39. ElapsedMs: p.ElapsedMs,
  40. DownloadCapacityAccuracy: int32(p.DownloadCapacityAccuracy),
  41. UploadCapacityAccuracy: int32(p.UploadCapacityAccuracy),
  42. DownloadRPMAccuracy: int32(p.DownloadRPMAccuracy),
  43. UploadRPMAccuracy: int32(p.UploadRPMAccuracy),
  44. })
  45. },
  46. })
  47. if err != nil {
  48. handler.OnError(err.Error())
  49. return
  50. }
  51. handler.OnResult(&NetworkQualityResult{
  52. DownloadCapacity: result.DownloadCapacity,
  53. UploadCapacity: result.UploadCapacity,
  54. DownloadRPM: result.DownloadRPM,
  55. UploadRPM: result.UploadRPM,
  56. IdleLatencyMs: result.IdleLatencyMs,
  57. DownloadCapacityAccuracy: int32(result.DownloadCapacityAccuracy),
  58. UploadCapacityAccuracy: int32(result.UploadCapacityAccuracy),
  59. DownloadRPMAccuracy: int32(result.DownloadRPMAccuracy),
  60. UploadRPMAccuracy: int32(result.UploadRPMAccuracy),
  61. })
  62. }()
  63. }
  64. func (t *NetworkQualityTest) Cancel() {
  65. t.cancel()
  66. }