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.
81 lines
2.0 KiB
81 lines
2.0 KiB
package transport |
|
|
|
import ( |
|
"net" |
|
|
|
"github.com/go-faster/errors" |
|
|
|
"github.com/gotd/td/internal/proto/codec" |
|
) |
|
|
|
// Protocol is MTProto transport protocol. |
|
// |
|
// See https://core.telegram.org/mtproto/mtproto-transports |
|
type Protocol struct { |
|
codec func() Codec |
|
} |
|
|
|
// NewProtocol creates new transport protocol using user Codec constructor. |
|
// |
|
// See https://core.telegram.org/mtproto/mtproto-transports |
|
func NewProtocol(getCodec func() Codec) Protocol { |
|
return Protocol{ |
|
codec: getCodec, |
|
} |
|
} |
|
|
|
// Telegram transport protocols. |
|
// |
|
// See https://core.telegram.org/mtproto/mtproto-transports |
|
var ( |
|
// Abridged is abridged transport protocol. |
|
// |
|
// See https://core.telegram.org/mtproto/mtproto-transports#abridged |
|
Abridged = NewProtocol(func() Codec { return codec.Abridged{} }) |
|
|
|
// Intermediate is intermediate transport protocol. |
|
// |
|
// See https://core.telegram.org/mtproto/mtproto-transports#intermediate |
|
Intermediate = NewProtocol(func() Codec { return codec.Intermediate{} }) |
|
|
|
// PaddedIntermediate is padded intermediate transport protocol. |
|
// |
|
// See https://core.telegram.org/mtproto/mtproto-transports#padded-intermediate |
|
PaddedIntermediate = NewProtocol(func() Codec { return codec.PaddedIntermediate{} }) |
|
|
|
// Full is full transport protocol. |
|
// |
|
// See https://core.telegram.org/mtproto/mtproto-transports#full |
|
Full = NewProtocol(func() Codec { return &codec.Full{} }) |
|
) |
|
|
|
// Codec creates new codec using protocol settings. |
|
func (p Protocol) Codec() Codec { |
|
return p.codec() |
|
} |
|
|
|
// Handshake inits given net.Conn as MTProto connection. |
|
func (p Protocol) Handshake(conn net.Conn) (Conn, error) { |
|
connCodec := p.codec() |
|
if err := connCodec.WriteHeader(conn); err != nil { |
|
return nil, errors.Wrap(err, "write header") |
|
} |
|
|
|
return &connection{ |
|
conn: conn, |
|
codec: connCodec, |
|
}, nil |
|
} |
|
|
|
// Pipe creates an in-memory MTProto connection. |
|
func (p Protocol) Pipe() (a, b Conn) { |
|
p1, p2 := net.Pipe() |
|
|
|
return &connection{ |
|
conn: p1, |
|
codec: p.codec(), |
|
}, &connection{ |
|
conn: p2, |
|
codec: p.codec(), |
|
} |
|
}
|
|
|