Files
nekoray/go/grpc.go
arm64v8a 4ed46c10fe fix
2022-08-11 12:37:20 +08:00

89 lines
1.7 KiB
Go

package main
import (
"bufio"
"context"
"flag"
"fmt"
"log"
"nekoray_core/gen"
"net"
"os"
"strconv"
"strings"
"time"
grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth"
"google.golang.org/grpc"
)
type server struct {
gen.LibcoreServiceServer
}
var last time.Time
var nekoray_debug bool
func (s *server) KeepAlive(ctx context.Context, in *gen.EmptyReq) (*gen.EmptyResp, error) {
last = time.Now()
return &gen.EmptyResp{}, nil
}
func NekorayCore() {
_token := flag.String("token", "", "")
_port := flag.Int("port", 19810, "")
_debug := flag.Bool("debug", false, "")
flag.CommandLine.Parse(os.Args[2:])
nekoray_debug = *_debug
go func() {
t := time.NewTicker(time.Second * 10)
for {
<-t.C
if last.Add(time.Second * 10).Before(time.Now()) {
fmt.Println("Exit due to inactive")
os.Exit(0)
}
}
}()
// Libcore
setupCore()
// GRPC
lis, err := net.Listen("tcp", "127.0.0.1:"+strconv.Itoa(*_port))
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
token := *_token
if token == "" {
os.Stderr.WriteString("Please set a token: ")
s := bufio.NewScanner(os.Stdin)
if s.Scan() {
token = strings.TrimSpace(s.Text())
}
}
if token == "" {
fmt.Println("You must set a token")
os.Exit(0)
}
os.Stderr.WriteString("token is set\n")
auther := Authenticator{
Token: token,
}
s := grpc.NewServer(
grpc.StreamInterceptor(grpc_auth.StreamServerInterceptor(auther.Authenticate)),
grpc.UnaryInterceptor(grpc_auth.UnaryServerInterceptor(auther.Authenticate)),
)
gen.RegisterLibcoreServiceServer(s, &server{})
log.Printf("neokray grpc server listening at %v", lis.Addr())
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}