tuic_job.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package job
  2. import (
  3. "time"
  4. "github.com/mhsanaei/3x-ui/v3/internal/logger"
  5. "github.com/mhsanaei/3x-ui/v3/internal/tuic"
  6. "github.com/mhsanaei/3x-ui/v3/internal/web/service"
  7. "github.com/mhsanaei/3x-ui/v3/internal/xray"
  8. )
  9. type TuicJob struct {
  10. inboundService service.InboundService
  11. }
  12. func NewTuicJob() *TuicJob {
  13. return new(TuicJob)
  14. }
  15. func (j *TuicJob) Run() {
  16. desired, err := j.inboundService.DesiredTuicInstances()
  17. if err != nil {
  18. logger.Warning("tuic job: get desired instances failed:", err)
  19. return
  20. }
  21. activeTags := make([]string, 0, len(desired))
  22. for _, inst := range desired {
  23. activeTags = append(activeTags, inst.Tag)
  24. }
  25. mgr := tuic.GetManager()
  26. mgr.Reconcile(desired)
  27. deltas := mgr.CollectTraffic()
  28. onlineEmails, _ := mgr.GetActiveClients(30 * time.Second)
  29. inboundUp := make(map[string]int64)
  30. inboundDown := make(map[string]int64)
  31. for _, d := range deltas {
  32. inboundUp[d.Tag] += d.Up
  33. inboundDown[d.Tag] += d.Down
  34. }
  35. traffics := make([]*xray.Traffic, 0, len(inboundUp))
  36. for tag, up := range inboundUp {
  37. traffics = append(traffics, &xray.Traffic{
  38. IsInbound: true,
  39. Tag: tag,
  40. Up: up,
  41. Down: inboundDown[tag],
  42. })
  43. }
  44. // Build zero-byte client traffic entries for active clients so adjustTraffics can
  45. // activate delayed-start expiryTime for TUIC clients without inflating traffic.
  46. clientTraffics := make([]*xray.ClientTraffic, 0, len(onlineEmails))
  47. for _, email := range onlineEmails {
  48. clientTraffics = append(clientTraffics, &xray.ClientTraffic{
  49. Email: email,
  50. Up: 0,
  51. Down: 0,
  52. })
  53. }
  54. if len(traffics) > 0 || len(clientTraffics) > 0 {
  55. needRestart, _, err := j.inboundService.AddTraffic(traffics, clientTraffics)
  56. if err != nil {
  57. logger.Warning("tuic job: add traffic failed:", err)
  58. } else if needRestart {
  59. if desired, err := j.inboundService.DesiredTuicInstances(); err == nil {
  60. mgr.Reconcile(desired)
  61. }
  62. }
  63. }
  64. if len(onlineEmails) > 0 {
  65. if err := j.inboundService.BumpClientsLastOnline(onlineEmails); err != nil {
  66. logger.Warning("tuic job: bump last online for tuic clients failed:", err)
  67. }
  68. }
  69. j.inboundService.RefreshLocalOnlineClients(onlineEmails, activeTags)
  70. }