kv

package module
v7.2.4 Latest Latest
Warning

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

Go to latest
Published: Jan 31, 2022 License: ISC Imports: 19 Imported by: 1

README

Kilovolt

Websocket-based Key-value store, can use many databases on the backend. Has a slim set of features (get/set/pub/sub), mostly what's needed for strimertul and stulbe

Drivers

To use kilovolt, you will need a database driver.

Official drivers exist for the current databases:

Database Driver module
BadgerDB strimertul/kv-badgerdb
Pebble strimertul/kv-pebble

If you have built a driver, feel free to submit a pull request to have it added to this README!

Clients

We maintain a few libraries to interact with Kilovolt at strimertul/kilovolt-clients.

If you don't find one that suits you, just write one yourself, I promise it's really simple! See PROTOCOL.md for all you'll need to implement to make it work.

License

Most of the code here is based on Gorilla Websocket's chat example, which is licensed under BSD-2-Clause (see LICENSE-gorilla).

The entire project is licensed under ISC (see LICENSE).

Documentation

Index

Constants

View Source
const (
	CmdProtoVersion      = "version"
	CmdReadKey           = "kget"
	CmdReadBulk          = "kget-bulk"
	CmdReadPrefix        = "kget-all"
	CmdWriteKey          = "kset"
	CmdWriteBulk         = "kset-bulk"
	CmdSubscribeKey      = "ksub"
	CmdSubscribePrefix   = "ksub-prefix"
	CmdUnsubscribeKey    = "kunsub"
	CmdUnsubscribePrefix = "kunsub-prefix"
	CmdListKeys          = "klist"
	CmdAuthRequest       = "klogin"
	CmdAuthChallenge     = "kauth"
)

Commands

View Source
const (
	ErrServerError  = "server error"
	ErrInvalidFmt   = "invalid message format"
	ErrMissingParam = "required parameter missing"
	ErrUnknownCmd   = "unknown command"
	ErrAuthNotInit  = "authentication not initialized"
	ErrAuthFailed   = "authentication failed"
	ErrAuthRequired = "authentication required"
)
View Source
const ProtoVersion = "v7"

Variables

View Source
var (
	ErrClientNotFound = errors.New("client not found")
)
View Source
var (
	ErrorKeyNotFound = errors.New("key not found")
)

Functions

func MakeBackend added in v7.1.0

func MakeBackend() *mapkv

func ServeWs

func ServeWs(hub *Hub, w http.ResponseWriter, r *http.Request)

ServeWs is the legacy handler for WS

Types

type Client

type Client interface {
	Options() ClientOptions
	Close()

	SendMessage([]byte)
	SendJSON(interface{})

	SetUID(int64)
	UID() int64
}

Client is a middleman between the websocket connection and the hub.

type ClientOptions

type ClientOptions struct {
	// Adds a prefix to all key operations to restrict them to a namespace
	Namespace string
}

ClientOptions is a list of tweakable options for clients

type Driver added in v7.1.0

type Driver interface {
	Get(key string) (string, error)
	GetBulk(keys []string) (map[string]string, error)
	GetPrefix(prefix string) (map[string]string, error)
	Set(key string, value string) error
	SetBulk(kv map[string]string) error
	Delete(key string) error
	List(prefix string) ([]string, error)
}

type ErrCode

type ErrCode string

type Error

type Error struct {
	Ok        bool    `json:"ok"`
	Error     ErrCode `json:"error"`
	Details   string  `json:"details"`
	RequestID string  `json:"request_id,omitempty"`
}

type Hello

type Hello struct {
	CmdType string `json:"type"`
	Version string `json:"version"`
}

type Hub

type Hub struct {
	// contains filtered or unexported fields
}

func NewHub

func NewHub(db Driver, options HubOptions, logger *zap.Logger) (*Hub, error)

func (*Hub) AddClient added in v7.2.0

func (hub *Hub) AddClient(client Client)

func (*Hub) Close

func (hub *Hub) Close()

func (*Hub) RemoveClient added in v7.2.0

func (hub *Hub) RemoveClient(client Client)

func (*Hub) Run

func (hub *Hub) Run()

func (*Hub) SendMessage added in v7.2.2

func (hub *Hub) SendMessage(msg Message)

func (*Hub) SetOptions

func (hub *Hub) SetOptions(options HubOptions)

type HubOptions

type HubOptions struct {
	Password string
}

type LocalClient added in v7.2.0

type LocalClient struct {
	Pushes chan Push
	// contains filtered or unexported fields
}

func NewLocalClient added in v7.2.0

func NewLocalClient(options ClientOptions, log *zap.Logger) *LocalClient

func (*LocalClient) Close added in v7.2.0

func (c *LocalClient) Close()

func (*LocalClient) MakeRequest added in v7.2.0

func (c *LocalClient) MakeRequest(cmd string, data map[string]interface{}) (Message, <-chan interface{})

func (*LocalClient) Options added in v7.2.0

func (c *LocalClient) Options() ClientOptions

func (*LocalClient) Run added in v7.2.0

func (m *LocalClient) Run()

func (*LocalClient) SendJSON added in v7.2.0

func (c *LocalClient) SendJSON(data interface{})

func (*LocalClient) SendMessage added in v7.2.0

func (c *LocalClient) SendMessage(data []byte)

func (*LocalClient) SetKeySubCallback added in v7.2.3

func (c *LocalClient) SetKeySubCallback(key string, callback SubscriptionCallback) int64

func (*LocalClient) SetPrefixSubCallback added in v7.2.3

func (c *LocalClient) SetPrefixSubCallback(key string, callback SubscriptionCallback) int64

func (*LocalClient) SetUID added in v7.2.0

func (c *LocalClient) SetUID(uid int64)

func (*LocalClient) UID added in v7.2.0

func (c *LocalClient) UID() int64

func (*LocalClient) UnsetCallback added in v7.2.3

func (c *LocalClient) UnsetCallback(id int64)

func (*LocalClient) Wait added in v7.2.0

func (c *LocalClient) Wait()

type Message added in v7.2.1

type Message struct {
	Client Client
	Data   []byte
}

type Push

type Push struct {
	CmdType  string `json:"type"`
	Key      string `json:"key"`
	NewValue string `json:"new_value"`
}

type Request

type Request struct {
	CmdName   string                 `json:"command"`
	RequestID string                 `json:"request_id,omitempty"`
	Data      map[string]interface{} `json:"data"`
}

type Response

type Response struct {
	CmdType   string      `json:"type"`
	Ok        bool        `json:"ok"`
	RequestID string      `json:"request_id,omitempty"`
	Data      interface{} `json:"data,omitempty"`
}

type SubscriptionCallback added in v7.2.3

type SubscriptionCallback func(key string, value string)

type WebsocketClient

type WebsocketClient struct {
	// contains filtered or unexported fields
}

func (*WebsocketClient) Close

func (c *WebsocketClient) Close()

func (*WebsocketClient) Options

func (c *WebsocketClient) Options() ClientOptions

func (*WebsocketClient) SendJSON

func (c *WebsocketClient) SendJSON(data interface{})

func (*WebsocketClient) SendMessage

func (c *WebsocketClient) SendMessage(data []byte)

func (*WebsocketClient) SetUID

func (c *WebsocketClient) SetUID(uid int64)

func (*WebsocketClient) UID

func (c *WebsocketClient) UID() int64

Jump to

Keyboard shortcuts

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