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

Method writeOnce

server/hdl_longpoll.go:37–89  ·  view source on GitHub ↗
(wrt http.ResponseWriter, req *http.Request)

Source from the content-addressed store, hash-verified

35}
36
37func (sess *Session) writeOnce(wrt http.ResponseWriter, req *http.Request) {
38 for {
39 select {
40 case msg, ok := <-sess.send:
41 if !ok {
42 return
43 }
44 switch v := msg.(type) {
45 case *ServerComMessage: // single unserialized message
46 w := sess.serializeAndUpdateStats(v)
47 if !sess.sendMessageLp(wrt, w) {
48 return
49 }
50 default: // serialized message
51 if !sess.sendMessageLp(wrt, v) {
52 return
53 }
54 }
55 return
56
57 case <-sess.bkgTimer.C:
58 if sess.background {
59 sess.background = false
60 sess.onBackgroundTimer()
61 }
62
63 case msg := <-sess.stop:
64 // Request to close the session. Make it unavailable.
65 globals.sessionStore.Delete(sess)
66 // Don't care if lpWrite fails.
67 if msg != nil {
68 lpWrite(wrt, msg)
69 }
70 return
71
72 case topic := <-sess.detach:
73 // Request to detach the session from a topic.
74 sess.delSub(topic)
75 // No 'return' statement here: continue waiting
76
77 case <-time.After(pingPeriod):
78 // just write an empty packet on timeout
79 if _, err := wrt.Write([]byte{}); err != nil {
80 logs.Err.Println("longPoll: writeOnce: timout", sess.sid, err)
81 }
82 return
83
84 case <-req.Context().Done():
85 // HTTP request canceled or connection lost.
86 return
87 }
88 }
89}
90
91func lpWrite(wrt http.ResponseWriter, msg any) error {
92 // This will panic if msg is not []byte. This is intentional.

Callers 1

serveLongPollFunction · 0.95

Calls 9

sendMessageLpMethod · 0.95
onBackgroundTimerMethod · 0.95
delSubMethod · 0.95
lpWriteFunction · 0.85
WriteMethod · 0.80
PrintlnMethod · 0.80
DoneMethod · 0.80
DeleteMethod · 0.65

Tested by

no test coverage detected