session

package
v0.0.0-...-c9ce307 Latest Latest
Warning

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

Go to latest
Published: Nov 22, 2022 License: AGPL-3.0 Imports: 20 Imported by: 0

Documentation

Index

Constants

View Source
const (
	MessageTypeSessionConfig    = "config"
	MessageTypeStroke           = "stroke"
	MessageTypeUserHost         = "userhost"
	MessageTypeUserConnected    = "userconn"
	MessageTypeUserSync         = "usersync"
	MessageTypeUserDisconnected = "userdisc"
	MessageTypeUserKick         = "userkick"
	MessageTypePageSync         = "pagesync"
	MessageTypeMouseMove        = "mmove"
)

Message type definitions.

View Source
const (
	QueryKeyUpdate = "update"
)

Variables

View Source
var (
	ErrReadyUser      = errors.New("ready user not found")
	ErrUserConnected  = errors.New("user already connected")
	ErrMaxUserReached = errors.New("maximum number of connected users reached")
)
View Source
var ErrBroadcasterClosed = errors.New("broadcaster: closed")

Functions

func DecodeMsgContent

func DecodeMsgContent(r io.Reader, v any) error

DecodeMsgContent is a shorthand wrapper to directly decode the content of generic API JSON messages.

func NewControlBlock

func NewControlBlock(cfg Config, options ...ControlBlockOption) (*controlBlock, error)

NewControlBlock creates a new Session controlBlock with unique ID.

func UnmarshalMsgContent

func UnmarshalMsgContent(data []byte, v any) error

UnmarshalMsgContent is a shorthand wrapper to directly unmarshal the content of generic API JSON messages.

Types

type Broadcaster

type Broadcaster interface {
	// Bind binds the broadcaster to a session
	Bind(scb Controller) Broadcaster
	// Broadcast returns a channel for messages to be broadcasted
	Broadcast() chan<- Message
	// Send returns a channel for messages to sent to a specific client
	Send() chan<- Message
	// Control returns a channel for close messages to sent to a specific client
	Control() chan<- Message
	// Cache returns a channel for strokes to be stored in the cache
	Cache() chan<- []redis.Stroke
	// Close the broadcaster and cleans up all goroutines
	Close()
}

func NewBroadcaster

func NewBroadcaster(cache redis.Handler) Broadcaster

NewBroadcaster creates a new Broadcaster for a given session

type Config

type Config struct {
	ID     string `json:"id"`
	Host   string `json:"host,omitempty"`
	Secret string `json:"-"`

	config.Session
	Password string `json:"password"`
}

func NewConfig

func NewConfig(sessionCfg config.Session) Config

func (*Config) Update

func (c *Config) Update(incoming *ConfigRequest) error

type ConfigRequest

type ConfigRequest struct {
	MaxUsers opt.Option[int]    `json:"maxUsers,omitempty"`
	ReadOnly opt.Option[bool]   `json:"readOnly,omitempty"`
	Password opt.Option[string] `json:"password,omitempty"`
}

func (*ConfigRequest) Validate

func (c *ConfigRequest) Validate() error

type ContentMouseMove

type ContentMouseMove struct {
	X float64 `json:"x"`
	Y float64 `json:"y"`
}

ContentMouseMove declares mouse move updates.

type ControlBlockOption

type ControlBlockOption = func(scb *controlBlock)

func WithAttachments

func WithAttachments(attachments attachment.Handler) ControlBlockOption

WithAttachments sets the attachment.Handler This functional argument is passed to NewControlBlock.

func WithBroadcaster

func WithBroadcaster(broadcaster Broadcaster) ControlBlockOption

WithBroadcaster sets the Broadcaster This functional argument is passed to NewControlBlock.

func WithCache

func WithCache(cache redis.Handler) ControlBlockOption

WithCache sets the redis.Handler This functional argument is passed to NewControlBlock.

func WithDispatcher

func WithDispatcher(dispatcher Dispatcher) ControlBlockOption

WithDispatcher sets the Dispatcher This functional argument is passed to NewControlBlock.

type Controller

type Controller interface {
	// ID returns the session id
	ID() string
	// Config returns the session config
	Config() Config
	// SetConfig sets the session config
	SetConfig(cfg *ConfigRequest) error

	// GetPageRank returns the current page rank of a session
	GetPageRank(ctx context.Context) ([]string, error)
	// GetPage returns a page from the session
	GetPage(ctx context.Context, pageId string, withStrokes bool) (*Page, error)
	// AddPages adds pages to the session
	AddPages(ctx context.Context, pageRequest PageRequest) error
	// UpdatePages perform an operation on the given pages.
	// Operations include: clear, delete and update meta data
	UpdatePages(ctx context.Context, pageRequest PageRequest, operation string) error
	// GetPageSync returns the page rank and all pages from the session (optionally with all strokes)
	GetPageSync(ctx context.Context, pageIds []string, withStrokes bool) (*PageSync, error)
	// SyncSession synchronizes the session with the given page rank and pages
	SyncSession(ctx context.Context, sync PageSync) error
	// IsValidPage checks if the given page ids are valid pages
	IsValidPage(ctx context.Context, pageID ...string) bool

	// NewUser creates a new ready user for the session
	NewUser(userReq UserRequest) (*User, error)
	// UpdateUser updates a user alias or color
	UpdateUser(user User, userReq UserRequest) error
	// UserCanJoin check if a user can join the session
	UserCanJoin(userID string) error
	// UserConnect connects a ready user to the session
	UserConnect(userID string, conn *gws.Conn) error
	// UserDisconnect disconnects a user from the session
	UserDisconnect(ctx context.Context, userID string)
	// KickUser removes a user from the session
	KickUser(userID string) error
	// GetUsers returns all active users in the session
	GetUsers() map[string]*User

	// Close closes a session
	Close()
	// CloseAfter closes a session after a specified timeout and executes fn
	CloseAfter(t time.Duration, fn func())
	// Receive handles data received in the session
	Receive(ctx context.Context, msg *Message, userID string) error
	// Attachments returns the session's attachment handler
	Attachments() attachment.Handler
	// Broadcaster returns the session's broadcaster
	Broadcaster() Broadcaster
	// NumUsers returns the number of active users in the session
	NumUsers() int
	// Allow checks whether a user is allowed to modify the session
	Allow(userID string) bool
}

