Highly-opinionated (ex-bullshit-free) MTPROTO proxy for Telegram. If you use v1.0 or upgrade broke you proxy, please read the chapter Version 2
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

closeable_channel.go 1.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package hub
  2. import (
  3. "context"
  4. "errors"
  5. "time"
  6. "github.com/9seconds/mtg/conntypes"
  7. )
  8. const closeableChannelReadTimeout = 2 * time.Minute
  9. type ChannelReadCloser interface {
  10. Read() (conntypes.Packet, error)
  11. Close()
  12. }
  13. type closeableChannel struct {
  14. channel chan conntypes.Packet
  15. ctx context.Context
  16. cancel context.CancelFunc
  17. }
  18. func (c *closeableChannel) Read() (conntypes.Packet, error) {
  19. timer := time.NewTimer(closeableChannelReadTimeout)
  20. defer timer.Stop()
  21. select {
  22. case <-timer.C:
  23. return nil, errors.New("timeout")
  24. case <-c.ctx.Done():
  25. return nil, errors.New("channel was closed")
  26. case packet := <-c.channel:
  27. return packet, nil
  28. }
  29. }
  30. func (c *closeableChannel) write(packet conntypes.Packet) error {
  31. select {
  32. case <-c.ctx.Done():
  33. return errors.New("channel was closed")
  34. case c.channel <- packet:
  35. return nil
  36. }
  37. }
  38. func (c *closeableChannel) Close() {
  39. c.cancel()
  40. c.channel = nil
  41. }
  42. func newCloseableChannel(ctx context.Context) *closeableChannel {
  43. ctx, cancel := context.WithCancel(ctx)
  44. return &closeableChannel{
  45. channel: make(chan conntypes.Packet),
  46. ctx: ctx,
  47. cancel: cancel,
  48. }
  49. }