音视频通话

This commit is contained in:
hawklin2017 2026-04-07 00:13:17 +08:00
parent 4b9412f685
commit c074921734
2 changed files with 27 additions and 7 deletions

View File

@ -17,9 +17,10 @@ package msggateway
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"github.com/openimsdk/open-im-server/v3/pkg/rpcli"
"sync" "sync"
"github.com/openimsdk/open-im-server/v3/pkg/rpcli"
"github.com/go-playground/validator/v10" "github.com/go-playground/validator/v10"
"google.golang.org/protobuf/proto" "google.golang.org/protobuf/proto"
@ -28,6 +29,7 @@ import (
"github.com/openimsdk/protocol/rtc" "github.com/openimsdk/protocol/rtc"
"github.com/openimsdk/protocol/sdkws" "github.com/openimsdk/protocol/sdkws"
"github.com/openimsdk/tools/errs" "github.com/openimsdk/tools/errs"
"github.com/openimsdk/tools/log"
"github.com/openimsdk/tools/utils/jsonutil" "github.com/openimsdk/tools/utils/jsonutil"
) )
@ -176,17 +178,28 @@ func (g *GrpcHandler) SendMessage(ctx context.Context, data *Req) ([]byte, error
} }
func (g *GrpcHandler) SendSignalMessage(ctx context.Context, data *Req) ([]byte, error) { func (g *GrpcHandler) SendSignalMessage(ctx context.Context, data *Req) ([]byte, error) {
var req rtc.SignalMessageAssembleReq // SDK 长连接发送的是 proto.Marshal(SignalReq)HTTP/gRPC 侧使用 SignalMessageAssembleReq 包装。
if err := proto.Unmarshal(data.Data, &req); err != nil { var assembleReq rtc.SignalMessageAssembleReq
return nil, errs.WrapMsg(err, "SendSignalMessage: error unmarshaling request", "action", "unmarshal", "dataType", "SignalMessageAssembleReq") if err := proto.Unmarshal(data.Data, &assembleReq); err != nil || assembleReq.SignalReq == nil {
var signalReq rtc.SignalReq
if err2 := proto.Unmarshal(data.Data, &signalReq); err2 != nil {
log.ZError(ctx, "SendSignalMessage", err2, "r", err2.Error())
return nil, errs.WrapMsg(err2, "SendSignalMessage: error unmarshaling request", "action", "unmarshal", "dataType", "SignalReq")
}
assembleReq.SignalReq = &signalReq
} }
resp, err := g.rtcClient.RtcServiceClient.SignalMessageAssemble(ctx, &req) resp, err := g.rtcClient.RtcServiceClient.SignalMessageAssemble(ctx, &assembleReq)
if err != nil { if err != nil {
log.ZError(ctx, "SendSignalMessage", err, "r", err.Error())
return nil, err return nil, err
} }
c, err := proto.Marshal(resp) if resp == nil || resp.SignalResp == nil {
return nil, errs.WrapMsg(errs.ErrInternalServer.WrapMsg("empty signal response"), "SendSignalMessage")
}
c, err := proto.Marshal(resp.SignalResp)
if err != nil { if err != nil {
return nil, errs.WrapMsg(err, "SendSignalMessage: error marshaling response", "action", "marshal", "dataType", "SignalMessageAssembleResp") log.ZError(ctx, "SendSignalMessage", err, "r", err.Error())
return nil, errs.WrapMsg(err, "SendSignalMessage: error marshaling response", "action", "marshal", "dataType", "SignalResp")
} }
return c, nil return c, nil
} }

View File

