blob: 6a5074b60c22d43eab3159b5cf04ac0469ef4534 [file] [log] [blame]
// Binary signallingserver is a simple implementation of the BoxSignalling
// rendezvous service.
package main
import (
"log"
"strings"
"veyron/examples/boxes"
"veyron/lib/signals"
"veyron2/ipc"
"veyron2/rt"
"veyron2/security"
)
const (
signallingServiceName = "signalling"
signallingServicePort = ":8509"
)
type boxAppEndpoint string
func (b *boxAppEndpoint) Add(_ ipc.ServerContext, Endpoint string) (err error) {
*b = boxAppEndpoint(Endpoint)
log.Printf("Added endpoint %v to signalling service", *b)
return nil
}
func (b *boxAppEndpoint) Get(_ ipc.ServerContext) (Endpoint string, err error) {
log.Printf("Returning endpoints:%v from signalling service", *b)
return string(*b), nil
}
type dispatcher struct {
invoker ipc.Invoker
}
func (d *dispatcher) Lookup(suffix string) (ipc.Invoker, security.Authorizer, error) {
suffix = strings.TrimPrefix(suffix, signallingServiceName)
return d.invoker, nil, nil
}
func main() {
r := rt.Init()
// Create a new server instance.
s, err := r.NewServer()
if err != nil {
log.Fatal("failed NewServer: ", err)
}
var boxApp boxAppEndpoint
srv := boxes.NewServerBoxSignalling(&boxApp)
// Create an endpoint and begin listening.
if endPt, err := s.Listen("tcp", signallingServicePort); err == nil {
log.Printf("SignallingService listening at: %v\n", endPt)
} else {
log.Fatal("failed Listen: ", err)
}
if err := s.Serve("", &dispatcher{ipc.ReflectInvoker(srv)}); err != nil {
log.Fatal("failed Serve:", err)
}
<-signals.ShutdownOnSignals()
}