Skip to main content

Interface: RnMediaCast

Defined in: packages/cast/src/specs/cast.nitro.ts:313

First-party binding over the official Google Cast sender SDKs (play-services-cast-framework on Android, google-cast-sdk on iOS), audio-scoped.

Threading contract

Every CastContext/GCKCastContext touch happens on the platform main thread — both SDKs require it — via an internal main-thread trampoline; no method here may be assumed to run on the JS thread natively. Promises resolve from the main thread; Nitro schedules JS callbacks onto the JS thread itself (nitro.margelo.com/docs/types/callbacks).

Error contract

Rejections carry a [code] message prefix from the closed set in src/errors.ts (no-session, load-failed, …). The TS facade parses the prefix into a typed CastError; nothing in JS should match on prose.

Listener registration is id-based (Nitro callbacks are opaque native closures; identity comparison across the bridge is not dependable) — same contract as @afkcodes/timbre-audio-session.

Extends

  • HybridObject<{ android: "kotlin"; ios: "swift"; }>

Properties

name

readonly name: string;

Defined in: node_modules/react-native-nitro-modules/lib/typescript/HybridObject.d.ts:52

The HybridObject's name.

Inherited from

HybridObject.name

Methods

addCastStateListener()

addCastStateListener(listener: (event: NativeCastStateEvent) => void): number;

Defined in: packages/cast/src/specs/cast.nitro.ts:525

Parameters

ParameterType
listener(event: NativeCastStateEvent) => void

Returns

number


addDevicesListener()

addDevicesListener(listener: (event: NativeCastDevicesEvent) => void): number;

Defined in: packages/cast/src/specs/cast.nitro.ts:531

Parameters

ParameterType
listener(event: NativeCastDevicesEvent) => void

Returns

number


addDeviceVolumeListener()

addDeviceVolumeListener(listener: (event: NativeDeviceVolumeEvent) => void): number;

Defined in: packages/cast/src/specs/cast.nitro.ts:557

Parameters

ParameterType
listener(event: NativeDeviceVolumeEvent) => void

Returns

number


addMediaErrorListener()

addMediaErrorListener(listener: (event: NativeCastMediaErrorEvent) => void): number;

Defined in: packages/cast/src/specs/cast.nitro.ts:549

Receiver-side media failures. Fires on both platforms — see NativeCastMediaErrorEvent for how (and for the Android-only detail fields).

A single failure reaches JS on two channels (this one and a mediaStatus with idleReason: 'error'); the Cast.addListener('error', …) facade de-duplicates them into one CastError. Subscribe to that, not to this, unless you are driving the hybrid object directly.

Parameters

ParameterType
listener(event: NativeCastMediaErrorEvent) => void

Returns

number


addMediaStatusListener()

addMediaStatusListener(listener: (event: NativeCastMediaStatusEvent) => void): number;

Defined in: packages/cast/src/specs/cast.nitro.ts:534

Parameters

ParameterType
listener(event: NativeCastMediaStatusEvent) => void

Returns

number


addQueueChangedListener()

addQueueChangedListener(listener: () => void): number;

Defined in: packages/cast/src/specs/cast.nitro.ts:554

Parameters

ParameterType
listener() => void

Returns

number


addSessionListener()

addSessionListener(listener: (event: NativeCastSessionEvent) => void): number;

Defined in: packages/cast/src/specs/cast.nitro.ts:528

Parameters

ParameterType
listener(event: NativeCastSessionEvent) => void

Returns

number


dispose()

dispose(): void;

Defined in: node_modules/react-native-nitro-modules/lib/typescript/HybridObject.d.ts:94

Disposes any resources this HybridObject might hold natively, and releases this HybridObject's NativeState.

After calling (), this object can no longer be used.

Eagerly disposing a HybridObject could be beneficial for a queue-/handler-architecture where a bunch of Hybrid Objects are allocated, and later deallocated once a callback (e.g. a render function) completes.

Returns

void

Note

It is NOT required to call () manually, as the JavaScript Garbage Collector automatically disposes and releases any resources when needed. It is purely optional to eagerly-, and manually-, call () here - use with caution!

Inherited from

HybridObject.dispose

endSession()

endSession(stopReceiver: boolean): Promise<void>;

Defined in: packages/cast/src/specs/cast.nitro.ts:421

End the current session.

Parameters

ParameterTypeDescription
stopReceiverbooleantrue stops receiver playback (the transfer-back-to- local flow: snapshot the position from the last media status first); false disconnects the sender and leaves the receiver playing. Resolves when the session reaches ended.

Returns

Promise<void>


equals()