@ -47,6 +47,7 @@ func (s *rtcServer) SignalMessageAssemble(ctx context.Context, req *rtc.SignalMe
) )
switch payload := req.SignalReq.Payload.(type) { switch payload := req.SignalReq.Payload.(type) {
case *rtc.SignalReq_Invite: case *rtc.SignalReq_Invite:
log.ZDebug(ctx, "SignalMessageAssemble", "handleInvite", "payload", payload)
r, err := s.handleInvite(ctx, payload.Invite, req.SignalReq) r, err := s.handleInvite(ctx, payload.Invite, req.SignalReq)
resp.Payload = &rtc.SignalResp_Invite{Invite: r} resp.Payload = &rtc.SignalResp_Invite{Invite: r}
respErr = err respErr = err
@ -75,9 +76,11 @@ func (s *rtcServer) SignalMessageAssemble(ctx context.Context, req *rtc.SignalMe
resp.Payload = &rtc.SignalResp_GetTokenByRoomID{GetTokenByRoomID: r} resp.Payload = &rtc.SignalResp_GetTokenByRoomID{GetTokenByRoomID: r}
respErr = err respErr = err
default: default:
log.ZError(ctx, "SignalMessageAssemble", respErr, "r", respErr.Error())
return nil, errs.ErrArgs.WrapMsg("unknown signal payload type") return nil, errs.ErrArgs.WrapMsg("unknown signal payload type")
} }
if respErr != nil { if respErr != nil {
log.ZError(ctx, "SignalMessageAssemble", respErr, "r", respErr.Error())
return nil, respErr return nil, respErr
} }
return &rtc.SignalMessageAssembleResp{SignalResp: &resp}, nil return &rtc.SignalMessageAssembleResp{SignalResp: &resp}, nil
@ -87,6 +90,7 @@ func (s *rtcServer) SignalMessageAssemble(ctx context.Context, req *rtc.SignalMe
func (s *rtcServer) handleInvite(ctx context.Context, req *rtc.SignalInviteReq, signalReq *rtc.SignalReq) (*rtc.SignalInviteResp, error) { func (s *rtcServer) handleInvite(ctx context.Context, req *rtc.SignalInviteReq, signalReq *rtc.SignalReq) (*rtc.SignalInviteResp, error) {
inv := req.Invitation inv := req.Invitation
if inv == nil { if inv == nil {
log.ZError(ctx, "handleInvite", errs.ErrArgs, "r", "invitation is nil")
return nil, errs.ErrArgs.WrapMsg("invitation is nil") return nil, errs.ErrArgs.WrapMsg("invitation is nil")
} }
if inv.RoomID == "" { if inv.RoomID == "" {
@ -96,11 +100,13 @@ func (s *rtcServer) handleInvite(ctx context.Context, req *rtc.SignalInviteReq,
inv.InitiateTime = time.Now().UnixMilli() inv.InitiateTime = time.Now().UnixMilli()
if _, err := s.roomClient.CreateRoom(ctx, &livekit.CreateRoomRequest{Name: inv.RoomID}); err != nil { if _, err := s.roomClient.CreateRoom(ctx, &livekit.CreateRoomRequest{Name: inv.RoomID}); err != nil {
log.ZError(ctx, "handleInvite", err, "r", err.Error())
return nil, errs.WrapMsg(err, "LiveKit CreateRoom failed", "roomID", inv.RoomID) return nil, errs.WrapMsg(err, "LiveKit CreateRoom failed", "roomID", inv.RoomID)
} }
token, err := s.genToken(inv.RoomID, req.UserID) token, err := s.genToken(inv.RoomID, req.UserID)
if err != nil { if err != nil {
log.ZError(ctx, "handleInvite", err, "r", err.Error())
return nil, err return nil, err
} }
@ -115,6 +121,7 @@ func (s *rtcServer) handleInvite(ctx context.Context, req *rtc.SignalInviteReq,
} }
} }
log.ZDebug(ctx, "handleInvite", "token", token, "roomID", inv.RoomID, "liveURL", s.config.RpcConfig.LiveKit.ExternalAddress)
return &rtc.SignalInviteResp{ return &rtc.SignalInviteResp{
Token: token, Token: token,
RoomID: inv.RoomID, RoomID: inv.RoomID,