Documentation
¶
Index ¶
- Constants
- type Cloud
- type CloudFlags
- type Compression
- type Connection
- func (c *Connection) Demonitor(by etf.Pid, process etf.Pid, ref etf.Ref) error
- func (c *Connection) DemonitorReg(by etf.Pid, process gen.ProcessID, ref etf.Ref) error
- func (c *Connection) Link(local gen.Process, remote etf.Pid) error
- func (c *Connection) LinkExit(local etf.Pid, remote etf.Pid, reason string) error
- func (c *Connection) Monitor(local gen.Process, remote etf.Pid, ref etf.Ref) error
- func (c *Connection) MonitorExit(to etf.Pid, terminated etf.Pid, reason string, ref etf.Ref) error
- func (c *Connection) MonitorExitReg(process gen.Process, reason string, ref etf.Ref) error
- func (c *Connection) MonitorReg(local gen.Process, remote gen.ProcessID, ref etf.Ref) error
- func (c *Connection) ProxyConnectReply(reply ProxyConnectReply) error
- func (c *Connection) ProxyConnectRequest(connect ProxyConnectRequest) error
- func (c *Connection) ProxyDisconnect(disconnect ProxyDisconnect) error
- func (c *Connection) ProxyPacket(packet *lib.Buffer) error
- func (c *Connection) ProxyRegisterSession(session ProxySession) error
- func (c *Connection) ProxyUnregisterSession(id string) error
- func (c *Connection) Send(from gen.Process, to etf.Pid, message etf.Term) error
- func (c *Connection) SendAlias(from gen.Process, to etf.Alias, message etf.Term) error
- func (c *Connection) SendReg(from gen.Process, to gen.ProcessID, message etf.Term) error
- func (c *Connection) SpawnReply(to etf.Pid, ref etf.Ref, pid etf.Pid) error
- func (c *Connection) SpawnReplyError(to etf.Pid, ref etf.Ref, err error) error
- func (c *Connection) SpawnRequest(nodeName string, behaviorName string, request gen.RemoteSpawnRequest, ...) error
- func (c *Connection) Stats() NetworkStats
- func (c *Connection) Unlink(local gen.Process, remote etf.Pid) error
- type ConnectionInterface
- type CoreRouter
- type CustomProtoOptions
- type Flags
- type Handshake
- type HandshakeCustomDetails
- type HandshakeDetails
- type HandshakeInterface
- type HandshakeVersion
- type Listener
- type MessageEventNetwork
- type NetworkStats
- type Node
- type NodeStats
- type Options
- type Proto
- type ProtoInterface
- type ProtoOptions
- type Proxy
- type ProxyConnectCancel
- type ProxyConnectReply
- type ProxyConnectRequest
- type ProxyDisconnect
- type ProxyFlags
- type ProxyRoute
- type ProxySession
- type ProxyTransit
- type RegisterOptions
- type Registrar
- type RegistrarConfig
- type Route
- type RouteOptions
- type System
- type Version
Constants ¶
const ( DefaultProcessMailboxSize int = 100 DefaultProcessDirectboxSize int = 10 EnvKeyVersion gen.EnvKey = "ergo:Version" EnvKeyNode gen.EnvKey = "ergo:Node" EnvKeyRemoteSpawn gen.EnvKey = "ergo:RemoteSpawn" DefaultProtoRecvQueueLength int = 100 DefaultProtoSendQueueLength int = 100 DefaultProtoFragmentationUnit int = 65000 DefaultCompressionLevel int = -1 DefaultCompressionThreshold int = 1024 DefaultProxyMaxHop int = 8 EventNetwork gen.Event = "network" )
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type CloudFlags ¶
type CloudFlags struct {
Enable bool
EnableIntrospection bool
EnableMetrics bool
EnableRemoteSpawn bool
}
CloudFlags
type Compression ¶
type Compression struct {
// Enable enables compression for all outgoing messages having size
// greater than the defined threshold.
Enable bool
// Level defines compression level. Value must be in range 1..9 or -1 for the default level
Level int
// Threshold defines the minimal message size for the compression.
// Messages less of this threshold will not be compressed.
Threshold int
}
type Connection ¶
type Connection struct {
ConnectionInterface
}
Connection
func (*Connection) DemonitorReg ¶
func (*Connection) MonitorExit ¶
func (*Connection) MonitorExitReg ¶
func (*Connection) MonitorReg ¶
func (*Connection) ProxyConnectReply ¶
func (c *Connection) ProxyConnectReply(reply ProxyConnectReply) error
func (*Connection) ProxyConnectRequest ¶
func (c *Connection) ProxyConnectRequest(connect ProxyConnectRequest) error
func (*Connection) ProxyDisconnect ¶
func (c *Connection) ProxyDisconnect(disconnect ProxyDisconnect) error
func (*Connection) ProxyPacket ¶
func (c *Connection) ProxyPacket(packet *lib.Buffer) error
func (*Connection) ProxyRegisterSession ¶
func (c *Connection) ProxyRegisterSession(session ProxySession) error
func (*Connection) ProxyUnregisterSession ¶
func (c *Connection) ProxyUnregisterSession(id string) error
func (*Connection) SpawnReply ¶
func (*Connection) SpawnReplyError ¶
func (*Connection) SpawnRequest ¶
func (c *Connection) SpawnRequest(nodeName string, behaviorName string, request gen.RemoteSpawnRequest, args ...etf.Term) error
func (*Connection) Stats ¶
func (c *Connection) Stats() NetworkStats
type ConnectionInterface ¶
type ConnectionInterface interface {
Send(from gen.Process, to etf.Pid, message etf.Term) error
SendReg(from gen.Process, to gen.ProcessID, message etf.Term) error
SendAlias(from gen.Process, to etf.Alias, message etf.Term) error
Link(local etf.Pid, remote etf.Pid) error
Unlink(local etf.Pid, remote etf.Pid) error
LinkExit(to etf.Pid, terminated etf.Pid, reason string) error
Monitor(local etf.Pid, remote etf.Pid, ref etf.Ref) error
Demonitor(local etf.Pid, remote etf.Pid, ref etf.Ref) error
MonitorExit(to etf.Pid, terminated etf.Pid, reason string, ref etf.Ref) error
MonitorReg(local etf.Pid, remote gen.ProcessID, ref etf.Ref) error
DemonitorReg(local etf.Pid, remote gen.ProcessID, ref etf.Ref) error
MonitorExitReg(to etf.Pid, terminated gen.ProcessID, reason string, ref etf.Ref) error
SpawnRequest(nodeName string, behaviorName string, request gen.RemoteSpawnRequest, args ...etf.Term) error
SpawnReply(to etf.Pid, ref etf.Ref, spawned etf.Pid) error
SpawnReplyError(to etf.Pid, ref etf.Ref, err error) error
ProxyConnectRequest(connect ProxyConnectRequest) error
ProxyConnectReply(reply ProxyConnectReply) error
ProxyConnectCancel(cancel ProxyConnectCancel) error
ProxyDisconnect(disconnect ProxyDisconnect) error
ProxyRegisterSession(session ProxySession) error
ProxyUnregisterSession(id string) error
ProxyPacket(packet *lib.Buffer) error
Creation() uint32
Stats() NetworkStats
}
ConnectionInterface
type CoreRouter ¶
type CoreRouter interface {
// RouteSend routes message by Pid
RouteSend(from etf.Pid, to etf.Pid, message etf.Term) error
// RouteSendReg routes message by registered process name (gen.ProcessID)
RouteSendReg(from etf.Pid, to gen.ProcessID, message etf.Term) error
// RouteSendAlias routes message by process alias
RouteSendAlias(from etf.Pid, to etf.Alias, message etf.Term) error
RouteSpawnRequest(node string, behaviorName string, request gen.RemoteSpawnRequest, args ...etf.Term) error
RouteSpawnReply(to etf.Pid, ref etf.Ref, result etf.Term) error
// RouteLink makes linking of the given two processes
RouteLink(pidA etf.Pid, pidB etf.Pid) error
// RouteUnlink makes unlinking of the given two processes
RouteUnlink(pidA etf.Pid, pidB etf.Pid) error
// RouteExit routes MessageExit to the linked process
RouteExit(to etf.Pid, terminated etf.Pid, reason string) error
// RouteMonitorReg makes monitor to the given registered process name (gen.ProcessID)
RouteMonitorReg(by etf.Pid, process gen.ProcessID, ref etf.Ref) error
// RouteMonitor makes monitor to the given Pid
RouteMonitor(by etf.Pid, process etf.Pid, ref etf.Ref) error
RouteDemonitor(by etf.Pid, ref etf.Ref) error
RouteMonitorExitReg(terminated gen.ProcessID, reason string, ref etf.Ref) error
RouteMonitorExit(terminated etf.Pid, reason string, ref etf.Ref) error
// RouteNodeDown
RouteNodeDown(name string, disconnect *ProxyDisconnect)
// RouteProxyConnectRequest
RouteProxyConnectRequest(from ConnectionInterface, request ProxyConnectRequest) error
// RouteProxyConnectReply
RouteProxyConnectReply(from ConnectionInterface, reply ProxyConnectReply) error
// RouteProxyConnectCancel
RouteProxyConnectCancel(from ConnectionInterface, cancel ProxyConnectCancel) error
// RouteProxyDisconnect
RouteProxyDisconnect(from ConnectionInterface, disconnect ProxyDisconnect) error
// RouteProxy returns ErrProxySessionEndpoint if this node is the endpoint of the
// proxy session. In this case, the packet must be handled on this node with
// provided ProxySession parameters.
RouteProxy(from ConnectionInterface, sessionID string, packet *lib.Buffer) error
}
CoreRouter routes messages from/to remote node
type CustomProtoOptions ¶
type CustomProtoOptions interface{}
CustomProtoOptions a custom set of proto options
type Flags ¶
type Flags struct {
// Enable enable flags customization
Enable bool
// EnableHeaderAtomCache enables header atom cache feature
EnableHeaderAtomCache bool
// EnableBigCreation
EnableBigCreation bool
// EnableBigPidRef accepts a larger amount of data in pids and references
EnableBigPidRef bool
// EnableFragmentation enables fragmentation feature for the sending data
EnableFragmentation bool
// EnableAlias accepts process aliases
EnableAlias bool
// EnableRemoteSpawn accepts remote spawn request
EnableRemoteSpawn bool
// Compression compression support
EnableCompression bool
// Proxy enables support for incoming proxy connection
EnableProxy bool
}
Flags
type Handshake ¶
type Handshake struct {
HandshakeInterface
}
Handshake template struct for the custom Handshake implementation
func (*Handshake) Accept ¶
func (h *Handshake) Accept(remote net.Addr, conn lib.NetReadWriter, tls bool, cookie string) (HandshakeDetails, error)
func (*Handshake) Start ¶
func (h *Handshake) Start(remote net.Addr, conn lib.NetReadWriter, tls bool, cookie string) (HandshakeDetails, error)
Handshake interface default callbacks
func (*Handshake) Version ¶
func (h *Handshake) Version() HandshakeVersion
type HandshakeCustomDetails ¶
type HandshakeCustomDetails interface{}
type HandshakeDetails ¶
type HandshakeDetails struct {
// Name node name
Name string
// Flags node flags
Flags Flags
// Creation
Creation uint32
// Version
Version int
// NumHandlers defines the number of readers/writers per connection. Default value is provided by ProtoOptions
NumHandlers int
// AtomMapping
AtomMapping *etf.AtomMapping
// ProxyTransit allows to restrict proxy connection requests for this connection
ProxyTransit ProxyTransit
// Buffer keeps data received along with the handshake
Buffer *lib.Buffer
// Custom allows passing the custom data to the ProtoInterface.Start
Custom HandshakeCustomDetails
}
HandshakeDetails
type HandshakeInterface ¶
type HandshakeInterface interface {
// Init initialize handshake.
Init(nodename string, creation uint32, flags Flags) error
// Start initiates handshake process. Argument tls means the connection is wrapped by TLS
// Returns the name of connected peer, Flags and Creation wrapped into HandshakeDetails struct
Start(remote net.Addr, conn lib.NetReadWriter, tls bool, cookie string) (HandshakeDetails, error)
// Accept accepts handshake process initiated by another side of this connection.
// Returns the name of connected peer, Flags and Creation wrapped into HandshakeDetails struct
Accept(remote net.Addr, conn lib.NetReadWriter, tls bool, cookie string) (HandshakeDetails, error)
// Version handshake version. Must be implemented if this handshake is going to be used
// for the accepting connections (this method is used in registration on the Resolver)
Version() HandshakeVersion
}
Handshake defines handshake interface
type HandshakeVersion ¶
type HandshakeVersion int
type Listener ¶
type Listener struct {
// Cookie cookie for the incoming connection to this listener. Leave it empty in
// case of using the node's cookie.
Cookie string
// Hostname defines an interface for the listener. Default: takes from the node name.
Hostname string
// Listen defines a listening port number for accepting incoming connections.
Listen uint16
// ListenBegin and ListenEnd define a range of the port numbers where
// the node looking for available free port number for the listening.
// Default values 15000 and 65000 accordingly
ListenBegin uint16
ListenEnd uint16
// Handshake if its nil the default TLS (Options.TLS) will be using
TLS *tls.Config
// Handshake if its nil the default Handshake (Options.Handshake) will be using
Handshake HandshakeInterface
// Proto if its nil the default Proto (Options.Proto) will be using
Proto ProtoInterface
// Flags defines option flags of this node for the incoming connection
// on this port. If its disabled the default Flags (Options.Flags) will be using
Flags Flags
}
func DefaultListener ¶
func DefaultListener() Listener
type MessageEventNetwork ¶
type NetworkStats ¶
type Node ¶
type Node interface {
gen.Core
// Name returns node name
Name() string
// IsAlive returns true if node is still alive
IsAlive() bool
// Uptime returns node uptime in seconds
Uptime() int64
// Version return node version
Version() Version
// ListEnv returns a map of configured Node environment variables.
ListEnv() map[gen.EnvKey]interface{}
// SetEnv set node environment variable with given name. Use nil value to remove variable with given name. Ignores names with "ergo:" as a prefix.
SetEnv(name gen.EnvKey, value interface{})
// Env returns value associated with given environment name.
Env(name gen.EnvKey) interface{}
// Spawn spawns a new process
Spawn(name string, opts gen.ProcessOptions, object gen.ProcessBehavior, args ...etf.Term) (gen.Process, error)
// RegisterName
RegisterName(name string, pid etf.Pid) error
// UnregisterName
UnregisterName(name string) error
LoadedApplications() []gen.ApplicationInfo
WhichApplications() []gen.ApplicationInfo
ApplicationInfo(name string) (gen.ApplicationInfo, error)
ApplicationLoad(app gen.ApplicationBehavior, args ...etf.Term) (string, error)
ApplicationUnload(appName string) error
ApplicationStart(appName string, args ...etf.Term) (gen.Process, error)
ApplicationStartPermanent(appName string, args ...etf.Term) (gen.Process, error)
ApplicationStartTransient(appName string, args ...etf.Term) (gen.Process, error)
ApplicationStop(appName string) error
ProvideRemoteSpawn(name string, object gen.ProcessBehavior) error
RevokeRemoteSpawn(name string) error
// AddStaticRoute adds static route for the given name
AddStaticRoute(node string, host string, port uint16, options RouteOptions) error
// AddStaticRoutePort adds static route for the given node name which makes node skip resolving port process
AddStaticRoutePort(node string, port uint16, options RouteOptions) error
// AddStaticRouteOptions adds static route options for the given node name which does regular port resolving but applies static options
AddStaticRouteOptions(node string, options RouteOptions) error
// Remove static route removes static route with given name
RemoveStaticRoute(name string) bool
// StaticRoutes returns list of routes added using AddStaticRoute
StaticRoutes() []Route
// StaticRoute returns Route for the given name. Returns false if it doesn't exist.
StaticRoute(name string) (Route, bool)
AddProxyRoute(proxy ProxyRoute) error
RemoveProxyRoute(name string) bool
// ProxyRoutes returns list of proxy routes added using AddProxyRoute
ProxyRoutes() []ProxyRoute
// ProxyRoute returns proxy route added using AddProxyRoute
ProxyRoute(name string) (ProxyRoute, bool)
// Resolve
Resolve(node string) (Route, error)
// ResolveProxy resolves proxy route. Checks for the proxy route added using AddProxyRoute.
// If it wasn't found makes request to the registrar.
ResolveProxy(node string) (ProxyRoute, error)
// Returns Registrar interface
Registrar() Registrar
// Connect sets up a connection to node
Connect(node string) error
// Disconnect close connection to the node
Disconnect(node string) error
// Nodes returns the list of connected nodes
Nodes() []string
// NodesIndirect returns the list of nodes connected via proxies
NodesIndirect() []string
// NetworkStats returns network statistics of the connection with the node. Returns error
// ErrUnknown if connection with given node is not established.
NetworkStats(name string) (NetworkStats, error)
Links(process etf.Pid) []etf.Pid
Monitors(process etf.Pid) []etf.Pid
MonitorsByName(process etf.Pid) []gen.ProcessID
MonitoredBy(process etf.Pid) []etf.Pid
Stats() NodeStats
Stop()
Wait()
WaitWithTimeout(d time.Duration) error
}
type NodeStats ¶
type NodeStats struct {
TotalProcesses uint64
TotalReferences uint64
RunningProcesses uint64
RegisteredNames uint64
RegisteredAliases uint64
MonitorsByPid uint64
MonitorsByName uint64
MonitorsNodes uint64
Links uint64
LoadedApplications uint64
RunningApplications uint64
NetworkConnections uint64
ProxyConnections uint64
TransitConnections uint64
}
type Options ¶
type Options struct {
// Applications application list that must be started
Applications []gen.ApplicationBehavior
// Env node environment
Env map[gen.EnvKey]interface{}
// Creation. Default value: uint32(time.Now().Unix())
Creation uint32
// Listeners node can have multiple listening interface at once. If this list is empty
// the default listener will be using. Only the first listener will be registered on
// the Registrar
Listeners []Listener
// Flags defines option flags of this node for the outgoing connection
Flags Flags
// TLS settings
TLS *tls.Config
// StaticRoutesOnly disables resolving service (default is EPMD client) and
// makes resolving localy only for nodes added using gen.AddStaticRoute
StaticRoutesOnly bool
// Registrar defines a registrar service (default is EPMD service, client and server)
Registrar Registrar
// Compression defines default compression options for the spawning processes.
Compression Compression
// Handshake defines a handshake handler. By default is using
// DIST handshake created with dist.CreateHandshake(...)
Handshake HandshakeInterface
// Proto defines a proto handler. By default is using
// DIST proto created with dist.CreateProto(...)
Proto ProtoInterface
// Cloud enable Ergo Cloud support
Cloud Cloud
// Proxy options
Proxy Proxy
// System options for the system application
System System
}
Options defines bootstrapping options for the node
type Proto ¶
type Proto struct {
ProtoInterface
}
Proto template struct for the custom Proto implementation
type ProtoInterface ¶
type ProtoInterface interface {
// Init initialize connection handler
Init(ctx context.Context, conn lib.NetReadWriter, nodename string, details HandshakeDetails) (ConnectionInterface, error)
// Serve connection
Serve(connection ConnectionInterface, router CoreRouter)
// Terminate invoked once Serve callback is finished
Terminate(connection ConnectionInterface)
}
Proto defines proto interface for the custom Proto implementation
type ProtoOptions ¶
type ProtoOptions struct {
// NumHandlers defines the number of readers/writers per connection. Default is the number of CPU
NumHandlers int
// MaxMessageSize limit the message size. Default 0 (no limit)
MaxMessageSize int
// SendQueueLength defines queue size of handler for the outgoing messages. Default 100.
SendQueueLength int
// RecvQueueLength defines queue size of handler for the incoming messages. Default 100.
RecvQueueLength int
// FragmentationUnit defines unit size for the fragmentation feature. Default 65000
FragmentationUnit int
// Custom brings a custom set of options to the ProtoInterface.Serve handler
Custom CustomProtoOptions
}
ProtoOptions
type Proxy ¶
type Proxy struct {
// Transit allows to use this node as a proxy
Transit bool
// Accept incoming proxy connections
Accept bool
// Cookie sets cookie for incoming connections
Cookie string
// Flags sets options for incoming connections
Flags ProxyFlags
// Routes sets options for outgoing connections
Routes map[string]ProxyRoute
}
type ProxyConnectCancel ¶
ProxyConnectCancel
type ProxyConnectReply ¶
type ProxyConnectReply struct {
ID etf.Ref
To string
Digest []byte // md5(md5(md5(md5(Node)+Cookie)+To)+symmetric key)
Cipher []byte // encrypted symmetric key using PublicKey from the ProxyConnectRequest
Flags ProxyFlags
Creation uint32
SessionID string // proxy session ID
Path []string
}
ProxyConnectReply
type ProxyConnectRequest ¶
type ProxyConnectRequest struct {
ID etf.Ref
To string // To node
Digest []byte // md5(md5(md5(md5(Node)+Cookie)+To)+PublicKey)
PublicKey []byte
Flags ProxyFlags
Creation uint32
Hop int
Path []string
}
ProxyConnectRequest
type ProxyDisconnect ¶
ProxyDisconnect
type ProxyFlags ¶
type ProxyFlags struct {
Enable bool
EnableLink bool
EnableMonitor bool
EnableRemoteSpawn bool
EnableEncryption bool
}
ProxyFlags
func DefaultProxyFlags ¶
func DefaultProxyFlags() ProxyFlags
type ProxyRoute ¶
type ProxyRoute struct {
// Name can be either nodename (example@domain) or domain (@domain)
Name string
Proxy string
Cookie string
Flags ProxyFlags
MaxHop int // DefaultProxyMaxHop == 8
}
ProxyRoute
type ProxySession ¶
type ProxySession struct {
ID string
NodeFlags ProxyFlags
PeerFlags ProxyFlags
Creation uint32
PeerName string
Block cipher.Block // made from symmetric key
}
Proxy session
type RegisterOptions ¶
type RegisterOptions struct {
Port uint16
Creation uint32
NodeVersion Version
HandshakeVersion HandshakeVersion
EnableTLS bool
EnableProxy bool
EnableCompression bool
Proxy string
}
RegisterOptions defines resolving options
type Registrar ¶
type Registrar interface {
Register(ctx context.Context, nodename string, options RegisterOptions) error
RegisterProxy(nodename string, maxhop int, flags ProxyFlags) error
UnregisterProxy(peername string) error
Resolve(peername string) (Route, error)
ResolveProxy(peername string) (ProxyRoute, error)
Config() (RegistrarConfig, error)
ConfigItem(name string) (etf.Term, error)
SetConfigUpdateCallback(func(name string, value etf.Term) error) error
}
Registrar defines registrar interface
type RegistrarConfig ¶
type RouteOptions ¶
type RouteOptions struct {
Cookie string
TLS *tls.Config
IsErgo bool
Handshake HandshakeInterface
Proto ProtoInterface
}
RouteOptions