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.

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package relay
  2. import (
  3. "context"
  4. "io"
  5. "sync"
  6. )
  7. func Relay(ctx context.Context, log Logger, telegramConn, clientConn io.ReadWriteCloser) {
  8. defer telegramConn.Close()
  9. defer clientConn.Close()
  10. ctx, cancel := context.WithCancel(ctx)
  11. defer cancel()
  12. go func() {
  13. <-ctx.Done()
  14. telegramConn.Close()
  15. clientConn.Close()
  16. }()
  17. buffers := acquireEastWest()
  18. defer releaseEastWest(buffers)
  19. wg := &sync.WaitGroup{}
  20. wg.Add(2) // nolint: gomnd
  21. go pump(log, telegramConn, clientConn, wg, buffers.east, "east -> west")
  22. pump(log, clientConn, telegramConn, wg, buffers.west, "west -> east")
  23. wg.Wait()
  24. }
  25. func pump(log Logger, src io.ReadCloser, dst io.WriteCloser, wg *sync.WaitGroup,
  26. buf []byte, direction string) {
  27. defer wg.Done()
  28. defer src.Close()
  29. defer dst.Close()
  30. if n, err := io.CopyBuffer(dst, src, buf); err != nil {
  31. log.Printf("cannot pump %s (written %d bytes): %w", direction, n, err)
  32. }
  33. }