4
4
"context"
5
5
"encoding/json"
6
6
"log"
7
- "time "
7
+ "math/rand "
8
8
9
9
"nhooyr.io/websocket"
10
10
)
@@ -17,6 +17,7 @@ type websocketMessage struct {
17
17
}
18
18
19
19
func (s * Server ) websocketHandler (c * PageCtx ) {
20
+ streamID := rand .Intn (10000 )
20
21
conn , err := websocket .Accept (c .Writer , c .Request , & websocket.AcceptOptions {
21
22
Subprotocols : []string {"guiapi" },
22
23
})
@@ -38,10 +39,10 @@ func (s *Server) websocketHandler(c *PageCtx) {
38
39
ch := make (chan * Response , 1 )
39
40
defer close (ch )
40
41
41
- id := time . Now (). UnixMilli () % 1000
42
+ log . Println ( "start websocket" , streamID )
42
43
43
44
go func () {
44
- defer log .Println ("exit websocket writer" , id )
45
+ defer log .Println ("exit websocket writer" , streamID )
45
46
for {
46
47
select {
47
48
case <- ctx .Done ():
@@ -53,7 +54,7 @@ func (s *Server) websocketHandler(c *PageCtx) {
53
54
return
54
55
case resp , ok := <- ch :
55
56
if ! ok {
56
- log .Println ("websocket writer not ok" , id )
57
+ log .Println ("websocket writer not ok" , streamID )
57
58
return
58
59
}
59
60
buf , err := json .Marshal (resp )
@@ -75,11 +76,15 @@ func (s *Server) websocketHandler(c *PageCtx) {
75
76
defer close (messages )
76
77
77
78
go func () {
78
- defer log .Println ("exit websocket reader" , id )
79
+ defer log .Println ("exit websocket reader" , streamID )
79
80
for {
80
81
msgType , buf , err := conn .Read (ctx )
81
82
if err != nil {
82
- log .Println ("websocket read error:" , err )
83
+ if websocket .CloseStatus (err ) == websocket .StatusGoingAway {
84
+ log .Println ("websocket going away" )
85
+ } else {
86
+ log .Println ("websocket read error:" , err , "CloseStatus:" , websocket .CloseStatus (err ))
87
+ }
83
88
cancel ()
84
89
return
85
90
}
@@ -90,14 +95,14 @@ func (s *Server) websocketHandler(c *PageCtx) {
90
95
select {
91
96
case messages <- buf :
92
97
case <- ctx .Done ():
93
- log .Println ("websocket reader blocked" , id )
98
+ log .Println ("websocket reader blocked" , streamID )
94
99
}
95
100
}
96
101
}()
97
102
98
103
var previousCancel context.CancelFunc
104
+ defer log .Println ("exit websocketHandler" , streamID )
99
105
for {
100
- defer log .Println ("exit websocket router" , id )
101
106
select {
102
107
case <- ctx .Done ():
103
108
return
@@ -106,7 +111,7 @@ func (s *Server) websocketHandler(c *PageCtx) {
106
111
previousCancel ()
107
112
}
108
113
if ! ok {
109
- log .Println ("websocket router not ok" , id )
114
+ log .Println ("websocket router not ok" , streamID )
110
115
return
111
116
}
112
117
var msg websocketMessage
@@ -116,12 +121,13 @@ func (s *Server) websocketHandler(c *PageCtx) {
116
121
cancel ()
117
122
break
118
123
}
124
+ log .Printf ("websocket message %q %s" , msg .Name , msg .Args )
119
125
subCtx , subCancel := context .WithCancel (ctx )
120
126
previousCancel = subCancel
121
127
go func () {
122
128
fn := s .streams [msg .Name ]
123
129
if fn == nil {
124
- log .Println ("StreamRouter error: unknown stream" , msg .Name )
130
+ log .Println ("StreamRouter error: unknown stream" , msg .Name , string ( buf ) )
125
131
cancel ()
126
132
return
127
133
}
0 commit comments