type CreateSessionRequest

type CreateSessionRequest struct {
	ConfigRequest *ConfigRequest `json:"config,omitempty"`
}

type CreateSessionResponse

type CreateSessionResponse struct {
	Config Config `json:"config"`
}

type Dispatcher

type Dispatcher interface {
	// GetSCB returns the session control block for given sessionID.
	GetSCB(sessionID string) (Controller, error)
	// Create creates and initializes a new SessionControl struct
	Create(ctx context.Context, cfg Config) (Controller, error)
	// Close removes the SCB from the active session map and closes the session.
	Close(sessionID string) error
	// IsValid checks if session with sessionID exists.
	IsValid(sessionID string) bool
	// NumSessions returns the number of active sessions
	NumSessions() int
	// NumUsers returns the number of active users in the session
	NumUsers() int
}

func NewDispatcher

func NewDispatcher(cache redis.Handler) Dispatcher

type GetConfigResponse

type GetConfigResponse struct {
	Users  map[string]*User `json:"users"`
	Config `json:"config"`
}

type Message

type Message struct {
	Type     string `json:"type"`
	Sender   string `json:"sender,omitempty"`
	Receiver string `json:"-"`
	Content  any    `json:"content,omitempty"`
}

Message declares the generic message envelope of any API JSON encoded message.

func NewMessage

func NewMessage(content any, msgType string, sender ...string) *Message

NewMessage creates a new Message with any JSON encodable content, a message type and an optional sender.

func UnmarshalMessage

func UnmarshalMessage(data []byte) (*Message, error)

UnmarshalMessage parses the JSON-encoded message and stores the result in the Message struct. The content field not parsed.

func (*Message) UnmarshalContent

func (m *Message) UnmarshalContent(v any) error

UnmarshalContent parses the JSON-encoded content of a Message and stores the result in the value pointed to by v.

type Page

type Page struct {
	PageId  string     `json:"pageId"`
	Meta    *PageMeta  `json:"meta"`
	Strokes *[]*Stroke `json:"strokes,omitempty"` //nullable
}

type PageBackground

type PageBackground struct {
	// page background
	Paper    string `json:"paper,omitempty"`
	PageNum  int    `json:"documentPageNum"`
	AttachId string `json:"attachId"`
}

PageStyle declares the style of the page background.

type PageMeta

type PageMeta struct {
	PageSize   PageSize       `json:"size"`
	Background PageBackground `json:"background"`
}

PageMeta declares some page meta data.

type PageRequest

type PageRequest struct {
	PageID  []string                       `json:"pageId"`
	Index   []int                          `json:"index,omitempty"`
	Meta    map[string]*PageMeta           `json:"meta"`
	Strokes *map[string]map[string]*Stroke `json:"strokes,omitempty"`
}

PageRequest declares the message content for page requests.

type PageSize

type PageSize struct {
	Width  float64 `json:"width"`
	Height float64 `json:"height"`
}

type PageSync

type PageSync struct {
	PageRank []string         `json:"pageRank"`
	Pages    map[string]*Page `json:"pages"`
}

type Stroke

type Stroke struct {
	Type      int       `json:"type"`
	ID        string    `json:"id,omitempty"`
	PageID    string    `json:"pageId,omitempty"`
	UserID    string    `json:"userId"`
	X         float64   `json:"x"`
	Y         float64   `json:"y"`
	ScaleX    float64   `json:"scaleX,omitempty"`
	ScaleY    float64   `json:"scaleY,omitempty"`
	Points    []float64 `json:"points,omitempty"`
	Style     Style     `json:"style,omitempty"`
	Textfield Textfield `json:"textfield,omitempty"`
}

Stroke declares the structure of most stoke types.

func (*Stroke) Id

func (s *Stroke) Id() string

Id returns the id of the stroke

func (*Stroke) IsDeleted

func (s *Stroke) IsDeleted() bool

IsDeleted verifies whether stroke is deleted or not

func (*Stroke) PageId

func (s *Stroke) PageId() string

PageId returns the page id of the stroke

func (*Stroke) UserId

func (s *Stroke) UserId() string

UserId returns the userid of the stroke

type Style

type Style struct {
	Color   string  `json:"color"`
	Width   float64 `json:"width"`
	Opacity float64 `json:"opacity"`
}

Style declares the stroke style.

type Textfield

type Textfield struct {
	Text       string  `json:"text"`
	Color      string  `json:"color"`
	HAlign     string  `json:"hAlign"`
	VAlign     string  `json:"vAlign"`
	Font       string  `json:"font"`
	FontWeight float64 `json:"fontWeight"`
	FontSize   float64 `json:"fontSize"`
	LineHeight float64 `json:"lineHeight"`
}

Textfield for editing richtext

type User

type User struct {
	ID    string    `json:"id"`
	Alias string    `json:"alias"`
	Color string    `json:"color"`
	Conn  *gws.Conn `json:"-"`
}

User declares some information about connected users.

type UserRequest

type UserRequest struct {
	Password string `json:"password"`
	User     `json:"user"`
}

Directories

Path Synopsis
Code generated by counterfeiter.
Code generated by counterfeiter.

Jump to

Keyboard shortcuts

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