|
|
|
@ -1,36 +1,48 @@
|
|
|
|
|
package kernel
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"errors"
|
|
|
|
|
"fmt"
|
|
|
|
|
"net"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"google.golang.org/grpc"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type ServerBuilder func(grpc.ServiceRegistrar)
|
|
|
|
|
type ServerBuilder func(grpc.ServiceRegistrar, string)
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
grpcServerInstance *grpc.Server
|
|
|
|
|
listener net.Listener
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func StartGRPCServer(port int, sb ServerBuilder, opts ...grpc.ServerOption) (err error) {
|
|
|
|
|
func StartGRPCServer(ctx context.Context, port int, sb ServerBuilder, opts ...grpc.ServerOption) (endpoint string, err error) {
|
|
|
|
|
if grpcServerInstance != nil {
|
|
|
|
|
return errors.New("There can only be one GRPC server running at a time")
|
|
|
|
|
err = errors.New("There can only be one GRPC server running at a time")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
listener, err = net.Listen("tcp", fmt.Sprintf("0.0.0.0:%d", port))
|
|
|
|
|
endpoint = fmt.Sprintf("0.0.0.0:%d", port)
|
|
|
|
|
listener, err = net.Listen("tcp", endpoint)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("could not start tcp listener: %w", err)
|
|
|
|
|
endpoint = ""
|
|
|
|
|
err = fmt.Errorf("could not start tcp listener: %w", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
grpcServerInstance = grpc.NewServer(opts...)
|
|
|
|
|
|
|
|
|
|
sb(grpcServerInstance)
|
|
|
|
|
sb(grpcServerInstance, endpoint)
|
|
|
|
|
|
|
|
|
|
InfoLog.Printf("Listening on 0.0.0.0:%d", port)
|
|
|
|
|
return grpcServerInstance.Serve(listener)
|
|
|
|
|
if err = grpcServerInstance.Serve(listener); err != nil {
|
|
|
|
|
endpoint = ""
|
|
|
|
|
err = fmt.Errorf("could not serve GRPC server over listener: %w", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
InfoLog.Printf("Listening for GRPC requests on %s", endpoint)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func StopGRPCServer() error {
|
|
|
|
|