client_proxy.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // package cleint_proxy -- прокси подписывания клиента на топики по шаблону
  2. package cleint_proxy
  3. import (
  4. "fmt"
  5. "log"
  6. "sync"
  7. "time"
  8. "p78git.ddns.net/svi/gobus/pkg/alias"
  9. "p78git.ddns.net/svi/gobus/pkg/net/netapi"
  10. "p78git.ddns.net/svi/gobus/pkg/types"
  11. )
  12. // ClientProxy -- параметры подписывания клиента на топик
  13. type ClientProxy struct {
  14. name alias.ClientName // Имя клиента
  15. sample alias.TopicName // Образец подписи
  16. isWork bool // Признак, что получатель живой
  17. chMsg chan *netapi.TopicMsg // Канал для обратной связи из топиков
  18. block sync.RWMutex
  19. }
  20. // NewClientProxy -- возвращает новый прокси подписывания клиента на топик
  21. func NewClientProxy(name alias.ClientName, sample alias.TopicName) (*ClientProxy, error) {
  22. log.Printf("NewClientProxy(): name=%q, sample=%q\n", name, sample)
  23. if name == "" {
  24. return nil, fmt.Errorf("NewClientProxy(): name is empty")
  25. }
  26. suffix := "_" + alias.ClientName(fmt.Sprint(time.Now().UnixMilli()))
  27. sf := &ClientProxy{
  28. name: name + suffix,
  29. sample: sample,
  30. chMsg: make(chan *netapi.TopicMsg, 10),
  31. isWork: true,
  32. }
  33. _ = types.IClientProxy(sf)
  34. return sf, nil
  35. }
  36. // ResetWork -- сбрасывает признак работы
  37. func (sf *ClientProxy) ResetWork() {
  38. sf.block.Lock()
  39. defer sf.block.Unlock()
  40. sf.isWork = false
  41. close(sf.chMsg)
  42. }
  43. // IsWork -- возвращает признак работы прокси
  44. func (sf *ClientProxy) IsWork() bool {
  45. sf.block.RLock()
  46. defer sf.block.RUnlock()
  47. return sf.isWork
  48. }
  49. // Read -- читает канал сообщений от топиков
  50. func (sf *ClientProxy) Read() *netapi.TopicMsg {
  51. msg := <-sf.chMsg
  52. return msg
  53. }
  54. // Write -- записывает в себя сообщение топика
  55. func (sf *ClientProxy) Write(msg *netapi.TopicMsg) {
  56. sf.block.Lock()
  57. defer sf.block.Unlock()
  58. if !sf.isWork {
  59. return
  60. }
  61. sf.chMsg <- msg
  62. }
  63. // SampleTopic -- возвращает образец шаблона подписки на топики
  64. func (sf *ClientProxy) SampleTopic() alias.TopicName {
  65. return sf.sample
  66. }
  67. // ClientName -- возвращает имя клиента
  68. func (sf *ClientProxy) ClientName() alias.ClientName {
  69. return sf.name
  70. }