mirror of
https://github.com/wavetermdev/waveterm.git
synced 2024-12-22 16:48:23 +01:00
7e49e14977
There was a bug in main-server where we were returning Window from EnsureInitialData and then overwriting the layout on the active tab. The return values from this function are unclear. Some of the initial data was being set in the wcore.EnsureInitialData and some was being set in main, so I've moved all the logic into EnsureInitialData and now it just returns error.
92 lines
2.6 KiB
Go
92 lines
2.6 KiB
Go
package wcore
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/wavetermdev/waveterm/pkg/blockcontroller"
|
|
"github.com/wavetermdev/waveterm/pkg/panichandler"
|
|
"github.com/wavetermdev/waveterm/pkg/telemetry"
|
|
"github.com/wavetermdev/waveterm/pkg/waveobj"
|
|
"github.com/wavetermdev/waveterm/pkg/wps"
|
|
"github.com/wavetermdev/waveterm/pkg/wshrpc"
|
|
"github.com/wavetermdev/waveterm/pkg/wstore"
|
|
)
|
|
|
|
func CreateSubBlock(ctx context.Context, blockId string, blockDef *waveobj.BlockDef) (*waveobj.Block, error) {
|
|
if blockDef == nil {
|
|
return nil, fmt.Errorf("blockDef is nil")
|
|
}
|
|
if blockDef.Meta == nil || blockDef.Meta.GetString(waveobj.MetaKey_View, "") == "" {
|
|
return nil, fmt.Errorf("no view provided for new block")
|
|
}
|
|
blockData, err := wstore.CreateSubBlock(ctx, blockId, blockDef)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error creating sub block: %w", err)
|
|
}
|
|
return blockData, nil
|
|
}
|
|
|
|
func CreateBlock(ctx context.Context, tabId string, blockDef *waveobj.BlockDef, rtOpts *waveobj.RuntimeOpts) (*waveobj.Block, error) {
|
|
if blockDef == nil {
|
|
return nil, fmt.Errorf("blockDef is nil")
|
|
}
|
|
if blockDef.Meta == nil || blockDef.Meta.GetString(waveobj.MetaKey_View, "") == "" {
|
|
return nil, fmt.Errorf("no view provided for new block")
|
|
}
|
|
blockData, err := wstore.CreateBlock(ctx, tabId, blockDef, rtOpts)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error creating block: %w", err)
|
|
}
|
|
go func() {
|
|
defer panichandler.PanicHandler("CreateBlock:telemetry")
|
|
blockView := blockDef.Meta.GetString(waveobj.MetaKey_View, "")
|
|
if blockView == "" {
|
|
return
|
|
}
|
|
tctx, cancelFn := context.WithTimeout(context.Background(), 2*time.Second)
|
|
defer cancelFn()
|
|
telemetry.UpdateActivity(tctx, wshrpc.ActivityUpdate{
|
|
Renderers: map[string]int{blockView: 1},
|
|
})
|
|
}()
|
|
return blockData, nil
|
|
}
|
|
|
|
func DeleteBlock(ctx context.Context, blockId string) error {
|
|
block, err := wstore.DBMustGet[*waveobj.Block](ctx, blockId)
|
|
if err != nil {
|
|
return fmt.Errorf("error getting block: %w", err)
|
|
}
|
|
if block == nil {
|
|
return nil
|
|
}
|
|
if len(block.SubBlockIds) > 0 {
|
|
for _, subBlockId := range block.SubBlockIds {
|
|
err := DeleteBlock(ctx, subBlockId)
|
|
if err != nil {
|
|
return fmt.Errorf("error deleting subblock %s: %w", subBlockId, err)
|
|
}
|
|
}
|
|
}
|
|
err = wstore.DeleteBlock(ctx, blockId)
|
|
if err != nil {
|
|
return fmt.Errorf("error deleting block: %w", err)
|
|
}
|
|
go blockcontroller.StopBlockController(blockId)
|
|
sendBlockCloseEvent(blockId)
|
|
return nil
|
|
}
|
|
|
|
func sendBlockCloseEvent(blockId string) {
|
|
waveEvent := wps.WaveEvent{
|
|
Event: wps.Event_BlockClose,
|
|
Scopes: []string{
|
|
waveobj.MakeORef(waveobj.OType_Block, blockId).String(),
|
|
},
|
|
Data: blockId,
|
|
}
|
|
wps.Broker.Publish(waveEvent)
|
|
}
|