github.com/codingfuture/orig-energi3@v0.8.4/cmd/swarm/global-store/global_store.go (about) 1 // Copyright 2019 The Energi Core Authors 2 // Copyright 2018 The go-ethereum Authors 3 // This file is part of Energi Core. 4 // 5 // Energi Core is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // Energi Core is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU General Public License for more details. 14 // 15 // You should have received a copy of the GNU General Public License 16 // along with Energi Core. If not, see <http://www.gnu.org/licenses/>. 17 18 package main 19 20 import ( 21 "net" 22 "net/http" 23 "os" 24 25 "github.com/ethereum/go-ethereum/log" 26 "github.com/ethereum/go-ethereum/rpc" 27 "github.com/ethereum/go-ethereum/swarm/storage/mock" 28 "github.com/ethereum/go-ethereum/swarm/storage/mock/db" 29 "github.com/ethereum/go-ethereum/swarm/storage/mock/mem" 30 cli "gopkg.in/urfave/cli.v1" 31 ) 32 33 // startHTTP starts a global store with HTTP RPC server. 34 // It is used for "http" cli command. 35 func startHTTP(ctx *cli.Context) (err error) { 36 server, cleanup, err := newServer(ctx) 37 if err != nil { 38 return err 39 } 40 defer cleanup() 41 42 listener, err := net.Listen("tcp", ctx.String("addr")) 43 if err != nil { 44 return err 45 } 46 log.Info("http", "address", listener.Addr().String()) 47 48 return http.Serve(listener, server) 49 } 50 51 // startWS starts a global store with WebSocket RPC server. 52 // It is used for "websocket" cli command. 53 func startWS(ctx *cli.Context) (err error) { 54 server, cleanup, err := newServer(ctx) 55 if err != nil { 56 return err 57 } 58 defer cleanup() 59 60 listener, err := net.Listen("tcp", ctx.String("addr")) 61 if err != nil { 62 return err 63 } 64 origins := ctx.StringSlice("origins") 65 log.Info("websocket", "address", listener.Addr().String(), "origins", origins) 66 67 return http.Serve(listener, server.WebsocketHandler(origins)) 68 } 69 70 // newServer creates a global store and returns its RPC server. 71 // Returned cleanup function should be called only if err is nil. 72 func newServer(ctx *cli.Context) (server *rpc.Server, cleanup func(), err error) { 73 log.PrintOrigins(true) 74 log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(ctx.Int("verbosity")), log.StreamHandler(os.Stdout, log.TerminalFormat(false)))) 75 76 cleanup = func() {} 77 var globalStore mock.GlobalStorer 78 dir := ctx.String("dir") 79 if dir != "" { 80 dbStore, err := db.NewGlobalStore(dir) 81 if err != nil { 82 return nil, nil, err 83 } 84 cleanup = func() { 85 dbStore.Close() 86 } 87 globalStore = dbStore 88 log.Info("database global store", "dir", dir) 89 } else { 90 globalStore = mem.NewGlobalStore() 91 log.Info("in-memory global store") 92 } 93 94 server = rpc.NewServer() 95 if err := server.RegisterName("mockStore", globalStore); err != nil { 96 cleanup() 97 return nil, nil, err 98 } 99 100 return server, cleanup, nil 101 }