diff options
author | Péter Szilágyi <peterke@gmail.com> | 2016-02-05 21:08:48 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2016-02-05 22:53:47 +0800 |
commit | 7486904b92449c5955bb682f4ff98752906912b8 (patch) | |
tree | 87d1119581754ba411396c0c698fdab4bd65b253 /rpc | |
parent | a13bc9d7a1bc96fab93ace40045c0f0fea4da836 (diff) | |
download | dexon-7486904b92449c5955bb682f4ff98752906912b8.tar.gz dexon-7486904b92449c5955bb682f4ff98752906912b8.tar.zst dexon-7486904b92449c5955bb682f4ff98752906912b8.zip |
cmd, node, rpc: move websockets into node, break singleton
Diffstat (limited to 'rpc')
-rw-r--r-- | rpc/ipc_windows.go | 6 | ||||
-rw-r--r-- | rpc/websocket.go | 76 |
2 files changed, 17 insertions, 65 deletions
diff --git a/rpc/ipc_windows.go b/rpc/ipc_windows.go index 1d4672ad2..09b01974e 100644 --- a/rpc/ipc_windows.go +++ b/rpc/ipc_windows.go @@ -239,6 +239,9 @@ func Dial(address string) (*PipeConn, error) { for { conn, err := dial(address, nmpwait_wait_forever) if err == nil { + // Ugly hack working around some async connectivity issues + time.Sleep(100 * time.Millisecond) + return conn, nil } if isPipeNotReady(err) { @@ -360,6 +363,9 @@ func Listen(address string) (*PipeListener, error) { if err != nil { return nil, err } + // Ugly hack working around some async connectivity issues + time.Sleep(100 * time.Millisecond) + return &PipeListener{ addr: PipeAddr(address), handle: handle, diff --git a/rpc/websocket.go b/rpc/websocket.go index b5bcbf4f6..548847602 100644 --- a/rpc/websocket.go +++ b/rpc/websocket.go @@ -17,13 +17,11 @@ package rpc import ( - "errors" "fmt" - "net" "net/http" - "sync" - "os" + "strings" + "sync" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" @@ -31,12 +29,6 @@ import ( "gopkg.in/fatih/set.v0" ) -var ( - wsServerMu sync.Mutex - wsRPCServer *Server - wsListener net.Listener -) - // wsReaderWriterCloser reads and write payloads from and to a websocket connection. type wsReaderWriterCloser struct { c *websocket.Conn @@ -57,14 +49,6 @@ func (rw *wsReaderWriterCloser) Close() error { return rw.c.Close() } -// wsHandler accepts a websocket connection and handles incoming RPC requests. -// Will return when the websocket connection is closed, either by the client or -// server. -func wsHandler(conn *websocket.Conn) { - rwc := &wsReaderWriterCloser{conn} - wsRPCServer.ServeCodec(NewJSONCodec(rwc)) -} - // wsHandshakeValidator returns a handler that verifies the origin during the // websocket upgrade process. When a '*' is specified as an allowed origins all // connections are accepted. @@ -103,54 +87,16 @@ func wsHandshakeValidator(allowedOrigins []string) func(*websocket.Config, *http return f } -// StartWS will start a websocket RPC server on the given address and port. -func StartWS(address string, port int, corsdomains []string, apis []API) error { - wsServerMu.Lock() - defer wsServerMu.Unlock() - - if wsRPCServer != nil { - return fmt.Errorf("WS RPC interface already started on %s", wsListener.Addr()) - } - - rpcServer := NewServer() - for _, api := range apis { - if err := rpcServer.RegisterName(api.Namespace, api.Service); err != nil { - return err - } +// NewWSServer creates a new websocket RPC server around an API provider. +func NewWSServer(cors string, handler *Server) *http.Server { + return &http.Server{ + Handler: websocket.Server{ + Handshake: wsHandshakeValidator(strings.Split(cors, ",")), + Handler: func(conn *websocket.Conn) { + handler.ServeCodec(NewJSONCodec(&wsReaderWriterCloser{conn})) + }, + }, } - - listener, err := net.Listen("tcp", fmt.Sprintf("%s:%d", address, port)) - if err != nil { - return err - } - - wsServer := websocket.Server{Handshake: wsHandshakeValidator(corsdomains), Handler: wsHandler} - wsHTTPServer := http.Server{Handler: wsServer} - - go wsHTTPServer.Serve(listener) - - wsListener = listener - wsRPCServer = rpcServer - - return nil -} - -// StopWS stops the running websocket RPC server. -func StopWS() error { - wsServerMu.Lock() - defer wsServerMu.Unlock() - - if wsRPCServer == nil { - return errors.New("HTTP RPC interface not started") - } - - wsListener.Close() - wsRPCServer.Stop() - - wsRPCServer = nil - wsListener = nil - - return nil } // wsClient represents a RPC client that communicates over websockets with a |