From 5e5a6aa53f859fc4fc8ff0c567392483b8d22bd8 Mon Sep 17 00:00:00 2001 From: sawka Date: Fri, 31 Mar 2023 13:25:57 -0700 Subject: [PATCH] do synchronous webscreen delete --- pkg/cmdrunner/cmdrunner.go | 28 +++++++++++++++++++++++++++- pkg/pcloud/pcloud.go | 10 ++++++++++ pkg/sstore/dbops.go | 10 ++++++++-- 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/pkg/cmdrunner/cmdrunner.go b/pkg/cmdrunner/cmdrunner.go index c837b31bb..8b2bd359e 100644 --- a/pkg/cmdrunner/cmdrunner.go +++ b/pkg/cmdrunner/cmdrunner.go @@ -176,6 +176,7 @@ func init() { registerCmdFn("client", ClientCommand) registerCmdFn("client:show", ClientShowCommand) registerCmdFn("client:set", ClientSetCommand) + registerCmdFn("client:notifyupdatewriter", ClientNotifyUpdateWriterCommand) registerCmdFn("telemetry", TelemetryCommand) registerCmdFn("telemetry:on", TelemetryOnCommand) @@ -1691,11 +1692,26 @@ func ScreenWebShareCommand(ctx context.Context, pk *scpacket.FeCommandPacketType } infoWebShareLink = true } else { + screen, err := sstore.GetScreenById(ctx, ids.ScreenId) + if err != nil { + return nil, fmt.Errorf("cannot get screen: %v", err) + } + if screen == nil { + return nil, fmt.Errorf("screen not found") + } + if screen.ShareMode != sstore.ShareModeWeb { + return nil, fmt.Errorf("screen is not currently shared") + } + webUpdate := pcloud.MakeScreenDelUpdate(screen, ids.ScreenId) + err = pcloud.DoSyncWebUpdate(webUpdate) + if err != nil { + return nil, fmt.Errorf("error stopping webshare, error contacting prompt cloud server: %v", err) + } err = sstore.ScreenWebShareStop(ctx, ids.ScreenId) if err != nil { return nil, fmt.Errorf("cannot stop web-sharing screen: %v", err) } - infoMsg = fmt.Sprintf("screen is no longer web shared") + infoMsg = fmt.Sprintf("screen websharing stopped") } screen, err := sstore.GetScreenById(ctx, ids.ScreenId) if err != nil { @@ -2749,6 +2765,16 @@ func ClientCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstor return nil, fmt.Errorf("/client requires a subcommand: %s", formatStrs([]string{"show", "set"}, "or", false)) } +func ClientNotifyUpdateWriterCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstore.UpdatePacket, error) { + sstore.NotifyUpdateWriter() + update := sstore.ModelUpdate{ + Info: &sstore.InfoMsgType{ + InfoMsg: fmt.Sprintf("notified update writer"), + }, + } + return update, nil +} + func boolToStr(v bool, trueStr string, falseStr string) string { if v { return trueStr diff --git a/pkg/pcloud/pcloud.go b/pkg/pcloud/pcloud.go index 9e42bfa77..f75758e0d 100644 --- a/pkg/pcloud/pcloud.go +++ b/pkg/pcloud/pcloud.go @@ -202,6 +202,16 @@ func MakeScreenNewUpdate(screen *sstore.ScreenType, webShareOpts sstore.ScreenWe return rtn } +func MakeScreenDelUpdate(screen *sstore.ScreenType, screenId string) *WebShareUpdateType { + rtn := &WebShareUpdateType{ + ScreenId: screenId, + UpdateId: -1, + UpdateType: sstore.UpdateType_ScreenDel, + UpdateTs: time.Now().UnixMilli(), + } + return rtn +} + func makeWebShareUpdate(ctx context.Context, update *sstore.ScreenUpdateType) (*WebShareUpdateType, error) { rtn := &WebShareUpdateType{ ScreenId: update.ScreenId, diff --git a/pkg/sstore/dbops.go b/pkg/sstore/dbops.go index 4b2b9058e..37caa7ebf 100644 --- a/pkg/sstore/dbops.go +++ b/pkg/sstore/dbops.go @@ -2463,7 +2463,7 @@ func ScreenWebShareStop(ctx context.Context, screenId string) error { } query = `UPDATE screen SET sharemode = ?, webshareopts = ? WHERE screenid = ?` tx.Exec(query, ShareModeLocal, "null", screenId) - insertScreenDelUpdate(tx, screenId) + handleScreenDelUpdate(tx, screenId) return nil }) } @@ -2494,12 +2494,18 @@ func insertScreenNewUpdate(tx *TxWrap, screenId string) { NotifyUpdateWriter() } -func insertScreenDelUpdate(tx *TxWrap, screenId string) { +func handleScreenDelUpdate(tx *TxWrap, screenId string) { query := `DELETE FROM screenupdate WHERE screenid = ?` tx.Exec(query, screenId) query = `DELETE FROM webptypos WHERE screenid = ?` tx.Exec(query, screenId) + // don't insert UpdateType_ScreenDel (we already processed it in cmdrunner) +} + +func insertScreenDelUpdate(tx *TxWrap, screenId string) { + handleScreenDelUpdate(tx, screenId) insertScreenUpdate(tx, screenId, UpdateType_ScreenDel) + // don't insert UpdateType_ScreenDel (we already processed it in cmdrunner) } func insertScreenLineUpdate(tx *TxWrap, screenId string, lineId string, updateType string) {