FILE / ScuroNeko/mtg

hub/ctx_channel.go

Исходный файл и его история в репозитории.
FILE 6c7edfb7db1028c73cb5990866dafcfdef998824
Files
mtg/hub/ctx_channel.go
T
2019-10-08 11:55:57 +03:00

60 lines
1.0 KiB
Go

package hub
import (
"context"
"time"
"github.com/9seconds/mtg/conntypes"
)
const closeableChannelReadTimeout = 2 * time.Minute
type ChannelReadCloser interface {
Read() (conntypes.Packet, error)
Close() error
}
type ctxChannel struct {
channel chan conntypes.Packet
ctx context.Context
cancel context.CancelFunc
}
func (c *ctxChannel) Read() (conntypes.Packet, error) {
timer := time.NewTimer(closeableChannelReadTimeout)
defer timer.Stop()
select {
case <-timer.C:
return nil, ErrTimeout
case <-c.ctx.Done():
return nil, ErrClosed
case packet := <-c.channel:
return packet, nil
}
}
func (c *ctxChannel) write(packet conntypes.Packet) error {
select {
case <-c.ctx.Done():
return ErrClosed
case c.channel <- packet:
return nil
}
}
func (c *ctxChannel) Close() error {
c.cancel()
c.channel = nil
return nil
}
func newCtxChannel(ctx context.Context) *ctxChannel {
ctx, cancel := context.WithCancel(ctx)
return &ctxChannel{
channel: make(chan conntypes.Packet),
ctx: ctx,
cancel: cancel,
}
}