manager.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package trafficontrol
  2. import (
  3. "time"
  4. "github.com/sagernet/sing-box/experimental/clashapi/compatible"
  5. "go.uber.org/atomic"
  6. )
  7. type Manager struct {
  8. connections compatible.Map[string, tracker]
  9. uploadTemp *atomic.Int64
  10. downloadTemp *atomic.Int64
  11. uploadBlip *atomic.Int64
  12. downloadBlip *atomic.Int64
  13. uploadTotal *atomic.Int64
  14. downloadTotal *atomic.Int64
  15. }
  16. func NewManager() *Manager {
  17. manager := &Manager{
  18. uploadTemp: atomic.NewInt64(0),
  19. downloadTemp: atomic.NewInt64(0),
  20. uploadBlip: atomic.NewInt64(0),
  21. downloadBlip: atomic.NewInt64(0),
  22. uploadTotal: atomic.NewInt64(0),
  23. downloadTotal: atomic.NewInt64(0),
  24. }
  25. go manager.handle()
  26. return manager
  27. }
  28. func (m *Manager) Join(c tracker) {
  29. m.connections.Store(c.ID(), c)
  30. }
  31. func (m *Manager) Leave(c tracker) {
  32. m.connections.Delete(c.ID())
  33. }
  34. func (m *Manager) PushUploaded(size int64) {
  35. m.uploadTemp.Add(size)
  36. m.uploadTotal.Add(size)
  37. }
  38. func (m *Manager) PushDownloaded(size int64) {
  39. m.downloadTemp.Add(size)
  40. m.downloadTotal.Add(size)
  41. }
  42. func (m *Manager) Now() (up int64, down int64) {
  43. return m.uploadBlip.Load(), m.downloadBlip.Load()
  44. }
  45. func (m *Manager) Snapshot() *Snapshot {
  46. connections := []tracker{}
  47. m.connections.Range(func(_ string, value tracker) bool {
  48. connections = append(connections, value)
  49. return true
  50. })
  51. return &Snapshot{
  52. UploadTotal: m.uploadTotal.Load(),
  53. DownloadTotal: m.downloadTotal.Load(),
  54. Connections: connections,
  55. }
  56. }
  57. func (m *Manager) ResetStatistic() {
  58. m.uploadTemp.Store(0)
  59. m.uploadBlip.Store(0)
  60. m.uploadTotal.Store(0)
  61. m.downloadTemp.Store(0)
  62. m.downloadBlip.Store(0)
  63. m.downloadTotal.Store(0)
  64. }
  65. func (m *Manager) handle() {
  66. ticker := time.NewTicker(time.Second)
  67. for range ticker.C {
  68. m.uploadBlip.Store(m.uploadTemp.Load())
  69. m.uploadTemp.Store(0)
  70. m.downloadBlip.Store(m.downloadTemp.Load())
  71. m.downloadTemp.Store(0)
  72. }
  73. }
  74. type Snapshot struct {
  75. DownloadTotal int64 `json:"downloadTotal"`
  76. UploadTotal int64 `json:"uploadTotal"`
  77. Connections []tracker `json:"connections"`
  78. }