nano

package module
v0.6.3 Latest Latest
Warning

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

Go to latest
Published: Feb 6, 2025 License: MIT Imports: 44 Imported by: 0

README

nano Build Status Coverage Status GoDoc Docs Go Report Card MIT licensed


Nano is an simple, fast and lightweight game server framework with clustering support and client libraries for iOS, Android, Unity and others through the C SDK. It provides a basic development framework for distributed multiplayer games and server-side applications.

Getting Started

Prerequisites
  • Go >= 1.16
  • etcd (optional, used for service discovery)
  • nats (optional, used for sending and receiving rpc)
  • docker (optional, used for running etcd and nats dependencies on containers)
Installing

clone the repo

git clone https://github.com/nut-game/nano.git

setup nano dependencies

make setup
Hacking nano

Here's one example of running nano:

Start etcd (This command requires docker-compose and will run an etcd container locally. An etcd may be run without docker if preferred.)

cd ./examples/testing && docker compose up -d etcd

run the connector frontend server from cluster_grpc example

make run-cluster-grpc-example-connector

run the room backend server from the cluster_grpc example

make run-cluster-grpc-example-room

Now there should be 2 nano servers running, a frontend connector and a backend room. To send requests, use a REPL client for nano pitaya-cli.

$ nano-cli
Nano REPL Client
>>> connect localhost:3250
connected!
>>> request room.room.entry
>>> sv-> {"code":0,"result":"ok"}

Running the tests

make test

This command will run both unit and e2e tests.

Authors

  • TFG Co - Initial work

License

MIT License

Acknowledgements

  • nano authors for building the framework pitaya is based on.
  • pomelo authors for the inspiration on the distributed design and protocol

Security

If you have found a security vulnerability, please email security@tfgco.com

Resources

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func AddGRPCInfoToMetadata added in v0.6.1

func AddGRPCInfoToMetadata(
	metadata map[string]string,
	region string,
	host, port string,
	externalHost, externalPort string,
) map[string]string

AddGRPCInfoToMetadata adds host, external host and port into metadata

func AddMetricTagsToPropagateCtx added in v0.6.1

func AddMetricTagsToPropagateCtx(
	ctx context.Context,
	tags map[string]string,
) context.Context

AddMetricTagsToPropagateCtx adds a key and metric tags that will be propagated through RPC calls. Use the same tags that are at 'nano.metrics.additionalLabels' config

func AddRoute added in v0.6.1

func AddRoute(serverType string, routingFunction router.RoutingFunc) error

func AddToPropagateCtx added in v0.6.1

func AddToPropagateCtx(ctx context.Context, key string, val interface{}) context.Context

AddToPropagateCtx adds a key and value that will be propagated through RPC calls

func Configure added in v0.6.1

func Configure(
	isFrontend bool,
	serverType string,
	serverMode ServerMode,
	serverMetadata map[string]string,
	cfgs ...*viper.Viper,
)

Configure configures the app

func CreatePrometheusReporter added in v0.6.1

func CreatePrometheusReporter(serverType string, config config.MetricsConfig, customSpecs models.CustomMetricsSpec) (*metrics.PrometheusReporter, error)

CreatePrometheusReporter create a Prometheus reporter instance

func CreateStatsdReporter added in v0.6.1

func CreateStatsdReporter(serverType string, config config.MetricsConfig) (*metrics.StatsdReporter, error)

CreateStatsdReporter create a Statsd reporter instance

func Descriptor added in v0.6.1

func Descriptor(protoName string) ([]byte, error)

Descriptor returns the protobuf message descriptor for a given message name

func Documentation added in v0.6.1

func Documentation(getPtrNames bool) (map[string]interface{}, error)

func Error added in v0.6.1

func Error(err error, code string, metadata ...map[string]string) *errors.Error

Error creates a new error with a code, message and metadata

func ExtractSpan added in v0.6.1

func ExtractSpan(ctx context.Context) (trace.SpanContext, error)

ExtractSpan retrieves an OpenTelemetry span context from the given context The span context can be received directly or via an RPC call

func GetDefaultLoggerFromCtx added in v0.6.1

func GetDefaultLoggerFromCtx(ctx context.Context) logging.Logger

GetDefaultLoggerFromCtx returns the default logger from the given context

func GetDieChan added in v0.6.1

func GetDieChan() chan bool

