@@ -285,7 +285,7 @@ func WebsocketCloseSprintf(format string, vars ...any) string {
285
285
return msg
286
286
}
287
287
288
- type InitializeConnectionCallback func (rw http.ResponseWriter , r * http.Request ) (
288
+ type EventSender func (rw http.ResponseWriter , r * http.Request ) (
289
289
sendEvent func (sse codersdk.ServerSentEvent ) error ,
290
290
done <- chan struct {},
291
291
err error ,
@@ -326,16 +326,13 @@ func ServerSentEventSender(rw http.ResponseWriter, r *http.Request) (
326
326
// Synchronized handling of events (no guarantee of order).
327
327
go func () {
328
328
defer close (closed )
329
-
330
- // Send a heartbeat every 15 seconds to avoid the connection being killed.
331
- ticker := time .NewTicker (time .Second * 15 )
329
+ ticker := time .NewTicker (HeartbeatInterval )
332
330
defer ticker .Stop ()
333
331
334
332
for {
335
333
var event sseEvent
336
-
337
334
select {
338
- case <- r . Context () .Done ():
335
+ case <- ctx .Done ():
339
336
return
340
337
case event = <- eventC :
341
338
case <- ticker .C :
@@ -357,8 +354,6 @@ func ServerSentEventSender(rw http.ResponseWriter, r *http.Request) (
357
354
358
355
sendEvent := func (newEvent codersdk.ServerSentEvent ) error {
359
356
buf := & bytes.Buffer {}
360
- enc := json .NewEncoder (buf )
361
-
362
357
_ , err := buf .WriteString (fmt .Sprintf ("event: %s\n " , newEvent .Type ))
363
358
if err != nil {
364
359
return err
@@ -369,6 +364,8 @@ func ServerSentEventSender(rw http.ResponseWriter, r *http.Request) (
369
364
if err != nil {
370
365
return err
371
366
}
367
+
368
+ enc := json .NewEncoder (buf )
372
369
err = enc .Encode (newEvent .Data )
373
370
if err != nil {
374
371
return err
@@ -386,8 +383,6 @@ func ServerSentEventSender(rw http.ResponseWriter, r *http.Request) (
386
383
}
387
384
388
385
select {
389
- case <- r .Context ().Done ():
390
- return r .Context ().Err ()
391
386
case <- ctx .Done ():
392
387
return ctx .Err ()
393
388
case <- closed :
@@ -397,8 +392,6 @@ func ServerSentEventSender(rw http.ResponseWriter, r *http.Request) (
397
392
// for early exit. We don't check closed here because it
398
393
// can't happen while processing the event.
399
394
select {
400
- case <- r .Context ().Done ():
401
- return r .Context ().Err ()
402
395
case <- ctx .Done ():
403
396
return ctx .Err ()
404
397
case err := <- event .errC :
@@ -410,8 +403,8 @@ func ServerSentEventSender(rw http.ResponseWriter, r *http.Request) (
410
403
return sendEvent , closed , nil
411
404
}
412
405
413
- // OneWayWebSocket establishes a new WebSocket connection that enforces one-way
414
- // communication from the server to the client.
406
+ // OneWayWebSocketEventSender establishes a new WebSocket connection that
407
+ // enforces one-way communication from the server to the client.
415
408
//
416
409
// The function returned allows you to send a single message to the client,
417
410
// while the channel lets you listen for when the connection closes.
@@ -422,7 +415,7 @@ func ServerSentEventSender(rw http.ResponseWriter, r *http.Request) (
422
415
// open a workspace in multiple tabs, the entire UI can start to lock up.
423
416
// WebSockets have no such limitation, no matter what HTTP protocol was used to
424
417
// establish the connection.
425
- func OneWayWebSocket (rw http.ResponseWriter , r * http.Request ) (
418
+ func OneWayWebSocketEventSender (rw http.ResponseWriter , r * http.Request ) (
426
419
func (event codersdk.ServerSentEvent ) error ,
427
420
<- chan struct {},
428
421
error ,
@@ -436,12 +429,8 @@ func OneWayWebSocket(rw http.ResponseWriter, r *http.Request) (
436
429
}
437
430
go Heartbeat (ctx , socket )
438
431
439
- type SocketError struct {
440
- Code websocket.StatusCode
441
- Reason string
442
- }
443
432
eventC := make (chan codersdk.ServerSentEvent )
444
- socketErrC := make (chan SocketError , 1 )
433
+ socketErrC := make (chan websocket. CloseError , 1 )
445
434
closed := make (chan struct {})
446
435
go func () {
447
436
defer cancel ()
@@ -477,13 +466,13 @@ func OneWayWebSocket(rw http.ResponseWriter, r *http.Request) (
477
466
return
478
467
}
479
468
if err != nil {
480
- socketErrC <- SocketError {
469
+ socketErrC <- websocket. CloseError {
481
470
Code : websocket .StatusInternalError ,
482
471
Reason : "Unable to process invalid message from client" ,
483
472
}
484
473
return
485
474
}
486
- socketErrC <- SocketError {
475
+ socketErrC <- websocket. CloseError {
487
476
Code : websocket .StatusProtocolError ,
488
477
Reason : "Clients cannot send messages for one-way WebSockets" ,
489
478
}
0 commit comments