controller

package
v0.0.0-...-b90c408 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 7, 2019 License: AGPL-3.0 Imports: 19 Imported by: 0

Documentation

Overview

Package controller provides an API available to workers to write games. It also provides the internal API for starting games and watching.

Index

Constants

View Source
const MaxTicks = 100

MaxTicks is the maximum amount of ticks that can be returned.

Variables

View Source
var (
	// ErrNotFound is thrown when a game is not found.
	ErrNotFound = status.Error(codes.NotFound, "controller: game not found")
	// ErrIsLocked is returned when a game is locked.
	ErrIsLocked = status.Error(codes.ResourceExhausted, "controller: game is locked")
	// ErrInvalidSequence is returned when a game tick is written with an
	// invalid sequence.
	ErrInvalidSequence = status.Error(codes.ResourceExhausted, "controller: invalid game tick sequence")
)
View Source
var LockExpiry = 5 * time.Second

LockExpiry is the time after which a lock will expire.

Functions

This section is empty.

Types

type Server

type Server struct {
	Store Store
	// contains filtered or unexported fields
}

Server is a grpc server for pb.ControllerServer.

func New

func New(store Store) *Server

New will initialize a new Server.

func (*Server) AddGameFrame

func (s *Server) AddGameFrame(ctx context.Context, req *pb.AddGameFrameRequest) (*pb.AddGameFrameResponse, error)

AddGameFrame adds a new game frame to the game. A lock must be held for this call to succeed.

func (*Server) Create

func (s *Server) Create(ctx context.Context, req *pb.CreateRequest) (*pb.CreateResponse, error)

Create creates a new game, but doesn't start running frames.

func (*Server) DialAddress

func (s *Server) DialAddress() string

DialAddress will return a localhost address to reach the server. This is useful if the server will select it's own port.

func (*Server) EndGame

func (s *Server) EndGame(ctx context.Context, req *pb.EndGameRequest) (*pb.EndGameResponse, error)

EndGame sets the game status to complete. A lock must be held for this call to succeed.

func (*Server) ListGameFrames

func (s *Server) ListGameFrames(ctx context.Context, req *pb.ListGameFramesRequest) (*pb.ListGameFramesResponse, error)

ListGameFrames will list all game frames given a limit and offset.

func (*Server) Ping

func (s *Server) Ping(ctx context.Context, req *pb.PingRequest) (*pb.PingResponse, error)

Ping returns the health and current version of the server.

func (*Server) Pop

func (s *Server) Pop(ctx context.Context, _ *pb.PopRequest) (*pb.PopResponse, error)

Pop should pop a game that is unlocked and unfinished from the queue, lock the game and return it to the worker to begin processing. This call will be polled by the workers.

func (*Server) Serve

func (s *Server) Serve(listen string) error

Serve will instantiate a grpc server.

func (*Server) Start

func (s *Server) Start(ctx context.Context, req *pb.StartRequest) (*pb.StartResponse, error)

Start starts the game running, and will make it ready to be picked up by a worker.

func (*Server) Status

func (s *Server) Status(ctx context.Context, req *pb.StatusRequest) (*pb.StatusResponse, error)

Status retrieves the game state including the last processed game frame.

func (*Server) ValidateSnake

func (s *Server) ValidateSnake(ctx context.Context, req *pb.ValidateSnakeRequest) (*pb.ValidateSnakeResponse, error)

ValidateSnake takes a snake URL and sends requests to validate a snakes validity.

func (*Server) Wait

func (s *Server) Wait()

Wait will wait until the server has started.

type Store

type Store interface {
	// Lock will lock a specific game, returning a token that must be used to
	// write frames to the game.
	Lock(ctx context.Context, key, token string) (string, error)
	// Unlock will unlock a game if it is locked and the token used to lock it
	// is correct.
	Unlock(ctx context.Context, key, token string) error
	// PopGameID returns a new game that is unlocked and running. Workers call
	// this method through the controller to find games to process.
	PopGameID(context.Context) (string, error)
	// SetGameStatus is used to set a specific game status. This operation
	// should be atomic.
	SetGameStatus(c context.Context, id string, status rules.GameStatus) error
	// CreateGame will insert a game with the default game frames.
	CreateGame(context.Context, *pb.Game, []*pb.GameFrame) error
	// PushGameFrame will push a game frame onto the list of frames.
	PushGameFrame(c context.Context, id string, t *pb.GameFrame) error
	// ListGameFrames will list frames by an offset and limit, it supports
	// negative offset.
	ListGameFrames(c context.Context, id string, limit, offset int) ([]*pb.GameFrame, error)
	// GetGame will fetch the game.
	GetGame(context.Context, string) (*pb.Game, error)
}

Store is the interface to the game store. It implements locking for workers that are processing games and implements logic for distributing games to specific workers that need it.

func InMemStore

func InMemStore() Store

InMemStore returns an in memory implementation of the Store interface.

func InstrumentStore

func InstrumentStore(s Store) Store

InstrumentStore wraps all store methods to instrument the underlying calls.

Directories

Path Synopsis
Package pb is a generated protocol buffer package.
Package pb is a generated protocol buffer package.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL