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

  1. Ensure EnsureInitialData ran before fetching client data
  2. Check the wrapped error: ErrNotFound means the client record is missing
  3. Recreate the client record via a clean relaunch (fresh DB init)
  4. 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

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


AI-assisted analysis of wavetermdev/waveterm@a4447c1563 (2026-09-01). Data as JSON: /api/errors/b33ed261bfd5a947. Report an issue: GitHub.