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) }