func GetFromPropagateCtx added in v0.6.1

func GetFromPropagateCtx(ctx context.Context, key string) interface{}

GetFromPropagateCtx adds a key and value that came through RPC calls

func GetMetricsReporters added in v0.6.1

func GetMetricsReporters() []metrics.Reporter

func GetModule added in v0.6.1

func GetModule(name string) (interfaces.Module, error)

func GetNumberOfConnectedClients added in v0.6.1

func GetNumberOfConnectedClients() int64

func GetServer added in v0.6.1

func GetServer() *cluster.Server

func GetServerByID added in v0.6.1

func GetServerByID(id string) (*cluster.Server, error)

func GetServerID added in v0.6.1

func GetServerID() string

func GetServers added in v0.6.1

func GetServers() []*cluster.Server

func GetServersByType added in v0.6.1

func GetServersByType(t string) (map[string]*cluster.Server, error)

func GetSessionFromCtx added in v0.6.1

func GetSessionFromCtx(ctx context.Context) session.Session

func GroupAddMember added in v0.6.1

func GroupAddMember(ctx context.Context, groupName, uid string) error

func GroupBroadcast added in v0.6.1

func GroupBroadcast(ctx context.Context, frontendType, groupName, route string, v interface{}) error

func GroupContainsMember added in v0.6.1

func GroupContainsMember(ctx context.Context, groupName, uid string) (bool, error)

func GroupCountMembers added in v0.6.1

func GroupCountMembers(ctx context.Context, groupName string) (int, error)

func GroupCreate added in v0.6.1

func GroupCreate(ctx context.Context, groupName string) error

func GroupCreateWithTTL added in v0.6.1

func GroupCreateWithTTL(ctx context.Context, groupName string, ttlTime time.Duration) error

func GroupDelete added in v0.6.1

func GroupDelete(ctx context.Context, groupName string) error

func GroupMembers added in v0.6.1

func GroupMembers(ctx context.Context, groupName string) ([]string, error)

func GroupRemoveAll added in v0.6.1

func GroupRemoveAll(ctx context.Context, groupName string) error

func GroupRemoveMember added in v0.6.1

func GroupRemoveMember(ctx context.Context, groupName, uid string) error

func GroupRenewTTL added in v0.6.1

func GroupRenewTTL(ctx context.Context, groupName string) error

func IsRunning added in v0.6.1

func IsRunning() bool

func NewAfterTimer added in v0.6.1

func NewAfterTimer(duration time.Duration, fn timer.Func) *timer.Timer

NewAfterTimer returns a new Timer containing a function that will be called after duration that specified by the duration argument. The duration d must be greater than zero; if not, NewAfterTimer will panic. Stop the timer to release associated resources.

func NewCondTimer added in v0.6.1

func NewCondTimer(condition timer.Condition, fn timer.Func) (*timer.Timer, error)

NewCondTimer returns a new Timer containing a function that will be called when condition satisfied that specified by the condition argument. The duration d must be greater than zero; if not, NewCondTimer will panic. Stop the timer to release associated resources.

func NewCountTimer added in v0.6.1

func NewCountTimer(interval time.Duration, count int, fn timer.Func) *timer.Timer

NewCountTimer returns a new Timer containing a function that will be called with a period specified by the duration argument. After count times, timer will be stopped automatically, It adjusts the intervals for slow receivers. The duration d must be greater than zero; if not, NewCountTimer will panic. Stop the timer to release associated resources.

func NewTimer added in v0.6.1

func NewTimer(interval time.Duration, fn timer.Func) *timer.Timer

NewTimer returns a new Timer containing a function that will be called with a period specified by the duration argument. It adjusts the intervals for slow receivers. The duration d must be greater than zero; if not, NewTimer will panic. Stop the timer to release associated resources.

func RPC added in v0.6.1

func RPC(ctx context.Context, routeStr string, reply proto.Message, arg proto.Message) error

func RPCTo added in v0.6.1

func RPCTo(ctx context.Context, serverID, routeStr string, reply proto.Message, arg proto.Message) error

func Register added in v0.6.1

func Register(c component.Component, options ...component.Option)

func RegisterModule added in v0.6.1

func RegisterModule(module interfaces.Module, name string) error

func RegisterModuleAfter added in v0.6.1

func RegisterModuleAfter(module interfaces.Module, name string) error

