Files
streamctl/cmd/streampanel/ui.go
2024-07-21 01:16:39 +01:00

90 lines
1.8 KiB
Go

package main
import (
"context"
"fmt"
"os"
"github.com/facebookincubator/go-belt"
"github.com/facebookincubator/go-belt/tool/logger"
"github.com/xaionaro-go/streamctl/pkg/mainprocess"
)
func forkUI(ctx context.Context, mainProcessAddr, password string) {
procName := ProcessNameUI
ctx = belt.WithField(ctx, "process", procName)
mainProcess, err := mainprocess.NewClient(
procName,
mainProcessAddr,
password,
)
if err != nil {
panic(err)
}
flags := getFlags(ctx, mainProcess)
ctx = getContext(flags)
ctx = belt.WithField(ctx, "process", procName)
defer belt.Flush(ctx)
logger.Debugf(ctx, "flags == %#+v", flags)
cancelFunc := initRuntime(ctx, flags, procName)
defer cancelFunc()
streamdAddr := getStreamDAddress(ctx, mainProcess)
go mainProcess.Serve(
ctx,
func(ctx context.Context, source mainprocess.ProcessName, content any) error {
switch content.(type) {
case StreamDDied:
os.Exit(0)
}
return nil
},
)
flags.RemoteAddr = streamdAddr
runPanel(ctx, flags)
}
type StreamDDied struct{}
type GetStreamdAddress struct{}
type GetStreamdAddressResult struct {
Address string
}
func getStreamDAddress(
ctx context.Context,
mainProcess *mainprocess.Client,
) string {
err := mainProcess.SendMessage(ctx, "streamd", GetStreamdAddress{})
assertNoError(err)
var addr string
for {
readOnceMore := false
err = mainProcess.ReadOne(
ctx,
func(ctx context.Context, source mainprocess.ProcessName, content any) error {
switch msg := content.(type) {
case GetStreamdAddressResult:
addr = msg.Address
case StreamDDied:
readOnceMore = true
default:
return fmt.Errorf("got unexpected type '%T' instead of %T", content, GetStreamdAddressResult{})
}
return nil
},
)
assertNoError(err)
if readOnceMore {
continue
}
break
}
return addr
}