|
|
|
cmd/tinyclient/main.go raw
| 1 | // Command tinyclient runs the standalone, server-rendered relay website. | | 2 | package main | | 3 | | | 4 | import ( | | 5 | "context" | | 6 | "errors" | | 7 | "flag" | | 8 | "fmt" | | 9 | "io" | | 10 | "net" | | 11 | "net/http" | | 12 | "os" | | 13 | "os/signal" | | 14 | "syscall" | | 15 | "time" | | 16 | | | 17 | "github.com/FelineStateMachine/tinyrelay/tinyclient" | | 18 | ) | | 19 | | | 20 | func configure(args []string, output io.Writer) (*http.Server, error) { | | 21 | flags := flag.NewFlagSet("tinyclient" , flag.ContinueOnError) | | 22 | flags.SetOutput(output) | | 23 | listen := flags.String("listen" , "127.0.0.1:8081" , "HTTP listen address" ) | | 24 | backend := flags.String("backend" , "" , "Upstream tinyrelay backend HTTP URL, including /r/<tenant> when used" ) | | 25 | public := flags.String("public-url" , "" , "Browser-facing HTTP(S) URL; preserve the relay's public origin and tenant path" ) | | 26 | if err := flags.Parse(args); err != nil { | | 27 | return nil, err | | 28 | } | | 29 | if flags.NArg() != 0 { | | 30 | return nil, errors.New("tinyclient accepts flags only" ) | | 31 | } | | 32 | handler, err := tinyclient.NewRemote(tinyclient.RemoteOptions{BackendURL: *backend, PublicURL: *public}) | | 33 | if err != nil { | | 34 | return nil, err | | 35 | } | | 36 | return &http.Server{Addr: *listen, Handler: handler, ReadHeaderTimeout: 10 * time.Second, IdleTimeout: 90 * time.Second}, nil | | 37 | } | | 38 | | | 39 | func run(ctx context.Context, args []string, output io.Writer) error { | | 40 | server, err := configure(args, output) | | 41 | if err != nil { | | 42 | return err | | 43 | } | | 44 | listener, err := net.Listen("tcp" , server.Addr) | | 45 | if err != nil { | | 46 | return err | | 47 | } | | 48 | defer listener.Close() | | 49 | fmt.Fprintf(output, "tinyclient listening on %s\n" , listener.Addr()) | | 50 | done := make(chan struct{}) | | 51 | defer close(done) | | 52 | go func() { | | 53 | select { | | 54 | case <-ctx.Done(): | | 55 | shutdown, cancel := context.WithTimeout(context.Background(), 10*time.Second) | | 56 | defer cancel() | | 57 | _ = server.Shutdown(shutdown) | | 58 | case <-done: | | 59 | } | | 60 | }() | | 61 | err = server.Serve(listener) | | 62 | if errors.Is(err, http.ErrServerClosed) { | | 63 | return nil | | 64 | } | | 65 | return err | | 66 | } | | 67 | | | 68 | func main() { | | 69 | ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) | | 70 | defer cancel() | | 71 | if err := run(ctx, os.Args[1:], os.Stderr); err != nil && !errors.Is(err, flag.ErrHelp) { | | 72 | fmt.Fprintln(os.Stderr, "tinyclient:" , err) | | 73 | os.Exit(1) | | 74 | } | | 75 | } |
|
|
About| owner | c01503e8035f |
|---|
| visibility | public |
|---|
| head | d730679639bf |
|---|
Maintainers- c01503e8035f owner
- ba1b5beed5b5 agent hermes
Clonehttps://012.run/npub1cq2s86qrtadf36eqq3epm38wmhdynrrcwxf84eldk3f94dkv7ttsrulrz5/tinyrelay.git
|