protocol_json.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package microservice
  2. import (
  3. "context"
  4. "log"
  5. "net"
  6. "git.ali33.ru/fcg-xvii/go-tools/json"
  7. )
  8. func MakeProtocolJSON(conn net.Conn, ctx context.Context) *ProtocolJSON {
  9. proto := &ProtocolJSON{
  10. receiver: make(chan json.Map, 1),
  11. }
  12. proto.ctx, proto.cancel = context.WithCancel(ctx)
  13. proto.proto = MakeProtocolData(conn, proto.ctx)
  14. // receiver
  15. go proto.receive()
  16. return proto
  17. }
  18. type ProtocolJSON struct {
  19. proto *ProtocolData
  20. receiver chan json.Map
  21. ctx context.Context
  22. cancel context.CancelFunc
  23. }
  24. func (s *ProtocolJSON) receive() {
  25. defer func() {
  26. log.Println("JSON receiver closed")
  27. s.cancel()
  28. close(s.receiver)
  29. }()
  30. for {
  31. select {
  32. case <-s.ctx.Done():
  33. //s.proto.Close()
  34. return
  35. case <-s.proto.Context().Done():
  36. return
  37. case data, ok := <-s.proto.Receiver():
  38. if !ok {
  39. return
  40. }
  41. var m json.Map
  42. if err := json.Unmarshal(data, &m); err != nil {
  43. log.Println("Protocol JSON parse error:", err)
  44. return
  45. }
  46. select {
  47. case s.receiver <- m:
  48. default:
  49. }
  50. }
  51. }
  52. }
  53. func (s *ProtocolJSON) Context() context.Context {
  54. return s.ctx
  55. }
  56. func (s *ProtocolJSON) Receiver() <-chan json.Map {
  57. return s.receiver
  58. }
  59. func (s *ProtocolJSON) Send(m json.Map) {
  60. s.proto.Send(m.JSON())
  61. }
  62. func (s *ProtocolJSON) Close() {
  63. s.proto.Close()
  64. }