# FrameWriter

URL: https://www.caprid.com/docs/reference/typescript/caprid/relay/media/interfaces/framewriter/

Defined in: [relay-sdks/ts/src/frame-writer.ts:69](https://github.com/caprids/relay-sdks/blob/main/ts/src/frame-writer.ts#L69)

Maps encoded frames onto a registered track's groups, one frame at a time. Create one with
[createFrameWriter](https://www.caprid.com/docs/reference/typescript/caprid/relay/media/functions/createframewriter/).

## Type Parameters

| Type Parameter | Default type |
| ------ | ------ |
| <a id="type-parameter-f"></a> `F` *extends* [`Frame`](https://www.caprid.com/docs/reference/typescript/caprid/relay/media/interfaces/frame/) | [`Frame`](https://www.caprid.com/docs/reference/typescript/caprid/relay/media/interfaces/frame/) |

## Properties

### backlog

```ts
readonly backlog: number;
```

Defined in: [relay-sdks/ts/src/frame-writer.ts:92](https://github.com/caprids/relay-sdks/blob/main/ts/src/frame-writer.ts#L92)

Frames waiting behind the one being written.

***

### closed

```ts
readonly closed: boolean;
```

Defined in: [relay-sdks/ts/src/frame-writer.ts:84](https://github.com/caprids/relay-sdks/blob/main/ts/src/frame-writer.ts#L84)

True once [close](https://www.caprid.com/docs/reference/typescript/caprid/relay/media/interfaces/framewriter/#close) ran or the track ended under the writer.

***

### ended

```ts
readonly ended: 
  | RelayError
  | undefined;
```

Defined in: [relay-sdks/ts/src/frame-writer.ts:86](https://github.com/caprids/relay-sdks/blob/main/ts/src/frame-writer.ts#L86)

The failure that ended the track, once a write has seen it; `undefined` while the track is open.

***

### groups

```ts
readonly groups: number;
```

Defined in: [relay-sdks/ts/src/frame-writer.ts:88](https://github.com/caprids/relay-sdks/blob/main/ts/src/frame-writer.ts#L88)

Groups opened so far.

***

### keyframeNeeded

```ts
readonly keyframeNeeded: boolean;
```

Defined in: [relay-sdks/ts/src/frame-writer.ts:98](https://github.com/caprids/relay-sdks/blob/main/ts/src/frame-writer.ts#L98)

Whether the next frame the writer can send must be a keyframe: from the start until a keyframe arrives, and again
after a relay demand change, an interruption, a stale or discontinuous frame, or a drop. Always false under frame
grouping. Check it before each `encode()`.

***

### objects

```ts
readonly objects: number;
```

Defined in: [relay-sdks/ts/src/frame-writer.ts:90](https://github.com/caprids/relay-sdks/blob/main/ts/src/frame-writer.ts#L90)

Objects the transport accepted so far.

## Methods

### close()

```ts
close(): Promise<void>;
```

Defined in: [relay-sdks/ts/src/frame-writer.ts:82](https://github.com/caprids/relay-sdks/blob/main/ts/src/frame-writer.ts#L82)

Drop the backlog, FIN the open group once the frame being written settles, and refuse further frames. Idempotent.
A `RelayError` from that FIN is swallowed: the group was abandoned either way. The registered track stays the
application's to close.

#### Returns

`Promise`\<`void`\>

***

### write()

```ts
write(frame): Promise<FrameOutcome>;
```

Defined in: [relay-sdks/ts/src/frame-writer.ts:76](https://github.com/caprids/relay-sdks/blob/main/ts/src/frame-writer.ts#L76)

Send one frame if the relay wants it, and say what happened. May be called without awaiting the previous call:
frames are served in call order, and those waiting are the backlog. Resolves when the transport accepted the
object, or as soon as the frame is known not to be sent. Rejects with `CLOSED` after [close](https://www.caprid.com/docs/reference/typescript/caprid/relay/media/interfaces/framewriter/#close); a track that
ended on its own is an `'ended'` outcome instead, because the encoder keeps producing.

#### Parameters

| Parameter | Type |
| ------ | ------ |
| `frame` | `F` |

#### Returns

`Promise`\<[`FrameOutcome`](https://www.caprid.com/docs/reference/typescript/caprid/relay/media/interfaces/frameoutcome/)\>
