wavetermdev/waveterm · info · ErrBOF

beginning of file

Error message

beginning of file

What it means

ErrBOF ("beginning of file") is a sentinel error in the logview multibuf package. Backward-scanning APIs (PrevLinePtr, Move, PrevLine) return it when the caller asks to move before offset 0 of the file, i.e. there is no earlier line to read. It is a normal, expected signal — not a failure — that the scan has hit the start of the file.

Solutions

  1. Check for errors.Is(err, logview.ErrBOF) after each backward step and treat it as the stop condition of your scan loop, not as a failure.
  2. Clamp or validate the target offset before calling Move/PrevLinePtr so it never goes below 0.
  3. Ensure the *os.File passed to MakeMultiBufferByteGetter is valid and opened for reading so offsets behave as expected.

Example fix

// before
line, err := mb.PrevLinePtr(off)
if err != nil {
    return err
}
// after
line, err := mb.PrevLinePtr(off)
if errors.Is(err, logview.ErrBOF) {
    return nil // reached start of file; stop scanning
}
if err != nil {
    return err
}
Defensive patterns

Strategy: try-catch

Validate before calling

if targetOffset < 0 {
    // skip backward scan; already at start of file
}

Type guard

func isBOF(err error) bool { return errors.Is(err, logview.ErrBOF) }

Try / catch

line, err := mb.PrevLinePtr(off)
if errors.Is(err, logview.ErrBOF) {
    return io.EOF // normalize to standard end/edge-of-input signal
}
if err != nil {
    return err
}

Prevention

When it happens

Trigger: Calling PrevLinePtr/PrevLine repeatedly until the iterator is already at offset 0, or calling Move with a negative target offset below 0 on a MultiBufferByteGetter reading a log file.

Common situations: Tail/grep-style log viewers that page backwards through a log and read past the first line; scanning a small file where the requested lookback window exceeds the file size.

Related errors


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

Appendix: source

Thrown at pkg/util/logview/multibuf.go:20

// SPDX-License-Identifier: Apache-2.0

package logview

import (
	"errors"
	"io"
	"os"
)

type MultiBufferByteGetter struct {
	File    *os.File
	Offset  int64
	EOF     bool
	Buffers [][]byte
	BufSize int64
}

var ErrBOF = errors.New("beginning of file")

func MakeMultiBufferByteGetter(file *os.File, bufSize int64) *MultiBufferByteGetter {
	return &MultiBufferByteGetter{
		File:    file,
		Offset:  0,
		EOF:     false,
		Buffers: [][]byte{},
		BufSize: bufSize,
	}
}

func (mb *MultiBufferByteGetter) readFromBuffer(offset int64) (byte, bool) {
	if offset < mb.Offset || offset >= mb.Offset+int64(mb.bufSize()) {
		return 0, false
	}
	bufIdx := int((offset - mb.Offset) / mb.BufSize)
	bufOffset := (offset - mb.Offset) % mb.BufSize
	return mb.Buffers[bufIdx][bufOffset], true

View on GitHub (pinned to a4447c1563)