MCPcopy Index your code
hub / github.com/github/copilot-sdk / handleWebSocket

Method handleWebSocket

go/copilot_request_handler.go:254–312  ·  view source on GitHub ↗
(rctx *CopilotRequestContext, sink *responseSink)

Source from the content-addressed store, hash-verified

252}
253
254func (h *CopilotRequestHandler) handleWebSocket(rctx *CopilotRequestContext, sink *responseSink) error {
255 var handler CopilotWebSocketHandler
256 var err error
257 if h.OpenWebSocket != nil {
258 handler, err = h.OpenWebSocket(rctx)
259 } else {
260 handler = NewCopilotWebSocketForwarder(rctx.URL, rctx.Headers)
261 }
262 if err != nil {
263 return err
264 }
265
266 writer := &wsResponseWriter{sink: sink}
267 // Emit the 101 upgrade head eagerly — the runtime gates connect_via_callback
268 // on receiving httpResponseStart/101 before sending request chunks; a lazy
269 // first-write start deadlocks until timeout.
270 if err := writer.start(); err != nil {
271 return err
272 }
273 if err := handler.Open(rctx.Context, writer); err != nil {
274 return writer.fail(err.Error(), "")
275 }
276 defer func() { _ = handler.Close() }()
277
278 clientDone := make(chan struct{})
279 go func() {
280 defer close(clientDone)
281 for {
282 select {
283 case frame, ok := <-rctx.body:
284 if !ok {
285 return
286 }
287 if err := handler.SendRequestMessage(rctx.Context, frame); err != nil {
288 return
289 }
290 case <-rctx.Context.Done():
291 return
292 }
293 }
294 }()
295
296 select {
297 case <-handler.Done():
298 if e := handler.Err(); e != nil {
299 return writer.fail(e.Error(), "")
300 }
301 return writer.end()
302 case <-clientDone:
303 _ = handler.Close()
304 <-handler.Done()
305 if e := handler.Err(); e != nil {
306 return writer.fail(e.Error(), "")
307 }
308 return writer.end()
309 case <-rctx.Context.Done():
310 return writer.fail("Request cancelled by runtime", "cancelled")
311 }

Callers 1

handleMethod · 0.95

Calls 11

startMethod · 0.95
OpenMethod · 0.95
failMethod · 0.95
CloseMethod · 0.95
SendRequestMessageMethod · 0.95
DoneMethod · 0.95
ErrMethod · 0.95
endMethod · 0.95
closeFunction · 0.50
ErrorMethod · 0.45

Tested by

no test coverage detected