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

93 lines
2.3 KiB
Go

package com
import (
"encoding/json"
"github.com/giongto35/cloud-game/v3/pkg/api"
"github.com/giongto35/cloud-game/v3/pkg/logger"
"github.com/giongto35/cloud-game/v3/pkg/network"
)
type (
In struct {
Id network.Uid `json:"id,omitempty"`
T api.PT `json:"t"`
Payload json.RawMessage `json:"p,omitempty"`
}
Out struct {
Id network.Uid `json:"id,omitempty"`
T api.PT `json:"t"`
Payload any `json:"p,omitempty"`
}
)
var (
EmptyPacket = Out{Payload: ""}
ErrPacket = Out{Payload: "err"}
OkPacket = Out{Payload: "ok"}
)
type (
NetClient interface {
Close()
Id() network.Uid
}
RegionalClient interface {
In(region string) bool
}
)
type SocketClient struct {
NetClient
id network.Uid
wire *Client
Tag string
Log *logger.Logger
}
func New(conn *Client, tag string, id network.Uid, log *logger.Logger) SocketClient {
l := log.Extend(log.With().Str("cid", id.Short()))
dir := "→"
if conn.IsServer() {
dir = "←"
}
l.Debug().Str("c", tag).Str("d", dir).Msg("Connect")
return SocketClient{id: id, wire: conn, Tag: tag, Log: l}
}
func (c *SocketClient) SetId(id network.Uid) { c.id = id }
func (c *SocketClient) OnPacket(fn func(p In) error) {
logFn := func(p In) {
c.Log.Debug().Str("c", c.Tag).Str("d", "←").Msgf("%s", p.T)
if err := fn(p); err != nil {
c.Log.Error().Err(err).Send()
}
}
c.wire.OnPacket(logFn)
}
// Send makes a blocking call.
func (c *SocketClient) Send(t api.PT, data any) ([]byte, error) {
c.Log.Debug().Str("c", c.Tag).Str("d", "→").Msgf("ᵇ%s", t)
return c.wire.Call(t, data)
}
// Notify just sends a message and goes further.
func (c *SocketClient) Notify(t api.PT, data any) {
c.Log.Debug().Str("c", c.Tag).Str("d", "→").Msgf("%s", t)
_ = c.wire.Send(t, data)
}
func (c *SocketClient) Close() {
c.wire.Close()
c.Log.Debug().Str("c", c.Tag).Str("d", "x").Msg("Close")
}
func (c *SocketClient) Id() network.Uid { return c.id }
func (c *SocketClient) Listen() { c.ProcessMessages(); <-c.Done() }
func (c *SocketClient) ProcessMessages() { c.wire.Listen() }
func (c *SocketClient) Route(in In, out Out) { _ = c.wire.Route(in, out) }
func (c *SocketClient) String() string { return c.Tag + ":" + string(c.Id()) }
func (c *SocketClient) Done() chan struct{} { return c.wire.Wait() }