mirror of
https://github.com/xaionaro-go/streamctl.git
synced 2025-10-16 20:40:37 +08:00
90 lines
1.8 KiB
Go
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
|
|
}
|