Prevent multiple close of channel
This commit is contained in:
parent
e7bec24f0f
commit
c659a98587
@ -2,6 +2,7 @@ package reachview
|
||||
|
||||
import (
|
||||
"context"
|
||||
"sync"
|
||||
|
||||
gosocketio "forge.cadoles.com/Pyxis/golang-socketio"
|
||||
"github.com/mitchellh/mapstructure"
|
||||
@ -31,6 +32,8 @@ type Broadcast struct {
|
||||
func (c *Client) Broadcast(ctx context.Context) (chan Broadcast, error) {
|
||||
out := make(chan Broadcast)
|
||||
|
||||
closer := new(sync.Once)
|
||||
|
||||
handler := func(_ *gosocketio.Channel, data interface{}) {
|
||||
res := Broadcast{}
|
||||
if err := mapstructure.WeakDecode(data, &res); err != nil {
|
||||
@ -38,8 +41,12 @@ func (c *Client) Broadcast(ctx context.Context) (chan Broadcast, error) {
|
||||
}
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
c.Off(eventBroadcast)
|
||||
close(out)
|
||||
closer.Do(func() {
|
||||
c.Off(eventBroadcast)
|
||||
close(out)
|
||||
})
|
||||
|
||||
return
|
||||
default:
|
||||
out <- res
|
||||
}
|
||||
|
Reference in New Issue
Block a user