func RegisterModuleBefore added in v0.6.1

func RegisterModuleBefore(module interfaces.Module, name string) error

func RegisterRPCJob added in v0.6.1

func RegisterRPCJob(rpcJob worker.RPCJob) error

func RegisterRemote added in v0.6.1

func RegisterRemote(c component.Component, options ...component.Option)

func ReliableRPC added in v0.6.1

func ReliableRPC(routeStr string, metadata map[string]interface{}, reply, arg proto.Message) (jid string, err error)

func ReliableRPCWithOptions added in v0.6.1

func ReliableRPCWithOptions(routeStr string, metadata map[string]interface{}, reply, arg proto.Message, opts *config.EnqueueOpts) (jid string, err error)

func SendKickToUsers added in v0.6.1

func SendKickToUsers(uids []string, frontendType string) ([]string, error)

func SendPushToUsers added in v0.6.1

func SendPushToUsers(route string, v interface{}, uids []string, frontendType string) ([]string, error)

func SetDebug added in v0.6.1

func SetDebug(debug bool)

func SetDictionary added in v0.6.1

func SetDictionary(dict map[string]uint16) error

func SetHeartbeatTime added in v0.6.1

func SetHeartbeatTime(interval time.Duration)

func SetLogger added in v0.6.1

func SetLogger(l logging.Logger)

SetLogger logger setter

func SetTimerBacklog added in v0.6.1

func SetTimerBacklog(c int)

SetTimerBacklog set the timer created/closing channel backlog, A small backlog may cause the logic to be blocked when call NewTimer/NewCountTimer/timer.Stop in main logic gorontine.

func SetTimerPrecision added in v0.6.1

func SetTimerPrecision(precision time.Duration)

SetTimerPrecision set the ticker precision, and time precision can not less than a Millisecond, and can not change after application running. The default precision is time.Second

func Shutdown

func Shutdown()

func Start added in v0.6.1

func Start()

func StartWorker added in v0.6.1

func StartWorker()

Types

type App added in v0.6.1

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

App is the base app struct

func NewApp added in v0.6.1

func NewApp(
	serverMode ServerMode,
	serializer serialize.Serializer,
	acceptors []acceptor.Acceptor,
	dieChan chan bool,
	router *router.Router,
	server *cluster.Server,
	rpcClient cluster.RPCClient,
	rpcServer cluster.RPCServer,
	worker *worker.Worker,
	serviceDiscovery cluster.ServiceDiscovery,
	remoteService *service.RemoteService,
	handlerService *service.HandlerService,
	groups groups.GroupService,
	sessionPool session.SessionPool,
	metricsReporters []metrics.Reporter,
	config config.NanoConfig,
) *App

NewApp is the base constructor for a nano app instance

func (*App) AddRoute added in v0.6.1

func (app *App) AddRoute(
	serverType string,
	routingFunction router.RoutingFunc,
) error

AddRoute adds a routing function to a server type

func (*App) Documentation added in v0.6.1

func (app *App) Documentation(getPtrNames bool) (map[string]interface{}, error)

Documentation returns handler and remotes documentacion

func (*App) GetDieChan added in v0.6.1

func (app *App) GetDieChan() chan bool

GetDieChan gets the channel that the app sinalizes when its going to die

func (*App) GetMetricsReporters added in v0.6.1

func (app *App) GetMetricsReporters() []metrics.Reporter

GetMetricsReporters gets registered metrics reporters

func (*App) GetModule added in v0.6.1

func (app *App) GetModule(name string) (interfaces.Module, error)

GetModule gets a module with a name

func (*App) GetNumberOfConnectedClients added in v0.6.1

func (app *App) GetNumberOfConnectedClients() int64

GetNumberOfConnectedClients returns the number of connected clients

func (*App) GetServer added in v0.6.1

func (app *App) GetServer() *cluster.Server

GetServer gets the local server instance

func (*App) GetServerByID added in v0.6.1

func (app *App) GetServerByID(id string) (*cluster.Server, error)

GetServerByID returns the server with the specified id

func (*App) GetServerID added in v0.6.1

func (app *App) GetServerID() string

GetServerID returns the generated server id

func (*App) GetServers added in v0.6.1

func (app *App) GetServers() []*cluster.Server

GetServers get all servers

func (*App) GetServersByType added in v0.6.1

