spark-server/internal/transport/tcp/handlers.go
2026-09-16 19:08:06 +08:00

60 lines
1.7 KiB
Go

package tcp
import (
"context"
"spark-server/internal/pkg/errs"
"spark-server/internal/transport/tcp/protocol"
"spark-server/internal/transport/tcp/session"
)
func (s *Server) registerDefaultHandlers() {
s.router.Register(protocol.CmdAuth, s.handleAuth)
s.router.Register(protocol.CmdGenerateMsgID, s.handleGenerateMsgID)
}
func (s *Server) handleAuth(ctx context.Context, conn *session.Conn, frame protocol.Frame) (*protocol.Frame, error) {
if s.auth == nil {
return nil, errs.ErrUnauthorized
}
req, err := protocol.DecodeAuthRequest(frame.Body)
if err != nil {
return nil, errs.ErrInvalidArgument
}
principal, err := s.auth.Authenticate(ctx, req.Token)
if err != nil {
return nil, err
}
deviceID := principal.DeviceID
if req.DeviceID != 0 {
deviceID = req.DeviceID
}
conn.Authenticate(principal.UserID, deviceID)
if err := s.sessions.Bind(conn); err != nil {
return nil, err
}
conn.Activate()
body := protocol.EncodeAuthResponse(protocol.AuthResponse{UserID: principal.UserID, DeviceID: deviceID})
return &protocol.Frame{
Version: protocol.CurrentVersion, Command: protocol.CmdAuth,
RequestID: frame.RequestID, SequenceID: frame.SequenceID, Body: body,
}, nil
}
func (s *Server) handleGenerateMsgID(_ context.Context, conn *session.Conn, frame protocol.Frame) (*protocol.Frame, error) {
if s.ids == nil {
return nil, errs.ErrInternal
}
if !conn.Authenticated() {
return nil, errs.ErrUnauthorized
}
id, err := s.ids.NextMsgID()
if err != nil {
return nil, err
}
return &protocol.Frame{
Version: protocol.CurrentVersion, Command: protocol.CmdGenerateMsgID,
RequestID: frame.RequestID, SequenceID: frame.SequenceID, Body: protocol.EncodeMsgID(id),
}, nil
}