// startInProc initializes an in-process RPC endpoint. func (n *Node) startInProc(apis []rpc.API) error { // Register all the APIs exposed by the services handler := rpc.NewServer() for _, api := range apis { if err := handler.RegisterName(api.Namespace, api.Service); err != nil { return err } glog.V(logger.Debug).Infof("InProc registered %T under '%s'", api.Service, api.Namespace) } n.inprocHandler = handler return nil }
// startIPC initializes and starts the IPC RPC endpoint. func (n *Node) startIPC(apis []rpc.API) error { // Short circuit if the IPC endpoint isn't being exposed if n.ipcEndpoint == "" { return nil } // Register all the APIs exposed by the services handler := rpc.NewServer() for _, api := range apis { if err := handler.RegisterName(api.Namespace, api.Service); err != nil { return err } glog.V(logger.Debug).Infof("IPC registered %T under '%s'", api.Service, api.Namespace) } // All APIs registered, start the IPC listener var ( listener net.Listener err error ) if listener, err = rpc.CreateIPCListener(n.ipcEndpoint); err != nil { return err } go func() { glog.V(logger.Info).Infof("IPC endpoint opened: %s", n.ipcEndpoint) for { conn, err := listener.Accept() if err != nil { // Terminate if the listener was closed n.lock.RLock() closed := n.ipcListener == nil n.lock.RUnlock() if closed { return } // Not closed, just some error; report and continue glog.V(logger.Error).Infof("IPC accept failed: %v", err) continue } go handler.ServeCodec(rpc.NewJSONCodec(conn), rpc.OptionMethodInvocation|rpc.OptionSubscriptions) } }() // All listeners booted successfully n.ipcListener = listener n.ipcHandler = handler return nil }
// startWS initializes and starts the websocket RPC endpoint. func (n *Node) startWS(endpoint string, apis []rpc.API, modules []string, wsOrigins string) error { // Short circuit if the WS endpoint isn't being exposed if endpoint == "" { return nil } // Generate the whitelist based on the allowed modules whitelist := make(map[string]bool) for _, module := range modules { whitelist[module] = true } // Register all the APIs exposed by the services handler := rpc.NewServer() for _, api := range apis { if whitelist[api.Namespace] || (len(whitelist) == 0 && api.Public) { if err := handler.RegisterName(api.Namespace, api.Service); err != nil { return err } glog.V(logger.Debug).Infof("WebSocket registered %T under '%s'", api.Service, api.Namespace) } } // All APIs registered, start the HTTP listener var ( listener net.Listener err error ) if listener, err = net.Listen("tcp", endpoint); err != nil { return err } go rpc.NewWSServer(wsOrigins, handler).Serve(listener) glog.V(logger.Info).Infof("WebSocket endpoint opened: ws://%s", endpoint) // All listeners booted successfully n.wsEndpoint = endpoint n.wsListener = listener n.wsHandler = handler n.wsOrigins = wsOrigins return nil }