| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- // 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(name alias.ClientName, sample alias.TopicName) (*ClientProxy, error) {
- log.Printf("NewClientProxy(): name=%q, sample=%q\n", name, sample)
- if name == "" {
- return nil, fmt.Errorf("NewClientProxy(): name is empty")
- }
- suffix := "_" + alias.ClientName(fmt.Sprint(time.Now().UnixMilli()))
- sf := &ClientProxy{
- name: name + suffix,
- sample: 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
- }
|