parent
072b410a64
commit
b4b5946352
@ -1,34 +0,0 @@ |
|||||||
package action |
|
||||||
|
|
||||||
import ( |
|
||||||
"go.uber.org/zap/zapcore" |
|
||||||
) |
|
||||||
|
|
||||||
// ClientHello is the action sent by the client when it first establishes the connection.
|
|
||||||
type ClientHello struct { |
|
||||||
// Version is the protocol version the client is running.
|
|
||||||
Version int `json:"version"` |
|
||||||
} |
|
||||||
|
|
||||||
// ClientRefresh is the action sent by the client when it needs the full state re-sent.
|
|
||||||
type ClientRefresh struct { |
|
||||||
} |
|
||||||
|
|
||||||
// IDed contains a pair of ID and Action, as sent by the server.
|
|
||||||
type IDed struct { |
|
||||||
// ID contains the arbitrary ID that was sent by the client, for identifying the action in future messages.
|
|
||||||
ID int `json:"id"` |
|
||||||
// Action contains the action that was actually being sent.
|
|
||||||
Action Syncable `json:"action"` |
|
||||||
} |
|
||||||
|
|
||||||
func (i IDed) MarshalLogObject(encoder zapcore.ObjectEncoder) error { |
|
||||||
encoder.AddInt("id", i.ID) |
|
||||||
return encoder.AddObject("action", i.Action) |
|
||||||
} |
|
||||||
|
|
||||||
// ClientSent is an action sent in order to deliver one or more Syncable actions to the server.
|
|
||||||
type ClientSent struct { |
|
||||||
// Actions contains the actions the client wants to apply, in the order they should be applied.
|
|
||||||
Actions []IDed `json:"nested"` |
|
||||||
} |
|
@ -0,0 +1,93 @@ |
|||||||
|
package websocket |
||||||
|
|
||||||
|
import ( |
||||||
|
"go.uber.org/zap/zapcore" |
||||||
|
"hexmap-server/action" |
||||||
|
) |
||||||
|
|
||||||
|
// ClientMessageType is an enum type for the client's protocol messages.
|
||||||
|
type ClientMessageType string |
||||||
|
|
||||||
|
const ( |
||||||
|
ClientHelloType ClientMessageType = "HELLO" |
||||||
|
ClientRefreshType ClientMessageType = "REFRESH" |
||||||
|
ClientActType ClientMessageType = "ACT" |
||||||
|
ClientGoodbyeType ClientMessageType = GoodbyeType |
||||||
|
) |
||||||
|
|
||||||
|
// ClientMessage s are those sent by the client.
|
||||||
|
type ClientMessage interface { |
||||||
|
zapcore.ObjectMarshaler |
||||||
|
// ClientType gives the type constant that will be sent on or read from the wire.
|
||||||
|
ClientType() ClientMessageType |
||||||
|
} |
||||||
|
|
||||||
|
// ClientHello is the action sent by the client when it first establishes the connection.
|
||||||
|
type ClientHello struct { |
||||||
|
// Version is the protocol version the client is running.
|
||||||
|
Version int `json:"version"` |
||||||
|
} |
||||||
|
|
||||||
|
func (c ClientHello) ClientType() ClientMessageType { |
||||||
|
return ClientHelloType |
||||||
|
} |
||||||
|
|
||||||
|
func (c ClientHello) MarshalLogObject(encoder zapcore.ObjectEncoder) error { |
||||||
|
encoder.AddString("type", string(ClientHelloType)) |
||||||
|
encoder.AddInt("version", c.Version) |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
// ClientRefresh is the action sent by the client when it needs the full state re-sent.
|
||||||
|
type ClientRefresh struct { |
||||||
|
} |
||||||
|
|
||||||
|
func (c ClientRefresh) ClientType() ClientMessageType { |
||||||
|
return ClientRefreshType |
||||||
|
} |
||||||
|
|
||||||
|
func (c ClientRefresh) MarshalLogObject(encoder zapcore.ObjectEncoder) error { |
||||||
|
encoder.AddString("type", string(ClientRefreshType)) |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
// IDed contains a pair of ID and Action, as sent by the client.
|
||||||
|
type IDed struct { |
||||||
|
// ID contains the arbitrary ID that was sent by the client, for identifying the action in future messages.
|
||||||
|
ID int `json:"id"` |
||||||
|
// Action contains the action that was actually being sent.
|
||||||
|
Action action.Syncable `json:"action"` |
||||||
|
} |
||||||
|
|
||||||
|
func (i IDed) MarshalLogObject(encoder zapcore.ObjectEncoder) error { |
||||||
|
encoder.AddInt("id", i.ID) |
||||||
|
return encoder.AddObject("action", i.Action) |
||||||
|
} |
||||||
|
|
||||||
|
type IDPairs []IDed |
||||||
|
|
||||||
|
func (a IDPairs) MarshalLogArray(encoder zapcore.ArrayEncoder) error { |
||||||
|
var finalErr error = nil |
||||||
|
for _, v := range a { |
||||||
|
err := encoder.AppendObject(v) |
||||||
|
if err != nil && finalErr == nil { |
||||||
|
finalErr = err |
||||||
|
} |
||||||
|
} |
||||||
|
return finalErr |
||||||
|
} |
||||||
|
|
||||||
|
// ClientAct is an action sent in order to deliver one or more Syncable actions to the server.
|
||||||
|
type ClientAct struct { |
||||||
|
// Actions contains the actions the client wants to apply, in the order they should be applied.
|
||||||
|
Actions IDPairs `json:"actions"` |
||||||
|
} |
||||||
|
|
||||||
|
func (c ClientAct) ClientType() ClientMessageType { |
||||||
|
return ClientActType |
||||||
|
} |
||||||
|
|
||||||
|
func (c ClientAct) MarshalLogObject(encoder zapcore.ObjectEncoder) error { |
||||||
|
encoder.AddString("type", string(ClientActType)) |
||||||
|
return encoder.AddArray("actions", c.Actions) |
||||||
|
} |
@ -0,0 +1,53 @@ |
|||||||
|
package websocket |
||||||
|
|
||||||
|
import "go.uber.org/zap/zapcore" |
||||||
|
|
||||||
|
// StatusCode is the code used by the WebSocket protocol to signal the other side on close.
|
||||||
|
type StatusCode int16 |
||||||
|
|
||||||
|
const ( |
||||||
|
StatusNormal StatusCode = 1000 |
||||||
|
StatusGoingAway StatusCode = 1001 |
||||||
|
StatusProtocolError StatusCode = 1002 |
||||||
|
StatusTooBig StatusCode = 1009 |
||||||
|
StatusProtocolVersionOutOfDate StatusCode = 4000 |
||||||
|
|
||||||
|
GoodbyeType = "GOODBYE" |
||||||
|
) |
||||||
|
|
||||||
|
// TODO: Noting that there should be three channels in play:
|
||||||
|
// 1) Reader to client: to receive messages from the connection
|
||||||
|
// 2) Client to writer: to send messages on the connection
|
||||||
|
// 3) Writer to reader: indicating that it is about to send a close message, and the reader should wait for one and
|
||||||
|
// time out the connection if it takes too long.
|
||||||
|
|
||||||
|
// SocketClosed is synthesized when a client closes the WebSocket connection, or sent to the write process to write a
|
||||||
|
// WebSocket close message.
|
||||||
|
// Sending a SocketClosed on a channel causes that channel to be closed right after.
|
||||||
|
type SocketClosed struct { |
||||||
|
// Code is the StatusCode given (or which should be given) in the close message.
|
||||||
|
Code StatusCode |
||||||
|
// Text is the reason text given (or which should be given) in the close message. Max 123 characters.
|
||||||
|
Text string |
||||||
|
// Error may be an error that resulted in the closure of the socket.
|
||||||
|
// Will not be written by the writer; only useful when it's returned from the reader.
|
||||||
|
Error error |
||||||
|
} |
||||||
|
|
||||||
|
func (c SocketClosed) MarshalLogObject(encoder zapcore.ObjectEncoder) error { |
||||||
|
encoder.AddString("type", GoodbyeType) |
||||||
|
encoder.AddInt16("code", int16(c.Code)) |
||||||
|
encoder.AddString("text", c.Text) |
||||||
|
if c.Error != nil { |
||||||
|
encoder.AddString("error", c.Error.Error()) |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (c SocketClosed) ClientType() ClientMessageType { |
||||||
|
return ClientGoodbyeType |
||||||
|
} |
||||||
|
|
||||||
|
func (c SocketClosed) ServerType() ServerMessageType { |
||||||
|
return ServerGoodbyeType |
||||||
|
} |
Loading…
Reference in new issue