cloud-game/pkg/api/api.go
Sergey Stepanov cd056ee976
Bump to v3
2023-03-16 23:46:53 +03:00

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
}