archat-server/common/common.go

183 lines
3.0 KiB
Go
Raw Normal View History

package common
2024-03-24 13:09:36 +00:00
import (
"encoding/json"
)
2024-03-24 16:10:02 +00:00
// Constants
2024-03-24 13:09:36 +00:00
const (
2024-04-04 22:56:55 +00:00
EchoReqID = 1
EchoResID = 128 + EchoReqID
ListPeersReqID = 2
ListPeersResID = 128 + ListPeersReqID
AuthReqID = 3
AuthResID = 128 + AuthReqID
StartChatAReqID = 4
StartChatBReqID = 5
StartChatCReqID = 6
StartChatDReqID = 7
2024-03-24 13:09:36 +00:00
)
// Requests & responses subtypes
type PeerInfo struct {
ID int `json:"id"`
Addr string `json:"addr"`
HasNickname bool `json:"hasNickname"`
Nickname string `json:"nickname"`
}
2024-03-24 13:09:36 +00:00
// Requests & responses:
type RFrame struct {
2024-03-24 13:09:36 +00:00
ID int `json:"id"`
Rest json.RawMessage `json:"r"`
2024-03-24 13:09:36 +00:00
}
func (rf RFrame) IsRequest() bool {
return rf.ID <= 128
}
func (rf RFrame) IsResponse() bool {
return rf.ID > 128
}
2024-04-29 00:02:51 +00:00
func (rf RFrame) IsError() bool {
return rf.ID > 256
}
func RequestFrameFrom(req Request) (RFrame, error) {
2024-03-24 13:09:36 +00:00
jsonBytes, err := json.Marshal(req)
if err != nil {
return *new(RFrame), err
2024-03-24 13:09:36 +00:00
}
return RFrame{req.ID(), jsonBytes}, nil
2024-03-24 13:09:36 +00:00
}
func RequestFromFrame[T Request](reqFrame RFrame) (T, error) {
2024-03-24 13:09:36 +00:00
var req T
err := json.Unmarshal(reqFrame.Rest, &req)
if err != nil {
return *new(T), err
}
return req, nil
}
func ResponseFrameFrom(res Response) (RFrame, error) {
2024-03-24 13:09:36 +00:00
jsonBytes, err := json.Marshal(res)
if err != nil {
return *new(RFrame), err
2024-03-24 13:09:36 +00:00
}
return RFrame{res.ID(), jsonBytes}, nil
2024-03-24 13:09:36 +00:00
}
func ResponseFromFrame[T Response](resFrame RFrame) (T, error) {
2024-03-24 13:09:36 +00:00
var res T
err := json.Unmarshal(resFrame.Rest, &res)
if err != nil {
return *new(T), err
}
return res, nil
}
type Request interface {
ID() int
2024-03-24 13:09:36 +00:00
}
type Response Request
type EchoRequest struct {
EchoByte byte `json:"echoByte"`
}
func (EchoRequest) ID() int {
return EchoReqID
2024-03-24 13:09:36 +00:00
}
type EchoResponse struct {
EchoByte byte `json:"echoByte"`
}
func (EchoResponse) ID() int {
return EchoResID
}
2024-03-24 13:09:36 +00:00
type ListPeersRequest struct {
}
func (ListPeersRequest) ID() int {
return ListPeersReqID
}
2024-03-24 13:09:36 +00:00
type ListPeersResponse struct {
PeersInfo []PeerInfo `json:"peers"`
}
func (ListPeersResponse) ID() int {
return ListPeersResID
}
2024-03-24 13:09:36 +00:00
type AuthRequest struct {
Nickname string `json:"nickname"`
Password string `json:"password"`
}
func (AuthRequest) ID() int {
return AuthReqID
}
2024-03-24 13:09:36 +00:00
type AuthResponse struct {
IsSuccess bool
}
func (AuthResponse) ID() int {
return AuthResID
}
2024-04-04 22:56:55 +00:00
2024-04-29 00:02:51 +00:00
// "Stateful" requests like these need to have some information identifying
// what operation they are linked to
// There may be some errors if two requests are sent by one host to the same
// other host... may they?
2024-04-04 22:56:55 +00:00
type StartChatARequest struct {
Nickname string `json:"nickname"`
}
func (StartChatARequest) ID() int {
return StartChatAReqID
}
type StartChatBRequest struct {
Nickname string `json:"nickname"`
}
func (StartChatBRequest) ID() int {
return StartChatBReqID
}
type StartChatCRequest struct {
Nickname string `json:"nickname"`
}
func (StartChatCRequest) ID() int {
return StartChatCReqID
}
type StartChatDRequest struct {
Nickname string `json:"nickname"`
Accept bool `json:"accept"`
}
func (StartChatDRequest) ID() int {
return StartChatDReqID
}