equals(other: HybridObject<{
android: "kotlin";
ios: "swift";
}>): boolean;

Defined in: node_modules/react-native-nitro-modules/lib/typescript/HybridObject.d.ts:79

Returns whether this HybridObject is the same object as other.

While two HybridObjects might not be equal when compared with ==, they might still hold the same underlying HybridObject, in which case equals(other) will return true.

Parameters

ParameterType
otherHybridObject<{ android: "kotlin"; ios: "swift"; }>

Returns

boolean

Example

const hybridA = SomeModule.getExistingHybridInstance()
const hybridB = SomeModule.getExistingHybridInstance()
console.log(hybridA.equals(hybridB)) // true

Inherited from

HybridObject.equals

fetchQueueSlice()

fetchQueueSlice(startIndex: number, count: number): Promise<CastQueueItemSnapshot[]>;

Defined in: packages/cast/src/specs/cast.nitro.ts:518

Page count rows of the sender-side queue mirror starting at startIndex. Resolves immediately with what the cache holds (resolved: false rows trigger one background fetch); re-read after the next queueChanged event. Deliberately never a chatty per-item RPC.

Parameters

ParameterType
startIndexnumber
countnumber

Returns

Promise<CastQueueItemSnapshot[]>


getApproximatePosition()

getApproximatePosition(): Promise<number>;

Defined in: packages/cast/src/specs/cast.nitro.ts:447

One approximate-position read, projected by the SDK from the last status update (RemoteMediaClient.getApproximateStreamPosition / GCKRemoteMediaClient.approximateStreamPosition). This is a read, not a stream — position is never polled or streamed across the bridge; clients project locally between mediaStatus discontinuities.

Returns

Promise<number>


getCastState()

getCastState(): CastConnectionState;

Defined in: packages/cast/src/specs/cast.nitro.ts:356

Last known connection state, from the native cache. Never blocks. 'unavailable' until initialize has resolved — before init, casting genuinely is not available.

Returns

CastConnectionState


getDevices()

getDevices(): Promise<CastDeviceInfo[]>;

Defined in: packages/cast/src/specs/cast.nitro.ts:378

Snapshot of currently discovered devices.

Returns

Promise<CastDeviceInfo[]>


getDeviceVolume()

getDeviceVolume(): Promise<NativeDeviceVolumeEvent>;

Defined in: packages/cast/src/specs/cast.nitro.ts:476

Returns

Promise<NativeDeviceVolumeEvent>


getQueueItemIds()

getQueueItemIds(): Promise<number[]>;

Defined in: packages/cast/src/specs/cast.nitro.ts:510

All receiver-assigned item ids, in queue order. Cheap (already cached).

Returns

Promise<number[]>


initialize()

initialize(receiverApplicationId?: string): Promise<CastConnectionState>;

Defined in: packages/cast/src/specs/cast.nitro.ts:349

Initialize the Cast framework. Idempotent; safe to call again after an unavailable answer (e.g. after the user installs Play services).

Android: CastContext.getSharedInstance(Context, Executor) — the Task-based variant; the framework is a dynamite module fetched from Play services, so a GMS-less device resolves 'unavailable' instead of crashing. The receiver application id comes from the manifest meta-data our OptionsProvider reads; passing receiverApplicationId here overrides it at runtime (CastContext.setReceiverApplicationId).

iOS: GCKCastContext.setSharedInstanceWith(options) with receiverApplicationId (default: the Default Media Receiver).

CEILING (receiver app id, iOS): the id is fixed at first initialize. GCKCastContext exposes only +setSharedInstanceWithOptions: and +isSharedInstanceInitialized (GoogleCast 4.8.6, GCKCastContext.h) — there is no setReceiverApplicationId, no writable options, and GCKDiscoveryManager has no way to swap its GCKDiscoveryCriteria. So a later initialize with a different id is honoured on Android (CastContext.setReceiverApplicationId, verified with javap against play-services-cast-framework 22.3.1) and cannot be honoured on iOS: the first id wins for the life of the process, and the native side logs a warning rather than failing silently. Pass the id on the first call, or set it in the manifest/plist through the Expo plugin.

NOTE (init timing): Google's guidance is to initialize in application(_:didFinishLaunchingWithOptions:) so the SDK can resume a session the app was killed during. Calling this from JS is later than that — automatic session resumption after process death may be missed until the first initialize of a launch. Documented ceiling, not a bug.

Parameters

ParameterType
receiverApplicationId?string

Returns

Promise<CastConnectionState>


load()

load(source: CastMediaSource, options: CastLoadOptions): Promise<void>;

Defined in: packages/cast/src/specs/cast.nitro.ts:430

