Skip to content
Snippets Groups Projects
Select Git revision
  • df01fea4be639a3e7a04506786f5813c06aacd8d
  • release default protected
  • 11-22-implement-kv-interface-defined-in-collectiveversionedkvgo
  • hotfix/TestHostPool_UpdateNdf_AddFilter
  • XX-4719/announcementChannels
  • xx-4717/logLevel
  • jonah/noob-channel
  • master protected
  • XX-4707/tagDiskJson
  • xx-4698/notification-retry
  • hotfix/notifylockup
  • syncNodes
  • hotfix/localCB
  • XX-4677/NewChanManagerMobile
  • XX-4689/DmSync
  • duplicatePrefix
  • XX-4601/HavenInvites
  • finalizedUICallbacks
  • XX-4673/AdminKeySync
  • debugNotifID
  • anne/test
  • v4.7.5
  • v4.7.4
  • v4.7.3
  • v4.7.2
  • v4.7.1
  • v4.6.3
  • v4.6.1
  • v4.5.0
  • v4.4.4
  • v4.3.11
  • v4.3.8
  • v4.3.7
  • v4.3.6
  • v4.3.5
  • v4.2.0
  • v4.3.0
  • v4.3.4
  • v4.3.3
  • v4.3.2
  • v4.3.1
41 results

serviceTracker.go

Blame
  • user avatar
    Benjamin Wenger authored
    4029f414
    History
    serviceTracker.go 1.52 KiB
    package message
    
    import (
    	"encoding/json"
    	"gitlab.com/xx_network/primitives/id"
    )
    
    type ServicesTracker func(ServiceList)
    
    // TrackServices adds a service tracker to be triggered when a new service is
    // added. Generally used for notification to use this system to identify a
    // received message.
    func (sm *ServicesManager) TrackServices(tracker ServicesTracker) {
    	if tracker == nil {
    		return
    	}
    	sm.Lock()
    	defer sm.Unlock()
    
    	sm.trackers = append(sm.trackers, tracker)
    }
    
    // triggerServiceTracking triggers the tracking of services. Is it called when a
    // service is added or removed.
    func (sm *ServicesManager) triggerServiceTracking() {
    	if len(sm.trackers) == 0 {
    		return
    	}
    
    	services := make(ServiceList)
    	for uid, tmap := range sm.tmap {
    		tList := make([]Service, 0, len(tmap))
    		for _, s := range tmap {
    			tList = append(tList, s.Service)
    		}
    		services[uid] = tList
    	}
    
    	for _, callback := range sm.trackers {
    		go callback(services)
    	}
    }
    
    // The ServiceList holds all services.
    type ServiceList map[id.ID][]Service
    
    type slMarshaled struct {
    	Id       id.ID
    	Services []Service
    }
    
    func (sl ServiceList) MarshalJSON() ([]byte, error) {
    	slList := make([]slMarshaled, 0, len(sl))
    	for uid, s := range sl {
    		slList = append(slList, slMarshaled{
    			Id:       uid,
    			Services: s,
    		})
    	}
    	return json.Marshal(&slList)
    }
    
    func (sl ServiceList) UnmarshalJSON(b []byte) error {
    	slList := make([]slMarshaled, 0)
    	if err := json.Unmarshal(b, &slList); err != nil {
    		return err
    	}
    	for _, s := range slList {
    		sl[s.Id] = s.Services
    	}
    	return nil
    }