tracked_subscription.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package subscriptionmanager
  2. import (
  3. "time"
  4. "github.com/v2fly/v2ray-core/v5/app/subscription"
  5. "github.com/v2fly/v2ray-core/v5/app/subscription/containers"
  6. "github.com/v2fly/v2ray-core/v5/app/subscription/specs"
  7. )
  8. func newTrackedSubscription(importSource *subscription.ImportSource) (*trackedSubscription, error) { //nolint: unparam
  9. return &trackedSubscription{importSource: importSource, materialized: map[string]*materializedServer{}}, nil
  10. }
  11. type trackedSubscription struct {
  12. importSource *subscription.ImportSource
  13. currentDocumentExpireTime time.Time
  14. currentDocument *specs.SubscriptionDocument
  15. materialized map[string]*materializedServer
  16. originalDocument []byte
  17. originalContainer *containers.Container
  18. originalServerConfig map[string]*originalServerConfig
  19. }
  20. type originalServerConfig struct {
  21. data []byte
  22. }
  23. func (s *trackedSubscription) diff(newDocument *specs.SubscriptionDocument) (changedDocument, error) { //nolint: unparam
  24. delta := changedDocument{}
  25. seen := make(map[string]bool)
  26. for _, server := range newDocument.Server {
  27. if currentMaterialized, found := s.materialized[server.Id]; found {
  28. if currentMaterialized.serverConfig.Metadata[ServerMetadataFullyQualifiedName] == server.Metadata[ServerMetadataFullyQualifiedName] {
  29. delta.unchanged = append(delta.unchanged, server.Id)
  30. } else {
  31. delta.modified = append(delta.modified, server.Id)
  32. }
  33. seen[server.Id] = true
  34. } else {
  35. delta.added = append(delta.added, server.Id)
  36. }
  37. }
  38. for name := range s.materialized {
  39. if _, ok := seen[name]; !ok {
  40. delta.removed = append(delta.removed, name)
  41. }
  42. }
  43. return delta, nil
  44. }
  45. func (s *trackedSubscription) recordRemovedServer(name string) {
  46. delete(s.materialized, name)
  47. }
  48. func (s *trackedSubscription) recordUpdatedServer(name, tagPostfix string, serverConfig *specs.SubscriptionServerConfig) {
  49. s.materialized[name] = &materializedServer{tagPostfix: tagPostfix, serverConfig: serverConfig}
  50. }
  51. func (s *trackedSubscription) getCurrentServer(name string) (*materializedServer, error) {
  52. if materialized, found := s.materialized[name]; found {
  53. return materialized, nil
  54. } else {
  55. return nil, newError("not found")
  56. }
  57. }
  58. type materializedServer struct {
  59. tagPostfix string
  60. serverConfig *specs.SubscriptionServerConfig
  61. }