Load a single item (MediaLoadRequestData on both platforms — the only non-deprecated load path, and the one that carries credentials). Requires a connected session; rejects [no-session] otherwise.

Parameters

ParameterType
sourceCastMediaSource
optionsCastLoadOptions

Returns

Promise<void>


pause()

pause(): Promise<void>;

Defined in: packages/cast/src/specs/cast.nitro.ts:433

Returns

Promise<void>


play()

play(): Promise<void>;

Defined in: packages/cast/src/specs/cast.nitro.ts:432

Returns

Promise<void>


queueInsert()

queueInsert(items: CastQueueItemInput[], beforeItemId?: number): Promise<void>;

Defined in: packages/cast/src/specs/cast.nitro.ts:494

Insert before beforeItemId, or append when omitted.

Parameters

ParameterType
itemsCastQueueItemInput[]
beforeItemId?number

Returns

Promise<void>


queueJumpTo()

queueJumpTo(itemId: number, position?: number): Promise<void>;

Defined in: packages/cast/src/specs/cast.nitro.ts:505

Jump to a queue item, optionally seeking within it.

Parameters

ParameterType
itemIdnumber
position?number

Returns

Promise<void>


queueLoad()

queueLoad(items: CastQueueItemInput[], options: CastQueueLoadOptions): Promise<void>;

Defined in: packages/cast/src/specs/cast.nitro.ts:488

Replace the receiver queue (MediaLoadRequestData + MediaQueueData on both platforms). Receiver-side advancement (autoplay + preloadTime per item) is what keeps playback going while the phone sleeps.

The receiver queue dies with the session by design; the JS queue stays authoritative and rebuilds it on the next session.

Parameters

ParameterType
itemsCastQueueItemInput[]
optionsCastQueueLoadOptions

Returns

Promise<void>


queueRemove()

queueRemove(itemIds: number[]): Promise<void>;

Defined in: packages/cast/src/specs/cast.nitro.ts:496

Parameters

ParameterType
itemIdsnumber[]

Returns

Promise<void>


queueReorder()

queueReorder(itemIds: number[], beforeItemId?: number): Promise<void>;

Defined in: packages/cast/src/specs/cast.nitro.ts:502

Reorder itemIds (in the given order) to sit before beforeItemId, or at the end when omitted.

Parameters

ParameterType
itemIdsnumber[]
beforeItemId?number

Returns

Promise<void>


queueSetRepeatMode()

queueSetRepeatMode(mode: CastRepeatMode): Promise<void>;

Defined in: packages/cast/src/specs/cast.nitro.ts:507

Parameters

ParameterType
modeCastRepeatMode

Returns

Promise<void>


removeCastStateListener()

removeCastStateListener(listenerId: number): void;

Defined in: packages/cast/src/specs/cast.nitro.ts:526

Parameters

ParameterType
listenerIdnumber

Returns

void


removeDevicesListener()

removeDevicesListener(listenerId: number): void;

Defined in: packages/cast/src/specs/cast.nitro.ts:532

Parameters

ParameterType
listenerIdnumber

Returns

void


removeDeviceVolumeListener()

removeDeviceVolumeListener(listenerId: number): void;

Defined in: packages/cast/src/specs/cast.nitro.ts:560

Parameters

ParameterType
listenerIdnumber

Returns

void


removeMediaErrorListener()

removeMediaErrorListener(listenerId: number): void;

Defined in: packages/cast/src/specs/cast.nitro.ts:552

Parameters

ParameterType
listenerIdnumber

Returns

void


removeMediaStatusListener()

removeMediaStatusListener(listenerId: number): void;

Defined in: packages/cast/src/specs/cast.nitro.ts:537

Parameters

ParameterType
listenerIdnumber

Returns

void


removeQueueChangedListener()

removeQueueChangedListener(listenerId: number): void;

Defined in: packages/cast/src/specs/cast.nitro.ts:555

Parameters

ParameterType
listenerIdnumber

Returns

void


removeSessionListener()

removeSessionListener(listenerId: number): void;

Defined in: packages/cast/src/specs/cast.nitro.ts:529

Parameters

ParameterType
listenerIdnumber

Returns

void


requestSession()

requestSession(deviceId: string): Promise<void>;

Defined in: packages/cast/src/specs/cast.nitro.ts:386

Connect to a device by CastDeviceInfo.id. Resolves when the session reaches started; rejects [session-start-failed] when the platform reports failure. Discovery must be running (the id has to come from somewhere) — see stopDiscovery for the ordering rule.

Parameters

ParameterType
deviceIdstring

Returns

Promise<void>


seek()

seek(position: number, resumeState: CastSeekResumeState): Promise<void>;

