mirror of
https://github.com/wavetermdev/waveterm.git
synced 2024-12-21 16:38:23 +01:00
c5501a5335
Moves the wlayout package contents to wcore to prevent import cycles. Moves the layout calls to other wcore functions instead of being handled by the services. Removes redundant CreateTab in EnsureInitialData and adds a isInitialLaunch flag to the CreateTab and CreateWorkspace functions to ensure that the initial tab is pinned and does not have the initial tab layout (since the starter layout gets applied later)
87 lines
2.4 KiB
Go
87 lines
2.4 KiB
Go
// Copyright 2024, Command Line Inc.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
// wave core application coordinator
|
|
package wcore
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
|
|
"github.com/wavetermdev/waveterm/pkg/waveobj"
|
|
"github.com/wavetermdev/waveterm/pkg/wstore"
|
|
)
|
|
|
|
// the wcore package coordinates actions across the storage layer
|
|
// orchestrating the wave object store, the wave pubsub system, and the wave rpc system
|
|
|
|
// Ensures that the initial data is present in the store, creates an initial window if needed
|
|
func EnsureInitialData() error {
|
|
// does not need to run in a transaction since it is called on startup
|
|
ctx, cancelFn := context.WithTimeout(context.Background(), 2*time.Second)
|
|
defer cancelFn()
|
|
client, err := wstore.DBGetSingleton[*waveobj.Client](ctx)
|
|
if err == wstore.ErrNotFound {
|
|
client, err = CreateClient(ctx)
|
|
if err != nil {
|
|
return fmt.Errorf("error creating client: %w", err)
|
|
}
|
|
migrateErr := wstore.TryMigrateOldHistory()
|
|
if migrateErr != nil {
|
|
log.Printf("error migrating old history: %v\n", migrateErr)
|
|
}
|
|
}
|
|
if client.TempOID == "" {
|
|
log.Println("client.TempOID is empty")
|
|
client.TempOID = uuid.NewString()
|
|
err = wstore.DBUpdate(ctx, client)
|
|
if err != nil {
|
|
return fmt.Errorf("error updating client: %w", err)
|
|
}
|
|
}
|
|
log.Printf("clientid: %s\n", client.OID)
|
|
if len(client.WindowIds) == 1 {
|
|
log.Println("client has one window")
|
|
CheckAndFixWindow(ctx, client.WindowIds[0])
|
|
return nil
|
|
}
|
|
if len(client.WindowIds) > 0 {
|
|
log.Println("client has windows")
|
|
return nil
|
|
}
|
|
log.Println("client has no windows, creating starter workspace")
|
|
starterWs, err := CreateWorkspace(ctx, "Starter workspace", "circle", "green", true)
|
|
if err != nil {
|
|
return fmt.Errorf("error creating starter workspace: %w", err)
|
|
}
|
|
_, err = CreateWindow(ctx, nil, starterWs.OID)
|
|
if err != nil {
|
|
return fmt.Errorf("error creating window: %w", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func CreateClient(ctx context.Context) (*waveobj.Client, error) {
|
|
client := &waveobj.Client{
|
|
OID: uuid.NewString(),
|
|
WindowIds: []string{},
|
|
}
|
|
err := wstore.DBInsert(ctx, client)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error inserting client: %w", err)
|
|
}
|
|
return client, nil
|
|
}
|
|
|
|
func GetClientData(ctx context.Context) (*waveobj.Client, error) {
|
|
clientData, err := wstore.DBGetSingleton[*waveobj.Client](ctx)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error getting client data: %w", err)
|
|
}
|
|
return clientData, nil
|
|
}
|