MCPcopy
hub / github.com/tinode/chat / writeLoop

Method writeLoop

server/hdl_websock.go:84–145  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

82}
83
84func (sess *Session) writeLoop() {
85 ticker := time.NewTicker(pingPeriod)
86
87 defer func() {
88 ticker.Stop()
89 // Break readLoop.
90 sess.closeWS()
91 }()
92
93 for {
94 select {
95 case msg, ok := <-sess.send:
96 if !ok {
97 // Channel closed.
98 return
99 }
100 switch v := msg.(type) {
101 case []*ServerComMessage: // batch of unserialized messages
102 for _, msg := range v {
103 w := sess.serializeAndUpdateStats(msg)
104 if !sess.sendMessage(w) {
105 return
106 }
107 }
108 case *ServerComMessage: // single unserialized message
109 w := sess.serializeAndUpdateStats(v)
110 if !sess.sendMessage(w) {
111 return
112 }
113 default: // serialized message
114 if !sess.sendMessage(v) {
115 return
116 }
117 }
118
119 case <-sess.bkgTimer.C:
120 if sess.background {
121 sess.background = false
122 sess.onBackgroundTimer()
123 }
124
125 case msg := <-sess.stop:
126 // Shutdown requested, don't care if the message is delivered
127 if msg != nil {
128 wsWrite(sess.ws, websocket.TextMessage, msg)
129 }
130 return
131
132 case topic := <-sess.detach:
133 sess.delSub(topic)
134
135 case <-ticker.C:
136 if err := wsWrite(sess.ws, websocket.PingMessage, nil); err != nil {
137 if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure,
138 websocket.CloseNormalClosure) {
139 logs.Err.Println("ws: writeLoop ping", sess.sid, err)
140 }
141 return

Callers 1

serveWebSocketFunction · 0.95

Calls 8

closeWSMethod · 0.95
sendMessageMethod · 0.95
onBackgroundTimerMethod · 0.95
delSubMethod · 0.95
wsWriteFunction · 0.85
PrintlnMethod · 0.80
StopMethod · 0.65

Tested by

no test coverage detected