ProxyACN and ErrorACN for nicer ACN Management
This commit is contained in:
parent
dbc3d675ec
commit
9169018529
2
acn.go
2
acn.go
|
@ -58,5 +58,7 @@ type ACN interface {
|
||||||
// GetVersion returns a string of what the ACN returns when asked for a version
|
// GetVersion returns a string of what the ACN returns when asked for a version
|
||||||
GetVersion() string
|
GetVersion() string
|
||||||
|
|
||||||
|
Callback() func(int, string)
|
||||||
|
|
||||||
Close()
|
Close()
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
package connectivity
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ErrorACN - a status-callback safe errored ACN. Use this when ACN construction goes wrong
|
||||||
|
// and you need a safe substitute that can later be replaced with a working ACN without impacting calling clients.
|
||||||
|
type ErrorACN struct {
|
||||||
|
statusCallbackCache func(int, string)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e ErrorACN) Callback() func(int, string) {
|
||||||
|
return e.statusCallbackCache
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e ErrorACN) GetBootstrapStatus() (int, string) {
|
||||||
|
return -1, "error initializing tor"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e ErrorACN) WaitTillBootstrapped() {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *ErrorACN) SetStatusCallback(callback func(int, string)) {
|
||||||
|
e.statusCallbackCache = callback
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e ErrorACN) Restart() {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e ErrorACN) Open(hostname string) (net.Conn, string, error) {
|
||||||
|
return nil, "", fmt.Errorf("error initializing tor")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e ErrorACN) Listen(identity PrivateKey, port int) (ListenService, error) {
|
||||||
|
return nil, fmt.Errorf("error initializing tor")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e ErrorACN) GetPID() (int, error) {
|
||||||
|
return -1, fmt.Errorf("error initializing tor")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e ErrorACN) GetVersion() string {
|
||||||
|
return "Error Initializing Tor"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e ErrorACN) Close() {
|
||||||
|
}
|
|
@ -18,6 +18,10 @@ func NewLocalACN() ACN {
|
||||||
return &localProvider{}
|
return &localProvider{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (lp *localProvider) Callback() func(int, string) {
|
||||||
|
return func(int, string) {}
|
||||||
|
}
|
||||||
|
|
||||||
func (ls *localListenService) AddressFull() string {
|
func (ls *localListenService) AddressFull() string {
|
||||||
return ls.l.Addr().String()
|
return ls.l.Addr().String()
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
package connectivity
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ProxyACN because there is rarely a problem that can't be solved by another layer of indirection.
|
||||||
|
// ACN is a core resource that many parts of a system may need access too e.g. all clients and servers need an instance
|
||||||
|
// and a UI may also need status information and a configuration interface.
|
||||||
|
// We want to allow configuration and replacement of an ACN without impacting the API of all downstream systems - introducing
|
||||||
|
// ProxyACN - a wrapper around an ACN that allows safe replacement of a running ACN that is transparent to callers.
|
||||||
|
type ProxyACN struct {
|
||||||
|
acn ACN
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewProxyACN(acn ACN) ProxyACN {
|
||||||
|
return ProxyACN{
|
||||||
|
acn: acn,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReplaceACN closes down the current ACN and replaces it with a new ACN.
|
||||||
|
func (p *ProxyACN) ReplaceACN(acn ACN) {
|
||||||
|
p.acn.Close()
|
||||||
|
acn.SetStatusCallback(p.acn.Callback())
|
||||||
|
p.acn = acn
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *ProxyACN) GetBootstrapStatus() (int, string) {
|
||||||
|
return p.acn.GetBootstrapStatus()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *ProxyACN) WaitTillBootstrapped() {
|
||||||
|
p.acn.WaitTillBootstrapped()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *ProxyACN) SetStatusCallback(callback func(int, string)) {
|
||||||
|
p.acn.SetStatusCallback(callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *ProxyACN) Restart() {
|
||||||
|
p.acn.Restart()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *ProxyACN) Open(hostname string) (net.Conn, string, error) {
|
||||||
|
return p.acn.Open(hostname)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *ProxyACN) Listen(identity PrivateKey, port int) (ListenService, error) {
|
||||||
|
return p.acn.Listen(identity, port)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *ProxyACN) GetPID() (int, error) {
|
||||||
|
return p.acn.GetPID()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *ProxyACN) GetVersion() string {
|
||||||
|
return p.acn.GetVersion()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *ProxyACN) Close() {
|
||||||
|
p.acn.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *ProxyACN) Callback() func(int, string) {
|
||||||
|
return p.acn.Callback()
|
||||||
|
}
|
|
@ -303,6 +303,12 @@ func (tp *torProvider) SetStatusCallback(callback func(int, string)) {
|
||||||
tp.statusCallback = callback
|
tp.statusCallback = callback
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (tp *torProvider) Callback() func(int, string) {
|
||||||
|
tp.lock.Lock()
|
||||||
|
defer tp.lock.Unlock()
|
||||||
|
return tp.statusCallback
|
||||||
|
}
|
||||||
|
|
||||||
func (tp *torProvider) callStatusCallback(prog int, status string) {
|
func (tp *torProvider) callStatusCallback(prog int, status string) {
|
||||||
tp.lock.Lock()
|
tp.lock.Lock()
|
||||||
if tp.statusCallback != nil {
|
if tp.statusCallback != nil {
|
||||||
|
|
Loading…
Reference in New Issue