Files
lancedb/docs/src/js/classes/BlobFile.md
T
Bilal Atique 4e3ec7cc27 feat(node): expose seek, tell, bounded read, readRanges and close on BlobFile (#4348)
Closes #4300.

The TypeScript `BlobFile` only had `size()`, `read()` and `readRange()`,
while the Rust `BlobFile` behind it also has `seek`, `tell`,
`read_up_to`, `read_ranges` and `close`. This exposes those on the Node
binding:

- `read(maxBytes?)` reads at most `maxBytes` from the cursor (Rust
`read_up_to`). Without the argument it reads to the end, as before.
- `readRanges([{ start, end }, ...])` reads several half-open ranges and
returns one buffer per range, in order. Like `readRange`, it does not
move the cursor.
- `seek(position)` and `tell()` move and report the cursor.
- `close()` releases the handle, and `isClosed()` reports it. Every
read, `seek` and `tell` after `close()` fails with "blob file is already
closed". A second `close()` does nothing. The binding keeps its own
`closed` flag, the same way the Python `BlobFile` does.

Offsets and lengths are `bigint`, like `readRange` and `size()`.
`BlobRange` is exported as a type.

The new tests in `table.test.ts` cover chunked reads with
`read(maxBytes)`, `seek` and `tell`, a negative seek position,
`readRanges` order and cursor, a `readRanges` end past the blob size,
and reads after `close()`. The Node docs under `docs/src/js` are
regenerated with `pnpm run docs`.

I left the `ReadableStream`/async iterator idea from the issue out of
this PR. The AbortSignal work in #4288 touches the same methods, so it
can follow on top of this.
2026-09-29 11:32:30 -05:00

2.0 KiB

@lancedb/lancedb • Docs


@lancedb/lancedb / BlobFile

Class: BlobFile

A lazy handle to blob bytes. Create one with Table.fetchBlobFiles.

Methods

close()

close(): Promise<void>

Releases the handle. Reads after close() fail. Calling it again does nothing.

Returns

Promise<void>


isClosed()

isClosed(): boolean

Returns true after BlobFile.close.

Returns

boolean


read()

read(maxBytes?): Promise<Buffer>

Reads from the cursor and advances the cursor.

Reads to the end when maxBytes is omitted, or at most maxBytes bytes otherwise. Returns an empty buffer at the end of the blob. BlobFile.readRange does not move the cursor.

Parameters

  • maxBytes?: bigint

Returns

Promise<Buffer>


readRange()

readRange(start, end): Promise<Buffer>

Reads the half-open byte range [start, end).

Fails when end is past the blob size. Does not move the cursor.

Parameters

  • start: bigint

  • end: bigint

Returns

Promise<Buffer>


readRanges()

readRanges(ranges): Promise<Buffer[]>

Reads several half-open byte ranges. Returns one buffer per range, in the order given.

Fails when any end is past the blob size. Does not move the cursor.

Parameters

Returns

Promise<Buffer[]>


seek()

seek(position): Promise<void>

Moves the cursor to position, in bytes from the start of the blob.

Parameters

  • position: bigint

Returns

Promise<void>


size()

size(): bigint

Returns the blob size in bytes.

Returns

bigint


tell()

tell(): Promise<bigint>

Returns the cursor position in bytes.

Returns

Promise<bigint>