got screen:new and screen:del implemented

This commit is contained in:
sawka
2023-03-27 18:19:17 -07:00
parent b0269d5228
commit 1dbdb3d50b
3 changed files with 43 additions and 8 deletions
+12
View File
@@ -21,6 +21,10 @@ type HasSimpleKey interface {
GetSimpleKey() string
}
type HasSimpleInt64Key interface {
GetSimpleKey() int64
}
type MapConverterPtr[T any] interface {
MapConverter
*T
@@ -78,6 +82,14 @@ func MakeGenMap[T HasSimpleKey](arr []T) map[string]T {
return rtn
}
func MakeGenMapInt64[T HasSimpleInt64Key](arr []T) map[int64]T {
rtn := make(map[int64]T)
for _, val := range arr {
rtn[val.GetSimpleKey()] = val
}
return rtn
}
func isStructType(rt reflect.Type) bool {
if rt.Kind() == reflect.Struct {
return true
+14 -4
View File
@@ -15,6 +15,7 @@ import (
"sync"
"time"
"github.com/scripthaus-dev/sh2-server/pkg/dbutil"
"github.com/scripthaus-dev/sh2-server/pkg/rtnstate"
"github.com/scripthaus-dev/sh2-server/pkg/scbase"
"github.com/scripthaus-dev/sh2-server/pkg/sstore"
@@ -328,6 +329,11 @@ func finalizeWebScreenUpdate(ctx context.Context, webUpdate *WebShareUpdateType)
return nil
}
type webShareResponseType struct {
Success bool `json:"success"`
Data []*WebShareUpdateResponseType `json:"data"`
}
func DoWebScreenUpdates(authInfo AuthInfo, updateArr []*sstore.ScreenUpdateType) error {
var webUpdates []*WebShareUpdateType
for _, update := range updateArr {
@@ -353,16 +359,23 @@ func DoWebScreenUpdates(authInfo AuthInfo, updateArr []*sstore.ScreenUpdateType)
if err != nil {
return fmt.Errorf("cannot create auth-post-req for %s: %v", WebShareUpdateUrl, err)
}
_, err = doRequest(req, nil)
var resp webShareResponseType
_, err = doRequest(req, &resp)
if err != nil {
return err
}
respMap := dbutil.MakeGenMapInt64(resp.Data)
for _, update := range webUpdates {
err = finalizeWebScreenUpdate(context.Background(), update)
if err != nil {
// ignore this error (nothing to do)
log.Printf("[pcloud] error finalizing web-update: %v\n", err)
}
resp := respMap[update.UpdateId]
if resp == nil {
resp = &WebShareUpdateResponseType{Success: false, Error: "resp not found"}
}
log.Printf("[pcloud] updateid:%d, type:%s %s/%s success:%v err:%v\n", update.UpdateId, update.UpdateType, update.ScreenId, update.LineId, resp.Success, resp.Error)
}
return nil
}
@@ -390,9 +403,6 @@ func StartUpdateWriter() {
}
func computeBackoff(numFailures int) time.Duration {
// TODO remove once API implemented
return time.Hour
switch numFailures {
case 1:
return 100 * time.Millisecond
+17 -4
View File
@@ -25,7 +25,7 @@ type TelemetryInputType struct {
type WebShareUpdateType struct {
ScreenId string `json:"screenid"`
LineId string `json:"lineid"`
UpdateId int64 `json:"-"` // just for internal use
UpdateId int64 `json:"updateid"`
UpdateType string `json:"updatetype"`
Screen *WebShareScreenType `json:"screen,omitempty"`
@@ -38,6 +38,16 @@ type WebShareUpdateType struct {
TermOpts *sstore.TermOpts `json:"termopts,omitempty"`
}
type WebShareUpdateResponseType struct {
UpdateId int64 `json:"updateid"`
Success bool `json:"success"`
Error string `json:"error,omitempty"`
}
func (ur *WebShareUpdateResponseType) GetSimpleKey() int64 {
return ur.UpdateId
}
type WebShareRemotePtr struct {
Alias string `json:"remotealias,omitempty"`
CanonicalName string `json:"remotecanonicalname"`
@@ -72,10 +82,13 @@ func webScreenFromScreen(s *sstore.ScreenType) (*WebShareScreenType, error) {
if s.WebShareOpts.ViewKey == "" {
return nil, fmt.Errorf("invalid screen, no ViewKey")
}
if s.WebShareOpts.ShareName == "" {
return nil, fmt.Errorf("invalid screen, no ShareName")
var shareName string
if s.WebShareOpts.ShareName != "" {
shareName = s.WebShareOpts.ShareName
} else {
shareName = s.Name
}
return &WebShareScreenType{ScreenId: s.ScreenId, ShareName: s.WebShareOpts.ShareName, ViewKey: s.WebShareOpts.ViewKey}, nil
return &WebShareScreenType{ScreenId: s.ScreenId, ShareName: shareName, ViewKey: s.WebShareOpts.ViewKey}, nil
}
type WebShareLineType struct {