forked from hyperledger-archives/burrow
-
Notifications
You must be signed in to change notification settings - Fork 0
/
core.go
123 lines (107 loc) · 4.43 KB
/
core.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// Copyright 2015, 2016 Eris Industries (UK) Ltd.
// This file is part of Eris-RT
// Eris-RT is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Eris-RT is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Eris-RT. If not, see <http://www.gnu.org/licenses/>.
package core
import (
"fmt"
// TODO: [ben] swap out go-events with eris-db/event (currently unused)
events "github.com/tendermint/go-events"
log "github.com/eris-ltd/eris-logger"
config "github.com/eris-ltd/eris-db/config"
consensus "github.com/eris-ltd/eris-db/consensus"
definitions "github.com/eris-ltd/eris-db/definitions"
event "github.com/eris-ltd/eris-db/event"
manager "github.com/eris-ltd/eris-db/manager"
// rpc_v0 is carried over from Eris-DBv0.11 and before on port 1337
rpc_v0 "github.com/eris-ltd/eris-db/rpc/v0"
// rpc_tendermint is carried over from Eris-DBv0.11 and before on port 46657
rpc_tendermint "github.com/eris-ltd/eris-db/rpc/tendermint/core"
server "github.com/eris-ltd/eris-db/server"
)
// Core is the high-level structure
type Core struct {
chainId string
evsw *events.EventSwitch
pipe definitions.Pipe
tendermintPipe definitions.TendermintPipe
}
func NewCore(chainId string, consensusConfig *config.ModuleConfig,
managerConfig *config.ModuleConfig) (*Core, error) {
// start new event switch, TODO: [ben] replace with eris-db/event
evsw := events.NewEventSwitch()
evsw.Start()
// start a new application pipe that will load an application manager
pipe, err := manager.NewApplicationPipe(managerConfig, evsw,
consensusConfig.Version)
if err != nil {
return nil, fmt.Errorf("Failed to load application pipe: %v", err)
}
log.Debug("Loaded pipe with application manager")
// pass the consensus engine into the pipe
if e := consensus.LoadConsensusEngineInPipe(consensusConfig, pipe); e != nil {
return nil, fmt.Errorf("Failed to load consensus engine in pipe: %v", e)
}
tendermintPipe, err := pipe.GetTendermintPipe()
if err != nil {
log.Warn(fmt.Sprintf("Tendermint gateway not supported by %s",
managerConfig.Version))
return &Core{
chainId: chainId,
evsw: evsw,
pipe: pipe,
tendermintPipe: nil,
}, nil
}
return &Core{
chainId: chainId,
evsw: evsw,
pipe: pipe,
tendermintPipe: tendermintPipe,
}, nil
}
//------------------------------------------------------------------------------
// Explicit switch that can later be abstracted into an `Engine` definition
// where the Engine defines the explicit interaction of a specific application
// manager with a consensus engine.
// TODO: [ben] before such Engine abstraction,
// think about many-manager-to-one-consensus
//------------------------------------------------------------------------------
// Server functions
// NOTE: [ben] in phase 0 we exactly take over the full server architecture
// from Eris-DB and Tendermint; This is a draft and will be overhauled.
func (core *Core) NewGatewayV0(config *server.ServerConfig) (*server.ServeProcess,
error) {
codec := &rpc_v0.TCodec{}
eventSubscriptions := event.NewEventSubscriptions(core.pipe.Events())
// The services.
tmwss := rpc_v0.NewErisDbWsService(codec, core.pipe)
tmjs := rpc_v0.NewErisDbJsonService(codec, core.pipe, eventSubscriptions)
// The servers.
jsonServer := rpc_v0.NewJsonRpcServer(tmjs)
restServer := rpc_v0.NewRestServer(codec, core.pipe, eventSubscriptions)
wsServer := server.NewWebSocketServer(config.WebSocket.MaxWebSocketSessions,
tmwss)
// Create a server process.
proc, err := server.NewServeProcess(config, jsonServer, restServer, wsServer)
if err != nil {
return nil, fmt.Errorf("Failed to load gateway: %v", err)
}
return proc, nil
}
func (core *Core) NewGatewayTendermint(config *server.ServerConfig) (
*rpc_tendermint.TendermintWebsocketServer, error) {
if core.tendermintPipe == nil {
return nil, fmt.Errorf("No Tendermint pipe has been initialised for Tendermint gateway.")
}
return rpc_tendermint.NewTendermintWebsocketServer(config,
core.tendermintPipe, core.evsw)
}