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
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

relay.go 1.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package relay
  2. import (
  3. "context"
  4. "errors"
  5. "io"
  6. "sync"
  7. "github.com/9seconds/mtg/v2/essentials"
  8. )
  9. func Relay(ctx context.Context, log Logger, telegramConn, clientConn essentials.Conn) {
  10. defer telegramConn.Close()
  11. defer clientConn.Close()
  12. ctx, cancel := context.WithCancel(ctx)
  13. defer cancel()
  14. go func() {
  15. <-ctx.Done()
  16. telegramConn.Close()
  17. clientConn.Close()
  18. }()
  19. wg := &sync.WaitGroup{}
  20. wg.Add(2) // nolint: gomnd
  21. go pump(log, telegramConn, clientConn, wg, "client -> telegram")
  22. pump(log, clientConn, telegramConn, wg, "telegram -> client")
  23. wg.Wait()
  24. }
  25. func pump(log Logger, src, dst essentials.Conn, wg *sync.WaitGroup, direction string) {
  26. syncer := acquireSyncPair(src, dst)
  27. defer func() {
  28. syncer.Flush()
  29. releaseSyncPair(syncer)
  30. src.CloseRead() // nolint: errcheck
  31. dst.CloseWrite() // nolint: errcheck
  32. wg.Done()
  33. }()
  34. n, err := syncer.Sync()
  35. switch {
  36. case err == nil:
  37. log.Printf("%s has been finished", direction)
  38. case errors.Is(err, io.EOF):
  39. log.Printf("%s has been finished because of EOF. Written %d bytes", direction, n)
  40. default:
  41. log.Printf("%s has been finished (written %d bytes): %v", direction, n, err)
  42. }
  43. }