mirror of
https://github.com/giongto35/cloud-game.git
synced 2026-01-23 18:46:11 +00:00
151 lines
2.8 KiB
Go
151 lines
2.8 KiB
Go
package api
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"fmt"
|
|
|
|
"github.com/giongto35/cloud-game/v3/pkg/network"
|
|
"github.com/goccy/go-json"
|
|
)
|
|
|
|
type (
|
|
Stateful struct {
|
|
Id network.Uid `json:"id"`
|
|
}
|
|
Room struct {
|
|
Rid string `json:"room_id"` // room id
|
|
}
|
|
StatefulRoom struct {
|
|
Stateful
|
|
Room
|
|
}
|
|
PT uint8
|
|
)
|
|
|
|
type (
|
|
RoomInterface interface {
|
|
GetRoom() string
|
|
}
|
|
)
|
|
|
|
func StateRoom(id network.Uid, rid string) StatefulRoom {
|
|
return StatefulRoom{Stateful: Stateful{id}, Room: Room{rid}}
|
|
}
|
|
func (sr StatefulRoom) GetRoom() string { return sr.Rid }
|
|
|
|
// Packet codes:
|
|
//
|
|
// x, 1xx - user codes
|
|
// 2xx - worker codes
|
|
const (
|
|
CheckLatency PT = 3
|
|
InitSession PT = 4
|
|
WebrtcInit PT = 100
|
|
WebrtcOffer PT = 101
|
|
WebrtcAnswer PT = 102
|
|
WebrtcIce PT = 103
|
|
StartGame PT = 104
|
|
ChangePlayer PT = 108
|
|
QuitGame PT = 105
|
|
SaveGame PT = 106
|
|
LoadGame PT = 107
|
|
ToggleMultitap PT = 109
|
|
RecordGame PT = 110
|
|
GetWorkerList PT = 111
|
|
RegisterRoom PT = 201
|
|
CloseRoom PT = 202
|
|
IceCandidate = WebrtcIce
|
|
TerminateSession PT = 204
|
|
)
|
|
|
|
func (p PT) String() string {
|
|
switch p {
|
|
case CheckLatency:
|
|
return "CheckLatency"
|
|
case InitSession:
|
|
return "InitSession"
|
|
case WebrtcInit:
|
|
return "WebrtcInit"
|
|
case WebrtcOffer:
|
|
return "WebrtcOffer"
|
|
case WebrtcAnswer:
|
|
return "WebrtcAnswer"
|
|
case WebrtcIce:
|
|
return "WebrtcIce"
|
|
case StartGame:
|
|
return "StartGame"
|
|
case ChangePlayer:
|
|
return "ChangePlayer"
|
|
case QuitGame:
|
|
return "QuitGame"
|
|
case SaveGame:
|
|
return "SaveGame"
|
|
case LoadGame:
|
|
return "LoadGame"
|
|
case ToggleMultitap:
|
|
return "ToggleMultitap"
|
|
case RecordGame:
|
|
return "RecordGame"
|
|
case GetWorkerList:
|
|
return "GetWorkerList"
|
|
case RegisterRoom:
|
|
return "RegisterRoom"
|
|
case CloseRoom:
|
|
return "CloseRoom"
|
|
case TerminateSession:
|
|
return "TerminateSession"
|
|
default:
|
|
return "Unknown"
|
|
}
|
|
}
|
|
|
|
// Various codes
|
|
const (
|
|
EMPTY = ""
|
|
OK = "ok"
|
|
)
|
|
|
|
var (
|
|
ErrForbidden = fmt.Errorf("forbidden")
|
|
ErrMalformed = fmt.Errorf("malformed")
|
|
)
|
|
|
|
func Unwrap[T any](data []byte) *T {
|
|
out := new(T)
|
|
if err := json.Unmarshal(data, out); err != nil {
|
|
return nil
|
|
}
|
|
return out
|
|
}
|
|
|
|
func UnwrapChecked[T any](bytes []byte, err error) (*T, error) {
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return Unwrap[T](bytes), nil
|
|
}
|
|
|
|
// ToBase64Json encodes data to a URL-encoded Base64+JSON string.
|
|
func ToBase64Json(data any) (string, error) {
|
|
if data == nil {
|
|
return "", nil
|
|
}
|
|
b, err := json.Marshal(data)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return base64.URLEncoding.EncodeToString(b), nil
|
|
}
|
|
|
|
// FromBase64Json decodes data from a URL-encoded Base64+JSON string.
|
|
func FromBase64Json(data string, obj any) error {
|
|
b, err := base64.URLEncoding.DecodeString(data)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = json.Unmarshal(b, obj)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|