# createReplaceableTrack

URL: https://www.caprid.com/docs/reference/typescript/caprid/relay/media/functions/createreplaceabletrack/

```ts
function createReplaceableTrack<F>(publisher, options): ReplaceableTrack<F>;
```

Defined in: [relay-sdks/ts/src/replaceable-track.ts:132](https://github.com/caprids/relay-sdks/blob/main/ts/src/replaceable-track.ts#L132)

Publish a track that can be replaced by a new one, listed in the catalog in its place (spec/media-layer.md, "Track
replacement"). msf-01 §5.3 makes a changed track a new name; a listener that sees the catalog list a new track in
place of the one it plays (`@caprid/moq-media`'s `findReplacementTrack`) drops the old track's audio and plays the
new one.

```ts
const catalog = createDocumentService(publisher.registerTrack({ track: CATALOG_TRACK }));
void catalog.serve();
const reply = createReplaceableTrack(publisher, {
  track: AUDIO_TRACK,
  trackProperties: locTrackProperties(),
  catalog: { service: catalog, build: (name) => buildMsfCatalog({ namespace, media: [{ role: 'audio', name }] }) },
});
void reply.write(frame);
// Talked over: the reply so far is dropped, and the next one goes out on a new track.
await reply.replace();
```

## 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/) |

## Parameters

| Parameter | Type |
| ------ | ------ |
| `publisher` | `Pick`\<[`RelayPublisher`](https://www.caprid.com/docs/reference/typescript/caprid/relay/index/interfaces/relaypublisher/), `"registerTrack"`\> |
| `options` | [`ReplaceableTrackOptions`](https://www.caprid.com/docs/reference/typescript/caprid/relay/media/interfaces/replaceabletrackoptions/)\<`F`\> |

## Returns

[`ReplaceableTrack`](https://www.caprid.com/docs/reference/typescript/caprid/relay/media/interfaces/replaceabletrack/)\<`F`\>
