mirror of
https://github.com/idrunk/dce-go.git
synced 2025-11-03 01:33:28 +08:00
44 lines
957 B
Go
44 lines
957 B
Go
package flex
|
|
|
|
import (
|
|
"bufio"
|
|
"github.com/idrunk/dce-go/proto"
|
|
"github.com/idrunk/dce-go/router"
|
|
"log/slog"
|
|
"net"
|
|
)
|
|
|
|
type Tcp = router.Context[*TcpProtocol]
|
|
|
|
type TcpProtocol struct {
|
|
*PackageProtocol[net.Conn]
|
|
}
|
|
|
|
type WrappedTcpRouter struct {
|
|
proto.ConnectorMappingManager[*TcpProtocol, net.Conn]
|
|
}
|
|
|
|
func (t *WrappedTcpRouter) Route(conn net.Conn, ctxData map[string]any) bool {
|
|
pkg, err := NewPackageProtocol(bufio.NewReader(conn), conn, ctxData)
|
|
if err != nil {
|
|
return t.Except(conn.RemoteAddr().String(), err)
|
|
}
|
|
sw := &TcpProtocol{pkg}
|
|
context := router.NewContext(sw)
|
|
t.Router.Route(context)
|
|
sw.TryPrintErr()
|
|
if context.Api != nil && context.Api.Responsive {
|
|
bytes := sw.ClearBuffer()
|
|
if _, err = conn.Write(bytes); err != nil {
|
|
slog.Error(err.Error())
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
var TcpRouter *WrappedTcpRouter
|
|
|
|
func init() {
|
|
TcpRouter = &WrappedTcpRouter{proto.NewConnectorMappingManager[*TcpProtocol, net.Conn]("flex-tcp")}
|
|
}
|