---
url: >-
  https://adk.nht.io/api/@nhtio/adk/batteries/storage/opfs/classes/OpfsSpoolReader.md
description: 'Reads an OPFS-backed file as a {@link @nhtio/adk!SpoolReader}.'
---

# Class: OpfsSpoolReader

Defined in: [batteries/storage/opfs/index.ts:226](https://github.com/NHTIO/ADK/blob/v1.20260605.0/src/batteries/storage/opfs/index.ts#L226)

Reads an OPFS-backed file as a [@nhtio/adk!SpoolReader](../../../../spooled_artifact/interfaces/SpoolReader.md).

## Remarks

Constructor is **not** async — but the first method call awaits a private readiness promise
that fetches the underlying `File` (and in eager mode, its contents). Subsequent calls reuse
the cached state. This keeps construction call sites synchronous while still doing real I/O
lazily.

All four `SpoolReader` methods on this reader return promises. The `SpoolReader` contract
supports both sync and async return; consumers of `SpooledArtifact` handle either.

## Implements

* [`SpoolReader`](../../../../spooled_artifact/interfaces/SpoolReader.md)

## Constructors

### Constructor

```ts
new OpfsSpoolReader(handle: OpfsFileHandle, opts?: OpfsSpoolReaderOptions): OpfsSpoolReader;
```

Defined in: [batteries/storage/opfs/index.ts:231](https://github.com/NHTIO/ADK/blob/v1.20260605.0/src/batteries/storage/opfs/index.ts#L231)

#### Parameters

| Parameter | Type                                                                |
| --------- | ------------------------------------------------------------------- |
| `handle`  | [`OpfsFileHandle`](../interfaces/OpfsFileHandle.md)                 |
| `opts`    | [`OpfsSpoolReaderOptions`](../interfaces/OpfsSpoolReaderOptions.md) |

#### Returns

`OpfsSpoolReader`

## Methods

### byteLength()

```ts
byteLength(): Promise<number>;
```

Defined in: [batteries/storage/opfs/index.ts:263](https://github.com/NHTIO/ADK/blob/v1.20260605.0/src/batteries/storage/opfs/index.ts#L263)

Returns the total number of bytes in the underlying data.

#### Returns

`Promise`<`number`>

The byte length of the underlying data.

#### Remarks

Used for reporting and token-estimation purposes. Byte length is distinct from character
length for multi-byte encodings.

#### Implementation of

[`SpoolReader`](../../../../spooled_artifact/interfaces/SpoolReader.md).[`byteLength`](../../../../spooled_artifact/interfaces/SpoolReader.md#bytelength)

***

### line()

```ts
line(index: number): Promise<string | undefined>;
```

Defined in: [batteries/storage/opfs/index.ts:256](https://github.com/NHTIO/ADK/blob/v1.20260605.0/src/batteries/storage/opfs/index.ts#L256)

Returns the line at the given 0-based index, or `undefined` when out of range.

#### Parameters

| Parameter | Type     | Description         |
| --------- | -------- | ------------------- |
| `index`   | `number` | 0-based line index. |

#### Returns

`Promise`<`string` | `undefined`>

The raw line string (without trailing newline), or `undefined`.

#### Implementation of

[`SpoolReader`](../../../../spooled_artifact/interfaces/SpoolReader.md).[`line`](../../../../spooled_artifact/interfaces/SpoolReader.md#line)

***

### lineCount()

```ts
lineCount(): Promise<number>;
```

Defined in: [batteries/storage/opfs/index.ts:268](https://github.com/NHTIO/ADK/blob/v1.20260605.0/src/batteries/storage/opfs/index.ts#L268)

Returns the total number of lines in the underlying data.

#### Returns

`Promise`<`number`>

The total line count.

#### Remarks

Required so consumers know when to stop iterating; the line count must remain stable for the
lifetime of the reader.

#### Implementation of

[`SpoolReader`](../../../../spooled_artifact/interfaces/SpoolReader.md).[`lineCount`](../../../../spooled_artifact/interfaces/SpoolReader.md#linecount)

***

### readAll()

```ts
readAll(): Promise<string>;
```

Defined in: [batteries/storage/opfs/index.ts:282](https://github.com/NHTIO/ADK/blob/v1.20260605.0/src/batteries/storage/opfs/index.ts#L282)

Returns the full underlying content as a single decoded string, byte-faithful to the source.

#### Returns

`Promise`<`string`>

#### Remarks

In **eager mode** the content is already cached at first-call load and this method is
effectively a property access. In **streaming mode** there is no cache: the file is re-read
(as a single `File.text()` call) on every invocation. Use `SpooledArtifact.asString()`
judiciously on large streaming-mode artifacts.

#### Implementation of

[`SpoolReader`](../../../../spooled_artifact/interfaces/SpoolReader.md).[`readAll`](../../../../spooled_artifact/interfaces/SpoolReader.md#readall)

***

### isOpfsSpoolReader()

```ts
static isOpfsSpoolReader(value: unknown): value is OpfsSpoolReader;
```

Defined in: [batteries/storage/opfs/index.ts:252](https://github.com/NHTIO/ADK/blob/v1.20260605.0/src/batteries/storage/opfs/index.ts#L252)

Returns `true` if `value` is an OpfsSpoolReader instance.

#### Parameters

| Parameter | Type      | Description        |
| --------- | --------- | ------------------ |
| `value`   | `unknown` | The value to test. |

#### Returns

`value is OpfsSpoolReader`

`true` when `value` is an OpfsSpoolReader instance.

#### Remarks

Uses [@nhtio/adk!isInstanceOf](../../../../guards/functions/isInstanceOf.md) for cross-realm safety.
