| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- package mtglib
-
- import (
- "context"
- "crypto/rand"
- "encoding/base64"
- "net"
- "time"
-
- "github.com/9seconds/mtg/v2/essentials"
- )
-
- type streamContext struct {
- ctx context.Context
- ctxCancel context.CancelFunc
- clientConn essentials.Conn
- telegramConn essentials.Conn
- streamID string
- dc int
- matchedSecretKey []byte
- secretName string
- logger Logger
- }
-
- func (s *streamContext) Deadline() (time.Time, bool) {
- return s.ctx.Deadline()
- }
-
- func (s *streamContext) Done() <-chan struct{} {
- return s.ctx.Done()
- }
-
- func (s *streamContext) Err() error {
- return s.ctx.Err() //nolint: wrapcheck
- }
-
- func (s *streamContext) Value(key any) any {
- return s.ctx.Value(key)
- }
-
- func (s *streamContext) Close() {
- s.ctxCancel()
-
- if s.clientConn != nil {
- s.clientConn.Close() //nolint: errcheck
- }
-
- if s.telegramConn != nil {
- s.telegramConn.Close() //nolint: errcheck
- }
- }
-
- func (s *streamContext) ClientIP() net.IP {
- return s.clientConn.RemoteAddr().(*net.TCPAddr).IP //nolint: forcetypeassert
- }
-
- func newStreamContext(ctx context.Context, logger Logger, clientConn essentials.Conn) *streamContext {
- connIDBytes := make([]byte, ConnectionIDBytesLength)
-
- if _, err := rand.Read(connIDBytes); err != nil {
- panic(err)
- }
-
- ctx, cancel := context.WithCancel(ctx)
- streamCtx := &streamContext{
- ctx: ctx,
- ctxCancel: cancel,
- clientConn: clientConn,
- streamID: base64.RawURLEncoding.EncodeToString(connIDBytes),
- }
- streamCtx.logger = logger.
- BindStr("stream-id", streamCtx.streamID).
- BindStr("client-ip", streamCtx.ClientIP().String())
-
- return streamCtx
- }
|