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
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)
|
|
})
|
|
}
|