func (app *App) GetServersByType(t string) (map[string]*cluster.Server, error)

GetServersByType get all servers of type

func (*App) GetSessionFromCtx added in v0.6.1

func (app *App) GetSessionFromCtx(ctx context.Context) session.Session

GetSessionFromCtx retrieves a session from a given context

func (*App) GroupAddMember added in v0.6.1

func (app *App) GroupAddMember(ctx context.Context, groupName, uid string) error

GroupAddMember adds UID to group

func (*App) GroupBroadcast added in v0.6.1

func (app *App) GroupBroadcast(ctx context.Context, frontendType, groupName, route string, v interface{}) error

GroupBroadcast pushes the message to all members inside group

func (*App) GroupContainsMember added in v0.6.1

func (app *App) GroupContainsMember(ctx context.Context, groupName, uid string) (bool, error)

GroupContainsMember checks whether an UID is contained in group or not

func (*App) GroupCountMembers added in v0.6.1

func (app *App) GroupCountMembers(ctx context.Context, groupName string) (int, error)

GroupCountMembers get current member amount in group

func (*App) GroupCreate added in v0.6.1

func (app *App) GroupCreate(ctx context.Context, groupName string) error

GroupCreate creates a group

func (*App) GroupCreateWithTTL added in v0.6.1

func (app *App) GroupCreateWithTTL(ctx context.Context, groupName string, ttlTime time.Duration) error

GroupCreateWithTTL creates a group with given TTL

func (*App) GroupDelete added in v0.6.1

func (app *App) GroupDelete(ctx context.Context, groupName string) error

GroupDelete deletes whole group, including UIDs and base group

func (*App) GroupMembers added in v0.6.1

func (app *App) GroupMembers(ctx context.Context, groupName string) ([]string, error)

GroupMembers returns all member's UIDs

func (*App) GroupRemoveAll added in v0.6.1

func (app *App) GroupRemoveAll(ctx context.Context, groupName string) error

GroupRemoveAll clears all UIDs

func (*App) GroupRemoveMember added in v0.6.1

func (app *App) GroupRemoveMember(ctx context.Context, groupName, uid string) error

GroupRemoveMember removes specified UID from group

func (*App) GroupRenewTTL added in v0.6.1

func (app *App) GroupRenewTTL(ctx context.Context, groupName string) error

GroupRenewTTL renews group with the initial TTL

func (*App) IsRunning added in v0.6.1

func (app *App) IsRunning() bool

IsRunning indicates if the nano app has been initialized. Note: This doesn't cover acceptors, only the nano internal registration and modules initialization.

func (*App) RPC added in v0.6.1

func (app *App) RPC(ctx context.Context, routeStr string, reply proto.Message, arg proto.Message) error

RPC calls a method in a different server

func (*App) RPCTo added in v0.6.1

func (app *App) RPCTo(ctx context.Context, serverID, routeStr string, reply proto.Message, arg proto.Message) error

RPCTo send a rpc to a specific server

func (*App) Register added in v0.6.1

func (app *App) Register(c component.Component, options ...component.Option)

Register register a component with options

func (*App) RegisterModule added in v0.6.1

func (app *App) RegisterModule(module interfaces.Module, name string) error

RegisterModule registers a module, by default it register after registered modules

func (*App) RegisterModuleAfter added in v0.6.1

func (app *App) RegisterModuleAfter(module interfaces.Module, name string) error

RegisterModuleAfter registers a module after all registered modules

func (*App) RegisterModuleBefore added in v0.6.1

func (app *App) RegisterModuleBefore(module interfaces.Module, name string) error

RegisterModuleBefore registers a module before all registered modules

func (*App) RegisterRPCJob added in v0.6.1

func (app *App) RegisterRPCJob(rpcJob worker.RPCJob) error

RegisterRPCJob registers rpc job to execute jobs with retries

func (*App) RegisterRemote added in v0.6.1

func (app *App) RegisterRemote(c component.Component, options ...component.Option)

RegisterRemote register a remote component with options

func (*App) ReliableRPC added in v0.6.1

func (app *App) ReliableRPC(
	routeStr string,
	metadata map[string]interface{},
	reply, arg proto.Message,
) (jid string, err error)

ReliableRPC enqueues RPC to worker so it's executed asynchronously Default enqueue options are used

func (*App) ReliableRPCWithOptions added in v0.6.1

