// package cleint_proxy -- прокси подписывания клиента на топики по шаблону package cleint_proxy import ( "fmt" "log" "sync" "time" "p78git.ddns.net/svi/gobus/api/netapi" "p78git.ddns.net/svi/gobus/pkg/alias" "p78git.ddns.net/svi/gobus/pkg/types" ) // ClientProxy -- параметры подписывания клиента на топик type ClientProxy struct { name alias.ClientName // Имя клиента sample alias.TopicName // Образец подписи isWork bool // Признак, что получатель живой chMsg chan *netapi.TopicMsg // Канал для обратной связи из топиков block sync.RWMutex } // NewClientProxy -- возвращает новый прокси подписывания клиента на топик func NewClientProxy(req *netapi.SubscribeRequest) (*ClientProxy, error) { { // Предусловия if req == nil { return nil, fmt.Errorf("NewClientProxy(): SubscribeRequest==nil") } if req.ClientName == "" { return nil, fmt.Errorf("NewClientProxy(): name is empty") } if req.Sample == "" { return nil, fmt.Errorf("NewClientProxy(): sample is empty") } } log.Printf("NewClientProxy(): name=%q, sample=%q\n", req.ClientName, req.Sample) suffix := "_" + alias.ClientName(fmt.Sprint(time.Now().UnixMilli())) sf := &ClientProxy{ name: alias.ClientName(req.ClientName) + suffix, sample: alias.TopicName(req.Sample), chMsg: make(chan *netapi.TopicMsg, 10), isWork: true, } _ = types.IClientProxy(sf) return sf, nil } // ResetWork -- сбрасывает признак работы func (sf *ClientProxy) ResetWork() { sf.block.Lock() defer sf.block.Unlock() sf.isWork = false close(sf.chMsg) } // IsWork -- возвращает признак работы прокси func (sf *ClientProxy) IsWork() bool { sf.block.RLock() defer sf.block.RUnlock() return sf.isWork } // Read -- читает канал сообщений от топиков func (sf *ClientProxy) Read() *netapi.TopicMsg { msg := <-sf.chMsg return msg } // Write -- записывает в себя сообщение топика func (sf *ClientProxy) Write(msg *netapi.TopicMsg) { sf.block.Lock() defer sf.block.Unlock() if !sf.isWork { return } sf.chMsg <- msg } // SampleTopic -- возвращает образец шаблона подписки на топики func (sf *ClientProxy) SampleTopic() alias.TopicName { return sf.sample } // ClientName -- возвращает имя клиента func (sf *ClientProxy) ClientName() alias.ClientName { return sf.name }