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. }
  30. log.Printf("NewClientProxy(): name=%q, sample=%q\n", req.ClientName, req.Sample)
  31. suffix := "_" + alias.ClientName(fmt.Sprint(time.Now().UnixMilli()))
  32. sf := &ClientProxy{
  33. name: alias.ClientName(req.ClientName) + suffix,
  34. sample: alias.TopicName(req.Sample),
  35. chMsg: make(chan *netapi.TopicMsg, 10),
  36. isWork: true,
  37. }
  38. _ = types.IClientProxy(sf)
  39. return sf, nil
  40. }
  41. // ResetWork -- сбрасывает признак работы
  42. func (sf *ClientProxy) ResetWork() {
  43. sf.block.Lock()
  44. defer sf.block.Unlock()
  45. sf.isWork = false
  46. close(sf.chMsg)
  47. }
  48. // IsWork -- возвращает признак работы прокси
  49. func (sf *ClientProxy) IsWork() bool {
  50. sf.block.RLock()
  51. defer sf.block.RUnlock()
  52. return sf.isWork
  53. }
  54. // Read -- читает канал сообщений от топиков
  55. func (sf *ClientProxy) Read() *netapi.TopicMsg {
  56. msg := <-sf.chMsg
  57. return msg
  58. }
  59. // Write -- записывает в себя сообщение топика
  60. func (sf *ClientProxy) Write(msg *netapi.TopicMsg) {
  61. sf.block.Lock()
  62. defer sf.block.Unlock()
  63. if !sf.isWork {
  64. return
  65. }
  66. if msg == nil {
  67. log.Printf("ClientProxy.Write(): clientName=%q, msg==nil\n", sf.name)
  68. return
  69. }
  70. sf.chMsg <- msg
  71. }
  72. // SampleTopic -- возвращает образец шаблона подписки на топики
  73. func (sf *ClientProxy) SampleTopic() alias.TopicName {
  74. return sf.sample
  75. }
  76. // ClientName -- возвращает имя клиента
  77. func (sf *ClientProxy) ClientName() alias.ClientName {
  78. return sf.name
  79. }