github.com/arieschain/arieschain@v0.0.0-20191023063405-37c074544356/rpc/endpoints.go (about)

     1  package rpc
     2  
     3  import (
     4  	"net"
     5  
     6  	"github.com/quickchainproject/quickchain/log"
     7  )
     8  
     9  // StartHTTPEndpoint starts the HTTP RPC endpoint, configured with cors/vhosts/modules
    10  func StartHTTPEndpoint(endpoint string, apis []API, modules []string, cors []string, vhosts []string) (net.Listener, *Server, error) {
    11  	// Generate the whitelist based on the allowed modules
    12  	whitelist := make(map[string]bool)
    13  	for _, module := range modules {
    14  		whitelist[module] = true
    15  	}
    16  	// Register all the APIs exposed by the services
    17  	handler := NewServer()
    18  	for _, api := range apis {
    19  		if whitelist[api.Namespace] || (len(whitelist) == 0 && api.Public) {
    20  			if err := handler.RegisterName(api.Namespace, api.Service); err != nil {
    21  				return nil, nil, err
    22  			}
    23  			log.Debug("HTTP registered", "namespace", api.Namespace)
    24  		}
    25  	}
    26  	// All APIs registered, start the HTTP listener
    27  	var (
    28  		listener net.Listener
    29  		err      error
    30  	)
    31  	if listener, err = net.Listen("tcp", endpoint); err != nil {
    32  		return nil, nil, err
    33  	}
    34  	go NewHTTPServer(cors, vhosts, handler).Serve(listener)
    35  	return listener, handler, err
    36  }
    37  
    38  // StartWSEndpoint starts a websocket endpoint
    39  func StartWSEndpoint(endpoint string, apis []API, modules []string, wsOrigins []string, exposeAll bool) (net.Listener, *Server, error) {
    40  
    41  	// Generate the whitelist based on the allowed modules
    42  	whitelist := make(map[string]bool)
    43  	for _, module := range modules {
    44  		whitelist[module] = true
    45  	}
    46  	// Register all the APIs exposed by the services
    47  	handler := NewServer()
    48  	for _, api := range apis {
    49  		if exposeAll || whitelist[api.Namespace] || (len(whitelist) == 0 && api.Public) {
    50  			if err := handler.RegisterName(api.Namespace, api.Service); err != nil {
    51  				return nil, nil, err
    52  			}
    53  			log.Debug("WebSocket registered", "service", api.Service, "namespace", api.Namespace)
    54  		}
    55  	}
    56  	// All APIs registered, start the HTTP listener
    57  	var (
    58  		listener net.Listener
    59  		err      error
    60  	)
    61  	if listener, err = net.Listen("tcp", endpoint); err != nil {
    62  		return nil, nil, err
    63  	}
    64  	go NewWSServer(wsOrigins, handler).Serve(listener)
    65  	return listener, handler, err
    66  
    67  }
    68  
    69  // StartIPCEndpoint starts an IPC endpoint.
    70  func StartIPCEndpoint(ipcEndpoint string, apis []API) (net.Listener, *Server, error) {
    71  	// Register all the APIs exposed by the services.
    72  	handler := NewServer()
    73  	for _, api := range apis {
    74  		if err := handler.RegisterName(api.Namespace, api.Service); err != nil {
    75  			return nil, nil, err
    76  		}
    77  		log.Debug("IPC registered", "namespace", api.Namespace)
    78  	}
    79  	// All APIs registered, start the IPC listener.
    80  	listener, err := ipcListen(ipcEndpoint)
    81  	if err != nil {
    82  		return nil, nil, err
    83  	}
    84  	go handler.ServeListener(listener)
    85  	return listener, handler, nil
    86  }