MCPcopy Create free account
hub / github.com/koding/kite / Recv

Method Recv

sockjsclient/sockjsclient.go:198–259  ·  view source on GitHub ↗

Recv reads one text frame from session.

()

Source from the content-addressed store, hash-verified

196
197// Recv reads one text frame from session.
198func (w *WebsocketSession) Recv() (string, error) {
199 // Return previously received messages if there is any.
200 if len(w.messages) > 0 {
201 msg := w.messages[0]
202 w.messages = w.messages[1:]
203 return msg, nil
204 }
205
206read_frame:
207 if atomic.LoadInt32(&w.closed) == 1 {
208 return "", ErrSessionClosed
209 }
210
211 // Read one SockJS frame.
212 _, buf, err := w.conn.ReadMessage()
213 if err != nil {
214 return "", err
215 }
216
217 if len(buf) == 0 {
218 return "", errors.New("unexpected empty message")
219 }
220
221 frameType := buf[0]
222 data := buf[1:]
223
224 switch frameType {
225 case 'o':
226 w.setState(sockjs.SessionActive)
227 goto read_frame
228 case 'a':
229 var messages []string
230 err = json.Unmarshal(data, &messages)
231 if err != nil {
232 return "", err
233 }
234 w.messages = append(w.messages, messages...)
235 case 'm':
236 var message string
237 err = json.Unmarshal(data, &message)
238 if err != nil {
239 return "", err
240 }
241 w.messages = append(w.messages, message)
242 case 'c':
243 w.setState(sockjs.SessionClosed)
244 return "", ErrSessionClosed
245 case 'h':
246 // TODO handle heartbeat
247 goto read_frame
248 default:
249 return "", errors.New("invalid frame type")
250 }
251
252 // Return first message in slice.
253 if len(w.messages) == 0 {
254 return "", errors.New("no message")
255 }

Callers

nothing calls this directly

Calls 2

setStateMethod · 0.95
UnmarshalMethod · 0.80

Tested by

no test coverage detected