Initial commit, pt. 26

This commit is contained in:
Dmitrii Okunev
2024-06-30 18:29:44 +01:00
parent e246c76eca
commit f09cfc9c61
8 changed files with 2477 additions and 13 deletions

View File

@@ -32,6 +32,7 @@ type StreamD interface {
EndStream(ctx context.Context, platID streamcontrol.PlatformName) error
GitRelogin(ctx context.Context) error
GetBackendData(ctx context.Context, platID streamcontrol.PlatformName) (any, error)
Restart(ctx context.Context) error
}
type BackendDataOBS struct{}

View File

@@ -2,27 +2,57 @@ package client
import (
"context"
"encoding/json"
"fmt"
"net/url"
"github.com/xaionaro-go/streamctl/pkg/streamcontrol"
"github.com/xaionaro-go/streamctl/pkg/streamd/api"
"github.com/xaionaro-go/streamctl/pkg/streamd/config"
"github.com/xaionaro-go/streamctl/pkg/streamd/grpc/go/streamd_grpc"
"google.golang.org/grpc"
)
type Client struct{}
type Client struct {
URL *url.URL
}
var _ api.StreamD = (*Client)(nil)
func New(url *url.URL) *Client {
panic("not implemented")
return &Client{URL: url}
}
func (c *Client) grpcClient() (streamd_grpc.StreamDClient, *grpc.ClientConn, error) {
conn, err := grpc.NewClient(c.URL.String())
if err != nil {
return nil, nil, fmt.Errorf("unable to initialize a gRPC client: %w", err)
}
client := streamd_grpc.NewStreamDClient(conn)
return client, conn, nil
}
func (c *Client) FetchConfig(ctx context.Context) error {
panic("not implemented")
client, conn, err := c.grpcClient()
if err != nil {
return err
}
defer conn.Close()
_, err = client.OBSOLETE_FetchConfig(ctx, &streamd_grpc.OBSOLETE_FetchConfigRequest{})
return err
}
func (c *Client) InitCache(ctx context.Context) error {
panic("not implemented")
client, conn, err := c.grpcClient()
if err != nil {
return err
}
defer conn.Close()
_, err = client.InitCache(ctx, &streamd_grpc.InitCacheRequest{})
return err
}
func (c *Client) SetPlatformConfig(
@@ -34,27 +64,94 @@ func (c *Client) SetPlatformConfig(
}
func (c *Client) SaveConfig(ctx context.Context) error {
panic("not implemented")
client, conn, err := c.grpcClient()
if err != nil {
return err
}
defer conn.Close()
_, err = client.SaveConfig(ctx, &streamd_grpc.SaveConfigRequest{})
return err
}
func (c *Client) ResetCache(ctx context.Context) error {
panic("not implemented")
client, conn, err := c.grpcClient()
if err != nil {
return err
}
defer conn.Close()
_, err = client.ResetCache(ctx, &streamd_grpc.ResetCacheRequest{})
return err
}
func (c *Client) GetConfig(ctx context.Context) (*config.Config, error) {
panic("not implemented")
client, conn, err := c.grpcClient()
if err != nil {
return nil, err
}
defer conn.Close()
reply, err := client.GetConfig(ctx, &streamd_grpc.GetConfigRequest{})
if err != nil {
return nil, fmt.Errorf("unable to request the config: %w", err)
}
var config config.Config
err = json.Unmarshal([]byte(reply.Config), &config)
if err != nil {
return nil, fmt.Errorf("unable to unserialize the received config: %w", err)
}
return &config, nil
}
func (c *Client) SetConfig(ctx context.Context, cfg *config.Config) error {
panic("not implemented")
b, err := json.Marshal(cfg)
if err != nil {
return fmt.Errorf("unable to serialize the config: %w", err)
}
req := &streamd_grpc.SetConfigRequest{
Config: string(b),
}
client, conn, err := c.grpcClient()
if err != nil {
return err
}
defer conn.Close()
_, err = client.SetConfig(ctx, req)
return err
}
func (c *Client) IsBackendEnabled(ctx context.Context, id streamcontrol.PlatformName) (bool, error) {
panic("not implemented")
client, conn, err := c.grpcClient()
if err != nil {
return false, err
}
defer conn.Close()
reply, err := client.GetBackendInfo(ctx, &streamd_grpc.GetBackendInfoRequest{
PlatID: string(id),
})
if err != nil {
return false, fmt.Errorf("unable to get backend info: %w", err)
}
return reply.IsInitialized, nil
}
func (c *Client) IsGITInitialized(ctx context.Context) (bool, error) {
panic("not implemented")
client, conn, err := c.grpcClient()
if err != nil {
return false, err
}
defer conn.Close()
reply, err := client.OBSOLETE_GitInfo(ctx, &streamd_grpc.OBSOLETE_GetGitInfoRequest{})
if err != nil {
return false, fmt.Errorf("unable to get backend info: %w", err)
}
return reply.IsInitialized, nil
}
func (c *Client) StartStream(
@@ -64,16 +161,74 @@ func (c *Client) StartStream(
profile streamcontrol.AbstractStreamProfile,
customArgs ...any,
) error {
panic("not implemented")
client, conn, err := c.grpcClient()
if err != nil {
return err
}
defer conn.Close()
b, err := json.Marshal(profile)
if err != nil {
return fmt.Errorf("unable to serialize the profile: %w", err)
}
_, err = client.StartStream(ctx, &streamd_grpc.StartStreamRequest{
PlatID: string(platID),
Title: title,
Description: description,
Profile: string(b),
})
if err != nil {
return fmt.Errorf("unable to start the stream: %w", err)
}
return nil
}
func (c *Client) EndStream(ctx context.Context, platID streamcontrol.PlatformName) error {
panic("not implemented")
client, conn, err := c.grpcClient()
if err != nil {
return err
}
defer conn.Close()
_, err = client.EndStream(ctx, &streamd_grpc.EndStreamRequest{PlatID: string(platID)})
if err != nil {
return fmt.Errorf("unable to end the stream: %w", err)
}
return nil
}
func (c *Client) GitRelogin(ctx context.Context) error {
panic("not implemented")
client, conn, err := c.grpcClient()
if err != nil {
return err
}
defer conn.Close()
_, err = client.OBSOLETE_GitRelogin(ctx, &streamd_grpc.OBSOLETE_GitReloginRequest{})
if err != nil {
return fmt.Errorf("unable force git relogin: %w", err)
}
return nil
}
func (c *Client) GetBackendData(ctx context.Context, platID streamcontrol.PlatformName) (any, error) {
panic("not implemented")
}
func (c *Client) Restart(ctx context.Context) error {
client, conn, err := c.grpcClient()
if err != nil {
return err
}
defer conn.Close()
_, err = client.Restart(ctx, &streamd_grpc.RestartRequest{})
if err != nil {
return fmt.Errorf("unable restart the server: %w", err)
}
return nil
}

View File

@@ -0,0 +1,6 @@
all: go
go:
protoc --go_out=. --go-grpc_out=. streamd.proto

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,501 @@
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.2.0
// - protoc v3.21.12
// source: streamd.proto
package streamd_grpc
import (
context "context"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
)
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7
// StreamDClient is the client API for StreamD service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
type StreamDClient interface {
GetConfig(ctx context.Context, in *GetConfigRequest, opts ...grpc.CallOption) (*GetConfigReply, error)
SetConfig(ctx context.Context, in *SetConfigRequest, opts ...grpc.CallOption) (*SetConfigReply, error)
SaveConfig(ctx context.Context, in *SaveConfigRequest, opts ...grpc.CallOption) (*SaveConfigReply, error)
ResetCache(ctx context.Context, in *ResetCacheRequest, opts ...grpc.CallOption) (*ResetCacheReply, error)
InitCache(ctx context.Context, in *InitCacheRequest, opts ...grpc.CallOption) (*InitCacheReply, error)
StartStream(ctx context.Context, in *StartStreamRequest, opts ...grpc.CallOption) (*StartStreamReply, error)
EndStream(ctx context.Context, in *EndStreamRequest, opts ...grpc.CallOption) (*EndStreamReply, error)
GetBackendInfo(ctx context.Context, in *GetBackendInfoRequest, opts ...grpc.CallOption) (*GetBackendInfoReply, error)
Restart(ctx context.Context, in *RestartRequest, opts ...grpc.CallOption) (*RestartReply, error)
OBSOLETE_FetchConfig(ctx context.Context, in *OBSOLETE_FetchConfigRequest, opts ...grpc.CallOption) (*OBSOLETE_FetchConfigReply, error)
OBSOLETE_GitInfo(ctx context.Context, in *OBSOLETE_GetGitInfoRequest, opts ...grpc.CallOption) (*OBSOLETE_GetGitInfoReply, error)
OBSOLETE_GitRelogin(ctx context.Context, in *OBSOLETE_GitReloginRequest, opts ...grpc.CallOption) (*OBSOLETE_GitReloginReply, error)
}
type streamDClient struct {
cc grpc.ClientConnInterface
}
func NewStreamDClient(cc grpc.ClientConnInterface) StreamDClient {
return &streamDClient{cc}
}
func (c *streamDClient) GetConfig(ctx context.Context, in *GetConfigRequest, opts ...grpc.CallOption) (*GetConfigReply, error) {
out := new(GetConfigReply)
err := c.cc.Invoke(ctx, "/StreamD/GetConfig", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *streamDClient) SetConfig(ctx context.Context, in *SetConfigRequest, opts ...grpc.CallOption) (*SetConfigReply, error) {
out := new(SetConfigReply)
err := c.cc.Invoke(ctx, "/StreamD/SetConfig", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *streamDClient) SaveConfig(ctx context.Context, in *SaveConfigRequest, opts ...grpc.CallOption) (*SaveConfigReply, error) {
out := new(SaveConfigReply)
err := c.cc.Invoke(ctx, "/StreamD/SaveConfig", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *streamDClient) ResetCache(ctx context.Context, in *ResetCacheRequest, opts ...grpc.CallOption) (*ResetCacheReply, error) {
out := new(ResetCacheReply)
err := c.cc.Invoke(ctx, "/StreamD/ResetCache", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *streamDClient) InitCache(ctx context.Context, in *InitCacheRequest, opts ...grpc.CallOption) (*InitCacheReply, error) {
out := new(InitCacheReply)
err := c.cc.Invoke(ctx, "/StreamD/InitCache", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *streamDClient) StartStream(ctx context.Context, in *StartStreamRequest, opts ...grpc.CallOption) (*StartStreamReply, error) {
out := new(StartStreamReply)
err := c.cc.Invoke(ctx, "/StreamD/StartStream", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *streamDClient) EndStream(ctx context.Context, in *EndStreamRequest, opts ...grpc.CallOption) (*EndStreamReply, error) {
out := new(EndStreamReply)
err := c.cc.Invoke(ctx, "/StreamD/EndStream", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *streamDClient) GetBackendInfo(ctx context.Context, in *GetBackendInfoRequest, opts ...grpc.CallOption) (*GetBackendInfoReply, error) {
out := new(GetBackendInfoReply)
err := c.cc.Invoke(ctx, "/StreamD/GetBackendInfo", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *streamDClient) Restart(ctx context.Context, in *RestartRequest, opts ...grpc.CallOption) (*RestartReply, error) {
out := new(RestartReply)
err := c.cc.Invoke(ctx, "/StreamD/Restart", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *streamDClient) OBSOLETE_FetchConfig(ctx context.Context, in *OBSOLETE_FetchConfigRequest, opts ...grpc.CallOption) (*OBSOLETE_FetchConfigReply, error) {
out := new(OBSOLETE_FetchConfigReply)
err := c.cc.Invoke(ctx, "/StreamD/OBSOLETE_FetchConfig", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *streamDClient) OBSOLETE_GitInfo(ctx context.Context, in *OBSOLETE_GetGitInfoRequest, opts ...grpc.CallOption) (*OBSOLETE_GetGitInfoReply, error) {
out := new(OBSOLETE_GetGitInfoReply)
err := c.cc.Invoke(ctx, "/StreamD/OBSOLETE_GitInfo", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *streamDClient) OBSOLETE_GitRelogin(ctx context.Context, in *OBSOLETE_GitReloginRequest, opts ...grpc.CallOption) (*OBSOLETE_GitReloginReply, error) {
out := new(OBSOLETE_GitReloginReply)
err := c.cc.Invoke(ctx, "/StreamD/OBSOLETE_GitRelogin", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// StreamDServer is the server API for StreamD service.
// All implementations must embed UnimplementedStreamDServer
// for forward compatibility
type StreamDServer interface {
GetConfig(context.Context, *GetConfigRequest) (*GetConfigReply, error)
SetConfig(context.Context, *SetConfigRequest) (*SetConfigReply, error)
SaveConfig(context.Context, *SaveConfigRequest) (*SaveConfigReply, error)
ResetCache(context.Context, *ResetCacheRequest) (*ResetCacheReply, error)
InitCache(context.Context, *InitCacheRequest) (*InitCacheReply, error)
StartStream(context.Context, *StartStreamRequest) (*StartStreamReply, error)
EndStream(context.Context, *EndStreamRequest) (*EndStreamReply, error)
GetBackendInfo(context.Context, *GetBackendInfoRequest) (*GetBackendInfoReply, error)
Restart(context.Context, *RestartRequest) (*RestartReply, error)
OBSOLETE_FetchConfig(context.Context, *OBSOLETE_FetchConfigRequest) (*OBSOLETE_FetchConfigReply, error)
OBSOLETE_GitInfo(context.Context, *OBSOLETE_GetGitInfoRequest) (*OBSOLETE_GetGitInfoReply, error)
OBSOLETE_GitRelogin(context.Context, *OBSOLETE_GitReloginRequest) (*OBSOLETE_GitReloginReply, error)
mustEmbedUnimplementedStreamDServer()
}
// UnimplementedStreamDServer must be embedded to have forward compatible implementations.
type UnimplementedStreamDServer struct {
}
func (UnimplementedStreamDServer) GetConfig(context.Context, *GetConfigRequest) (*GetConfigReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetConfig not implemented")
}
func (UnimplementedStreamDServer) SetConfig(context.Context, *SetConfigRequest) (*SetConfigReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method SetConfig not implemented")
}
func (UnimplementedStreamDServer) SaveConfig(context.Context, *SaveConfigRequest) (*SaveConfigReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method SaveConfig not implemented")
}
func (UnimplementedStreamDServer) ResetCache(context.Context, *ResetCacheRequest) (*ResetCacheReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method ResetCache not implemented")
}
func (UnimplementedStreamDServer) InitCache(context.Context, *InitCacheRequest) (*InitCacheReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method InitCache not implemented")
}
func (UnimplementedStreamDServer) StartStream(context.Context, *StartStreamRequest) (*StartStreamReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method StartStream not implemented")
}
func (UnimplementedStreamDServer) EndStream(context.Context, *EndStreamRequest) (*EndStreamReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method EndStream not implemented")
}
func (UnimplementedStreamDServer) GetBackendInfo(context.Context, *GetBackendInfoRequest) (*GetBackendInfoReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetBackendInfo not implemented")
}
func (UnimplementedStreamDServer) Restart(context.Context, *RestartRequest) (*RestartReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method Restart not implemented")
}
func (UnimplementedStreamDServer) OBSOLETE_FetchConfig(context.Context, *OBSOLETE_FetchConfigRequest) (*OBSOLETE_FetchConfigReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method OBSOLETE_FetchConfig not implemented")
}
func (UnimplementedStreamDServer) OBSOLETE_GitInfo(context.Context, *OBSOLETE_GetGitInfoRequest) (*OBSOLETE_GetGitInfoReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method OBSOLETE_GitInfo not implemented")
}
func (UnimplementedStreamDServer) OBSOLETE_GitRelogin(context.Context, *OBSOLETE_GitReloginRequest) (*OBSOLETE_GitReloginReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method OBSOLETE_GitRelogin not implemented")
}
func (UnimplementedStreamDServer) mustEmbedUnimplementedStreamDServer() {}
// UnsafeStreamDServer may be embedded to opt out of forward compatibility for this service.
// Use of this interface is not recommended, as added methods to StreamDServer will
// result in compilation errors.
type UnsafeStreamDServer interface {
mustEmbedUnimplementedStreamDServer()
}
func RegisterStreamDServer(s grpc.ServiceRegistrar, srv StreamDServer) {
s.RegisterService(&StreamD_ServiceDesc, srv)
}
func _StreamD_GetConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GetConfigRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(StreamDServer).GetConfig(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/StreamD/GetConfig",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(StreamDServer).GetConfig(ctx, req.(*GetConfigRequest))
}
return interceptor(ctx, in, info, handler)
}
func _StreamD_SetConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(SetConfigRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(StreamDServer).SetConfig(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/StreamD/SetConfig",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(StreamDServer).SetConfig(ctx, req.(*SetConfigRequest))
}
return interceptor(ctx, in, info, handler)
}
func _StreamD_SaveConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(SaveConfigRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(StreamDServer).SaveConfig(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/StreamD/SaveConfig",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(StreamDServer).SaveConfig(ctx, req.(*SaveConfigRequest))
}
return interceptor(ctx, in, info, handler)
}
func _StreamD_ResetCache_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ResetCacheRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(StreamDServer).ResetCache(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/StreamD/ResetCache",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(StreamDServer).ResetCache(ctx, req.(*ResetCacheRequest))
}
return interceptor(ctx, in, info, handler)
}
func _StreamD_InitCache_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(InitCacheRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(StreamDServer).InitCache(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/StreamD/InitCache",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(StreamDServer).InitCache(ctx, req.(*InitCacheRequest))
}
return interceptor(ctx, in, info, handler)
}
func _StreamD_StartStream_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(StartStreamRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(StreamDServer).StartStream(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/StreamD/StartStream",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(StreamDServer).StartStream(ctx, req.(*StartStreamRequest))
}
return interceptor(ctx, in, info, handler)
}
func _StreamD_EndStream_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(EndStreamRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(StreamDServer).EndStream(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/StreamD/EndStream",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(StreamDServer).EndStream(ctx, req.(*EndStreamRequest))
}
return interceptor(ctx, in, info, handler)
}
func _StreamD_GetBackendInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GetBackendInfoRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(StreamDServer).GetBackendInfo(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/StreamD/GetBackendInfo",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(StreamDServer).GetBackendInfo(ctx, req.(*GetBackendInfoRequest))
}
return interceptor(ctx, in, info, handler)
}
func _StreamD_Restart_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(RestartRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(StreamDServer).Restart(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/StreamD/Restart",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(StreamDServer).Restart(ctx, req.(*RestartRequest))
}
return interceptor(ctx, in, info, handler)
}
func _StreamD_OBSOLETE_FetchConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(OBSOLETE_FetchConfigRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(StreamDServer).OBSOLETE_FetchConfig(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/StreamD/OBSOLETE_FetchConfig",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(StreamDServer).OBSOLETE_FetchConfig(ctx, req.(*OBSOLETE_FetchConfigRequest))
}
return interceptor(ctx, in, info, handler)
}
func _StreamD_OBSOLETE_GitInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(OBSOLETE_GetGitInfoRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(StreamDServer).OBSOLETE_GitInfo(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/StreamD/OBSOLETE_GitInfo",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(StreamDServer).OBSOLETE_GitInfo(ctx, req.(*OBSOLETE_GetGitInfoRequest))
}
return interceptor(ctx, in, info, handler)
}
func _StreamD_OBSOLETE_GitRelogin_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(OBSOLETE_GitReloginRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(StreamDServer).OBSOLETE_GitRelogin(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/StreamD/OBSOLETE_GitRelogin",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(StreamDServer).OBSOLETE_GitRelogin(ctx, req.(*OBSOLETE_GitReloginRequest))
}
return interceptor(ctx, in, info, handler)
}
// StreamD_ServiceDesc is the grpc.ServiceDesc for StreamD service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
var StreamD_ServiceDesc = grpc.ServiceDesc{
ServiceName: "StreamD",
HandlerType: (*StreamDServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "GetConfig",
Handler: _StreamD_GetConfig_Handler,
},
{
MethodName: "SetConfig",
Handler: _StreamD_SetConfig_Handler,
},
{
MethodName: "SaveConfig",
Handler: _StreamD_SaveConfig_Handler,
},
{
MethodName: "ResetCache",
Handler: _StreamD_ResetCache_Handler,
},
{
MethodName: "InitCache",
Handler: _StreamD_InitCache_Handler,
},
{
MethodName: "StartStream",
Handler: _StreamD_StartStream_Handler,
},
{
MethodName: "EndStream",
Handler: _StreamD_EndStream_Handler,
},
{
MethodName: "GetBackendInfo",
Handler: _StreamD_GetBackendInfo_Handler,
},
{
MethodName: "Restart",
Handler: _StreamD_Restart_Handler,
},
{
MethodName: "OBSOLETE_FetchConfig",
Handler: _StreamD_OBSOLETE_FetchConfig_Handler,
},
{
MethodName: "OBSOLETE_GitInfo",
Handler: _StreamD_OBSOLETE_GitInfo_Handler,
},
{
MethodName: "OBSOLETE_GitRelogin",
Handler: _StreamD_OBSOLETE_GitRelogin_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "streamd.proto",
}

View File

@@ -0,0 +1,63 @@
syntax = "proto3";
option go_package = "go/streamd_grpc";
service StreamD {
rpc GetConfig(GetConfigRequest) returns (GetConfigReply) {}
rpc SetConfig(SetConfigRequest) returns (SetConfigReply) {}
rpc SaveConfig(SaveConfigRequest) returns (SaveConfigReply) {}
rpc ResetCache(ResetCacheRequest) returns (ResetCacheReply) {}
rpc InitCache(InitCacheRequest) returns (InitCacheReply) {}
rpc StartStream(StartStreamRequest) returns (StartStreamReply) {}
rpc EndStream(EndStreamRequest) returns (EndStreamReply) {}
rpc GetBackendInfo(GetBackendInfoRequest) returns (GetBackendInfoReply) {}
rpc Restart(RestartRequest) returns (RestartReply) {}
rpc OBSOLETE_FetchConfig(OBSOLETE_FetchConfigRequest) returns (OBSOLETE_FetchConfigReply) {}
rpc OBSOLETE_GitInfo(OBSOLETE_GetGitInfoRequest) returns (OBSOLETE_GetGitInfoReply) {}
rpc OBSOLETE_GitRelogin(OBSOLETE_GitReloginRequest) returns (OBSOLETE_GitReloginReply) {}
}
message GetConfigRequest {}
message GetConfigReply {
string config = 1;
}
message SetConfigRequest {
string config = 1;
}
message SetConfigReply {}
message SaveConfigRequest {}
message SaveConfigReply {}
message ResetCacheRequest {}
message ResetCacheReply {}
message InitCacheRequest {}
message InitCacheReply {}
message StartStreamRequest {
string platID = 1;
string title = 2;
string description = 3;
string profile = 4;
}
message StartStreamReply {}
message EndStreamRequest {
string platID = 1;
}
message EndStreamReply {}
message GetBackendInfoRequest {
string platID = 1;
}
message GetBackendInfoReply {
bool isInitialized = 1;
string data = 2;
}
message RestartRequest {}
message RestartReply {}
message OBSOLETE_FetchConfigRequest {}
message OBSOLETE_FetchConfigReply {}
message OBSOLETE_GetGitInfoRequest {}
message OBSOLETE_GetGitInfoReply {
bool isInitialized = 1;
}
message OBSOLETE_GitReloginRequest {}
message OBSOLETE_GitReloginReply {}

213
pkg/streamd/server/grpc.go Normal file
View File

@@ -0,0 +1,213 @@
package server
import (
"context"
"encoding/json"
"fmt"
"github.com/xaionaro-go/streamctl/pkg/streamcontrol"
"github.com/xaionaro-go/streamctl/pkg/streamcontrol/obs"
"github.com/xaionaro-go/streamctl/pkg/streamcontrol/twitch"
"github.com/xaionaro-go/streamctl/pkg/streamcontrol/youtube"
"github.com/xaionaro-go/streamctl/pkg/streamd/api"
"github.com/xaionaro-go/streamctl/pkg/streamd/config"
"github.com/xaionaro-go/streamctl/pkg/streamd/grpc/go/streamd_grpc"
)
type GRPCServer struct {
streamd_grpc.StreamDServer
StreamD api.StreamD
}
var _ streamd_grpc.StreamDServer = (*GRPCServer)(nil)
func NewGRPCServer(streamd api.StreamD) *GRPCServer {
return &GRPCServer{
StreamD: streamd,
}
}
func (grpc *GRPCServer) GetConfig(
ctx context.Context,
req *streamd_grpc.GetConfigRequest,
) (*streamd_grpc.GetConfigReply, error) {
config, err := grpc.StreamD.GetConfig(ctx)
if err != nil {
return nil, fmt.Errorf("unable to get the config: %w", err)
}
b, err := json.Marshal(config)
if err != nil {
return nil, fmt.Errorf("unable to serialize the config: %w", err)
}
return &streamd_grpc.GetConfigReply{
Config: string(b),
}, nil
}
func (grpc *GRPCServer) SetConfig(
ctx context.Context,
req *streamd_grpc.SetConfigRequest,
) (*streamd_grpc.SetConfigReply, error) {
var config config.Config
err := json.Unmarshal([]byte(req.Config), &config)
if err != nil {
return nil, fmt.Errorf("unable to unserialize the config: %w", err)
}
err = grpc.StreamD.SetConfig(ctx, &config)
if err != nil {
return nil, fmt.Errorf("unable to set the config: %w", err)
}
return &streamd_grpc.SetConfigReply{}, nil
}
func (grpc *GRPCServer) SaveConfig(
ctx context.Context,
req *streamd_grpc.SaveConfigRequest,
) (*streamd_grpc.SaveConfigReply, error) {
err := grpc.StreamD.SaveConfig(ctx)
if err != nil {
return nil, fmt.Errorf("unable to save the config: %w", err)
}
return &streamd_grpc.SaveConfigReply{}, nil
}
func (grpc *GRPCServer) ResetCache(
ctx context.Context,
req *streamd_grpc.ResetCacheRequest,
) (*streamd_grpc.ResetCacheReply, error) {
err := grpc.StreamD.ResetCache(ctx)
if err != nil {
return nil, fmt.Errorf("unable to reset the cache: %w", err)
}
return &streamd_grpc.ResetCacheReply{}, nil
}
func (grpc *GRPCServer) InitCache(
ctx context.Context,
req *streamd_grpc.InitCacheRequest,
) (*streamd_grpc.InitCacheReply, error) {
err := grpc.StreamD.InitCache(ctx)
if err != nil {
return nil, fmt.Errorf("unable to init the cache: %w", err)
}
return &streamd_grpc.InitCacheReply{}, nil
}
func (grpc *GRPCServer) StartStream(
ctx context.Context,
req *streamd_grpc.StartStreamRequest,
) (*streamd_grpc.StartStreamReply, error) {
var profile streamcontrol.AbstractStreamProfile
var err error
platID := streamcontrol.PlatformName(req.GetPlatID())
switch platID {
case obs.ID:
profile = &obs.StreamProfile{}
case twitch.ID:
profile = &twitch.StreamProfile{}
case youtube.ID:
profile = &youtube.StreamProfile{}
default:
return nil, fmt.Errorf("unexpected platform ID: '%s'", platID)
}
err = json.Unmarshal([]byte(req.GetProfile()), &profile)
if err != nil {
return nil, fmt.Errorf("unable to unserialize the profile: %w", err)
}
err = grpc.StreamD.StartStream(
ctx,
platID,
req.GetTitle(),
req.GetDescription(),
profile,
)
if err != nil {
return nil, fmt.Errorf("unable to start the stream: %w", err)
}
return &streamd_grpc.StartStreamReply{}, nil
}
func (grpc *GRPCServer) EndStream(
ctx context.Context,
req *streamd_grpc.EndStreamRequest,
) (*streamd_grpc.EndStreamReply, error) {
err := grpc.StreamD.EndStream(ctx, streamcontrol.PlatformName(req.GetPlatID()))
if err != nil {
return nil, fmt.Errorf("unable to end the stream: %w", err)
}
return &streamd_grpc.EndStreamReply{}, nil
}
func (grpc *GRPCServer) GetBackendInfo(
ctx context.Context,
req *streamd_grpc.GetBackendInfoRequest,
) (*streamd_grpc.GetBackendInfoReply, error) {
platID := streamcontrol.PlatformName(req.GetPlatID())
isEnabled, err := grpc.StreamD.IsBackendEnabled(ctx, platID)
if err != nil {
return nil, fmt.Errorf("unable to check if the backend is enabled: %w", err)
}
data, err := grpc.StreamD.GetBackendData(ctx, platID)
if err != nil {
return nil, fmt.Errorf("unable to get the backend info: %w", err)
}
dataSerialized, err := json.Marshal(data)
if err != nil {
return nil, fmt.Errorf("unable to serialize the backend info: %w", err)
}
return &streamd_grpc.GetBackendInfoReply{
IsInitialized: isEnabled,
Data: string(dataSerialized),
}, nil
}
func (grpc *GRPCServer) Restart(
ctx context.Context,
req *streamd_grpc.RestartRequest,
) (*streamd_grpc.RestartReply, error) {
err := grpc.StreamD.Restart(ctx)
if err != nil {
return nil, fmt.Errorf("unable to restart: %w", err)
}
return &streamd_grpc.RestartReply{}, nil
}
func (grpc *GRPCServer) OBSOLETE_FetchConfig(
ctx context.Context,
req *streamd_grpc.OBSOLETE_FetchConfigRequest,
) (*streamd_grpc.OBSOLETE_FetchConfigReply, error) {
err := grpc.StreamD.FetchConfig(ctx)
if err != nil {
return nil, fmt.Errorf("unable to fetch the config: %w", err)
}
return &streamd_grpc.OBSOLETE_FetchConfigReply{}, nil
}
func (grpc *GRPCServer) OBSOLETE_GitInfo(
ctx context.Context,
req *streamd_grpc.OBSOLETE_GetGitInfoRequest,
) (*streamd_grpc.OBSOLETE_GetGitInfoReply, error) {
isEnabled, err := grpc.StreamD.IsGITInitialized(ctx)
if err != nil {
return nil, fmt.Errorf("unable to get the git info: %w", err)
}
return &streamd_grpc.OBSOLETE_GetGitInfoReply{
IsInitialized: isEnabled,
}, nil
}
func (grpc *GRPCServer) OBSOLETE_GitRelogin(
ctx context.Context,
req *streamd_grpc.OBSOLETE_GitReloginRequest,
) (*streamd_grpc.OBSOLETE_GitReloginReply, error) {
err := grpc.StreamD.GitRelogin(ctx)
if err != nil {
return nil, fmt.Errorf("unable to relogin: %w", err)
}
return &streamd_grpc.OBSOLETE_GitReloginReply{}, nil
}

View File

@@ -401,3 +401,8 @@ func (d *StreamD) GetBackendData(ctx context.Context, platID streamcontrol.Platf
return nil, fmt.Errorf("unexpected platform ID '%s'", platID)
}
}
func (d *StreamD) Restart(ctx context.Context) error {
d.UI.Restart(ctx, "A restart was requested")
return nil
}