dict_client_proxy_buffer.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. // package dict_client_proxy_buffer -- словарь буферизованных клиентов
  2. //
  3. // Способен переживать отключения клиентов и накапливать информацию по необходимости
  4. package dict_client_proxy_buffer
  5. import (
  6. "fmt"
  7. "sync"
  8. "p78git.ddns.net/svi/gobus/pkg/alias"
  9. "p78git.ddns.net/svi/gobus/pkg/net/client_proxy_buffer"
  10. "p78git.ddns.net/svi/gobus/pkg/net/netapi"
  11. "p78git.ddns.net/svi/gobus/pkg/types"
  12. )
  13. // DictClientProxyBuffer -- словарь буферизованных клиентов
  14. //
  15. // Способен переживать отключения клиентов и накапливать информацию по необходимости
  16. type DictClientProxyBuffer struct {
  17. serv types.IService
  18. dictTopic types.IDictTopic
  19. dict map[alias.ClientName]types.IClientProxyBuffer
  20. block sync.RWMutex
  21. }
  22. // NewDictClientProxyBuffer -- возвращает новый словарь буферизованных клиентов
  23. func NewDictClientProxyBuffer(serv types.IService) (*DictClientProxyBuffer, error) {
  24. if serv == nil {
  25. return nil, fmt.Errorf("NewDictClientProxyBuffer(): IService==nil")
  26. }
  27. sf := &DictClientProxyBuffer{
  28. serv: serv,
  29. dictTopic: serv.DictTopic(),
  30. dict: make(map[alias.ClientName]types.IClientProxyBuffer),
  31. }
  32. _ = types.IDictClientProxyBuffer(sf)
  33. return sf, nil
  34. }
  35. // Add -- добавляет нового буферизованного клиента в словарь
  36. func (sf *DictClientProxyBuffer) Add(req *netapi.BuffRequest) (types.IClientProxyBuffer, error) {
  37. sf.block.Lock()
  38. defer sf.block.Unlock()
  39. clientProxyBuff, err := client_proxy_buffer.NewClientProxyBuffer(req)
  40. if err != nil {
  41. return nil, fmt.Errorf("DictClientProxyBuffer.Add(): in create ClientProxyBuffer(): err=\n\t%w", err)
  42. }
  43. sf.dict[clientProxyBuff.ClientName()] = clientProxyBuff
  44. // Отправить в словарь топиков на подписку
  45. sf.dictTopic.Subscribe(clientProxyBuff)
  46. return clientProxyBuff, nil
  47. }