70 lines
1.3 KiB
Go
70 lines
1.3 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
func (id CartId) String() string {
|
|
return strings.Trim(string(id[:]), "\x00")
|
|
}
|
|
|
|
type CartIdPayload struct {
|
|
Id CartId
|
|
Data []byte
|
|
}
|
|
|
|
func MakeCartInnerFrame(id CartId, payload []byte) []byte {
|
|
if payload == nil {
|
|
return id[:]
|
|
}
|
|
return append(id[:], payload...)
|
|
}
|
|
|
|
func GetCartFrame(data []byte) (*CartIdPayload, error) {
|
|
if len(data) < 16 {
|
|
return nil, fmt.Errorf("data too short")
|
|
}
|
|
return &CartIdPayload{
|
|
Id: CartId(data[:16]),
|
|
Data: data[16:],
|
|
}, nil
|
|
}
|
|
|
|
func ToCartId(id string) CartId {
|
|
var result [16]byte
|
|
copy(result[:], []byte(id))
|
|
return result
|
|
}
|
|
|
|
type RemoteGrain struct {
|
|
*Connection
|
|
Id CartId
|
|
Host string
|
|
}
|
|
|
|
func NewRemoteGrain(id CartId, host string) (*RemoteGrain, error) {
|
|
return &RemoteGrain{
|
|
Id: id,
|
|
Host: host,
|
|
Connection: NewConnection(fmt.Sprintf("%s:1337", host)),
|
|
}, nil
|
|
}
|
|
|
|
func (g *RemoteGrain) HandleMessage(message *Message, isReplay bool) (*FrameWithPayload, error) {
|
|
|
|
data, err := GetData(message.Write)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return g.Call(RemoteHandleMutation, MakeCartInnerFrame(g.Id, data))
|
|
}
|
|
|
|
func (g *RemoteGrain) GetId() CartId {
|
|
return g.Id
|
|
}
|
|
|
|
func (g *RemoteGrain) GetCurrentState() (*FrameWithPayload, error) {
|
|
return g.Call(RemoteGetState, MakeCartInnerFrame(g.Id, nil))
|
|
}
|