repos / hub.go.git


Evgenii Akentev  ·  2024-09-02

client.go

 1package main
 2
 3import (
 4	"net/http"
 5  "log"
 6	"github.com/gorilla/websocket"
 7)
 8
 9var upgrader = websocket.Upgrader{
10	ReadBufferSize:  1024,
11	WriteBufferSize: 1024,
12  CheckOrigin: func(r *http.Request) bool{ return true },
13}
14
15type Client struct {
16	hub *Hub
17	conn *websocket.Conn
18  hubResponse chan HubResponse
19}
20
21
22func (c *Client) run() {
23  go c.handleChannels()
24  go c.listenConnection()
25}
26
27func (c *Client) handleChannels() {
28  defer func() {
29    close(c.hubResponse)
30  }()
31
32  for {
33    select {
34    case response := <- c.hubResponse:
35      switch r := response.(type) {
36        case CopyrightsHubResponse:
37          c.conn.WriteJSON(CopyrightsResponse{"copyrights", r})
38        case CopyrightStatesHubResponse:
39          c.conn.WriteJSON(CopyrightStatesResponse{"new-states", r})
40      }
41    }
42  }
43}
44
45func (c *Client) listenConnection() {
46  defer func() {
47    c.hub.unregister <- c
48    c.conn.Close()
49    close(c.hubResponse)
50  }()
51
52  for {
53    var m Message 
54    err := c.conn.ReadJSON(&m)
55
56  	if err != nil {
57			if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {
58				log.Printf("error: %v", err)
59			}
60      log.Printf("error: %v", err)
61			break
62		}
63
64    switch m.Event {
65    case "subscribe-copyrights":
66      for _, addr := range m.Addrs {
67        c.hub.subscribe <- SubMessage{Contract, addr, c}
68      }
69    case "unsubscribe-copyrights":
70      for _, addr := range m.Addrs {
71        c.hub.unsubscribe <- SubMessage{Contract, addr, c}
72      }
73    case "subscribe-wallets":
74      for _, addr := range m.Addrs {
75        c.hub.subscribe <- SubMessage{Wallet, addr, c}
76      }
77    case "unsubscribe-wallets":
78      for _, addr := range m.Addrs {
79        c.hub.unsubscribe <- SubMessage{Wallet, addr, c}
80      }
81    case "get-copyrights":
82      c.hub.clientQuery <- ClientQuery{c, GetCopyrightsQuery(m.Addrs)}
83    case "get-copyrights-by-wallets":
84      c.hub.clientQuery <- ClientQuery{c, GetCopyrightsByWalletsQuery(m.Addrs)}
85    case "get-states":
86      c.hub.clientQuery <- ClientQuery{c, GetCopyrightStatesQuery(m.Addrs)}
87    default:
88      log.Printf("error: Unsupported event: %v", m)
89    }
90  }
91}