client_proxy.go 2.6 KB

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