func (app *App) ReliableRPCWithOptions(
	routeStr string,
	metadata map[string]interface{},
	reply, arg proto.Message,
	opts *config.EnqueueOpts,
) (jid string, err error)

ReliableRPCWithOptions enqueues RPC to worker Receive worker options for this specific RPC

func (*App) SendKickToUsers added in v0.6.1

func (app *App) SendKickToUsers(uids []string, frontendType string) ([]string, error)

SendKickToUsers sends kick to an user array

func (*App) SendPushToUsers added in v0.6.1

func (app *App) SendPushToUsers(route string, v interface{}, uids []string, frontendType string) ([]string, error)

SendPushToUsers sends a message to the given list of users

func (*App) SetDebug added in v0.6.1

func (app *App) SetDebug(debug bool)

SetDebug toggles debug on/off

func (*App) SetDictionary added in v0.6.1

func (app *App) SetDictionary(dict map[string]uint16) error

SetDictionary sets routes map

func (*App) SetHeartbeatTime added in v0.6.1

func (app *App) SetHeartbeatTime(interval time.Duration)

SetHeartbeatTime sets the heartbeat time

func (*App) Shutdown added in v0.6.1

func (app *App) Shutdown()

Shutdown send a signal to let 'nano' shutdown itself.

func (*App) Start added in v0.6.1

func (app *App) Start()

Start starts the app

func (*App) StartWorker added in v0.6.1

func (app *App) StartWorker()

StartWorker configures, starts and returns nano worker

type Builder added in v0.6.1

type Builder struct {
	Config           config.NanoConfig
	DieChan          chan bool
	PacketDecoder    codec.PacketDecoder
	PacketEncoder    codec.PacketEncoder
	MessageEncoder   *message.MessagesEncoder
	Serializer       serialize.Serializer
	Router           *router.Router
	RPCClient        cluster.RPCClient
	RPCServer        cluster.RPCServer
	MetricsReporters []metrics.Reporter
	Server           *cluster.Server
	ServerMode       ServerMode
	ServiceDiscovery cluster.ServiceDiscovery
	Groups           groups.GroupService
	SessionPool      session.SessionPool
	Worker           *worker.Worker
	RemoteHooks      *pipeline.RemoteHooks
	HandlerHooks     *pipeline.HandlerHooks
	// contains filtered or unexported fields
}

Builder holds dependency instances for a nano App

func NewBuilder added in v0.6.1

func NewBuilder(isFrontend bool,
	serverType string,
	serverMode ServerMode,
	serverMetadata map[string]string,
	config config.NanoConfig,
) *Builder

NewBuilder return a builder instance with default dependency instances for a nano App, with configs explicitly defined

func NewBuilderWithConfigs added in v0.6.1

func NewBuilderWithConfigs(
	isFrontend bool,
	serverType string,
	serverMode ServerMode,
	serverMetadata map[string]string,
	conf *config.Config,
) *Builder

NewBuilderWithConfigs return a builder instance with default dependency instances for a nano App with configs defined by a config file (config.Config) and default paths (see documentation).

func NewDefaultBuilder added in v0.6.1

func NewDefaultBuilder(isFrontend bool, serverType string, serverMode ServerMode, serverMetadata map[string]string, nanoConfig config.NanoConfig) *Builder

NewDefaultBuilder return a builder instance with default dependency instances for a nano App, with default configs

func (*Builder) AddAcceptor added in v0.6.1

func (builder *Builder) AddAcceptor(ac acceptor.Acceptor)

AddAcceptor adds a new acceptor to app

func (*Builder) AddPostBuildHook added in v0.6.1

func (builder *Builder) AddPostBuildHook(hook func(app Nano))

AddPostBuildHook adds a post-build hook to the builder, a function receiving a Nano instance as parameter.

func (*Builder) Build added in v0.6.1

func (builder *Builder) Build() Nano

Build returns a valid App instance

type Nano added in v0.6.1

