| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- package job
- import (
- "time"
- "github.com/mhsanaei/3x-ui/v3/internal/logger"
- "github.com/mhsanaei/3x-ui/v3/internal/tuic"
- "github.com/mhsanaei/3x-ui/v3/internal/web/service"
- "github.com/mhsanaei/3x-ui/v3/internal/xray"
- )
- type TuicJob struct {
- inboundService service.InboundService
- }
- func NewTuicJob() *TuicJob {
- return new(TuicJob)
- }
- func (j *TuicJob) Run() {
- desired, err := j.inboundService.DesiredTuicInstances()
- if err != nil {
- logger.Warning("tuic job: get desired instances failed:", err)
- return
- }
- activeTags := make([]string, 0, len(desired))
- for _, inst := range desired {
- activeTags = append(activeTags, inst.Tag)
- }
- mgr := tuic.GetManager()
- mgr.Reconcile(desired)
- deltas := mgr.CollectTraffic()
- onlineEmails, _ := mgr.GetActiveClients(30 * time.Second)
- inboundUp := make(map[string]int64)
- inboundDown := make(map[string]int64)
- for _, d := range deltas {
- inboundUp[d.Tag] += d.Up
- inboundDown[d.Tag] += d.Down
- }
- traffics := make([]*xray.Traffic, 0, len(inboundUp))
- for tag, up := range inboundUp {
- traffics = append(traffics, &xray.Traffic{
- IsInbound: true,
- Tag: tag,
- Up: up,
- Down: inboundDown[tag],
- })
- }
- // Build zero-byte client traffic entries for active clients so adjustTraffics can
- // activate delayed-start expiryTime for TUIC clients without inflating traffic.
- clientTraffics := make([]*xray.ClientTraffic, 0, len(onlineEmails))
- for _, email := range onlineEmails {
- clientTraffics = append(clientTraffics, &xray.ClientTraffic{
- Email: email,
- Up: 0,
- Down: 0,
- })
- }
- if len(traffics) > 0 || len(clientTraffics) > 0 {
- needRestart, _, err := j.inboundService.AddTraffic(traffics, clientTraffics)
- if err != nil {
- logger.Warning("tuic job: add traffic failed:", err)
- } else if needRestart {
- if desired, err := j.inboundService.DesiredTuicInstances(); err == nil {
- mgr.Reconcile(desired)
- }
- }
- }
- if len(onlineEmails) > 0 {
- if err := j.inboundService.BumpClientsLastOnline(onlineEmails); err != nil {
- logger.Warning("tuic job: bump last online for tuic clients failed:", err)
- }
- }
- j.inboundService.RefreshLocalOnlineClients(onlineEmails, activeTags)
- }
|