wavetermdev/waveterm · error
error getting client data: %w
Error message
error getting client data: %w
What it means
Returned when fetching a client's data from the store fails. The underlying error is wrapped with %w.
Source
Thrown at pkg/wcore/wcore.go:103
return firstLaunch, 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
}
func SendWaveObjUpdate(oref waveobj.ORef) {
ctx, cancelFn := context.WithTimeout(context.Background(), 2*time.Second)
defer cancelFn()
// send a waveobj:update event
waveObj, err := wstore.DBGetORef(ctx, oref)
if err != nil {
log.Printf("error getting object for update event: %v", err)
return
}
wps.Broker.Publish(wps.WaveEvent{
Event: wps.Event_WaveObjUpdate,
Scopes: []string{oref.String()},
Data: waveobj.WaveObjUpdate{
UpdateType: waveobj.UpdateType_Update,View on GitHub (pinned to a4447c1563)
Solutions
- Ensure EnsureInitialData ran before fetching client data
- Check the wrapped error: ErrNotFound means the client record is missing
- Recreate the client record via a clean relaunch (fresh DB init)
- Verify only one Wave process is using the DB
Example fix
// before
client, err := wcore.GetClientData(ctx)
// after
client, err := wcore.GetClientData(ctx)
if errors.Is(err, wstore.ErrNotFound) {
_, err = wcore.EnsureInitialData(ctx)
} Defensive patterns
Strategy: try-catch
Validate before calling
err := wstore.WithAuthR(ctx, func(ctx context.Context) error {
_, err := wstore.DBGetSingleton[*waveobj.Client](ctx)
return err
})
// if errors.Is(err, wstore.ErrNotFound) run EnsureInitialData first Type guard
func clientReady(ctx context.Context) bool {
_, err := wstore.DBGetSingleton[*waveobj.Client](ctx)
return err == nil
} Try / catch
client, err := wcore.GetClientData(ctx)
if errors.Is(err, wstore.ErrNotFound) {
_, err = wcore.EnsureInitialData(ctx)
} Prevention
- Always run EnsureInitialData before touching client data
- Check for ErrNotFound to distinguish missing vs broken DB
- Serialize startup across goroutines
- Guard against double initialization
When it happens
Trigger: wstore.DBGetSingleton[*waveobj.Client] fails — the client record does not exist yet (called before EnsureInitialData/CreateClient), the DB query errors, or multiple/unexpected singleton rows exist.
Common situations: Calling GetClientData or CreateWindow/FocusWindow before initialization completed; DB corrupted or wiped mid-session; a race between two startup paths.
Understand the failure class
Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.
Related errors
- error inserting client: %w
- error getting client: %v
- error getting block: %w
- error getting block: %w
- error getting block: %w
AI-assisted analysis of wavetermdev/waveterm@a4447c1563 (2026-09-01).
Data as JSON: /api/errors/b33ed261bfd5a947.
Report an issue: GitHub.