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}