mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-17 07:25:10 +00:00
114 lines
3 KiB
Go
114 lines
3 KiB
Go
package main
|
|
|
|
import (
|
|
"net/http"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
|
|
"github.com/hyperledger/fabric-samples/token-sdk/owner/routes"
|
|
"github.com/hyperledger/fabric-samples/token-sdk/owner/service"
|
|
|
|
"github.com/hyperledger-labs/fabric-smart-client/pkg/api"
|
|
"github.com/hyperledger-labs/fabric-smart-client/pkg/node"
|
|
fabric "github.com/hyperledger-labs/fabric-smart-client/platform/fabric/sdk"
|
|
viewregistry "github.com/hyperledger-labs/fabric-smart-client/platform/view"
|
|
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/flogging"
|
|
tokensdk "github.com/hyperledger-labs/fabric-token-sdk/token/sdk"
|
|
)
|
|
|
|
var logger = flogging.MustGetLogger("main")
|
|
|
|
func main() {
|
|
dir := getEnv("CONF_DIR", "./conf/owner1")
|
|
port := getEnv("PORT", "9200")
|
|
|
|
fsc := startFabricSmartClient(dir)
|
|
// Tell the service how to respond to other nodes when they initiate an action
|
|
registry := viewregistry.GetRegistry(fsc)
|
|
succeedOrPanic(registry.RegisterResponder(&service.AcceptCashView{}, "github.com/hyperledger/fabric-samples/token-sdk/issuer/service/IssueCashView"))
|
|
succeedOrPanic(registry.RegisterResponder(&service.AcceptCashView{}, &service.TransferView{}))
|
|
|
|
controller := routes.Controller{Service: service.TokenService{FSC: fsc}}
|
|
err := routes.StartWebServer(port, controller, logger)
|
|
if err != nil {
|
|
if err == http.ErrServerClosed {
|
|
logger.Infof("Webserver closing, exiting...", err.Error())
|
|
fsc.Stop()
|
|
} else {
|
|
logger.Fatalf("echo error - %s", err.Error())
|
|
fsc.Stop()
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
}
|
|
|
|
type Node interface {
|
|
api.ServiceProvider
|
|
Stop()
|
|
}
|
|
|
|
func startFabricSmartClient(confDir string) Node {
|
|
logger.Infof("Initializing Fabric Smart Client and Token SDK...")
|
|
fsc := node.NewFromConfPath(confDir)
|
|
succeedOrPanic(fsc.InstallSDK(fabric.NewSDK(fsc)))
|
|
succeedOrPanic(fsc.InstallSDK(tokensdk.NewSDK(fsc)))
|
|
succeedOrPanic(fsc.Start())
|
|
|
|
// Stop gracefully
|
|
go handleSignals((map[os.Signal]func(){
|
|
syscall.SIGINT: func() {
|
|
logger.Info("Stopping FSC node...")
|
|
fsc.Stop()
|
|
os.Exit(130)
|
|
},
|
|
syscall.SIGTERM: func() {
|
|
logger.Info("Stopping FSC node...")
|
|
fsc.Stop()
|
|
os.Exit(143)
|
|
},
|
|
syscall.SIGSTOP: func() {
|
|
logger.Info("Stopping FSC node...")
|
|
fsc.Stop()
|
|
os.Exit(145)
|
|
},
|
|
syscall.SIGHUP: func() {
|
|
logger.Info("Stopping FSC node...")
|
|
fsc.Stop()
|
|
os.Exit(129)
|
|
},
|
|
}))
|
|
logger.Infof("FSC node is ready!")
|
|
|
|
return fsc
|
|
}
|
|
|
|
// getEnv returns an environment variable or the fallback
|
|
func getEnv(key, fallback string) string {
|
|
if value, ok := os.LookupEnv(key); ok {
|
|
return value
|
|
}
|
|
return fallback
|
|
}
|
|
|
|
func succeedOrPanic(err error) {
|
|
if err != nil {
|
|
logger.Fatalf("Failed initializing Token SDK - %s", err.Error())
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
func handleSignals(handlers map[os.Signal]func()) {
|
|
var signals []os.Signal
|
|
for sig := range handlers {
|
|
signals = append(signals, sig)
|
|
}
|
|
|
|
signalChan := make(chan os.Signal, 1)
|
|
signal.Notify(signalChan, signals...)
|
|
|
|
for sig := range signalChan {
|
|
logger.Infof("Received signal: %d (%s)", sig, sig)
|
|
handlers[sig]()
|
|
}
|
|
}
|