github.com/NpoolPlatform/chain-middleware@v0.0.0-20240228100535-eb1bcf896eb9/cmd/chain-middleware/run.go (about)

     1  package main
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/NpoolPlatform/chain-middleware/api"
     7  	"github.com/NpoolPlatform/chain-middleware/pkg/db"
     8  
     9  	apicli "github.com/NpoolPlatform/basal-middleware/pkg/client/api"
    10  	"github.com/NpoolPlatform/chain-middleware/pkg/currency"
    11  	"github.com/NpoolPlatform/chain-middleware/pkg/migrator"
    12  	"github.com/NpoolPlatform/go-service-framework/pkg/action"
    13  	"github.com/NpoolPlatform/go-service-framework/pkg/logger"
    14  	"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
    15  	cli "github.com/urfave/cli/v2"
    16  
    17  	"google.golang.org/grpc"
    18  )
    19  
    20  var runCmd = &cli.Command{
    21  	Name:    "run",
    22  	Aliases: []string{"s"},
    23  	Usage:   "Run the daemon",
    24  	Action: func(c *cli.Context) error {
    25  		err := action.Run(
    26  			c.Context,
    27  			run,
    28  			rpcRegister,
    29  			rpcGatewayRegister,
    30  			watch,
    31  		)
    32  
    33  		currency.Shutdown(c.Context)
    34  
    35  		return err
    36  	},
    37  }
    38  
    39  func run(ctx context.Context) error {
    40  	if err := migrator.Migrate(ctx); err != nil {
    41  		return err
    42  	}
    43  	if err := db.Init(); err != nil {
    44  		return err
    45  	}
    46  	return nil
    47  }
    48  
    49  func shutdown(ctx context.Context) {
    50  	<-ctx.Done()
    51  	logger.Sugar().Infow(
    52  		"Watch",
    53  		"State", "Done",
    54  		"Error", ctx.Err(),
    55  	)
    56  }
    57  
    58  func _watch(ctx context.Context, cancel context.CancelFunc, w func(ctx context.Context)) {
    59  	defer func() {
    60  		if err := recover(); err != nil {
    61  			logger.Sugar().Errorw(
    62  				"Watch",
    63  				"State", "Panic",
    64  				"Error", err,
    65  			)
    66  			cancel()
    67  		}
    68  	}()
    69  	w(ctx)
    70  }
    71  
    72  func watch(ctx context.Context, cancel context.CancelFunc) error {
    73  	go shutdown(ctx)
    74  	go _watch(ctx, cancel, currency.Watch)
    75  	return nil
    76  }
    77  
    78  func rpcRegister(server grpc.ServiceRegistrar) error {
    79  	api.Register(server)
    80  
    81  	apicli.RegisterGRPC(server)
    82  
    83  	return nil
    84  }
    85  
    86  func rpcGatewayRegister(mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) error {
    87  	err := api.RegisterGateway(mux, endpoint, opts)
    88  	if err != nil {
    89  		return err
    90  	}
    91  	return nil
    92  }