Defined in: packages/cast/src/specs/cast.nitro.ts:438

Seek to position seconds.

Parameters

ParameterType
positionnumber
resumeStateCastSeekResumeState

Returns

Promise<void>


setDeviceMuted()

setDeviceMuted(muted: boolean): Promise<void>;

Defined in: packages/cast/src/specs/cast.nitro.ts:475

Parameters

ParameterType
mutedboolean

Returns

Promise<void>


setDeviceVolume()

setDeviceVolume(volume: number): Promise<void>;

Defined in: packages/cast/src/specs/cast.nitro.ts:474

Physical device volume (0..1) — the primary layer. Android: CastSession.setVolume; iOS: GCKCastSession.setDeviceVolume.

CEILING (iOS): the hardware volume buttons cannot drive it. The SDK still ships the switch (GCKCastOptions.physicalVolumeButtonsWillControlDeviceVolume, GCKCastOptions.h, default NO), but Google's own iOS sender guide states the behaviour is "currently not supported for iOS 15+" because of OS changes (https://developers.google.com/cast/docs/ios_sender/integrate) — so this package deliberately leaves the flag off rather than shipping a switch that does nothing. On Android the cast framework routes the volume keys to the receiver for a connected session. This method is the programmatic path, and on iOS it is the only path.

Parameters

ParameterType
volumenumber

Returns

Promise<void>


setStreamMuted()

setStreamMuted(muted: boolean): Promise<void>;

Defined in: packages/cast/src/specs/cast.nitro.ts:456

Parameters

ParameterType
mutedboolean

Returns

Promise<void>


setStreamVolume()

setStreamVolume(volume: number): Promise<void>;

Defined in: packages/cast/src/specs/cast.nitro.ts:455

Receiver stream volume (0..1) — the secondary, app-level layer. Device volume is the primary layer users expect hardware buttons to move.

Parameters

ParameterType
volumenumber

Returns

Promise<void>


showCastPicker()

showCastPicker(): Promise<void>;

Defined in: packages/cast/src/specs/cast.nitro.ts:411

Open the platform's device picker (headless-API path for a cast button).

iOS: GCKCastContext.presentCastDialog(). Android: the androidx MediaRouteChooserDialog over the merged cast selector, from the current Activity. On Android 13+ the system output switcher is additionally reachable from any CastButtonFactory-wired cast icon (our CastOptions enable setShowSystemOutputSwitcherOnCastIconClick) and from the media notification — there is no documented public intent for launching the switcher directly, so this method deliberately sticks to documented API.

Resolves when the picker is shown (not when a device is picked — watch the session events). Rejects [invalid-state] with no foreground Activity (Android).

CEILING (iOS): "shown" is unverifiable. -[GCKCastContext presentCastDialog] returns void (GoogleCast 4.8.6, GCKCastContext+UI.h) — with no key window the SDK simply does nothing and reports nothing, so iOS always resolves. Android can and does reject. Do not treat a resolved promise as "the user saw a picker" on either platform.

Returns

Promise<void>


startDiscovery()

startDiscovery(): Promise<void>;

Defined in: packages/cast/src/specs/cast.nitro.ts:364

Start device discovery. Discovery is battery-expensive (active mDNS scanning) — scope it to "device picker open", never to app lifetime. Android: MediaRouter.addCallback with CALLBACK_FLAG_REQUEST_DISCOVERY | CALLBACK_FLAG_PERFORM_ACTIVE_SCAN; iOS: GCKDiscoveryManager.startDiscovery.

Returns

Promise<void>


stop()

stop(): Promise<void>;

Defined in: packages/cast/src/specs/cast.nitro.ts:435

Stops receiver playback and unloads the media (receiver goes idle).

Returns

Promise<void>


stopDiscovery()

stopDiscovery(): Promise<void>;

Defined in: packages/cast/src/specs/cast.nitro.ts:375

Stop device discovery.

Ordering rule (hard-won, encoded natively too): connect after the picker closes but before stopping discovery. If a session start is in flight when this is called, the native side defers the actual teardown until the session start settles, so MediaRouter cannot drop the route mid-handshake even if the JS caller gets the order wrong.

Returns

Promise<void>


toString()

toString(): string;

Defined in: node_modules/react-native-nitro-modules/lib/typescript/HybridObject.d.ts:64

Returns a string representation of the given HybridObject.

Unless overridden by the HybridObject, this will return the name of the object.

Returns

string

Example

const hybridA = SomeModule.getExistingHybridInstance()
console.log(hybridA.toString()) // [HybridObject HybridA]

Inherited from

HybridObject.toString