You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

93 lines
2.6 KiB
Go

package services
import (
"embed"
"fmt"
"movie-sync-server/conf"
"movie-sync-server/entities"
"movie-sync-server/services/room"
"movie-sync-server/utils"
"github.com/gin-gonic/gin"
"github.com/sirupsen/logrus"
"github.com/zishang520/socket.io/v2/socket"
)
func Wrapper(event string, client *socket.Socket, handler func(client *socket.Socket, cliMsg *entities.ClientMessage) []byte) func(...any) {
return func(datas ...any) {
logrus.Infof("recive a client event: [%s], datas: %+v", event, datas)
d, ok := datas[0].(map[string]any)
if !ok || d == nil {
logrus.Errorf("invalid data type: %+v", fmt.Sprintf("%T", datas[0]))
return
}
clientMsg := &entities.ClientMessage{}
if err := utils.MapToStructViaJSON(d, clientMsg); err != nil {
logrus.WithError(err).Errorf("invalid data type: %+v", datas)
return
}
r := handler(client, clientMsg)
if len(r) > 0 {
client.Emit(event)
}
}
}
func EventHandler() {
server := entities.GetServer()
server.On("connection", func(clients ...any) {
client := clients[0].(*socket.Socket)
// 请求房间状态
client.On("getRoomInfo", Wrapper("getRoomInfo", client, room.GetInfoEndpoint))
//初次连接时,发送初始化信息
client.On("init", Wrapper("init", client, room.InitEndpoint))
//连接后必须加入房间
client.On("join", Wrapper("join", client, room.JoinEndpoint))
// 用户发送当前播放时间变化
client.On("updateUserState", Wrapper("updateUserState", client, room.UpdateUserStateEndpoint))
// 房管设置房间的视频地址
client.On("setUrl", Wrapper("setUrl", client, room.SetUrlEndpoint))
// 房管发送播放、暂停、设置时间等指令
client.On("play", Wrapper("play", client, room.PlayEndpoint))
client.On("pause", Wrapper("pause", client, room.PauseEndpoint))
client.On("setTime", Wrapper("setTime", client, room.SetTimeEndpoint))
// 用户断开
client.On("disconnect", func(a ...any) {
logrus.Infof("client disconnected: %s", client.Id())
room.DisconnectEndpoint(client)
})
// if client.Recovered() {
// // 尝试恢复连接状态
// room.JoinRecovered(client)
// }
})
}
func RouterHandler(fs embed.FS) {
server := entities.GetServer()
router := entities.GetRouter()
router.Use(utils.CORSMiddleware())
HandleStaticFile(fs, router)
router.GET("/socket.io/*any", gin.WrapH(server.ServeHandler(nil)))
router.POST("/socket.io/*any", gin.WrapH(server.ServeHandler(nil)))
}
func Run() {
router := entities.GetRouter()
if err := router.Run(fmt.Sprintf(":%s", conf.ServerSetting.Port)); err != nil {
logrus.Fatal("failed run app: ", err)
}
defer entities.GetServer().Close(func(err error) {
logrus.Fatal(err)
})
}