type Nano interface {
	GetDieChan() chan bool
	SetDebug(debug bool)
	SetHeartbeatTime(interval time.Duration)
	GetServerID() string
	GetMetricsReporters() []metrics.Reporter
	GetServer() *cluster.Server
	GetServerByID(id string) (*cluster.Server, error)
	GetServersByType(t string) (map[string]*cluster.Server, error)
	GetServers() []*cluster.Server
	GetSessionFromCtx(ctx context.Context) session.Session
	Start()
	SetDictionary(dict map[string]uint16) error
	AddRoute(serverType string, routingFunction router.RoutingFunc) error
	Shutdown()
	StartWorker()
	RegisterRPCJob(rpcJob worker.RPCJob) error
	Documentation(getPtrNames bool) (map[string]interface{}, error)
	IsRunning() bool

	RPC(ctx context.Context, routeStr string, reply proto.Message, arg proto.Message) error
	RPCTo(ctx context.Context, serverID, routeStr string, reply proto.Message, arg proto.Message) error
	ReliableRPC(
		routeStr string,
		metadata map[string]interface{},
		reply, arg proto.Message,
	) (jid string, err error)
	ReliableRPCWithOptions(
		routeStr string,
		metadata map[string]interface{},
		reply, arg proto.Message,
		opts *config.EnqueueOpts,
	) (jid string, err error)

	SendPushToUsers(route string, v interface{}, uids []string, frontendType string) ([]string, error)
	SendKickToUsers(uids []string, frontendType string) ([]string, error)

	GroupCreate(ctx context.Context, groupName string) error
	GroupCreateWithTTL(ctx context.Context, groupName string, ttlTime time.Duration) error
	GroupMembers(ctx context.Context, groupName string) ([]string, error)
	GroupBroadcast(ctx context.Context, frontendType, groupName, route string, v interface{}) error
	GroupContainsMember(ctx context.Context, groupName, uid string) (bool, error)
	GroupAddMember(ctx context.Context, groupName, uid string) error
	GroupRemoveMember(ctx context.Context, groupName, uid string) error
	GroupRemoveAll(ctx context.Context, groupName string) error
	GroupCountMembers(ctx context.Context, groupName string) (int, error)
	GroupRenewTTL(ctx context.Context, groupName string) error
	GroupDelete(ctx context.Context, groupName string) error

	Register(c component.Component, options ...component.Option)
	RegisterRemote(c component.Component, options ...component.Option)

	RegisterModule(module interfaces.Module, name string) error
	RegisterModuleAfter(module interfaces.Module, name string) error
	RegisterModuleBefore(module interfaces.Module, name string) error
	GetModule(name string) (interfaces.Module, error)

	GetNumberOfConnectedClients() int64
}

Nano App interface

var DefaultApp Nano

func NewDefaultApp added in v0.6.1

func NewDefaultApp(isFrontend bool, serverType string, serverMode ServerMode, serverMetadata map[string]string, config config.NanoConfig) Nano

NewDefaultApp returns a default nano app instance

type NanoBuilder added in v0.6.1

type NanoBuilder interface {
	// AddPostBuildHook adds a post-build hook to the builder, a function receiving a Nano instance as parameter.
	AddPostBuildHook(hook func(app Nano))
	Build() Nano
}

NanoBuilder Builder interface

type ServerMode added in v0.6.1

type ServerMode byte

ServerMode represents a server mode

const (

	// Cluster represents a server running with connection to other servers
	Cluster ServerMode
	// Standalone represents a server running without connection to other servers
	Standalone
)

Directories

Path Synopsis
mocks
Package mocks is a generated GoMock package.
Package mocks is a generated GoMock package.
mocks
Package mock_cluster is a generated GoMock package.
Package mock_cluster is a generated GoMock package.
conn
codec/mocks
Package mocks is a generated GoMock package.
Package mocks is a generated GoMock package.
message/mocks
Package mocks is a generated GoMock package.
Package mocks is a generated GoMock package.
examples
mocks
Package mocks is a generated GoMock package.
Package mocks is a generated GoMock package.
mocks
Package mocks is a generated GoMock package.
Package mocks is a generated GoMock package.
Package mocks is a generated GoMock package.
Package mocks is a generated GoMock package.
mocks
Package mocks is a generated GoMock package.
Package mocks is a generated GoMock package.
mocks
Package mock_protos is a generated GoMock package.
Package mock_protos is a generated GoMock package.
mocks
Package mocks is a generated GoMock package.
Package mocks is a generated GoMock package.
mocks
Package mocks is a generated GoMock package.
Package mocks is a generated GoMock package.
mocks
Package mocks is a generated GoMock package.
Package mocks is a generated GoMock package.

Jump to

Keyboard shortcuts

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