-
-This diagram shows the flow of data from the Vision Camera through the `FrameProcessorPlugin` to the `CustomSource`, and finally to the Fishjam SDK.
-
-### Examples
-
-Here are examples illustrating how to implement the above flow for iOS and Android.
-
-
-
-
-
-Follow these steps to implement Vision Camera as a custom source on iOS:
-
-1. Create a CustomSource class that implements the required protocol:
-
-```swift
-import FishjamCloudClient
-
-class WebrtcVisionCameraCustomSource: CustomSource {
- var delegate: CustomSourceDelegate?
-
- let isScreenShare = false
- let metadata = ["type":"camera"].toMetadata()
- let videoParameters = VideoParameters.presetFHD43
-}
-```
-
-2. Create a FrameProcessorPlugin that will extract frames from Vision Camera and pass them to Fishjam SDK:
-
-```swift
-import VisionCamera
-
-public class WebrtcFrameProcessorPlugin: FrameProcessorPlugin {
- static var currentSource: WebrtcVisionCameraCustomSource?
-
- public override func callback(_ frame: Frame, withArguments arguments: [AnyHashable : Any]?) -> Any {
- if let customSource = WebrtcFrameProcessorPlugin.currentSource {
- customSource.delegate?.customSource(customSource, didOutputSampleBuffer: frame.buffer, rotation: .ninety)
- }
- return frame
- }
-}
-```
-
-3. Register the FrameProcessorPlugin with Vision Camera:
- - Follow the [official documentation on registering plugins](https://react-native-vision-camera.com/docs/guides/frame-processors-plugins-ios).
-
-4. Register the CustomSource with Fishjam SDK to create a new track:
-
-```swift
-let source = WebrtcVisionCameraCustomSource()
-
-WebrtcFrameProcessorPlugin.currentSource = source
-
-try await RNFishjamProxy.add(customSource: source)
-```
-
-
-
-
-Follow these steps to implement Vision Camera as a custom source on Android:
-
-1. Create a CustomSource class that implements the required interface:
-
-```kotlin
-import com.fishjamcloud.client.models.CustomSource
-import com.fishjamcloud.client.models.CustomSourceConsumer
-import com.fishjamcloud.client.models.VideoParameters
-import com.fishjamcloud.client.models.Metadata
-
-class WebrtcVisionCameraCustomSource: CustomSource {
- override val isScreenShare = false
- override val metadata: Metadata = mapOf("type" to "camera")
- override val videoParameters = VideoParameters.presetFHD43
-
- var consumer: CustomSourceConsumer? = null
- private set
-
- override fun initialize(consumer: CustomSourceConsumer) {
- this.consumer = consumer
- }
-}
-```
-
-2. Create a FrameProcessorPlugin that will extract frames from Vision Camera and pass them to Fishjam SDK:
-
-```kotlin
-import com.mrousavy.camera.frameprocessors.Frame
-import com.mrousavy.camera.frameprocessors.FrameProcessorPlugin
-import com.mrousavy.camera.frameprocessors.VisionCameraProxy
-
-class WebrtcFrameProcessorPlugin(proxy: VisionCameraProxy, options: Map?): FrameProcessorPlugin() {
- companion object {
- var currentSource: WebrtcVisionCameraCustomSource? = null
- }
-
- override fun callback(frame: Frame, arguments: Map?): Frame {
- currentSource?.consumer?.onImageProxyCaptured(frame.imageProxy)
- return frame
- }
-}
-```
-
-3. Register the FrameProcessorPlugin with Vision Camera:
- - Follow the official documentation on registering plugins [here](https://react-native-vision-camera.com/docs/guides/frame-processors-plugins-android).
-
-4. Register the CustomSource with Fishjam SDK to enable creating tracks using the new source:
-
-```kotlin
-val source = WebrtcVisionCameraCustomSource()
-
-WebrtcFrameProcessorPlugin.currentSource = source
-
-RNFishjamClient.createCustomSource(source)
-```
-
-
-
-
-
-#### Usage
-
-Depending on your React Native setup, create an interface for Javascript to interact with this code. If you're using Expo, we recommend using [Expo Modules](https://docs.expo.dev/modules/overview/). If you're using a bare React Native setup, we recommend using [Turbo Modules](https://reactnative.dev/docs/turbo-native-modules-introduction).
diff --git a/versioned_docs/version-0.23.0/how-to/react-native/installation.mdx b/versioned_docs/version-0.23.0/how-to/react-native/installation.mdx
deleted file mode 100644
index 3ff03257..00000000
--- a/versioned_docs/version-0.23.0/how-to/react-native/installation.mdx
+++ /dev/null
@@ -1,105 +0,0 @@
----
-sidebar_position: 1
----
-
-import Tabs from "@theme/Tabs";
-import TabItem from "@theme/TabItem";
-import InstallPackage from "./_components/install-package.mdx";
-import ConfigurePermissions from "./_components/configure-permissions.mdx";
-
-# Installation
-
-## Optional: Create a New App
-
-
- Follow these steps to create a new mobile app
-
-If you don't have an existing project, you can create a new Expo app using a template
-
-```bash
-npx create-expo-app@latest my-video-app
-```
-
-As the next step, you have to generate native files with the `expo prebuild` command:
-
-```bash
-npx expo prebuild
-```
-
-You can also follow more detailed [Expo instructions](https://docs.expo.dev/get-started/introduction/).
-
-
-
-## Step 1: Install the Package
-
-Install `@fishjam-cloud/react-native-client` with your preferred package manager.
-
-
-
-## Step 2: Configure App Permissions
-
-
-
-## Optional: Request Camera and Microphone Permissions
-
-:::info
-You don’t need to explicitly request permissions as they’re automatically asked for when your app needs them.
-:::
-
-If you want more control, you can use the `useCameraPermissions` and `useMicrophonePermissions` hooks to manage permissions manually. Both hooks return an array with three elements:
-
-1. `permission`: The current permission status
-2. `requestPermission`: A function to request permission
-3. `getPermission`: A function to get the current permission status
-
-Here's an example of how to use both hooks:
-
-```tsx
-import {
- useCameraPermissions,
- useMicrophonePermissions,
-} from "@fishjam-cloud/react-native-client";
-import { useEffect } from "react";
-
-const [cameraPermission, requestCameraPermission, getCameraPermission] =
- useCameraPermissions();
-
-const [
- microphonePermission,
- requestMicrophonePermission,
- getMicrophonePermission,
-] = useMicrophonePermissions();
-
-useEffect(() => {
- requestCameraPermission();
- requestMicrophonePermission();
-}, []);
-```
-
-**Permission Response**
-
-The `permission` object has the following properties:
-
-- `canAskAgain`: Indicates if the user can be asked again for this permission. If `false`, it is recommended to direct the user to Settings app to enable/disable the permission.
-- `expires`: When the permission expires.
-- `granted`: Indicates if the permission is granted.
-- `status`: The current status of the permission.
-
-:::info
-You can control when and how permissions are requested by passing an `options` object to the hook.
-:::
-
-### Customizing Permission Request Behavior
-
-By default, `get` is called automatically (auto fetch is `true`), and `request` is not (auto request is `false`). You can change this behavior:
-
-```tsx
-import { useCameraPermissions } from "@fishjam-cloud/react-native-client";
-// Do not auto-fetch permission status, enable auto-request
-const [permission, requestPermission] = useCameraPermissions({
- get: false, // disables auto-fetch
- request: true, // enables auto-request
-});
-```
-
-Adjust these options to fit your app's needs.
diff --git a/versioned_docs/version-0.23.0/how-to/react-native/list-other-peers.mdx b/versioned_docs/version-0.23.0/how-to/react-native/list-other-peers.mdx
deleted file mode 100644
index 980f7c90..00000000
--- a/versioned_docs/version-0.23.0/how-to/react-native/list-other-peers.mdx
+++ /dev/null
@@ -1,54 +0,0 @@
----
-sidebar_position: 4
----
-
-# List other peers
-
-In order to see other streaming peers, you can use [`usePeers`](../../api/mobile/functions/usePeers). It will return all
-other peers, together with the tracks that they are streaming.
-
-### Example code that show all videos
-
-```tsx
-import React from "react";
-import { View } from "react-native";
-import {
- usePeers,
- VideoRendererView,
-} from "@fishjam-cloud/react-native-client";
-
-export function ShowAllPeers() {
- const { remotePeers, localPeer } = usePeers(); // [!code highlight]
-
- const videoTracks = remotePeers.flatMap(
- (peer) =>
- peer.tracks.filter((track) => track.type === "Video" && track.isActive), // [!code highlight]
- );
- const localTrack = localPeer?.tracks.find((t) => t.type === "Video"); // [!code highlight]
-
- return (
-
- {localTrack && (
-
- )}
- {videoTracks.map((track) => (
-
- ))}
-
- );
-}
-```
-
-:::tip[Enable Picture in Picture]
-
-To allow users to continue watching video in a floating window when they background your app, wrap your video call UI with the `PipContainerView` component. See the [Picture in Picture guide](./picture-in-picture) for more details.
-
-:::
diff --git a/versioned_docs/version-0.23.0/how-to/react-native/metadata.mdx b/versioned_docs/version-0.23.0/how-to/react-native/metadata.mdx
deleted file mode 100644
index 3c4bb899..00000000
--- a/versioned_docs/version-0.23.0/how-to/react-native/metadata.mdx
+++ /dev/null
@@ -1,101 +0,0 @@
----
-sidebar_position: 8
-title: "Metadata"
-description: "How to use metadata"
----
-
-import MetadataHeader from "../_common/metadata/header.mdx";
-import JoiningRoom from "../_common/metadata/joining_room.mdx";
-import UpdatingMetadata from "../_common/metadata/updating.mdx";
-import ReadingMetadata from "../_common/metadata/reading.mdx";
-
-
-
-
-
-```tsx
-const FISHJAM_ID = "fishjam-id";
-const PEER_TOKEN = "some-peer-token";
-// ---cut---
-import React, { useCallback } from "react";
-import { Button } from "react-native";
-import { useConnection } from "@fishjam-cloud/react-native-client";
-
-type PeerMetadata = {
- displayName: string;
-};
-
-export function JoinRoomButton() {
- const { joinRoom } = useConnection();
-
- const onPressJoin = useCallback(async () => {
- await joinRoom({
- fishjamId: FISHJAM_ID,
- peerToken: PEER_TOKEN,
- peerMetadata: { displayName: "John Wick" }, // [!code highlight]
- });
- }, [joinRoom]);
-
- return ;
-}
-```
-
-
-
-
-
-```tsx
-import React, { useCallback } from "react";
-import { Button } from "react-native";
-import { useUpdatePeerMetadata } from "@fishjam-cloud/react-native-client";
-
-type PeerMetadata = {
- displayName: string;
-};
-
-export function UpdateNameButton() {
- const { updatePeerMetadata } = useUpdatePeerMetadata(); // [!code highlight]
-
- const onPressUpdateName = useCallback(async () => {
- await updatePeerMetadata({ displayName: "Thomas A. Anderson" }); // [!code highlight]
- }, [updatePeerMetadata]);
-
- return ;
-}
-```
-
-
-
-
-
-```tsx
-import React from "react";
-import { Text, View } from "react-native";
-import { usePeers } from "@fishjam-cloud/react-native-client";
-
-type PeerMetadata = {
- displayName: string;
-};
-
-type ServerMetadata = {
- realName: string;
-};
-
-export function ListAllNames() {
- const { remotePeers } = usePeers(); // [!code highlight]
-
- return (
-
- {remotePeers.map((peer) => (
- // [!code highlight:4]
-
- Display name: {peer.metadata.peer?.displayName || "Unknown"}
- Real name: {peer.metadata.server?.realName || "Unknown"}
-
- ))}
-
- );
-}
-```
-
-
diff --git a/versioned_docs/version-0.23.0/how-to/react-native/picture-in-picture.mdx b/versioned_docs/version-0.23.0/how-to/react-native/picture-in-picture.mdx
deleted file mode 100644
index 44bbfdf8..00000000
--- a/versioned_docs/version-0.23.0/how-to/react-native/picture-in-picture.mdx
+++ /dev/null
@@ -1,525 +0,0 @@
----
-sidebar_position: 7
----
-
-import Tabs from "@theme/Tabs";
-import TabItem from "@theme/TabItem";
-
-# Picture in Picture
-
-Picture in Picture (PiP) allows your app to display video content in a small window that floats above other apps when the user backgrounds your application. This is especially useful for video calls and livestreaming where users want to multitask while staying connected.
-
-The SDK provides two Picture in Picture modes depending on your use case:
-
-- **Conferencing**: For interactive video calls with multiple participants. Uses a **custom split-screen layout** in the PiP window showing your local camera (left) and the active speaker (right) with automatic voice activity detection.
-- **Livestreaming**: For viewing livestreams. Displays the **full WHEP stream video** in the Picture in Picture window using the native video player's PiP functionality.
-
-Choose the scenario that matches your application below.
-
-## Installation
-
-
-
-
-
-
-
-
-
-You need to modify your `app.json` file and add our plugin with Picture in Picture support:
-
-```json title='app.json'
-{
- "expo": {
- ...
- "plugins": [
- [
- "@fishjam-cloud/react-native-client",
- {
- "android": {
- "supportsPictureInPicture": true
- },
- "ios": {
- "supportsPictureInPicture": true
- }
- }
- ]
- ]
- }
-}
-```
-
-
-
-
-**Android Configuration**
-
-Add the `android:supportsPictureInPicture` attribute to your main activity in `AndroidManifest.xml`:
-
-```xml title='AndroidManifest.xml'
-
-
-
-
-
-
-```
-
-**iOS Configuration**
-
-Add the `audio` background mode to your `Info.plist`:
-
-```xml title='Info.plist'
-UIBackgroundModes
-
- audio
-
-```
-
-
-
-
-
-
-
-
-
-
-
-You need to modify your `app.json` file and add our plugin with Picture in Picture support:
-
-```json title='app.json'
-{
- "expo": {
- ...
- "plugins": [
- [
- "@fishjam-cloud/react-native-client",
- {
- "android": {
- "supportsPictureInPicture": true
- },
- "ios": {
- "supportsPictureInPicture": true
- }
- }
- ]
- ]
- }
-}
-```
-
-
-
-
-**Android Configuration**
-
-Add the `android:supportsPictureInPicture` attribute to your main activity in `AndroidManifest.xml`:
-
-```xml title='AndroidManifest.xml'
-
-
-
-
-
-
-```
-
-**iOS Configuration**
-
-Add the `audio` background mode to your `Info.plist`:
-
-```xml title='Info.plist'
-UIBackgroundModes
-
- audio
-
-```
-
-
-
-
-
-
-
-## Usage
-
-
-
-
-
-### Basic Usage
-
-The [`PipContainerView`](../../api/mobile/interfaces/PipContainerViewProps) component automatically manages Picture in Picture functionality. Simply wrap your video call UI with this component:
-
-```tsx
-import React from "react";
-import { View } from "react-native";
-import { PipContainerView } from "@fishjam-cloud/react-native-client";
-
-export function VideoCallScreen() {
- return (
-
- {/* Your video call UI */}
-
- );
-}
-```
-
-By default, Picture in Picture will start automatically when the app goes to the background and stop when it returns to the foreground.
-
-### Configuration Options
-
-You can customize the Picture in Picture behavior using props on the [`PipContainerView`](../../api/mobile/interfaces/PipContainerViewProps):
-
-```tsx
-import React from "react";
-import { View } from "react-native";
-import { PipContainerView } from "@fishjam-cloud/react-native-client";
-
-export function VideoCallScreen() {
- return (
-
- {/* Your video call UI */}
-
- );
-}
-```
-
-#### Configuration Properties
-
-**startAutomatically**: When `true`, Picture in Picture starts automatically when the app goes to the background. Default: `true`
-
-**stopAutomatically**: When `true`, Picture in Picture stops automatically when the app returns to the foreground. Default: `true`
-
-**allowsCameraInBackground**: **(iOS only)** When `true`, allows the camera to continue running while in Picture in Picture mode. Requires iOS 16.0 or later. Default: `false`
-
-**primaryPlaceholderText**: Text displayed in the left view when the local camera is unavailable. Default: `"No camera"`
-
-**secondaryPlaceholderText**: Text displayed in the right view when no remote speaker is active. Default: `"No active speaker"`
-
-### Manual Control
-
-For more control over when Picture in Picture starts and stops, you can use a ref to manually trigger these actions:
-
-```tsx
-import React, { useRef } from "react";
-import { Button, View } from "react-native";
-import {
- PipContainerView,
- PipContainerViewRef,
-} from "@fishjam-cloud/react-native-client";
-
-export function VideoCallScreen() {
- const pipRef = useRef(null);
-
- const handleStartPip = async () => {
- await pipRef.current?.startPictureInPicture();
- };
-
- const handleStopPip = async () => {
- await pipRef.current?.stopPictureInPicture();
- };
-
- return (
-
-
-
-
- {/* Your video call UI */}
-
-
- );
-}
-```
-
-### Complete Example
-
-Here's a complete example showing Picture in Picture with a video call:
-
-```tsx
-import React from "react";
-import { FlatList, StyleSheet, View } from "react-native";
-import {
- PipContainerView,
- usePeers,
- VideoRendererView,
-} from "@fishjam-cloud/react-native-client";
-
-export function VideoCallScreen() {
- const { localPeer, remotePeers } = usePeers();
-
- return (
-
-
- {/* Render local video */}
- {localPeer?.tracks.map((track) => {
- if (track.type === "Video") {
- return (
-
- );
- }
- })}
-
- {/* Render remote videos */}
- peer.id}
- renderItem={({ item: peer }) => (
-
- {peer.tracks.map((track) => {
- if (track.type === "Video") {
- return (
-
- );
- }
- })}
-
- )}
- />
-
-
- );
-}
-
-const styles = StyleSheet.create({
- container: {
- flex: 1,
- },
- video: {
- width: "100%",
- height: 200,
- },
-});
-```
-
-### Platform-Specific Behavior
-
-Both Android and iOS display a split-screen layout in Picture in Picture mode with your local camera on the left and the active speaker on the right. The active speaker is automatically determined by voice activity detection (VAD).
-
-#### Android
-
-Picture in Picture is supported on Android 8.0 (API level 26) and above. The system automatically manages the PiP window size and position. Users can tap the PiP window to return to your app. On Android 12 (API level 31) and above, automatic Picture in Picture is supported when `startAutomatically` is `true`.
-
-#### iOS
-
-Picture in Picture requires the `audio` background mode. When `allowsCameraInBackground` is enabled, the camera continues to capture in PiP mode (iOS 16.0+). Picture in Picture works seamlessly with CallKit for native call integration.
-
-### Active Speaker Detection
-
-The secondary view (right side) automatically displays the remote participant who is currently speaking, based on voice activity detection (VAD). When no one is speaking, it will show the last active speaker if available, fall back to the first remote participant with a video track, or show the placeholder text if no remote video is available.
-
-This automatic switching ensures the most relevant video is always displayed in the Picture in Picture window.
-
-### Combining with Background Streaming
-
-Picture in Picture works great with [background streaming](./background-streaming). When both features are enabled, use foreground services on **Android** to keep the call active in the background, and use CallKit integration along with VoIP background mode on **iOS**.
-
-Example configuration combining both features:
-
-```json title='app.json (Expo)'
-{
- "expo": {
- "plugins": [
- [
- "@fishjam-cloud/react-native-client",
- {
- "android": {
- "enableForegroundService": true,
- "supportsPictureInPicture": true
- },
- "ios": {
- "enableVoIPBackgroundMode": true,
- "supportsPictureInPicture": true
- }
- }
- ]
- ]
- }
-}
-```
-
-
-
-
-### Basic Usage
-
-```tsx
-import React from "react";
-import { View, StyleSheet } from "react-native";
-import {
- LivestreamViewer,
- useLivestreamViewer,
-} from "@fishjam-cloud/react-native-client/livestream";
-
-export function LivestreamScreen() {
- const { whepClientRef } = useLivestreamViewer();
-
- return (
-
-
-
- );
-}
-
-const styles = StyleSheet.create({
- container: {
- flex: 1,
- },
- viewer: {
- flex: 1,
- },
-});
-```
-
-### Configuration Options
-
-```tsx
-import React from "react";
-import { View, StyleSheet } from "react-native";
-import {
- LivestreamViewer,
- useLivestreamViewer,
-} from "@fishjam-cloud/react-native-client/livestream";
-
-export function LivestreamScreen() {
- const { whepClientRef } = useLivestreamViewer();
-
- return (
-
-
-
- );
-}
-
-const styles = StyleSheet.create({
- container: {
- flex: 1,
- },
- viewer: {
- flex: 1,
- },
-});
-```
-
-#### Configuration Properties
-
-**pipEnabled**: Enable or disable Picture in Picture functionality. Default: `true`
-
-**autoStartPip**: When `true`, Picture in Picture starts automatically when the app goes to the background. Default: `false`
-
-**autoStopPip**: **(iOS only)** When `true`, Picture in Picture stops automatically when the app returns to the foreground. On Android, PiP always stops when returning to foreground. Default: `false`
-
-**pipSize**: An object with `width` and `height` properties to set the aspect ratio of the Picture in Picture window
-
-### Complete Example
-
-Here's a complete example showing how to connect to a livestream and display it with Picture in Picture:
-
-```tsx
-import React, { useEffect } from "react";
-import { View, StyleSheet } from "react-native";
-import {
- LivestreamViewer,
- useLivestreamViewer,
-} from "@fishjam-cloud/react-native-client/livestream";
-import { useSandbox } from "@fishjam-cloud/react-native-client";
-
-export function LivestreamViewerScreen() {
- const { getSandboxViewerToken } = useSandbox({
- fishjamId: "your-fishjam-id",
- });
-
- const { connect, disconnect, whepClientRef } = useLivestreamViewer();
-
- useEffect(() => {
- const connectToStream = async () => {
- try {
- const token = await getSandboxViewerToken("room-name");
- await connect({ token });
- } catch (err) {
- console.error("Failed to connect to livestream:", err);
- }
- };
-
- connectToStream();
-
- return () => {
- disconnect();
- };
- }, []);
-
- return (
-
-
-
- );
-}
-
-const styles = StyleSheet.create({
- container: {
- flex: 1,
- backgroundColor: "#000",
- },
- viewer: {
- flex: 1,
- },
-});
-```
-
-### Platform-Specific Behavior
-
-#### Android
-
-Picture in Picture is supported on Android 8.0 (API level 26) and above. The native video player's PiP window displays the WHEP stream. PiP automatically stops when the app returns to the foreground. Users can tap the PiP window to return to your app.
-
-#### iOS
-
-Picture in Picture requires the `audio` background mode. Uses the native AVPictureInPictureController to display the video. The WHEP stream continues playing in the PiP window. When `autoStopPip` is enabled, PiP stops automatically when returning to the app.
-
-
-
diff --git a/versioned_docs/version-0.23.0/how-to/react-native/start-streaming.mdx b/versioned_docs/version-0.23.0/how-to/react-native/start-streaming.mdx
deleted file mode 100644
index f3212a07..00000000
--- a/versioned_docs/version-0.23.0/how-to/react-native/start-streaming.mdx
+++ /dev/null
@@ -1,109 +0,0 @@
----
-sidebar_position: 3
----
-
-# Start streaming
-
-How to stream your camera
-
-:::tip[Enable devices before connecting]
-
-You can enable your camera and microphone before calling connect method.
-This way, you can show user camera preview. Once connect method is called,
-enabled camera and microphone will start streaming to Room.
-
-:::
-
-## Enable your camera
-
-First, you have to enable your camera by calling [`prepareCamera`](../../api/mobile/functions/useCamera#preparecamera) method.
-You can open show camera preview with [`VideoPreviewView`](../../api/mobile/variables/VideoPreviewView) component
-
-```tsx
-import React, { useEffect } from "react";
-import {
- useCamera,
- VideoPreviewView,
-} from "@fishjam-cloud/react-native-client";
-
-export function ViewPreview() {
- const { prepareCamera } = useCamera(); // [!code highlight]
-
- useEffect(() => {
- prepareCamera({ cameraEnabled: true }); // [!code highlight]
- }, [prepareCamera]);
-
- return ;
-}
-```
-
-### Listing user cameras
-
-To list all cameras available on device, you can use [`cameras`](../../api/mobile/functions/useCamera#cameras) property from [`useCamera`](../../api/mobile/functions/useCamera) hook.
-This way, you can either automatically choose camera (front/back) or allow user to select camera type.
-
-To change camera, simply call [`switchCamera`](../../api/mobile/functions/useCamera#switchcamera) method.
-
-```tsx
-import React, { useCallback } from "react";
-import { Button } from "react-native";
-import { useCamera } from "@fishjam-cloud/react-native-client";
-
-export function FlipButton() {
- const { cameras, switchCamera, currentCamera } = useCamera(); // [!code highlight]
-
- const onPressFlipCamera = useCallback(() => {
- // find first camera facing opposite direction than current camera
- const otherCamera = cameras.find(
- (camera) => camera.facingDirection !== currentCamera?.facingDirection,
- );
- if (otherCamera) {
- switchCamera(otherCamera.id); // [!code highlight]
- }
- }, [cameras, currentCamera?.facingDirection, switchCamera]);
-
- return ;
-}
-```
-
-### Disabling/enabling camera
-
-To change camera state, you use [`toggleCamera`](../../api/mobile/functions/useCamera#togglecamera) method.
-
-```tsx
-import { Button } from "react-native";
-import React from "react";
-import { useCamera } from "@fishjam-cloud/react-native-client";
-
-export function ToggleCameraButton() {
- const { isCameraOn, toggleCamera } = useCamera(); // [!code highlight]
-
- return (
-
- );
-}
-```
-
-## Enable microphone
-
-Microphone works similar to camera. In order to enable it, you have to call [`toggleMicrophone`](../../api/mobile/functions/useMicrophone#togglemicrophone) method.
-
-```tsx
-import { Button } from "react-native";
-import React from "react";
-import { useMicrophone } from "@fishjam-cloud/react-native-client";
-
-export function ToggleMicrophoneButton() {
- const { isMicrophoneOn, toggleMicrophone } = useMicrophone(); // [!code highlight]
-
- return (
-
- );
-}
-```
diff --git a/versioned_docs/version-0.23.0/how-to/react/_category_.json b/versioned_docs/version-0.23.0/how-to/react/_category_.json
deleted file mode 100644
index e4ca8099..00000000
--- a/versioned_docs/version-0.23.0/how-to/react/_category_.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "label": "React/Web",
- "position": 2
-}
diff --git a/versioned_docs/version-0.23.0/how-to/react/_common/metadata/header.mdx b/versioned_docs/version-0.23.0/how-to/react/_common/metadata/header.mdx
deleted file mode 100644
index 1602f006..00000000
--- a/versioned_docs/version-0.23.0/how-to/react/_common/metadata/header.mdx
+++ /dev/null
@@ -1,10 +0,0 @@
-Alongside audio and video, it is possible to send additional metadata with each peer. Metadata is just
-JSON that can contain arbitrary information. Its most common use is sending a user name associated with a peer.
-However, it can be also used to send the peer's camera type, application information etc.
-
-:::info
-
-You can also set metadata on [the server side, when adding user to the room](../backend/server-setup#metadata). This metadata is persistent throughout its lifetime and is useful for attaching information that
-can't be overwritten by the peer, like information about real user names or basic permission info.
-
-:::
diff --git a/versioned_docs/version-0.23.0/how-to/react/_common/metadata/joining_room.mdx b/versioned_docs/version-0.23.0/how-to/react/_common/metadata/joining_room.mdx
deleted file mode 100644
index 517a5b30..00000000
--- a/versioned_docs/version-0.23.0/how-to/react/_common/metadata/joining_room.mdx
+++ /dev/null
@@ -1,5 +0,0 @@
-## Setting metadata when joining the room
-
-The `joinRoom` method from the `useConnection` hook has a `peerMetadata` parameter, that can be used for setting object metadata.
-
-{props.children}
diff --git a/versioned_docs/version-0.23.0/how-to/react/_common/metadata/reading.mdx b/versioned_docs/version-0.23.0/how-to/react/_common/metadata/reading.mdx
deleted file mode 100644
index b0516650..00000000
--- a/versioned_docs/version-0.23.0/how-to/react/_common/metadata/reading.mdx
+++ /dev/null
@@ -1,9 +0,0 @@
-## Reading metadata
-
-Peer metadata is available as the `metadata` property for each peer. Therefore, when you list your peers with the `usePeers` hook, you can read
-the metadata associated with them.
-Note that the `metadata.peer` property contains only the metadata set by the client SDK (as in the examples examples above).
-The metadata set on the server side is available as `metadata.server`.
-Learn more about server metadata [here](../backend/server-setup#metadata).
-
-{props.children}
diff --git a/versioned_docs/version-0.23.0/how-to/react/_common/metadata/updating.mdx b/versioned_docs/version-0.23.0/how-to/react/_common/metadata/updating.mdx
deleted file mode 100644
index 1a56a0f6..00000000
--- a/versioned_docs/version-0.23.0/how-to/react/_common/metadata/updating.mdx
+++ /dev/null
@@ -1,5 +0,0 @@
-## Updating metadata during connection
-
-Once you've joined the room, you can update your peer metadata with `updatePeerMetadata` from `useUpdatePeerMetadata`:
-
-{props.children}
diff --git a/versioned_docs/version-0.23.0/how-to/react/connecting.mdx b/versioned_docs/version-0.23.0/how-to/react/connecting.mdx
deleted file mode 100644
index ca3f0d28..00000000
--- a/versioned_docs/version-0.23.0/how-to/react/connecting.mdx
+++ /dev/null
@@ -1,52 +0,0 @@
----
-sidebar_position: 2
----
-
-# Connecting
-
-## Prerequisites
-
-In order to connect, you need to obtain a **Peer Token** to authorize the peer in your room.
-You can get the token using the [Sandbox API](../../how-to/features/sandbox-api-testing) if you're using the Sandbox environment, or implement your own backend service that will provide the user with a **Peer Token**.
-
-## Connecting
-
-Use the [`useConnection`](../../api/web/functions/useConnection) hook to get
-the [`joinRoom`](../../api/web/functions/useConnection#joinroom) function.
-
-```tsx
-const PEER_TOKEN = "some-peer-token";
-// ---cut-before---
-import { useConnection, useSandbox } from "@fishjam-cloud/react-client";
-import React, { useCallback } from "react";
-
-export function JoinRoomButton() {
- const { joinRoom } = useConnection(); // [!code highlight]
- // get the peer token from sandbox or your backend
- const { getSandboxPeerToken } = useSandbox();
-
- const onJoinRoomPress = useCallback(async () => {
- // [!code highlight:5]
- const peerToken = await getSandboxPeerToken("Room", "User");
- await joinRoom({ peerToken });
- }, [joinRoom]);
-
- return ;
-}
-```
-
-## Disconnecting
-
-In order to close connection, use the [`leaveRoom`](../../api/web/functions/useConnection#leaveroom) method
-from [`useConnection`](../../api/web/functions/useConnection) hook.
-
-```tsx
-import { useConnection } from "@fishjam-cloud/react-client";
-import React, { useCallback } from "react";
-
-export function LeaveRoomButton() {
- const { leaveRoom } = useConnection(); // [!code highlight]
-
- return ;
-}
-```
diff --git a/versioned_docs/version-0.23.0/how-to/react/installation.mdx b/versioned_docs/version-0.23.0/how-to/react/installation.mdx
deleted file mode 100644
index ce903bb7..00000000
--- a/versioned_docs/version-0.23.0/how-to/react/installation.mdx
+++ /dev/null
@@ -1,49 +0,0 @@
----
-sidebar_position: 1
----
-
-import Tabs from "@theme/Tabs";
-import TabItem from "@theme/TabItem";
-
-# Installation
-
-## 1. Install the package
-
-```bash npm2yarn
-npm install @fishjam-cloud/react-client
-```
-
-## 2. Setup Fishjam context
-
-Wrap your app in our [`FishjamProvider`](../../api/web/functions/FishjamProvider) component. Get your Fishjam ID from [Fishjam Dashboard](https://fishjam.io/app) and pass it to the provider.
-
-```tsx
-const App = () => {
- return
Hello world
;
-};
-
-// ---cut---
-import React from "react";
-import ReactDOM from "react-dom/client";
-// import App from "./App";
-import { FishjamProvider } from "@fishjam-cloud/react-client";
-
-// Check https://fishjam.io/app/ for your Fishjam ID
-const FISHJAM_ID = "your-fishjam-id";
-
-ReactDOM.createRoot(document.getElementById("root")!).render(
- // [!code highlight:5]
-
-
-
-
- ,
-);
-```
-
-:::tip
-
-It's possible to have many independent Fishjam contexts in one app.
-Just render many [`FishjamProvider`](../../api/web/functions/FishjamProvider) components and make sure they don't overlap.
-
-:::
diff --git a/versioned_docs/version-0.23.0/how-to/react/list-other-peers.mdx b/versioned_docs/version-0.23.0/how-to/react/list-other-peers.mdx
deleted file mode 100644
index ad5536df..00000000
--- a/versioned_docs/version-0.23.0/how-to/react/list-other-peers.mdx
+++ /dev/null
@@ -1,38 +0,0 @@
----
-sidebar_position: 5
----
-
-# Display media of other peers
-
-To access data and media of other peers, use the [`usePeers`](../../api/web/functions/usePeers) hook.
-It returns two properties, [`remotePeers`](../../api/web/functions/usePeers) and [`localPeer`](../../api/web/functions/usePeers).
-They contain all the tracks of other peers and all the tracks of the local user, respectively.
-
-### Example of playing other peers' available media
-
-```tsx
-import React, { FC } from "react";
-
-const VideoRenderer: FC<{ stream?: MediaStream | null }> = (_) => ;
-
-const AudioPlayer: FC<{ stream?: MediaStream | null }> = (_) => ;
-
-// ---cut---
-import { usePeers } from "@fishjam-cloud/react-client";
-
-export function Component() {
- const { remotePeers } = usePeers();
-
- return (
-
- // remember to import
- your VideoRenderer component
-
-
- ))}
-
- );
-}
-```
diff --git a/versioned_docs/version-0.23.0/how-to/react/managing-devices.mdx b/versioned_docs/version-0.23.0/how-to/react/managing-devices.mdx
deleted file mode 100644
index 38e0a6aa..00000000
--- a/versioned_docs/version-0.23.0/how-to/react/managing-devices.mdx
+++ /dev/null
@@ -1,90 +0,0 @@
----
-sidebar_position: 4
----
-
-# Managing devices
-
-The Fishjam SDK provides functions for dynamically controlling media device streams. This includes selecting desired cameras and microphones, turning them on and off, as well as muting and unmuting microphones.
-
-### Selecting Camera and Microphone - [`selectCamera()`](../../api/web/functions/useCamera#selectcamera) and [`selectMicrophone()`](../../api/web/functions/useMicrophone#selectmicrophone)
-
-To select the desired camera or microphone, use the [`selectCamera()`](../../api/web/functions/useCamera#selectcamera) and [`selectMicrophone()`](../../api/web/functions/useMicrophone#selectmicrophone) functions.
-Lists of the available devices are available via the [`cameraDevices`](../../api/web/functions/useCamera#cameradevices) and [`microphoneDevices`](../../api/web/functions/useMicrophone#microphonedevices) properties.
-
-#### Usage Example
-
-```tsx
-import React from "react";
-import { useCamera } from "@fishjam-cloud/react-client";
-
-export function CameraControl() {
- const { cameraDevices, selectCamera } = useCamera();
-
- return (
-
- {cameraDevices.map(({ deviceId, label }) => (
-
-
-
- ))}
-
- );
-}
-```
-
-### Turning Camera On and Off - [`toggleCamera()`](../../api/web/functions/useCamera#togglecamera)
-
-This function controls the physical operational state of the camera.
-
-- **Turning the camera off**: This action stops the camera device, disables the media stream, and pauses streaming. The webcam indicator light will shut down.
-- **Turning the camera on**: This action starts the camera and resumes streaming, allowing other participants to see video after a brief initialization period.
-
-#### Usage Example
-
-```tsx
-import React from "react";
-import { useCamera } from "@fishjam-cloud/react-client";
-
-export function CameraControl() {
- const { toggleCamera } = useCamera();
-
- return ;
-}
-```
-
-### Turning Microphone On and Off - [`toggleMicrophone()`](../../api/web/functions/useMicrophone#togglemicrophone)
-
-This function toggles the microphone's physical operational state. The function interacts with a physical device, so it might take a noticeable amount of time.
-
-- **Turning the microphone off**: Turns the microphone off, disables the media stream, and pauses any audio transmission.
-- **Turning the microphone on**: Turns the microphone on and resumes audio streaming.
-
-### Muting and Unmuting Microphone - [`toggleMicrophoneMute()`](../../api/web/functions/useMicrophone#togglemicrophonemute)
-
-This function manages the audio stream's operational status without affecting the microphone's hardware state.
-Muting and unmuting is faster, but a muted device still uses resources. This is useful, as it is common to mute and unmute during a meeting. Unmuting needs to be quick to capture the first word of a sentence.
-
-- **Muting the microphone**: This action disables the media stream and stops audio transmission while keeping the microphone active.
-- **Unmuting the microphone**: This action enables the media stream, allowing immediate transmission of sounds.
-
-#### Usage Example
-
-```tsx
-import React from "react";
-import { useMicrophone } from "@fishjam-cloud/react-client";
-
-export function MicrophoneControl() {
- const { toggleMicrophone, toggleMicrophoneMute } = useMicrophone();
-
- return (
-
- );
-}
-```
-
-
diff --git a/versioned_docs/version-0.23.0/how-to/troubleshooting/_category_.json b/versioned_docs/version-0.23.0/how-to/troubleshooting/_category_.json
deleted file mode 100644
index 402e45a6..00000000
--- a/versioned_docs/version-0.23.0/how-to/troubleshooting/_category_.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "label": "Troubleshooting",
- "position": 5
-}
diff --git a/versioned_docs/version-0.23.0/how-to/troubleshooting/video-codecs.mdx b/versioned_docs/version-0.23.0/how-to/troubleshooting/video-codecs.mdx
deleted file mode 100644
index 99431a29..00000000
--- a/versioned_docs/version-0.23.0/how-to/troubleshooting/video-codecs.mdx
+++ /dev/null
@@ -1,30 +0,0 @@
----
-type: how-to
----
-
-# How to Handle Video Codec Issues
-
-**How-to Guide** - _Solve video codec problems and optimize codec selection_
-
-## Supported Video Codecs
-
-Fishjam supports the following video codecs:
-
-- **H.264**
-- **VP8**
-
-## Default Codec
-
-Fishjam uses H.264 by default, however, to solve an issue with Android emulators, VP8 is set when you're using the Sandbox API.
-
-### Changing the Codec
-
-Override the default codec by setting the `codec` parameter when [creating a room](../../api/server/interfaces/RoomConfig#videocodec) using server SDKs.
-
-### Why VP8 and H.264?
-
-- **VP8**: A software-based codec supported across all devices, ensuring maximum compatibility. It's ideal for environments lacking hardware acceleration, such as Android emulators.
-- **H.264**: A hardware-accelerated codec offering superior performance. However, its availability varies by device, and it may not perform optimally at lower bitrates.
-
-For optimal performance and compatibility, assess your application's requirements and the environments in which it will operate when selecting a codec.
-We recommend using H.264 for production and VP8 for development as it works with Android emulators.
diff --git a/versioned_docs/version-0.23.0/tutorials/react-native-quick-start.mdx b/versioned_docs/version-0.23.0/tutorials/react-native-quick-start.mdx
deleted file mode 100644
index fd61243a..00000000
--- a/versioned_docs/version-0.23.0/tutorials/react-native-quick-start.mdx
+++ /dev/null
@@ -1,299 +0,0 @@
----
-type: tutorial
-sidebar_position: 0
----
-
-import InstallPackage from "../how-to/react-native/_components/install-package.mdx";
-import ConfigurePermissions from "../how-to/react-native/_components/configure-permissions.mdx";
-
-# React Native Quick Start
-
-This tutorial will guide you through integrating Fishjam into your React Native application step by step.
-By the end, you'll have a working video streaming app and understand the core concepts.
-
-## What you'll build
-
-A simple React Native app that can join conference calls and stream audio/video between participants.
-
-## What you'll learn
-
-- How to install and configure Fishjam SDK
-- How to join a room and start streaming
-- How to display video and play audio from other participants
-- How to check connection status
-
-## Prerequisites
-
-- React Native development environment set up
-- Access to [Fishjam Dashboard](https://fishjam.io/app)
-
-## Step 1: Install and configure
-
-### Install the package
-
-
-
-### Configure app permissions
-
-
-
-### Build native dependencies
-
-```bash
-npx expo prebuild
-```
-
-### Get your Fishjam ID
-
-1. Log in to [Fishjam Dashboard](https://fishjam.io/app)
-2. Navigate to your Sandbox environment
-3. Copy your Fishjam ID
-
-### Quick example
-
-To quickly test our streaming infrastructure use `FishjamRoom` component. It encapsulates all the steps needed to start streaming.
-
-Example usage:
-
-```tsx
-import { FishjamRoom, useSandbox } from "@fishjam-cloud/react-native-client";
-import React, { useEffect, useState } from "react";
-
-export default function HomeScreen() {
- const fishjamId = "YOUR_FISHJAM_ID";
- const [peerToken, setPeerToken] = useState(null);
- const { getSandboxPeerToken } = useSandbox({ fishjamId: fishjamId });
-
- useEffect(() => {
- const fetchPeerToken = async () => {
- try {
- const peerToken = await getSandboxPeerToken(
- "example-room-name",
- "example-peer-name",
- );
- setPeerToken(peerToken);
- } catch (e) {
- console.error("Error connecting to Fishjam", e);
- }
- };
- fetchPeerToken();
- }, []);
-
- if (!peerToken) {
- return null;
- }
-
- return ;
-}
-```
-
-:::important
-This won't work on the iOS Simulator, as the Simulator can't access the camera. Test on a real device.
-:::
-
-For more detailed implementation follow the steps below.
-
-## Step 2: Join a room and start streaming
-
-Create a component that joins a room and starts streaming video:
-
-```tsx
-import React, { useCallback } from "react";
-import { Button } from "react-native";
-import {
- useCamera,
- useConnection,
- useSandbox,
-} from "@fishjam-cloud/react-native-client";
-
-// Check https://fishjam.io/app for your Fishjam ID
-const FISHJAM_ID = "YOUR_FISHJAM_ID";
-
-export function StartStreamingButton({
- roomName,
- peerName,
-}: {
- roomName: string;
- peerName: string;
-}) {
- const { prepareCamera } = useCamera();
- const { joinRoom } = useConnection();
- const { getSandboxPeerToken } = useSandbox({ fishjamId: FISHJAM_ID });
-
- const startStreaming = useCallback(async () => {
- // In sandbox environment, you can get the peer token from our sandbox API
- // In production environment, you need to get it from your backend
- const peerToken = await getSandboxPeerToken(roomName, peerName);
-
- // Prepare camera
- await prepareCamera({ cameraEnabled: true });
-
- // Join the room
- await joinRoom({ peerToken, fishjamId: FISHJAM_ID });
- }, [joinRoom, prepareCamera, roomName, peerName]);
-
- return ;
-}
-```
-
-## Step 3: Check connection status
-
-Monitor your connection status:
-
-```tsx
-import React from "react";
-import { Text } from "react-native";
-import { useConnection } from "@fishjam-cloud/react-native-client";
-
-// ---cut---
-export function ConnectionStatus() {
- const { peerStatus } = useConnection();
- return Status: {peerStatus};
-}
-```
-
-## Step 4: Display your video
-
-Show your own video stream:
-
-```tsx
-import React from "react";
-import { VideoPreviewView } from "@fishjam-cloud/react-native-client";
-
-export function StreamPreview() {
- return ;
-}
-```
-
-## Step 5: Display other participants
-
-Show video from other peers in the room:
-
-```tsx
-import React from "react";
-import {
- usePeers,
- VideoRendererView,
-} from "@fishjam-cloud/react-native-client";
-import { View } from "react-native";
-
-// ---cut---
-export function ParticipantsView() {
- const { remotePeers } = usePeers();
- const videoTracks = remotePeers.flatMap((peer) =>
- peer.tracks.filter((track) => track.type === "Video" && track.isActive),
- );
- return (
-
- {videoTracks.map((track) => (
-
- ))}
-
- );
-}
-```
-
-## Complete example
-
-Here's a complete working example:
-
-```tsx
-import { Text, View, Button } from "react-native";
-import {
- usePeers,
- useCamera,
- useConnection,
- useSandbox,
- VideoRendererView,
- VideoPreviewView,
-} from "@fishjam-cloud/react-native-client";
-import React, { useCallback } from "react";
-
-// Check https://fishjam.io/app for your Fishjam ID
-const FISHJAM_ID = `${process.env.EXPO_PUBLIC_FISHJAM_ID}`;
-
-function StartStreamingButton({
- roomName,
- peerName,
-}: {
- roomName: string;
- peerName: string;
-}) {
- const { prepareCamera } = useCamera();
- const { joinRoom } = useConnection();
- const { getSandboxPeerToken } = useSandbox({ fishjamId: FISHJAM_ID });
-
- const startStreaming = useCallback(async () => {
- const peerToken = await getSandboxPeerToken(roomName, peerName);
- await prepareCamera({ cameraEnabled: true });
- await joinRoom({ peerToken, fishjamId: FISHJAM_ID });
- }, [joinRoom, prepareCamera, roomName, peerName]);
-
- return ;
-}
-
-function ConnectionStatus() {
- const { peerStatus } = useConnection();
- return Status: {peerStatus};
-}
-
-function StreamPreview() {
- return ;
-}
-
-function ParticipantsView() {
- const { remotePeers } = usePeers();
- const videoTracks = remotePeers.flatMap((peer) =>
- peer.tracks.filter((track) => track.type === "Video" && track.isActive),
- );
- return (
-
- {videoTracks.map((track) => (
-
- ))}
-
- );
-}
-
-export default function Index() {
- return (
-
-
-
- Your Stream:
-
- Other Participants:
-
-
- );
-}
-```
-
-## Next steps
-
-Now that you have a basic app working, explore these how-to guides:
-
-- [How to handle screen sharing](../how-to/react-native/screensharing)
-- [How to implement background streaming](../how-to/react-native/background-streaming)
-- [How to handle reconnections](../how-to/react-native/reconnection-handling)
-- [How to work with metadata](../how-to/react-native/metadata)
-
-Or learn more about Fishjam concepts:
-
-- [Understanding Fishjam architecture](../explanation/architecture)
-- [Room types explained](../explanation/room-types)
diff --git a/versioned_docs/version-0.23.0/_common/agents/definition.mdx b/versioned_docs/version-0.26.0/_common/agents/definition.mdx
similarity index 100%
rename from versioned_docs/version-0.23.0/_common/agents/definition.mdx
rename to versioned_docs/version-0.26.0/_common/agents/definition.mdx
diff --git a/versioned_docs/version-0.23.0/_common/agents/remember-to-disconnect.mdx b/versioned_docs/version-0.26.0/_common/agents/remember-to-disconnect.mdx
similarity index 100%
rename from versioned_docs/version-0.23.0/_common/agents/remember-to-disconnect.mdx
rename to versioned_docs/version-0.26.0/_common/agents/remember-to-disconnect.mdx
diff --git a/versioned_docs/version-0.23.0/_common/agents/subscriptions.mdx b/versioned_docs/version-0.26.0/_common/agents/subscriptions.mdx
similarity index 100%
rename from versioned_docs/version-0.23.0/_common/agents/subscriptions.mdx
rename to versioned_docs/version-0.26.0/_common/agents/subscriptions.mdx
diff --git a/versioned_docs/version-0.23.0/api/_category_.json b/versioned_docs/version-0.26.0/api/_category_.json
similarity index 92%
rename from versioned_docs/version-0.23.0/api/_category_.json
rename to versioned_docs/version-0.26.0/api/_category_.json
index 24fd9392..d38385d4 100644
--- a/versioned_docs/version-0.23.0/api/_category_.json
+++ b/versioned_docs/version-0.26.0/api/_category_.json
@@ -1,6 +1,6 @@
{
"label": "API",
- "position": 6,
+ "position": 7,
"link": {
"type": "generated-index",
"description": "API documentation for Client and Server SDKs.",
diff --git a/versioned_docs/version-0.26.0/api/mobile/enumerations/Variant.md b/versioned_docs/version-0.26.0/api/mobile/enumerations/Variant.md
new file mode 100644
index 00000000..9907848e
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/enumerations/Variant.md
@@ -0,0 +1,43 @@
+# Enumeration: Variant
+
+Defined in: packages/ts-client/dist/index.d.mts:51
+
+## Enumeration Members
+
+### UNRECOGNIZED
+
+> **UNRECOGNIZED**: `-1`
+
+Defined in: packages/ts-client/dist/index.d.mts:56
+
+***
+
+### VARIANT\_HIGH
+
+> **VARIANT\_HIGH**: `3`
+
+Defined in: packages/ts-client/dist/index.d.mts:55
+
+***
+
+### VARIANT\_LOW
+
+> **VARIANT\_LOW**: `1`
+
+Defined in: packages/ts-client/dist/index.d.mts:53
+
+***
+
+### VARIANT\_MEDIUM
+
+> **VARIANT\_MEDIUM**: `2`
+
+Defined in: packages/ts-client/dist/index.d.mts:54
+
+***
+
+### VARIANT\_UNSPECIFIED
+
+> **VARIANT\_UNSPECIFIED**: `0`
+
+Defined in: packages/ts-client/dist/index.d.mts:52
diff --git a/versioned_docs/version-0.26.0/api/mobile/functions/FishjamProvider.md b/versioned_docs/version-0.26.0/api/mobile/functions/FishjamProvider.md
new file mode 100644
index 00000000..c9550f31
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/functions/FishjamProvider.md
@@ -0,0 +1,15 @@
+# Function: FishjamProvider()
+
+> **FishjamProvider**(`props`): `FunctionComponentElement`\<`FishjamProviderProps`\>
+
+Defined in: [packages/mobile-client/src/index.ts:118](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/index.ts#L118)
+
+## Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `props` | [`FishjamProviderProps`](../type-aliases/FishjamProviderProps.md) |
+
+## Returns
+
+`FunctionComponentElement`\<`FishjamProviderProps`\>
diff --git a/versioned_docs/version-0.26.0/api/mobile/functions/RTCPIPView.md b/versioned_docs/version-0.26.0/api/mobile/functions/RTCPIPView.md
new file mode 100644
index 00000000..b517f727
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/functions/RTCPIPView.md
@@ -0,0 +1,15 @@
+# Function: RTCPIPView()
+
+> **RTCPIPView**(`__namedParameters`): `Element`
+
+Defined in: [packages/mobile-client/src/overrides/RTCView.tsx:31](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/RTCView.tsx#L31)
+
+## Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `__namedParameters` | [`RTCPIPViewProps`](../type-aliases/RTCPIPViewProps.md) |
+
+## Returns
+
+`Element`
diff --git a/versioned_docs/version-0.26.0/api/mobile/functions/RTCView.md b/versioned_docs/version-0.26.0/api/mobile/functions/RTCView.md
new file mode 100644
index 00000000..2324557e
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/functions/RTCView.md
@@ -0,0 +1,15 @@
+# Function: RTCView()
+
+> **RTCView**(`__namedParameters`): `Element`
+
+Defined in: [packages/mobile-client/src/overrides/RTCView.tsx:26](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/RTCView.tsx#L26)
+
+## Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `__namedParameters` | [`RTCVideoViewProps`](../type-aliases/RTCVideoViewProps.md) |
+
+## Returns
+
+`Element`
diff --git a/versioned_docs/version-0.26.0/api/mobile/functions/useCallKit.md b/versioned_docs/version-0.26.0/api/mobile/functions/useCallKit.md
new file mode 100644
index 00000000..242e724f
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/functions/useCallKit.md
@@ -0,0 +1,9 @@
+# Function: useCallKit()
+
+> **useCallKit**(): `object`
+
+Defined in: [packages/mobile-client/src/overrides/hooks.ts:100](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/hooks.ts#L100)
+
+## Returns
+
+`object`
diff --git a/versioned_docs/version-0.26.0/api/mobile/functions/useCallKitEvent.md b/versioned_docs/version-0.26.0/api/mobile/functions/useCallKitEvent.md
new file mode 100644
index 00000000..5985bcf7
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/functions/useCallKitEvent.md
@@ -0,0 +1,22 @@
+# Function: useCallKitEvent()
+
+> **useCallKitEvent**\<`T`\>(`action`, `callback`): `void`
+
+Defined in: [packages/mobile-client/src/overrides/hooks.ts:109](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/hooks.ts#L109)
+
+## Type Parameters
+
+| Type Parameter |
+| ------ |
+| `T` *extends* keyof `CallKitAction` |
+
+## Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `action` | `T` |
+| `callback` | (`event`) => `void` |
+
+## Returns
+
+`void`
diff --git a/versioned_docs/version-0.26.0/api/mobile/functions/useCallKitService.md b/versioned_docs/version-0.26.0/api/mobile/functions/useCallKitService.md
new file mode 100644
index 00000000..f5201c10
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/functions/useCallKitService.md
@@ -0,0 +1,15 @@
+# Function: useCallKitService()
+
+> **useCallKitService**(`config`): `void`
+
+Defined in: [packages/mobile-client/src/overrides/hooks.ts:105](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/hooks.ts#L105)
+
+## Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `config` | `CallKitConfig` |
+
+## Returns
+
+`void`
diff --git a/versioned_docs/version-0.26.0/api/mobile/functions/useCamera.md b/versioned_docs/version-0.26.0/api/mobile/functions/useCamera.md
new file mode 100644
index 00000000..123f2b9c
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/functions/useCamera.md
@@ -0,0 +1,118 @@
+# Function: useCamera()
+
+> **useCamera**(): `object`
+
+Defined in: [packages/mobile-client/src/overrides/hooks.ts:28](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/hooks.ts#L28)
+
+## Returns
+
+### ~~activeCamera~~
+
+> **activeCamera**: `null` \| [`DeviceItem`](../type-aliases/DeviceItem.md)
+
+#### Deprecated
+
+Use `currentCamera` and `isCameraOn` instead
+Indicates which camera is now turned on and streaming
+
+### cameraDeviceError
+
+> **cameraDeviceError**: `null` \| [`DeviceError`](../type-aliases/DeviceError.md)
+
+Possible error thrown while setting up the camera
+
+### cameraDevices
+
+> **cameraDevices**: [`DeviceItem`](../type-aliases/DeviceItem.md)[]
+
+List of available camera devices
+
+### cameraStream
+
+> **cameraStream**: `null` \| `MediaStream`
+
+### currentCamera
+
+> **currentCamera**: `null` \| `MediaDeviceInfo`
+
+Indicates which camera is now selected
+
+### currentCameraMiddleware
+
+> **currentCameraMiddleware**: [`TrackMiddleware`](../type-aliases/TrackMiddleware.md)
+
+The currently set camera middleware function
+
+### isCameraOn
+
+> **isCameraOn**: `boolean`
+
+Indicates whether the camera is streaming video
+
+### selectCamera()
+
+> **selectCamera**: (`deviceId`) => `Promise`\<`undefined` \| [`DeviceError`](../type-aliases/DeviceError.md)\>
+
+Selects the camera device
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `deviceId` | `string` |
+
+#### Returns
+
+`Promise`\<`undefined` \| [`DeviceError`](../type-aliases/DeviceError.md)\>
+
+### setCameraTrackMiddleware()
+
+> **setCameraTrackMiddleware**: (`middleware`) => `Promise`\<`void`\>
+
+Sets the camera middleware
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `middleware` | [`TrackMiddleware`](../type-aliases/TrackMiddleware.md) |
+
+#### Returns
+
+`Promise`\<`void`\>
+
+### startCamera()
+
+> **startCamera**: (`deviceId?`) => `Promise`\<\[`MediaStreamTrack`, `null`\] \| \[`null`, [`DeviceError`](../type-aliases/DeviceError.md)\]\>
+
+Starts the camera
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `deviceId?` | `null` \| `string` |
+
+#### Returns
+
+`Promise`\<\[`MediaStreamTrack`, `null`\] \| \[`null`, [`DeviceError`](../type-aliases/DeviceError.md)\]\>
+
+### stopCamera()
+
+> **stopCamera**: () => `void`
+
+Stops the camera
+
+#### Returns
+
+`void`
+
+### toggleCamera()
+
+> **toggleCamera**: () => `Promise`\<`undefined` \| [`DeviceError`](../type-aliases/DeviceError.md)\>
+
+Toggles current camera on/off
+
+#### Returns
+
+`Promise`\<`undefined` \| [`DeviceError`](../type-aliases/DeviceError.md)\>
diff --git a/versioned_docs/version-0.26.0/api/mobile/functions/useCameraPermissions.md b/versioned_docs/version-0.26.0/api/mobile/functions/useCameraPermissions.md
new file mode 100644
index 00000000..193752b2
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/functions/useCameraPermissions.md
@@ -0,0 +1,28 @@
+# Function: useCameraPermissions()
+
+> **useCameraPermissions**(): \[() => `Promise`\<[`PermissionStatus`](../type-aliases/PermissionStatus.md)\>, () => `Promise`\<[`PermissionStatus`](../type-aliases/PermissionStatus.md)\>\]
+
+Defined in: [packages/mobile-client/src/hooks/usePermissions.ts:47](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/hooks/usePermissions.ts#L47)
+
+Hook for querying and requesting camera permission on the device.
+
+## Returns
+
+\[() => `Promise`\<[`PermissionStatus`](../type-aliases/PermissionStatus.md)\>, () => `Promise`\<[`PermissionStatus`](../type-aliases/PermissionStatus.md)\>\]
+
+A tuple of `[query, request]`:
+- `query` – checks the current camera permission status without prompting the user.
+- `request` – triggers the native permission dialog and returns the resulting status.
+
+## Example
+
+```tsx
+import { useCameraPermissions } from "@fishjam-cloud/react-native-client";
+// ---cut---
+const [queryCameraPermission, requestCameraPermission] = useCameraPermissions();
+
+const status = await queryCameraPermission();
+if (status !== 'granted') {
+ await requestCameraPermission();
+}
+```
diff --git a/versioned_docs/version-0.23.0/api/mobile/functions/useConnection.md b/versioned_docs/version-0.26.0/api/mobile/functions/useConnection.md
similarity index 53%
rename from versioned_docs/version-0.23.0/api/mobile/functions/useConnection.md
rename to versioned_docs/version-0.26.0/api/mobile/functions/useConnection.md
index db580942..0d2b4d8f 100644
--- a/versioned_docs/version-0.23.0/api/mobile/functions/useConnection.md
+++ b/versioned_docs/version-0.26.0/api/mobile/functions/useConnection.md
@@ -2,9 +2,9 @@
> **useConnection**(): `object`
-Defined in: [packages/react-native-client/src/hooks/useConnection.ts:104](https://github.com/fishjam-cloud/mobile-client-sdk/blob/13bc6085d5c0268377acde140fe9c29c39eaf73b/packages/react-native-client/src/hooks/useConnection.ts#L104)
+Defined in: packages/react-client/dist/hooks/useConnection.d.ts:17
-Connect/leave room. And get connection status.
+Hook allows to join or leave a room and check the current connection status.
## Returns
@@ -14,19 +14,17 @@ Connect/leave room. And get connection status.
Join room and start streaming camera and microphone
-See [JoinRoomConfig](../type-aliases/JoinRoomConfig.md) for parameter list
-
#### Type Parameters
| Type Parameter | Default type |
| ------ | ------ |
-| `PeerMetadata` *extends* [`GenericMetadata`](../type-aliases/GenericMetadata.md) | [`GenericMetadata`](../type-aliases/GenericMetadata.md) |
+| `PeerMetadata` *extends* `GenericMetadata` | `GenericMetadata` |
#### Parameters
| Parameter | Type |
| ------ | ------ |
-| `__namedParameters` | [`JoinRoomConfig`](../type-aliases/JoinRoomConfig.md)\<`PeerMetadata`\> |
+| `__namedParameters` | [`JoinRoomConfig`](../interfaces/JoinRoomConfig.md)\<`PeerMetadata`\> |
#### Returns
@@ -46,6 +44,10 @@ Leave room and stop streaming
> **peerStatus**: [`PeerStatus`](../type-aliases/PeerStatus.md)
+Current peer connection status
+
### reconnectionStatus
> **reconnectionStatus**: [`ReconnectionStatus`](../type-aliases/ReconnectionStatus.md)
+
+Current reconnection status
diff --git a/versioned_docs/version-0.26.0/api/mobile/functions/useCustomSource.md b/versioned_docs/version-0.26.0/api/mobile/functions/useCustomSource.md
new file mode 100644
index 00000000..d0e50312
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/functions/useCustomSource.md
@@ -0,0 +1,39 @@
+# Function: useCustomSource()
+
+> **useCustomSource**\<`T`\>(`sourceId`): `object`
+
+Defined in: [packages/mobile-client/src/overrides/hooks.ts:52](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/hooks.ts#L52)
+
+## Type Parameters
+
+| Type Parameter |
+| ------ |
+| `T` *extends* `string` |
+
+## Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `sourceId` | `T` |
+
+## Returns
+
+`object`
+
+### setStream()
+
+> **setStream**: (`newStream`) => `Promise`\<`void`\>
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `newStream` | `null` \| `MediaStream` |
+
+#### Returns
+
+`Promise`\<`void`\>
+
+### stream
+
+> **stream**: `undefined` \| `MediaStream`
diff --git a/versioned_docs/version-0.26.0/api/mobile/functions/useDataChannel.md b/versioned_docs/version-0.26.0/api/mobile/functions/useDataChannel.md
new file mode 100644
index 00000000..d709ded8
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/functions/useDataChannel.md
@@ -0,0 +1,11 @@
+# Function: useDataChannel()
+
+> **useDataChannel**(): [`UseDataChannelResult`](../type-aliases/UseDataChannelResult.md)
+
+Defined in: packages/react-client/dist/hooks/useDataChannel.d.ts:8
+
+Hook for data channel operations - publish and subscribe to data.
+
+## Returns
+
+[`UseDataChannelResult`](../type-aliases/UseDataChannelResult.md)
diff --git a/versioned_docs/version-0.26.0/api/mobile/functions/useInitializeDevices.md b/versioned_docs/version-0.26.0/api/mobile/functions/useInitializeDevices.md
new file mode 100644
index 00000000..436b9711
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/functions/useInitializeDevices.md
@@ -0,0 +1,23 @@
+# Function: useInitializeDevices()
+
+> **useInitializeDevices**(): `object`
+
+Defined in: [packages/mobile-client/src/overrides/hooks.ts:83](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/hooks.ts#L83)
+
+## Returns
+
+`object`
+
+### initializeDevices()
+
+> **initializeDevices**: (...`args`) => `Promise`\<[`InitializeDevicesResult`](../type-aliases/InitializeDevicesResult.md)\>
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| ...`args` | \[[`InitializeDevicesSettings`](../type-aliases/InitializeDevicesSettings.md)\] |
+
+#### Returns
+
+`Promise`\<[`InitializeDevicesResult`](../type-aliases/InitializeDevicesResult.md)\>
diff --git a/versioned_docs/version-0.26.0/api/mobile/functions/useLivestreamStreamer.md b/versioned_docs/version-0.26.0/api/mobile/functions/useLivestreamStreamer.md
new file mode 100644
index 00000000..facecbea
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/functions/useLivestreamStreamer.md
@@ -0,0 +1,9 @@
+# Function: useLivestreamStreamer()
+
+> **useLivestreamStreamer**(): [`UseLivestreamStreamerResult`](../type-aliases/UseLivestreamStreamerResult.md)
+
+Defined in: [packages/mobile-client/src/overrides/hooks.ts:61](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/hooks.ts#L61)
+
+## Returns
+
+[`UseLivestreamStreamerResult`](../type-aliases/UseLivestreamStreamerResult.md)
diff --git a/versioned_docs/version-0.26.0/api/mobile/functions/useLivestreamViewer.md b/versioned_docs/version-0.26.0/api/mobile/functions/useLivestreamViewer.md
new file mode 100644
index 00000000..531d4a94
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/functions/useLivestreamViewer.md
@@ -0,0 +1,9 @@
+# Function: useLivestreamViewer()
+
+> **useLivestreamViewer**(): [`UseLivestreamViewerResult`](../type-aliases/UseLivestreamViewerResult.md)
+
+Defined in: [packages/mobile-client/src/overrides/hooks.ts:75](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/hooks.ts#L75)
+
+## Returns
+
+[`UseLivestreamViewerResult`](../type-aliases/UseLivestreamViewerResult.md)
diff --git a/versioned_docs/version-0.26.0/api/mobile/functions/useMicrophone.md b/versioned_docs/version-0.26.0/api/mobile/functions/useMicrophone.md
new file mode 100644
index 00000000..ad55a22c
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/functions/useMicrophone.md
@@ -0,0 +1,124 @@
+# Function: useMicrophone()
+
+> **useMicrophone**(): `object`
+
+Defined in: [packages/mobile-client/src/overrides/hooks.ts:36](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/hooks.ts#L36)
+
+## Returns
+
+### ~~activeMicrophone~~
+
+> **activeMicrophone**: `null` \| [`DeviceItem`](../type-aliases/DeviceItem.md)
+
+#### Deprecated
+
+Use `currentMicrophone` and `isMicrophoneOn` instead
+Indicates which microphone is now turned on and streaming audio
+
+### currentMicrophone
+
+> **currentMicrophone**: `null` \| `MediaDeviceInfo`
+
+Indicates which microphone is now selected
+
+### currentMicrophoneMiddleware
+
+> **currentMicrophoneMiddleware**: [`TrackMiddleware`](../type-aliases/TrackMiddleware.md)
+
+The currently set microphone middleware function
+
+### isMicrophoneMuted
+
+> **isMicrophoneMuted**: `boolean`
+
+Indicates whether the microphone is muted
+
+### isMicrophoneOn
+
+> **isMicrophoneOn**: `boolean`
+
+Indicates whether the microphone is streaming audio
+
+### microphoneDeviceError
+
+> **microphoneDeviceError**: `null` \| [`DeviceError`](../type-aliases/DeviceError.md)
+
+Possible error thrown while setting up the microphone
+
+### microphoneDevices
+
+> **microphoneDevices**: [`DeviceItem`](../type-aliases/DeviceItem.md)[]
+
+List of available microphone devices
+
+### microphoneStream
+
+> **microphoneStream**: `null` \| `MediaStream`
+
+### selectMicrophone()
+
+> **selectMicrophone**: (`deviceId`) => `Promise`\<`undefined` \| [`DeviceError`](../type-aliases/DeviceError.md)\>
+
+Selects the microphone device
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `deviceId` | `string` |
+
+#### Returns
+
+`Promise`\<`undefined` \| [`DeviceError`](../type-aliases/DeviceError.md)\>
+
+### setMicrophoneTrackMiddleware()
+
+> **setMicrophoneTrackMiddleware**: (`middleware`) => `Promise`\<`void`\>
+
+Sets the microphone middleware
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `middleware` | [`TrackMiddleware`](../type-aliases/TrackMiddleware.md) |
+
+#### Returns
+
+`Promise`\<`void`\>
+
+### startMicrophone()
+
+> **startMicrophone**: (`deviceId?`) => `Promise`\<\[`MediaStreamTrack`, `null`\] \| \[`null`, [`DeviceError`](../type-aliases/DeviceError.md)\]\>
+
+Starts the microphone
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `deviceId?` | `null` \| `string` |
+
+#### Returns
+
+`Promise`\<\[`MediaStreamTrack`, `null`\] \| \[`null`, [`DeviceError`](../type-aliases/DeviceError.md)\]\>
+
+### stopMicrophone()
+
+> **stopMicrophone**: () => `void`
+
+Stops the microphone
+
+#### Returns
+
+`void`
+
+### toggleMicrophone()
+
+> **toggleMicrophone**: () => `Promise`\<`undefined` \| [`DeviceError`](../type-aliases/DeviceError.md)\>
+
+Toggles current microphone on/off
+
+#### Returns
+
+`Promise`\<`undefined` \| [`DeviceError`](../type-aliases/DeviceError.md)\>
diff --git a/versioned_docs/version-0.26.0/api/mobile/functions/useMicrophonePermissions.md b/versioned_docs/version-0.26.0/api/mobile/functions/useMicrophonePermissions.md
new file mode 100644
index 00000000..07a67394
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/functions/useMicrophonePermissions.md
@@ -0,0 +1,28 @@
+# Function: useMicrophonePermissions()
+
+> **useMicrophonePermissions**(): \[() => `Promise`\<[`PermissionStatus`](../type-aliases/PermissionStatus.md)\>, () => `Promise`\<[`PermissionStatus`](../type-aliases/PermissionStatus.md)\>\]
+
+Defined in: [packages/mobile-client/src/hooks/usePermissions.ts:70](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/hooks/usePermissions.ts#L70)
+
+Hook for querying and requesting microphone permission on the device.
+
+## Returns
+
+\[() => `Promise`\<[`PermissionStatus`](../type-aliases/PermissionStatus.md)\>, () => `Promise`\<[`PermissionStatus`](../type-aliases/PermissionStatus.md)\>\]
+
+A tuple of `[query, request]`:
+- `query` – checks the current microphone permission status without prompting the user.
+- `request` – triggers the native permission dialog and returns the resulting status.
+
+## Example
+
+```tsx
+import { useMicrophonePermissions } from "@fishjam-cloud/react-native-client";
+// ---cut---
+const [queryMicPermission, requestMicPermission] = useMicrophonePermissions();
+
+const status = await queryMicPermission();
+if (status !== 'granted') {
+ await requestMicPermission();
+}
+```
diff --git a/versioned_docs/version-0.26.0/api/mobile/functions/usePeers.md b/versioned_docs/version-0.26.0/api/mobile/functions/usePeers.md
new file mode 100644
index 00000000..e7e87a2d
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/functions/usePeers.md
@@ -0,0 +1,28 @@
+# Function: usePeers()
+
+> **usePeers**\<`P`, `S`\>(): `object`
+
+Defined in: [packages/mobile-client/src/overrides/hooks.ts:92](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/hooks.ts#L92)
+
+## Type Parameters
+
+| Type Parameter | Default type |
+| ------ | ------ |
+| `P` | `Record`\<`string`, `unknown`\> |
+| `S` | `Record`\<`string`, `unknown`\> |
+
+## Returns
+
+`object`
+
+### localPeer
+
+> **localPeer**: `null` \| [`PeerWithTracks`](../type-aliases/PeerWithTracks.md)\<`P`, `S`\>
+
+### peers
+
+> **peers**: [`PeerWithTracks`](../type-aliases/PeerWithTracks.md)\<`P`, `S`, [`RemoteTrack`](../type-aliases/RemoteTrack.md)\>[]
+
+### remotePeers
+
+> **remotePeers**: [`PeerWithTracks`](../type-aliases/PeerWithTracks.md)\<`P`, `S`, [`RemoteTrack`](../type-aliases/RemoteTrack.md)\>[]
diff --git a/versioned_docs/version-0.26.0/api/mobile/functions/useScreenShare.md b/versioned_docs/version-0.26.0/api/mobile/functions/useScreenShare.md
new file mode 100644
index 00000000..bad5dda1
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/functions/useScreenShare.md
@@ -0,0 +1,77 @@
+# Function: useScreenShare()
+
+> **useScreenShare**(): `object`
+
+Defined in: [packages/mobile-client/src/overrides/hooks.ts:44](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/hooks.ts#L44)
+
+## Returns
+
+### audioTrack
+
+> **audioTrack**: `null` \| `MediaStreamTrack`
+
+The separate audio MediaStreamTrack.
+
+### currentTracksMiddleware
+
+> **currentTracksMiddleware**: `null` \| [`TracksMiddleware`](../type-aliases/TracksMiddleware.md)
+
+The middleware currently assigned to process the tracks.
+A screenshare may include both audio and video tracks, and this middleware is capable of processing
+each track type.
+
+### setTracksMiddleware()
+
+> **setTracksMiddleware**: (`middleware`) => `Promise`\<`void`\>
+
+Sets the middleware responsible for processing the tracks.
+
+#### Parameters
+
+| Parameter | Type | Description |
+| ------ | ------ | ------ |
+| `middleware` | `null` \| [`TracksMiddleware`](../type-aliases/TracksMiddleware.md) | The middleware to set, which can be a TracksMiddleware instance or null to remove the middleware. |
+
+#### Returns
+
+`Promise`\<`void`\>
+
+A Promise that resolves once the middleware is successfully set.
+
+### startStreaming()
+
+> **startStreaming**: (`props?`) => `Promise`\<`void`\>
+
+Invokes the screen sharing prompt in the user's browser and starts streaming upon approval.
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `props?` | \{ `audioConstraints?`: `boolean` \| `MediaTrackConstraints`; `videoConstraints?`: `boolean` \| `MediaTrackConstraints`; \} |
+| `props.audioConstraints?` | `boolean` \| `MediaTrackConstraints` |
+| `props.videoConstraints?` | `boolean` \| `MediaTrackConstraints` |
+
+#### Returns
+
+`Promise`\<`void`\>
+
+### stopStreaming()
+
+> **stopStreaming**: () => `Promise`\<`void`\>
+
+Stops the stream and cancels browser screen sharing.
+
+#### Returns
+
+`Promise`\<`void`\>
+
+### stream
+
+> **stream**: `null` \| `MediaStream`
+
+### videoTrack
+
+> **videoTrack**: `null` \| `MediaStreamTrack`
+
+The separate video MediaStreamTrack.
diff --git a/versioned_docs/version-0.26.0/api/mobile/index.md b/versioned_docs/version-0.26.0/api/mobile/index.md
new file mode 100644
index 00000000..de8312a0
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/index.md
@@ -0,0 +1,85 @@
+# @fishjam-cloud/react-native-client
+
+React Native client SDK for building mobile video and audio apps with Fishjam.
+
+## Connection
+
+- [useConnection](functions/useConnection.md)
+- [useDataChannel](functions/useDataChannel.md)
+- [Metadata](type-aliases/Metadata.md)
+- [useUpdatePeerMetadata](variables/useUpdatePeerMetadata.md)
+- [useVAD](variables/useVAD.md)
+
+## Other
+
+- [FishjamProvider](functions/FishjamProvider.md)
+- [RTCPIPView](functions/RTCPIPView.md)
+- [RTCView](functions/RTCView.md)
+- [useCallKit](functions/useCallKit.md)
+- [useCallKitEvent](functions/useCallKitEvent.md)
+- [useCallKitService](functions/useCallKitService.md)
+- [useCamera](functions/useCamera.md)
+- [useCameraPermissions](functions/useCameraPermissions.md)
+- [useCustomSource](functions/useCustomSource.md)
+- [useInitializeDevices](functions/useInitializeDevices.md)
+- [useLivestreamStreamer](functions/useLivestreamStreamer.md)
+- [useLivestreamViewer](functions/useLivestreamViewer.md)
+- [useMicrophone](functions/useMicrophone.md)
+- [useMicrophonePermissions](functions/useMicrophonePermissions.md)
+- [usePeers](functions/usePeers.md)
+- [useScreenShare](functions/useScreenShare.md)
+- [Variant](enumerations/Variant.md)
+- [DataChannelOptions](interfaces/DataChannelOptions.md)
+- [JoinRoomConfig](interfaces/JoinRoomConfig.md)
+- [SimulcastConfig](interfaces/SimulcastConfig.md)
+- [AuthErrorReason](type-aliases/AuthErrorReason.md)
+- [BandwidthLimits](type-aliases/BandwidthLimits.md)
+- [Brand](type-aliases/Brand.md)
+- [ConnectStreamerConfig](type-aliases/ConnectStreamerConfig.md)
+- [ConnectViewerConfig](type-aliases/ConnectViewerConfig.md)
+- [CustomSource](type-aliases/CustomSource.md)
+- [DataCallback](type-aliases/DataCallback.md)
+- [DeviceError](type-aliases/DeviceError.md)
+- [DeviceItem](type-aliases/DeviceItem.md)
+- [FishjamProviderProps](type-aliases/FishjamProviderProps.md)
+- [ForegroundServiceConfig](type-aliases/ForegroundServiceConfig.md)
+- [InitializeDevicesResult](type-aliases/InitializeDevicesResult.md)
+- [InitializeDevicesSettings](type-aliases/InitializeDevicesSettings.md)
+- [InitializeDevicesStatus](type-aliases/InitializeDevicesStatus.md)
+- [JoinErrorReason](type-aliases/JoinErrorReason.md)
+- [MiddlewareResult](type-aliases/MiddlewareResult.md)
+- [PeerId](type-aliases/PeerId.md)
+- [PeerStatus](type-aliases/PeerStatus.md)
+- [PeerWithTracks](type-aliases/PeerWithTracks.md)
+- [PermissionStatus](type-aliases/PermissionStatus.md)
+- [PersistLastDeviceHandlers](type-aliases/PersistLastDeviceHandlers.md)
+- [ReconnectConfig](type-aliases/ReconnectConfig.md)
+- [ReconnectionStatus](type-aliases/ReconnectionStatus.md)
+- [RemoteTrack](type-aliases/RemoteTrack.md)
+- [RoomType](type-aliases/RoomType.md)
+- [RTCPIPViewProps](type-aliases/RTCPIPViewProps.md)
+- [RTCVideoViewProps](type-aliases/RTCVideoViewProps.md)
+- [SimulcastBandwidthLimit](type-aliases/SimulcastBandwidthLimit.md)
+- [SimulcastBandwidthLimits](type-aliases/SimulcastBandwidthLimits.md)
+- [StreamConfig](type-aliases/StreamConfig.md)
+- [StreamerInputs](type-aliases/StreamerInputs.md)
+- [Track](type-aliases/Track.md)
+- [TrackBandwidthLimit](type-aliases/TrackBandwidthLimit.md)
+- [TrackFields](type-aliases/TrackFields.md)
+- [TrackId](type-aliases/TrackId.md)
+- [TrackMiddleware](type-aliases/TrackMiddleware.md)
+- [TracksMiddleware](type-aliases/TracksMiddleware.md)
+- [TracksMiddlewareResult](type-aliases/TracksMiddlewareResult.md)
+- [UseCameraResult](type-aliases/UseCameraResult.md)
+- [UseCustomSourceResult](type-aliases/UseCustomSourceResult.md)
+- [UseDataChannelResult](type-aliases/UseDataChannelResult.md)
+- [UseInitializeDevicesParams](type-aliases/UseInitializeDevicesParams.md)
+- [UseInitializeDevicesReturn](type-aliases/UseInitializeDevicesReturn.md)
+- [UseLivestreamStreamerResult](type-aliases/UseLivestreamStreamerResult.md)
+- [UseLivestreamViewerResult](type-aliases/UseLivestreamViewerResult.md)
+- [UseMicrophoneResult](type-aliases/UseMicrophoneResult.md)
+- [UseSandboxProps](type-aliases/UseSandboxProps.md)
+- [UseScreenShareResult](type-aliases/UseScreenShareResult.md)
+- [SimulcastConfig](variables/SimulcastConfig.md)
+- [useForegroundService](variables/useForegroundService.md)
+- [useSandbox](variables/useSandbox.md)
diff --git a/versioned_docs/version-0.26.0/api/mobile/interfaces/DataChannelOptions.md b/versioned_docs/version-0.26.0/api/mobile/interfaces/DataChannelOptions.md
new file mode 100644
index 00000000..9694abab
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/interfaces/DataChannelOptions.md
@@ -0,0 +1,16 @@
+# Interface: DataChannelOptions
+
+Defined in: packages/ts-client/dist/index.d.mts:501
+
+Options for publishing or subscribing to data.
+
+## Properties
+
+### reliable
+
+> **reliable**: `boolean`
+
+Defined in: packages/ts-client/dist/index.d.mts:506
+
+If true, uses the reliable data channel (ordered, guaranteed delivery).
+If false, uses the lossy data channel (unordered, low latency).
diff --git a/versioned_docs/version-0.26.0/api/mobile/interfaces/JoinRoomConfig.md b/versioned_docs/version-0.26.0/api/mobile/interfaces/JoinRoomConfig.md
new file mode 100644
index 00000000..230755f8
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/interfaces/JoinRoomConfig.md
@@ -0,0 +1,29 @@
+# Interface: JoinRoomConfig\
+
+Defined in: packages/react-client/dist/hooks/useConnection.d.ts:2
+
+## Type Parameters
+
+| Type Parameter | Default type |
+| ------ | ------ |
+| `PeerMetadata` *extends* `GenericMetadata` | `GenericMetadata` |
+
+## Properties
+
+### peerMetadata?
+
+> `optional` **peerMetadata**: `PeerMetadata`
+
+Defined in: packages/react-client/dist/hooks/useConnection.d.ts:10
+
+String indexed record with metadata, that will be available to all other peers
+
+***
+
+### peerToken
+
+> **peerToken**: `string`
+
+Defined in: packages/react-client/dist/hooks/useConnection.d.ts:6
+
+Token received from server (or Room Manager)
diff --git a/versioned_docs/version-0.26.0/api/mobile/interfaces/SimulcastConfig.md b/versioned_docs/version-0.26.0/api/mobile/interfaces/SimulcastConfig.md
new file mode 100644
index 00000000..dbec162b
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/interfaces/SimulcastConfig.md
@@ -0,0 +1,27 @@
+# Interface: SimulcastConfig
+
+Defined in: packages/ts-client/dist/index.d.mts:197
+
+## Properties
+
+### disabledVariants
+
+> **disabledVariants**: [`Variant`](../enumerations/Variant.md)[]
+
+Defined in: packages/ts-client/dist/index.d.mts:200
+
+***
+
+### enabled
+
+> **enabled**: `boolean`
+
+Defined in: packages/ts-client/dist/index.d.mts:198
+
+***
+
+### enabledVariants
+
+> **enabledVariants**: [`Variant`](../enumerations/Variant.md)[]
+
+Defined in: packages/ts-client/dist/index.d.mts:199
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/AuthErrorReason.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/AuthErrorReason.md
new file mode 100644
index 00000000..5d7ef8f5
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/AuthErrorReason.md
@@ -0,0 +1,5 @@
+# Type Alias: AuthErrorReason
+
+> **AuthErrorReason** = *typeof* `AUTH_ERROR_REASONS`\[`number`\]
+
+Defined in: packages/ts-client/dist/index.d.mts:5
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/BandwidthLimits.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/BandwidthLimits.md
new file mode 100644
index 00000000..2ce1bf63
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/BandwidthLimits.md
@@ -0,0 +1,21 @@
+# Type Alias: BandwidthLimits
+
+> **BandwidthLimits** = `object`
+
+Defined in: packages/react-client/dist/types/public.d.ts:59
+
+## Properties
+
+### simulcast
+
+> **simulcast**: [`SimulcastBandwidthLimits`](SimulcastBandwidthLimits.md)
+
+Defined in: packages/react-client/dist/types/public.d.ts:61
+
+***
+
+### singleStream
+
+> **singleStream**: `number`
+
+Defined in: packages/react-client/dist/types/public.d.ts:60
diff --git a/versioned_docs/version-0.23.0/api/web/type-aliases/Brand.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/Brand.md
similarity index 55%
rename from versioned_docs/version-0.23.0/api/web/type-aliases/Brand.md
rename to versioned_docs/version-0.26.0/api/mobile/type-aliases/Brand.md
index 36f7fab5..f77a606b 100644
--- a/versioned_docs/version-0.23.0/api/web/type-aliases/Brand.md
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/Brand.md
@@ -2,7 +2,7 @@
> **Brand**\<`T`, `TBrand`\> = `T` & `object`
-Defined in: [react-client/src/types/public.ts:72](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/types/public.ts#L72)
+Defined in: packages/react-client/dist/types/public.d.ts:74
## Type declaration
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/ConnectStreamerConfig.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/ConnectStreamerConfig.md
new file mode 100644
index 00000000..ad4d87b4
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/ConnectStreamerConfig.md
@@ -0,0 +1,21 @@
+# Type Alias: ConnectStreamerConfig
+
+> **ConnectStreamerConfig** = `object`
+
+Defined in: [packages/mobile-client/src/overrides/types.ts:21](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/types.ts#L21)
+
+## Properties
+
+### inputs
+
+> **inputs**: [`StreamerInputs`](StreamerInputs.md)
+
+Defined in: [packages/mobile-client/src/overrides/types.ts:22](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/types.ts#L22)
+
+***
+
+### token
+
+> **token**: `string`
+
+Defined in: [packages/mobile-client/src/overrides/types.ts:23](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/types.ts#L23)
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/ConnectViewerConfig.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/ConnectViewerConfig.md
new file mode 100644
index 00000000..09c7fa34
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/ConnectViewerConfig.md
@@ -0,0 +1,5 @@
+# Type Alias: ConnectViewerConfig
+
+> **ConnectViewerConfig** = \{ `streamId?`: `never`; `token`: `string`; \} \| \{ `streamId`: `string`; `token?`: `never`; \}
+
+Defined in: packages/react-client/dist/hooks/useLivestreamViewer.d.ts:2
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/CustomSource.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/CustomSource.md
new file mode 100644
index 00000000..e5117422
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/CustomSource.md
@@ -0,0 +1,17 @@
+# Type Alias: CustomSource\
+
+> **CustomSource**\<`T`\> = `Omit`\<`ReactClientCustomSource`\<`T`\>, `"stream"`\> & `object`
+
+Defined in: [packages/mobile-client/src/overrides/types.ts:64](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/types.ts#L64)
+
+## Type declaration
+
+### stream?
+
+> `optional` **stream**: `RNMediaStream`
+
+## Type Parameters
+
+| Type Parameter |
+| ------ |
+| `T` *extends* `string` |
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/DataCallback.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/DataCallback.md
new file mode 100644
index 00000000..08f6d1a0
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/DataCallback.md
@@ -0,0 +1,17 @@
+# Type Alias: DataCallback()
+
+> **DataCallback** = (`data`) => `void`
+
+Defined in: packages/ts-client/dist/index.d.mts:512
+
+Callback type for receiving data from a data channel.
+
+## Parameters
+
+| Parameter | Type | Description |
+| ------ | ------ | ------ |
+| `data` | `Uint8Array` | The received data as a Uint8Array |
+
+## Returns
+
+`void`
diff --git a/versioned_docs/version-0.23.0/api/web/type-aliases/DeviceError.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/DeviceError.md
similarity index 51%
rename from versioned_docs/version-0.23.0/api/web/type-aliases/DeviceError.md
rename to versioned_docs/version-0.26.0/api/mobile/type-aliases/DeviceError.md
index e3a9e519..60ad1a3a 100644
--- a/versioned_docs/version-0.23.0/api/web/type-aliases/DeviceError.md
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/DeviceError.md
@@ -2,4 +2,4 @@
> **DeviceError** = \{ `name`: `"OverconstrainedError"`; \} \| \{ `name`: `"NotAllowedError"`; \} \| \{ `name`: `"NotFoundError"`; \} \| \{ `name`: `"UNHANDLED_ERROR"`; \}
-Defined in: [react-client/src/types/public.ts:65](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/types/public.ts#L65)
+Defined in: packages/react-client/dist/types/public.d.ts:64
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/DeviceItem.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/DeviceItem.md
new file mode 100644
index 00000000..4c55e211
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/DeviceItem.md
@@ -0,0 +1,21 @@
+# Type Alias: DeviceItem
+
+> **DeviceItem** = `object`
+
+Defined in: packages/react-client/dist/types/public.d.ts:43
+
+## Properties
+
+### deviceId
+
+> **deviceId**: `string`
+
+Defined in: packages/react-client/dist/types/public.d.ts:44
+
+***
+
+### label
+
+> **label**: `string`
+
+Defined in: packages/react-client/dist/types/public.d.ts:45
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/FishjamProviderProps.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/FishjamProviderProps.md
new file mode 100644
index 00000000..55553c26
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/FishjamProviderProps.md
@@ -0,0 +1,5 @@
+# Type Alias: FishjamProviderProps
+
+> **FishjamProviderProps** = `Omit`\<`ReactClientFishjamProviderProps`, `"persistLastDevice"` \| `"fishjamClient"`\>
+
+Defined in: [packages/mobile-client/src/index.ts:117](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/index.ts#L117)
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/ForegroundServiceConfig.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/ForegroundServiceConfig.md
new file mode 100644
index 00000000..00fa9a3a
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/ForegroundServiceConfig.md
@@ -0,0 +1,79 @@
+# Type Alias: ForegroundServiceConfig
+
+> **ForegroundServiceConfig** = `object`
+
+Defined in: [packages/mobile-client/src/useForegroundService.ts:8](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/useForegroundService.ts#L8)
+
+Configuration options for foreground service permissions.
+
+A type representing the configuration for foreground service permissions.
+
+## Properties
+
+### channelId?
+
+> `optional` **channelId**: `string`
+
+Defined in: [packages/mobile-client/src/useForegroundService.ts:24](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/useForegroundService.ts#L24)
+
+The id of the channel. Must be unique per package.
+
+***
+
+### channelName?
+
+> `optional` **channelName**: `string`
+
+Defined in: [packages/mobile-client/src/useForegroundService.ts:28](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/useForegroundService.ts#L28)
+
+The user visible name of the channel.
+
+***
+
+### enableCamera?
+
+> `optional` **enableCamera**: `boolean`
+
+Defined in: [packages/mobile-client/src/useForegroundService.ts:12](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/useForegroundService.ts#L12)
+
+Indicates whether the camera is enabled for the foreground service.
+
+***
+
+### enableMicrophone?
+
+> `optional` **enableMicrophone**: `boolean`
+
+Defined in: [packages/mobile-client/src/useForegroundService.ts:16](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/useForegroundService.ts#L16)
+
+Indicates whether the microphone is enabled for the foreground service.
+
+***
+
+### enableScreenSharing?
+
+> `optional` **enableScreenSharing**: `boolean`
+
+Defined in: [packages/mobile-client/src/useForegroundService.ts:20](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/useForegroundService.ts#L20)
+
+Indicates whether screen sharing is enabled for the foreground service.
+
+***
+
+### notificationContent?
+
+> `optional` **notificationContent**: `string`
+
+Defined in: [packages/mobile-client/src/useForegroundService.ts:36](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/useForegroundService.ts#L36)
+
+The text (second row) of the notification, in a standard notification.
+
+***
+
+### notificationTitle?
+
+> `optional` **notificationTitle**: `string`
+
+Defined in: [packages/mobile-client/src/useForegroundService.ts:32](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/useForegroundService.ts#L32)
+
+The title (first row) of the notification, in a standard notification.
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/InitializeDevicesResult.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/InitializeDevicesResult.md
new file mode 100644
index 00000000..7fac693f
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/InitializeDevicesResult.md
@@ -0,0 +1,11 @@
+# Type Alias: InitializeDevicesResult
+
+> **InitializeDevicesResult** = `Omit`\<`ReactClientInitializeDevicesResult`, `"stream"`\> & `object`
+
+Defined in: [packages/mobile-client/src/overrides/types.ts:66](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/types.ts#L66)
+
+## Type declaration
+
+### stream
+
+> **stream**: `RNMediaStream` \| `null`
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/InitializeDevicesSettings.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/InitializeDevicesSettings.md
new file mode 100644
index 00000000..f85d28a2
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/InitializeDevicesSettings.md
@@ -0,0 +1,21 @@
+# Type Alias: InitializeDevicesSettings
+
+> **InitializeDevicesSettings** = `object`
+
+Defined in: packages/react-client/dist/hooks/internal/devices/useMediaDevices.d.ts:9
+
+## Properties
+
+### enableAudio?
+
+> `optional` **enableAudio**: `boolean`
+
+Defined in: packages/react-client/dist/hooks/internal/devices/useMediaDevices.d.ts:11
+
+***
+
+### enableVideo?
+
+> `optional` **enableVideo**: `boolean`
+
+Defined in: packages/react-client/dist/hooks/internal/devices/useMediaDevices.d.ts:10
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/InitializeDevicesStatus.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/InitializeDevicesStatus.md
new file mode 100644
index 00000000..b3efe444
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/InitializeDevicesStatus.md
@@ -0,0 +1,5 @@
+# Type Alias: InitializeDevicesStatus
+
+> **InitializeDevicesStatus** = `"initialized"` \| `"failed"` \| `"initialized_with_errors"` \| `"already_initialized"`
+
+Defined in: packages/react-client/dist/types/public.d.ts:2
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/JoinErrorReason.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/JoinErrorReason.md
new file mode 100644
index 00000000..08b6676b
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/JoinErrorReason.md
@@ -0,0 +1,5 @@
+# Type Alias: JoinErrorReason
+
+> **JoinErrorReason** = *typeof* `JOIN_ERRORS`\[`number`\]
+
+Defined in: packages/ts-client/dist/index.d.mts:937
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/Metadata.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/Metadata.md
new file mode 100644
index 00000000..f8187fda
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/Metadata.md
@@ -0,0 +1,28 @@
+# Type Alias: Metadata\
+
+> **Metadata**\<`PeerMetadata`, `ServerMetadata`\> = `object`
+
+Defined in: packages/ts-client/dist/index.d.mts:968
+
+## Type Parameters
+
+| Type Parameter | Default type | Description |
+| ------ | ------ | ------ |
+| `PeerMetadata` | `GenericMetadata` | Type of metadata set by peer while connecting to a room. |
+| `ServerMetadata` | `GenericMetadata` | Type of metadata set by the server while creating a peer. |
+
+## Properties
+
+### peer
+
+> **peer**: `PeerMetadata`
+
+Defined in: packages/ts-client/dist/index.d.mts:969
+
+***
+
+### server
+
+> **server**: `ServerMetadata`
+
+Defined in: packages/ts-client/dist/index.d.mts:970
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/MiddlewareResult.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/MiddlewareResult.md
new file mode 100644
index 00000000..34d3c29a
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/MiddlewareResult.md
@@ -0,0 +1,25 @@
+# Type Alias: MiddlewareResult
+
+> **MiddlewareResult** = `object`
+
+Defined in: packages/react-client/dist/types/public.d.ts:23
+
+## Properties
+
+### onClear()?
+
+> `optional` **onClear**: () => `void`
+
+Defined in: packages/react-client/dist/types/public.d.ts:25
+
+#### Returns
+
+`void`
+
+***
+
+### track
+
+> **track**: `MediaStreamTrack`
+
+Defined in: packages/react-client/dist/types/public.d.ts:24
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/PeerId.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/PeerId.md
new file mode 100644
index 00000000..2fc229ef
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/PeerId.md
@@ -0,0 +1,5 @@
+# Type Alias: PeerId
+
+> **PeerId** = [`Brand`](Brand.md)\<`string`, `"PeerId"`\>
+
+Defined in: packages/react-client/dist/types/public.d.ts:12
diff --git a/versioned_docs/version-0.23.0/api/web/type-aliases/PeerStatus.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/PeerStatus.md
similarity index 68%
rename from versioned_docs/version-0.23.0/api/web/type-aliases/PeerStatus.md
rename to versioned_docs/version-0.26.0/api/mobile/type-aliases/PeerStatus.md
index baad15da..ae00a192 100644
--- a/versioned_docs/version-0.23.0/api/web/type-aliases/PeerStatus.md
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/PeerStatus.md
@@ -2,7 +2,7 @@
> **PeerStatus** = `"connecting"` \| `"connected"` \| `"error"` \| `"idle"`
-Defined in: [react-client/src/types/public.ts:44](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/types/public.ts#L44)
+Defined in: packages/react-client/dist/types/public.d.ts:42
Represents the possible statuses of a peer connection.
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/PeerWithTracks.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/PeerWithTracks.md
new file mode 100644
index 00000000..68ff9437
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/PeerWithTracks.md
@@ -0,0 +1,43 @@
+# Type Alias: PeerWithTracks\
+
+> **PeerWithTracks**\<`P`, `S`, `T`\> = `Omit`\<`ReactClientPeerWithTracks`\<`P`, `S`\>, [`TrackFields`](TrackFields.md)\> & `object`
+
+Defined in: [packages/mobile-client/src/overrides/types.ts:79](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/types.ts#L79)
+
+## Type declaration
+
+### cameraTrack?
+
+> `optional` **cameraTrack**: `T`
+
+### customAudioTracks
+
+> **customAudioTracks**: `T`[]
+
+### customVideoTracks
+
+> **customVideoTracks**: `T`[]
+
+### microphoneTrack?
+
+> `optional` **microphoneTrack**: `T`
+
+### screenShareAudioTrack?
+
+> `optional` **screenShareAudioTrack**: `T`
+
+### screenShareVideoTrack?
+
+> `optional` **screenShareVideoTrack**: `T`
+
+### tracks
+
+> **tracks**: `T`[]
+
+## Type Parameters
+
+| Type Parameter | Default type |
+| ------ | ------ |
+| `P` | - |
+| `S` | - |
+| `T` *extends* [`Track`](Track.md) | [`Track`](Track.md) |
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/PermissionStatus.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/PermissionStatus.md
new file mode 100644
index 00000000..c673c28e
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/PermissionStatus.md
@@ -0,0 +1,11 @@
+# Type Alias: PermissionStatus
+
+> **PermissionStatus** = `"granted"` \| `"denied"` \| `"prompt"`
+
+Defined in: [packages/mobile-client/src/hooks/usePermissions.ts:11](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/hooks/usePermissions.ts#L11)
+
+The current status of a device permission.
+
+- `'granted'` – the user has granted the permission.
+- `'denied'` – the user has denied the permission.
+- `'prompt'` – the user has not yet been asked (or the permission can be requested again).
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/PersistLastDeviceHandlers.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/PersistLastDeviceHandlers.md
new file mode 100644
index 00000000..f2492589
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/PersistLastDeviceHandlers.md
@@ -0,0 +1,42 @@
+# Type Alias: PersistLastDeviceHandlers
+
+> **PersistLastDeviceHandlers** = `object`
+
+Defined in: packages/react-client/dist/types/public.d.ts:47
+
+## Properties
+
+### getLastDevice()
+
+> **getLastDevice**: (`deviceType`) => `MediaDeviceInfo` \| `null`
+
+Defined in: packages/react-client/dist/types/public.d.ts:48
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `deviceType` | `"audio"` \| `"video"` |
+
+#### Returns
+
+`MediaDeviceInfo` \| `null`
+
+***
+
+### saveLastDevice()
+
+> **saveLastDevice**: (`info`, `deviceType`) => `void`
+
+Defined in: packages/react-client/dist/types/public.d.ts:49
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `info` | `MediaDeviceInfo` |
+| `deviceType` | `"audio"` \| `"video"` |
+
+#### Returns
+
+`void`
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/RTCPIPViewProps.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/RTCPIPViewProps.md
new file mode 100644
index 00000000..a49de9e7
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/RTCPIPViewProps.md
@@ -0,0 +1,11 @@
+# Type Alias: RTCPIPViewProps
+
+> **RTCPIPViewProps** = `Omit`\<`React.ComponentPropsWithRef`\<*typeof* `OriginalRTCPIPView`\>, `"streamURL"`\> & `object`
+
+Defined in: [packages/mobile-client/src/overrides/RTCView.tsx:10](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/RTCView.tsx#L10)
+
+## Type declaration
+
+### mediaStream
+
+> **mediaStream**: `RNMediaStream`
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/RTCVideoViewProps.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/RTCVideoViewProps.md
new file mode 100644
index 00000000..6e35e49d
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/RTCVideoViewProps.md
@@ -0,0 +1,11 @@
+# Type Alias: RTCVideoViewProps
+
+> **RTCVideoViewProps** = `Omit`\<`React.ComponentPropsWithRef`\<*typeof* `OriginalRTCView`\>, `"streamURL"`\> & `object`
+
+Defined in: [packages/mobile-client/src/overrides/RTCView.tsx:6](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/RTCView.tsx#L6)
+
+## Type declaration
+
+### mediaStream
+
+> **mediaStream**: `RNMediaStream`
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/ReconnectConfig.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/ReconnectConfig.md
new file mode 100644
index 00000000..9869fcde
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/ReconnectConfig.md
@@ -0,0 +1,37 @@
+# Type Alias: ReconnectConfig
+
+> **ReconnectConfig** = `object`
+
+Defined in: packages/ts-client/dist/index.d.mts:941
+
+## Properties
+
+### addTracksOnReconnect?
+
+> `optional` **addTracksOnReconnect**: `boolean`
+
+Defined in: packages/ts-client/dist/index.d.mts:945
+
+***
+
+### delay?
+
+> `optional` **delay**: `number`
+
+Defined in: packages/ts-client/dist/index.d.mts:944
+
+***
+
+### initialDelay?
+
+> `optional` **initialDelay**: `number`
+
+Defined in: packages/ts-client/dist/index.d.mts:943
+
+***
+
+### maxAttempts?
+
+> `optional` **maxAttempts**: `number`
+
+Defined in: packages/ts-client/dist/index.d.mts:942
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/ReconnectionStatus.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/ReconnectionStatus.md
new file mode 100644
index 00000000..9d23a0a7
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/ReconnectionStatus.md
@@ -0,0 +1,5 @@
+# Type Alias: ReconnectionStatus
+
+> **ReconnectionStatus** = `"reconnecting"` \| `"idle"` \| `"error"`
+
+Defined in: packages/ts-client/dist/index.d.mts:940
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/RemoteTrack.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/RemoteTrack.md
new file mode 100644
index 00000000..ea866fff
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/RemoteTrack.md
@@ -0,0 +1,11 @@
+# Type Alias: RemoteTrack
+
+> **RemoteTrack** = `Omit`\<`ReactClientRemoteTrack`, `"stream"`\> & `object`
+
+Defined in: [packages/mobile-client/src/overrides/types.ts:62](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/types.ts#L62)
+
+## Type declaration
+
+### stream
+
+> **stream**: `RNMediaStream` \| `null`
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/RoomType.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/RoomType.md
new file mode 100644
index 00000000..3b87f487
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/RoomType.md
@@ -0,0 +1,5 @@
+# Type Alias: RoomType
+
+> **RoomType** = `"conference"` \| `"livestream"` \| `"audio_only"`
+
+Defined in: packages/react-client/dist/hooks/useSandbox.d.ts:6
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/SimulcastBandwidthLimit.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/SimulcastBandwidthLimit.md
new file mode 100644
index 00000000..f812c466
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/SimulcastBandwidthLimit.md
@@ -0,0 +1,9 @@
+# Type Alias: SimulcastBandwidthLimit
+
+> **SimulcastBandwidthLimit** = `Map`\<[`Variant`](../enumerations/Variant.md), `BandwidthLimit`\>
+
+Defined in: packages/ts-client/dist/index.d.mts:252
+
+Type describing bandwidth limit for simulcast track.
+It is a mapping (encoding => BandwidthLimit).
+If encoding isn't present in this mapping, it will be assumed that this particular encoding shouldn't have any bandwidth limit
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/SimulcastBandwidthLimits.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/SimulcastBandwidthLimits.md
new file mode 100644
index 00000000..5209ee64
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/SimulcastBandwidthLimits.md
@@ -0,0 +1,29 @@
+# Type Alias: SimulcastBandwidthLimits
+
+> **SimulcastBandwidthLimits** = `object`
+
+Defined in: packages/react-client/dist/types/public.d.ts:51
+
+## Properties
+
+### 1
+
+> **1**: `number`
+
+Defined in: packages/react-client/dist/types/public.d.ts:52
+
+***
+
+### 2
+
+> **2**: `number`
+
+Defined in: packages/react-client/dist/types/public.d.ts:53
+
+***
+
+### 3
+
+> **3**: `number`
+
+Defined in: packages/react-client/dist/types/public.d.ts:54
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/StreamConfig.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/StreamConfig.md
new file mode 100644
index 00000000..9915e8c7
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/StreamConfig.md
@@ -0,0 +1,13 @@
+# Type Alias: StreamConfig
+
+> **StreamConfig** = `object`
+
+Defined in: packages/react-client/dist/types/public.d.ts:56
+
+## Properties
+
+### sentQualities?
+
+> `optional` **sentQualities**: [`Variant`](../enumerations/Variant.md)[] \| `false`
+
+Defined in: packages/react-client/dist/types/public.d.ts:57
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/StreamerInputs.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/StreamerInputs.md
new file mode 100644
index 00000000..16b6758b
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/StreamerInputs.md
@@ -0,0 +1,5 @@
+# Type Alias: StreamerInputs
+
+> **StreamerInputs** = \{ `audio?`: `RNMediaStream` \| `null`; `video`: `RNMediaStream`; \} \| \{ `audio`: `RNMediaStream`; `video?`: `null`; \}
+
+Defined in: [packages/mobile-client/src/overrides/types.ts:17](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/types.ts#L17)
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/Track.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/Track.md
new file mode 100644
index 00000000..7a828b8c
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/Track.md
@@ -0,0 +1,11 @@
+# Type Alias: Track
+
+> **Track** = `Omit`\<`ReactClientTrack`, `"stream"`\> & `object`
+
+Defined in: [packages/mobile-client/src/overrides/types.ts:60](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/types.ts#L60)
+
+## Type declaration
+
+### stream
+
+> **stream**: `RNMediaStream` \| `null`
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/TrackBandwidthLimit.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/TrackBandwidthLimit.md
new file mode 100644
index 00000000..80ee870a
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/TrackBandwidthLimit.md
@@ -0,0 +1,8 @@
+# Type Alias: TrackBandwidthLimit
+
+> **TrackBandwidthLimit** = `BandwidthLimit` \| [`SimulcastBandwidthLimit`](SimulcastBandwidthLimit.md)
+
+Defined in: packages/ts-client/dist/index.d.mts:257
+
+Type describing bandwidth limitation of a Track, including simulcast and non-simulcast tracks.
+A sum type of `BandwidthLimit` and `SimulcastBandwidthLimit`
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/TrackFields.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/TrackFields.md
new file mode 100644
index 00000000..ea43dd14
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/TrackFields.md
@@ -0,0 +1,5 @@
+# Type Alias: TrackFields
+
+> **TrackFields** = `"tracks"` \| `"cameraTrack"` \| `"microphoneTrack"` \| `"screenShareVideoTrack"` \| `"screenShareAudioTrack"` \| `"customVideoTracks"` \| `"customAudioTracks"`
+
+Defined in: [packages/mobile-client/src/overrides/types.ts:70](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/types.ts#L70)
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/TrackId.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/TrackId.md
new file mode 100644
index 00000000..ffa28500
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/TrackId.md
@@ -0,0 +1,5 @@
+# Type Alias: TrackId
+
+> **TrackId** = [`Brand`](Brand.md)\<`string`, `"TrackId"`\>
+
+Defined in: packages/react-client/dist/types/public.d.ts:11
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/TrackMiddleware.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/TrackMiddleware.md
new file mode 100644
index 00000000..e6fec9f2
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/TrackMiddleware.md
@@ -0,0 +1,5 @@
+# Type Alias: TrackMiddleware
+
+> **TrackMiddleware** = (`track`) => [`MiddlewareResult`](MiddlewareResult.md) \| `Promise`\<[`MiddlewareResult`](MiddlewareResult.md)\> \| `null`
+
+Defined in: packages/react-client/dist/types/public.d.ts:27
diff --git a/versioned_docs/version-0.23.0/api/web/type-aliases/TracksMiddleware.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/TracksMiddleware.md
similarity index 72%
rename from versioned_docs/version-0.23.0/api/web/type-aliases/TracksMiddleware.md
rename to versioned_docs/version-0.26.0/api/mobile/type-aliases/TracksMiddleware.md
index 847e06c4..1f74a941 100644
--- a/versioned_docs/version-0.23.0/api/web/type-aliases/TracksMiddleware.md
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/TracksMiddleware.md
@@ -2,7 +2,7 @@
> **TracksMiddleware** = (`videoTrack`, `audioTrack`) => [`TracksMiddlewareResult`](TracksMiddlewareResult.md) \| `Promise`\<[`TracksMiddlewareResult`](TracksMiddlewareResult.md)\>
-Defined in: [react-client/src/types/public.ts:31](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/types/public.ts#L31)
+Defined in: packages/react-client/dist/types/public.d.ts:33
## Parameters
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/TracksMiddlewareResult.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/TracksMiddlewareResult.md
new file mode 100644
index 00000000..fd95b8bb
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/TracksMiddlewareResult.md
@@ -0,0 +1,33 @@
+# Type Alias: TracksMiddlewareResult
+
+> **TracksMiddlewareResult** = `object`
+
+Defined in: packages/react-client/dist/types/public.d.ts:28
+
+## Properties
+
+### audioTrack
+
+> **audioTrack**: `MediaStreamTrack` \| `null`
+
+Defined in: packages/react-client/dist/types/public.d.ts:30
+
+***
+
+### onClear()
+
+> **onClear**: () => `void`
+
+Defined in: packages/react-client/dist/types/public.d.ts:31
+
+#### Returns
+
+`void`
+
+***
+
+### videoTrack
+
+> **videoTrack**: `MediaStreamTrack`
+
+Defined in: packages/react-client/dist/types/public.d.ts:29
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseCameraResult.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseCameraResult.md
new file mode 100644
index 00000000..cf0d73cc
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseCameraResult.md
@@ -0,0 +1,11 @@
+# Type Alias: UseCameraResult
+
+> **UseCameraResult** = `Omit`\<`ReturnType`\<*typeof* `useCameraReactClient`\>, `"cameraStream"`\> & `object`
+
+Defined in: [packages/mobile-client/src/overrides/types.ts:34](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/types.ts#L34)
+
+## Type declaration
+
+### cameraStream
+
+> **cameraStream**: `RNMediaStream` \| `null`
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseCustomSourceResult.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseCustomSourceResult.md
new file mode 100644
index 00000000..675bdb17
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseCustomSourceResult.md
@@ -0,0 +1,25 @@
+# Type Alias: UseCustomSourceResult
+
+> **UseCustomSourceResult** = `Omit`\<`ReturnType`\<*typeof* `useCustomSourceReactClient`\>, `"stream"` \| `"setStream"`\> & `object`
+
+Defined in: [packages/mobile-client/src/overrides/types.ts:49](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/types.ts#L49)
+
+## Type declaration
+
+### setStream()
+
+> **setStream**: (`newStream`) => `Promise`\<`void`\>
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `newStream` | `RNMediaStream` \| `null` |
+
+#### Returns
+
+`Promise`\<`void`\>
+
+### stream
+
+> **stream**: `RNMediaStream` \| `undefined`
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseDataChannelResult.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseDataChannelResult.md
new file mode 100644
index 00000000..2c90c9b0
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseDataChannelResult.md
@@ -0,0 +1,101 @@
+# Type Alias: UseDataChannelResult
+
+> **UseDataChannelResult** = `object`
+
+Defined in: packages/react-client/dist/types/public.d.ts:85
+
+## Properties
+
+### dataChannelError
+
+> **dataChannelError**: `Error` \| `null`
+
+Defined in: packages/react-client/dist/types/public.d.ts:118
+
+Error that occurred during data publisher operations, or null if no error.
+
+***
+
+### dataChannelLoading
+
+> **dataChannelLoading**: `boolean`
+
+Defined in: packages/react-client/dist/types/public.d.ts:114
+
+Whether data channels are being initialized.
+
+***
+
+### dataChannelReady
+
+> **dataChannelReady**: `boolean`
+
+Defined in: packages/react-client/dist/types/public.d.ts:110
+
+Whether data channels are connected and ready to send data.
+Resets to false on disconnect.
+
+***
+
+### initializeDataChannel()
+
+> **initializeDataChannel**: () => `void`
+
+Defined in: packages/react-client/dist/types/public.d.ts:91
+
+Initializes the data channel.
+
+Requires that the fishjam client is already connected.
+
+#### Returns
+
+`void`
+
+***
+
+### publishData()
+
+> **publishData**: (`payload`, `options`) => `void`
+
+Defined in: packages/react-client/dist/types/public.d.ts:97
+
+Sends binary data through a data channel.
+
+#### Parameters
+
+| Parameter | Type | Description |
+| ------ | ------ | ------ |
+| `payload` | `Uint8Array` | The Uint8Array payload to send (first positional argument) |
+| `options` | [`DataChannelOptions`](../interfaces/DataChannelOptions.md) | Data channel options; specify `reliable: true` for guaranteed delivery or `reliable: false` for low latency |
+
+#### Returns
+
+`void`
+
+***
+
+### subscribeData()
+
+> **subscribeData**: (`callback`, `options`) => () => `void`
+
+Defined in: packages/react-client/dist/types/public.d.ts:105
+
+Subscribe to incoming data on a data channel.
+Can be called before or after channel creation.
+
+#### Parameters
+
+| Parameter | Type | Description |
+| ------ | ------ | ------ |
+| `callback` | [`DataCallback`](DataCallback.md) | Function called when data is received |
+| `options` | [`DataChannelOptions`](../interfaces/DataChannelOptions.md) | Specify `reliable: true` or `reliable: false` to choose channel |
+
+#### Returns
+
+Unsubscribe function - call to cancel the subscription
+
+> (): `void`
+
+##### Returns
+
+`void`
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseInitializeDevicesParams.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseInitializeDevicesParams.md
new file mode 100644
index 00000000..7243935b
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseInitializeDevicesParams.md
@@ -0,0 +1,21 @@
+# Type Alias: UseInitializeDevicesParams
+
+> **UseInitializeDevicesParams** = `object`
+
+Defined in: packages/react-client/dist/hooks/devices/useInitializeDevices.d.ts:1
+
+## Properties
+
+### enableAudio?
+
+> `optional` **enableAudio**: `boolean`
+
+Defined in: packages/react-client/dist/hooks/devices/useInitializeDevices.d.ts:3
+
+***
+
+### enableVideo?
+
+> `optional` **enableVideo**: `boolean`
+
+Defined in: packages/react-client/dist/hooks/devices/useInitializeDevices.d.ts:2
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseInitializeDevicesReturn.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseInitializeDevicesReturn.md
new file mode 100644
index 00000000..af933af1
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseInitializeDevicesReturn.md
@@ -0,0 +1,23 @@
+# Type Alias: UseInitializeDevicesReturn
+
+> **UseInitializeDevicesReturn** = `object`
+
+Defined in: [packages/mobile-client/src/overrides/types.ts:54](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/types.ts#L54)
+
+## Properties
+
+### initializeDevices()
+
+> **initializeDevices**: (...`args`) => `Promise`\<[`InitializeDevicesResult`](InitializeDevicesResult.md)\>
+
+Defined in: [packages/mobile-client/src/overrides/types.ts:55](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/types.ts#L55)
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| ...`args` | `Parameters`\<`ReturnType`\<*typeof* `useInitializeDevicesReactClient`\>\[`"initializeDevices"`\]\> |
+
+#### Returns
+
+`Promise`\<[`InitializeDevicesResult`](InitializeDevicesResult.md)\>
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseLivestreamStreamerResult.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseLivestreamStreamerResult.md
new file mode 100644
index 00000000..cae18006
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseLivestreamStreamerResult.md
@@ -0,0 +1,22 @@
+# Type Alias: UseLivestreamStreamerResult
+
+> **UseLivestreamStreamerResult** = `Omit`\<`ReactClientUseLivestreamStreamerResult`, `"connect"`\> & `object`
+
+Defined in: [packages/mobile-client/src/overrides/types.ts:26](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/types.ts#L26)
+
+## Type declaration
+
+### connect()
+
+> **connect**: (`config`, `urlOverride?`) => `Promise`\<`void`\>
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `config` | [`ConnectStreamerConfig`](ConnectStreamerConfig.md) |
+| `urlOverride?` | `string` |
+
+#### Returns
+
+`Promise`\<`void`\>
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseLivestreamViewerResult.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseLivestreamViewerResult.md
new file mode 100644
index 00000000..e566713b
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseLivestreamViewerResult.md
@@ -0,0 +1,11 @@
+# Type Alias: UseLivestreamViewerResult
+
+> **UseLivestreamViewerResult** = `Omit`\<`ReactClientUseLivestreamViewerResult`, `"stream"`\> & `object`
+
+Defined in: [packages/mobile-client/src/overrides/types.ts:30](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/types.ts#L30)
+
+## Type declaration
+
+### stream
+
+> **stream**: `RNMediaStream` \| `null`
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseMicrophoneResult.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseMicrophoneResult.md
new file mode 100644
index 00000000..030e6ed2
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseMicrophoneResult.md
@@ -0,0 +1,11 @@
+# Type Alias: UseMicrophoneResult
+
+> **UseMicrophoneResult** = `Omit`\<`ReturnType`\<*typeof* `useMicrophoneReactClient`\>, `"toggleMicrophoneMute"` \| `"microphoneStream"`\> & `object`
+
+Defined in: [packages/mobile-client/src/overrides/types.ts:38](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/types.ts#L38)
+
+## Type declaration
+
+### microphoneStream
+
+> **microphoneStream**: `RNMediaStream` \| `null`
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseSandboxProps.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseSandboxProps.md
new file mode 100644
index 00000000..c31a18d1
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseSandboxProps.md
@@ -0,0 +1,17 @@
+# Type Alias: UseSandboxProps
+
+> **UseSandboxProps** = `object`
+
+Defined in: packages/react-client/dist/hooks/useSandbox.d.ts:1
+
+## Properties
+
+### configOverride?
+
+> `optional` **configOverride**: `object`
+
+Defined in: packages/react-client/dist/hooks/useSandbox.d.ts:2
+
+| Name | Type |
+| ------ | ------ |
+| `sandboxApiUrl?` | `string` |
diff --git a/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseScreenShareResult.md b/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseScreenShareResult.md
new file mode 100644
index 00000000..4d061617
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/type-aliases/UseScreenShareResult.md
@@ -0,0 +1,11 @@
+# Type Alias: UseScreenShareResult
+
+> **UseScreenShareResult** = `Omit`\<`ReturnType`\<*typeof* `useScreenShareReactClient`\>, `"stream"`\> & `object`
+
+Defined in: [packages/mobile-client/src/overrides/types.ts:45](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/overrides/types.ts#L45)
+
+## Type declaration
+
+### stream
+
+> **stream**: `RNMediaStream` \| `null`
diff --git a/versioned_docs/version-0.26.0/api/mobile/typedoc-sidebar.cjs b/versioned_docs/version-0.26.0/api/mobile/typedoc-sidebar.cjs
new file mode 100644
index 00000000..262c3655
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/typedoc-sidebar.cjs
@@ -0,0 +1,4 @@
+// @ts-check
+/** @type {import("@docusaurus/plugin-content-docs").SidebarsConfig} */
+const typedocSidebar = {items:[{type:"category",label:"Connection",items:[{type:"doc",id:"api/mobile/functions/useConnection",label:"useConnection"},{type:"doc",id:"api/mobile/functions/useDataChannel",label:"useDataChannel"},{type:"doc",id:"api/mobile/type-aliases/Metadata",label:"Metadata"},{type:"doc",id:"api/mobile/variables/useUpdatePeerMetadata",label:"useUpdatePeerMetadata"},{type:"doc",id:"api/mobile/variables/useVAD",label:"useVAD"}]},{type:"category",label:"Other",items:[{type:"doc",id:"api/mobile/functions/FishjamProvider",label:"FishjamProvider"},{type:"doc",id:"api/mobile/functions/RTCPIPView",label:"RTCPIPView"},{type:"doc",id:"api/mobile/functions/RTCView",label:"RTCView"},{type:"doc",id:"api/mobile/functions/useCallKit",label:"useCallKit"},{type:"doc",id:"api/mobile/functions/useCallKitEvent",label:"useCallKitEvent"},{type:"doc",id:"api/mobile/functions/useCallKitService",label:"useCallKitService"},{type:"doc",id:"api/mobile/functions/useCamera",label:"useCamera"},{type:"doc",id:"api/mobile/functions/useCameraPermissions",label:"useCameraPermissions"},{type:"doc",id:"api/mobile/functions/useCustomSource",label:"useCustomSource"},{type:"doc",id:"api/mobile/functions/useInitializeDevices",label:"useInitializeDevices"},{type:"doc",id:"api/mobile/functions/useLivestreamStreamer",label:"useLivestreamStreamer"},{type:"doc",id:"api/mobile/functions/useLivestreamViewer",label:"useLivestreamViewer"},{type:"doc",id:"api/mobile/functions/useMicrophone",label:"useMicrophone"},{type:"doc",id:"api/mobile/functions/useMicrophonePermissions",label:"useMicrophonePermissions"},{type:"doc",id:"api/mobile/functions/usePeers",label:"usePeers"},{type:"doc",id:"api/mobile/functions/useScreenShare",label:"useScreenShare"},{type:"doc",id:"api/mobile/enumerations/Variant",label:"Variant"},{type:"doc",id:"api/mobile/interfaces/DataChannelOptions",label:"DataChannelOptions"},{type:"doc",id:"api/mobile/interfaces/JoinRoomConfig",label:"JoinRoomConfig"},{type:"doc",id:"api/mobile/interfaces/SimulcastConfig",label:"SimulcastConfig"},{type:"doc",id:"api/mobile/type-aliases/AuthErrorReason",label:"AuthErrorReason"},{type:"doc",id:"api/mobile/type-aliases/BandwidthLimits",label:"BandwidthLimits"},{type:"doc",id:"api/mobile/type-aliases/Brand",label:"Brand"},{type:"doc",id:"api/mobile/type-aliases/ConnectStreamerConfig",label:"ConnectStreamerConfig"},{type:"doc",id:"api/mobile/type-aliases/ConnectViewerConfig",label:"ConnectViewerConfig"},{type:"doc",id:"api/mobile/type-aliases/CustomSource",label:"CustomSource"},{type:"doc",id:"api/mobile/type-aliases/DataCallback",label:"DataCallback"},{type:"doc",id:"api/mobile/type-aliases/DeviceError",label:"DeviceError"},{type:"doc",id:"api/mobile/type-aliases/DeviceItem",label:"DeviceItem"},{type:"doc",id:"api/mobile/type-aliases/FishjamProviderProps",label:"FishjamProviderProps"},{type:"doc",id:"api/mobile/type-aliases/ForegroundServiceConfig",label:"ForegroundServiceConfig"},{type:"doc",id:"api/mobile/type-aliases/InitializeDevicesResult",label:"InitializeDevicesResult"},{type:"doc",id:"api/mobile/type-aliases/InitializeDevicesSettings",label:"InitializeDevicesSettings"},{type:"doc",id:"api/mobile/type-aliases/InitializeDevicesStatus",label:"InitializeDevicesStatus"},{type:"doc",id:"api/mobile/type-aliases/JoinErrorReason",label:"JoinErrorReason"},{type:"doc",id:"api/mobile/type-aliases/MiddlewareResult",label:"MiddlewareResult"},{type:"doc",id:"api/mobile/type-aliases/PeerId",label:"PeerId"},{type:"doc",id:"api/mobile/type-aliases/PeerStatus",label:"PeerStatus"},{type:"doc",id:"api/mobile/type-aliases/PeerWithTracks",label:"PeerWithTracks"},{type:"doc",id:"api/mobile/type-aliases/PermissionStatus",label:"PermissionStatus"},{type:"doc",id:"api/mobile/type-aliases/PersistLastDeviceHandlers",label:"PersistLastDeviceHandlers"},{type:"doc",id:"api/mobile/type-aliases/ReconnectConfig",label:"ReconnectConfig"},{type:"doc",id:"api/mobile/type-aliases/ReconnectionStatus",label:"ReconnectionStatus"},{type:"doc",id:"api/mobile/type-aliases/RemoteTrack",label:"RemoteTrack"},{type:"doc",id:"api/mobile/type-aliases/RoomType",label:"RoomType"},{type:"doc",id:"api/mobile/type-aliases/RTCPIPViewProps",label:"RTCPIPViewProps"},{type:"doc",id:"api/mobile/type-aliases/RTCVideoViewProps",label:"RTCVideoViewProps"},{type:"doc",id:"api/mobile/type-aliases/SimulcastBandwidthLimit",label:"SimulcastBandwidthLimit"},{type:"doc",id:"api/mobile/type-aliases/SimulcastBandwidthLimits",label:"SimulcastBandwidthLimits"},{type:"doc",id:"api/mobile/type-aliases/StreamConfig",label:"StreamConfig"},{type:"doc",id:"api/mobile/type-aliases/StreamerInputs",label:"StreamerInputs"},{type:"doc",id:"api/mobile/type-aliases/Track",label:"Track"},{type:"doc",id:"api/mobile/type-aliases/TrackBandwidthLimit",label:"TrackBandwidthLimit"},{type:"doc",id:"api/mobile/type-aliases/TrackFields",label:"TrackFields"},{type:"doc",id:"api/mobile/type-aliases/TrackId",label:"TrackId"},{type:"doc",id:"api/mobile/type-aliases/TrackMiddleware",label:"TrackMiddleware"},{type:"doc",id:"api/mobile/type-aliases/TracksMiddleware",label:"TracksMiddleware"},{type:"doc",id:"api/mobile/type-aliases/TracksMiddlewareResult",label:"TracksMiddlewareResult"},{type:"doc",id:"api/mobile/type-aliases/UseCameraResult",label:"UseCameraResult"},{type:"doc",id:"api/mobile/type-aliases/UseCustomSourceResult",label:"UseCustomSourceResult"},{type:"doc",id:"api/mobile/type-aliases/UseDataChannelResult",label:"UseDataChannelResult"},{type:"doc",id:"api/mobile/type-aliases/UseInitializeDevicesParams",label:"UseInitializeDevicesParams"},{type:"doc",id:"api/mobile/type-aliases/UseInitializeDevicesReturn",label:"UseInitializeDevicesReturn"},{type:"doc",id:"api/mobile/type-aliases/UseLivestreamStreamerResult",label:"UseLivestreamStreamerResult"},{type:"doc",id:"api/mobile/type-aliases/UseLivestreamViewerResult",label:"UseLivestreamViewerResult"},{type:"doc",id:"api/mobile/type-aliases/UseMicrophoneResult",label:"UseMicrophoneResult"},{type:"doc",id:"api/mobile/type-aliases/UseSandboxProps",label:"UseSandboxProps"},{type:"doc",id:"api/mobile/type-aliases/UseScreenShareResult",label:"UseScreenShareResult"},{type:"doc",id:"api/mobile/variables/SimulcastConfig",label:"SimulcastConfig"},{type:"doc",id:"api/mobile/variables/useForegroundService",label:"useForegroundService"},{type:"doc",id:"api/mobile/variables/useSandbox",label:"useSandbox"}]}]};
+module.exports = typedocSidebar.items;
\ No newline at end of file
diff --git a/versioned_docs/version-0.26.0/api/mobile/variables/SimulcastConfig.md b/versioned_docs/version-0.26.0/api/mobile/variables/SimulcastConfig.md
new file mode 100644
index 00000000..89dcedd7
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/variables/SimulcastConfig.md
@@ -0,0 +1,5 @@
+# Variable: SimulcastConfig
+
+> **SimulcastConfig**: `MessageFns`\<[`SimulcastConfig`](../interfaces/SimulcastConfig.md)\>
+
+Defined in: packages/ts-client/dist/index.d.mts:197
diff --git a/versioned_docs/version-0.26.0/api/mobile/variables/useForegroundService.md b/versioned_docs/version-0.26.0/api/mobile/variables/useForegroundService.md
new file mode 100644
index 00000000..3b3690f7
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/variables/useForegroundService.md
@@ -0,0 +1,20 @@
+# Variable: useForegroundService()
+
+> `const` **useForegroundService**: (`config`) => `void` = `externalUseForegroundService`
+
+Defined in: [packages/mobile-client/src/useForegroundService.ts:47](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/mobile-client/src/useForegroundService.ts#L47)
+
+Hook for managing a foreground service on Android.
+
+A hook for managing a foreground service on Android. Does nothing on other platforms.
+You can use this hook to keep your app running in the background. You're also required to run a foreground service when screen sharing.
+
+## Parameters
+
+| Parameter | Type | Description |
+| ------ | ------ | ------ |
+| `config` | `ForegroundServiceConfig` | Configuration options for the foreground service. |
+
+## Returns
+
+`void`
diff --git a/versioned_docs/version-0.26.0/api/mobile/variables/useSandbox.md b/versioned_docs/version-0.26.0/api/mobile/variables/useSandbox.md
new file mode 100644
index 00000000..db322deb
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/variables/useSandbox.md
@@ -0,0 +1,60 @@
+# Variable: useSandbox()
+
+> `const` **useSandbox**: (`props?`) => `object`
+
+Defined in: packages/react-client/dist/hooks/useSandbox.d.ts:7
+
+## Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `props?` | [`UseSandboxProps`](../type-aliases/UseSandboxProps.md) |
+
+## Returns
+
+`object`
+
+### getSandboxLivestream()
+
+> **getSandboxLivestream**: (`roomName`, `isPublic?`) => `Promise`\<\{ `room`: \{ `id`: `string`; `name`: `string`; \}; `streamerToken`: `string`; \}\>
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `roomName` | `string` |
+| `isPublic?` | `boolean` |
+
+#### Returns
+
+`Promise`\<\{ `room`: \{ `id`: `string`; `name`: `string`; \}; `streamerToken`: `string`; \}\>
+
+### getSandboxPeerToken()
+
+> **getSandboxPeerToken**: (`roomName`, `peerName`, `roomType?`) => `Promise`\<`string`\>
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `roomName` | `string` |
+| `peerName` | `string` |
+| `roomType?` | [`RoomType`](../type-aliases/RoomType.md) |
+
+#### Returns
+
+`Promise`\<`string`\>
+
+### getSandboxViewerToken()
+
+> **getSandboxViewerToken**: (`roomName`) => `Promise`\<`string`\>
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `roomName` | `string` |
+
+#### Returns
+
+`Promise`\<`string`\>
diff --git a/versioned_docs/version-0.26.0/api/mobile/variables/useUpdatePeerMetadata.md b/versioned_docs/version-0.26.0/api/mobile/variables/useUpdatePeerMetadata.md
new file mode 100644
index 00000000..16732fb2
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/variables/useUpdatePeerMetadata.md
@@ -0,0 +1,31 @@
+# Variable: useUpdatePeerMetadata()
+
+> `const` **useUpdatePeerMetadata**: \<`PeerMetadata`\>() => `object`
+
+Defined in: packages/react-client/dist/hooks/useUpdatePeerMetadata.d.ts:8
+
+Hook provides a method to update the metadata of the local peer.
+
+## Type Parameters
+
+| Type Parameter | Default type |
+| ------ | ------ |
+| `PeerMetadata` *extends* `GenericMetadata` | `GenericMetadata` |
+
+## Returns
+
+### updatePeerMetadata()
+
+> **updatePeerMetadata**: (`peerMetadata`) => `void`
+
+Updates metadata visible to other peers
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `peerMetadata` | `PeerMetadata` |
+
+#### Returns
+
+`void`
diff --git a/versioned_docs/version-0.26.0/api/mobile/variables/useVAD.md b/versioned_docs/version-0.26.0/api/mobile/variables/useVAD.md
new file mode 100644
index 00000000..4af3ce5b
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/mobile/variables/useVAD.md
@@ -0,0 +1,25 @@
+# Variable: useVAD()
+
+> `const` **useVAD**: (`options`) => `Record`\<[`PeerId`](../type-aliases/PeerId.md), `boolean`\>
+
+Defined in: packages/react-client/dist/hooks/useVAD.d.ts:29
+
+Voice activity detection. Use this hook to check if voice is detected in the audio track for given peer(s).
+
+Remote peer VAD is driven by `vadNotification` messages from the backend.
+If the local peer's id is included in `peerIds`, local VAD is determined client-side
+by polling the microphone's audio level (see `useLocalVAD`).
+
+## Parameters
+
+| Parameter | Type | Description |
+| ------ | ------ | ------ |
+| `options` | \{ `peerIds`: `ReadonlyArray`\<[`PeerId`](../type-aliases/PeerId.md)\>; \} | Options object. |
+| `options.peerIds` | `ReadonlyArray`\<[`PeerId`](../type-aliases/PeerId.md)\> | List of peer ids to subscribe to for VAD notifications. Include the local peer's id to also track whether the local user is speaking. Example usage: `import { useVAD, type PeerId } from "@fishjam-cloud/react-client"; function WhoIsTalkingComponent({ peerIds }: { peerIds: PeerId[] }) { const peersInfo = useVAD({ peerIds }); const activePeers = (Object.keys(peersInfo) as PeerId[]).filter((peerId) => peersInfo[peerId]); return "Now talking: " + activePeers.join(", "); }` |
+
+## Returns
+
+`Record`\<[`PeerId`](../type-aliases/PeerId.md), `boolean`\>
+
+A record where each key is a peer id and the boolean value indicates
+whether voice activity is currently detected for that peer.
diff --git a/versioned_docs/version-0.23.0/api/reference.md b/versioned_docs/version-0.26.0/api/reference.md
similarity index 90%
rename from versioned_docs/version-0.23.0/api/reference.md
rename to versioned_docs/version-0.26.0/api/reference.md
index 7777957b..4d4a4810 100644
--- a/versioned_docs/version-0.23.0/api/reference.md
+++ b/versioned_docs/version-0.26.0/api/reference.md
@@ -12,7 +12,7 @@ Fishjam publishes documentation for the Sandbox API and Fishjam Server APIs.
[Sandbox API OpenAPI](https://github.com/fishjam-cloud/documentation/tree/main/static/api/room-manager-openapi.yaml)
-See also: [What is the Sandbox API?](/explanation/sandbox-api-concept)
+See also: [What is the Sandbox API?](../explanation/sandbox-api-concept)
## Server
@@ -38,7 +38,7 @@ in the `RoomConfig` options when creating a room.
The HTTP POST to the `webhookUrl` uses "application/x-protobuf" content type.
The body is binary data, that represents encoded `ServerMessage`.
-For more information see also [server setup documentation](/how-to/backend/server-setup#webhooks)
+For more information see also [server setup documentation](../how-to/backend/server-setup#webhooks)
#### Websocket
diff --git a/versioned_docs/version-0.23.0/api/server-python/fishjam/agent.md b/versioned_docs/version-0.26.0/api/server-python/fishjam/agent/index.md
similarity index 91%
rename from versioned_docs/version-0.23.0/api/server-python/fishjam/agent.md
rename to versioned_docs/version-0.26.0/api/server-python/fishjam/agent/index.md
index 74a0b740..5e7d6404 100644
--- a/versioned_docs/version-0.23.0/api/server-python/fishjam/agent.md
+++ b/versioned_docs/version-0.26.0/api/server-python/fishjam/agent/index.md
@@ -99,7 +99,7 @@ agent
```python
def receive(
self
-) -> AsyncIterator[AgentResponseTrackData]
+) -> AsyncIterator[AgentResponseTrackData | AgentResponseTrackImage]
```
Returns an async iterator over incoming messages from Fishjam.
@@ -121,6 +121,18 @@ Args:
Returns:
- OutgoingTrack: An object used to send data over the added track.
+### capture_image
+```python
+def capture_image(self, track_id: str)
+```
+Requests a image capture from a remote track.
+
+The captured image will be delivered as an
+:class:`IncomingTrackImage` message through :func:`receive`.
+
+Args:
+- track_id: The identifier of the track to capture an image from.
+
### disconnect
```python
def disconnect(self)
@@ -156,6 +168,14 @@ IncomingTrackData =
```
+---
+## IncomingTrackImage
+```python
+IncomingTrackImage =
+
+```
+
+
---
## OutgoingTrack
```python
diff --git a/versioned_docs/version-0.23.0/api/server-python/fishjam/errors.md b/versioned_docs/version-0.26.0/api/server-python/fishjam/errors/index.md
similarity index 100%
rename from versioned_docs/version-0.23.0/api/server-python/fishjam/errors.md
rename to versioned_docs/version-0.26.0/api/server-python/fishjam/errors/index.md
diff --git a/versioned_docs/version-0.23.0/api/server-python/fishjam/events.md b/versioned_docs/version-0.26.0/api/server-python/fishjam/events/index.md
similarity index 99%
rename from versioned_docs/version-0.23.0/api/server-python/fishjam/events.md
rename to versioned_docs/version-0.26.0/api/server-python/fishjam/events/index.md
index bfde1d69..6b4c2f5d 100644
--- a/versioned_docs/version-0.23.0/api/server-python/fishjam/events.md
+++ b/versioned_docs/version-0.26.0/api/server-python/fishjam/events/index.md
@@ -849,6 +849,13 @@ PEER_TYPE_AGENT =
```
+### PEER_TYPE_VAPI
+```python
+PEER_TYPE_VAPI =
+
+```
+
+
#### Inherited Members
* **Enum**:
* `from_string`
diff --git a/versioned_docs/version-0.23.0/api/server-python/fishjam.md b/versioned_docs/version-0.26.0/api/server-python/fishjam/index.md
similarity index 91%
rename from versioned_docs/version-0.23.0/api/server-python/fishjam.md
rename to versioned_docs/version-0.26.0/api/server-python/fishjam/index.md
index 38bf4e17..485b15ad 100644
--- a/versioned_docs/version-0.23.0/api/server-python/fishjam.md
+++ b/versioned_docs/version-0.26.0/api/server-python/fishjam/index.md
@@ -68,6 +68,23 @@ Returns:
- Agent: The created agent instance initialized with peer ID, room ID, token,
and Fishjam URL.
+### create_vapi_agent
+```python
+def create_vapi_agent(
+ self,
+ room_id: str,
+ options: PeerOptionsVapi
+) -> Peer
+```
+Creates a vapi agent in the room.
+
+Args:
+- room_id: The ID of the room where the vapi agent will be created.
+- options: Configuration options for the vapi peer.
+
+Returns:
+- - Peer: The created peer object.
+
### create_room
```python
def create_room(
@@ -185,6 +202,7 @@ Args:
#### Inherited Members
* **Client**:
* `client`
+ * `warnings_shown`
---
## FishjamNotifier
```python
@@ -301,27 +319,18 @@ class PeerOptions:
Options specific to a WebRTC Peer.
Attributes:
-- enable_simulcast: Enables the peer to use simulcast.
- metadata: Peer metadata.
- subscribe_mode: Configuration of peer's subscribing policy.
### __init__
```python
def __init__(
- enable_simulcast: bool = True,
metadata: dict[str, typing.Any] | None = None,
subscribe_mode: Literal['auto', 'manual'] = 'auto'
)
```
-### enable_simulcast
-```python
-enable_simulcast: bool = True
-
-```
-Enables the peer to use simulcast
-
### metadata
```python
metadata: dict[str, typing.Any] | None = None
@@ -336,6 +345,58 @@ subscribe_mode: Literal['auto', 'manual'] = 'auto'
```
Configuration of peer's subscribing policy
+---
+## PeerOptionsVapi
+```python
+class PeerOptionsVapi:
+```
+Options specific to the VAPI peer
+
+Attributes:
+- api_key (str): VAPI API key
+- call_id (str): VAPI call ID
+- subscribe_mode (Union[Unset, SubscribeMode]): Configuration of peer's subscribing policy
+
+### __init__
+```python
+def __init__(
+ api_key: str,
+ call_id: str,
+ subscribe_mode: Union[Unset, SubscribeMode] =
+)
+```
+Method generated by attrs for class PeerOptionsVapi.
+
+### api_key
+```python
+api_key: str
+```
+
+
+### call_id
+```python
+call_id: str
+```
+
+
+### subscribe_mode
+```python
+subscribe_mode: Union[Unset, SubscribeMode]
+```
+
+
+### to_dict
+```python
+def to_dict(self) -> dict[str, typing.Any]
+```
+
+
+### from_dict
+```python
+def from_dict(cls: type[~T], src_dict: Mapping[str, typing.Any]) -> ~T
+```
+
+
---
## RoomOptions
```python
diff --git a/versioned_docs/version-0.23.0/api/server-python/fishjam/integrations/gemini.md b/versioned_docs/version-0.26.0/api/server-python/fishjam/integrations/gemini/index.md
similarity index 100%
rename from versioned_docs/version-0.23.0/api/server-python/fishjam/integrations/gemini.md
rename to versioned_docs/version-0.26.0/api/server-python/fishjam/integrations/gemini/index.md
diff --git a/versioned_docs/version-0.23.0/api/server-python/fishjam/integrations.md b/versioned_docs/version-0.26.0/api/server-python/fishjam/integrations/index.md
similarity index 100%
rename from versioned_docs/version-0.23.0/api/server-python/fishjam/integrations.md
rename to versioned_docs/version-0.26.0/api/server-python/fishjam/integrations/index.md
diff --git a/versioned_docs/version-0.23.0/api/server-python/fishjam/peer.md b/versioned_docs/version-0.26.0/api/server-python/fishjam/peer/index.md
similarity index 95%
rename from versioned_docs/version-0.23.0/api/server-python/fishjam/peer.md
rename to versioned_docs/version-0.26.0/api/server-python/fishjam/peer/index.md
index 7319cc3a..5c956ae8 100644
--- a/versioned_docs/version-0.23.0/api/server-python/fishjam/peer.md
+++ b/versioned_docs/version-0.26.0/api/server-python/fishjam/peer/index.md
@@ -86,6 +86,13 @@ AGENT =
```
+### VAPI
+```python
+VAPI =
+
+```
+
+
### WEBRTC
```python
WEBRTC =
diff --git a/versioned_docs/version-0.23.0/api/server-python/fishjam/room.md b/versioned_docs/version-0.26.0/api/server-python/fishjam/room/index.md
similarity index 56%
rename from versioned_docs/version-0.23.0/api/server-python/fishjam/room.md
rename to versioned_docs/version-0.26.0/api/server-python/fishjam/room/index.md
index 44528758..79d1f076 100644
--- a/versioned_docs/version-0.23.0/api/server-python/fishjam/room.md
+++ b/versioned_docs/version-0.26.0/api/server-python/fishjam/room/index.md
@@ -17,10 +17,8 @@ Room configuration
Attributes:
- max_peers (Union[None, Unset, int]): Maximum amount of peers allowed into the room Example: 10.
- public (Union[Unset, bool]): True if livestream viewers can omit specifying a token. Default: False.
-- room_type (Union[Unset, RoomConfigRoomType]): The use-case of the room. If not provided, this defaults to
- conference. Default: RoomConfigRoomType.CONFERENCE.
-- video_codec (Union[Unset, RoomConfigVideoCodec]): Enforces video codec for each peer in the room Default:
- RoomConfigVideoCodec.H264.
+- room_type (Union[Unset, RoomType]): The use-case of the room. If not provided, this defaults to conference.
+- video_codec (Union[Unset, VideoCodec]): Enforces video codec for each peer in the room
- webhook_url (Union[None, Unset, str]): URL where Fishjam notifications will be sent Example:
https://backend.address.com/fishjam-notifications-endpoint.
@@ -29,8 +27,8 @@ Attributes:
def __init__(
max_peers: Union[NoneType, Unset, int] = ,
public: Union[Unset, bool] = False,
- room_type: Union[Unset, RoomConfigRoomType] = ,
- video_codec: Union[Unset, RoomConfigVideoCodec] = ,
+ room_type: Union[Unset, RoomType] = ,
+ video_codec: Union[Unset, VideoCodec] = ,
webhook_url: Union[NoneType, Unset, str] =
)
```
@@ -50,13 +48,13 @@ public: Union[Unset, bool]
### room_type
```python
-room_type: Union[Unset, RoomConfigRoomType]
+room_type: Union[Unset, RoomType]
```
### video_codec
```python
-video_codec: Union[Unset, RoomConfigVideoCodec]
+video_codec: Union[Unset, VideoCodec]
```
@@ -66,12 +64,6 @@ webhook_url: Union[NoneType, Unset, str]
```
-### additional_properties
-```python
-additional_properties: dict[str, typing.Any]
-```
-
-
### to_dict
```python
def to_dict(self) -> dict[str, typing.Any]
@@ -84,29 +76,23 @@ def from_dict(cls: type[~T], src_dict: Mapping[str, typing.Any]) -> ~T
```
-### additional_keys
-```python
-additional_keys: list[str]
-```
-
-
---
-## RoomConfigVideoCodec
+## VideoCodec
```python
-class RoomConfigVideoCodec(str, enum.Enum):
+class VideoCodec(str, enum.Enum):
```
Enforces video codec for each peer in the room
### H264
```python
-H264 =
+H264 =
```
### VP8
```python
-VP8 =
+VP8 =
```
@@ -116,50 +102,50 @@ VP8 =
* `name`
* `value`
---
-## RoomConfigRoomType
+## RoomType
```python
-class RoomConfigRoomType(str, enum.Enum):
+class RoomType(str, enum.Enum):
```
The use-case of the room. If not provided, this defaults to conference.
### AUDIO_ONLY
```python
-AUDIO_ONLY =
+AUDIO_ONLY =
```
### AUDIO_ONLY_LIVESTREAM
```python
-AUDIO_ONLY_LIVESTREAM =
+AUDIO_ONLY_LIVESTREAM =
```
### BROADCASTER
```python
-BROADCASTER =
+BROADCASTER =
```
### CONFERENCE
```python
-CONFERENCE =
+CONFERENCE =
```
### FULL_FEATURE
```python
-FULL_FEATURE =
+FULL_FEATURE =
```
### LIVESTREAM
```python
-LIVESTREAM =
+LIVESTREAM =
```
diff --git a/versioned_docs/version-0.23.0/api/server/classes/BadRequestException.md b/versioned_docs/version-0.26.0/api/server/classes/BadRequestException.md
similarity index 68%
rename from versioned_docs/version-0.23.0/api/server/classes/BadRequestException.md
rename to versioned_docs/version-0.26.0/api/server/classes/BadRequestException.md
index 85999704..49c4b8cf 100644
--- a/versioned_docs/version-0.23.0/api/server/classes/BadRequestException.md
+++ b/versioned_docs/version-0.26.0/api/server/classes/BadRequestException.md
@@ -1,6 +1,6 @@
# Class: BadRequestException
-Defined in: [js-server-sdk/src/exceptions/index.ts:21](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L21)
+Defined in: [js-server-sdk/src/exceptions/index.ts:21](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L21)
## Extends
@@ -12,7 +12,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:21](https://github.com/fishja
> **new BadRequestException**(`error`): `BadRequestException`
-Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L13)
+Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L13)
#### Parameters
@@ -34,7 +34,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishja
> `optional` **axiosCode**: `string`
-Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L11)
+Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L11)
#### Inherited from
@@ -46,7 +46,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishja
> `optional` **details**: `string`
-Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L12)
+Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L12)
#### Inherited from
@@ -58,7 +58,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishja
> **statusCode**: `number`
-Defined in: [js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L10)
+Defined in: [js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L10)
#### Inherited from
diff --git a/versioned_docs/version-0.26.0/api/server/classes/FishjamAgent.md b/versioned_docs/version-0.26.0/api/server/classes/FishjamAgent.md
new file mode 100644
index 00000000..9b655253
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/server/classes/FishjamAgent.md
@@ -0,0 +1,169 @@
+# Class: FishjamAgent
+
+Defined in: [js-server-sdk/src/agent.ts:50](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/agent.ts#L50)
+
+## Extends
+
+- `TypedEventEmitter`\<[`AgentEvents`](../type-aliases/AgentEvents.md), `this`\>
+
+## Constructors
+
+### Constructor
+
+> **new FishjamAgent**(`config`, `agentToken`, `callbacks?`): `FishjamAgent`
+
+Defined in: [js-server-sdk/src/agent.ts:57](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/agent.ts#L57)
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `config` | [`FishjamConfig`](../type-aliases/FishjamConfig.md) |
+| `agentToken` | `string` |
+| `callbacks?` | [`AgentCallbacks`](../type-aliases/AgentCallbacks.md) |
+
+#### Returns
+
+`FishjamAgent`
+
+#### Overrides
+
+`(EventEmitter as new () => TypedEmitter).constructor`
+
+## Methods
+
+### awaitConnected()
+
+> **awaitConnected**(): `Promise`\<`void`\>
+
+Defined in: [js-server-sdk/src/agent.ts:84](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/agent.ts#L84)
+
+Await Agent connection to Fishjam.
+
+#### Returns
+
+`Promise`\<`void`\>
+
+***
+
+### captureImage()
+
+> **captureImage**(`trackId`, `timeoutMs`): `Promise`\<`AgentResponse_TrackImage`\>
+
+Defined in: [js-server-sdk/src/agent.ts:145](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/agent.ts#L145)
+
+Request a captured image from the given track
+
+#### Parameters
+
+| Parameter | Type | Default value | Description |
+| ------ | ------ | ------ | ------ |
+| `trackId` | `string` | `undefined` | the track to capture an image from |
+| `timeoutMs` | `number` | `5000` | timeout in milliseconds (default: 5000) |
+
+#### Returns
+
+`Promise`\<`AgentResponse_TrackImage`\>
+
+a promise that resolves with the captured image data
+
+***
+
+### createTrack()
+
+> **createTrack**(`codecParameters`, `metadata`): [`AgentTrack`](../type-aliases/AgentTrack.md)
+
+Defined in: [js-server-sdk/src/agent.ts:92](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/agent.ts#L92)
+
+Creates an outgoing audio track for the agent
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `codecParameters` | [`AudioCodecParameters`](../type-aliases/AudioCodecParameters.md) |
+| `metadata` | `object` |
+
+#### Returns
+
+[`AgentTrack`](../type-aliases/AgentTrack.md)
+
+a new audio track
+
+***
+
+### deleteTrack()
+
+> **deleteTrack**(`trackId`): `void`
+
+Defined in: [js-server-sdk/src/agent.ts:124](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/agent.ts#L124)
+
+Deletes an outgoing audio track for the agent
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `trackId` | [`TrackId`](../type-aliases/TrackId.md) |
+
+#### Returns
+
+`void`
+
+***
+
+### disconnect()
+
+> **disconnect**(): `void`
+
+Defined in: [js-server-sdk/src/agent.ts:170](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/agent.ts#L170)
+
+#### Returns
+
+`void`
+
+***
+
+### interruptTrack()
+
+> **interruptTrack**(`trackId`): `void`
+
+Defined in: [js-server-sdk/src/agent.ts:115](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/agent.ts#L115)
+
+Interrupt track identified by `trackId`.
+
+Any audio that has been sent by the agent, but not played
+by Fishjam will be cleared and be prevented from playing.
+
+Audio sent after the interrupt will be played normally.
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `trackId` | [`TrackId`](../type-aliases/TrackId.md) |
+
+#### Returns
+
+`void`
+
+***
+
+### sendData()
+
+> **sendData**(`trackId`, `data`): `void`
+
+Defined in: [js-server-sdk/src/agent.ts:133](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/agent.ts#L133)
+
+Send audio data for the given track
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `trackId` | [`TrackId`](../type-aliases/TrackId.md) |
+| `data` | `Uint8Array` |
+
+#### Returns
+
+`void`
diff --git a/versioned_docs/version-0.23.0/api/server/classes/FishjamBaseException.md b/versioned_docs/version-0.26.0/api/server/classes/FishjamBaseException.md
similarity index 67%
rename from versioned_docs/version-0.23.0/api/server/classes/FishjamBaseException.md
rename to versioned_docs/version-0.26.0/api/server/classes/FishjamBaseException.md
index b45c169c..de1f9ca1 100644
--- a/versioned_docs/version-0.23.0/api/server/classes/FishjamBaseException.md
+++ b/versioned_docs/version-0.26.0/api/server/classes/FishjamBaseException.md
@@ -1,6 +1,6 @@
# Class: FishjamBaseException
-Defined in: [js-server-sdk/src/exceptions/index.ts:9](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L9)
+Defined in: [js-server-sdk/src/exceptions/index.ts:9](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L9)
## Extends
@@ -23,7 +23,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:9](https://github.com/fishjam
> **new FishjamBaseException**(`error`): `FishjamBaseException`
-Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L13)
+Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L13)
#### Parameters
@@ -45,7 +45,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishja
> `optional` **axiosCode**: `string`
-Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L11)
+Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L11)
***
@@ -53,7 +53,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishja
> `optional` **details**: `string`
-Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L12)
+Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L12)
***
@@ -61,4 +61,4 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishja
> **statusCode**: `number`
-Defined in: [js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L10)
+Defined in: [js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L10)
diff --git a/versioned_docs/version-0.23.0/api/server/classes/FishjamClient.md b/versioned_docs/version-0.26.0/api/server/classes/FishjamClient.md
similarity index 63%
rename from versioned_docs/version-0.23.0/api/server/classes/FishjamClient.md
rename to versioned_docs/version-0.26.0/api/server/classes/FishjamClient.md
index 370c9680..1e21323c 100644
--- a/versioned_docs/version-0.23.0/api/server/classes/FishjamClient.md
+++ b/versioned_docs/version-0.26.0/api/server/classes/FishjamClient.md
@@ -1,6 +1,6 @@
# Class: FishjamClient
-Defined in: [js-server-sdk/src/client.ts:20](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/client.ts#L20)
+Defined in: [js-server-sdk/src/client.ts:22](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/client.ts#L22)
Client class that allows to manage Rooms and Peers for a Fishjam App.
It requires the Fishjam ID and management token that can be retrieved from the Fishjam Dashboard.
@@ -11,7 +11,7 @@ It requires the Fishjam ID and management token that can be retrieved from the F
> **new FishjamClient**(`config`): `FishjamClient`
-Defined in: [js-server-sdk/src/client.ts:37](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/client.ts#L37)
+Defined in: [js-server-sdk/src/client.ts:40](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/client.ts#L40)
Create new instance of Fishjam Client.
@@ -39,7 +39,7 @@ const fishjamClient = new FishjamClient({
> **createAgent**(`roomId`, `options`, `callbacks?`): `Promise`\<\{ `agent`: [`FishjamAgent`](FishjamAgent.md); `peer`: [`Peer`](../type-aliases/Peer.md); \}\>
-Defined in: [js-server-sdk/src/client.ts:117](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/client.ts#L117)
+Defined in: [js-server-sdk/src/client.ts:143](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/client.ts#L143)
Create a new agent assigned to a room.
@@ -48,7 +48,7 @@ Create a new agent assigned to a room.
| Parameter | Type |
| ------ | ------ |
| `roomId` | [`RoomId`](../type-aliases/RoomId.md) |
-| `options` | `PeerOptionsAgent` |
+| `options` | [`PeerOptionsAgent`](../interfaces/PeerOptionsAgent.md) |
| `callbacks?` | [`AgentCallbacks`](../type-aliases/AgentCallbacks.md) |
#### Returns
@@ -61,7 +61,7 @@ Create a new agent assigned to a room.
> **createLivestreamStreamerToken**(`roomId`): `Promise`\<[`StreamerToken`](../interfaces/StreamerToken.md)\>
-Defined in: [js-server-sdk/src/client.ts:217](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/client.ts#L217)
+Defined in: [js-server-sdk/src/client.ts:264](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/client.ts#L264)
Creates a livestream streamer token for the given room.
@@ -83,7 +83,7 @@ a livestream streamer token
> **createLivestreamViewerToken**(`roomId`): `Promise`\<[`ViewerToken`](../interfaces/ViewerToken.md)\>
-Defined in: [js-server-sdk/src/client.ts:204](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/client.ts#L204)
+Defined in: [js-server-sdk/src/client.ts:251](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/client.ts#L251)
Creates a livestream viewer token for the given room.
@@ -105,7 +105,7 @@ a livestream viewer token
> **createPeer**(`roomId`, `options`): `Promise`\<\{ `peer`: [`Peer`](../type-aliases/Peer.md); `peerToken`: `string`; \}\>
-Defined in: [js-server-sdk/src/client.ts:97](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/client.ts#L97)
+Defined in: [js-server-sdk/src/client.ts:123](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/client.ts#L123)
Create a new peer assigned to a room.
@@ -114,7 +114,7 @@ Create a new peer assigned to a room.
| Parameter | Type |
| ------ | ------ |
| `roomId` | [`RoomId`](../type-aliases/RoomId.md) |
-| `options` | `PeerOptionsWebRTC` |
+| `options` | [`PeerOptionsWebRTC`](../interfaces/PeerOptionsWebRTC.md) |
#### Returns
@@ -126,7 +126,7 @@ Create a new peer assigned to a room.
> **createRoom**(`config`): `Promise`\<[`Room`](../type-aliases/Room.md)\>
-Defined in: [js-server-sdk/src/client.ts:55](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/client.ts#L55)
+Defined in: [js-server-sdk/src/client.ts:81](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/client.ts#L81)
Create a new room. All peers connected to the same room will be able to send/receive streams to each other.
@@ -142,11 +142,32 @@ Create a new room. All peers connected to the same room will be able to send/rec
***
+### createVapiAgent()
+
+> **createVapiAgent**(`roomId`, `options`): `Promise`\<\{ `peer`: [`Peer`](../type-aliases/Peer.md); \}\>
+
+Defined in: [js-server-sdk/src/client.ts:169](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/client.ts#L169)
+
+Create a new VAPI agent assigned to a room.
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `roomId` | [`RoomId`](../type-aliases/RoomId.md) |
+| `options` | [`PeerOptionsVapi`](../interfaces/PeerOptionsVapi.md) |
+
+#### Returns
+
+`Promise`\<\{ `peer`: [`Peer`](../type-aliases/Peer.md); \}\>
+
+***
+
### deletePeer()
> **deletePeer**(`roomId`, `peerId`): `Promise`\<`void`\>
-Defined in: [js-server-sdk/src/client.ts:154](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/client.ts#L154)
+Defined in: [js-server-sdk/src/client.ts:201](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/client.ts#L201)
Delete a peer - this will also disconnect the peer from the room.
@@ -167,7 +188,7 @@ Delete a peer - this will also disconnect the peer from the room.
> **deleteRoom**(`roomId`): `Promise`\<`void`\>
-Defined in: [js-server-sdk/src/client.ts:74](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/client.ts#L74)
+Defined in: [js-server-sdk/src/client.ts:100](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/client.ts#L100)
Delete an existing room. All peers connected to this room will be disconnected and removed.
@@ -187,7 +208,7 @@ Delete an existing room. All peers connected to this room will be disconnected a
> **getAllRooms**(): `Promise`\<[`Room`](../type-aliases/Room.md)[]\>
-Defined in: [js-server-sdk/src/client.ts:85](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/client.ts#L85)
+Defined in: [js-server-sdk/src/client.ts:111](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/client.ts#L111)
Get a list of all existing rooms.
@@ -201,7 +222,7 @@ Get a list of all existing rooms.
> **getRoom**(`roomId`): `Promise`\<[`Room`](../type-aliases/Room.md)\>
-Defined in: [js-server-sdk/src/client.ts:142](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/client.ts#L142)
+Defined in: [js-server-sdk/src/client.ts:189](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/client.ts#L189)
Get details about a given room.
@@ -221,7 +242,7 @@ Get details about a given room.
> **refreshPeerToken**(`roomId`, `peerId`): `Promise`\<`string`\>
-Defined in: [js-server-sdk/src/client.ts:191](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/client.ts#L191)
+Defined in: [js-server-sdk/src/client.ts:238](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/client.ts#L238)
Refresh the peer token for an already existing peer.
If an already created peer has not been connected to the room for more than 24 hours, the token will become invalid. This method can be used to generate a new peer token for the existing peer.
@@ -245,7 +266,7 @@ refreshed peer token
> **subscribePeer**(`roomId`, `subscriberPeerId`, `publisherPeerId`): `Promise`\<`void`\>
-Defined in: [js-server-sdk/src/client.ts:166](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/client.ts#L166)
+Defined in: [js-server-sdk/src/client.ts:213](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/client.ts#L213)
Subscribe a peer to another peer - this will make all tracks from the publisher available to the subscriber.
Using this function only makes sense if subscribeMode is set to manual
@@ -268,7 +289,7 @@ Using this function only makes sense if subscribeMode is set to manual
> **subscribeTracks**(`roomId`, `subscriberPeerId`, `tracks`): `Promise`\<`void`\>
-Defined in: [js-server-sdk/src/client.ts:178](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/client.ts#L178)
+Defined in: [js-server-sdk/src/client.ts:225](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/client.ts#L225)
Subscribe a peer to specific tracks from another peer - this will make only the specified tracks from the publisher available to the subscriber.
Using this function only makes sense if subscribeMode is set to manual
diff --git a/versioned_docs/version-0.23.0/api/server/classes/FishjamNotFoundException.md b/versioned_docs/version-0.26.0/api/server/classes/FishjamNotFoundException.md
similarity index 68%
rename from versioned_docs/version-0.23.0/api/server/classes/FishjamNotFoundException.md
rename to versioned_docs/version-0.26.0/api/server/classes/FishjamNotFoundException.md
index ff8227ff..65f8b4dc 100644
--- a/versioned_docs/version-0.23.0/api/server/classes/FishjamNotFoundException.md
+++ b/versioned_docs/version-0.26.0/api/server/classes/FishjamNotFoundException.md
@@ -1,6 +1,6 @@
# Class: FishjamNotFoundException
-Defined in: [js-server-sdk/src/exceptions/index.ts:29](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L29)
+Defined in: [js-server-sdk/src/exceptions/index.ts:29](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L29)
## Extends
@@ -12,7 +12,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:29](https://github.com/fishja
> **new FishjamNotFoundException**(`error`): `FishjamNotFoundException`
-Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L13)
+Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L13)
#### Parameters
@@ -34,7 +34,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishja
> `optional` **axiosCode**: `string`
-Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L11)
+Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L11)
#### Inherited from
@@ -46,7 +46,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishja
> `optional` **details**: `string`
-Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L12)
+Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L12)
#### Inherited from
@@ -58,7 +58,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishja
> **statusCode**: `number`
-Defined in: [js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L10)
+Defined in: [js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L10)
#### Inherited from
diff --git a/versioned_docs/version-0.23.0/api/server/classes/FishjamWSNotifier.md b/versioned_docs/version-0.26.0/api/server/classes/FishjamWSNotifier.md
similarity index 77%
rename from versioned_docs/version-0.23.0/api/server/classes/FishjamWSNotifier.md
rename to versioned_docs/version-0.26.0/api/server/classes/FishjamWSNotifier.md
index 8811bf7d..7f97a965 100644
--- a/versioned_docs/version-0.23.0/api/server/classes/FishjamWSNotifier.md
+++ b/versioned_docs/version-0.26.0/api/server/classes/FishjamWSNotifier.md
@@ -1,6 +1,6 @@
# Class: FishjamWSNotifier
-Defined in: [js-server-sdk/src/ws\_notifier.ts:76](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/ws_notifier.ts#L76)
+Defined in: [js-server-sdk/src/ws\_notifier.ts:76](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/ws_notifier.ts#L76)
Notifier object that can be used to get notified about various events related to the Fishjam App.
@@ -14,7 +14,7 @@ Notifier object that can be used to get notified about various events related to
> **new FishjamWSNotifier**(`config`, `onError`, `onClose`): `FishjamWSNotifier`
-Defined in: [js-server-sdk/src/ws\_notifier.ts:79](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/ws_notifier.ts#L79)
+Defined in: [js-server-sdk/src/ws\_notifier.ts:79](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/ws_notifier.ts#L79)
#### Parameters
diff --git a/versioned_docs/version-0.23.0/api/server/classes/ForbiddenException.md b/versioned_docs/version-0.26.0/api/server/classes/ForbiddenException.md
similarity index 68%
rename from versioned_docs/version-0.23.0/api/server/classes/ForbiddenException.md
rename to versioned_docs/version-0.26.0/api/server/classes/ForbiddenException.md
index cc433b05..7e6ff13c 100644
--- a/versioned_docs/version-0.23.0/api/server/classes/ForbiddenException.md
+++ b/versioned_docs/version-0.26.0/api/server/classes/ForbiddenException.md
@@ -1,6 +1,6 @@
# Class: ForbiddenException
-Defined in: [js-server-sdk/src/exceptions/index.ts:25](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L25)
+Defined in: [js-server-sdk/src/exceptions/index.ts:25](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L25)
## Extends
@@ -12,7 +12,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:25](https://github.com/fishja
> **new ForbiddenException**(`error`): `ForbiddenException`
-Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L13)
+Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L13)
#### Parameters
@@ -34,7 +34,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishja
> `optional` **axiosCode**: `string`
-Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L11)
+Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L11)
#### Inherited from
@@ -46,7 +46,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishja
> `optional` **details**: `string`
-Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L12)
+Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L12)
#### Inherited from
@@ -58,7 +58,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishja
> **statusCode**: `number`
-Defined in: [js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L10)
+Defined in: [js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L10)
#### Inherited from
diff --git a/versioned_docs/version-0.23.0/api/server/classes/MissingFishjamIdException.md b/versioned_docs/version-0.26.0/api/server/classes/MissingFishjamIdException.md
similarity index 59%
rename from versioned_docs/version-0.23.0/api/server/classes/MissingFishjamIdException.md
rename to versioned_docs/version-0.26.0/api/server/classes/MissingFishjamIdException.md
index 6a18f2b2..255adf4e 100644
--- a/versioned_docs/version-0.23.0/api/server/classes/MissingFishjamIdException.md
+++ b/versioned_docs/version-0.26.0/api/server/classes/MissingFishjamIdException.md
@@ -1,6 +1,6 @@
# Class: MissingFishjamIdException
-Defined in: [js-server-sdk/src/exceptions/index.ts:3](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L3)
+Defined in: [js-server-sdk/src/exceptions/index.ts:3](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L3)
## Extends
@@ -12,7 +12,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:3](https://github.com/fishjam
> **new MissingFishjamIdException**(): `MissingFishjamIdException`
-Defined in: [js-server-sdk/src/exceptions/index.ts:4](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L4)
+Defined in: [js-server-sdk/src/exceptions/index.ts:4](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L4)
#### Returns
diff --git a/versioned_docs/version-0.23.0/api/server/classes/PeerNotFoundException.md b/versioned_docs/version-0.26.0/api/server/classes/PeerNotFoundException.md
similarity index 68%
rename from versioned_docs/version-0.23.0/api/server/classes/PeerNotFoundException.md
rename to versioned_docs/version-0.26.0/api/server/classes/PeerNotFoundException.md
index 2941fc35..72771d31 100644
--- a/versioned_docs/version-0.23.0/api/server/classes/PeerNotFoundException.md
+++ b/versioned_docs/version-0.26.0/api/server/classes/PeerNotFoundException.md
@@ -1,6 +1,6 @@
# Class: PeerNotFoundException
-Defined in: [js-server-sdk/src/exceptions/index.ts:31](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L31)
+Defined in: [js-server-sdk/src/exceptions/index.ts:31](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L31)
## Extends
@@ -12,7 +12,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:31](https://github.com/fishja
> **new PeerNotFoundException**(`error`): `PeerNotFoundException`
-Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L13)
+Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L13)
#### Parameters
@@ -34,7 +34,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishja
> `optional` **axiosCode**: `string`
-Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L11)
+Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L11)
#### Inherited from
@@ -46,7 +46,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishja
> `optional` **details**: `string`
-Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L12)
+Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L12)
#### Inherited from
@@ -58,7 +58,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishja
> **statusCode**: `number`
-Defined in: [js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L10)
+Defined in: [js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L10)
#### Inherited from
diff --git a/versioned_docs/version-0.23.0/api/server/classes/RoomNotFoundException.md b/versioned_docs/version-0.26.0/api/server/classes/RoomNotFoundException.md
similarity index 68%
rename from versioned_docs/version-0.23.0/api/server/classes/RoomNotFoundException.md
rename to versioned_docs/version-0.26.0/api/server/classes/RoomNotFoundException.md
index 7faf5412..b13e1cc3 100644
--- a/versioned_docs/version-0.23.0/api/server/classes/RoomNotFoundException.md
+++ b/versioned_docs/version-0.26.0/api/server/classes/RoomNotFoundException.md
@@ -1,6 +1,6 @@
# Class: RoomNotFoundException
-Defined in: [js-server-sdk/src/exceptions/index.ts:27](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L27)
+Defined in: [js-server-sdk/src/exceptions/index.ts:27](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L27)
## Extends
@@ -12,7 +12,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:27](https://github.com/fishja
> **new RoomNotFoundException**(`error`): `RoomNotFoundException`
-Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L13)
+Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L13)
#### Parameters
@@ -34,7 +34,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishja
> `optional` **axiosCode**: `string`
-Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L11)
+Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L11)
#### Inherited from
@@ -46,7 +46,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishja
> `optional` **details**: `string`
-Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L12)
+Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L12)
#### Inherited from
@@ -58,7 +58,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishja
> **statusCode**: `number`
-Defined in: [js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L10)
+Defined in: [js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L10)
#### Inherited from
diff --git a/versioned_docs/version-0.23.0/api/server/classes/ServiceUnavailableException.md b/versioned_docs/version-0.26.0/api/server/classes/ServiceUnavailableException.md
similarity index 68%
rename from versioned_docs/version-0.23.0/api/server/classes/ServiceUnavailableException.md
rename to versioned_docs/version-0.26.0/api/server/classes/ServiceUnavailableException.md
index 3d00ee5f..1d7b6da4 100644
--- a/versioned_docs/version-0.23.0/api/server/classes/ServiceUnavailableException.md
+++ b/versioned_docs/version-0.26.0/api/server/classes/ServiceUnavailableException.md
@@ -1,6 +1,6 @@
# Class: ServiceUnavailableException
-Defined in: [js-server-sdk/src/exceptions/index.ts:33](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L33)
+Defined in: [js-server-sdk/src/exceptions/index.ts:33](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L33)
## Extends
@@ -12,7 +12,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:33](https://github.com/fishja
> **new ServiceUnavailableException**(`error`): `ServiceUnavailableException`
-Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L13)
+Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L13)
#### Parameters
@@ -34,7 +34,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishja
> `optional` **axiosCode**: `string`
-Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L11)
+Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L11)
#### Inherited from
@@ -46,7 +46,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishja
> `optional` **details**: `string`
-Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L12)
+Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L12)
#### Inherited from
@@ -58,7 +58,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishja
> **statusCode**: `number`
-Defined in: [js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L10)
+Defined in: [js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L10)
#### Inherited from
diff --git a/versioned_docs/version-0.23.0/api/server/classes/UnauthorizedException.md b/versioned_docs/version-0.26.0/api/server/classes/UnauthorizedException.md
similarity index 68%
rename from versioned_docs/version-0.23.0/api/server/classes/UnauthorizedException.md
rename to versioned_docs/version-0.26.0/api/server/classes/UnauthorizedException.md
index 69b4fc8b..abb15b79 100644
--- a/versioned_docs/version-0.23.0/api/server/classes/UnauthorizedException.md
+++ b/versioned_docs/version-0.26.0/api/server/classes/UnauthorizedException.md
@@ -1,6 +1,6 @@
# Class: UnauthorizedException
-Defined in: [js-server-sdk/src/exceptions/index.ts:23](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L23)
+Defined in: [js-server-sdk/src/exceptions/index.ts:23](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L23)
## Extends
@@ -12,7 +12,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:23](https://github.com/fishja
> **new UnauthorizedException**(`error`): `UnauthorizedException`
-Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L13)
+Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L13)
#### Parameters
@@ -34,7 +34,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishja
> `optional` **axiosCode**: `string`
-Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L11)
+Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L11)
#### Inherited from
@@ -46,7 +46,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishja
> `optional` **details**: `string`
-Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L12)
+Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L12)
#### Inherited from
@@ -58,7 +58,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishja
> **statusCode**: `number`
-Defined in: [js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L10)
+Defined in: [js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L10)
#### Inherited from
diff --git a/versioned_docs/version-0.23.0/api/server/classes/UnknownException.md b/versioned_docs/version-0.26.0/api/server/classes/UnknownException.md
similarity index 68%
rename from versioned_docs/version-0.23.0/api/server/classes/UnknownException.md
rename to versioned_docs/version-0.26.0/api/server/classes/UnknownException.md
index c9e58d93..3f3ce394 100644
--- a/versioned_docs/version-0.23.0/api/server/classes/UnknownException.md
+++ b/versioned_docs/version-0.26.0/api/server/classes/UnknownException.md
@@ -1,6 +1,6 @@
# Class: UnknownException
-Defined in: [js-server-sdk/src/exceptions/index.ts:35](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L35)
+Defined in: [js-server-sdk/src/exceptions/index.ts:35](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L35)
## Extends
@@ -12,7 +12,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:35](https://github.com/fishja
> **new UnknownException**(`error`): `UnknownException`
-Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L13)
+Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L13)
#### Parameters
@@ -34,7 +34,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishja
> `optional` **axiosCode**: `string`
-Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L11)
+Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L11)
#### Inherited from
@@ -46,7 +46,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishja
> `optional` **details**: `string`
-Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L12)
+Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L12)
#### Inherited from
@@ -58,7 +58,7 @@ Defined in: [js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishja
> **statusCode**: `number`
-Defined in: [js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/exceptions/index.ts#L10)
+Defined in: [js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/exceptions/index.ts#L10)
#### Inherited from
diff --git a/versioned_docs/version-0.23.0/api/server/enumerations/PeerStatus.md b/versioned_docs/version-0.26.0/api/server/enumerations/PeerStatus.md
similarity index 58%
rename from versioned_docs/version-0.23.0/api/server/enumerations/PeerStatus.md
rename to versioned_docs/version-0.26.0/api/server/enumerations/PeerStatus.md
index 800cc703..e8b1cb45 100644
--- a/versioned_docs/version-0.23.0/api/server/enumerations/PeerStatus.md
+++ b/versioned_docs/version-0.26.0/api/server/enumerations/PeerStatus.md
@@ -1,6 +1,6 @@
# Enumeration: PeerStatus
-Defined in: fishjam-openapi/dist/index.d.ts:369
+Defined in: fishjam-openapi/dist/index.d.ts:407
Informs about the peer status
@@ -12,7 +12,7 @@ Informs about the peer status
> **Connected**: `"connected"`
-Defined in: fishjam-openapi/dist/index.d.ts:370
+Defined in: fishjam-openapi/dist/index.d.ts:408
***
@@ -20,4 +20,4 @@ Defined in: fishjam-openapi/dist/index.d.ts:370
> **Disconnected**: `"disconnected"`
-Defined in: fishjam-openapi/dist/index.d.ts:371
+Defined in: fishjam-openapi/dist/index.d.ts:409
diff --git a/versioned_docs/version-0.26.0/api/server/enumerations/RoomType.md b/versioned_docs/version-0.26.0/api/server/enumerations/RoomType.md
new file mode 100644
index 00000000..dbda38c4
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/server/enumerations/RoomType.md
@@ -0,0 +1,55 @@
+# Enumeration: RoomType
+
+Defined in: fishjam-openapi/dist/index.d.ts:535
+
+The use-case of the room. If not provided, this defaults to conference.
+
+## Export
+
+## Enumeration Members
+
+### AudioOnly
+
+> **AudioOnly**: `"audio_only"`
+
+Defined in: fishjam-openapi/dist/index.d.ts:537
+
+***
+
+### AudioOnlyLivestream
+
+> **AudioOnlyLivestream**: `"audio_only_livestream"`
+
+Defined in: fishjam-openapi/dist/index.d.ts:541
+
+***
+
+### Broadcaster
+
+> **Broadcaster**: `"broadcaster"`
+
+Defined in: fishjam-openapi/dist/index.d.ts:538
+
+***
+
+### Conference
+
+> **Conference**: `"conference"`
+
+Defined in: fishjam-openapi/dist/index.d.ts:540
+
+***
+
+### FullFeature
+
+> **FullFeature**: `"full_feature"`
+
+Defined in: fishjam-openapi/dist/index.d.ts:536
+
+***
+
+### Livestream
+
+> **Livestream**: `"livestream"`
+
+Defined in: fishjam-openapi/dist/index.d.ts:539
diff --git a/versioned_docs/version-0.26.0/api/server/enumerations/VideoCodec.md b/versioned_docs/version-0.26.0/api/server/enumerations/VideoCodec.md
new file mode 100644
index 00000000..a507aa12
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/server/enumerations/VideoCodec.md
@@ -0,0 +1,23 @@
+# Enumeration: VideoCodec
+
+Defined in: fishjam-openapi/dist/index.d.ts:833
+
+Enforces video codec for each peer in the room
+
+## Export
+
+## Enumeration Members
+
+### H264
+
+> **H264**: `"h264"`
+
+Defined in: fishjam-openapi/dist/index.d.ts:834
+
+***
+
+### Vp8
+
+> **Vp8**: `"vp8"`
+
+Defined in: fishjam-openapi/dist/index.d.ts:835
diff --git a/versioned_docs/version-0.23.0/api/server/index.md b/versioned_docs/version-0.26.0/api/server/index.md
similarity index 86%
rename from versioned_docs/version-0.23.0/api/server/index.md
rename to versioned_docs/version-0.26.0/api/server/index.md
index 85a094a1..7e0409dd 100644
--- a/versioned_docs/version-0.23.0/api/server/index.md
+++ b/versioned_docs/version-0.26.0/api/server/index.md
@@ -1,5 +1,7 @@
# @fishjam-cloud/js-server-sdk
+Server-side Node.js SDK for creating and managing Fishjam rooms, peers, agents, and receiving real-time server notifications.
+
## Client
- [FishjamClient](classes/FishjamClient.md)
@@ -8,6 +10,8 @@
## Other
- [PeerStatus](enumerations/PeerStatus.md)
+- [RoomType](enumerations/RoomType.md)
+- [VideoCodec](enumerations/VideoCodec.md)
- [BadRequestException](classes/BadRequestException.md)
- [FishjamAgent](classes/FishjamAgent.md)
- [FishjamBaseException](classes/FishjamBaseException.md)
@@ -19,6 +23,9 @@
- [ServiceUnavailableException](classes/ServiceUnavailableException.md)
- [UnauthorizedException](classes/UnauthorizedException.md)
- [UnknownException](classes/UnknownException.md)
+- [PeerOptionsAgent](interfaces/PeerOptionsAgent.md)
+- [PeerOptionsVapi](interfaces/PeerOptionsVapi.md)
+- [PeerOptionsWebRTC](interfaces/PeerOptionsWebRTC.md)
- [RoomConfig](interfaces/RoomConfig.md)
- [ServerMessage](interfaces/ServerMessage.md)
- [StreamerToken](interfaces/StreamerToken.md)
@@ -34,6 +41,7 @@
- [ExpectedEvents](type-aliases/ExpectedEvents.md)
- [FishjamConfig](type-aliases/FishjamConfig.md)
- [IncomingTrackData](type-aliases/IncomingTrackData.md)
+- [IncomingTrackImage](type-aliases/IncomingTrackImage.md)
- [NotificationEvents](type-aliases/NotificationEvents.md)
- [OutgoingTrackData](type-aliases/OutgoingTrackData.md)
- [Peer](type-aliases/Peer.md)
@@ -46,8 +54,6 @@
- [PeerMetadataUpdated](type-aliases/PeerMetadataUpdated.md)
- [PeerOptions](type-aliases/PeerOptions.md)
- [Room](type-aliases/Room.md)
-- [RoomConfigRoomTypeEnum](type-aliases/RoomConfigRoomTypeEnum.md)
-- [RoomConfigVideoCodecEnum](type-aliases/RoomConfigVideoCodecEnum.md)
- [RoomCrashed](type-aliases/RoomCrashed.md)
- [RoomCreated](type-aliases/RoomCreated.md)
- [RoomDeleted](type-aliases/RoomDeleted.md)
@@ -61,6 +67,4 @@
- [TrackType](type-aliases/TrackType.md)
- [ViewerConnected](type-aliases/ViewerConnected.md)
- [ViewerDisconnected](type-aliases/ViewerDisconnected.md)
-- [RoomConfigRoomTypeEnum](variables/RoomConfigRoomTypeEnum.md)
-- [RoomConfigVideoCodecEnum](variables/RoomConfigVideoCodecEnum.md)
- [ServerMessage](variables/ServerMessage.md)
diff --git a/versioned_docs/version-0.26.0/api/server/interfaces/PeerOptionsAgent.md b/versioned_docs/version-0.26.0/api/server/interfaces/PeerOptionsAgent.md
new file mode 100644
index 00000000..f3ad16d0
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/server/interfaces/PeerOptionsAgent.md
@@ -0,0 +1,33 @@
+# Interface: PeerOptionsAgent
+
+Defined in: fishjam-openapi/dist/index.d.ts:316
+
+Options specific to the Agent peer
+
+## Export
+
+PeerOptionsAgent
+
+## Properties
+
+### output?
+
+> `optional` **output**: `AgentOutput`
+
+Defined in: fishjam-openapi/dist/index.d.ts:322
+
+#### Memberof
+
+PeerOptionsAgent
+
+***
+
+### subscribeMode?
+
+> `optional` **subscribeMode**: `SubscribeMode`
+
+Defined in: fishjam-openapi/dist/index.d.ts:328
+
+#### Memberof
+
+PeerOptionsAgent
diff --git a/versioned_docs/version-0.26.0/api/server/interfaces/PeerOptionsVapi.md b/versioned_docs/version-0.26.0/api/server/interfaces/PeerOptionsVapi.md
new file mode 100644
index 00000000..5bf490d3
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/server/interfaces/PeerOptionsVapi.md
@@ -0,0 +1,49 @@
+# Interface: PeerOptionsVapi
+
+Defined in: fishjam-openapi/dist/index.d.ts:335
+
+Options specific to the VAPI peer
+
+## Export
+
+PeerOptionsVapi
+
+## Properties
+
+### apiKey
+
+> **apiKey**: `string`
+
+Defined in: fishjam-openapi/dist/index.d.ts:341
+
+VAPI API key
+
+#### Memberof
+
+PeerOptionsVapi
+
+***
+
+### callId
+
+> **callId**: `string`
+
+Defined in: fishjam-openapi/dist/index.d.ts:347
+
+VAPI call ID
+
+#### Memberof
+
+PeerOptionsVapi
+
+***
+
+### subscribeMode?
+
+> `optional` **subscribeMode**: `SubscribeMode`
+
+Defined in: fishjam-openapi/dist/index.d.ts:353
+
+#### Memberof
+
+PeerOptionsVapi
diff --git a/versioned_docs/version-0.26.0/api/server/interfaces/PeerOptionsWebRTC.md b/versioned_docs/version-0.26.0/api/server/interfaces/PeerOptionsWebRTC.md
new file mode 100644
index 00000000..aba7b273
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/server/interfaces/PeerOptionsWebRTC.md
@@ -0,0 +1,39 @@
+# Interface: PeerOptionsWebRTC
+
+Defined in: fishjam-openapi/dist/index.d.ts:360
+
+Options specific to the WebRTC peer
+
+## Export
+
+PeerOptionsWebRTC
+
+## Properties
+
+### metadata?
+
+> `optional` **metadata**: `object`
+
+Defined in: fishjam-openapi/dist/index.d.ts:366
+
+Custom peer metadata
+
+#### Index Signature
+
+\[`key`: `string`\]: `any`
+
+#### Memberof
+
+PeerOptionsWebRTC
+
+***
+
+### subscribeMode?
+
+> `optional` **subscribeMode**: `SubscribeMode`
+
+Defined in: fishjam-openapi/dist/index.d.ts:374
+
+#### Memberof
+
+PeerOptionsWebRTC
diff --git a/versioned_docs/version-0.26.0/api/server/interfaces/RoomConfig.md b/versioned_docs/version-0.26.0/api/server/interfaces/RoomConfig.md
new file mode 100644
index 00000000..bb3fff3d
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/server/interfaces/RoomConfig.md
@@ -0,0 +1,75 @@
+# Interface: RoomConfig
+
+Defined in: fishjam-openapi/dist/index.d.ts:459
+
+Room configuration
+
+## Export
+
+RoomConfig
+
+## Properties
+
+### maxPeers?
+
+> `optional` **maxPeers**: `null` \| `number`
+
+Defined in: fishjam-openapi/dist/index.d.ts:465
+
+Maximum amount of peers allowed into the room
+
+#### Memberof
+
+RoomConfig
+
+***
+
+### public?
+
+> `optional` **public**: `boolean`
+
+Defined in: fishjam-openapi/dist/index.d.ts:471
+
+True if livestream viewers can omit specifying a token.
+
+#### Memberof
+
+RoomConfig
+
+***
+
+### roomType?
+
+> `optional` **roomType**: [`RoomType`](../enumerations/RoomType.md)
+
+Defined in: fishjam-openapi/dist/index.d.ts:477
+
+#### Memberof
+
+RoomConfig
+
+***
+
+### videoCodec?
+
+> `optional` **videoCodec**: [`VideoCodec`](../enumerations/VideoCodec.md)
+
+Defined in: fishjam-openapi/dist/index.d.ts:483
+
+#### Memberof
+
+RoomConfig
+
+***
+
+### webhookUrl?
+
+> `optional` **webhookUrl**: `null` \| `string`
+
+Defined in: fishjam-openapi/dist/index.d.ts:489
+
+URL where Fishjam notifications will be sent
+
+#### Memberof
+
+RoomConfig
diff --git a/versioned_docs/version-0.23.0/api/server/interfaces/ServerMessage.md b/versioned_docs/version-0.26.0/api/server/interfaces/ServerMessage.md
similarity index 71%
rename from versioned_docs/version-0.23.0/api/server/interfaces/ServerMessage.md
rename to versioned_docs/version-0.26.0/api/server/interfaces/ServerMessage.md
index afbdf3b0..8e7ec6db 100644
--- a/versioned_docs/version-0.23.0/api/server/interfaces/ServerMessage.md
+++ b/versioned_docs/version-0.26.0/api/server/interfaces/ServerMessage.md
@@ -1,6 +1,6 @@
# Interface: ServerMessage
-Defined in: fishjam-proto/dist/index.d.ts:63
+Defined in: fishjam-proto/dist/index.d.ts:72
Defines any type of message passed between FJ and server peer
@@ -10,7 +10,7 @@ Defines any type of message passed between FJ and server peer
> `optional` **authenticated**: `ServerMessage_Authenticated`
-Defined in: fishjam-proto/dist/index.d.ts:69
+Defined in: fishjam-proto/dist/index.d.ts:73
***
@@ -18,39 +18,63 @@ Defined in: fishjam-proto/dist/index.d.ts:69
> `optional` **authRequest**: `ServerMessage_AuthRequest`
-Defined in: fishjam-proto/dist/index.d.ts:70
+Defined in: fishjam-proto/dist/index.d.ts:74
+
+***
+
+### channelAdded?
+
+> `optional` **channelAdded**: `ServerMessage_ChannelAdded`
+
+Defined in: fishjam-proto/dist/index.d.ts:89
+
+***
+
+### channelRemoved?
+
+> `optional` **channelRemoved**: `ServerMessage_ChannelRemoved`
+
+Defined in: fishjam-proto/dist/index.d.ts:90
***
-### componentCrashed?
+### ~~componentCrashed?~~
> `optional` **componentCrashed**: `ServerMessage_ComponentCrashed`
-Defined in: fishjam-proto/dist/index.d.ts:68
+Defined in: fishjam-proto/dist/index.d.ts:109
+
+#### Deprecated
***
-### hlsPlayable?
+### ~~hlsPlayable?~~
> `optional` **hlsPlayable**: `ServerMessage_HlsPlayable`
-Defined in: fishjam-proto/dist/index.d.ts:75
+Defined in: fishjam-proto/dist/index.d.ts:103
+
+#### Deprecated
***
-### hlsUploadCrashed?
+### ~~hlsUploadCrashed?~~
> `optional` **hlsUploadCrashed**: `ServerMessage_HlsUploadCrashed`
-Defined in: fishjam-proto/dist/index.d.ts:77
+Defined in: fishjam-proto/dist/index.d.ts:107
+
+#### Deprecated
***
-### hlsUploaded?
+### ~~hlsUploaded?~~
> `optional` **hlsUploaded**: `ServerMessage_HlsUploaded`
-Defined in: fishjam-proto/dist/index.d.ts:76
+Defined in: fishjam-proto/dist/index.d.ts:105
+
+#### Deprecated
***
@@ -58,7 +82,7 @@ Defined in: fishjam-proto/dist/index.d.ts:76
> `optional` **peerAdded**: `ServerMessage_PeerAdded`
-Defined in: fishjam-proto/dist/index.d.ts:82
+Defined in: fishjam-proto/dist/index.d.ts:87
***
@@ -66,7 +90,7 @@ Defined in: fishjam-proto/dist/index.d.ts:82
> `optional` **peerConnected**: `ServerMessage_PeerConnected`
-Defined in: fishjam-proto/dist/index.d.ts:65
+Defined in: fishjam-proto/dist/index.d.ts:80
***
@@ -74,7 +98,7 @@ Defined in: fishjam-proto/dist/index.d.ts:65
> `optional` **peerCrashed**: `ServerMessage_PeerCrashed`
-Defined in: fishjam-proto/dist/index.d.ts:67
+Defined in: fishjam-proto/dist/index.d.ts:82
***
@@ -82,7 +106,7 @@ Defined in: fishjam-proto/dist/index.d.ts:67
> `optional` **peerDeleted**: `ServerMessage_PeerDeleted`
-Defined in: fishjam-proto/dist/index.d.ts:83
+Defined in: fishjam-proto/dist/index.d.ts:88
***
@@ -90,7 +114,7 @@ Defined in: fishjam-proto/dist/index.d.ts:83
> `optional` **peerDisconnected**: `ServerMessage_PeerDisconnected`
-Defined in: fishjam-proto/dist/index.d.ts:66
+Defined in: fishjam-proto/dist/index.d.ts:81
***
@@ -98,7 +122,7 @@ Defined in: fishjam-proto/dist/index.d.ts:66
> `optional` **peerMetadataUpdated**: `ServerMessage_PeerMetadataUpdated`
-Defined in: fishjam-proto/dist/index.d.ts:78
+Defined in: fishjam-proto/dist/index.d.ts:83
***
@@ -106,7 +130,7 @@ Defined in: fishjam-proto/dist/index.d.ts:78
> `optional` **roomCrashed**: `ServerMessage_RoomCrashed`
-Defined in: fishjam-proto/dist/index.d.ts:64
+Defined in: fishjam-proto/dist/index.d.ts:79
***
@@ -114,7 +138,7 @@ Defined in: fishjam-proto/dist/index.d.ts:64
> `optional` **roomCreated**: `ServerMessage_RoomCreated`
-Defined in: fishjam-proto/dist/index.d.ts:73
+Defined in: fishjam-proto/dist/index.d.ts:77
***
@@ -122,7 +146,7 @@ Defined in: fishjam-proto/dist/index.d.ts:73
> `optional` **roomDeleted**: `ServerMessage_RoomDeleted`
-Defined in: fishjam-proto/dist/index.d.ts:74
+Defined in: fishjam-proto/dist/index.d.ts:78
***
@@ -130,7 +154,7 @@ Defined in: fishjam-proto/dist/index.d.ts:74
> `optional` **streamConnected**: `ServerMessage_StreamConnected`
-Defined in: fishjam-proto/dist/index.d.ts:85
+Defined in: fishjam-proto/dist/index.d.ts:99
#### Deprecated
@@ -140,7 +164,7 @@ Defined in: fishjam-proto/dist/index.d.ts:85
> `optional` **streamDisconnected**: `ServerMessage_StreamDisconnected`
-Defined in: fishjam-proto/dist/index.d.ts:87
+Defined in: fishjam-proto/dist/index.d.ts:101
#### Deprecated
@@ -150,7 +174,7 @@ Defined in: fishjam-proto/dist/index.d.ts:87
> `optional` **streamerConnected**: `ServerMessage_StreamerConnected`
-Defined in: fishjam-proto/dist/index.d.ts:90
+Defined in: fishjam-proto/dist/index.d.ts:96
***
@@ -158,7 +182,7 @@ Defined in: fishjam-proto/dist/index.d.ts:90
> `optional` **streamerDisconnected**: `ServerMessage_StreamerDisconnected`
-Defined in: fishjam-proto/dist/index.d.ts:91
+Defined in: fishjam-proto/dist/index.d.ts:97
***
@@ -166,7 +190,7 @@ Defined in: fishjam-proto/dist/index.d.ts:91
> `optional` **subscribeRequest**: `ServerMessage_SubscribeRequest`
-Defined in: fishjam-proto/dist/index.d.ts:71
+Defined in: fishjam-proto/dist/index.d.ts:75
***
@@ -174,7 +198,7 @@ Defined in: fishjam-proto/dist/index.d.ts:71
> `optional` **subscribeResponse**: `ServerMessage_SubscribeResponse`
-Defined in: fishjam-proto/dist/index.d.ts:72
+Defined in: fishjam-proto/dist/index.d.ts:76
***
@@ -182,7 +206,23 @@ Defined in: fishjam-proto/dist/index.d.ts:72
> `optional` **trackAdded**: `ServerMessage_TrackAdded`
-Defined in: fishjam-proto/dist/index.d.ts:79
+Defined in: fishjam-proto/dist/index.d.ts:84
+
+***
+
+### trackForwarding?
+
+> `optional` **trackForwarding**: `ServerMessage_TrackForwarding`
+
+Defined in: fishjam-proto/dist/index.d.ts:91
+
+***
+
+### trackForwardingRemoved?
+
+> `optional` **trackForwardingRemoved**: `ServerMessage_TrackForwardingRemoved`
+
+Defined in: fishjam-proto/dist/index.d.ts:92
***
@@ -190,7 +230,7 @@ Defined in: fishjam-proto/dist/index.d.ts:79
> `optional` **trackMetadataUpdated**: `ServerMessage_TrackMetadataUpdated`
-Defined in: fishjam-proto/dist/index.d.ts:81
+Defined in: fishjam-proto/dist/index.d.ts:86
***
@@ -198,7 +238,15 @@ Defined in: fishjam-proto/dist/index.d.ts:81
> `optional` **trackRemoved**: `ServerMessage_TrackRemoved`
-Defined in: fishjam-proto/dist/index.d.ts:80
+Defined in: fishjam-proto/dist/index.d.ts:85
+
+***
+
+### vadNotification?
+
+> `optional` **vadNotification**: `ServerMessage_VadNotification`
+
+Defined in: fishjam-proto/dist/index.d.ts:93
***
@@ -206,7 +254,7 @@ Defined in: fishjam-proto/dist/index.d.ts:80
> `optional` **viewerConnected**: `ServerMessage_ViewerConnected`
-Defined in: fishjam-proto/dist/index.d.ts:88
+Defined in: fishjam-proto/dist/index.d.ts:94
***
@@ -214,4 +262,4 @@ Defined in: fishjam-proto/dist/index.d.ts:88
> `optional` **viewerDisconnected**: `ServerMessage_ViewerDisconnected`
-Defined in: fishjam-proto/dist/index.d.ts:89
+Defined in: fishjam-proto/dist/index.d.ts:95
diff --git a/versioned_docs/version-0.23.0/api/server/interfaces/StreamerToken.md b/versioned_docs/version-0.26.0/api/server/interfaces/StreamerToken.md
similarity index 66%
rename from versioned_docs/version-0.23.0/api/server/interfaces/StreamerToken.md
rename to versioned_docs/version-0.26.0/api/server/interfaces/StreamerToken.md
index 6e9e9bd4..80610e53 100644
--- a/versioned_docs/version-0.23.0/api/server/interfaces/StreamerToken.md
+++ b/versioned_docs/version-0.26.0/api/server/interfaces/StreamerToken.md
@@ -1,6 +1,6 @@
# Interface: StreamerToken
-Defined in: fishjam-openapi/dist/index.d.ts:609
+Defined in: fishjam-openapi/dist/index.d.ts:680
Token for authorizing broadcaster streamer connection
@@ -14,7 +14,7 @@ StreamerToken
> **token**: `string`
-Defined in: fishjam-openapi/dist/index.d.ts:615
+Defined in: fishjam-openapi/dist/index.d.ts:686
#### Memberof
diff --git a/versioned_docs/version-0.23.0/api/server/interfaces/ViewerToken.md b/versioned_docs/version-0.26.0/api/server/interfaces/ViewerToken.md
similarity index 65%
rename from versioned_docs/version-0.23.0/api/server/interfaces/ViewerToken.md
rename to versioned_docs/version-0.26.0/api/server/interfaces/ViewerToken.md
index bb481d01..cac2aa8c 100644
--- a/versioned_docs/version-0.23.0/api/server/interfaces/ViewerToken.md
+++ b/versioned_docs/version-0.26.0/api/server/interfaces/ViewerToken.md
@@ -1,6 +1,6 @@
# Interface: ViewerToken
-Defined in: fishjam-openapi/dist/index.d.ts:718
+Defined in: fishjam-openapi/dist/index.d.ts:875
Token for authorizing broadcaster viewer connection
@@ -14,7 +14,7 @@ ViewerToken
> **token**: `string`
-Defined in: fishjam-openapi/dist/index.d.ts:724
+Defined in: fishjam-openapi/dist/index.d.ts:881
#### Memberof
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/AgentCallbacks.md b/versioned_docs/version-0.26.0/api/server/type-aliases/AgentCallbacks.md
similarity index 56%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/AgentCallbacks.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/AgentCallbacks.md
index 51f421b4..cce27157 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/AgentCallbacks.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/AgentCallbacks.md
@@ -2,7 +2,7 @@
> **AgentCallbacks** = `object`
-Defined in: [js-server-sdk/src/types.ts:46](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/types.ts#L46)
+Defined in: [js-server-sdk/src/types.ts:46](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/types.ts#L46)
## Properties
@@ -10,7 +10,7 @@ Defined in: [js-server-sdk/src/types.ts:46](https://github.com/fishjam-cloud/js-
> `optional` **onClose**: [`CloseEventHandler`](CloseEventHandler.md)
-Defined in: [js-server-sdk/src/types.ts:48](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/types.ts#L48)
+Defined in: [js-server-sdk/src/types.ts:48](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/types.ts#L48)
***
@@ -18,4 +18,4 @@ Defined in: [js-server-sdk/src/types.ts:48](https://github.com/fishjam-cloud/js-
> `optional` **onError**: [`ErrorEventHandler`](ErrorEventHandler.md)
-Defined in: [js-server-sdk/src/types.ts:47](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/types.ts#L47)
+Defined in: [js-server-sdk/src/types.ts:47](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/types.ts#L47)
diff --git a/versioned_docs/version-0.26.0/api/server/type-aliases/AgentEvents.md b/versioned_docs/version-0.26.0/api/server/type-aliases/AgentEvents.md
new file mode 100644
index 00000000..08f7da91
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/AgentEvents.md
@@ -0,0 +1,5 @@
+# Type Alias: AgentEvents
+
+> **AgentEvents** = `{ [K in ExpectedAgentEvents]: (message: NonNullable<{ authenticated?: AgentResponse_Authenticated; trackData?: Omit & { peerId: PeerId }; trackImage?: AgentResponse_TrackImage }[K]>) => void }`
+
+Defined in: [js-server-sdk/src/agent.ts:48](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/agent.ts#L48)
diff --git a/versioned_docs/version-0.26.0/api/server/type-aliases/AgentTrack.md b/versioned_docs/version-0.26.0/api/server/type-aliases/AgentTrack.md
new file mode 100644
index 00000000..b5301aa1
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/AgentTrack.md
@@ -0,0 +1,11 @@
+# Type Alias: AgentTrack
+
+> **AgentTrack** = `Omit`\<`ProtoTrack`, `"id"`\> & `object`
+
+Defined in: [js-server-sdk/src/agent.ts:28](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/agent.ts#L28)
+
+## Type declaration
+
+### id
+
+> **id**: [`TrackId`](TrackId.md)
diff --git a/versioned_docs/version-0.26.0/api/server/type-aliases/AudioCodecParameters.md b/versioned_docs/version-0.26.0/api/server/type-aliases/AudioCodecParameters.md
new file mode 100644
index 00000000..efb0dd00
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/AudioCodecParameters.md
@@ -0,0 +1,29 @@
+# Type Alias: AudioCodecParameters
+
+> **AudioCodecParameters** = `object`
+
+Defined in: [js-server-sdk/src/agent.ts:31](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/agent.ts#L31)
+
+## Properties
+
+### channels
+
+> **channels**: `1`
+
+Defined in: [js-server-sdk/src/agent.ts:34](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/agent.ts#L34)
+
+***
+
+### encoding
+
+> **encoding**: `"opus"` \| `"pcm16"`
+
+Defined in: [js-server-sdk/src/agent.ts:32](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/agent.ts#L32)
+
+***
+
+### sampleRate
+
+> **sampleRate**: `16000` \| `24000` \| `48000`
+
+Defined in: [js-server-sdk/src/agent.ts:33](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/agent.ts#L33)
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/Brand.md b/versioned_docs/version-0.26.0/api/server/type-aliases/Brand.md
similarity index 74%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/Brand.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/Brand.md
index d284824b..ff653002 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/Brand.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/Brand.md
@@ -2,7 +2,7 @@
> **Brand**\<`T`, `TBrand`\> = `T` & `object`
-Defined in: [js-server-sdk/src/types.ts:8](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/types.ts#L8)
+Defined in: [js-server-sdk/src/types.ts:8](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/types.ts#L8)
Branded type helper
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/CloseEventHandler.md b/versioned_docs/version-0.26.0/api/server/type-aliases/CloseEventHandler.md
similarity index 70%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/CloseEventHandler.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/CloseEventHandler.md
index 9c9547ad..eb044f9b 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/CloseEventHandler.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/CloseEventHandler.md
@@ -2,7 +2,7 @@
> **CloseEventHandler** = (`code`, `reason`) => `void`
-Defined in: [js-server-sdk/src/types.ts:44](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/types.ts#L44)
+Defined in: [js-server-sdk/src/types.ts:44](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/types.ts#L44)
## Parameters
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/ErrorEventHandler.md b/versioned_docs/version-0.26.0/api/server/type-aliases/ErrorEventHandler.md
similarity index 67%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/ErrorEventHandler.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/ErrorEventHandler.md
index d2403c2f..d3e8b1ab 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/ErrorEventHandler.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/ErrorEventHandler.md
@@ -2,7 +2,7 @@
> **ErrorEventHandler** = (`msg`) => `void`
-Defined in: [js-server-sdk/src/types.ts:43](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/types.ts#L43)
+Defined in: [js-server-sdk/src/types.ts:43](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/types.ts#L43)
## Parameters
diff --git a/versioned_docs/version-0.26.0/api/server/type-aliases/ExpectedAgentEvents.md b/versioned_docs/version-0.26.0/api/server/type-aliases/ExpectedAgentEvents.md
new file mode 100644
index 00000000..adb3027a
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/ExpectedAgentEvents.md
@@ -0,0 +1,5 @@
+# Type Alias: ExpectedAgentEvents
+
+> **ExpectedAgentEvents** = `"trackData"`
+
+Defined in: [js-server-sdk/src/agent.ts:22](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/agent.ts#L22)
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/ExpectedEvents.md b/versioned_docs/version-0.26.0/api/server/type-aliases/ExpectedEvents.md
similarity index 78%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/ExpectedEvents.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/ExpectedEvents.md
index 8a865bb3..bf16f8cd 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/ExpectedEvents.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/ExpectedEvents.md
@@ -2,4 +2,4 @@
> **ExpectedEvents** = `"roomCreated"` \| `"roomDeleted"` \| `"roomCrashed"` \| `"peerAdded"` \| `"peerDeleted"` \| `"peerConnected"` \| `"peerDisconnected"` \| `"peerMetadataUpdated"` \| `"peerCrashed"` \| `"streamConnected"` \| `"streamDisconnected"` \| `"viewerConnected"` \| `"viewerDisconnected"` \| `"trackAdded"` \| `"trackRemoved"` \| `"trackMetadataUpdated"`
-Defined in: [js-server-sdk/src/ws\_notifier.ts:7](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/ws_notifier.ts#L7)
+Defined in: [js-server-sdk/src/ws\_notifier.ts:7](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/ws_notifier.ts#L7)
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/FishjamConfig.md b/versioned_docs/version-0.26.0/api/server/type-aliases/FishjamConfig.md
similarity index 52%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/FishjamConfig.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/FishjamConfig.md
index 74ff1edb..7e2e7d7f 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/FishjamConfig.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/FishjamConfig.md
@@ -2,7 +2,7 @@
> **FishjamConfig** = `object`
-Defined in: [js-server-sdk/src/types.ts:28](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/types.ts#L28)
+Defined in: [js-server-sdk/src/types.ts:28](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/types.ts#L28)
## Properties
@@ -10,7 +10,7 @@ Defined in: [js-server-sdk/src/types.ts:28](https://github.com/fishjam-cloud/js-
> **fishjamId**: `string`
-Defined in: [js-server-sdk/src/types.ts:33](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/types.ts#L33)
+Defined in: [js-server-sdk/src/types.ts:33](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/types.ts#L33)
***
@@ -18,4 +18,4 @@ Defined in: [js-server-sdk/src/types.ts:33](https://github.com/fishjam-cloud/js-
> **managementToken**: `string`
-Defined in: [js-server-sdk/src/types.ts:39](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/types.ts#L39)
+Defined in: [js-server-sdk/src/types.ts:39](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/types.ts#L39)
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/IncomingTrackData.md b/versioned_docs/version-0.26.0/api/server/type-aliases/IncomingTrackData.md
similarity index 53%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/IncomingTrackData.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/IncomingTrackData.md
index f01a7c27..c53c0b7f 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/IncomingTrackData.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/IncomingTrackData.md
@@ -2,7 +2,7 @@
> **IncomingTrackData** = `Omit`\<`NonNullable`\<`AgentResponse_TrackData`\>, `"peerId"`\> & `object`
-Defined in: [js-server-sdk/src/agent.ts:23](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/agent.ts#L23)
+Defined in: [js-server-sdk/src/agent.ts:24](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/agent.ts#L24)
## Type declaration
diff --git a/versioned_docs/version-0.26.0/api/server/type-aliases/IncomingTrackImage.md b/versioned_docs/version-0.26.0/api/server/type-aliases/IncomingTrackImage.md
new file mode 100644
index 00000000..a47ef0cc
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/IncomingTrackImage.md
@@ -0,0 +1,5 @@
+# Type Alias: IncomingTrackImage
+
+> **IncomingTrackImage** = `NonNullable`\<`AgentResponse_TrackImage`\>
+
+Defined in: [js-server-sdk/src/agent.ts:25](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/agent.ts#L25)
diff --git a/versioned_docs/version-0.26.0/api/server/type-aliases/NotificationEvents.md b/versioned_docs/version-0.26.0/api/server/type-aliases/NotificationEvents.md
new file mode 100644
index 00000000..c69d8e0d
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/NotificationEvents.md
@@ -0,0 +1,5 @@
+# Type Alias: NotificationEvents
+
+> **NotificationEvents** = `{ [K in ExpectedEvents]: (message: NonNullable<{ authenticated?: ServerMessage_Authenticated; authRequest?: ServerMessage_AuthRequest; channelAdded?: Omit & { roomId: RoomId }; channelRemoved?: Omit & { roomId: RoomId }; componentCrashed?: Omit & { roomId: RoomId }; hlsPlayable?: Omit & { roomId: RoomId }; hlsUploadCrashed?: Omit & { roomId: RoomId }; hlsUploaded?: Omit & { roomId: RoomId }; peerAdded?: Omit & { roomId: RoomId }, "peerId"> & { peerId: PeerId }; peerConnected?: Omit & { roomId: RoomId }, "peerId"> & { peerId: PeerId }; peerCrashed?: Omit & { roomId: RoomId }, "peerId"> & { peerId: PeerId }; peerDeleted?: Omit & { roomId: RoomId }, "peerId"> & { peerId: PeerId }; peerDisconnected?: Omit & { roomId: RoomId }, "peerId"> & { peerId: PeerId }; peerMetadataUpdated?: Omit & { roomId: RoomId }, "peerId"> & { peerId: PeerId }; roomCrashed?: Omit & { roomId: RoomId }; roomCreated?: Omit & { roomId: RoomId }; roomDeleted?: Omit & { roomId: RoomId }; streamConnected?: ServerMessage_StreamConnected; streamDisconnected?: ServerMessage_StreamDisconnected; streamerConnected?: ServerMessage_StreamerConnected; streamerDisconnected?: ServerMessage_StreamerDisconnected; subscribeRequest?: ServerMessage_SubscribeRequest; subscribeResponse?: ServerMessage_SubscribeResponse; trackAdded?: Omit & { roomId: RoomId }; trackForwarding?: Omit & { roomId: RoomId }, "peerId"> & { peerId: PeerId }; trackForwardingRemoved?: Omit & { roomId: RoomId }, "peerId"> & { peerId: PeerId }; trackMetadataUpdated?: Omit & { roomId: RoomId }; trackRemoved?: Omit & { roomId: RoomId }; vadNotification?: Omit & { roomId: RoomId }, "peerId"> & { peerId: PeerId }; viewerConnected?: ServerMessage_ViewerConnected; viewerDisconnected?: ServerMessage_ViewerDisconnected }[K]>) => void }`
+
+Defined in: [js-server-sdk/src/ws\_notifier.ts:70](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/ws_notifier.ts#L70)
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/OutgoingTrackData.md b/versioned_docs/version-0.26.0/api/server/type-aliases/OutgoingTrackData.md
similarity index 53%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/OutgoingTrackData.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/OutgoingTrackData.md
index 6a6291f9..cb709912 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/OutgoingTrackData.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/OutgoingTrackData.md
@@ -2,7 +2,7 @@
> **OutgoingTrackData** = `Omit`\<`NonNullable`\<`AgentRequest_TrackData`\>, `"peerId"`\> & `object`
-Defined in: [js-server-sdk/src/agent.ts:24](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/agent.ts#L24)
+Defined in: [js-server-sdk/src/agent.ts:26](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/agent.ts#L26)
## Type declaration
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/Peer.md b/versioned_docs/version-0.26.0/api/server/type-aliases/Peer.md
similarity index 64%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/Peer.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/Peer.md
index 52ca75e3..5c35090e 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/Peer.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/Peer.md
@@ -2,7 +2,7 @@
> **Peer** = `Omit`\<`OpenApiPeer`, `"id"`\> & `object`
-Defined in: [js-server-sdk/src/types.ts:20](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/types.ts#L20)
+Defined in: [js-server-sdk/src/types.ts:20](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/types.ts#L20)
## Type declaration
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/PeerAdded.md b/versioned_docs/version-0.26.0/api/server/type-aliases/PeerAdded.md
similarity index 51%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/PeerAdded.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/PeerAdded.md
index edb1da9b..e1db90d6 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/PeerAdded.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/PeerAdded.md
@@ -2,4 +2,4 @@
> **PeerAdded** = `object`\[`"peerAdded"`\]
-Defined in: [js-server-sdk/src/ws\_notifier.ts:37](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/ws_notifier.ts#L37)
+Defined in: [js-server-sdk/src/ws\_notifier.ts:37](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/ws_notifier.ts#L37)
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/PeerConnected.md b/versioned_docs/version-0.26.0/api/server/type-aliases/PeerConnected.md
similarity index 53%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/PeerConnected.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/PeerConnected.md
index 38c0317c..ddfdaf20 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/PeerConnected.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/PeerConnected.md
@@ -2,4 +2,4 @@
> **PeerConnected** = `object`\[`"peerConnected"`\]
-Defined in: [js-server-sdk/src/ws\_notifier.ts:39](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/ws_notifier.ts#L39)
+Defined in: [js-server-sdk/src/ws\_notifier.ts:39](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/ws_notifier.ts#L39)
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/PeerCrashed.md b/versioned_docs/version-0.26.0/api/server/type-aliases/PeerCrashed.md
similarity index 52%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/PeerCrashed.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/PeerCrashed.md
index 97cbdda9..45279079 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/PeerCrashed.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/PeerCrashed.md
@@ -2,4 +2,4 @@
> **PeerCrashed** = `object`\[`"peerCrashed"`\]
-Defined in: [js-server-sdk/src/ws\_notifier.ts:42](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/ws_notifier.ts#L42)
+Defined in: [js-server-sdk/src/ws\_notifier.ts:42](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/ws_notifier.ts#L42)
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/PeerDeleted.md b/versioned_docs/version-0.26.0/api/server/type-aliases/PeerDeleted.md
similarity index 52%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/PeerDeleted.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/PeerDeleted.md
index a3647d14..88ff870e 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/PeerDeleted.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/PeerDeleted.md
@@ -2,4 +2,4 @@
> **PeerDeleted** = `object`\[`"peerDeleted"`\]
-Defined in: [js-server-sdk/src/ws\_notifier.ts:38](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/ws_notifier.ts#L38)
+Defined in: [js-server-sdk/src/ws\_notifier.ts:38](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/ws_notifier.ts#L38)
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/PeerDisconnected.md b/versioned_docs/version-0.26.0/api/server/type-aliases/PeerDisconnected.md
similarity index 54%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/PeerDisconnected.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/PeerDisconnected.md
index caf60f33..bf9aaa5f 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/PeerDisconnected.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/PeerDisconnected.md
@@ -2,4 +2,4 @@
> **PeerDisconnected** = `object`\[`"peerDisconnected"`\]
-Defined in: [js-server-sdk/src/ws\_notifier.ts:40](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/ws_notifier.ts#L40)
+Defined in: [js-server-sdk/src/ws\_notifier.ts:40](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/ws_notifier.ts#L40)
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/PeerId.md b/versioned_docs/version-0.26.0/api/server/type-aliases/PeerId.md
similarity index 71%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/PeerId.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/PeerId.md
index 0f1d366f..93a37d0c 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/PeerId.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/PeerId.md
@@ -2,6 +2,6 @@
> **PeerId** = [`Brand`](Brand.md)\<`string`, `"PeerId"`\>
-Defined in: [js-server-sdk/src/types.ts:18](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/types.ts#L18)
+Defined in: [js-server-sdk/src/types.ts:18](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/types.ts#L18)
ID of Peer. Peer is associated with Room and can be created with [FishjamClient.createPeer](../classes/FishjamClient.md#createpeer).
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/PeerMetadataUpdated.md b/versioned_docs/version-0.26.0/api/server/type-aliases/PeerMetadataUpdated.md
similarity index 56%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/PeerMetadataUpdated.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/PeerMetadataUpdated.md
index a55a4736..6ca71aa0 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/PeerMetadataUpdated.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/PeerMetadataUpdated.md
@@ -2,4 +2,4 @@
> **PeerMetadataUpdated** = `object`\[`"peerMetadataUpdated"`\]
-Defined in: [js-server-sdk/src/ws\_notifier.ts:41](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/ws_notifier.ts#L41)
+Defined in: [js-server-sdk/src/ws\_notifier.ts:41](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/ws_notifier.ts#L41)
diff --git a/versioned_docs/version-0.26.0/api/server/type-aliases/PeerOptions.md b/versioned_docs/version-0.26.0/api/server/type-aliases/PeerOptions.md
new file mode 100644
index 00000000..4c1a0453
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/PeerOptions.md
@@ -0,0 +1,7 @@
+# Type Alias: PeerOptions
+
+> **PeerOptions** = [`PeerOptionsAgent`](../interfaces/PeerOptionsAgent.md) \| [`PeerOptionsVapi`](../interfaces/PeerOptionsVapi.md) \| [`PeerOptionsWebRTC`](../interfaces/PeerOptionsWebRTC.md)
+
+Defined in: fishjam-openapi/dist/index.d.ts:310
+
+## Export
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/Room.md b/versioned_docs/version-0.26.0/api/server/type-aliases/Room.md
similarity index 51%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/Room.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/Room.md
index 3fe18f2f..5ce65915 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/Room.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/Room.md
@@ -2,7 +2,7 @@
> **Room** = `object`
-Defined in: [js-server-sdk/src/types.ts:22](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/types.ts#L22)
+Defined in: [js-server-sdk/src/types.ts:22](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/types.ts#L22)
## Properties
@@ -10,7 +10,7 @@ Defined in: [js-server-sdk/src/types.ts:22](https://github.com/fishjam-cloud/js-
> **config**: [`RoomConfig`](../interfaces/RoomConfig.md)
-Defined in: [js-server-sdk/src/types.ts:25](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/types.ts#L25)
+Defined in: [js-server-sdk/src/types.ts:25](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/types.ts#L25)
***
@@ -18,7 +18,7 @@ Defined in: [js-server-sdk/src/types.ts:25](https://github.com/fishjam-cloud/js-
> **id**: [`RoomId`](RoomId.md)
-Defined in: [js-server-sdk/src/types.ts:23](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/types.ts#L23)
+Defined in: [js-server-sdk/src/types.ts:23](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/types.ts#L23)
***
@@ -26,4 +26,4 @@ Defined in: [js-server-sdk/src/types.ts:23](https://github.com/fishjam-cloud/js-
> **peers**: [`Peer`](Peer.md)[]
-Defined in: [js-server-sdk/src/types.ts:24](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/types.ts#L24)
+Defined in: [js-server-sdk/src/types.ts:24](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/types.ts#L24)
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/RoomCrashed.md b/versioned_docs/version-0.26.0/api/server/type-aliases/RoomCrashed.md
similarity index 52%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/RoomCrashed.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/RoomCrashed.md
index 9194fc1a..085c48c9 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/RoomCrashed.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/RoomCrashed.md
@@ -2,4 +2,4 @@
> **RoomCrashed** = `object`\[`"roomCrashed"`\]
-Defined in: [js-server-sdk/src/ws\_notifier.ts:36](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/ws_notifier.ts#L36)
+Defined in: [js-server-sdk/src/ws\_notifier.ts:36](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/ws_notifier.ts#L36)
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/RoomCreated.md b/versioned_docs/version-0.26.0/api/server/type-aliases/RoomCreated.md
similarity index 52%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/RoomCreated.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/RoomCreated.md
index 0f441349..40e2f4cb 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/RoomCreated.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/RoomCreated.md
@@ -2,4 +2,4 @@
> **RoomCreated** = `object`\[`"roomCreated"`\]
-Defined in: [js-server-sdk/src/ws\_notifier.ts:34](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/ws_notifier.ts#L34)
+Defined in: [js-server-sdk/src/ws\_notifier.ts:34](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/ws_notifier.ts#L34)
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/RoomDeleted.md b/versioned_docs/version-0.26.0/api/server/type-aliases/RoomDeleted.md
similarity index 52%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/RoomDeleted.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/RoomDeleted.md
index 6224824e..29d8f0d1 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/RoomDeleted.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/RoomDeleted.md
@@ -2,4 +2,4 @@
> **RoomDeleted** = `object`\[`"roomDeleted"`\]
-Defined in: [js-server-sdk/src/ws\_notifier.ts:35](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/ws_notifier.ts#L35)
+Defined in: [js-server-sdk/src/ws\_notifier.ts:35](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/ws_notifier.ts#L35)
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/RoomId.md b/versioned_docs/version-0.26.0/api/server/type-aliases/RoomId.md
similarity index 69%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/RoomId.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/RoomId.md
index ece29676..863c8856 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/RoomId.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/RoomId.md
@@ -2,7 +2,7 @@
> **RoomId** = [`Brand`](Brand.md)\<`string`, `"RoomId"`\>
-Defined in: [js-server-sdk/src/types.ts:14](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/types.ts#L14)
+Defined in: [js-server-sdk/src/types.ts:14](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/types.ts#L14)
ID of the Room.
Room can be created with [FishjamClient.createRoom](../classes/FishjamClient.md#createroom).
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/StreamConnected.md b/versioned_docs/version-0.26.0/api/server/type-aliases/StreamConnected.md
similarity index 54%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/StreamConnected.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/StreamConnected.md
index 0bf00091..f69327bf 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/StreamConnected.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/StreamConnected.md
@@ -2,4 +2,4 @@
> **StreamConnected** = `object`\[`"streamConnected"`\]
-Defined in: [js-server-sdk/src/ws\_notifier.ts:43](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/ws_notifier.ts#L43)
+Defined in: [js-server-sdk/src/ws\_notifier.ts:43](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/ws_notifier.ts#L43)
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/StreamDisconnected.md b/versioned_docs/version-0.26.0/api/server/type-aliases/StreamDisconnected.md
similarity index 55%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/StreamDisconnected.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/StreamDisconnected.md
index 78cc7ad9..ee9b0040 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/StreamDisconnected.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/StreamDisconnected.md
@@ -2,4 +2,4 @@
> **StreamDisconnected** = `object`\[`"streamDisconnected"`\]
-Defined in: [js-server-sdk/src/ws\_notifier.ts:44](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/ws_notifier.ts#L44)
+Defined in: [js-server-sdk/src/ws\_notifier.ts:44](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/ws_notifier.ts#L44)
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/TrackAdded.md b/versioned_docs/version-0.26.0/api/server/type-aliases/TrackAdded.md
similarity index 51%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/TrackAdded.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/TrackAdded.md
index d348817a..5f165680 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/TrackAdded.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/TrackAdded.md
@@ -2,4 +2,4 @@
> **TrackAdded** = `object`\[`"trackAdded"`\]
-Defined in: [js-server-sdk/src/ws\_notifier.ts:47](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/ws_notifier.ts#L47)
+Defined in: [js-server-sdk/src/ws\_notifier.ts:47](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/ws_notifier.ts#L47)
diff --git a/versioned_docs/version-0.26.0/api/server/type-aliases/TrackId.md b/versioned_docs/version-0.26.0/api/server/type-aliases/TrackId.md
new file mode 100644
index 00000000..5b78e878
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/TrackId.md
@@ -0,0 +1,5 @@
+# Type Alias: TrackId
+
+> **TrackId** = [`Brand`](Brand.md)\<`string`, `"TrackId"`\>
+
+Defined in: [js-server-sdk/src/agent.ts:36](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/agent.ts#L36)
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/TrackMetadataUpdated.md b/versioned_docs/version-0.26.0/api/server/type-aliases/TrackMetadataUpdated.md
similarity index 56%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/TrackMetadataUpdated.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/TrackMetadataUpdated.md
index 71c590b5..fc9f88d6 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/TrackMetadataUpdated.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/TrackMetadataUpdated.md
@@ -2,4 +2,4 @@
> **TrackMetadataUpdated** = `object`\[`"trackMetadataUpdated"`\]
-Defined in: [js-server-sdk/src/ws\_notifier.ts:49](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/ws_notifier.ts#L49)
+Defined in: [js-server-sdk/src/ws\_notifier.ts:49](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/ws_notifier.ts#L49)
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/TrackRemoved.md b/versioned_docs/version-0.26.0/api/server/type-aliases/TrackRemoved.md
similarity index 52%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/TrackRemoved.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/TrackRemoved.md
index e45b7205..a0daca10 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/TrackRemoved.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/TrackRemoved.md
@@ -2,4 +2,4 @@
> **TrackRemoved** = `object`\[`"trackRemoved"`\]
-Defined in: [js-server-sdk/src/ws\_notifier.ts:48](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/ws_notifier.ts#L48)
+Defined in: [js-server-sdk/src/ws\_notifier.ts:48](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/ws_notifier.ts#L48)
diff --git a/versioned_docs/version-0.26.0/api/server/type-aliases/TrackType.md b/versioned_docs/version-0.26.0/api/server/type-aliases/TrackType.md
new file mode 100644
index 00000000..66b920dd
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/TrackType.md
@@ -0,0 +1,5 @@
+# Type Alias: TrackType
+
+> **TrackType** = `"audio"` \| `"video"`
+
+Defined in: [js-server-sdk/src/agent.ts:30](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/agent.ts#L30)
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/ViewerConnected.md b/versioned_docs/version-0.26.0/api/server/type-aliases/ViewerConnected.md
similarity index 54%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/ViewerConnected.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/ViewerConnected.md
index 5a617d2c..609c7995 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/ViewerConnected.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/ViewerConnected.md
@@ -2,4 +2,4 @@
> **ViewerConnected** = `object`\[`"viewerConnected"`\]
-Defined in: [js-server-sdk/src/ws\_notifier.ts:45](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/ws_notifier.ts#L45)
+Defined in: [js-server-sdk/src/ws\_notifier.ts:45](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/ws_notifier.ts#L45)
diff --git a/versioned_docs/version-0.23.0/api/server/type-aliases/ViewerDisconnected.md b/versioned_docs/version-0.26.0/api/server/type-aliases/ViewerDisconnected.md
similarity index 55%
rename from versioned_docs/version-0.23.0/api/server/type-aliases/ViewerDisconnected.md
rename to versioned_docs/version-0.26.0/api/server/type-aliases/ViewerDisconnected.md
index 2594a7cd..843975c4 100644
--- a/versioned_docs/version-0.23.0/api/server/type-aliases/ViewerDisconnected.md
+++ b/versioned_docs/version-0.26.0/api/server/type-aliases/ViewerDisconnected.md
@@ -2,4 +2,4 @@
> **ViewerDisconnected** = `object`\[`"viewerDisconnected"`\]
-Defined in: [js-server-sdk/src/ws\_notifier.ts:46](https://github.com/fishjam-cloud/js-server-sdk/blob/47c214593e589512a3ba31be9d92be66ca83da9a/packages/js-server-sdk/src/ws_notifier.ts#L46)
+Defined in: [js-server-sdk/src/ws\_notifier.ts:46](https://github.com/fishjam-cloud/js-server-sdk/blob/0007dea898b99b6923059b364584054cf1580b02/packages/js-server-sdk/src/ws_notifier.ts#L46)
diff --git a/versioned_docs/version-0.26.0/api/server/typedoc-sidebar.cjs b/versioned_docs/version-0.26.0/api/server/typedoc-sidebar.cjs
new file mode 100644
index 00000000..1f1cdacd
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/server/typedoc-sidebar.cjs
@@ -0,0 +1,4 @@
+// @ts-check
+/** @type {import("@docusaurus/plugin-content-docs").SidebarsConfig} */
+const typedocSidebar = {items:[{type:"category",label:"Client",items:[{type:"doc",id:"api/server/classes/FishjamClient",label:"FishjamClient"},{type:"doc",id:"api/server/classes/FishjamWSNotifier",label:"FishjamWSNotifier"}]},{type:"category",label:"Other",items:[{type:"doc",id:"api/server/enumerations/PeerStatus",label:"PeerStatus"},{type:"doc",id:"api/server/enumerations/RoomType",label:"RoomType"},{type:"doc",id:"api/server/enumerations/VideoCodec",label:"VideoCodec"},{type:"doc",id:"api/server/classes/BadRequestException",label:"BadRequestException"},{type:"doc",id:"api/server/classes/FishjamAgent",label:"FishjamAgent"},{type:"doc",id:"api/server/classes/FishjamBaseException",label:"FishjamBaseException"},{type:"doc",id:"api/server/classes/FishjamNotFoundException",label:"FishjamNotFoundException"},{type:"doc",id:"api/server/classes/ForbiddenException",label:"ForbiddenException"},{type:"doc",id:"api/server/classes/MissingFishjamIdException",label:"MissingFishjamIdException"},{type:"doc",id:"api/server/classes/PeerNotFoundException",label:"PeerNotFoundException"},{type:"doc",id:"api/server/classes/RoomNotFoundException",label:"RoomNotFoundException"},{type:"doc",id:"api/server/classes/ServiceUnavailableException",label:"ServiceUnavailableException"},{type:"doc",id:"api/server/classes/UnauthorizedException",label:"UnauthorizedException"},{type:"doc",id:"api/server/classes/UnknownException",label:"UnknownException"},{type:"doc",id:"api/server/interfaces/PeerOptionsAgent",label:"PeerOptionsAgent"},{type:"doc",id:"api/server/interfaces/PeerOptionsVapi",label:"PeerOptionsVapi"},{type:"doc",id:"api/server/interfaces/PeerOptionsWebRTC",label:"PeerOptionsWebRTC"},{type:"doc",id:"api/server/interfaces/RoomConfig",label:"RoomConfig"},{type:"doc",id:"api/server/interfaces/ServerMessage",label:"ServerMessage"},{type:"doc",id:"api/server/interfaces/StreamerToken",label:"StreamerToken"},{type:"doc",id:"api/server/interfaces/ViewerToken",label:"ViewerToken"},{type:"doc",id:"api/server/type-aliases/AgentCallbacks",label:"AgentCallbacks"},{type:"doc",id:"api/server/type-aliases/AgentEvents",label:"AgentEvents"},{type:"doc",id:"api/server/type-aliases/AgentTrack",label:"AgentTrack"},{type:"doc",id:"api/server/type-aliases/AudioCodecParameters",label:"AudioCodecParameters"},{type:"doc",id:"api/server/type-aliases/Brand",label:"Brand"},{type:"doc",id:"api/server/type-aliases/CloseEventHandler",label:"CloseEventHandler"},{type:"doc",id:"api/server/type-aliases/ErrorEventHandler",label:"ErrorEventHandler"},{type:"doc",id:"api/server/type-aliases/ExpectedAgentEvents",label:"ExpectedAgentEvents"},{type:"doc",id:"api/server/type-aliases/ExpectedEvents",label:"ExpectedEvents"},{type:"doc",id:"api/server/type-aliases/FishjamConfig",label:"FishjamConfig"},{type:"doc",id:"api/server/type-aliases/IncomingTrackData",label:"IncomingTrackData"},{type:"doc",id:"api/server/type-aliases/IncomingTrackImage",label:"IncomingTrackImage"},{type:"doc",id:"api/server/type-aliases/NotificationEvents",label:"NotificationEvents"},{type:"doc",id:"api/server/type-aliases/OutgoingTrackData",label:"OutgoingTrackData"},{type:"doc",id:"api/server/type-aliases/Peer",label:"Peer"},{type:"doc",id:"api/server/type-aliases/PeerAdded",label:"PeerAdded"},{type:"doc",id:"api/server/type-aliases/PeerConnected",label:"PeerConnected"},{type:"doc",id:"api/server/type-aliases/PeerCrashed",label:"PeerCrashed"},{type:"doc",id:"api/server/type-aliases/PeerDeleted",label:"PeerDeleted"},{type:"doc",id:"api/server/type-aliases/PeerDisconnected",label:"PeerDisconnected"},{type:"doc",id:"api/server/type-aliases/PeerId",label:"PeerId"},{type:"doc",id:"api/server/type-aliases/PeerMetadataUpdated",label:"PeerMetadataUpdated"},{type:"doc",id:"api/server/type-aliases/PeerOptions",label:"PeerOptions"},{type:"doc",id:"api/server/type-aliases/Room",label:"Room"},{type:"doc",id:"api/server/type-aliases/RoomCrashed",label:"RoomCrashed"},{type:"doc",id:"api/server/type-aliases/RoomCreated",label:"RoomCreated"},{type:"doc",id:"api/server/type-aliases/RoomDeleted",label:"RoomDeleted"},{type:"doc",id:"api/server/type-aliases/RoomId",label:"RoomId"},{type:"doc",id:"api/server/type-aliases/StreamConnected",label:"StreamConnected"},{type:"doc",id:"api/server/type-aliases/StreamDisconnected",label:"StreamDisconnected"},{type:"doc",id:"api/server/type-aliases/TrackAdded",label:"TrackAdded"},{type:"doc",id:"api/server/type-aliases/TrackId",label:"TrackId"},{type:"doc",id:"api/server/type-aliases/TrackMetadataUpdated",label:"TrackMetadataUpdated"},{type:"doc",id:"api/server/type-aliases/TrackRemoved",label:"TrackRemoved"},{type:"doc",id:"api/server/type-aliases/TrackType",label:"TrackType"},{type:"doc",id:"api/server/type-aliases/ViewerConnected",label:"ViewerConnected"},{type:"doc",id:"api/server/type-aliases/ViewerDisconnected",label:"ViewerDisconnected"},{type:"doc",id:"api/server/variables/ServerMessage",label:"ServerMessage"}]}]};
+module.exports = typedocSidebar.items;
\ No newline at end of file
diff --git a/versioned_docs/version-0.23.0/api/server/variables/ServerMessage.md b/versioned_docs/version-0.26.0/api/server/variables/ServerMessage.md
similarity index 72%
rename from versioned_docs/version-0.23.0/api/server/variables/ServerMessage.md
rename to versioned_docs/version-0.26.0/api/server/variables/ServerMessage.md
index e1bb44b2..7102fbee 100644
--- a/versioned_docs/version-0.23.0/api/server/variables/ServerMessage.md
+++ b/versioned_docs/version-0.26.0/api/server/variables/ServerMessage.md
@@ -2,4 +2,4 @@
> **ServerMessage**: `MessageFns$1`\<[`ServerMessage`](../interfaces/ServerMessage.md)\>
-Defined in: fishjam-proto/dist/index.d.ts:63
+Defined in: fishjam-proto/dist/index.d.ts:72
diff --git a/versioned_docs/version-0.23.0/api/web/enumerations/Variant.md b/versioned_docs/version-0.26.0/api/web/enumerations/Variant.md
similarity index 55%
rename from versioned_docs/version-0.23.0/api/web/enumerations/Variant.md
rename to versioned_docs/version-0.26.0/api/web/enumerations/Variant.md
index e4cc87e4..fc4e6cfa 100644
--- a/versioned_docs/version-0.23.0/api/web/enumerations/Variant.md
+++ b/versioned_docs/version-0.26.0/api/web/enumerations/Variant.md
@@ -1,6 +1,6 @@
# Enumeration: Variant
-Defined in: ts-client/dist/index.d.mts:12
+Defined in: ts-client/dist/index.d.mts:51
## Enumeration Members
@@ -8,7 +8,7 @@ Defined in: ts-client/dist/index.d.mts:12
> **UNRECOGNIZED**: `-1`
-Defined in: ts-client/dist/index.d.mts:17
+Defined in: ts-client/dist/index.d.mts:56
***
@@ -16,7 +16,7 @@ Defined in: ts-client/dist/index.d.mts:17
> **VARIANT\_HIGH**: `3`
-Defined in: ts-client/dist/index.d.mts:16
+Defined in: ts-client/dist/index.d.mts:55
***
@@ -24,7 +24,7 @@ Defined in: ts-client/dist/index.d.mts:16
> **VARIANT\_LOW**: `1`
-Defined in: ts-client/dist/index.d.mts:14
+Defined in: ts-client/dist/index.d.mts:53
***
@@ -32,7 +32,7 @@ Defined in: ts-client/dist/index.d.mts:14
> **VARIANT\_MEDIUM**: `2`
-Defined in: ts-client/dist/index.d.mts:15
+Defined in: ts-client/dist/index.d.mts:54
***
@@ -40,4 +40,4 @@ Defined in: ts-client/dist/index.d.mts:15
> **VARIANT\_UNSPECIFIED**: `0`
-Defined in: ts-client/dist/index.d.mts:13
+Defined in: ts-client/dist/index.d.mts:52
diff --git a/versioned_docs/version-0.23.0/api/web/functions/FishjamProvider.md b/versioned_docs/version-0.26.0/api/web/functions/FishjamProvider.md
similarity index 56%
rename from versioned_docs/version-0.23.0/api/web/functions/FishjamProvider.md
rename to versioned_docs/version-0.26.0/api/web/functions/FishjamProvider.md
index 8fbf50e9..def25ad0 100644
--- a/versioned_docs/version-0.23.0/api/web/functions/FishjamProvider.md
+++ b/versioned_docs/version-0.26.0/api/web/functions/FishjamProvider.md
@@ -2,7 +2,7 @@
> **FishjamProvider**(`props`): `Element`
-Defined in: [react-client/src/FishjamProvider.tsx:66](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/FishjamProvider.tsx#L66)
+Defined in: [react-client/src/FishjamProvider.tsx:74](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/FishjamProvider.tsx#L74)
Provides the Fishjam Context
diff --git a/versioned_docs/version-0.23.0/api/web/functions/useCamera.md b/versioned_docs/version-0.26.0/api/web/functions/useCamera.md
similarity index 77%
rename from versioned_docs/version-0.23.0/api/web/functions/useCamera.md
rename to versioned_docs/version-0.26.0/api/web/functions/useCamera.md
index 6bc04cfd..764058a6 100644
--- a/versioned_docs/version-0.23.0/api/web/functions/useCamera.md
+++ b/versioned_docs/version-0.26.0/api/web/functions/useCamera.md
@@ -2,7 +2,7 @@
> **useCamera**(): `object`
-Defined in: [react-client/src/hooks/devices/useCamera.ts:9](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/hooks/devices/useCamera.ts#L9)
+Defined in: [react-client/src/hooks/devices/useCamera.ts:9](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/devices/useCamera.ts#L9)
This hook can toggle camera on/off, change camera, provides current camera and other.
@@ -85,6 +85,32 @@ Sets the camera middleware
`Promise`\<`void`\>
+### startCamera()
+
+> **startCamera**: (`deviceId?`) => `Promise`\<\[`MediaStreamTrack`, `null`\] \| \[`null`, [`DeviceError`](../type-aliases/DeviceError.md)\]\> = `videoTrackManager.startDevice`
+
+Starts the camera
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `deviceId?` | `null` \| `string` |
+
+#### Returns
+
+`Promise`\<\[`MediaStreamTrack`, `null`\] \| \[`null`, [`DeviceError`](../type-aliases/DeviceError.md)\]\>
+
+### stopCamera()
+
+> **stopCamera**: () => `void` = `videoTrackManager.stopDevice`
+
+Stops the camera
+
+#### Returns
+
+`void`
+
### toggleCamera()
> **toggleCamera**: () => `Promise`\<`undefined` \| [`DeviceError`](../type-aliases/DeviceError.md)\> = `videoTrackManager.toggleDevice`
diff --git a/versioned_docs/version-0.23.0/api/web/functions/useConnection.md b/versioned_docs/version-0.26.0/api/web/functions/useConnection.md
similarity index 89%
rename from versioned_docs/version-0.23.0/api/web/functions/useConnection.md
rename to versioned_docs/version-0.26.0/api/web/functions/useConnection.md
index e39a8a0e..6a503939 100644
--- a/versioned_docs/version-0.23.0/api/web/functions/useConnection.md
+++ b/versioned_docs/version-0.26.0/api/web/functions/useConnection.md
@@ -2,7 +2,7 @@
> **useConnection**(): `object`
-Defined in: [react-client/src/hooks/useConnection.ts:26](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/hooks/useConnection.ts#L26)
+Defined in: [react-client/src/hooks/useConnection.ts:26](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useConnection.ts#L26)
Hook allows to join or leave a room and check the current connection status.
diff --git a/versioned_docs/version-0.23.0/api/web/functions/useCustomSource.md b/versioned_docs/version-0.26.0/api/web/functions/useCustomSource.md
similarity index 86%
rename from versioned_docs/version-0.23.0/api/web/functions/useCustomSource.md
rename to versioned_docs/version-0.26.0/api/web/functions/useCustomSource.md
index 0d3afbe1..6cb68f71 100644
--- a/versioned_docs/version-0.23.0/api/web/functions/useCustomSource.md
+++ b/versioned_docs/version-0.26.0/api/web/functions/useCustomSource.md
@@ -2,7 +2,7 @@
> **useCustomSource**\<`T`\>(`sourceId`): `object`
-Defined in: [react-client/src/hooks/useCustomSource.ts:9](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/hooks/useCustomSource.ts#L9)
+Defined in: [react-client/src/hooks/useCustomSource.ts:9](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useCustomSource.ts#L9)
This hook can register/deregister a custom MediaStream with Fishjam.
diff --git a/versioned_docs/version-0.26.0/api/web/functions/useDataChannel.md b/versioned_docs/version-0.26.0/api/web/functions/useDataChannel.md
new file mode 100644
index 00000000..7c40bad5
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/functions/useDataChannel.md
@@ -0,0 +1,11 @@
+# Function: useDataChannel()
+
+> **useDataChannel**(): [`UseDataChannelResult`](../type-aliases/UseDataChannelResult.md)
+
+Defined in: [react-client/src/hooks/useDataChannel.ts:14](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useDataChannel.ts#L14)
+
+Hook for data channel operations - publish and subscribe to data.
+
+## Returns
+
+[`UseDataChannelResult`](../type-aliases/UseDataChannelResult.md)
diff --git a/versioned_docs/version-0.23.0/api/web/functions/useInitializeDevices.md b/versioned_docs/version-0.26.0/api/web/functions/useInitializeDevices.md
similarity index 85%
rename from versioned_docs/version-0.23.0/api/web/functions/useInitializeDevices.md
rename to versioned_docs/version-0.26.0/api/web/functions/useInitializeDevices.md
index 483ab4d8..ec97e43c 100644
--- a/versioned_docs/version-0.23.0/api/web/functions/useInitializeDevices.md
+++ b/versioned_docs/version-0.26.0/api/web/functions/useInitializeDevices.md
@@ -2,7 +2,7 @@
> **useInitializeDevices**(): `object`
-Defined in: [react-client/src/hooks/devices/useInitializeDevices.ts:14](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/hooks/devices/useInitializeDevices.ts#L14)
+Defined in: [react-client/src/hooks/devices/useInitializeDevices.ts:14](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/devices/useInitializeDevices.ts#L14)
Hook allows you to initialize access to the devices before joining the room.
diff --git a/versioned_docs/version-0.23.0/api/web/functions/useLivestreamStreamer.md b/versioned_docs/version-0.26.0/api/web/functions/useLivestreamStreamer.md
similarity index 61%
rename from versioned_docs/version-0.23.0/api/web/functions/useLivestreamStreamer.md
rename to versioned_docs/version-0.26.0/api/web/functions/useLivestreamStreamer.md
index 34c29640..3cf0a72c 100644
--- a/versioned_docs/version-0.23.0/api/web/functions/useLivestreamStreamer.md
+++ b/versioned_docs/version-0.26.0/api/web/functions/useLivestreamStreamer.md
@@ -2,7 +2,7 @@
> **useLivestreamStreamer**(): [`UseLivestreamStreamerResult`](../interfaces/UseLivestreamStreamerResult.md)
-Defined in: [react-client/src/hooks/useLivestreamStreamer.ts:51](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/hooks/useLivestreamStreamer.ts#L51)
+Defined in: [react-client/src/hooks/useLivestreamStreamer.ts:52](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useLivestreamStreamer.ts#L52)
Hook for publishing a livestream, which can be then received with [useLivestreamViewer](useLivestreamViewer.md)
diff --git a/versioned_docs/version-0.23.0/api/web/functions/useLivestreamViewer.md b/versioned_docs/version-0.26.0/api/web/functions/useLivestreamViewer.md
similarity index 55%
rename from versioned_docs/version-0.23.0/api/web/functions/useLivestreamViewer.md
rename to versioned_docs/version-0.26.0/api/web/functions/useLivestreamViewer.md
index 62e868ce..75d88ccc 100644
--- a/versioned_docs/version-0.23.0/api/web/functions/useLivestreamViewer.md
+++ b/versioned_docs/version-0.26.0/api/web/functions/useLivestreamViewer.md
@@ -2,7 +2,7 @@
> **useLivestreamViewer**(): [`UseLivestreamViewerResult`](../interfaces/UseLivestreamViewerResult.md)
-Defined in: [react-client/src/hooks/useLivestreamViewer.ts:41](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/hooks/useLivestreamViewer.ts#L41)
+Defined in: [react-client/src/hooks/useLivestreamViewer.ts:43](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useLivestreamViewer.ts#L43)
Hook for receiving a published livestream.
diff --git a/versioned_docs/version-0.23.0/api/web/functions/useMicrophone.md b/versioned_docs/version-0.26.0/api/web/functions/useMicrophone.md
similarity index 79%
rename from versioned_docs/version-0.23.0/api/web/functions/useMicrophone.md
rename to versioned_docs/version-0.26.0/api/web/functions/useMicrophone.md
index 40f34f6a..0704c74b 100644
--- a/versioned_docs/version-0.23.0/api/web/functions/useMicrophone.md
+++ b/versioned_docs/version-0.26.0/api/web/functions/useMicrophone.md
@@ -2,7 +2,7 @@
> **useMicrophone**(): `object`
-Defined in: [react-client/src/hooks/devices/useMicrophone.ts:9](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/hooks/devices/useMicrophone.ts#L9)
+Defined in: [react-client/src/hooks/devices/useMicrophone.ts:9](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/devices/useMicrophone.ts#L9)
Manage microphone
@@ -91,6 +91,32 @@ Sets the microphone middleware
`Promise`\<`void`\>
+### startMicrophone()
+
+> **startMicrophone**: (`deviceId?`) => `Promise`\<\[`MediaStreamTrack`, `null`\] \| \[`null`, [`DeviceError`](../type-aliases/DeviceError.md)\]\> = `audioTrackManager.startDevice`
+
+Starts the microphone
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `deviceId?` | `null` \| `string` |
+
+#### Returns
+
+`Promise`\<\[`MediaStreamTrack`, `null`\] \| \[`null`, [`DeviceError`](../type-aliases/DeviceError.md)\]\>
+
+### stopMicrophone()
+
+> **stopMicrophone**: () => `void` = `audioTrackManager.stopDevice`
+
+Stops the microphone
+
+#### Returns
+
+`void`
+
### toggleMicrophone()
> **toggleMicrophone**: () => `Promise`\<`undefined` \| [`DeviceError`](../type-aliases/DeviceError.md)\> = `audioTrackManager.toggleDevice`
diff --git a/versioned_docs/version-0.23.0/api/web/functions/usePeers.md b/versioned_docs/version-0.26.0/api/web/functions/usePeers.md
similarity index 68%
rename from versioned_docs/version-0.23.0/api/web/functions/usePeers.md
rename to versioned_docs/version-0.26.0/api/web/functions/usePeers.md
index 48be0323..07263b0c 100644
--- a/versioned_docs/version-0.23.0/api/web/functions/usePeers.md
+++ b/versioned_docs/version-0.26.0/api/web/functions/usePeers.md
@@ -2,7 +2,7 @@
> **usePeers**\<`PeerMetadata`, `ServerMetadata`\>(): `object`
-Defined in: [react-client/src/hooks/usePeers.ts:67](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/hooks/usePeers.ts#L67)
+Defined in: [react-client/src/hooks/usePeers.ts:103](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/usePeers.ts#L103)
Hook allows to access id, tracks and metadata of the local and remote peers.
@@ -17,14 +17,14 @@ Hook allows to access id, tracks and metadata of the local and remote peers.
### localPeer
-> **localPeer**: `null` \| [`PeerWithTracks`](../type-aliases/PeerWithTracks.md)\<`PeerMetadata`, `ServerMetadata`\>
+> **localPeer**: `null` \| [`PeerWithTracks`](../type-aliases/PeerWithTracks.md)\<`PeerMetadata`, `ServerMetadata`, [`Track`](../type-aliases/Track.md)\>
The local peer with distinguished tracks (camera, microphone, screen share).
Will be null if the local peer is not found.
### ~~peers~~
-> **peers**: [`PeerWithTracks`](../type-aliases/PeerWithTracks.md)\<`PeerMetadata`, `ServerMetadata`\>[] = `remotePeers`
+> **peers**: [`PeerWithTracks`](../type-aliases/PeerWithTracks.md)\<`PeerMetadata`, `ServerMetadata`, [`RemoteTrack`](../type-aliases/RemoteTrack.md)\>[] = `remotePeers`
#### Deprecated
@@ -34,6 +34,6 @@ This property will be removed in future versions.
### remotePeers
-> **remotePeers**: [`PeerWithTracks`](../type-aliases/PeerWithTracks.md)\<`PeerMetadata`, `ServerMetadata`\>[]
+> **remotePeers**: [`PeerWithTracks`](../type-aliases/PeerWithTracks.md)\<`PeerMetadata`, `ServerMetadata`, [`RemoteTrack`](../type-aliases/RemoteTrack.md)\>[]
Array of remote peers with distinguished tracks (camera, microphone, screen share).
diff --git a/versioned_docs/version-0.23.0/api/web/functions/useSandbox.md b/versioned_docs/version-0.26.0/api/web/functions/useSandbox.md
similarity index 86%
rename from versioned_docs/version-0.23.0/api/web/functions/useSandbox.md
rename to versioned_docs/version-0.26.0/api/web/functions/useSandbox.md
index 4c992028..cb3b315a 100644
--- a/versioned_docs/version-0.23.0/api/web/functions/useSandbox.md
+++ b/versioned_docs/version-0.26.0/api/web/functions/useSandbox.md
@@ -2,7 +2,7 @@
> **useSandbox**(`props?`): `object`
-Defined in: [react-client/src/hooks/useSandbox.ts:19](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/hooks/useSandbox.ts#L19)
+Defined in: [react-client/src/hooks/useSandbox.ts:21](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useSandbox.ts#L21)
## Parameters
diff --git a/versioned_docs/version-0.23.0/api/web/functions/useScreenShare.md b/versioned_docs/version-0.26.0/api/web/functions/useScreenShare.md
similarity index 94%
rename from versioned_docs/version-0.23.0/api/web/functions/useScreenShare.md
rename to versioned_docs/version-0.26.0/api/web/functions/useScreenShare.md
index 0f5f6514..6326de86 100644
--- a/versioned_docs/version-0.23.0/api/web/functions/useScreenShare.md
+++ b/versioned_docs/version-0.26.0/api/web/functions/useScreenShare.md
@@ -2,7 +2,7 @@
> **useScreenShare**(): `object`
-Defined in: [react-client/src/hooks/useScreenShare.ts:10](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/hooks/useScreenShare.ts#L10)
+Defined in: [react-client/src/hooks/useScreenShare.ts:10](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useScreenShare.ts#L10)
Hook to enable screen sharing within a room and manage the existing stream.
diff --git a/versioned_docs/version-0.23.0/api/web/functions/useUpdatePeerMetadata.md b/versioned_docs/version-0.26.0/api/web/functions/useUpdatePeerMetadata.md
similarity index 83%
rename from versioned_docs/version-0.23.0/api/web/functions/useUpdatePeerMetadata.md
rename to versioned_docs/version-0.26.0/api/web/functions/useUpdatePeerMetadata.md
index e1c9a547..6c00e342 100644
--- a/versioned_docs/version-0.23.0/api/web/functions/useUpdatePeerMetadata.md
+++ b/versioned_docs/version-0.26.0/api/web/functions/useUpdatePeerMetadata.md
@@ -2,7 +2,7 @@
> **useUpdatePeerMetadata**\<`PeerMetadata`\>(): `object`
-Defined in: [react-client/src/hooks/useUpdatePeerMetadata.ts:12](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/hooks/useUpdatePeerMetadata.ts#L12)
+Defined in: [react-client/src/hooks/useUpdatePeerMetadata.ts:12](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useUpdatePeerMetadata.ts#L12)
Hook provides a method to update the metadata of the local peer.
diff --git a/versioned_docs/version-0.26.0/api/web/functions/useVAD.md b/versioned_docs/version-0.26.0/api/web/functions/useVAD.md
new file mode 100644
index 00000000..ad957db7
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/functions/useVAD.md
@@ -0,0 +1,25 @@
+# Function: useVAD()
+
+> **useVAD**(`options`): `Record`\<[`PeerId`](../type-aliases/PeerId.md), `boolean`\>
+
+Defined in: [react-client/src/hooks/useVAD.ts:35](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useVAD.ts#L35)
+
+Voice activity detection. Use this hook to check if voice is detected in the audio track for given peer(s).
+
+Remote peer VAD is driven by `vadNotification` messages from the backend.
+If the local peer's id is included in `peerIds`, local VAD is determined client-side
+by polling the microphone's audio level (see `useLocalVAD`).
+
+## Parameters
+
+| Parameter | Type | Description |
+| ------ | ------ | ------ |
+| `options` | \{ `peerIds`: readonly [`PeerId`](../type-aliases/PeerId.md)[]; \} | Options object. |
+| `options.peerIds` | readonly [`PeerId`](../type-aliases/PeerId.md)[] | List of peer ids to subscribe to for VAD notifications. Include the local peer's id to also track whether the local user is speaking. Example usage: `import { useVAD, type PeerId } from "@fishjam-cloud/react-client"; function WhoIsTalkingComponent({ peerIds }: { peerIds: PeerId[] }) { const peersInfo = useVAD({ peerIds }); const activePeers = (Object.keys(peersInfo) as PeerId[]).filter((peerId) => peersInfo[peerId]); return "Now talking: " + activePeers.join(", "); }` |
+
+## Returns
+
+`Record`\<[`PeerId`](../type-aliases/PeerId.md), `boolean`\>
+
+A record where each key is a peer id and the boolean value indicates
+whether voice activity is currently detected for that peer.
diff --git a/versioned_docs/version-0.23.0/api/web/index.md b/versioned_docs/version-0.26.0/api/web/index.md
similarity index 89%
rename from versioned_docs/version-0.23.0/api/web/index.md
rename to versioned_docs/version-0.26.0/api/web/index.md
index 01c4eb79..dabe879b 100644
--- a/versioned_docs/version-0.23.0/api/web/index.md
+++ b/versioned_docs/version-0.26.0/api/web/index.md
@@ -1,8 +1,11 @@
# @fishjam-cloud/react-client
+React client SDK for building web video and audio apps with Fishjam.
+
## Connection
- [useConnection](functions/useConnection.md)
+- [useDataChannel](functions/useDataChannel.md)
- [usePeers](functions/usePeers.md)
- [useUpdatePeerMetadata](functions/useUpdatePeerMetadata.md)
- [useVAD](functions/useVAD.md)
@@ -34,6 +37,7 @@
- [useCustomSource](functions/useCustomSource.md)
- [useSandbox](functions/useSandbox.md)
- [Variant](enumerations/Variant.md)
+- [DataChannelOptions](interfaces/DataChannelOptions.md)
- [JoinRoomConfig](interfaces/JoinRoomConfig.md)
- [SimulcastConfig](interfaces/SimulcastConfig.md)
- [AuthErrorReason](type-aliases/AuthErrorReason.md)
@@ -41,6 +45,7 @@
- [Brand](type-aliases/Brand.md)
- [ConnectViewerConfig](type-aliases/ConnectViewerConfig.md)
- [CustomSource](type-aliases/CustomSource.md)
+- [DataCallback](type-aliases/DataCallback.md)
- [DeviceError](type-aliases/DeviceError.md)
- [DeviceItem](type-aliases/DeviceItem.md)
- [InitializeDevicesResult](type-aliases/InitializeDevicesResult.md)
@@ -54,6 +59,7 @@
- [PersistLastDeviceHandlers](type-aliases/PersistLastDeviceHandlers.md)
- [ReconnectConfig](type-aliases/ReconnectConfig.md)
- [ReconnectionStatus](type-aliases/ReconnectionStatus.md)
+- [RemoteTrack](type-aliases/RemoteTrack.md)
- [RoomType](type-aliases/RoomType.md)
- [SimulcastBandwidthLimit](type-aliases/SimulcastBandwidthLimit.md)
- [SimulcastBandwidthLimits](type-aliases/SimulcastBandwidthLimits.md)
@@ -64,6 +70,7 @@
- [TrackMiddleware](type-aliases/TrackMiddleware.md)
- [TracksMiddleware](type-aliases/TracksMiddleware.md)
- [TracksMiddlewareResult](type-aliases/TracksMiddlewareResult.md)
+- [UseDataChannelResult](type-aliases/UseDataChannelResult.md)
- [UseInitializeDevicesParams](type-aliases/UseInitializeDevicesParams.md)
- [UseSandboxProps](type-aliases/UseSandboxProps.md)
- [SimulcastConfig](variables/SimulcastConfig.md)
diff --git a/versioned_docs/version-0.26.0/api/web/interfaces/DataChannelOptions.md b/versioned_docs/version-0.26.0/api/web/interfaces/DataChannelOptions.md
new file mode 100644
index 00000000..3ac150b4
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/interfaces/DataChannelOptions.md
@@ -0,0 +1,16 @@
+# Interface: DataChannelOptions
+
+Defined in: ts-client/dist/index.d.mts:501
+
+Options for publishing or subscribing to data.
+
+## Properties
+
+### reliable
+
+> **reliable**: `boolean`
+
+Defined in: ts-client/dist/index.d.mts:506
+
+If true, uses the reliable data channel (ordered, guaranteed delivery).
+If false, uses the lossy data channel (unordered, low latency).
diff --git a/versioned_docs/version-0.23.0/api/web/interfaces/FishjamProviderProps.md b/versioned_docs/version-0.26.0/api/web/interfaces/FishjamProviderProps.md
similarity index 53%
rename from versioned_docs/version-0.23.0/api/web/interfaces/FishjamProviderProps.md
rename to versioned_docs/version-0.26.0/api/web/interfaces/FishjamProviderProps.md
index 1843f9be..f09e0292 100644
--- a/versioned_docs/version-0.23.0/api/web/interfaces/FishjamProviderProps.md
+++ b/versioned_docs/version-0.26.0/api/web/interfaces/FishjamProviderProps.md
@@ -1,6 +1,6 @@
# Interface: FishjamProviderProps
-Defined in: [react-client/src/FishjamProvider.tsx:27](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/FishjamProvider.tsx#L27)
+Defined in: [react-client/src/FishjamProvider.tsx:27](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/FishjamProvider.tsx#L27)
## Extends
@@ -12,9 +12,9 @@ Defined in: [react-client/src/FishjamProvider.tsx:27](https://github.com/fishjam
> `optional` **audioConfig**: [`StreamConfig`](../type-aliases/StreamConfig.md)
-Defined in: [react-client/src/FishjamProvider.tsx:55](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/FishjamProvider.tsx#L55)
+Defined in: [react-client/src/FishjamProvider.tsx:55](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/FishjamProvider.tsx#L55)
-Configure whether to use audio simulcast and which layers to send if so.
+Configure whether to use audio simulcast and which quality layers to send if so.
***
@@ -22,7 +22,7 @@ Configure whether to use audio simulcast and which layers to send if so.
> `optional` **bandwidthLimits**: `Partial`\<[`BandwidthLimits`](../type-aliases/BandwidthLimits.md)\>
-Defined in: [react-client/src/FishjamProvider.tsx:47](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/FishjamProvider.tsx#L47)
+Defined in: [react-client/src/FishjamProvider.tsx:47](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/FishjamProvider.tsx#L47)
Adjust max bandwidth limit for a single stream and simulcast.
@@ -32,7 +32,7 @@ Adjust max bandwidth limit for a single stream and simulcast.
> `optional` **constraints**: `Pick`\<`MediaStreamConstraints`, `"audio"` \| `"video"`\>
-Defined in: [react-client/src/FishjamProvider.tsx:38](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/FishjamProvider.tsx#L38)
+Defined in: [react-client/src/FishjamProvider.tsx:38](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/FishjamProvider.tsx#L38)
Set preferred constraints.
@@ -46,11 +46,31 @@ The media stream constraints as defined by the Web API.
***
+### debug?
+
+> `optional` **debug**: `boolean`
+
+Defined in: [react-client/src/FishjamProvider.tsx:63](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/FishjamProvider.tsx#L63)
+
+Enables Fishjam SDK's debug logs in the console.
+
+***
+
+### fishjamClient?
+
+> `optional` **fishjamClient**: `FishjamClient`\<`GenericMetadata`, `GenericMetadata`\>
+
+Defined in: [react-client/src/FishjamProvider.tsx:67](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/FishjamProvider.tsx#L67)
+
+Allows to provide your own FishjamClient instance from ts-client.
+
+***
+
### fishjamId
> **fishjamId**: `string`
-Defined in: [react-client/src/FishjamProvider.tsx:59](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/FishjamProvider.tsx#L59)
+Defined in: [react-client/src/FishjamProvider.tsx:59](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/FishjamProvider.tsx#L59)
You can get you Fishjam ID at https://fishjam.io/app
@@ -60,7 +80,7 @@ You can get you Fishjam ID at https://fishjam.io/app
> `optional` **persistLastDevice**: `boolean` \| [`PersistLastDeviceHandlers`](../type-aliases/PersistLastDeviceHandlers.md)
-Defined in: [react-client/src/FishjamProvider.tsx:43](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/FishjamProvider.tsx#L43)
+Defined in: [react-client/src/FishjamProvider.tsx:43](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/FishjamProvider.tsx#L43)
Decide if you want Fishjam SDK to persist last used device in the local storage.
You can also provide your getter and setter by using the [PersistLastDeviceHandlers](../type-aliases/PersistLastDeviceHandlers.md) interface.
@@ -71,7 +91,7 @@ You can also provide your getter and setter by using the [PersistLastDeviceHandl
> `optional` **reconnect**: `boolean` \| [`ReconnectConfig`](../type-aliases/ReconnectConfig.md)
-Defined in: [react-client/src/FishjamProvider.tsx:32](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/FishjamProvider.tsx#L32)
+Defined in: [react-client/src/FishjamProvider.tsx:32](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/FishjamProvider.tsx#L32)
Use [ReconnectConfig](../type-aliases/ReconnectConfig.md) to adjust reconnection policy to your needs or set false it.
Set to true by default.
@@ -82,6 +102,6 @@ Set to true by default.
> `optional` **videoConfig**: [`StreamConfig`](../type-aliases/StreamConfig.md)
-Defined in: [react-client/src/FishjamProvider.tsx:51](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/FishjamProvider.tsx#L51)
+Defined in: [react-client/src/FishjamProvider.tsx:51](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/FishjamProvider.tsx#L51)
-Configure whether to use video simulcast and which layers to send if so.
+Configure whether to use video simulcast and which quality layers to send if so.
diff --git a/versioned_docs/version-0.23.0/api/web/interfaces/JoinRoomConfig.md b/versioned_docs/version-0.26.0/api/web/interfaces/JoinRoomConfig.md
similarity index 63%
rename from versioned_docs/version-0.23.0/api/web/interfaces/JoinRoomConfig.md
rename to versioned_docs/version-0.26.0/api/web/interfaces/JoinRoomConfig.md
index cb187f2a..33a2e919 100644
--- a/versioned_docs/version-0.23.0/api/web/interfaces/JoinRoomConfig.md
+++ b/versioned_docs/version-0.26.0/api/web/interfaces/JoinRoomConfig.md
@@ -1,6 +1,6 @@
# Interface: JoinRoomConfig\
-Defined in: [react-client/src/hooks/useConnection.ts:10](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/hooks/useConnection.ts#L10)
+Defined in: [react-client/src/hooks/useConnection.ts:10](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useConnection.ts#L10)
## Type Parameters
@@ -14,7 +14,7 @@ Defined in: [react-client/src/hooks/useConnection.ts:10](https://github.com/fish
> `optional` **peerMetadata**: `PeerMetadata`
-Defined in: [react-client/src/hooks/useConnection.ts:18](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/hooks/useConnection.ts#L18)
+Defined in: [react-client/src/hooks/useConnection.ts:18](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useConnection.ts#L18)
String indexed record with metadata, that will be available to all other peers
@@ -24,6 +24,6 @@ String indexed record with metadata, that will be available to all other peers
> **peerToken**: `string`
-Defined in: [react-client/src/hooks/useConnection.ts:14](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/hooks/useConnection.ts#L14)
+Defined in: [react-client/src/hooks/useConnection.ts:14](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useConnection.ts#L14)
Token received from server (or Room Manager)
diff --git a/versioned_docs/version-0.23.0/api/web/interfaces/SimulcastConfig.md b/versioned_docs/version-0.26.0/api/web/interfaces/SimulcastConfig.md
similarity index 61%
rename from versioned_docs/version-0.23.0/api/web/interfaces/SimulcastConfig.md
rename to versioned_docs/version-0.26.0/api/web/interfaces/SimulcastConfig.md
index 04e451f4..953fa22c 100644
--- a/versioned_docs/version-0.23.0/api/web/interfaces/SimulcastConfig.md
+++ b/versioned_docs/version-0.26.0/api/web/interfaces/SimulcastConfig.md
@@ -1,6 +1,6 @@
# Interface: SimulcastConfig
-Defined in: ts-client/dist/index.d.mts:158
+Defined in: ts-client/dist/index.d.mts:197
## Properties
@@ -8,7 +8,7 @@ Defined in: ts-client/dist/index.d.mts:158
> **disabledVariants**: [`Variant`](../enumerations/Variant.md)[]
-Defined in: ts-client/dist/index.d.mts:161
+Defined in: ts-client/dist/index.d.mts:200
***
@@ -16,7 +16,7 @@ Defined in: ts-client/dist/index.d.mts:161
> **enabled**: `boolean`
-Defined in: ts-client/dist/index.d.mts:159
+Defined in: ts-client/dist/index.d.mts:198
***
@@ -24,4 +24,4 @@ Defined in: ts-client/dist/index.d.mts:159
> **enabledVariants**: [`Variant`](../enumerations/Variant.md)[]
-Defined in: ts-client/dist/index.d.mts:160
+Defined in: ts-client/dist/index.d.mts:199
diff --git a/versioned_docs/version-0.26.0/api/web/interfaces/UseLivestreamStreamerResult.md b/versioned_docs/version-0.26.0/api/web/interfaces/UseLivestreamStreamerResult.md
new file mode 100644
index 00000000..5f8161cb
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/interfaces/UseLivestreamStreamerResult.md
@@ -0,0 +1,62 @@
+# Interface: UseLivestreamStreamerResult
+
+Defined in: [react-client/src/hooks/useLivestreamStreamer.ts:28](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useLivestreamStreamer.ts#L28)
+
+## Properties
+
+### connect()
+
+> **connect**: (`inputs`, `urlOverride?`) => `Promise`\<`void`\>
+
+Defined in: [react-client/src/hooks/useLivestreamStreamer.ts:35](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useLivestreamStreamer.ts#L35)
+
+Callback used to start publishing the selected audio and video media streams.
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `inputs` | [`ConnectStreamerConfig`](../type-aliases/ConnectStreamerConfig.md) |
+| `urlOverride?` | `string` |
+
+#### Returns
+
+`Promise`\<`void`\>
+
+#### Remarks
+
+Calling [connect](#connect) multiple times will have the effect of only publishing the **last** specified inputs.
+
+***
+
+### disconnect()
+
+> **disconnect**: () => `void`
+
+Defined in: [react-client/src/hooks/useLivestreamStreamer.ts:37](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useLivestreamStreamer.ts#L37)
+
+Callback to stop publishing anything previously published with [connect](#connect)
+
+#### Returns
+
+`void`
+
+***
+
+### error
+
+> **error**: `null` \| `LivestreamError`
+
+Defined in: [react-client/src/hooks/useLivestreamStreamer.ts:39](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useLivestreamStreamer.ts#L39)
+
+Any errors encountered in [connect](#connect) will populate this field
+
+***
+
+### isConnected
+
+> **isConnected**: `boolean`
+
+Defined in: [react-client/src/hooks/useLivestreamStreamer.ts:41](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useLivestreamStreamer.ts#L41)
+
+Utility flag which indicates the current connection status
diff --git a/versioned_docs/version-0.26.0/api/web/interfaces/UseLivestreamViewerResult.md b/versioned_docs/version-0.26.0/api/web/interfaces/UseLivestreamViewerResult.md
new file mode 100644
index 00000000..144a3205
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/interfaces/UseLivestreamViewerResult.md
@@ -0,0 +1,82 @@
+# Interface: UseLivestreamViewerResult
+
+Defined in: [react-client/src/hooks/useLivestreamViewer.ts:12](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useLivestreamViewer.ts#L12)
+
+## Properties
+
+### connect()
+
+> **connect**: (`config`, `url?`) => `Promise`\<`void`\>
+
+Defined in: [react-client/src/hooks/useLivestreamViewer.ts:20](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useLivestreamViewer.ts#L20)
+
+Callback to start receiving a livestream.
+If the livestream is private, provide `token`.
+If the livestream is public, provide `streamId`.
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `config` | [`ConnectViewerConfig`](../type-aliases/ConnectViewerConfig.md) |
+| `url?` | `string` |
+
+#### Returns
+
+`Promise`\<`void`\>
+
+***
+
+### disconnect()
+
+> **disconnect**: () => `void`
+
+Defined in: [react-client/src/hooks/useLivestreamViewer.ts:22](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useLivestreamViewer.ts#L22)
+
+Callback used to disconnect from a stream previously connected to with [connect](#connect)
+
+#### Returns
+
+`void`
+
+***
+
+### error
+
+> **error**: `null` \| `LivestreamError`
+
+Defined in: [react-client/src/hooks/useLivestreamViewer.ts:24](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useLivestreamViewer.ts#L24)
+
+Any errors encountered in [connect](#connect) will be present in this field.
+
+***
+
+### getStatistics()
+
+> **getStatistics**: () => `Promise`\<`undefined` \| `RTCStatsReport`\>
+
+Defined in: [react-client/src/hooks/useLivestreamViewer.ts:27](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useLivestreamViewer.ts#L27)
+
+#### Returns
+
+`Promise`\<`undefined` \| `RTCStatsReport`\>
+
+***
+
+### isConnected
+
+> **isConnected**: `boolean`
+
+Defined in: [react-client/src/hooks/useLivestreamViewer.ts:26](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useLivestreamViewer.ts#L26)
+
+Utility flag which indicates the current connection status
+
+***
+
+### stream
+
+> **stream**: `null` \| `MediaStream`
+
+Defined in: [react-client/src/hooks/useLivestreamViewer.ts:14](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useLivestreamViewer.ts#L14)
+
+The received livestream media
diff --git a/versioned_docs/version-0.23.0/api/web/type-aliases/AuthErrorReason.md b/versioned_docs/version-0.26.0/api/web/type-aliases/AuthErrorReason.md
similarity index 100%
rename from versioned_docs/version-0.23.0/api/web/type-aliases/AuthErrorReason.md
rename to versioned_docs/version-0.26.0/api/web/type-aliases/AuthErrorReason.md
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/BandwidthLimits.md b/versioned_docs/version-0.26.0/api/web/type-aliases/BandwidthLimits.md
new file mode 100644
index 00000000..cd1bca69
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/BandwidthLimits.md
@@ -0,0 +1,21 @@
+# Type Alias: BandwidthLimits
+
+> **BandwidthLimits** = `object`
+
+Defined in: [react-client/src/types/public.ts:70](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L70)
+
+## Properties
+
+### simulcast
+
+> **simulcast**: [`SimulcastBandwidthLimits`](SimulcastBandwidthLimits.md)
+
+Defined in: [react-client/src/types/public.ts:70](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L70)
+
+***
+
+### singleStream
+
+> **singleStream**: `number`
+
+Defined in: [react-client/src/types/public.ts:70](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L70)
diff --git a/versioned_docs/version-0.23.0/api/mobile/type-aliases/Brand.md b/versioned_docs/version-0.26.0/api/web/type-aliases/Brand.md
similarity index 51%
rename from versioned_docs/version-0.23.0/api/mobile/type-aliases/Brand.md
rename to versioned_docs/version-0.26.0/api/web/type-aliases/Brand.md
index b4efecb1..729e5cba 100644
--- a/versioned_docs/version-0.23.0/api/mobile/type-aliases/Brand.md
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/Brand.md
@@ -2,9 +2,7 @@
> **Brand**\<`T`, `TBrand`\> = `T` & `object`
-Defined in: [packages/react-native-client/src/types.ts:34](https://github.com/fishjam-cloud/mobile-client-sdk/blob/13bc6085d5c0268377acde140fe9c29c39eaf73b/packages/react-native-client/src/types.ts#L34)
-
-Branded type
+Defined in: [react-client/src/types/public.ts:81](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L81)
## Type declaration
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/ConnectStreamerConfig.md b/versioned_docs/version-0.26.0/api/web/type-aliases/ConnectStreamerConfig.md
new file mode 100644
index 00000000..b384f7e3
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/ConnectStreamerConfig.md
@@ -0,0 +1,23 @@
+# Type Alias: ConnectStreamerConfig
+
+> **ConnectStreamerConfig** = `object`
+
+Defined in: [react-client/src/hooks/useLivestreamStreamer.ts:21](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useLivestreamStreamer.ts#L21)
+
+## Properties
+
+### inputs
+
+> **inputs**: [`StreamerInputs`](StreamerInputs.md)
+
+Defined in: [react-client/src/hooks/useLivestreamStreamer.ts:22](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useLivestreamStreamer.ts#L22)
+
+***
+
+### token
+
+> **token**: `string`
+
+Defined in: [react-client/src/hooks/useLivestreamStreamer.ts:24](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useLivestreamStreamer.ts#L24)
+
+Streamer token used to authenticate with Fishjam
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/ConnectViewerConfig.md b/versioned_docs/version-0.26.0/api/web/type-aliases/ConnectViewerConfig.md
new file mode 100644
index 00000000..de80f962
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/ConnectViewerConfig.md
@@ -0,0 +1,5 @@
+# Type Alias: ConnectViewerConfig
+
+> **ConnectViewerConfig** = \{ `streamId?`: `never`; `token`: `string`; \} \| \{ `streamId`: `string`; `token?`: `never`; \}
+
+Defined in: [react-client/src/hooks/useLivestreamViewer.ts:7](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useLivestreamViewer.ts#L7)
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/CustomSource.md b/versioned_docs/version-0.26.0/api/web/type-aliases/CustomSource.md
new file mode 100644
index 00000000..54a5eab9
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/CustomSource.md
@@ -0,0 +1,40 @@
+# Type Alias: CustomSource\
+
+> **CustomSource**\<`T`\> = `object`
+
+Defined in: [react-client/src/types/public.ts:83](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L83)
+
+## Type Parameters
+
+| Type Parameter |
+| ------ |
+| `T` *extends* `string` |
+
+## Properties
+
+### id
+
+> **id**: `T`
+
+Defined in: [react-client/src/types/public.ts:84](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L84)
+
+***
+
+### stream?
+
+> `optional` **stream**: `MediaStream`
+
+Defined in: [react-client/src/types/public.ts:86](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L86)
+
+***
+
+### trackIds?
+
+> `optional` **trackIds**: `object`
+
+Defined in: [react-client/src/types/public.ts:85](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L85)
+
+| Name | Type |
+| ------ | ------ |
+| `audioId?` | `string` |
+| `videoId?` | `string` |
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/DataCallback.md b/versioned_docs/version-0.26.0/api/web/type-aliases/DataCallback.md
new file mode 100644
index 00000000..2625caca
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/DataCallback.md
@@ -0,0 +1,17 @@
+# Type Alias: DataCallback()
+
+> **DataCallback** = (`data`) => `void`
+
+Defined in: ts-client/dist/index.d.mts:512
+
+Callback type for receiving data from a data channel.
+
+## Parameters
+
+| Parameter | Type | Description |
+| ------ | ------ | ------ |
+| `data` | `Uint8Array` | The received data as a Uint8Array |
+
+## Returns
+
+`void`
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/DeviceError.md b/versioned_docs/version-0.26.0/api/web/type-aliases/DeviceError.md
new file mode 100644
index 00000000..b82676f4
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/DeviceError.md
@@ -0,0 +1,5 @@
+# Type Alias: DeviceError
+
+> **DeviceError** = \{ `name`: `"OverconstrainedError"`; \} \| \{ `name`: `"NotAllowedError"`; \} \| \{ `name`: `"NotFoundError"`; \} \| \{ `name`: `"UNHANDLED_ERROR"`; \}
+
+Defined in: [react-client/src/types/public.ts:74](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L74)
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/DeviceItem.md b/versioned_docs/version-0.26.0/api/web/type-aliases/DeviceItem.md
new file mode 100644
index 00000000..0c2b0fc4
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/DeviceItem.md
@@ -0,0 +1,21 @@
+# Type Alias: DeviceItem
+
+> **DeviceItem** = `object`
+
+Defined in: [react-client/src/types/public.ts:55](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L55)
+
+## Properties
+
+### deviceId
+
+> **deviceId**: `string`
+
+Defined in: [react-client/src/types/public.ts:55](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L55)
+
+***
+
+### label
+
+> **label**: `string`
+
+Defined in: [react-client/src/types/public.ts:55](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L55)
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/InitializeDevicesResult.md b/versioned_docs/version-0.26.0/api/web/type-aliases/InitializeDevicesResult.md
new file mode 100644
index 00000000..a36ca9d6
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/InitializeDevicesResult.md
@@ -0,0 +1,29 @@
+# Type Alias: InitializeDevicesResult
+
+> **InitializeDevicesResult** = `object`
+
+Defined in: [react-client/src/types/public.ts:11](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L11)
+
+## Properties
+
+### errors
+
+> **errors**: \{ `audio`: [`DeviceError`](DeviceError.md) \| `null`; `video`: [`DeviceError`](DeviceError.md) \| `null`; \} \| `null`
+
+Defined in: [react-client/src/types/public.ts:14](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L14)
+
+***
+
+### status
+
+> **status**: [`InitializeDevicesStatus`](InitializeDevicesStatus.md)
+
+Defined in: [react-client/src/types/public.ts:12](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L12)
+
+***
+
+### stream
+
+> **stream**: `MediaStream` \| `null`
+
+Defined in: [react-client/src/types/public.ts:13](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L13)
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/InitializeDevicesSettings.md b/versioned_docs/version-0.26.0/api/web/type-aliases/InitializeDevicesSettings.md
new file mode 100644
index 00000000..db551b33
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/InitializeDevicesSettings.md
@@ -0,0 +1,21 @@
+# Type Alias: InitializeDevicesSettings
+
+> **InitializeDevicesSettings** = `object`
+
+Defined in: [react-client/src/hooks/internal/devices/useMediaDevices.ts:16](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/internal/devices/useMediaDevices.ts#L16)
+
+## Properties
+
+### enableAudio?
+
+> `optional` **enableAudio**: `boolean`
+
+Defined in: [react-client/src/hooks/internal/devices/useMediaDevices.ts:16](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/internal/devices/useMediaDevices.ts#L16)
+
+***
+
+### enableVideo?
+
+> `optional` **enableVideo**: `boolean`
+
+Defined in: [react-client/src/hooks/internal/devices/useMediaDevices.ts:16](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/internal/devices/useMediaDevices.ts#L16)
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/InitializeDevicesStatus.md b/versioned_docs/version-0.26.0/api/web/type-aliases/InitializeDevicesStatus.md
new file mode 100644
index 00000000..35d976b8
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/InitializeDevicesStatus.md
@@ -0,0 +1,5 @@
+# Type Alias: InitializeDevicesStatus
+
+> **InitializeDevicesStatus** = `"initialized"` \| `"failed"` \| `"initialized_with_errors"` \| `"already_initialized"`
+
+Defined in: [react-client/src/types/public.ts:9](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L9)
diff --git a/versioned_docs/version-0.23.0/api/web/type-aliases/JoinErrorReason.md b/versioned_docs/version-0.26.0/api/web/type-aliases/JoinErrorReason.md
similarity index 67%
rename from versioned_docs/version-0.23.0/api/web/type-aliases/JoinErrorReason.md
rename to versioned_docs/version-0.26.0/api/web/type-aliases/JoinErrorReason.md
index f8a54bb2..62cc2c46 100644
--- a/versioned_docs/version-0.23.0/api/web/type-aliases/JoinErrorReason.md
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/JoinErrorReason.md
@@ -2,4 +2,4 @@
> **JoinErrorReason** = *typeof* `JOIN_ERRORS`\[`number`\]
-Defined in: ts-client/dist/index.d.mts:775
+Defined in: ts-client/dist/index.d.mts:937
diff --git a/versioned_docs/version-0.23.0/api/web/type-aliases/Metadata.md b/versioned_docs/version-0.26.0/api/web/type-aliases/Metadata.md
similarity index 80%
rename from versioned_docs/version-0.23.0/api/web/type-aliases/Metadata.md
rename to versioned_docs/version-0.26.0/api/web/type-aliases/Metadata.md
index dde30a3f..b6cac4dc 100644
--- a/versioned_docs/version-0.23.0/api/web/type-aliases/Metadata.md
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/Metadata.md
@@ -2,7 +2,7 @@
> **Metadata**\<`PeerMetadata`, `ServerMetadata`\> = `object`
-Defined in: ts-client/dist/index.d.mts:798
+Defined in: ts-client/dist/index.d.mts:968
## Type Parameters
@@ -17,7 +17,7 @@ Defined in: ts-client/dist/index.d.mts:798
> **peer**: `PeerMetadata`
-Defined in: ts-client/dist/index.d.mts:799
+Defined in: ts-client/dist/index.d.mts:969
***
@@ -25,4 +25,4 @@ Defined in: ts-client/dist/index.d.mts:799
> **server**: `ServerMetadata`
-Defined in: ts-client/dist/index.d.mts:800
+Defined in: ts-client/dist/index.d.mts:970
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/MiddlewareResult.md b/versioned_docs/version-0.26.0/api/web/type-aliases/MiddlewareResult.md
new file mode 100644
index 00000000..426bba5a
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/MiddlewareResult.md
@@ -0,0 +1,25 @@
+# Type Alias: MiddlewareResult
+
+> **MiddlewareResult** = `object`
+
+Defined in: [react-client/src/types/public.ts:32](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L32)
+
+## Properties
+
+### onClear()?
+
+> `optional` **onClear**: () => `void`
+
+Defined in: [react-client/src/types/public.ts:32](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L32)
+
+#### Returns
+
+`void`
+
+***
+
+### track
+
+> **track**: `MediaStreamTrack`
+
+Defined in: [react-client/src/types/public.ts:32](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L32)
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/PeerId.md b/versioned_docs/version-0.26.0/api/web/type-aliases/PeerId.md
new file mode 100644
index 00000000..02fd87ae
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/PeerId.md
@@ -0,0 +1,5 @@
+# Type Alias: PeerId
+
+> **PeerId** = [`Brand`](Brand.md)\<`string`, `"PeerId"`\>
+
+Defined in: [react-client/src/types/public.ts:18](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L18)
diff --git a/versioned_docs/version-0.23.0/api/mobile/type-aliases/PeerStatus.md b/versioned_docs/version-0.26.0/api/web/type-aliases/PeerStatus.md
similarity index 52%
rename from versioned_docs/version-0.23.0/api/mobile/type-aliases/PeerStatus.md
rename to versioned_docs/version-0.26.0/api/web/type-aliases/PeerStatus.md
index 83053614..06487a8f 100644
--- a/versioned_docs/version-0.23.0/api/mobile/type-aliases/PeerStatus.md
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/PeerStatus.md
@@ -2,9 +2,9 @@
> **PeerStatus** = `"connecting"` \| `"connected"` \| `"error"` \| `"idle"`
-Defined in: [packages/react-native-client/src/hooks/useConnection.ts:26](https://github.com/fishjam-cloud/mobile-client-sdk/blob/13bc6085d5c0268377acde140fe9c29c39eaf73b/packages/react-native-client/src/hooks/useConnection.ts#L26)
+Defined in: [react-client/src/types/public.ts:53](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L53)
-Represents the possible statuses of a peer connection to a room (websocket state).
+Represents the possible statuses of a peer connection.
- `idle` - Peer is not connected, either never connected or successfully disconnected.
- `connecting` - Peer is in the process of connecting.
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/PeerWithTracks.md b/versioned_docs/version-0.26.0/api/web/type-aliases/PeerWithTracks.md
new file mode 100644
index 00000000..46050b47
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/PeerWithTracks.md
@@ -0,0 +1,85 @@
+# Type Alias: PeerWithTracks\
+
+> **PeerWithTracks**\<`PeerMetadata`, `ServerMetadata`, `T`\> = `object`
+
+Defined in: [react-client/src/hooks/usePeers.ts:14](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/usePeers.ts#L14)
+
+## Type Parameters
+
+| Type Parameter | Default type | Description |
+| ------ | ------ | ------ |
+| `PeerMetadata` | - | Type of metadata set by peer while connecting to a room. |
+| `ServerMetadata` | - | Type of metadata set by the server while creating a peer. |
+| `T` *extends* [`Track`](Track.md) | [`Track`](Track.md) | - |
+
+## Properties
+
+### cameraTrack?
+
+> `optional` **cameraTrack**: `T`
+
+Defined in: [react-client/src/hooks/usePeers.ts:18](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/usePeers.ts#L18)
+
+***
+
+### customAudioTracks
+
+> **customAudioTracks**: `T`[]
+
+Defined in: [react-client/src/hooks/usePeers.ts:23](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/usePeers.ts#L23)
+
+***
+
+### customVideoTracks
+
+> **customVideoTracks**: `T`[]
+
+Defined in: [react-client/src/hooks/usePeers.ts:22](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/usePeers.ts#L22)
+
+***
+
+### id
+
+> **id**: [`PeerId`](PeerId.md)
+
+Defined in: [react-client/src/hooks/usePeers.ts:15](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/usePeers.ts#L15)
+
+***
+
+### metadata?
+
+> `optional` **metadata**: [`Metadata`](Metadata.md)\<`PeerMetadata`, `ServerMetadata`\>
+
+Defined in: [react-client/src/hooks/usePeers.ts:16](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/usePeers.ts#L16)
+
+***
+
+### microphoneTrack?
+
+> `optional` **microphoneTrack**: `T`
+
+Defined in: [react-client/src/hooks/usePeers.ts:19](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/usePeers.ts#L19)
+
+***
+
+### screenShareAudioTrack?
+
+> `optional` **screenShareAudioTrack**: `T`
+
+Defined in: [react-client/src/hooks/usePeers.ts:21](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/usePeers.ts#L21)
+
+***
+
+### screenShareVideoTrack?
+
+> `optional` **screenShareVideoTrack**: `T`
+
+Defined in: [react-client/src/hooks/usePeers.ts:20](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/usePeers.ts#L20)
+
+***
+
+### tracks
+
+> **tracks**: `T`[]
+
+Defined in: [react-client/src/hooks/usePeers.ts:17](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/usePeers.ts#L17)
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/PersistLastDeviceHandlers.md b/versioned_docs/version-0.26.0/api/web/type-aliases/PersistLastDeviceHandlers.md
new file mode 100644
index 00000000..4a415f3f
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/PersistLastDeviceHandlers.md
@@ -0,0 +1,42 @@
+# Type Alias: PersistLastDeviceHandlers
+
+> **PersistLastDeviceHandlers** = `object`
+
+Defined in: [react-client/src/types/public.ts:57](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L57)
+
+## Properties
+
+### getLastDevice()
+
+> **getLastDevice**: (`deviceType`) => `MediaDeviceInfo` \| `null`
+
+Defined in: [react-client/src/types/public.ts:58](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L58)
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `deviceType` | `"audio"` \| `"video"` |
+
+#### Returns
+
+`MediaDeviceInfo` \| `null`
+
+***
+
+### saveLastDevice()
+
+> **saveLastDevice**: (`info`, `deviceType`) => `void`
+
+Defined in: [react-client/src/types/public.ts:59](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L59)
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `info` | `MediaDeviceInfo` |
+| `deviceType` | `"audio"` \| `"video"` |
+
+#### Returns
+
+`void`
diff --git a/versioned_docs/version-0.23.0/api/web/type-aliases/ReconnectConfig.md b/versioned_docs/version-0.26.0/api/web/type-aliases/ReconnectConfig.md
similarity index 61%
rename from versioned_docs/version-0.23.0/api/web/type-aliases/ReconnectConfig.md
rename to versioned_docs/version-0.26.0/api/web/type-aliases/ReconnectConfig.md
index a5039e15..8dad73ae 100644
--- a/versioned_docs/version-0.23.0/api/web/type-aliases/ReconnectConfig.md
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/ReconnectConfig.md
@@ -2,7 +2,7 @@
> **ReconnectConfig** = `object`
-Defined in: ts-client/dist/index.d.mts:779
+Defined in: ts-client/dist/index.d.mts:941
## Properties
@@ -10,7 +10,7 @@ Defined in: ts-client/dist/index.d.mts:779
> `optional` **addTracksOnReconnect**: `boolean`
-Defined in: ts-client/dist/index.d.mts:783
+Defined in: ts-client/dist/index.d.mts:945
***
@@ -18,7 +18,7 @@ Defined in: ts-client/dist/index.d.mts:783
> `optional` **delay**: `number`
-Defined in: ts-client/dist/index.d.mts:782
+Defined in: ts-client/dist/index.d.mts:944
***
@@ -26,7 +26,7 @@ Defined in: ts-client/dist/index.d.mts:782
> `optional` **initialDelay**: `number`
-Defined in: ts-client/dist/index.d.mts:781
+Defined in: ts-client/dist/index.d.mts:943
***
@@ -34,4 +34,4 @@ Defined in: ts-client/dist/index.d.mts:781
> `optional` **maxAttempts**: `number`
-Defined in: ts-client/dist/index.d.mts:780
+Defined in: ts-client/dist/index.d.mts:942
diff --git a/versioned_docs/version-0.23.0/api/web/type-aliases/ReconnectionStatus.md b/versioned_docs/version-0.26.0/api/web/type-aliases/ReconnectionStatus.md
similarity index 70%
rename from versioned_docs/version-0.23.0/api/web/type-aliases/ReconnectionStatus.md
rename to versioned_docs/version-0.26.0/api/web/type-aliases/ReconnectionStatus.md
index 1728a5ae..e2db85e8 100644
--- a/versioned_docs/version-0.23.0/api/web/type-aliases/ReconnectionStatus.md
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/ReconnectionStatus.md
@@ -2,4 +2,4 @@
> **ReconnectionStatus** = `"reconnecting"` \| `"idle"` \| `"error"`
-Defined in: ts-client/dist/index.d.mts:778
+Defined in: ts-client/dist/index.d.mts:940
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/RemoteTrack.md b/versioned_docs/version-0.26.0/api/web/type-aliases/RemoteTrack.md
new file mode 100644
index 00000000..375c0c97
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/RemoteTrack.md
@@ -0,0 +1,21 @@
+# Type Alias: RemoteTrack
+
+> **RemoteTrack** = [`Track`](Track.md) & `object`
+
+Defined in: [react-client/src/types/public.ts:28](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L28)
+
+## Type declaration
+
+### setReceivedQuality()
+
+> **setReceivedQuality**: (`quality`) => `void`
+
+#### Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `quality` | [`Variant`](../enumerations/Variant.md) |
+
+#### Returns
+
+`void`
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/RoomType.md b/versioned_docs/version-0.26.0/api/web/type-aliases/RoomType.md
new file mode 100644
index 00000000..27fa7c89
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/RoomType.md
@@ -0,0 +1,5 @@
+# Type Alias: RoomType
+
+> **RoomType** = `"conference"` \| `"livestream"` \| `"audio_only"`
+
+Defined in: [react-client/src/hooks/useSandbox.ts:19](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useSandbox.ts#L19)
diff --git a/versioned_docs/version-0.23.0/api/web/type-aliases/SimulcastBandwidthLimit.md b/versioned_docs/version-0.26.0/api/web/type-aliases/SimulcastBandwidthLimit.md
similarity index 89%
rename from versioned_docs/version-0.23.0/api/web/type-aliases/SimulcastBandwidthLimit.md
rename to versioned_docs/version-0.26.0/api/web/type-aliases/SimulcastBandwidthLimit.md
index 6105cc56..91b20381 100644
--- a/versioned_docs/version-0.23.0/api/web/type-aliases/SimulcastBandwidthLimit.md
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/SimulcastBandwidthLimit.md
@@ -2,7 +2,7 @@
> **SimulcastBandwidthLimit** = `Map`\<[`Variant`](../enumerations/Variant.md), `BandwidthLimit`\>
-Defined in: ts-client/dist/index.d.mts:213
+Defined in: ts-client/dist/index.d.mts:252
Type describing bandwidth limit for simulcast track.
It is a mapping (encoding => BandwidthLimit).
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/SimulcastBandwidthLimits.md b/versioned_docs/version-0.26.0/api/web/type-aliases/SimulcastBandwidthLimits.md
new file mode 100644
index 00000000..20695fec
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/SimulcastBandwidthLimits.md
@@ -0,0 +1,29 @@
+# Type Alias: SimulcastBandwidthLimits
+
+> **SimulcastBandwidthLimits** = `object`
+
+Defined in: [react-client/src/types/public.ts:62](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L62)
+
+## Properties
+
+### 1
+
+> **1**: `number`
+
+Defined in: [react-client/src/types/public.ts:63](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L63)
+
+***
+
+### 2
+
+> **2**: `number`
+
+Defined in: [react-client/src/types/public.ts:64](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L64)
+
+***
+
+### 3
+
+> **3**: `number`
+
+Defined in: [react-client/src/types/public.ts:65](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L65)
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/StreamConfig.md b/versioned_docs/version-0.26.0/api/web/type-aliases/StreamConfig.md
new file mode 100644
index 00000000..a6d99ca0
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/StreamConfig.md
@@ -0,0 +1,13 @@
+# Type Alias: StreamConfig
+
+> **StreamConfig** = `object`
+
+Defined in: [react-client/src/types/public.ts:68](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L68)
+
+## Properties
+
+### sentQualities?
+
+> `optional` **sentQualities**: [`Variant`](../enumerations/Variant.md)[] \| `false`
+
+Defined in: [react-client/src/types/public.ts:68](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L68)
diff --git a/versioned_docs/version-0.23.0/api/web/type-aliases/StreamerInputs.md b/versioned_docs/version-0.26.0/api/web/type-aliases/StreamerInputs.md
similarity index 78%
rename from versioned_docs/version-0.23.0/api/web/type-aliases/StreamerInputs.md
rename to versioned_docs/version-0.26.0/api/web/type-aliases/StreamerInputs.md
index 6420076a..124c48e4 100644
--- a/versioned_docs/version-0.23.0/api/web/type-aliases/StreamerInputs.md
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/StreamerInputs.md
@@ -2,7 +2,7 @@
> **StreamerInputs** = \{ `audio?`: `MediaStream` \| `null`; `video`: `MediaStream`; \} \| \{ `audio`: `MediaStream`; `video?`: `null`; \}
-Defined in: [react-client/src/hooks/useLivestreamStreamer.ts:7](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/hooks/useLivestreamStreamer.ts#L7)
+Defined in: [react-client/src/hooks/useLivestreamStreamer.ts:8](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useLivestreamStreamer.ts#L8)
## Type declaration
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/Track.md b/versioned_docs/version-0.26.0/api/web/type-aliases/Track.md
new file mode 100644
index 00000000..9003910e
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/Track.md
@@ -0,0 +1,45 @@
+# Type Alias: Track
+
+> **Track** = `object`
+
+Defined in: [react-client/src/types/public.ts:20](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L20)
+
+## Properties
+
+### metadata?
+
+> `optional` **metadata**: `TrackMetadata`
+
+Defined in: [react-client/src/types/public.ts:23](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L23)
+
+***
+
+### simulcastConfig
+
+> **simulcastConfig**: [`SimulcastConfig`](../interfaces/SimulcastConfig.md) \| `null`
+
+Defined in: [react-client/src/types/public.ts:24](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L24)
+
+***
+
+### stream
+
+> **stream**: `MediaStream` \| `null`
+
+Defined in: [react-client/src/types/public.ts:21](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L21)
+
+***
+
+### track
+
+> **track**: `MediaStreamTrack` \| `null`
+
+Defined in: [react-client/src/types/public.ts:25](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L25)
+
+***
+
+### trackId
+
+> **trackId**: [`TrackId`](TrackId.md)
+
+Defined in: [react-client/src/types/public.ts:22](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L22)
diff --git a/versioned_docs/version-0.23.0/api/web/type-aliases/TrackBandwidthLimit.md b/versioned_docs/version-0.26.0/api/web/type-aliases/TrackBandwidthLimit.md
similarity index 87%
rename from versioned_docs/version-0.23.0/api/web/type-aliases/TrackBandwidthLimit.md
rename to versioned_docs/version-0.26.0/api/web/type-aliases/TrackBandwidthLimit.md
index 9eddd54b..8ae1c104 100644
--- a/versioned_docs/version-0.23.0/api/web/type-aliases/TrackBandwidthLimit.md
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/TrackBandwidthLimit.md
@@ -2,7 +2,7 @@
> **TrackBandwidthLimit** = `BandwidthLimit` \| [`SimulcastBandwidthLimit`](SimulcastBandwidthLimit.md)
-Defined in: ts-client/dist/index.d.mts:218
+Defined in: ts-client/dist/index.d.mts:257
Type describing bandwidth limitation of a Track, including simulcast and non-simulcast tracks.
A sum type of `BandwidthLimit` and `SimulcastBandwidthLimit`
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/TrackId.md b/versioned_docs/version-0.26.0/api/web/type-aliases/TrackId.md
new file mode 100644
index 00000000..ca413b63
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/TrackId.md
@@ -0,0 +1,5 @@
+# Type Alias: TrackId
+
+> **TrackId** = [`Brand`](Brand.md)\<`string`, `"TrackId"`\>
+
+Defined in: [react-client/src/types/public.ts:17](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L17)
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/TrackMiddleware.md b/versioned_docs/version-0.26.0/api/web/type-aliases/TrackMiddleware.md
new file mode 100644
index 00000000..c12eddd8
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/TrackMiddleware.md
@@ -0,0 +1,5 @@
+# Type Alias: TrackMiddleware
+
+> **TrackMiddleware** = (`track`) => [`MiddlewareResult`](MiddlewareResult.md) \| `Promise`\<[`MiddlewareResult`](MiddlewareResult.md)\> \| `null`
+
+Defined in: [react-client/src/types/public.ts:33](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L33)
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/TracksMiddleware.md b/versioned_docs/version-0.26.0/api/web/type-aliases/TracksMiddleware.md
new file mode 100644
index 00000000..9f6aab9c
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/TracksMiddleware.md
@@ -0,0 +1,16 @@
+# Type Alias: TracksMiddleware()
+
+> **TracksMiddleware** = (`videoTrack`, `audioTrack`) => [`TracksMiddlewareResult`](TracksMiddlewareResult.md) \| `Promise`\<[`TracksMiddlewareResult`](TracksMiddlewareResult.md)\>
+
+Defined in: [react-client/src/types/public.ts:40](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L40)
+
+## Parameters
+
+| Parameter | Type |
+| ------ | ------ |
+| `videoTrack` | `MediaStreamTrack` |
+| `audioTrack` | `MediaStreamTrack` \| `null` |
+
+## Returns
+
+[`TracksMiddlewareResult`](TracksMiddlewareResult.md) \| `Promise`\<[`TracksMiddlewareResult`](TracksMiddlewareResult.md)\>
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/TracksMiddlewareResult.md b/versioned_docs/version-0.26.0/api/web/type-aliases/TracksMiddlewareResult.md
new file mode 100644
index 00000000..d49dec8a
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/TracksMiddlewareResult.md
@@ -0,0 +1,33 @@
+# Type Alias: TracksMiddlewareResult
+
+> **TracksMiddlewareResult** = `object`
+
+Defined in: [react-client/src/types/public.ts:35](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L35)
+
+## Properties
+
+### audioTrack
+
+> **audioTrack**: `MediaStreamTrack` \| `null`
+
+Defined in: [react-client/src/types/public.ts:37](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L37)
+
+***
+
+### onClear()
+
+> **onClear**: () => `void`
+
+Defined in: [react-client/src/types/public.ts:38](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L38)
+
+#### Returns
+
+`void`
+
+***
+
+### videoTrack
+
+> **videoTrack**: `MediaStreamTrack`
+
+Defined in: [react-client/src/types/public.ts:36](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L36)
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/UseDataChannelResult.md b/versioned_docs/version-0.26.0/api/web/type-aliases/UseDataChannelResult.md
new file mode 100644
index 00000000..2e29ff53
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/UseDataChannelResult.md
@@ -0,0 +1,101 @@
+# Type Alias: UseDataChannelResult
+
+> **UseDataChannelResult** = `object`
+
+Defined in: [react-client/src/types/public.ts:89](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L89)
+
+## Properties
+
+### dataChannelError
+
+> **dataChannelError**: `Error` \| `null`
+
+Defined in: [react-client/src/types/public.ts:122](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L122)
+
+Error that occurred during data publisher operations, or null if no error.
+
+***
+
+### dataChannelLoading
+
+> **dataChannelLoading**: `boolean`
+
+Defined in: [react-client/src/types/public.ts:118](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L118)
+
+Whether data channels are being initialized.
+
+***
+
+### dataChannelReady
+
+> **dataChannelReady**: `boolean`
+
+Defined in: [react-client/src/types/public.ts:114](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L114)
+
+Whether data channels are connected and ready to send data.
+Resets to false on disconnect.
+
+***
+
+### initializeDataChannel()
+
+> **initializeDataChannel**: () => `void`
+
+Defined in: [react-client/src/types/public.ts:95](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L95)
+
+Initializes the data channel.
+
+Requires that the fishjam client is already connected.
+
+#### Returns
+
+`void`
+
+***
+
+### publishData()
+
+> **publishData**: (`payload`, `options`) => `void`
+
+Defined in: [react-client/src/types/public.ts:101](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L101)
+
+Sends binary data through a data channel.
+
+#### Parameters
+
+| Parameter | Type | Description |
+| ------ | ------ | ------ |
+| `payload` | `Uint8Array` | The Uint8Array payload to send (first positional argument) |
+| `options` | [`DataChannelOptions`](../interfaces/DataChannelOptions.md) | Data channel options; specify `reliable: true` for guaranteed delivery or `reliable: false` for low latency |
+
+#### Returns
+
+`void`
+
+***
+
+### subscribeData()
+
+> **subscribeData**: (`callback`, `options`) => () => `void`
+
+Defined in: [react-client/src/types/public.ts:109](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/types/public.ts#L109)
+
+Subscribe to incoming data on a data channel.
+Can be called before or after channel creation.
+
+#### Parameters
+
+| Parameter | Type | Description |
+| ------ | ------ | ------ |
+| `callback` | [`DataCallback`](DataCallback.md) | Function called when data is received |
+| `options` | [`DataChannelOptions`](../interfaces/DataChannelOptions.md) | Specify `reliable: true` or `reliable: false` to choose channel |
+
+#### Returns
+
+Unsubscribe function - call to cancel the subscription
+
+> (): `void`
+
+##### Returns
+
+`void`
diff --git a/versioned_docs/version-0.23.0/api/web/type-aliases/UseInitializeDevicesParams.md b/versioned_docs/version-0.26.0/api/web/type-aliases/UseInitializeDevicesParams.md
similarity index 58%
rename from versioned_docs/version-0.23.0/api/web/type-aliases/UseInitializeDevicesParams.md
rename to versioned_docs/version-0.26.0/api/web/type-aliases/UseInitializeDevicesParams.md
index 95eba4b7..2fba2e68 100644
--- a/versioned_docs/version-0.23.0/api/web/type-aliases/UseInitializeDevicesParams.md
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/UseInitializeDevicesParams.md
@@ -2,7 +2,7 @@
> **UseInitializeDevicesParams** = `object`
-Defined in: [react-client/src/hooks/devices/useInitializeDevices.ts:5](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/hooks/devices/useInitializeDevices.ts#L5)
+Defined in: [react-client/src/hooks/devices/useInitializeDevices.ts:5](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/devices/useInitializeDevices.ts#L5)
## Properties
@@ -10,7 +10,7 @@ Defined in: [react-client/src/hooks/devices/useInitializeDevices.ts:5](https://g
> `optional` **enableAudio**: `boolean`
-Defined in: [react-client/src/hooks/devices/useInitializeDevices.ts:7](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/hooks/devices/useInitializeDevices.ts#L7)
+Defined in: [react-client/src/hooks/devices/useInitializeDevices.ts:7](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/devices/useInitializeDevices.ts#L7)
***
@@ -18,4 +18,4 @@ Defined in: [react-client/src/hooks/devices/useInitializeDevices.ts:7](https://g
> `optional` **enableVideo**: `boolean`
-Defined in: [react-client/src/hooks/devices/useInitializeDevices.ts:6](https://github.com/fishjam-cloud/web-client-sdk/blob/086057acaac6bb70cf3b439b0b98e1c0f9f80a67/packages/react-client/src/hooks/devices/useInitializeDevices.ts#L6)
+Defined in: [react-client/src/hooks/devices/useInitializeDevices.ts:6](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/devices/useInitializeDevices.ts#L6)
diff --git a/versioned_docs/version-0.26.0/api/web/type-aliases/UseSandboxProps.md b/versioned_docs/version-0.26.0/api/web/type-aliases/UseSandboxProps.md
new file mode 100644
index 00000000..a6a86627
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/type-aliases/UseSandboxProps.md
@@ -0,0 +1,17 @@
+# Type Alias: UseSandboxProps
+
+> **UseSandboxProps** = `object`
+
+Defined in: [react-client/src/hooks/useSandbox.ts:14](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useSandbox.ts#L14)
+
+## Properties
+
+### configOverride?
+
+> `optional` **configOverride**: `object`
+
+Defined in: [react-client/src/hooks/useSandbox.ts:16](https://github.com/fishjam-cloud/web-client-sdk/blob/ae228527ec61ba2db2a61a590b4c999f065dcfeb/packages/react-client/src/hooks/useSandbox.ts#L16)
+
+| Name | Type |
+| ------ | ------ |
+| `sandboxApiUrl?` | `string` |
diff --git a/versioned_docs/version-0.26.0/api/web/typedoc-sidebar.cjs b/versioned_docs/version-0.26.0/api/web/typedoc-sidebar.cjs
new file mode 100644
index 00000000..f8afae72
--- /dev/null
+++ b/versioned_docs/version-0.26.0/api/web/typedoc-sidebar.cjs
@@ -0,0 +1,4 @@
+// @ts-check
+/** @type {import("@docusaurus/plugin-content-docs").SidebarsConfig} */
+const typedocSidebar = {items:[{type:"category",label:"Connection",items:[{type:"doc",id:"api/web/functions/useConnection",label:"useConnection"},{type:"doc",id:"api/web/functions/useDataChannel",label:"useDataChannel"},{type:"doc",id:"api/web/functions/usePeers",label:"usePeers"},{type:"doc",id:"api/web/functions/useUpdatePeerMetadata",label:"useUpdatePeerMetadata"},{type:"doc",id:"api/web/functions/useVAD",label:"useVAD"},{type:"doc",id:"api/web/type-aliases/Metadata",label:"Metadata"}]},{type:"category",label:"Devices",items:[{type:"doc",id:"api/web/functions/useCamera",label:"useCamera"},{type:"doc",id:"api/web/functions/useInitializeDevices",label:"useInitializeDevices"},{type:"doc",id:"api/web/functions/useMicrophone",label:"useMicrophone"},{type:"doc",id:"api/web/functions/useScreenShare",label:"useScreenShare"}]},{type:"category",label:"Components",items:[{type:"doc",id:"api/web/functions/FishjamProvider",label:"FishjamProvider"},{type:"doc",id:"api/web/interfaces/FishjamProviderProps",label:"FishjamProviderProps"}]},{type:"category",label:"Livestream",items:[{type:"doc",id:"api/web/functions/useLivestreamStreamer",label:"useLivestreamStreamer"},{type:"doc",id:"api/web/functions/useLivestreamViewer",label:"useLivestreamViewer"},{type:"doc",id:"api/web/interfaces/UseLivestreamStreamerResult",label:"UseLivestreamStreamerResult"},{type:"doc",id:"api/web/interfaces/UseLivestreamViewerResult",label:"UseLivestreamViewerResult"},{type:"doc",id:"api/web/type-aliases/ConnectStreamerConfig",label:"ConnectStreamerConfig"},{type:"doc",id:"api/web/type-aliases/StreamerInputs",label:"StreamerInputs"}]},{type:"category",label:"Other",items:[{type:"doc",id:"api/web/functions/useCustomSource",label:"useCustomSource"},{type:"doc",id:"api/web/functions/useSandbox",label:"useSandbox"},{type:"doc",id:"api/web/enumerations/Variant",label:"Variant"},{type:"doc",id:"api/web/interfaces/DataChannelOptions",label:"DataChannelOptions"},{type:"doc",id:"api/web/interfaces/JoinRoomConfig",label:"JoinRoomConfig"},{type:"doc",id:"api/web/interfaces/SimulcastConfig",label:"SimulcastConfig"},{type:"doc",id:"api/web/type-aliases/AuthErrorReason",label:"AuthErrorReason"},{type:"doc",id:"api/web/type-aliases/BandwidthLimits",label:"BandwidthLimits"},{type:"doc",id:"api/web/type-aliases/Brand",label:"Brand"},{type:"doc",id:"api/web/type-aliases/ConnectViewerConfig",label:"ConnectViewerConfig"},{type:"doc",id:"api/web/type-aliases/CustomSource",label:"CustomSource"},{type:"doc",id:"api/web/type-aliases/DataCallback",label:"DataCallback"},{type:"doc",id:"api/web/type-aliases/DeviceError",label:"DeviceError"},{type:"doc",id:"api/web/type-aliases/DeviceItem",label:"DeviceItem"},{type:"doc",id:"api/web/type-aliases/InitializeDevicesResult",label:"InitializeDevicesResult"},{type:"doc",id:"api/web/type-aliases/InitializeDevicesSettings",label:"InitializeDevicesSettings"},{type:"doc",id:"api/web/type-aliases/InitializeDevicesStatus",label:"InitializeDevicesStatus"},{type:"doc",id:"api/web/type-aliases/JoinErrorReason",label:"JoinErrorReason"},{type:"doc",id:"api/web/type-aliases/MiddlewareResult",label:"MiddlewareResult"},{type:"doc",id:"api/web/type-aliases/PeerId",label:"PeerId"},{type:"doc",id:"api/web/type-aliases/PeerStatus",label:"PeerStatus"},{type:"doc",id:"api/web/type-aliases/PeerWithTracks",label:"PeerWithTracks"},{type:"doc",id:"api/web/type-aliases/PersistLastDeviceHandlers",label:"PersistLastDeviceHandlers"},{type:"doc",id:"api/web/type-aliases/ReconnectConfig",label:"ReconnectConfig"},{type:"doc",id:"api/web/type-aliases/ReconnectionStatus",label:"ReconnectionStatus"},{type:"doc",id:"api/web/type-aliases/RemoteTrack",label:"RemoteTrack"},{type:"doc",id:"api/web/type-aliases/RoomType",label:"RoomType"},{type:"doc",id:"api/web/type-aliases/SimulcastBandwidthLimit",label:"SimulcastBandwidthLimit"},{type:"doc",id:"api/web/type-aliases/SimulcastBandwidthLimits",label:"SimulcastBandwidthLimits"},{type:"doc",id:"api/web/type-aliases/StreamConfig",label:"StreamConfig"},{type:"doc",id:"api/web/type-aliases/Track",label:"Track"},{type:"doc",id:"api/web/type-aliases/TrackBandwidthLimit",label:"TrackBandwidthLimit"},{type:"doc",id:"api/web/type-aliases/TrackId",label:"TrackId"},{type:"doc",id:"api/web/type-aliases/TrackMiddleware",label:"TrackMiddleware"},{type:"doc",id:"api/web/type-aliases/TracksMiddleware",label:"TracksMiddleware"},{type:"doc",id:"api/web/type-aliases/TracksMiddlewareResult",label:"TracksMiddlewareResult"},{type:"doc",id:"api/web/type-aliases/UseDataChannelResult",label:"UseDataChannelResult"},{type:"doc",id:"api/web/type-aliases/UseInitializeDevicesParams",label:"UseInitializeDevicesParams"},{type:"doc",id:"api/web/type-aliases/UseSandboxProps",label:"UseSandboxProps"},{type:"doc",id:"api/web/variables/SimulcastConfig",label:"SimulcastConfig"}]}]};
+module.exports = typedocSidebar.items;
\ No newline at end of file
diff --git a/versioned_docs/version-0.23.0/api/web/variables/SimulcastConfig.md b/versioned_docs/version-0.26.0/api/web/variables/SimulcastConfig.md
similarity index 74%
rename from versioned_docs/version-0.23.0/api/web/variables/SimulcastConfig.md
rename to versioned_docs/version-0.26.0/api/web/variables/SimulcastConfig.md
index dbda5151..e8dbd27d 100644
--- a/versioned_docs/version-0.23.0/api/web/variables/SimulcastConfig.md
+++ b/versioned_docs/version-0.26.0/api/web/variables/SimulcastConfig.md
@@ -2,4 +2,4 @@
> **SimulcastConfig**: `MessageFns`\<[`SimulcastConfig`](../interfaces/SimulcastConfig.md)\>
-Defined in: ts-client/dist/index.d.mts:158
+Defined in: ts-client/dist/index.d.mts:197
diff --git a/versioned_docs/version-0.26.0/examples/_category_.json b/versioned_docs/version-0.26.0/examples/_category_.json
new file mode 100644
index 00000000..085a6d37
--- /dev/null
+++ b/versioned_docs/version-0.26.0/examples/_category_.json
@@ -0,0 +1,10 @@
+{
+ "label": "Examples",
+ "position": 6,
+ "link": {
+ "type": "generated-index",
+ "title": "Examples",
+ "description": "Real-world code examples and use cases.",
+ "slug": "/examples"
+ }
+}
diff --git a/versioned_docs/version-0.26.0/examples/react-native.mdx b/versioned_docs/version-0.26.0/examples/react-native.mdx
new file mode 100644
index 00000000..fd2bec5a
--- /dev/null
+++ b/versioned_docs/version-0.26.0/examples/react-native.mdx
@@ -0,0 +1,181 @@
+---
+type: explanation
+sidebar_position: 0
+---
+
+# React Native Examples
+
+_Runnable reference apps demonstrating common Fishjam use cases in React Native_
+
+Each example is a standalone Expo application you can run locally and use as a starting point for your own project.
+All examples use `@fishjam-cloud/react-native-client` and require a Fishjam ID from the [Fishjam Dashboard](https://fishjam.io/app).
+
+| Example | What it demonstrates |
+| ----------------------------------------- | --------------------------------------------------------------------- |
+| [Minimal Video Room](#minimal-video-room) | Simplest possible video call — the baseline for all other examples |
+| [Fishjam Chat](#fishjam-chat) | Full-featured video conferencing and livestreaming app with simulcast |
+| [Background Blur](#background-blur) | Applying real-time video effects via camera track middleware |
+| [Text Chat](#text-chat) | Peer-to-peer text messaging with WebRTC data channels |
+| [Video Player](#video-player) | Livestream broadcaster and viewer with separate UI modes |
+
+---
+
+## Minimal Video Room
+
+The simplest way to get video calling working — joining a room, displaying your own camera feed, and showing remote participants. Start here if you're new to Fishjam.
+
+**Demonstrates:**
+
+- Wrapping your app in `FishjamProvider`
+- Connecting to a room with `useConnection`
+- Accessing local and remote peers with `usePeers`
+- Rendering video streams with `RTCView`
+
+### Running the example
+
+```bash
+cd minimal-react-native
+yarn install
+npx expo prebuild
+npx expo run:android # or run:ios
+```
+
+:::important
+This won't work on the iOS Simulator — the Simulator can't access the camera. Test on a real device.
+:::
+
+The room screen uses `usePeers` to retrieve all participants and renders their camera streams in a two-column grid with `RTCView`.
+
+Browse the full source: [minimal-react-native on GitHub](https://github.com/fishjam-cloud/examples/tree/main/mobile-react-native/minimal-react-native)
+
+---
+
+## Fishjam Chat
+
+A full-featured application covering two distinct room types: a video conferencing room (conference call with multiple participants) and a livestream room (one broadcaster, many viewers). It is the most complete example and the best reference for production-like architecture.
+
+**Demonstrates:**
+
+- Tab-based navigation between VideoRoom and Livestream features
+- Pre-call room preview before joining
+- Environment switching between staging and production
+- Screen sharing from a livestream broadcaster
+- Permission handling with a reusable `useMediaPermissions` hook
+- Selecting received video quality with simulcast (`setReceivedQuality`)
+
+### Running the example
+
+```bash
+cd fishjam-chat
+yarn install
+npx expo prebuild
+npx expo run:android # or run:ios
+```
+
+:::important
+Before prebuilding, replace the bundle identifier `io.fishjam.example.fishjamchat` with your own in `app.json` (both the Android package name and iOS bundle identifier fields).
+:::
+
+The app uses Expo Router with a bottom tab navigator. Each tab handles its own connection flow independently using `useConnection`.
+
+Browse the full source: [fishjam-chat on GitHub](https://github.com/fishjam-cloud/examples/tree/main/mobile-react-native/fishjam-chat)
+
+---
+
+## Background Blur
+
+Demonstrates how to apply real-time background blur to a local camera feed using camera track middleware. Blur can be toggled on and off during an active call without reconnecting.
+
+**Demonstrates:**
+
+- Installing and using `@fishjam-cloud/react-native-webrtc-background-blur`
+- Applying a video effect with `setCameraTrackMiddleware`
+- Removing an effect by passing `null` to `setCameraTrackMiddleware`
+
+### Running the example
+
+Install the additional blur package first:
+
+```bash npm2yarn
+npm install @fishjam-cloud/react-native-webrtc-background-blur
+```
+
+```bash
+cd blur-example
+yarn install
+npx expo prebuild
+npx expo run:android # or run:ios
+```
+
+:::info
+Blur applies only to the local camera feed sent to other participants. Remote participants' video is unaffected.
+:::
+
+The blur hook from `useBackgroundBlur` provides a `middleware` function that is passed directly to `setCameraTrackMiddleware`. Passing `null` disables the effect.
+
+Browse the full source: [blur-example on GitHub](https://github.com/fishjam-cloud/examples/tree/main/mobile-react-native/blur-example)
+
+---
+
+## Text Chat
+
+Demonstrates peer-to-peer text messaging over WebRTC data channels — no separate messaging server required. Messages are sent directly between peers inside the Fishjam room.
+
+**Demonstrates:**
+
+- Initializing a data channel with `useDataChannel`
+- Publishing messages with `publishData`
+- Receiving incoming messages via the `onDataReceived` callback
+- Encoding and decoding message payloads with JSON
+
+### Running the example
+
+```bash
+cd text-chat
+yarn install
+npx expo prebuild
+npx expo run:android # or run:ios
+```
+
+:::info
+Data channels use `reliable` mode by default, which guarantees message delivery and ordering — similar to TCP.
+:::
+
+Messages are `Uint8Array` payloads encoded and decoded with JSON and `TextEncoder`/`TextDecoder`. The `useDataChannel` hook wires together `publishData` for sending and `onDataReceived` for receiving.
+
+Browse the full source: [text-chat on GitHub](https://github.com/fishjam-cloud/examples/tree/main/mobile-react-native/text-chat)
+
+---
+
+## Video Player
+
+A focused livestreaming example with two separate modes: a streamer who broadcasts video and audio, and a viewer who watches the stream. Unlike Fishjam Chat, this example uses a single `App.tsx` entry point with a simple role selector screen.
+
+**Demonstrates:**
+
+- Broadcasting with `useLivestreamStreamer`
+- Watching a stream with `useLivestreamViewer`
+- Initializing camera and microphone with `useInitializeDevices`
+- Toggling camera and microphone tracks during an active stream
+
+### Running the example
+
+```bash
+cd video-player
+yarn install
+npx expo prebuild
+npx expo run:android # or run:ios
+```
+
+The streamer side uses `useLivestreamStreamer` and `useInitializeDevices` to start broadcasting, while the viewer side uses `useLivestreamViewer` to connect and render the incoming stream with `RTCView`.
+
+Browse the full source: [video-player on GitHub](https://github.com/fishjam-cloud/examples/tree/main/mobile-react-native/video-player)
+
+---
+
+## Next steps
+
+- Follow the [React Native Quick Start](../tutorials/react-native-quick-start) if you haven't set up a project yet
+- Learn how to [handle screen sharing](../how-to/client/screensharing)
+- Learn how to [implement background streaming](../how-to/client/background-streaming)
+- Learn how to [work with data channels](../how-to/client/text-chat)
diff --git a/versioned_docs/version-0.26.0/examples/react.mdx b/versioned_docs/version-0.26.0/examples/react.mdx
new file mode 100644
index 00000000..66d8e3c5
--- /dev/null
+++ b/versioned_docs/version-0.26.0/examples/react.mdx
@@ -0,0 +1,193 @@
+---
+type: explanation
+sidebar_position: 1
+---
+
+# React Examples
+
+_Runnable reference apps demonstrating common Fishjam use cases in React_
+
+Each example is a standalone React application you can run locally and use as a starting point for your own project.
+All examples use `@fishjam-cloud/react-client` and require a Fishjam ID from the [Fishjam Dashboard](https://fishjam.io/app).
+
+| Example | What it demonstrates |
+| ----------------------------------- | ----------------------------------------------------------------------- |
+| [Minimal React](#minimal-react) | Simplest video call — join a room, camera, mic, screen share, simulcast |
+| [Audio Only](#audio-only) | Voice chat with no video and microphone device selection |
+| [Text Chat](#text-chat) | Peer-to-peer messaging over WebRTC data channels |
+| [Livestreaming](#livestreaming) | One broadcaster, many viewers with separate streamer/viewer UIs |
+| [Minimal Smelter](#minimal-smelter) | Custom video overlays using the Smelter rendering engine |
+| [Fishjam Chat](#fishjam-chat) | Full-featured conferencing app with background blur and screen sharing |
+
+---
+
+## Minimal React
+
+The simplest way to get a video call working in the browser — joining a room, displaying your own camera feed, and showing remote participants. Start here if you're new to Fishjam on the web.
+
+**Demonstrates:**
+
+- Wrapping your app in `FishjamProvider`
+- Connecting to a room with `useConnection`
+- Accessing local and remote peers with `usePeers`
+- Enabling camera and microphone with `useCamera` and `useMicrophone`
+- Starting screen sharing with `useScreenShare`
+- Rendering streams with `VideoPlayer` and `AudioPlayer` components
+- Selecting received video quality with simulcast (`setReceivedQuality`)
+
+### Running the example
+
+```bash
+cd minimal-react
+yarn install
+yarn dev
+```
+
+The room component uses `usePeers` to retrieve all participants and renders their video streams using `VideoPlayer` and audio with `AudioPlayer`.
+
+:::note
+This example requires a **peer token** to connect. You need to obtain one yourself — either via the [Sandbox API](../how-to/backend/sandbox-api-testing#step-2-create-a-room-and-get-peer-tokens) for quick testing, or by setting up your own backend with the [Fishjam Server SDK](../tutorials/backend-quick-start).
+:::
+
+Browse the full source: [minimal-react on GitHub](https://github.com/fishjam-cloud/examples/tree/main/web-react/minimal-react)
+
+---
+
+## Audio Only
+
+A voice-only room with no video — demonstrates how to initialize Fishjam with audio exclusively and let users pick their microphone device before joining.
+
+**Demonstrates:**
+
+- Audio-only initialization with `useInitializeDevices` (`enableVideo: false`)
+- Microphone device selection from available inputs
+- Rendering a peer list with audio playback via `AudioPlayer`
+
+### Running the example
+
+```bash
+cd audio-only
+yarn install
+yarn dev
+```
+
+Setting `enableVideo: false` in `useInitializeDevices` skips camera initialization entirely, keeping the session lightweight for voice-only use cases.
+
+Browse the full source: [audio-only on GitHub](https://github.com/fishjam-cloud/examples/tree/main/web-react/audio-only)
+
+---
+
+## Text Chat
+
+Demonstrates peer-to-peer text messaging over WebRTC data channels — no separate messaging server required. Messages are sent directly between peers inside the Fishjam room.
+
+**Demonstrates:**
+
+- Initializing a data channel with `useDataChannel`
+- Publishing messages with `publishData`
+- Receiving incoming messages with `subscribeData`
+- Encoding and decoding message payloads with `TextEncoder` and `TextDecoder`
+
+### Running the example
+
+```bash
+cd text-chat
+yarn install
+yarn dev
+```
+
+Messages are `Uint8Array` payloads encoded and decoded with JSON and `TextEncoder`/`TextDecoder`. The `useDataChannel` hook wires together `publishData` for sending and `subscribeData` for receiving.
+
+Browse the full source: [text-chat on GitHub](https://github.com/fishjam-cloud/examples/tree/main/web-react/text-chat)
+
+---
+
+## Livestreaming
+
+A focused livestreaming example with two separate modes: a streamer who broadcasts video and audio, and a viewer who watches the stream. Token management is handled via the `useSandbox` hook.
+
+**Demonstrates:**
+
+- Broadcasting with `useLivestreamStreamer`
+- Watching a stream with `useLivestreamViewer`
+- Separate broadcaster and viewer UIs within one application
+- Obtaining peer tokens with `useSandbox`
+
+### Running the example
+
+```bash
+cd livestreaming
+yarn install
+yarn dev
+```
+
+The streamer side uses `useLivestreamStreamer` to publish camera and audio tracks, while the viewer side uses `useLivestreamViewer` to connect and render the incoming stream.
+
+Browse the full source: [livestreaming on GitHub](https://github.com/fishjam-cloud/examples/tree/main/web-react/livestreaming)
+
+---
+
+## Minimal Smelter
+
+Shows how to apply custom video overlays to a camera feed using the Smelter rendering engine — a text label composited directly onto the outgoing video stream.
+
+**Demonstrates:**
+
+- Creating a custom video source with `useCustomSource`
+- Initializing the Smelter engine with `useSmelter`
+- Registering inputs and outputs with `registerInput`/`registerOutput`
+- Compositing a text overlay on top of a live camera feed
+
+### Running the example
+
+```bash
+cd minimal-smelter
+yarn install
+yarn dev
+```
+
+:::important
+Smelter requires WebAssembly support — use a modern browser.
+:::
+
+The `useSmelter` hook manages the Smelter engine lifecycle. `registerInput` connects the local camera feed and `registerOutput` routes the composited result back into Fishjam as a custom track.
+
+:::note
+This example requires a **peer token** to connect. You need to obtain one yourself — either via the [Sandbox API](../how-to/backend/sandbox-api-testing#step-2-create-a-room-and-get-peer-tokens) for quick testing, or by setting up your own backend with the [Fishjam Server SDK](../tutorials/backend-quick-start).
+:::
+
+Browse the full source: [minimal-smelter on GitHub](https://github.com/fishjam-cloud/examples/tree/main/web-react/minimal-smelter)
+
+---
+
+## Fishjam Chat
+
+A full-featured conferencing application covering camera, microphone, screen sharing, background blur via a camera track middleware, and a settings panel for device selection.
+
+**Demonstrates:**
+
+- Connecting to a room with `useConnection`
+- Managing camera and microphone with `useCamera` and `useMicrophone`
+- Screen sharing with `useScreenShare`
+- Applying real-time background blur using a MediaPipe camera track middleware
+- Device selection in a settings panel
+
+### Running the example
+
+```bash
+cd fishjam-chat
+yarn install
+yarn dev
+```
+
+Background blur is applied as a camera track middleware that processes each video frame with MediaPipe before the track is sent to other participants. Removing the middleware disables the effect without reconnecting.
+
+Browse the full source: [fishjam-chat on GitHub](https://github.com/fishjam-cloud/examples/tree/main/web-react/fishjam-chat)
+
+---
+
+## Next steps
+
+- Follow the [React Quick Start](../tutorials/react-quick-start) if you haven't set up a project yet
+- Learn how to [work with data channels](../how-to/client/text-chat)
+- Learn how to [implement screen sharing](../how-to/client/screensharing)
diff --git a/versioned_docs/version-0.23.0/explanation/_category_.json b/versioned_docs/version-0.26.0/explanation/_category_.json
similarity index 77%
rename from versioned_docs/version-0.23.0/explanation/_category_.json
rename to versioned_docs/version-0.26.0/explanation/_category_.json
index d34d9b78..bf1eb1f9 100644
--- a/versioned_docs/version-0.23.0/explanation/_category_.json
+++ b/versioned_docs/version-0.26.0/explanation/_category_.json
@@ -1,9 +1,9 @@
{
- "label": "Explanation",
- "position": 4,
+ "label": "Concepts",
+ "position": 5,
"link": {
"type": "generated-index",
- "title": "Explanation",
+ "title": "Concepts",
"description": "Big-picture explanations of higher-level Fishjam concepts. Most useful for building understanding of a particular topic.",
"slug": "/explanation"
},
diff --git a/versioned_docs/version-0.23.0/explanation/agent-internals.mdx b/versioned_docs/version-0.26.0/explanation/agent-internals.mdx
similarity index 96%
rename from versioned_docs/version-0.23.0/explanation/agent-internals.mdx
rename to versioned_docs/version-0.26.0/explanation/agent-internals.mdx
index 6c6bd3ae..9f2e49a0 100644
--- a/versioned_docs/version-0.23.0/explanation/agent-internals.mdx
+++ b/versioned_docs/version-0.26.0/explanation/agent-internals.mdx
@@ -1,7 +1,8 @@
---
type: explanation
title: Agent Internals
-sidebar_position: 5
+sidebar_position: 6
+description: Deep dive into Fishjam agent architecture, lifecycle, and how to integrate without using a server SDK.
---
import Tabs from "@theme/Tabs";
diff --git a/versioned_docs/version-0.23.0/explanation/architecture.mdx b/versioned_docs/version-0.26.0/explanation/architecture.mdx
similarity index 96%
rename from versioned_docs/version-0.23.0/explanation/architecture.mdx
rename to versioned_docs/version-0.26.0/explanation/architecture.mdx
index 7acb9338..911ea297 100644
--- a/versioned_docs/version-0.23.0/explanation/architecture.mdx
+++ b/versioned_docs/version-0.26.0/explanation/architecture.mdx
@@ -81,7 +81,7 @@ sequenceDiagram
## Next Steps
-To understand different room types in detail, see [Room Types Explained](../explanation/room-types).
+To understand different room types in detail, see [Rooms](../explanation/rooms).
To learn about security and token management, see [Security & Token Model](../explanation/security-tokens).
diff --git a/versioned_docs/version-0.26.0/explanation/data-channels.mdx b/versioned_docs/version-0.26.0/explanation/data-channels.mdx
new file mode 100644
index 00000000..5fed2f19
--- /dev/null
+++ b/versioned_docs/version-0.26.0/explanation/data-channels.mdx
@@ -0,0 +1,67 @@
+---
+type: explanation
+sidebar_position: 7
+description: Send and receive arbitrary binary data between peers using Fishjam data channels.
+---
+
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+
+# Data Channels
+
+Data channels allow you to send and receive arbitrary binary data between peers in a room. This is useful for implementing features like text chat, file sharing, game state synchronization, or real-time cursor positions.
+
+## Prerequisites
+
+Before using data channels, you must be [connected to a room](../how-to/client/connecting). Data channels only work after you have successfully joined a room.
+
+## Channel Types
+
+The SDK provides two types of data channels, each optimized for different use cases:
+
+### Reliable Channel
+
+- **Ordered delivery**: Messages arrive in the order they were sent
+- **Guaranteed delivery**: All messages will be delivered, with automatic retransmission if needed
+- **Use cases**: Chat messages, file transfers, commands, or any data that must not be lost
+
+### Lossy Channel
+
+- **Unordered delivery**: Messages may arrive out of order
+- **No retransmission**: Messages may be dropped if the network is congested
+- **Lower latency**: Faster delivery since there's no waiting for retransmissions
+- **Use cases**: Real-time cursor positions, game state updates, live sensor data, or any data where the latest value matters more than every value
+
+## Broadcast Communication
+
+Data channels work in a **broadcast fashion** - when you publish data, it is sent to all other peers in the room. Additionally:
+
+- Messages sent on the **reliable channel** are only received by peers subscribed to the **reliable channel**
+- Messages sent on the **lossy channel** are only received by peers subscribed to the **lossy channel**
+
+This separation allows you to use both channels simultaneously for different purposes without interference.
+
+## Using Data Channels
+
+Use the `useDataChannel` hook to work with data channels. The hook is available in both the web and mobile SDKs with the same API:
+
+
+
+
+Use [`useDataChannel`](../api/web/functions/useDataChannel) from `@fishjam-cloud/react-client`.
+
+
+
+
+Use [`useDataChannel`](../api/mobile/functions/useDataChannel) from `@fishjam-cloud/react-native-client`.
+
+
+
+
+The typical flow is:
+
+1. Initialize the data channel after connecting to a room
+2. Subscribe to incoming messages
+3. Publish messages to other peers
+
+For a complete step-by-step guide on implementing text chat, see [Text Chat](../how-to/client/text-chat).
diff --git a/versioned_docs/version-0.23.0/explanation/glossary.md b/versioned_docs/version-0.26.0/explanation/glossary.md
similarity index 93%
rename from versioned_docs/version-0.23.0/explanation/glossary.md
rename to versioned_docs/version-0.26.0/explanation/glossary.md
index 73539dc5..8a91d981 100644
--- a/versioned_docs/version-0.23.0/explanation/glossary.md
+++ b/versioned_docs/version-0.26.0/explanation/glossary.md
@@ -36,4 +36,4 @@ The ID of your Fishjam instance. It is used by your backend server to add peers
### Sandbox API
-A simple testing API allowing you to test Fishjam features without requiring you to add any functionalities to your backend. As the name suggests, it's available **only** in the Sandbox environment. You can find more details [here](/how-to/features/sandbox-api-testing).
+A simple testing API allowing you to test Fishjam features without requiring you to add any functionalities to your backend. As the name suggests, it's available **only** in the Sandbox environment. You can find more details [here](/how-to/backend/sandbox-api-testing).
diff --git a/versioned_docs/version-0.23.0/explanation/public-livestreams.mdx b/versioned_docs/version-0.26.0/explanation/livestreams.mdx
similarity index 86%
rename from versioned_docs/version-0.23.0/explanation/public-livestreams.mdx
rename to versioned_docs/version-0.26.0/explanation/livestreams.mdx
index bb990e11..d0f7c5d9 100644
--- a/versioned_docs/version-0.23.0/explanation/public-livestreams.mdx
+++ b/versioned_docs/version-0.26.0/explanation/livestreams.mdx
@@ -1,13 +1,14 @@
---
type: explanation
-title: Private vs Public Livestreams
-sidebar_position: 6
+title: Livestreams
+sidebar_position: 4
+description: Understand the difference between private and public livestreams in Fishjam and how to configure them.
---
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
-# Private vs Public Livestreams
+# Livestreams
:::info
This explanation only applies to Fishjam rooms with type `livestream`.
@@ -108,7 +109,7 @@ Note that for development purposes, you can [use the Sandbox API to generate a v
### Connecting to a private room
-Once you've created a viewer token, you can connect to a room using the Fishjam client SDKs (examples below), or alternatively you can use [WHEP](../how-to/features/whip-whep#private-livestreams).
+Once you've created a viewer token, you can connect to a room using the Fishjam client SDKs (examples below), or alternatively you can use [WHEP](../how-to/backend/whip-whep#private-livestreams).
@@ -139,21 +140,17 @@ Once you've created a viewer token, you can connect to a room using the Fishjam
const viewerToken = '';
// ---cut---
- import {
- LivestreamViewer,
- useLivestreamViewer,
- } from '@fishjam-cloud/react-native-client/livestream';
+ import { useLivestreamViewer, RTCView } from '@fishjam-cloud/react-native-client';
- // ...
-
- const { connect, whepClientRef } = useLivestreamViewer();
+ // Inside your component:
+ const { connect, stream } = useLivestreamViewer();
// ...
await connect({ token: viewerToken });
- // Use `LivestreamViewer` to render the stream
-
+ // Render the stream
+ {stream && }
```
@@ -172,7 +169,7 @@ Such an application will benefit from the token-based authorization in [private
### Connecting to a public room
-Once you've created a room of type `livestream` with the `public` flag enabled, you may start connecting viewers to the stream via the Fishjam client SDKs or [WHEP](../how-to/features/whip-whep#public-livestreams).
+Once you've created a room of type `livestream` with the `public` flag enabled, you may start connecting viewers to the stream via the Fishjam client SDKs or [WHEP](../how-to/backend/whip-whep#public-livestreams).
@@ -203,21 +200,17 @@ Once you've created a room of type `livestream` with the `public` flag enabled,
const roomId = '';
// ---cut---
- import {
- LivestreamViewer,
- useLivestreamViewer,
- } from '@fishjam-cloud/react-native-client/livestream';
+ import { useLivestreamViewer, RTCView } from '@fishjam-cloud/react-native-client';
- // ...
-
- const { connect, whepClientRef } = useLivestreamViewer();
+ // Inside your component:
+ const { connect, stream } = useLivestreamViewer();
// ...
await connect({ streamId: roomId });
- // Use `LivestreamViewer` to render the stream
-
+ // Render the stream
+ {stream && }
```
diff --git a/versioned_docs/version-0.23.0/explanation/room-types.mdx b/versioned_docs/version-0.26.0/explanation/rooms.mdx
similarity index 83%
rename from versioned_docs/version-0.23.0/explanation/room-types.mdx
rename to versioned_docs/version-0.26.0/explanation/rooms.mdx
index 2257dd72..128f0432 100644
--- a/versioned_docs/version-0.23.0/explanation/room-types.mdx
+++ b/versioned_docs/version-0.26.0/explanation/rooms.mdx
@@ -3,7 +3,7 @@ type: explanation
sidebar_position: 3
---
-# Room Types Explained
+# Rooms
_Understanding different types of rooms and when to use them_
@@ -112,12 +112,25 @@ Livestream rooms are **20% cheaper** than conference rooms for equivalent usage.
| Sport streaming | Livestream | Highly scalable and cheaper than conference |
| Interactive workshop | Conference | Multiple video sources |
+## Video Codecs
+
+Fishjam supports the following video codecs:
+
+- **H.264** — A hardware-accelerated codec offering superior performance. Used by default. Its availability varies by device, and it may not perform optimally at lower bitrates.
+- **VP8** — A software-based codec supported across all devices, ensuring maximum compatibility. Ideal for environments lacking hardware acceleration, such as Android emulators.
+
+Fishjam uses H.264 by default, however, to solve an issue with Android emulators, VP8 is set when you're using the Sandbox API.
+
+You can override the default codec by setting the `codec` parameter when [creating a room](../api/server/interfaces/RoomConfig#videocodec) using server SDKs.
+
+We recommend using H.264 for production and VP8 for development as it works with Android emulators.
+
## Next Steps
To understand how to use each room type:
- [How to implement livestreaming](../tutorials/livestreaming)
-- [How to create audio-only calls](../how-to/features/audio-only-calls)
+- [How to create audio-only calls](../how-to/backend/audio-only-calls)
To learn about the underlying architecture:
diff --git a/versioned_docs/version-0.23.0/explanation/sandbox-api-concept.mdx b/versioned_docs/version-0.26.0/explanation/sandbox-api-concept.mdx
similarity index 88%
rename from versioned_docs/version-0.23.0/explanation/sandbox-api-concept.mdx
rename to versioned_docs/version-0.26.0/explanation/sandbox-api-concept.mdx
index 460afcfe..bd15f1b2 100644
--- a/versioned_docs/version-0.23.0/explanation/sandbox-api-concept.mdx
+++ b/versioned_docs/version-0.26.0/explanation/sandbox-api-concept.mdx
@@ -1,6 +1,7 @@
---
type: explanation
sidebar_position: 1
+description: A development tool that provides a simple backend for testing Fishjam without building your own server.
---
# What is the Sandbox API?
@@ -35,10 +36,7 @@ The Sandbox API mitigates this issue and allows you to start frontend developmen
The Sandbox API is essentially a simplified application built using the Fishjam Server SDKs:
```typescript
-import {
- FishjamClient,
- RoomConfigRoomTypeEnum,
-} from "@fishjam-cloud/js-server-sdk";
+import { FishjamClient, RoomType } from "@fishjam-cloud/js-server-sdk";
import express from "express";
const fishjamId = "";
const managementToken = "";
@@ -53,7 +51,7 @@ app.get("/", async (req: express.Request, res: express.Response) => {
// Create or get room
const room = await fishjamClient.createRoom({
- roomType: roomType as RoomConfigRoomTypeEnum,
+ roomType: roomType as RoomType,
});
// Create or get peer
@@ -69,7 +67,7 @@ This shows you exactly what your production backend needs to do, just with prope
To understand how to use The Sandbox API for development:
-- [How to use The Sandbox API for testing](../how-to/features/sandbox-api-testing)
+- [How to use The Sandbox API for testing](../how-to/backend/sandbox-api-testing)
To learn about building your own backend:
diff --git a/versioned_docs/version-0.23.0/explanation/security-tokens.mdx b/versioned_docs/version-0.26.0/explanation/security-tokens.mdx
similarity index 99%
rename from versioned_docs/version-0.23.0/explanation/security-tokens.mdx
rename to versioned_docs/version-0.26.0/explanation/security-tokens.mdx
index 27aaf541..e0b249bc 100644
--- a/versioned_docs/version-0.23.0/explanation/security-tokens.mdx
+++ b/versioned_docs/version-0.26.0/explanation/security-tokens.mdx
@@ -1,6 +1,6 @@
---
type: explanation
-sidebar_position: 4
+sidebar_position: 5
---
# Security & Token Model
diff --git a/versioned_docs/version-0.26.0/explanation/simulcast.mdx b/versioned_docs/version-0.26.0/explanation/simulcast.mdx
new file mode 100644
index 00000000..5cd91431
--- /dev/null
+++ b/versioned_docs/version-0.26.0/explanation/simulcast.mdx
@@ -0,0 +1,83 @@
+---
+type: explanation
+sidebar_position: 8
+description: How simulcast enables adaptive video quality by sending multiple resolution variants simultaneously.
+---
+
+# Simulcast
+
+_Multi-quality video streaming for adaptive bandwidth and layout-aware rendering_
+
+Simulcast allows a video sender to encode and transmit the same video at multiple quality levels (variants) simultaneously. Each receiver independently chooses which variant to receive, enabling adaptive quality based on network conditions, UI layout, or user preference.
+
+## Why Simulcast?
+
+Without simulcast, every receiver gets the same video quality. This creates a trade-off: receive high quality (wastes bandwidth for small thumbnails) or receive low quality (degrades the experience for full-screen viewers).
+
+Simulcast solves this on the receiver side -- a sender publishes multiple variants, and each receiver requests only the quality it needs. The trade-off is increased upload bandwidth on the sender, since it encodes and transmits multiple variants simultaneously. If this overhead is not acceptable, the sender can [choose which variants to publish](#sender-configuration) or disable simulcast entirely.
+
+- A **thumbnail grid** can request low quality for all participants
+- A **spotlight view** can request high quality for the active speaker and low for everyone else
+- A participant on a **slow connection** can request medium quality regardless of UI layout
+
+## Quality Variants
+
+Three predefined quality tiers are available via the `Variant` enum:
+
+| Variant | Meaning |
+| ------------------------ | --------------------------- |
+| `Variant.VARIANT_LOW` | Low quality / resolution |
+| `Variant.VARIANT_MEDIUM` | Medium quality / resolution |
+| `Variant.VARIANT_HIGH` | High quality / resolution |
+
+## How It Works
+
+```mermaid
+sequenceDiagram
+ participant Sender
+ participant Server as Fishjam Server
+ participant ReceiverA as Receiver A (thumbnail)
+ participant ReceiverB as Receiver B (full-screen)
+
+ Sender->>Server: Video (LOW + MEDIUM + HIGH)
+ ReceiverA->>Server: setReceivedQuality(LOW)
+ Server->>ReceiverA: Forwards LOW variant
+ ReceiverB->>Server: setReceivedQuality(HIGH)
+ Server->>ReceiverB: Forwards HIGH variant
+```
+
+1. The **sender** encodes the camera feed into up to three variants and sends all of them to the Fishjam server.
+2. The **server** receives all variants but only forwards the one each receiver has requested.
+3. Each **receiver** calls `setReceivedQuality` on a remote track to tell the server which variant it wants. The receiver can change this at any time.
+
+## Sender Configuration
+
+The sender controls which variants to publish via the `sentQualities` option in `FishjamProvider`'s `videoConfig`:
+
+- **All variants** (default): Omit `sentQualities` or pass `[Variant.VARIANT_LOW, Variant.VARIANT_MEDIUM, Variant.VARIANT_HIGH]`
+- **Subset**: Pass only the variants you need, e.g. `[Variant.VARIANT_LOW, Variant.VARIANT_HIGH]`
+- **Disabled**: Pass `false` to send a single quality stream (no simulcast)
+
+## Receiver Quality Selection
+
+Remote tracks expose a `setReceivedQuality` method. This is only available on **remote** peer tracks. Your own local tracks don't have it, since you don't "receive" your own video.
+
+The `RemoteTrack` type (exported from both `@fishjam-cloud/react-client` and `@fishjam-cloud/react-native-client`) extends the base `Track` type with a `setReceivedQuality(quality: Variant)` method.
+
+When you call `setReceivedQuality`, the server switches which variant it forwards for that track. The change takes effect almost immediately.
+
+## When to Use Simulcast
+
+Simulcast is most valuable when:
+
+- Your app has **multiple layout modes** (grid, spotlight, picture-in-picture)
+- Participants have **varying network conditions**
+- You want to **reduce bandwidth** for participants viewing many small thumbnails
+- You're building **adaptive quality** that responds to UI state
+
+For simple 1:1 calls where both sides always show full-screen video, simulcast adds encoding overhead without much benefit. Consider disabling it with `sentQualities: false`.
+
+## See also
+
+- [Simulcast how-to guide](../how-to/client/simulcast): step-by-step implementation
+- [Architecture](./architecture): how Fishjam routes media
diff --git a/versioned_docs/version-0.23.0/explanation/what-is-fishjam.mdx b/versioned_docs/version-0.26.0/explanation/what-is-fishjam.mdx
similarity index 98%
rename from versioned_docs/version-0.23.0/explanation/what-is-fishjam.mdx
rename to versioned_docs/version-0.26.0/explanation/what-is-fishjam.mdx
index a2e80309..4567811d 100644
--- a/versioned_docs/version-0.23.0/explanation/what-is-fishjam.mdx
+++ b/versioned_docs/version-0.26.0/explanation/what-is-fishjam.mdx
@@ -58,7 +58,7 @@ Create voice-only experiences like audio conferencing, podcasts, or voice chat a
To understand how Fishjam works technically, see [Fishjam Architecture](../explanation/architecture).
-To learn about the different types of rooms available, see [Room Types Explained](../explanation/room-types).
+To learn about the different types of rooms available, see [Rooms](../explanation/rooms).
Ready to start building? Check out our tutorials:
diff --git a/versioned_docs/version-0.23.0/how-to/_category_.json b/versioned_docs/version-0.26.0/how-to/_category_.json
similarity index 100%
rename from versioned_docs/version-0.23.0/how-to/_category_.json
rename to versioned_docs/version-0.26.0/how-to/_category_.json
diff --git a/versioned_docs/version-0.23.0/how-to/_common/metadata/header.mdx b/versioned_docs/version-0.26.0/how-to/_common/metadata/header.mdx
similarity index 100%
rename from versioned_docs/version-0.23.0/how-to/_common/metadata/header.mdx
rename to versioned_docs/version-0.26.0/how-to/_common/metadata/header.mdx
diff --git a/versioned_docs/version-0.23.0/how-to/_common/metadata/joining_room.mdx b/versioned_docs/version-0.26.0/how-to/_common/metadata/joining_room.mdx
similarity index 100%
rename from versioned_docs/version-0.23.0/how-to/_common/metadata/joining_room.mdx
rename to versioned_docs/version-0.26.0/how-to/_common/metadata/joining_room.mdx
diff --git a/versioned_docs/version-0.23.0/how-to/_common/metadata/reading.mdx b/versioned_docs/version-0.26.0/how-to/_common/metadata/reading.mdx
similarity index 100%
rename from versioned_docs/version-0.23.0/how-to/_common/metadata/reading.mdx
rename to versioned_docs/version-0.26.0/how-to/_common/metadata/reading.mdx
diff --git a/versioned_docs/version-0.23.0/how-to/_common/metadata/updating.mdx b/versioned_docs/version-0.26.0/how-to/_common/metadata/updating.mdx
similarity index 100%
rename from versioned_docs/version-0.23.0/how-to/_common/metadata/updating.mdx
rename to versioned_docs/version-0.26.0/how-to/_common/metadata/updating.mdx
diff --git a/versioned_docs/version-0.23.0/how-to/backend/_category_.json b/versioned_docs/version-0.26.0/how-to/backend/_category_.json
similarity index 100%
rename from versioned_docs/version-0.23.0/how-to/backend/_category_.json
rename to versioned_docs/version-0.26.0/how-to/backend/_category_.json
diff --git a/versioned_docs/version-0.23.0/how-to/features/audio-only-calls.mdx b/versioned_docs/version-0.26.0/how-to/backend/audio-only-calls.mdx
similarity index 93%
rename from versioned_docs/version-0.23.0/how-to/features/audio-only-calls.mdx
rename to versioned_docs/version-0.26.0/how-to/backend/audio-only-calls.mdx
index 16ffab7a..46cb48f4 100644
--- a/versioned_docs/version-0.23.0/how-to/features/audio-only-calls.mdx
+++ b/versioned_docs/version-0.26.0/how-to/backend/audio-only-calls.mdx
@@ -1,5 +1,6 @@
---
-type: how-to
+sidebar_position: 6
+description: Create audio-only rooms and livestreams for voice-only use cases at a discounted cost.
---
import Tabs from "@theme/Tabs";
@@ -33,7 +34,7 @@ If the same room were audio-only, the final cost would only be $2.00.
## How Do I Use It?
-Using this feature is as easy as setting the `roomType` field when creating a room using our [Server SDKs](../../how-to/backend/server-setup).
+Using this feature is as easy as setting the `roomType` field when creating a room using our [Server SDKs](./server-setup).
:::info
Attempting to stream a video while connected to an `audio_only` or `audio_only_livestream` room will result in only the audio being sent to the other peers.
@@ -64,7 +65,7 @@ Set `roomType` to `audio_only` when creating a room:
-Now, you can connect peers normally to the room as described in our [React Native](../../how-to/react-native/connecting) and [React](../../how-to/react/connecting) docs.
+Now, you can connect peers normally to the room as described in our [Web & Mobile connecting guide](../client/connecting).
### Livestreaming
diff --git a/versioned_docs/version-0.23.0/how-to/backend/fastapi-example.mdx b/versioned_docs/version-0.26.0/how-to/backend/fastapi-example.mdx
similarity index 97%
rename from versioned_docs/version-0.23.0/how-to/backend/fastapi-example.mdx
rename to versioned_docs/version-0.26.0/how-to/backend/fastapi-example.mdx
index 3564cc26..dd886255 100644
--- a/versioned_docs/version-0.23.0/how-to/backend/fastapi-example.mdx
+++ b/versioned_docs/version-0.26.0/how-to/backend/fastapi-example.mdx
@@ -1,6 +1,7 @@
---
sidebar_position: 1
title: FastAPI
+description: Example FastAPI server integration using the Fishjam Python SDK.
---
# FastAPI example
diff --git a/versioned_docs/version-0.23.0/how-to/backend/fastify-example.mdx b/versioned_docs/version-0.26.0/how-to/backend/fastify-example.mdx
similarity index 98%
rename from versioned_docs/version-0.23.0/how-to/backend/fastify-example.mdx
rename to versioned_docs/version-0.26.0/how-to/backend/fastify-example.mdx
index 2fd837c4..5a2dc44a 100644
--- a/versioned_docs/version-0.23.0/how-to/backend/fastify-example.mdx
+++ b/versioned_docs/version-0.26.0/how-to/backend/fastify-example.mdx
@@ -1,6 +1,7 @@
---
-sidebar_position: 0
+sidebar_position: 1
title: Fastify
+description: Example Fastify server integration using the Fishjam Node.js SDK.
---
import Tabs from "@theme/Tabs";
diff --git a/versioned_docs/version-0.23.0/how-to/backend/production-deployment.mdx b/versioned_docs/version-0.26.0/how-to/backend/production-deployment.mdx
similarity index 98%
rename from versioned_docs/version-0.23.0/how-to/backend/production-deployment.mdx
rename to versioned_docs/version-0.26.0/how-to/backend/production-deployment.mdx
index 7be6b05d..04917c47 100644
--- a/versioned_docs/version-0.23.0/how-to/backend/production-deployment.mdx
+++ b/versioned_docs/version-0.26.0/how-to/backend/production-deployment.mdx
@@ -1,5 +1,6 @@
---
type: how-to
+description: Deploy your Fishjam backend safely to production, moving from sandbox to a production-ready setup.
---
import Tabs from "@theme/Tabs";
diff --git a/versioned_docs/version-0.23.0/how-to/features/sandbox-api-testing.mdx b/versioned_docs/version-0.26.0/how-to/backend/sandbox-api-testing.mdx
similarity index 95%
rename from versioned_docs/version-0.23.0/how-to/features/sandbox-api-testing.mdx
rename to versioned_docs/version-0.26.0/how-to/backend/sandbox-api-testing.mdx
index a9b5ac71..7fc7cda5 100644
--- a/versioned_docs/version-0.23.0/how-to/features/sandbox-api-testing.mdx
+++ b/versioned_docs/version-0.26.0/how-to/backend/sandbox-api-testing.mdx
@@ -1,5 +1,6 @@
---
-type: how-to
+sidebar_position: 5
+description: Use the Sandbox API to create rooms and peers for testing without setting up your own backend server.
---
import Tabs from "@theme/Tabs";
@@ -40,7 +41,8 @@ The Sandbox API is a development tool that lets you create rooms and peers for t
// ...
- const { getSandboxPeerToken } = useSandbox({ fishjamId: FISHJAM_ID });
+ // fishjamId is provided through FishjamProvider
+ const { getSandboxPeerToken } = useSandbox();
const peerToken = await getSandboxPeerToken(roomName, peerName);
```
@@ -119,7 +121,8 @@ Below are examples on how to use tokens from the Sandbox API in your frontend ap
export default function TestScreen() {
const [peerToken, setPeerToken] = useState(null);
- const { getSandboxPeerToken } = useSandbox({ fishjamId: FISHJAM_ID });
+ // fishjamId is provided through FishjamProvider
+ const { getSandboxPeerToken } = useSandbox();
useEffect(() => {
const fetchPeerToken = async () => {
@@ -317,5 +320,5 @@ Once you've tested your integration with the Sandbox API:
For production deployment:
-- [How to set up a production server](../../how-to/backend/server-setup)
+- [How to set up a production server](./server-setup)
- [How to implement proper authentication](../../explanation/security-tokens)
diff --git a/versioned_docs/version-0.23.0/how-to/features/selective-subscriptions.mdx b/versioned_docs/version-0.26.0/how-to/backend/selective-subscriptions.mdx
similarity index 98%
rename from versioned_docs/version-0.23.0/how-to/features/selective-subscriptions.mdx
rename to versioned_docs/version-0.26.0/how-to/backend/selective-subscriptions.mdx
index 22d1c7a7..7abb2ee2 100644
--- a/versioned_docs/version-0.23.0/how-to/features/selective-subscriptions.mdx
+++ b/versioned_docs/version-0.26.0/how-to/backend/selective-subscriptions.mdx
@@ -1,6 +1,7 @@
---
-type: how-to
title: Selective Subscriptions
+sidebar_position: 7
+description: Configure manual subscription mode so your backend controls which peers receive which streams.
---
import Tabs from "@theme/Tabs";
@@ -331,7 +332,7 @@ As new speakers join, simply call `subscribe_peer` again to add them to the audi
## See also
-- [Room types explained](../../explanation/room-types)
+- [Rooms](../../explanation/rooms)
- [React quick start](../../tutorials/react-quick-start)
- [React Native quick start](../../tutorials/react-native-quick-start)
diff --git a/versioned_docs/version-0.23.0/how-to/backend/server-setup.mdx b/versioned_docs/version-0.26.0/how-to/backend/server-setup.mdx
similarity index 96%
rename from versioned_docs/version-0.23.0/how-to/backend/server-setup.mdx
rename to versioned_docs/version-0.26.0/how-to/backend/server-setup.mdx
index 77a75a88..d572b336 100644
--- a/versioned_docs/version-0.23.0/how-to/backend/server-setup.mdx
+++ b/versioned_docs/version-0.26.0/how-to/backend/server-setup.mdx
@@ -1,5 +1,6 @@
---
sidebar_position: 0
+description: Install and configure a Fishjam server SDK for Node.js or Python, or integrate via the bare REST API.
---
import Tabs from "@theme/Tabs";
@@ -164,8 +165,7 @@ At any time you can terminate user's access by deleting the peer.
#### Metadata
-When creating a peer, you can also assign metadata to that peer, which can be read later with the [mobile SDK](../../how-to/react-native/metadata)
-or [web SDK](../../how-to/react/metadata). This metadata can be only set when creating the peer and can't be updated later.
+When creating a peer, you can also assign metadata to that peer, which can be read later with the [client SDK](../../how-to/client/metadata). This metadata can be only set when creating the peer and can't be updated later.
diff --git a/versioned_docs/version-0.23.0/how-to/features/whip-whep.mdx b/versioned_docs/version-0.26.0/how-to/backend/whip-whep.mdx
similarity index 95%
rename from versioned_docs/version-0.23.0/how-to/features/whip-whep.mdx
rename to versioned_docs/version-0.26.0/how-to/backend/whip-whep.mdx
index d7de8b01..8c3ef4e4 100644
--- a/versioned_docs/version-0.23.0/how-to/features/whip-whep.mdx
+++ b/versioned_docs/version-0.26.0/how-to/backend/whip-whep.mdx
@@ -1,6 +1,7 @@
---
-type: how-to
title: WHIP/WHEP with Fishjam
+sidebar_position: 8
+description: Publish and receive Fishjam livestreams directly using the WHIP and WHEP protocols.
---
import Tabs from "@theme/Tabs";
@@ -102,7 +103,7 @@ The usage of WHEP is very similar to WHIP, as you need the following:
With Fishjam, if the livestream is private, then the **token is required**.
On the other hand, if the livestream is public, then the **token is omitted**.
-[Private vs Public Livestreams](../../explanation/public-livestreams) explains private and public livestreams in more detail.
+[Livestreams](../../explanation/livestreams) explains private and public livestreams in more detail.
In this guide we demonstrate how to view each livestream type using WHEP directly.
### Private livestreams
@@ -218,11 +219,11 @@ http://fishjam.io/api/v1/live/api/whep/[ROOM-ID]
More on livestreaming:
- [Livestreaming tutorial](../../tutorials/livestreaming)
-- [Private vs Public livestreams](../../explanation/public-livestreams)
+- [Livestreams](../../explanation/livestreams)
If livestreaming doesn't fit your use case:
-- [Room types explained](../../explanation/room-types)
+- [Rooms](../../explanation/rooms)
- [Videoconferencing in React Native](../../tutorials/react-native-quick-start)
- [Videoconferencing in React](../../tutorials/react-quick-start)
-- [Audio-only calls](../../how-to/features/audio-only-calls)
+- [Audio-only calls](./audio-only-calls)
diff --git a/versioned_docs/version-0.26.0/how-to/client/_category_.json b/versioned_docs/version-0.26.0/how-to/client/_category_.json
new file mode 100644
index 00000000..ce35362b
--- /dev/null
+++ b/versioned_docs/version-0.26.0/how-to/client/_category_.json
@@ -0,0 +1,8 @@
+{
+ "label": "Web & Mobile",
+ "position": 1,
+ "link": {
+ "type": "generated-index",
+ "description": "Learn how to integrate Fishjam into your web and mobile applications."
+ }
+}
diff --git a/versioned_docs/version-0.23.0/how-to/react-native/background-streaming.mdx b/versioned_docs/version-0.26.0/how-to/client/background-streaming.mdx
similarity index 74%
rename from versioned_docs/version-0.23.0/how-to/react-native/background-streaming.mdx
rename to versioned_docs/version-0.26.0/how-to/client/background-streaming.mdx
index 9b43c516..4845d7c7 100644
--- a/versioned_docs/version-0.23.0/how-to/react-native/background-streaming.mdx
+++ b/versioned_docs/version-0.26.0/how-to/client/background-streaming.mdx
@@ -1,11 +1,18 @@
---
-sidebar_position: 6
+title: "Background calls"
+sidebar_position: 13
+sidebar_label: "Background calls 📱"
+description: Enable calls running in the background on Android and iOS in React Native applications.
---
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
-# Background calls
+# Background calls Mobile
+
+:::note
+This guide is exclusively for **Mobile** (React Native) applications.
+:::
Both Android and iOS support calls running in the background, but they use different approaches:
@@ -48,14 +55,28 @@ You need to modify `app.json` file and add our plugin:
**Android Configuration**
-You need to add the following service to `AndroidManifest.xml`:
+Add the following permissions and services to `AndroidManifest.xml`:
```xml title='AndroidManifest.xml'
...
+
+
+
+
...
-
+
+
+
```
@@ -101,12 +122,14 @@ const { isCameraOn } = useCamera();
const { isMicrophoneOn } = useMicrophone();
useForegroundService({
+ // [!code highlight]
channelId: "io.fishjam.example.fishjamchat.foregroundservice.channel",
channelName: "Fishjam Chat Notifications",
notificationTitle: "Your video call is ongoing",
notificationContent: "Tap to return to the call.",
enableCamera: isCameraOn,
enableMicrophone: isMicrophoneOn,
+ // enableScreenSharing: true,
});
```
@@ -117,7 +140,7 @@ On iOS, background calls are achieved through CallKit integration. You can use t
### Manual CallKit Management
-Use the [`useCallKit`](../../api/mobile/variables/useCallKit) hook for fine-grained control over CallKit sessions:
+Use the [`useCallKit`](../../api/mobile/functions/useCallKit) hook for fine-grained control over CallKit sessions:
```tsx
import { useCallKit } from "@fishjam-cloud/react-native-client";
@@ -142,7 +165,7 @@ const handleLeaveRoom = async () => {
### Automatic CallKit Management
-Use the [`useCallKitService`](../../api/mobile/variables/useCallKitService) hook for automatic session lifecycle management:
+Use the [`useCallKitService`](../../api/mobile/functions/useCallKitService) hook for automatic session lifecycle management:
```tsx
import React from "react";
@@ -163,7 +186,7 @@ function CallScreen({ username }: { username: string }) {
### Listening to CallKit Events
-Use the [`useCallKitEvent`](../../api/mobile/variables/useCallKitEvent) hook to respond to user interactions with the native CallKit interface:
+Use the [`useCallKitEvent`](../../api/mobile/functions/useCallKitEvent) hook to respond to user interactions with the native CallKit interface:
```tsx
import {
@@ -173,22 +196,21 @@ import {
useConnection,
} from "@fishjam-cloud/react-native-client";
-const { toggleCamera } = useCamera();
const { startMicrophone, stopMicrophone } = useMicrophone();
const { leaveRoom } = useConnection();
// Listen for mute toggle from CallKit UI
-useCallKitEvent("muted", (isMuted: boolean) => {
- if (isMuted) {
+useCallKitEvent("muted", (isMuted?: boolean) => {
+ if (isMuted === true) {
stopMicrophone();
- } else {
+ } else if (isMuted === false) {
startMicrophone();
}
});
// Listen for hold state changes
-useCallKitEvent("held", (isOnHold: boolean) => {
- console.log("Call hold state:", isOnHold);
+useCallKitEvent("held", (isHeld?: boolean) => {
+ console.log("Call hold state:", isHeld);
// Handle hold state in your app
});
diff --git a/versioned_docs/version-0.26.0/how-to/client/connecting.mdx b/versioned_docs/version-0.26.0/how-to/client/connecting.mdx
new file mode 100644
index 00000000..26c6318e
--- /dev/null
+++ b/versioned_docs/version-0.26.0/how-to/client/connecting.mdx
@@ -0,0 +1,174 @@
+---
+sidebar_position: 3
+description: Connect to a Fishjam room using a peer token and room URL obtained from your backend.
+---
+
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+
+# Connecting
+
+This article will guide you through the process of connecting to a Fishjam room.
+
+## Getting URL and token
+
+In order to connect, you need to obtain a **Peer Token** (the token that will authenticate the peer in
+your Room).
+
+
+
+
+
+Once you create your account on [Fishjam](https://fishjam.io), you will have access to the Sandbox environment as part of the Mini Jar plan.
+While using the Sandbox environment, [you can use the Sandbox API](../backend/sandbox-api-testing) to generate peer tokens for testing or development purposes.
+This is basically a service that will create a Room, add your app as
+the Room's Peer, and return the token required to use that Room.
+
+
+
+
+```ts
+import { useSandbox } from "@fishjam-cloud/react-client";
+const roomName = "room";
+const peerName = "user";
+// ---cut---
+
+// The `useSandbox` hook gets the fishjamId from FishjamProvider
+// It will work ONLY with the FISHJAM_ID of the Sandbox environment
+const { getSandboxPeerToken } = useSandbox();
+const peerToken = await getSandboxPeerToken(roomName, peerName);
+```
+
+
+
+
+```ts
+import { useSandbox } from "@fishjam-cloud/react-native-client";
+const roomName = "room";
+const peerName = "user";
+// ---cut---
+
+// The `useSandbox` hook gets the fishjamId from FishjamProvider
+// It will work ONLY with the FISHJAM_ID of the Sandbox environment
+const { getSandboxPeerToken } = useSandbox();
+const peerToken = await getSandboxPeerToken(roomName, peerName);
+```
+
+
+
+
+
+
+
+For the production app, you need to implement your own backend service that will provide the user with a **Peer Token**. To do that,
+follow our [server setup instructions](../backend/server-setup).
+
+
+
+
+## Connecting
+
+Use the [`useConnection`](../../api/web/functions/useConnection) hook to get
+the [`joinRoom`](../../api/web/functions/useConnection#joinroom) function.
+
+
+
+
+```tsx
+const PEER_TOKEN = "some-peer-token";
+// ---cut-before---
+import { useConnection, useSandbox } from "@fishjam-cloud/react-client";
+import React, { useCallback } from "react";
+
+export function JoinRoomButton() {
+ const { joinRoom } = useConnection(); // [!code highlight]
+ // get the peer token from sandbox or your backend
+ const { getSandboxPeerToken } = useSandbox();
+
+ const onJoinRoomPress = useCallback(async () => {
+ // [!code highlight:5]
+ const peerToken = await getSandboxPeerToken("Room", "User");
+ await joinRoom({ peerToken });
+ }, [joinRoom]);
+
+ return ;
+}
+```
+
+
+
+
+```tsx
+import React, { useCallback } from "react";
+import { Button } from "react-native";
+import { useConnection, useSandbox } from "@fishjam-cloud/react-native-client";
+
+export function JoinRoomButton() {
+ const { joinRoom } = useConnection(); // [!code highlight]
+ // fishjamId is provided through FishjamProvider
+ const { getSandboxPeerToken } = useSandbox();
+
+ const onPressJoin = useCallback(async () => {
+ // in production environment, get the peerToken from your backend
+ const peerToken = await getSandboxPeerToken("Room", "User");
+
+ await joinRoom({ peerToken }); // [!code highlight]
+ }, [joinRoom, getSandboxPeerToken]);
+
+ return ;
+}
+```
+
+
+
+
+## Disconnecting
+
+In order to close connection, use the [`leaveRoom`](../../api/web/functions/useConnection#leaveroom) method
+from [`useConnection`](../../api/web/functions/useConnection) hook.
+
+
+
+
+```tsx
+import { useConnection } from "@fishjam-cloud/react-client";
+import React, { useCallback } from "react";
+
+export function LeaveRoomButton() {
+ const { leaveRoom } = useConnection(); // [!code highlight]
+
+ return ;
+}
+```
+
+
+
+
+```tsx
+import React, { useCallback } from "react";
+import { Button } from "react-native";
+import { useConnection } from "@fishjam-cloud/react-native-client";
+
+export function LeaveRoomButton() {
+ const { leaveRoom } = useConnection(); // [!code highlight]
+
+ const onPressLeave = useCallback(async () => {
+ await leaveRoom(); // [!code highlight]
+ }, [leaveRoom]);
+
+ return ;
+}
+```
+
+
+
+
+## Next Steps
+
+Now that you're connected to a room, you can explore additional features:
+
+- [Start Streaming](./start-streaming) - Enable your camera and microphone
+- [List Other Peers](./list-other-peers) - Display video from other participants
+- [Data Channels](../../explanation/data-channels) - Send and receive arbitrary data between peers (e.g., text chat)
+- [Picture in Picture](./picture-in-picture) - Allow users to watch video in a floating window (Mobile)
+- [Background Calls](./background-streaming) - Keep calls active when the app is backgrounded (Mobile)
diff --git a/versioned_docs/version-0.23.0/how-to/react/custom-sources.mdx b/versioned_docs/version-0.26.0/how-to/client/custom-sources.mdx
similarity index 93%
rename from versioned_docs/version-0.23.0/how-to/react/custom-sources.mdx
rename to versioned_docs/version-0.26.0/how-to/client/custom-sources.mdx
index 14e7fde0..def2c69b 100644
--- a/versioned_docs/version-0.23.0/how-to/react/custom-sources.mdx
+++ b/versioned_docs/version-0.26.0/how-to/client/custom-sources.mdx
@@ -1,15 +1,22 @@
---
+title: "Custom sources"
sidebar_position: 8
+sidebar_label: "Custom sources 🌐"
+description: Stream non-standard video or audio sources (e.g. WebGL, WebGPU, Three.js) through Fishjam in web apps.
---
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
-# Custom sources
+# Custom sources Web
+
+:::note
+This guide is exclusively for **Web** (React) applications.
+:::
:::important
-If you only wish to send camera, microphone or screen share output through Fishjam, then you most likely should refer to the documentation in [Streaming media](../../how-to/react/start-streaming) and [Managing devices](../../how-to/react/managing-devices) instead of this page.
+If you only wish to send camera, microphone or screen share output through Fishjam, then you most likely should refer to the documentation in [Streaming media](./start-streaming) and [Managing devices](./managing-devices) instead of this page.
:::
diff --git a/versioned_docs/version-0.26.0/how-to/client/debug-logging.mdx b/versioned_docs/version-0.26.0/how-to/client/debug-logging.mdx
new file mode 100644
index 00000000..67b9667e
--- /dev/null
+++ b/versioned_docs/version-0.26.0/how-to/client/debug-logging.mdx
@@ -0,0 +1,73 @@
+---
+title: "Debug logging"
+sidebar_position: 9
+sidebar_label: "Debug logging 🌐"
+description: Enable SDK debug logging to troubleshoot connectivity and media issues in web applications.
+---
+
+# Debug logging Web
+
+:::note
+This guide is exclusively for **Web** (React) applications.
+:::
+
+The Fishjam SDK includes a built-in debugging mode to help developers troubleshoot connectivity and media issues during development. This feature controls the verbosity of the SDK's internal logging mechanisms.
+
+## Overview
+
+By default, the SDK suppresses internal logs to keep your browser console clean in production environments. Enabling `debug` mode allows the SDK to output warnings and errors to the console, prefixed with `[FISHJAM]`.
+
+## Usage
+
+To enable debugging in a React application, pass the `debug` prop to the `FishjamProvider`.
+
+```tsx
+import React from "react";
+const App = () => null;
+// ---cut---
+import { FishjamProvider } from "@fishjam-cloud/react-client";
+
+function Root() {
+ return (
+
+
+
+ );
+}
+```
+
+We recommend toggling this based on your environment variables:
+
+```tsx
+import React from "react";
+import { FishjamProvider } from "@fishjam-cloud/react-client";
+const process = {
+ env: { NODE_ENV: "development", FISHJAM_ID: "your-fishjam-id" },
+};
+const App = () => null;
+// ---cut---
+
+
+;
+```
+
+## Behavior
+
+- **Enabled (`true`):** The SDK will log internal warnings (e.g., permission errors, socket closures, signaling issues) and errors to the browser console. All logs are prefixed with `[FISHJAM]` for easy filtering.
+- **Disabled (`false` or `undefined`):** The SDK operates silently, suppressing internal `console.warn` and `console.error` calls to prevent console pollution.
+
+### Example Output
+
+When enabled, you may see logs similar to:
+
+```text
+[FISHJAM] Socket closed with reason: ...
+[FISHJAM] Couldn't get camera permission: NotAllowedError ...
+[FISHJAM] ICE connection: disconnected
+```
diff --git a/versioned_docs/version-0.26.0/how-to/client/installation.mdx b/versioned_docs/version-0.26.0/how-to/client/installation.mdx
new file mode 100644
index 00000000..6e0d597e
--- /dev/null
+++ b/versioned_docs/version-0.26.0/how-to/client/installation.mdx
@@ -0,0 +1,231 @@
+---
+sidebar_position: 1
+description: Install the Fishjam client SDK for React (web) or React Native (mobile).
+---
+
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+
+# Installation
+
+
+
+
+## 1. Install the package
+
+```bash npm2yarn
+npm install @fishjam-cloud/react-client
+```
+
+## 2. Setup Fishjam context
+
+Wrap your app in our [`FishjamProvider`](../../api/web/functions/FishjamProvider) component. Get your Fishjam ID from [Fishjam Dashboard](https://fishjam.io/app) and pass it to the provider.
+
+```tsx
+const App = () => {
+ return
Hello world
;
+};
+
+// ---cut---
+import React from "react";
+import ReactDOM from "react-dom/client";
+// import App from "./App";
+import { FishjamProvider } from "@fishjam-cloud/react-client";
+
+// Check https://fishjam.io/app/ for your Fishjam ID
+const FISHJAM_ID = "your-fishjam-id";
+
+ReactDOM.createRoot(document.getElementById("root")!).render(
+ // [!code highlight:5]
+
+
+
+
+ ,
+);
+```
+
+:::tip
+
+It's possible to have many independent Fishjam contexts in one app.
+Just render many [`FishjamProvider`](../../api/web/functions/FishjamProvider) components and make sure they don't overlap.
+
+:::
+
+
+
+
+## Optional: Create a New App
+
+
+ Follow these steps to create a new mobile app
+
+If you don't have an existing project, you can create a new Expo app using a template
+
+```bash
+npx create-expo-app@latest my-video-app
+```
+
+As the next step, you have to generate native files with the `expo prebuild` command:
+
+```bash
+npx expo prebuild
+```
+
+You can also follow more detailed [Expo instructions](https://docs.expo.dev/get-started/introduction/).
+
+
+
+## Step 1: Install the Package
+
+
+
+
+
+Install `@fishjam-cloud/react-native-client` and `react-native-get-random-values` with your preferred package manager.
+
+```bash npm2yarn
+npm install @fishjam-cloud/react-native-client react-native-get-random-values@1.11.0
+```
+
+Expo SDK 54+ resolves native dependencies recursively, so `@fishjam-cloud/react-native-webrtc` (a transitive dependency) is autolinked automatically.
+
+
+
+
+Install `@fishjam-cloud/react-native-client`, `@fishjam-cloud/react-native-webrtc`, and `react-native-get-random-values`:
+
+```bash npm2yarn
+npm install @fishjam-cloud/react-native-client @fishjam-cloud/react-native-webrtc react-native-get-random-values@1.11.0
+```
+
+Bare React Native and Expo SDK versions below 54 only autolink direct dependencies.
+`@fishjam-cloud/react-native-webrtc` must be in your app's `package.json` for its native code to be linked.
+
+
+
+
+## Step 2: Configure App Permissions
+
+Your app needs to have permissions configured in order to use the microphone and camera.
+
+### Android
+
+The following Android permissions are required by Fishjam:
+
+- `android.permission.CAMERA`
+- `android.permission.RECORD_AUDIO`
+- `android.permission.MODIFY_AUDIO_SETTINGS`
+- `android.permission.ACCESS_NETWORK_STATE`
+
+
+
+
+
+Add required permissions to the `app.json` file.
+
+```json title='app.json'
+{
+ "expo": {
+ ...
+ "android": {
+ ...
+ "permissions": [
+ "android.permission.CAMERA",
+ "android.permission.RECORD_AUDIO",
+ "android.permission.MODIFY_AUDIO_SETTINGS",
+ "android.permission.ACCESS_NETWORK_STATE"
+ ]
+ }
+ }
+}
+```
+
+
+
+
+Add required permissions to the `AndroidManifest.xml` file.
+
+```xml title='AndroidManifest.xml'
+
+ ...
+
+
+
+
+ ...
+
+```
+
+
+
+
+### iOS
+
+
+
+
+
+You don't have to make any changes to run app on iOS.
+To update default content of permission alert, you can add these settings to `app.json`:
+
+```json title='app.json'
+{
+ "expo": {
+ ...
+ "ios": {
+ ...
+ "infoPlist": {
+ "NSCameraUsageDescription": "Allow $(PRODUCT_NAME) to access your camera.",
+ "NSMicrophoneUsageDescription": "Allow $(PRODUCT_NAME) to access your microphone."
+ }
+ },
+ }
+}
+```
+
+
+
+
+Ensure `Info.plist` contains camera and microphone usage description entries:
+
+```xml title='Info.plist'
+ NSCameraUsageDescription
+ Allow $(PRODUCT_NAME) to access your camera.
+ NSMicrophoneUsageDescription
+ Allow $(PRODUCT_NAME) to access your microphone.
+```
+
+
+
+
+## Step 3: Setup Fishjam Context
+
+Wrap your app in the [`FishjamProvider`](../../api/mobile/functions/FishjamProvider) component:
+
+```tsx
+import React from "react";
+import { FishjamProvider } from "@fishjam-cloud/react-native-client";
+
+// Check https://fishjam.io/app/ for your Fishjam ID
+const FISHJAM_ID = "your-fishjam-id";
+
+export default function App() {
+ return (
+
+ {/* Your app components */}
+
+ );
+}
+```
+
+## Camera and Microphone Permissions
+
+:::info
+You don't need to explicitly request permissions — they're automatically requested when your app calls `initializeDevices()`.
+:::
+
+If you need manual control over when permissions are requested, see [Managing Permissions](./managing-devices#managing-permissions-mobile-only).
+
+
+
diff --git a/versioned_docs/version-0.26.0/how-to/client/list-other-peers.mdx b/versioned_docs/version-0.26.0/how-to/client/list-other-peers.mdx
new file mode 100644
index 00000000..8501184b
--- /dev/null
+++ b/versioned_docs/version-0.26.0/how-to/client/list-other-peers.mdx
@@ -0,0 +1,104 @@
+---
+sidebar_position: 5
+description: Access and display media tracks from other peers and the local peer using the usePeers hook.
+---
+
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+
+# Display media of other peers
+
+To access data and media of other peers, use the [`usePeers`](../../api/web/functions/usePeers) hook.
+It returns two properties, `remotePeers` and `localPeer`.
+They contain all the tracks of other peers and all the tracks of the local user, respectively.
+
+## Example of playing other peers' available media
+
+
+
+
+```tsx
+import React, { FC } from "react";
+
+const VideoRenderer: FC<{ stream?: MediaStream | null }> = (_) => ;
+
+const AudioPlayer: FC<{ stream?: MediaStream | null }> = (_) => ;
+
+// ---cut---
+import { usePeers } from "@fishjam-cloud/react-client";
+
+export function Component() {
+ const { remotePeers } = usePeers();
+
+ return (
+
+ // remember to import
+ your VideoRenderer component
+
+
+ ))}
+
+ );
+}
+```
+
+
+
+
+```tsx
+import React from "react";
+import { View, Text } from "react-native";
+import {
+ usePeers,
+ RTCView,
+ type MediaStream,
+} from "@fishjam-cloud/react-native-client";
+
+function VideoPlayer({ stream }: { stream: MediaStream | null }) {
+ if (!stream) return No video;
+ return (
+
+ );
+}
+
+export function ShowAllPeers() {
+ const { remotePeers, localPeer } = usePeers(); // [!code highlight]
+
+ return (
+
+ {/* Local camera */}
+ {localPeer?.cameraTrack?.stream && ( // [!code highlight]
+
+ )}
+
+ {/* Remote cameras */}
+ {remotePeers.map(
+ (
+ peer, // [!code highlight]
+ ) => (
+
+ {peer.cameraTrack?.stream && (
+
+ )}
+
+ ),
+ )}
+
+ );
+}
+```
+
+:::tip[Enable Picture in Picture]
+
+To allow users to continue watching video in a floating window when they background your app, use the `RTCPIPView` component. See the [Picture in Picture guide](./picture-in-picture) for more details.
+
+:::
+
+
+
diff --git a/versioned_docs/version-0.26.0/how-to/client/managing-devices.mdx b/versioned_docs/version-0.26.0/how-to/client/managing-devices.mdx
new file mode 100644
index 00000000..063b1f8d
--- /dev/null
+++ b/versioned_docs/version-0.26.0/how-to/client/managing-devices.mdx
@@ -0,0 +1,310 @@
+---
+sidebar_position: 4
+sidebar_label: "Managing devices"
+description: Select, switch, mute, and dynamically control camera and microphone devices.
+---
+
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+
+# Managing devices
+
+The Fishjam SDK provides functions for dynamically controlling media device streams. This includes selecting desired cameras and microphones, turning them on and off, as well as muting and unmuting microphones.
+
+## Selecting Camera and Microphone
+
+To select the desired camera or microphone, use the `selectCamera` and `selectMicrophone` functions.
+Lists of the available devices are available via the `cameraDevices` and `microphoneDevices` properties.
+
+
+
+
+To select the desired camera or microphone, use [`selectCamera()`](../../api/web/functions/useCamera#selectcamera) and [`selectMicrophone()`](../../api/web/functions/useMicrophone#selectmicrophone) functions.
+Lists of the available devices are available via the [`cameraDevices`](../../api/web/functions/useCamera#cameradevices) and [`microphoneDevices`](../../api/web/functions/useMicrophone#microphonedevices) properties.
+
+#### Usage Example
+
+```tsx
+import React from "react";
+import { useCamera } from "@fishjam-cloud/react-client";
+
+export function CameraControl() {
+ const { cameraDevices, selectCamera } = useCamera();
+
+ return (
+
+ {cameraDevices.map(({ deviceId, label }) => (
+
+
+
+ ))}
+
+ );
+}
+```
+
+
+
+
+To select the desired camera, use the [`selectCamera`](../../api/mobile/functions/useCamera#selectcamera) method.
+The list of the available camera devices is available via the [`cameraDevices`](../../api/mobile/functions/useCamera#cameradevices).
+
+```tsx
+import React, { useCallback, useState } from "react";
+import { Button } from "react-native";
+import { useCamera } from "@fishjam-cloud/react-native-client";
+
+export function FlipButton() {
+ const { cameraDevices, selectCamera } = useCamera(); // [!code highlight]
+ const [currentIndex, setCurrentIndex] = useState(0);
+
+ const onPressFlipCamera = useCallback(() => {
+ if (cameraDevices.length === 0) return;
+
+ // Cycle through available cameras
+ const nextIndex = (currentIndex + 1) % cameraDevices.length;
+ const nextCamera = cameraDevices[nextIndex];
+ if (nextCamera) {
+ selectCamera(nextCamera.deviceId); // [!code highlight]
+ setCurrentIndex(nextIndex);
+ }
+ }, [cameraDevices, currentIndex, selectCamera]);
+
+ return ;
+}
+```
+
+
+
+
+## Turning Camera On and Off
+
+
+
+
+Use the [`toggleCamera()`](../../api/web/functions/useCamera#togglecamera) method to control the physical operational state of the camera.
+
+- **Turning the camera off**: This action stops the camera device, disables the media stream, and pauses streaming. The webcam indicator light will shut down.
+- **Turning the camera on**: This action starts the camera and resumes streaming, allowing other participants to see video after a brief initialization period.
+
+#### Usage Example
+
+```tsx
+import React from "react";
+import { useCamera } from "@fishjam-cloud/react-client";
+
+export function CameraControl() {
+ const { toggleCamera } = useCamera();
+
+ return ;
+}
+```
+
+
+
+
+You can use [`toggleCamera`](../../api/mobile/functions/useCamera#togglecamera) to toggle the camera state, or use [`startCamera`](../../api/mobile/functions/useCamera#startcamera) and [`stopCamera`](../../api/mobile/functions/useCamera#stopcamera) for more explicit control.
+
+#### Using toggleCamera
+
+```tsx
+import { Button } from "react-native";
+import React from "react";
+import { useCamera } from "@fishjam-cloud/react-native-client";
+
+export function ToggleCameraButton() {
+ const { isCameraOn, toggleCamera } = useCamera(); // [!code highlight]
+
+ return (
+
+ );
+}
+```
+
+#### Using startCamera/stopCamera
+
+```tsx
+import { Button, View } from "react-native";
+import React from "react";
+import { useCamera } from "@fishjam-cloud/react-native-client";
+
+export function CameraControls() {
+ const { startCamera, stopCamera, isCameraOn } = useCamera();
+
+ return (
+
+
+ );
+}
+```
+
+
+
+
+## Turning Microphone On and Off
+
+
+
+
+Use the [`toggleMicrophone()`](../../api/web/functions/useMicrophone#togglemicrophone) method to toggle the microphone's physical operational state. The function interacts with a physical device, so it might take a noticeable amount of time.
+
+**Turning the microphone off**: This action turns the microphone off, disables the media stream, and pauses any audio transmission.
+
+**Turning the microphone on**: This action turns the microphone on and resumes audio streaming.
+
+
+
+
+You can use [`toggleMicrophone`](../../api/mobile/functions/useMicrophone) to toggle the microphone state, or use [`startMicrophone`](../../api/mobile/functions/useMicrophone) and [`stopMicrophone`](../../api/mobile/functions/useMicrophone) for more explicit control.
+
+#### Using toggleMicrophone
+
+```tsx
+import { Button } from "react-native";
+import React from "react";
+import { useMicrophone } from "@fishjam-cloud/react-native-client";
+
+export function ToggleMicrophoneButton() {
+ const { isMicrophoneOn, toggleMicrophone } = useMicrophone(); // [!code highlight]
+
+ return (
+
+ );
+}
+```
+
+#### Using startMicrophone/stopMicrophone
+
+```tsx
+import { Button, View } from "react-native";
+import React from "react";
+import { useMicrophone } from "@fishjam-cloud/react-native-client";
+
+export function MicrophoneControls() {
+ const { startMicrophone, stopMicrophone, isMicrophoneOn } = useMicrophone();
+
+ return (
+
+ startMicrophone()}
+ title="Start Microphone"
+ disabled={isMicrophoneOn}
+ />
+ stopMicrophone()}
+ title="Stop Microphone"
+ disabled={!isMicrophoneOn}
+ />
+
+ );
+}
+```
+
+
+
+
+## Muting and Unmuting Microphone (Web only)
+
+:::note
+This feature is only available on Web. On mobile, use `toggleMicrophone` or `stopMicrophone` to disable audio transmission.
+:::
+
+Use [`toggleMicrophoneMute()`](../../api/web/functions/useMicrophone#togglemicrophonemute) to manage the audio stream's operational status without affecting the microphone's hardware state.
+
+Muting and unmuting is faster than turning the microphone on/off, but a muted device still uses resources. This is useful, as it is common to mute and unmute during a meeting. Unmuting needs to be quick to capture the first word of a sentence.
+
+- **Muting the microphone**: This action disables the media stream and stops audio transmission while keeping the microphone active.
+- **Unmuting the microphone**: This action enables the media stream, allowing immediate transmission of sounds.
+
+#### Usage Example
+
+```tsx
+import React from "react";
+import { useMicrophone } from "@fishjam-cloud/react-client";
+
+export function MicrophoneControl() {
+ const { toggleMicrophone, toggleMicrophoneMute } = useMicrophone();
+
+ return (
+
+ );
+}
+```
+
+## Managing Permissions (Mobile only)
+
+The SDK provides built-in hooks for querying and requesting device permissions: `useCameraPermissions` and `useMicrophonePermissions` from `@fishjam-cloud/react-native-client`.
+
+Both hooks return a `[query, request]` tuple:
+
+- **`query()`** — checks the current permission status without prompting the user
+- **`request()`** — triggers the native permission dialog and returns the resulting status
+
+The returned `PermissionStatus` is one of: `'granted'`, `'denied'`, or `'prompt'`.
+
+:::info
+Requesting permissions manually is optional — `initializeDevices()` will automatically prompt for any permissions that haven't been granted yet.
+However, you must always call `initializeDevices()` to set up camera and microphone devices.
+:::
+
+#### Usage Example
+
+```tsx
+// @noErrors: 2305
+import React, { useEffect } from "react";
+import {
+ useCameraPermissions,
+ useMicrophonePermissions,
+ useInitializeDevices,
+} from "@fishjam-cloud/react-native-client";
+
+function RoomScreen() {
+ const [queryCamera, requestCamera] = useCameraPermissions(); // [!code highlight]
+ const [queryMicrophone, requestMicrophone] = useMicrophonePermissions(); // [!code highlight]
+ const { initializeDevices } = useInitializeDevices(); // [!code highlight]
+
+ useEffect(() => {
+ const setup = async () => {
+ let cam = await queryCamera();
+ let mic = await queryMicrophone();
+
+ if (cam !== "granted") cam = await requestCamera();
+ if (mic !== "granted") mic = await requestMicrophone();
+
+ if (cam === "granted" && mic === "granted") {
+ await initializeDevices(); // [!code highlight]
+ }
+ };
+ setup();
+ }, [
+ queryCamera,
+ requestCamera,
+ queryMicrophone,
+ requestMicrophone,
+ initializeDevices,
+ ]);
+}
+```
diff --git a/versioned_docs/version-0.26.0/how-to/client/metadata.mdx b/versioned_docs/version-0.26.0/how-to/client/metadata.mdx
new file mode 100644
index 00000000..a80ae16f
--- /dev/null
+++ b/versioned_docs/version-0.26.0/how-to/client/metadata.mdx
@@ -0,0 +1,211 @@
+---
+sidebar_position: 6
+title: "Metadata"
+description: "How to use metadata"
+---
+
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+
+Alongside audio and video, it is possible to send additional metadata with each peer. Metadata is just
+JSON that can contain arbitrary information. Its most common use is sending a user name associated with a peer.
+However, it can be also used to send the peer's camera type, application information etc.
+
+:::info
+
+You can also set metadata on [the server side, when adding user to the room](../backend/server-setup#metadata). This metadata is persistent throughout its lifetime and is useful for attaching information that
+can't be overwritten by the peer, like information about real user names or basic permission info.
+
+:::
+
+## Setting metadata when joining the room
+
+The `joinRoom` method from the `useConnection` hook has a `peerMetadata` parameter, that can be used for setting object metadata.
+
+
+
+
+```tsx
+const PEER_TOKEN = "some-peer-token";
+// ---cut---
+import { useConnection } from "@fishjam-cloud/react-client";
+import React, { useCallback } from "react";
+
+type PeerMetadata = {
+ displayName: string;
+};
+
+export function JoinRoomButton() {
+ const { joinRoom } = useConnection(); // [!code highlight]
+
+ const onJoinRoomPress = useCallback(async () => {
+ await joinRoom({
+ peerToken: PEER_TOKEN,
+ peerMetadata: { displayName: "John Wick" }, // [!code highlight]
+ });
+ }, [joinRoom]);
+
+ return Join room;
+}
+```
+
+
+
+
+```tsx
+const PEER_TOKEN = "some-peer-token";
+// ---cut---
+import React, { useCallback } from "react";
+import { Button } from "react-native";
+import { useConnection } from "@fishjam-cloud/react-native-client";
+
+type PeerMetadata = {
+ displayName: string;
+};
+
+export function JoinRoomButton() {
+ const { joinRoom } = useConnection();
+
+ const onPressJoin = useCallback(async () => {
+ // Note: fishjamId is passed to FishjamProvider, not joinRoom
+ await joinRoom({
+ peerToken: PEER_TOKEN,
+ peerMetadata: { displayName: "John Wick" }, // [!code highlight]
+ });
+ }, [joinRoom]);
+
+ return ;
+}
+```
+
+
+
+
+## Updating metadata during connection
+
+Once you've joined the room, you can update your peer metadata with the `updatePeerMetadata` method of the `useUpdatePeerMetadata` hook:
+
+
+
+
+```tsx
+import { useUpdatePeerMetadata } from "@fishjam-cloud/react-client";
+import React, { useCallback } from "react";
+
+type PeerMetadata = {
+ displayName: string;
+};
+
+export function JoinRoomButton() {
+ const { updatePeerMetadata } = useUpdatePeerMetadata(); // [!code highlight]
+
+ const onPressUpdateName = useCallback(async () => {
+ await updatePeerMetadata({ displayName: "Thomas A. Anderson" }); // [!code highlight]
+ }, [updatePeerMetadata]);
+
+ return Change name;
+}
+```
+
+
+
+
+```tsx
+import React, { useCallback } from "react";
+import { Button } from "react-native";
+import { useUpdatePeerMetadata } from "@fishjam-cloud/react-native-client";
+
+type PeerMetadata = {
+ displayName: string;
+};
+
+export function UpdateNameButton() {
+ const { updatePeerMetadata } = useUpdatePeerMetadata(); // [!code highlight]
+
+ const onPressUpdateName = useCallback(async () => {
+ await updatePeerMetadata({ displayName: "Thomas A. Anderson" }); // [!code highlight]
+ }, [updatePeerMetadata]);
+
+ return ;
+}
+```
+
+
+
+
+## Reading metadata
+
+Peer metadata is available as the `metadata` property for each peer. Therefore, when you list your peers with the `usePeers` hook, you can read
+the metadata associated with them.
+Note that the `metadata.peer` property contains only the metadata set by the client SDK (as in the examples examples above).
+The metadata set on the server side is available as `metadata.server`.
+Learn more about server metadata [here](../backend/server-setup#metadata).
+
+
+
+
+```tsx
+import React from "react";
+import { usePeers } from "@fishjam-cloud/react-client";
+
+type PeerMetadata = {
+ displayName: string;
+};
+
+type ServerMetadata = {
+ realName: string;
+};
+
+export function ListAllNames() {
+ const { remotePeers } = usePeers(); // [!code highlight]
+
+ return (
+
+ );
+}
+```
+
+
+
+
+```tsx
+import React from "react";
+import { Text, View } from "react-native";
+import { usePeers } from "@fishjam-cloud/react-native-client";
+
+type PeerMetadata = {
+ displayName: string;
+};
+
+type ServerMetadata = {
+ realName: string;
+};
+
+export function ListAllNames() {
+ const { remotePeers } = usePeers(); // [!code highlight]
+
+ return (
+
+ {remotePeers.map((peer) => (
+ // [!code highlight:4]
+
+ Display name: {peer.metadata?.peer?.displayName || "Unknown"}
+ Real name: {peer.metadata?.server?.realName || "Unknown"}
+
+ ))}
+
+ );
+}
+```
+
+
+
diff --git a/versioned_docs/version-0.26.0/how-to/client/migration-guide.mdx b/versioned_docs/version-0.26.0/how-to/client/migration-guide.mdx
new file mode 100644
index 00000000..d74c42a6
--- /dev/null
+++ b/versioned_docs/version-0.26.0/how-to/client/migration-guide.mdx
@@ -0,0 +1,449 @@
+---
+title: "0.25.x Migration Guide"
+sidebar_position: 14
+sidebar_label: "0.25.x Migration Guide 📱"
+description: Upgrade your React Native app from @fishjam-cloud/react-native-client 0.24.x to 0.25.x.
+---
+
+# 0.25.x Migration Guide Mobile
+
+# Upgrading @fishjam-cloud/react-native-client from 0.24 to 0.25
+
+This guide will help you upgrade your React Native application from `@fishjam-cloud/react-native-client@0.24.x` to `@fishjam-cloud/react-native-client@0.25.x`.
+
+## Overview
+
+Version `0.25` of `@fishjam-cloud/react-native-client` introduces API changes that may require code updates.
+
+## Required Android Permissions
+
+Add the following WebRTC permissions to your Android configuration in `app.json`:
+
+```json
+{
+ "expo": {
+ "android": {
+ "permissions": [
+ "android.permission.CAMERA",
+ "android.permission.RECORD_AUDIO",
+ "android.permission.MODIFY_AUDIO_SETTINGS",
+ "android.permission.ACCESS_NETWORK_STATE"
+ ]
+ }
+ }
+}
+```
+
+## FishjamProvider Setup
+
+In `0.25`, wrapping your app with `FishjamProvider` is required to provide the Fishjam ID context.
+
+### Before
+
+```tsx
+// @noErrors
+import React from "react";
+// ---cut---
+import { useConnection } from "@fishjam-cloud/react-native-client";
+
+const { joinRoom } = useConnection();
+// fishjamId was passed directly to joinRoom
+await joinRoom({ fishjamId: "your-fishjam-id", peerToken: "..." });
+```
+
+### After
+
+```tsx
+import React from "react";
+import { Text } from "react-native";
+// ---cut---
+import { FishjamProvider } from "@fishjam-cloud/react-native-client"; // [!code highlight]
+
+// Wrap your app with FishjamProvider
+export default function App() {
+ return (
+ // [!code highlight]
+
+
+ // [!code highlight]
+ );
+}
+
+const YourApp = () => {
+ return (
+ <>
+ Your app content
+ >
+ );
+};
+```
+
+The `fishjamId` is now provided through the context, so you no longer need to pass it to `joinRoom` or `useSandbox`.
+
+## Device Initialization
+
+### Before
+
+```tsx
+// @noErrors
+import { useCamera } from "@fishjam-cloud/react-native-client";
+
+const { prepareCamera } = useCamera();
+
+await prepareCamera({ cameraEnabled: true });
+```
+
+### After
+
+```tsx
+import { useInitializeDevices } from "@fishjam-cloud/react-native-client";
+
+const { initializeDevices } = useInitializeDevices();
+
+// Initialize devices when you first want to stream
+await initializeDevices({ enableAudio: false }); // or initializeDevices() for both audio and video
+```
+
+:::important
+On mobile, you should use `initializeDevices()` when you first want to stream. This gives your app access to all available devices and automatically requests camera and microphone permissions. After initialization, you can use `startCamera`/`stopCamera` or `startMicrophone`/`stopMicrophone` to manage device state.
+:::
+
+## Video Rendering and Accessing Peer Tracks
+
+### Before
+
+```tsx
+// @noErrors
+import React from "react";
+import { View } from "react-native";
+// ---cut---
+import {
+ usePeers,
+ VideoRendererView,
+} from "@fishjam-cloud/react-native-client";
+
+const { remotePeers, localPeer } = usePeers();
+
+const videoTracks = remotePeers.flatMap((peer) =>
+ peer.tracks.filter((track) => track.type === "Video" && track.isActive),
+);
+const localTrack = localPeer?.tracks.find((t) => t.type === "Video");
+
+
+ {localTrack && (
+
+ )}
+ {videoTracks.map((track) => (
+
+ ))}
+;
+```
+
+### After
+
+```tsx
+import React from "react";
+// ---cut---
+import {
+ usePeers,
+ RTCView,
+ type MediaStream,
+} from "@fishjam-cloud/react-native-client";
+
+function VideoPlayer({ stream }: { stream: MediaStream | null | undefined }) {
+ return (
+ <>
+ {stream && (
+
+ )}
+ >
+ );
+}
+
+const { localPeer, remotePeers } = usePeers();
+{
+ localPeer?.cameraTrack?.stream && (
+
+ );
+}
+
+{
+ remotePeers.map((peer) => (
+ <>
+ {peer.cameraTrack?.stream && (
+
+ )}
+ >
+ ));
+}
+```
+
+Key changes:
+
+- `VideoRendererView` → `RTCView`
+- `trackId` prop → `mediaStream` prop
+- `peer.tracks` array → `peer.cameraTrack` and `peer.microphoneTrack` properties
+- `track.isActive` removed (check if stream exists instead)
+- `track.type` removed (use specific track properties)
+
+## Connection API
+
+### Before
+
+```tsx
+// @noErrors
+import { useConnection, useSandbox } from "@fishjam-cloud/react-native-client";
+
+const { joinRoom } = useConnection();
+const { getSandboxPeerToken } = useSandbox({ fishjamId: "your-id" });
+
+const peerToken = await getSandboxPeerToken("roomName", "peerName");
+await joinRoom({ fishjamId: "your-id", peerToken });
+```
+
+### After
+
+```tsx
+import { useConnection, useSandbox } from "@fishjam-cloud/react-native-client";
+
+const { joinRoom } = useConnection();
+// fishjamId is now provided through FishjamProvider
+const { getSandboxPeerToken } = useSandbox();
+
+const peerToken = await getSandboxPeerToken("roomName", "peerName");
+await joinRoom({ peerToken }); // fishjamId passed through FishjamProvider
+```
+
+## Device Management
+
+### Camera Device Selection
+
+### Before
+
+```tsx
+// @noErrors
+import { useCamera } from "@fishjam-cloud/react-native-client";
+
+const { cameras, switchCamera, currentCamera } = useCamera();
+
+// find first camera facing opposite direction than current camera
+const otherCamera = cameras.find(
+ (camera) => camera.facingDirection !== currentCamera?.facingDirection,
+);
+if (otherCamera) {
+ switchCamera(otherCamera.id);
+}
+```
+
+### After
+
+```tsx
+import { useCamera } from "@fishjam-cloud/react-native-client";
+const { cameraDevices, selectCamera } = useCamera();
+
+// Select camera by deviceId
+const nextCamera = cameraDevices[0];
+if (nextCamera) {
+ selectCamera(nextCamera.deviceId);
+}
+```
+
+Key changes:
+
+- `cameras` → `cameraDevices`
+- `switchCamera` → `selectCamera` (takes `deviceId` instead of direction)
+- `facingDirection` property removed
+
+### Camera Control
+
+### Before
+
+```tsx
+// @noErrors
+import React from "react";
+import { Button } from "react-native";
+// ---cut---
+import { useCamera } from "@fishjam-cloud/react-native-client";
+const { isCameraOn, toggleCamera } = useCamera();
+
+;
+```
+
+### After
+
+```tsx
+import { useCamera } from "@fishjam-cloud/react-native-client";
+const { startCamera, stopCamera, toggleCamera } = useCamera();
+
+await startCamera();
+
+await stopCamera();
+
+toggleCamera();
+```
+
+## Screen Sharing
+
+### Before
+
+```tsx
+// @noErrors
+import React, { useCallback } from "react";
+import { Button } from "react-native";
+// ---cut---
+import { useScreenShare } from "@fishjam-cloud/react-native-client";
+
+const { toggleScreenShare, isScreenShareOn } = useScreenShare();
+const onPressToggle = useCallback(
+ () => toggleScreenShare(),
+ [toggleScreenShare],
+);
+
+;
+```
+
+### After
+
+```tsx
+import React, { useCallback } from "react";
+import { Button } from "react-native";
+// ---cut---
+import { useScreenShare } from "@fishjam-cloud/react-native-client";
+
+const { startStreaming, stopStreaming, stream } = useScreenShare();
+
+const onPressToggle = () => {
+ if (stream) {
+ stopStreaming();
+ } else {
+ startStreaming();
+ }
+};
+
+;
+```
+
+Key changes:
+
+- `toggleScreenShare()` → `startStreaming()` / `stopStreaming()`
+- `isScreenShareOn` → check if `stream` exists
+
+## Picture in Picture
+
+### Before
+
+```tsx
+// @noErrors
+import React from "react";
+import { View } from "react-native";
+// ---cut---
+import { PipContainerView } from "@fishjam-cloud/react-native-client";
+export function VideoCallScreen() {
+ return (
+
+ {/* Your video call UI */}
+
+ );
+}
+```
+
+### After
+
+```tsx
+import React, { useRef } from "react";
+import { View, Button } from "react-native";
+import {
+ RTCPIPView,
+ startPIP,
+ stopPIP,
+ useCamera,
+} from "@fishjam-cloud/react-native-client";
+export function VideoCallScreen() {
+ const pipViewRef = useRef>(null);
+ const { cameraStream } = useCamera();
+ return (
+
+ startPIP(pipViewRef as any)} />
+ stopPIP(pipViewRef as any)} />
+ {cameraStream && (
+
+ )}
+
+ );
+}
+```
+
+Key changes:
+
+- `PipContainerView` → `RTCPIPView`
+- Requires a ref for manual `startPIP`/`stopPIP` control
+- Added `pip` prop for configuration
+
+## Livestreaming Imports
+
+### Before
+
+```tsx
+// @noErrors
+import {
+ useLivestreamStreamer,
+ useLivestreamViewer,
+} from "@fishjam-cloud/react-native-client/livestream";
+```
+
+### After
+
+```tsx
+import {
+ useLivestreamStreamer,
+ useLivestreamViewer,
+} from "@fishjam-cloud/react-native-client";
+```
+
+The livestreaming hooks are now exported from the main package instead of a separate `/livestream` subpath.
+
+## Removed Hooks and APIs
+
+The following hooks and APIs have been removed and are no longer available:
+
+### Permission Hooks
+
+### Before
+
+```tsx
+// @noErrors
+import {
+ useCameraPermissions,
+ useMicrophonePermissions,
+} from "@fishjam-cloud/react-native-client";
+
+const [cameraPermission, requestCameraPermission] = useCameraPermissions();
+const [micPermission, requestMicPermission] = useMicrophonePermissions();
+```
+
+### After
+
+Permissions are now handled automatically by the SDK. When you call initializeDevices(), the SDK will automatically request camera and microphone permissions if they haven't been granted yet.
diff --git a/versioned_docs/version-0.26.0/how-to/client/picture-in-picture.mdx b/versioned_docs/version-0.26.0/how-to/client/picture-in-picture.mdx
new file mode 100644
index 00000000..47b9a62d
--- /dev/null
+++ b/versioned_docs/version-0.26.0/how-to/client/picture-in-picture.mdx
@@ -0,0 +1,607 @@
+---
+title: "Picture in Picture"
+sidebar_position: 11
+sidebar_label: "Picture in Picture 📱"
+description: Display video in a floating PiP window when the user backgrounds the app on Android or iOS.
+---
+
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+
+# Picture in Picture Mobile
+
+:::note
+This guide is exclusively for **Mobile** (React Native) applications.
+:::
+
+Picture in Picture (PiP) allows your app to display video content in a small window that floats above other apps when the user backgrounds your application. This is especially useful for video calls and livestreaming where users want to multitask while staying connected.
+
+The SDK provides two Picture in Picture modes depending on your use case:
+
+- **Conferencing**: For interactive video calls with multiple participants. Uses a **custom split-screen layout** in the PiP window showing your local camera (left) and the active speaker (right) with automatic voice activity detection.
+- **Livestreaming**: For viewing livestreams. Displays the **full WHEP stream video** in the Picture in Picture window using the native video player's PiP functionality.
+
+Choose the scenario that matches your application below.
+
+## Installation
+
+
+
+
+
+
+
+
+
+You need to modify your `app.json` file and add our plugin with Picture in Picture support:
+
+```json title='app.json'
+{
+ "expo": {
+ ...
+ "plugins": [
+ [
+ "@fishjam-cloud/react-native-client",
+ {
+ "android": {
+ "supportsPictureInPicture": true
+ },
+ "ios": {
+ "supportsPictureInPicture": true
+ }
+ }
+ ]
+ ]
+ }
+}
+```
+
+
+
+
+**Android Configuration**
+
+Add the `android:supportsPictureInPicture` attribute to your main activity in `AndroidManifest.xml`:
+
+```xml title='AndroidManifest.xml'
+
+
+
+
+
+
+```
+
+**iOS Configuration**
+
+Add the `audio` background mode to your `Info.plist`:
+
+```xml title='Info.plist'
+UIBackgroundModes
+
+ audio
+
+```
+
+:::tip[When do you need `voip`?]
+The `audio` background mode is sufficient for PiP itself. The microphone continues to work in the background with just `audio`, but if your app also needs to keep the **camera** active while in the background (e.g., an ongoing video call), you need the `voip` background mode. See the [Background calls](./background-streaming) guide for setup instructions.
+
+Adding `voip` to `UIBackgroundModes` triggers additional scrutiny during Apple's App Store review — only add it if your app genuinely requires VoIP functionality.
+:::
+
+
+
+
+
+
+
+
+
+
+
+You need to modify your `app.json` file and add our plugin with Picture in Picture support:
+
+```json title='app.json'
+{
+ "expo": {
+ ...
+ "plugins": [
+ [
+ "@fishjam-cloud/react-native-client",
+ {
+ "android": {
+ "supportsPictureInPicture": true
+ },
+ "ios": {
+ "supportsPictureInPicture": true
+ }
+ }
+ ]
+ ]
+ }
+}
+```
+
+
+
+
+**Android Configuration**
+
+Add the `android:supportsPictureInPicture` attribute to your main activity in `AndroidManifest.xml`:
+
+```xml title='AndroidManifest.xml'
+
+
+
+
+
+
+```
+
+**iOS Configuration**
+
+Add the `audio` background mode to your `Info.plist`:
+
+```xml title='Info.plist'
+UIBackgroundModes
+
+ audio
+
+```
+
+
+
+
+
+
+
+## Usage
+
+
+
+
+
+### Basic Usage
+
+The `RTCPIPView` component displays video content that can be shown in Picture in Picture mode. Use `startPIP` and `stopPIP` to control PIP manually:
+
+```tsx
+import React, { useRef } from "react";
+import { View, Button } from "react-native";
+import {
+ RTCPIPView,
+ startPIP,
+ stopPIP,
+ useCamera,
+} from "@fishjam-cloud/react-native-client";
+
+export function VideoCallScreen() {
+ const pipViewRef = useRef>(null);
+ const { cameraStream } = useCamera();
+
+ return (
+
+ startPIP(pipViewRef as any)} />
+ stopPIP(pipViewRef as any)} />
+ {cameraStream && (
+
+ )}
+
+ );
+}
+```
+
+By default, Picture in Picture will start automatically when the app goes to the background and stop when it returns to the foreground.
+
+### Configuration Options
+
+You can customize the Picture in Picture behavior using the `pip` prop on `RTCPIPView`:
+
+```tsx
+import React, { useRef } from "react";
+import { View } from "react-native";
+import { RTCPIPView, useCamera } from "@fishjam-cloud/react-native-client";
+
+export function VideoCallScreen() {
+ const pipViewRef = useRef>(null);
+ const { cameraStream } = useCamera();
+
+ return (
+
+ {cameraStream && (
+
+ )}
+
+ );
+}
+```
+
+#### Configuration Properties
+
+**startAutomatically**: When `true`, Picture in Picture starts automatically when the app goes to the background. Default: `true`
+
+**stopAutomatically**: When `true`, Picture in Picture stops automatically when the app returns to the foreground. Default: `true`
+
+**enabled**: When `true`, enables Picture in Picture functionality for this view.
+
+### Manual Control
+
+For more control over when Picture in Picture starts and stops, use the `startPIP` and `stopPIP` functions with a ref:
+
+```tsx
+import React, { useRef } from "react";
+import { Button, View } from "react-native";
+import {
+ RTCPIPView,
+ startPIP,
+ stopPIP,
+ useCamera,
+} from "@fishjam-cloud/react-native-client";
+
+export function VideoCallScreen() {
+ const pipViewRef = useRef>(null);
+ const { cameraStream } = useCamera();
+
+ const handleStartPip = () => {
+ startPIP(pipViewRef as any);
+ };
+
+ const handleStopPip = () => {
+ stopPIP(pipViewRef as any);
+ };
+
+ return (
+
+
+
+ {cameraStream && (
+
+ )}
+
+ );
+}
+```
+
+### Complete Example
+
+Here's a complete example showing Picture in Picture with a video call:
+
+```tsx
+import React, { useRef } from "react";
+import { FlatList, StyleSheet, View, Text, Button } from "react-native";
+import {
+ RTCPIPView,
+ RTCView,
+ startPIP,
+ stopPIP,
+ usePeers,
+ type MediaStream,
+} from "@fishjam-cloud/react-native-client";
+
+function VideoPlayer({ stream }: { stream: MediaStream | null }) {
+ if (!stream) return No video;
+ return (
+
+ );
+}
+
+export function VideoCallScreen() {
+ const pipViewRef = useRef>(null);
+ const { localPeer, remotePeers } = usePeers();
+ const firstRemotePeer = remotePeers[0];
+ const remoteStream = firstRemotePeer?.cameraTrack?.stream;
+
+ return (
+
+ startPIP(pipViewRef as any)} />
+ stopPIP(pipViewRef as any)} />
+
+ {/* Render local video */}
+ {localPeer?.cameraTrack?.stream && (
+
+ )}
+
+ {/* Render first remote peer with PiP support */}
+ {remoteStream && (
+
+ )}
+
+ {/* Render remaining remote videos */}
+ peer.id}
+ renderItem={({ item: peer }) => (
+
+ {peer.cameraTrack?.stream && (
+
+ )}
+
+ )}
+ />
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ },
+ video: {
+ width: "100%",
+ height: 200,
+ },
+});
+```
+
+### Platform-Specific Behavior
+
+Both Android and iOS display a split-screen layout in Picture in Picture mode with your local camera on the left and the active speaker on the right. The active speaker is automatically determined by voice activity detection (VAD).
+
+#### Android
+
+Picture in Picture is supported on Android 8.0 (API level 26) and above. The system automatically manages the PiP window size and position. Users can tap the PiP window to return to your app. On Android 12 (API level 31) and above, automatic Picture in Picture is supported when `startAutomatically` is `true`.
+
+#### iOS
+
+Picture in Picture on iOS can be used both while the app is in the foreground (as an in-app overlay) and when the app is backgrounded. The `audio` background mode is required for PiP to continue displaying video after the app moves to the background.
+
+With only the `audio` background mode, the microphone continues to work but the outgoing camera track stops when the app is backgrounded. This is sufficient for audio-only calls or receive-only scenarios like livestream viewing. For video calls where the camera needs to keep working in the background, the `voip` background mode is additionally required — see the [Background calls](./background-streaming) guide.
+
+When `allowsCameraInBackground` is enabled together with the `voip` background mode, the camera continues to capture in PiP mode (iOS 16.0+).
+
+### Active Speaker Detection
+
+The secondary view (right side) automatically displays the remote participant who is currently speaking, based on voice activity detection (VAD). When no one is speaking, it will show the last active speaker if available, fall back to the first remote participant with a video track, or show the placeholder text if no remote video is available.
+
+This automatic switching ensures the most relevant video is always displayed in the Picture in Picture window.
+
+### Combining with Background Calls
+
+If your app needs to keep the camera active during a video call while in the background, PiP alone is not enough. Without the `voip` background mode on iOS, PiP displays received video and the microphone continues to work, but the outgoing camera track stops when the app is backgrounded.
+
+To keep a full two-way call active in the background with a PiP overlay, combine PiP with [background calls](./background-streaming):
+
+- **Android**: Enable foreground services alongside PiP.
+- **iOS**: Enable the `voip` background mode alongside PiP.
+
+:::caution
+Adding `voip` to `UIBackgroundModes` triggers additional scrutiny during Apple's App Store review. Only enable it if your app genuinely requires VoIP functionality (active calls in the background). For receive-only scenarios like livestream viewing, the `audio` background mode configured during [PiP installation](#installation) is sufficient.
+:::
+
+Example configuration combining both features:
+
+```json title='app.json (Expo)'
+{
+ "expo": {
+ "plugins": [
+ [
+ "@fishjam-cloud/react-native-client",
+ {
+ "android": {
+ "enableForegroundService": true,
+ "supportsPictureInPicture": true
+ },
+ "ios": {
+ "enableVoIPBackgroundMode": true,
+ "supportsPictureInPicture": true
+ }
+ }
+ ]
+ ]
+ }
+}
+```
+
+
+
+
+### Basic Usage
+
+Use `RTCPIPView` to display the livestream with Picture in Picture support:
+
+```tsx
+import React, { useRef, useEffect } from "react";
+import { View, StyleSheet, Text } from "react-native";
+import {
+ RTCPIPView,
+ useLivestreamViewer,
+ useSandbox,
+} from "@fishjam-cloud/react-native-client";
+
+export function LivestreamScreen() {
+ const pipViewRef = useRef>(null);
+ const { connect, stream } = useLivestreamViewer();
+ const { getSandboxViewerToken } = useSandbox();
+
+ useEffect(() => {
+ const connectToStream = async () => {
+ const token = await getSandboxViewerToken("room-name");
+ await connect({ token });
+ };
+ connectToStream();
+ }, []);
+
+ return (
+
+ {stream ? (
+
+ ) : (
+ Connecting to stream...
+ )}
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ },
+ viewer: {
+ flex: 1,
+ },
+});
+```
+
+### Configuration Options
+
+Configure Picture in Picture behavior using the `pip` prop:
+
+```jsx
+
+```
+
+#### Configuration Properties
+
+**enabled**: Enable or disable Picture in Picture functionality.
+
+**startAutomatically**: When `true`, Picture in Picture starts automatically when the app goes to the background. Default: `true`
+
+**stopAutomatically**: When `true`, Picture in Picture stops automatically when the app returns to the foreground. Default: `true`
+
+### Complete Example
+
+Here's a complete example showing how to connect to a livestream and display it with Picture in Picture:
+
+```tsx
+import React, { useEffect, useRef } from "react";
+import { View, StyleSheet, Text, Button } from "react-native";
+import {
+ RTCPIPView,
+ useLivestreamViewer,
+ useSandbox,
+ startPIP,
+ stopPIP,
+} from "@fishjam-cloud/react-native-client";
+
+export function LivestreamViewerScreen() {
+ const pipViewRef = useRef>(null);
+ const { getSandboxViewerToken } = useSandbox();
+ const { connect, disconnect, stream } = useLivestreamViewer();
+
+ useEffect(() => {
+ const connectToStream = async () => {
+ try {
+ const token = await getSandboxViewerToken("room-name");
+ await connect({ token });
+ } catch (err) {
+ console.error("Failed to connect to livestream:", err);
+ }
+ };
+
+ connectToStream();
+
+ return () => {
+ disconnect();
+ };
+ }, []);
+
+ return (
+
+ startPIP(pipViewRef as any)} />
+ stopPIP(pipViewRef as any)} />
+ {stream ? (
+
+ ) : (
+ Connecting to stream...
+ )}
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: "#000",
+ },
+ viewer: {
+ flex: 1,
+ },
+ loading: {
+ color: "#fff",
+ textAlign: "center",
+ marginTop: 20,
+ },
+});
+```
+
+### Platform-Specific Behavior
+
+#### Android
+
+Picture in Picture is supported on Android 8.0 (API level 26) and above. The native video player's PiP window displays the WHEP stream. PiP automatically stops when the app returns to the foreground. Users can tap the PiP window to return to your app.
+
+#### iOS
+
+Picture in Picture requires the `audio` background mode. Uses the native AVPictureInPictureController to display the video. The WHEP stream continues playing in the PiP window. When `autoStopPip` is enabled, PiP stops automatically when returning to the app.
+
+
+
diff --git a/versioned_docs/version-0.23.0/how-to/react-native/reconnection-handling.mdx b/versioned_docs/version-0.26.0/how-to/client/reconnection-handling.mdx
similarity index 76%
rename from versioned_docs/version-0.23.0/how-to/react-native/reconnection-handling.mdx
rename to versioned_docs/version-0.26.0/how-to/client/reconnection-handling.mdx
index 3189b6de..ba7e6594 100644
--- a/versioned_docs/version-0.23.0/how-to/react-native/reconnection-handling.mdx
+++ b/versioned_docs/version-0.26.0/how-to/client/reconnection-handling.mdx
@@ -1,8 +1,15 @@
---
-sidebar_position: 7
+title: "Reconnect"
+sidebar_position: 10
+sidebar_label: "Reconnect 📱"
+description: Handle automatic reconnection to a Fishjam room after connection loss in React Native apps.
---
-# Reconnect
+# Reconnect Mobile
+
+:::note
+This guide is exclusively for **Mobile** (React Native) applications.
+:::
If your connection is lost while you are connected to a room, the app will automatically handle the reconnection process.
You can monitor these events by utilizing the [`useConnection`](../../api/mobile/functions/useConnection) hook.
diff --git a/versioned_docs/version-0.23.0/how-to/react-native/screensharing.mdx b/versioned_docs/version-0.26.0/how-to/client/screensharing.mdx
similarity index 66%
rename from versioned_docs/version-0.23.0/how-to/react-native/screensharing.mdx
rename to versioned_docs/version-0.26.0/how-to/client/screensharing.mdx
index 6d91e934..607ad2a6 100644
--- a/versioned_docs/version-0.23.0/how-to/react-native/screensharing.mdx
+++ b/versioned_docs/version-0.26.0/how-to/client/screensharing.mdx
@@ -1,11 +1,18 @@
---
-sidebar_position: 5
+title: "Screen sharing"
+sidebar_position: 12
+sidebar_label: "Screen sharing 📱"
+description: Stream mobile device screen content to other peers in React Native applications.
---
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
-# Screen sharing
+# Screen sharing Mobile
+
+:::note
+This guide is exclusively for **Mobile** (React Native) applications.
+:::
Our SDK also allow to stream content of mobile device screen.
@@ -21,10 +28,7 @@ To enable screen sharing on iOS, you need to follow the steps below.
:::tip[Background streaming during screen sharing]
-If you want to continue screen sharing when the app goes to the background, you need to:
-
-1. Enable VoIP background mode by setting `enableVoIPBackgroundMode: true` in the plugin configuration or adding the VoIP background mode to your `Info.plist`
-2. Use the [`useCallKitService`](../../api/mobile/variables/useCallKitService) hook in your component to manage the CallKit session
+If you want to continue screen sharing when the app goes to the background, you need to enable VoIP background mode by setting `enableVoIPBackgroundMode: true` in the plugin configuration or adding the VoIP background mode to your `Info.plist`.
See the [background calls documentation](./background-streaming) for detailed instructions and code examples.
@@ -58,6 +62,46 @@ You need to modify `app.json` file and add our plugin:
}
```
+#### EAS Build Configuration
+
+If you're using [EAS Build](https://docs.expo.dev/build/introduction/), you need to declare the iOS App Extension in your `app.json` file. Otherwise your build will fail with missing provisioning profiles.
+Add the following configuration to ensure the required credentials are generated and validated:
+
+```json title='app.json'
+{
+ "expo": {
+ ...
+ "extra": {
+ "eas": {
+ "build": {
+ "experimental": {
+ "ios": {
+ "appExtensions": [
+ {
+ "targetName": "FishjamScreenBroadcastExtension",
+ "bundleIdentifier": "YOUR_BUNDLE_IDENTIFIER.FishjamScreenBroadcastExtension",
+ "entitlements": {
+ "com.apple.security.application-groups": [
+ "group.YOUR_BUNDLE_IDENTIFIER"
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+Replace `YOUR_BUNDLE_IDENTIFIER` with your app's bundle identifier (for example, `com.myapp.example`).
+
+:::note
+Learn more about iOS App Extensions with EAS Build in the [Expo documentation](https://docs.expo.dev/build-reference/app-extensions/).
+:::
+
@@ -75,15 +119,12 @@ Configuring screen sharing on iOS is a little complicated.
1. Open your `.xcworkspace` in Xcode
1. Create new Broadcast Upload Extension. Select `File → New → Target... → Broadcast Upload Extension → Next`. Choose the name for the new target, select Swift language and deselect "Include UI Extension".
- 
1. Configure app group. Go to "Signing & Capabilities" tab, click "+ Capability" button in upper left corner and select "App Groups".
- 
Then in the "App Groups" add a new group or select existing. Usually group name has format `group.`. Verify that both app and extension targets have app group and dev team set correctly.
-1. A new folder with app extension should appear on the left with contents like this:
- 
+1. A new folder with app extension should appear on the left.
Replace `SampleHandler.swift` with `FishjamBroadcastHandler.swift` and this code:
@@ -171,24 +212,13 @@ Configuring screen sharing on iOS is a little complicated.
-:::tip[Background streaming during screen sharing]
-
-If you want to continue screen sharing when the app goes to the background, you need to:
-
-1. Enable VoIP background mode by setting `enableVoIPBackgroundMode: true` in the plugin configuration or adding the VoIP background mode to your `Info.plist`
-2. Use the [`useCallKitService`](../../api/mobile/variables/useCallKitService) hook in your component to manage the CallKit session
-
-See the [background calls documentation](./background-streaming) for detailed instructions and code examples.
-
-:::
-
## Usage
You can use [`useScreenShare`](../../api/mobile/functions/useScreenShare) hook to enable screen sharing.
:::tip[Permissions]
-Permission request is handled for you as soon as you call [`toggleScreenShare`](../../api/mobile/functions/useScreenShare#togglescreenshare).
+Permission request is handled for you as soon as you call [`startStreaming`](../../api/mobile/functions/useScreenShare#startstreaming).
:::
@@ -198,8 +228,8 @@ On Android API level >= 24, you must use a foreground service when screen sharin
:::
-You can enable/disable screen sharing with [`toggleScreenShare`](../../api/mobile/functions/useScreenShare#togglescreenshare) method.
-And check current state with [`isScreenShareOn`](../../api/mobile/functions/useScreenShare#isscreenshareon) property.
+You can enable/disable screen sharing with [`startStreaming`](../../api/mobile/functions/useScreenShare#startstreaming) and [`stopStreaming`](../../api/mobile/functions/useScreenShare#stopstreaming) methods.
+And check current state by checking if [`stream`](../../api/mobile/functions/useScreenShare#stream) exists.
```tsx
import React, { useCallback } from "react";
@@ -207,17 +237,20 @@ import { Button } from "react-native";
import { useScreenShare } from "@fishjam-cloud/react-native-client";
export function ScreenShareButton() {
- const { toggleScreenShare, isScreenShareOn } = useScreenShare(); // [!code highlight]
+ const { startStreaming, stopStreaming, stream } = useScreenShare(); // [!code highlight]
- const onPressToggle = useCallback(
- () => toggleScreenShare(), // [!code highlight]
- [toggleScreenShare],
- );
+ const onPressToggle = useCallback(() => {
+ if (stream) {
+ stopStreaming(); // [!code highlight]
+ } else {
+ startStreaming(); // [!code highlight]
+ }
+ }, [stream, startStreaming, stopStreaming]);
return (
);
}
diff --git a/versioned_docs/version-0.26.0/how-to/client/simulcast.mdx b/versioned_docs/version-0.26.0/how-to/client/simulcast.mdx
new file mode 100644
index 00000000..83e773db
--- /dev/null
+++ b/versioned_docs/version-0.26.0/how-to/client/simulcast.mdx
@@ -0,0 +1,285 @@
+---
+title: Simulcast
+sidebar_position: 15
+description: Enable multi-quality video streaming and let receivers choose their preferred quality variant.
+---
+
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+
+# Simulcast
+
+This guide shows how to enable simulcast (multi-quality video streaming) so that senders publish multiple quality variants and receivers can independently choose which variant to receive.
+
+## Prerequisites
+
+Before configuring simulcast, you must be [connected to a room](./connecting) with video enabled.
+
+:::tip
+For a conceptual overview of how simulcast works, including when to use it and how variants flow through the server, see [Simulcast](../../explanation/simulcast).
+:::
+
+---
+
+## Step 1: Configure sent qualities (sender side)
+
+Pass `sentQualities` in the `videoConfig` prop of `FishjamProvider` to control which quality variants the sender publishes.
+
+
+
+
+```tsx
+import React from "react";
+import { FishjamProvider, Variant } from "@fishjam-cloud/react-client";
+
+const fishjamId = "your-fishjam-id";
+
+// ---cut---
+
+function App() {
+ return (
+
+ {/* your app */}
+
+ );
+}
+```
+
+
+
+
+```tsx
+import React from "react";
+import { FishjamProvider, Variant } from "@fishjam-cloud/react-native-client";
+
+const fishjamId = "your-fishjam-id";
+
+// ---cut---
+
+function App() {
+ return (
+
+ {/* your app */}
+
+ );
+}
+```
+
+
+
+
+To disable simulcast entirely, pass `false`:
+
+```tsx
+import React from "react";
+import { FishjamProvider } from "@fishjam-cloud/react-client";
+
+const fishjamId = "your-fishjam-id";
+
+// ---cut---
+
+function App() {
+ return (
+
+ {/* your app */}
+
+ );
+}
+```
+
+---
+
+## Step 2: Select received quality (receiver side)
+
+Remote tracks expose `setReceivedQuality`, which tells the server which variant to forward for that track.
+
+
+
+
+```tsx
+import React from "react";
+import { usePeers, type RemoteTrack } from "@fishjam-cloud/react-client";
+
+function VideoPlayer({ stream }: { stream: MediaStream | null }) {
+ return ;
+}
+
+function QualitySelector({ track }: { track: RemoteTrack }) {
+ return ;
+}
+
+// ---cut---
+
+function RemoteVideos() {
+ const { remotePeers } = usePeers();
+
+ return (
+
+ );
+}
+```
+
+
+
+
+```tsx
+import React from "react";
+import { type RemoteTrack, Variant } from "@fishjam-cloud/react-native-client";
+import { View, Pressable, Text, StyleSheet } from "react-native";
+
+// ---cut---
+
+const variants = [
+ { label: "Low", value: Variant.VARIANT_LOW },
+ { label: "Medium", value: Variant.VARIANT_MEDIUM },
+ { label: "High", value: Variant.VARIANT_HIGH },
+];
+
+function QualitySelector({ track }: { track: RemoteTrack }) {
+ return (
+
+ {variants.map(({ label, value }) => (
+ track.setReceivedQuality(value)}
+ >
+ {label}
+
+ ))}
+
+ );
+}
+
+const styles = StyleSheet.create({
+ row: { flexDirection: "row", gap: 8, marginTop: 4 },
+ pill: {
+ paddingHorizontal: 12,
+ paddingVertical: 6,
+ borderRadius: 16,
+ backgroundColor: "#e0e0e0",
+ },
+});
+```
+
+
+
+
+---
+
+## Type differences: `Track` vs `RemoteTrack`
+
+When using `usePeers`, the track types differ between local and remote peers:
+
+- **`localPeer.tracks`** are typed as `Track` (no quality selection methods)
+- **`remotePeers[].tracks`** are typed as `RemoteTrack` (extends `Track` with `setReceivedQuality`)
+
+This means `setReceivedQuality` is only available on tracks from remote peers, which is the correct behavior. You don't need to select a quality variant for your own video.
+
+---
+
+## See also
+
+- [Simulcast explanation](../../explanation/simulcast): conceptual overview of how simulcast works
+- [Connecting to a room](./connecting): prerequisite for using simulcast
diff --git a/versioned_docs/version-0.23.0/how-to/react/start-streaming.mdx b/versioned_docs/version-0.26.0/how-to/client/start-streaming.mdx
similarity index 50%
rename from versioned_docs/version-0.23.0/how-to/react/start-streaming.mdx
rename to versioned_docs/version-0.26.0/how-to/client/start-streaming.mdx
index 0f074eaa..4bbd1bf8 100644
--- a/versioned_docs/version-0.23.0/how-to/react/start-streaming.mdx
+++ b/versioned_docs/version-0.26.0/how-to/client/start-streaming.mdx
@@ -1,10 +1,19 @@
---
-sidebar_position: 3
+sidebar_position: 2
+description: Initialize camera and microphone access and start streaming media in a Fishjam room.
---
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+
# Streaming media
-### Initialize access to your devices
+This guide covers the basics of initializing and using camera and microphone devices. For more advanced device management (selecting specific devices, device switching, muting, etc.), see the [Managing devices](./managing-devices) guide.
+
+## Initialize access to your devices
+
+
+
Fishjam provides an API to browse and manage media devices you can use.
To ask the browser for permission to list the available devices,
@@ -38,11 +47,22 @@ The [`useInitializeDevices`](../../api/web/functions/useInitializeDevices) hook
It is not the only way to enable the device. You can just toggle the device using [`useCamera`](../../api/web/functions/useCamera) or [`useMicrophone`](../../api/web/functions/useMicrophone) hooks.
:::
-### Device API
+
+
+
+On mobile, you should use `initializeDevices()` when you first want to stream. This gives your app access to all available devices and automatically requests camera and microphone permissions. The SDK will show the system permission dialog if permissions haven't been granted yet.
+
+Once devices are initialized, you can manage their state using the methods described in the [Managing devices](./managing-devices) guide.
+
+
+
-To manage users' camera and microphone devices, use the respective [`useCamera`](../../api/web/functions/useCamera)
-and [`useMicrophone`](../../api/web/functions/useMicrophone) hooks.
-Both of them has similar API. To keep things simple, we will just use the camera hook.
+## Device API
+
+
+
+
+To manage users' camera and microphone devices, use the respective [`useCamera`](../../api/web/functions/useCamera) and [`useMicrophone`](../../api/web/functions/useMicrophone) hooks. Both of them have similar API. To keep things simple, we will just use the camera hook.
```tsx
import React, { useEffect, useRef } from "react";
@@ -74,3 +94,42 @@ export function ExampleCameraPreview() {
);
}
```
+
+
+
+
+To manage users' camera and microphone devices, use the respective [`useCamera`](../../api/mobile/functions/useCamera) and [`useMicrophone`](../../api/mobile/functions/useMicrophone) hooks. Both of them have similar API. To keep things simple, we will just use the camera hook.
+
+You can preview your camera stream using the `RTCView` component.
+
+```tsx
+import React, { useEffect } from "react";
+import { View, Text } from "react-native";
+import { useCamera, RTCView } from "@fishjam-cloud/react-native-client";
+
+export function CameraPreview() {
+ const { startCamera, cameraStream } = useCamera(); // [!code highlight]
+
+ useEffect(() => {
+ startCamera(); // [!code highlight]
+ }, [startCamera]);
+
+ return (
+
+ {cameraStream ? (
+
+ ) : (
+ No camera stream
+ )}
+
+ );
+}
+```
+
+
+
diff --git a/versioned_docs/version-0.23.0/how-to/react/stream-middleware.mdx b/versioned_docs/version-0.26.0/how-to/client/stream-middleware.mdx
similarity index 89%
rename from versioned_docs/version-0.23.0/how-to/react/stream-middleware.mdx
rename to versioned_docs/version-0.26.0/how-to/client/stream-middleware.mdx
index baa2019c..714ab90c 100644
--- a/versioned_docs/version-0.23.0/how-to/react/stream-middleware.mdx
+++ b/versioned_docs/version-0.26.0/how-to/client/stream-middleware.mdx
@@ -1,8 +1,15 @@
---
-sidebar_position: 6
+title: "Stream middleware"
+sidebar_position: 7
+sidebar_label: "Stream middleware 🌐"
+description: Intercept and transform media tracks before sending them to Fishjam, enabling effects and custom encodings.
---
-# Stream middleware
+# Stream middleware Web
+
+:::note
+This guide is exclusively for **Web** (React) applications.
+:::
Stream middleware in Fishjam allows you to intercept and manipulate media tracks before they are sent to the Fishjam server.
This feature is powerful for applying effects, custom encodings, or any other transformations to the media stream.
diff --git a/versioned_docs/version-0.26.0/how-to/client/text-chat.mdx b/versioned_docs/version-0.26.0/how-to/client/text-chat.mdx
new file mode 100644
index 00000000..c629f865
--- /dev/null
+++ b/versioned_docs/version-0.26.0/how-to/client/text-chat.mdx
@@ -0,0 +1,360 @@
+---
+title: Text Chat
+sidebar_position: 16
+description: Implement peer-to-peer text chat in your application using Fishjam data channels.
+---
+
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+
+# Text Chat
+
+This guide shows how to implement text chat in your application using data channels. Data channels allow you to send and receive arbitrary binary data between peers in a room.
+
+## Prerequisites
+
+Before implementing text chat, you must be [connected to a room](./connecting). Data channels only work after you have successfully joined a room.
+
+:::tip
+For a deeper understanding of how data channels work, including channel types and broadcast behavior, see [Data Channels](../../explanation/data-channels).
+:::
+
+---
+
+## Step 1 — Set up the chat hook
+
+Use the [`useDataChannel`](/api/web/functions/useDataChannel) (web) or [`useDataChannel`](/api/mobile/functions/useDataChannel) (mobile) hook to work with data channels. The typical flow is:
+
+1. Initialize the data channel after connecting to a room
+2. Subscribe to incoming messages
+3. Publish messages to other peers
+
+
+
+
+```tsx
+import { useConnection, useDataChannel } from "@fishjam-cloud/react-client";
+import { useCallback, useEffect, useState } from "react";
+
+export function useChat() {
+ const { peerStatus } = useConnection();
+ const {
+ initializeDataChannel,
+ publishData,
+ subscribeData,
+ dataChannelReady,
+ } = useDataChannel();
+
+ const [messages, setMessages] = useState([]);
+
+ // Step 1: Initialize data channel when connected
+ useEffect(() => {
+ if (peerStatus === "connected") {
+ initializeDataChannel();
+ }
+ }, [peerStatus, initializeDataChannel]);
+
+ // Step 2: Subscribe to incoming messages
+ useEffect(() => {
+ if (!dataChannelReady) return;
+
+ const unsubscribe = subscribeData(
+ (data: Uint8Array) => {
+ const message = new TextDecoder().decode(data);
+ setMessages((prev) => [...prev, message]);
+ },
+ { reliable: true },
+ );
+
+ return unsubscribe;
+ }, [subscribeData, dataChannelReady]);
+
+ // Step 3: Publish messages
+ const sendMessage = useCallback(
+ (text: string) => {
+ if (!dataChannelReady) return;
+
+ const encoded = new TextEncoder().encode(text);
+ publishData(encoded, { reliable: true });
+ },
+ [publishData, dataChannelReady],
+ );
+
+ return { messages, sendMessage, ready: dataChannelReady };
+}
+```
+
+
+
+
+```tsx
+import {
+ useConnection,
+ useDataChannel,
+} from "@fishjam-cloud/react-native-client";
+import { useCallback, useEffect, useState } from "react";
+
+export function useChat() {
+ const { peerStatus } = useConnection();
+ const {
+ initializeDataChannel,
+ publishData,
+ subscribeData,
+ dataChannelReady,
+ dataChannelLoading,
+ dataChannelError,
+ } = useDataChannel();
+
+ const [messages, setMessages] = useState([]);
+
+ useEffect(() => {
+ if (peerStatus === "connected") {
+ initializeDataChannel();
+ }
+ }, [peerStatus, initializeDataChannel]);
+
+ useEffect(() => {
+ if (dataChannelLoading || !dataChannelReady) return;
+
+ const unsubscribe = subscribeData(
+ (data: Uint8Array) => {
+ const message = new TextDecoder().decode(data);
+ setMessages((prev) => [...prev, message]);
+ },
+ { reliable: true },
+ );
+
+ return unsubscribe;
+ }, [dataChannelReady, dataChannelLoading, subscribeData]);
+
+ const sendMessage = useCallback(
+ (text: string) => {
+ if (!dataChannelReady) return;
+
+ const encoded = new TextEncoder().encode(text);
+ publishData(encoded, { reliable: true });
+ },
+ [publishData, dataChannelReady],
+ );
+
+ return {
+ messages,
+ sendMessage,
+ ready: dataChannelReady,
+ loading: dataChannelLoading,
+ error: dataChannelError,
+ };
+}
+```
+
+
+
+
+---
+
+## Step 2 — Use the chat hook in your component
+
+Once you have the hook, you can use it in any component to send and display messages:
+
+
+
+
+```tsx
+import React from "react";
+import { useConnection, useDataChannel } from "@fishjam-cloud/react-client";
+import { useCallback, useEffect, useState } from "react";
+
+function useChat() {
+ const { peerStatus } = useConnection();
+ const {
+ initializeDataChannel,
+ publishData,
+ subscribeData,
+ dataChannelReady,
+ } = useDataChannel();
+
+ const [messages, setMessages] = useState([]);
+
+ useEffect(() => {
+ if (peerStatus === "connected") {
+ initializeDataChannel();
+ }
+ }, [peerStatus, initializeDataChannel]);
+
+ useEffect(() => {
+ if (!dataChannelReady) return;
+
+ const unsubscribe = subscribeData(
+ (data: Uint8Array) => {
+ const message = new TextDecoder().decode(data);
+ setMessages((prev) => [...prev, message]);
+ },
+ { reliable: true },
+ );
+
+ return unsubscribe;
+ }, [subscribeData, dataChannelReady]);
+
+ const sendMessage = useCallback(
+ (text: string) => {
+ if (!dataChannelReady) return;
+
+ const encoded = new TextEncoder().encode(text);
+ publishData(encoded, { reliable: true });
+ },
+ [publishData, dataChannelReady],
+ );
+
+ return { messages, sendMessage, ready: dataChannelReady };
+}
+
+// ---cut---
+
+function ChatPanel() {
+ const { messages, sendMessage, ready } = useChat();
+ const [input, setInput] = useState("");
+
+ const handleSend = () => {
+ if (input.trim()) {
+ sendMessage(input);
+ setInput("");
+ }
+ };
+
+ if (!ready) {
+ return
Now we setup the callbacks. We need to forward incoming Fishjam audio to Google, and forward incoming Google audio to Fishjam.
```ts
- // @errors: 2307
import { FishjamClient } from '@fishjam-cloud/js-server-sdk';
import GI from '@fishjam-cloud/js-server-sdk/gemini';
diff --git a/versioned_docs/version-0.23.0/tutorials/_category_.json b/versioned_docs/version-0.26.0/tutorials/_category_.json
similarity index 100%
rename from versioned_docs/version-0.23.0/tutorials/_category_.json
rename to versioned_docs/version-0.26.0/tutorials/_category_.json
diff --git a/versioned_docs/version-0.23.0/tutorials/agents.mdx b/versioned_docs/version-0.26.0/tutorials/agents.mdx
similarity index 65%
rename from versioned_docs/version-0.23.0/tutorials/agents.mdx
rename to versioned_docs/version-0.26.0/tutorials/agents.mdx
index 0a4e565b..aa751d6f 100644
--- a/versioned_docs/version-0.23.0/tutorials/agents.mdx
+++ b/versioned_docs/version-0.26.0/tutorials/agents.mdx
@@ -2,6 +2,7 @@
type: tutorial
sidebar_position: 4
title: Agents
+description: Introduction to Fishjam agents and how to implement them using server SDKs.
---
import Tabs from "@theme/Tabs";
@@ -12,11 +13,7 @@ import Subscriptions from "../_common/agents/subscriptions.mdx";
# Fishjam Agent Introduction
-:::tip[Gemini Live Integration]
-If you intend to integrate with Gemini Live API, please check out the [Gemini Live Integration](../tutorials/gemini-live-integration) tutorial.
-:::
-
-:::info[Prerequisites]
+:::tip
We recommend going through the steps in the [Backend Quick Start](../tutorials/backend-quick-start)
before trying Fishjam agents, as you will need a working backend server to use them.
:::
@@ -70,7 +67,7 @@ Additionally, we will also create a peer so that the agent has someone to listen
If you are using the server SDKs, then creating an agent and defining its behavior is very simple.
By default, agents receive all peers' audio streams.
-However, it's likely that in your scenario you'll want to use the [Selective Subscriptions API](/how-to/features/selective-subscriptions.mdx) for fine-grained control over which peers/tracks they should receive audio from.
+However, it's likely that in your scenario you'll want to use the [Selective Subscriptions API](../how-to/backend/selective-subscriptions.mdx) for fine-grained control over which peers/tracks they should receive audio from.
@@ -130,6 +127,66 @@ However, it's likely that in your scenario you'll want to use the [Selective Sub
+### Multiple Agents in a Room
+
+You can create multiple agents inside a single room by creating agents with the same room ID multiple times.
+Each agent operates independently, with its own set of tracks and callbacks.
+
+
+
+
+ ```ts
+ import { FishjamClient } from '@fishjam-cloud/js-server-sdk';
+
+ const fishjamId = '';
+ const managementToken = '';
+ const fishjamClient = new FishjamClient({ fishjamId, managementToken });
+ const room = await fishjamClient.createRoom();
+
+ import type { AgentCallbacks, PeerOptions } from '@fishjam-cloud/js-server-sdk';
+
+ const agentOptions = {
+ subscribeMode: 'auto',
+ output: { audioFormat: 'pcm16', audioSampleRate: 16000 }
+ } satisfies PeerOptions;
+
+ const agentCallbacks = {
+ onError: console.error,
+ onClose: (code, reason) => console.log('Agent closed', code, reason)
+ } satisfies AgentCallbacks;
+
+ // ---cut---
+ const agentCallbacks1 = {
+ onError: console.error,
+ onClose: (code, reason) => console.log('Agent 1 closed', code, reason)
+ } satisfies AgentCallbacks;
+
+ const agentCallbacks2 = {
+ onError: console.error,
+ onClose: (code, reason) => console.log('Agent 2 closed', code, reason)
+ } satisfies AgentCallbacks;
+
+ const { agent: agent1 } = await fishjamClient.createAgent(room.id, agentOptions, agentCallbacks1);
+ const { agent: agent2 } = await fishjamClient.createAgent(room.id, agentOptions, agentCallbacks2);
+ ```
+
+
+
+
+
+ ```python
+ from fishjam import FishjamClient
+
+ fishjam_client = FishjamClient(fishjam_id, management_token)
+
+ agent1 = fishjam_client.create_agent(room_id)
+ agent2 = fishjam_client.create_agent(room_id)
+ ```
+
+
+
+
+
### Making the Agent speak
Apart from just listening, agents can also send audio data to peers.
@@ -210,6 +267,78 @@ You can interrupt the currently played audio chunk. See the example below.
+### Making the Agent see
+
+Agents can also request video frames (JPEG images) from peers' video tracks.
+Unlike audio, which streams continuously, video frames must be explicitly requested and arrive asynchronously.
+
+:::important
+Video frame capture is rate-limited to one frame per second per track.
+:::
+
+
+
+
+ ```ts
+ // @noErrors
+ import { RoomId, FishjamClient, TrackId } from '@fishjam-cloud/js-server-sdk';
+
+ const fishjamId = '';
+ const managementToken = '';
+ const fishjamClient = new FishjamClient({ fishjamId, managementToken });
+ const room = await fishjamClient.createRoom();
+ const { agent } = await fishjamClient.createAgent(room.id, {});
+ const trackId: TrackId = '' as TrackId;
+
+ // ---cut---
+ import type { IncomingTrackImage } from '@fishjam-cloud/js-server-sdk';
+
+ // Listen for incoming video frames
+ agent.on('trackImage', (message: IncomingTrackImage) => {
+ const { contentType, data } = message;
+ // process the image data
+ });
+
+ // Request a frame periodically
+ setInterval(() => {
+ // [!code highlight:1]
+ agent.captureImage(trackId);
+ }, 1000);
+
+ ```
+
+
+
+
+
+ ```python
+ import asyncio
+
+ from fishjam import FishjamClient
+ from fishjam.agent import IncomingTrackImage
+
+ fishjam_client = FishjamClient(fishjam_id, management_token)
+
+ agent = fishjam_client.create_agent(room_id)
+
+ async with agent.connect() as session:
+ # Request a frame
+ # [!code highlight:1]
+ await session.capture_image(track_id)
+
+ # Captured frames arrive as IncomingTrackImage messages
+ async for message in session.receive():
+ match message:
+ case IncomingTrackImage() as msg if msg.track_id == track_id:
+ data = msg.data
+ # process the image data
+ pass
+ ```
+
+
+
+
+
### Disconnecting
After you're done using an agent, you can disconnect it from the room.
@@ -263,7 +392,7 @@ If you are using Fishjam's REST API directly, then check out this [Agent Interna
Learn more about how agents work:
- [Agent Internals](../explanation/agent-internals)
-- [Selective Subscriptions API](/how-to/features/selective-subscriptions.mdx)
+- [Selective Subscriptions API](../how-to/backend/selective-subscriptions.mdx)
Writing a backend server with Fishjam:
diff --git a/versioned_docs/version-0.23.0/tutorials/backend-quick-start.mdx b/versioned_docs/version-0.26.0/tutorials/backend-quick-start.mdx
similarity index 98%
rename from versioned_docs/version-0.23.0/tutorials/backend-quick-start.mdx
rename to versioned_docs/version-0.26.0/tutorials/backend-quick-start.mdx
index 0087c9a2..6475e95c 100644
--- a/versioned_docs/version-0.23.0/tutorials/backend-quick-start.mdx
+++ b/versioned_docs/version-0.26.0/tutorials/backend-quick-start.mdx
@@ -1,6 +1,7 @@
---
type: tutorial
sidebar_position: 2
+description: Set up a backend server to create rooms and manage peers for your Fishjam application.
---
import Tabs from "@theme/Tabs";
@@ -552,4 +553,4 @@ Now that you have a working backend, explore these guides:
Or learn more about Fishjam concepts:
- [Understanding security and tokens](../explanation/security-tokens)
-- [Room types explained](../explanation/room-types)
+- [Rooms](../explanation/rooms)
diff --git a/versioned_docs/version-0.23.0/tutorials/livestreaming.mdx b/versioned_docs/version-0.26.0/tutorials/livestreaming.mdx
similarity index 65%
rename from versioned_docs/version-0.23.0/tutorials/livestreaming.mdx
rename to versioned_docs/version-0.26.0/tutorials/livestreaming.mdx
index 51307a2d..a160ea3e 100644
--- a/versioned_docs/version-0.23.0/tutorials/livestreaming.mdx
+++ b/versioned_docs/version-0.26.0/tutorials/livestreaming.mdx
@@ -2,6 +2,7 @@
type: tutorial
sidebar_position: 3
title: Livestreaming
+description: Set up livestreaming with Fishjam, from sandbox prototyping to production deployment with server SDKs.
---
import Tabs from "@theme/Tabs";
@@ -17,13 +18,13 @@ and how to get ready for production in [Production Livestreaming with Server SDK
Fishjam implements two real-time streaming standards: WHIP (for publishing) and WHEP (for receiving).
In this tutorial we explain how to publish and view streams with the client SDKs, which wrap these standards.
-If you prefer to use WHIP or WHEP directly, then you should read [WHIP/WHEP with Fishjam](../how-to/features/whip-whep).
+If you prefer to use WHIP or WHEP directly, then you should read [WHIP/WHEP with Fishjam](../how-to/backend/whip-whep).
:::
:::info Cost-effective audio livestreams
Fishjam supports audio-only livestreams at a reduced cost of $0.20 per 1000 minutes of the streamer and each listener (compared to $0.80 for video livestreams).
This is ideal for podcasts, radio-style broadcasts, or any scenario where video isn't necessary.
-See [Audio-only calls](../how-to/features/audio-only-calls) for more information.
+See [Audio-only calls](../how-to/backend/audio-only-calls) for more information.
:::
@@ -63,7 +64,7 @@ The easiest way to obtain a sandbox streamer token is by using the Sandbox API i
// ---cut---
import { useSandbox } from '@fishjam-cloud/react-native-client';
- const { getSandboxLivestream } = useSandbox({ fishjamId: FISHJAM_ID });
+ const { getSandboxLivestream } = useSandbox();
const { streamerToken } = await getSandboxLivestream('example-room');
```
@@ -151,26 +152,112 @@ We can now start sending media, which we can obtain from the user's camera, scre
```tsx
import React from 'react';
+ import { View, Text } from 'react-native';
+ import {
+ useInitializeDevices,
+ useSandbox,
+ useLivestreamStreamer,
+ useCamera,
+ useMicrophone,
+ RTCView,
+ } from '@fishjam-cloud/react-native-client';
+
+ const roomName = 'my-room';
+
+ // Inside your component:
+ const { getSandboxLivestream } = useSandbox();
+ const { connect } = useLivestreamStreamer();
+ const { cameraStream } = useCamera();
+ const { microphoneStream } = useMicrophone();
+ const { initializeDevices } = useInitializeDevices();
+
+ // ...
+ await initializeDevices({ enableVideo: true, enableAudio: true });
+
+ const { streamerToken } = await getSandboxLivestream(roomName);
+ await connect({
+ inputs: {
+ video: cameraStream!,
+ audio: microphoneStream!,
+ },
+ token: streamerToken,
+ });
+
+ // Render the livestream
+
+ {cameraStream ? (
+
+ ) : (
+ No video
+ )}
+
+ ```
+
+
+
+ :::tip[Background streaming during screen sharing on iOS]
+
+ If you want to continue screen sharing when the app goes to the background, you need to:
+
+ 1. Enable VoIP background mode by setting `enableVoIPBackgroundMode: true` in the plugin configuration or adding the VoIP background mode to your `Info.plist`
+ 2. Use the [`useCallKitService`](../../api/mobile/functions/useCallKitService) hook in your component to manage the CallKit session
+
+ See the [background calls documentation](../how-to/client/background-streaming) for detailed instructions and code examples.
- // All components and hooks needed for livestreaming can be imported from the livestream module
+ :::
+
+ ```tsx
+ import React from 'react';
+ import { View, Text } from 'react-native';
import {
- LivestreamStreamer,
+ useSandbox,
useLivestreamStreamer,
- cameras,
- } from '@fishjam-cloud/react-native-client/livestream';
+ useScreenShare,
+ useInitializeDevices,
+ RTCView,
+ } from '@fishjam-cloud/react-native-client';
- const streamerToken = '';
- const roomId = '';
- const { connect, whipClientRef } = useLivestreamStreamer({ videoEnabled: true, audioEnabled: true, camera: cameras[0] });
+ const roomName = 'my-room';
+
+ // Inside your component:
+ const { initializeDevices } = useInitializeDevices();
+ const { getSandboxLivestream } = useSandbox();
+ const { connect } = useLivestreamStreamer();
+ const {
+ startStreaming: startScreenCapture,
+ stream: screenStream,
+ } = useScreenShare();
// ...
+ await initializeDevices({ enableVideo: true, enableAudio: true });
+ await startScreenCapture();
- await connect(streamerToken);
+ const { streamerToken } = await getSandboxLivestream(roomName);
+ await connect({
+ inputs: {
+ video: screenStream!,
+ },
+ token: streamerToken,
+ });
// Render the livestream
-
+
+ {screenStream ? (
+
+ ) : (
+ No video
+ )}
+
```
@@ -189,7 +276,7 @@ To receive the published livestream, we need one thing: a _viewer token_.
In this guide, we've created a _private_ livestream, where viewers need a token to join.
A livestream may also be _public_, where anyone can join if they know the livestream's room id.
-You can learn more about public livestreams in [Private vs Public Livestreams](../explanation/public-livestreams).
+You can learn more about public livestreams in [Livestreams](../explanation/livestreams).
:::
#### Obtaining a token
@@ -218,7 +305,7 @@ We obtain a sandbox viewer token using the Sandbox API in the client SDKs:
// ---cut---
import { useSandbox } from '@fishjam-cloud/react-native-client';
- const { getSandboxViewerToken } = useSandbox({ fishjamId: FISHJAM_ID });
+ const { getSandboxViewerToken } = useSandbox();
const viewerToken = await getSandboxViewerToken('example-room');
```
@@ -250,26 +337,40 @@ We can now begin receiving the stream
```tsx
import React from 'react';
-
- const viewerToken = '';
-
- // ---cut---
+ import { View, Text } from 'react-native';
import {
- LivestreamViewer,
useLivestreamViewer,
- } from '@fishjam-cloud/react-native-client/livestream';
+ useSandbox,
+ RTCView,
+ } from '@fishjam-cloud/react-native-client';
- const { connect, whepClientRef } = useLivestreamViewer();
+ const roomName = 'my-room';
- await connect({ token: viewerToken });
+ // Inside your component:
+ const { getSandboxViewerToken } = useSandbox();
+ const { connect, stream } = useLivestreamViewer();
+
+ const token = await getSandboxViewerToken(roomName);
+ await connect({ token });
// Render the livestream
-
+
+ {stream ? (
+
+ ) : (
+ No video
+ )}
+
```
:::tip[Picture in Picture on React Native]
-The `LivestreamViewer` component supports Picture in Picture, allowing viewers to watch the livestream in a floating window while using other apps. See the [Picture in Picture guide](../how-to/react-native/picture-in-picture) to learn how to enable and configure this feature.
+You can use `RTCPIPView` to enable Picture in Picture, allowing viewers to watch the livestream in a floating window while using other apps. See the [Picture in Picture guide](../how-to/client/picture-in-picture) to learn how to enable and configure this feature.
:::
@@ -347,15 +448,15 @@ Then, you can start streaming as described in [Starting the stream](#starting-th
Learn how to use WHIP/WHEP with Fishjam:
-- [WHIP/WHEP with Fishjam](../how-to/features/whip-whep)
+- [WHIP/WHEP with Fishjam](../how-to/backend/whip-whep)
If you want to get a better understanding of livestreaming with Fishjam, make sure to check out:
-- [Room Types Explained](../explanation/room-types)
-- [Private vs Public Livestreams](../explanation/public-livestreams)
+- [Rooms](../explanation/rooms)
+- [Livestreams](../explanation/livestreams)
If you have a different use case, then you should see
- [React Quickstart](../tutorials/react-quick-start)
- [React Native Quickstart](../tutorials/react-native-quick-start)
-- [Audio-only Calls](../how-to/features/audio-only-calls)
+- [Audio-only Calls](../how-to/backend/audio-only-calls)
diff --git a/versioned_docs/version-0.26.0/tutorials/react-native-quick-start.mdx b/versioned_docs/version-0.26.0/tutorials/react-native-quick-start.mdx
new file mode 100644
index 00000000..75af9753
--- /dev/null
+++ b/versioned_docs/version-0.26.0/tutorials/react-native-quick-start.mdx
@@ -0,0 +1,451 @@
+---
+type: tutorial
+sidebar_position: 0
+description: Step-by-step guide to integrating Fishjam into a React Native application with a working video streaming app.
+---
+
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+
+# React Native Quick Start
+
+This tutorial will guide you through integrating Fishjam into your React Native application step by step.
+By the end, you'll have a working video streaming app and understand the core concepts.
+
+## What you'll build
+
+A simple React Native app that can join conference calls and stream audio/video between participants.
+
+## What you'll learn
+
+- How to install and configure Fishjam SDK
+- How to join a room and start streaming
+- How to display video and play audio from other participants
+- How to check connection status
+
+## Prerequisites
+
+- React Native development environment set up
+- Access to [Fishjam Dashboard](https://fishjam.io/app)
+
+## Step 1: Install and configure
+
+### Install the package
+
+```bash npm2yarn
+npm install @fishjam-cloud/react-native-client
+```
+
+### Configure app permissions
+
+Your app needs to have permissions configured in order to use the microphone and camera.
+
+#### Android
+
+
+
+
+Add required permissions to the `app.json` file:
+
+```json title='app.json'
+{
+ "expo": {
+ "android": {
+ "permissions": [
+ "android.permission.CAMERA",
+ "android.permission.RECORD_AUDIO",
+ "android.permission.MODIFY_AUDIO_SETTINGS",
+ "android.permission.ACCESS_NETWORK_STATE"
+ ]
+ }
+ }
+}
+```
+
+
+
+
+Add required permissions to the `AndroidManifest.xml` file:
+
+```xml title='AndroidManifest.xml'
+
+
+
+```
+
+
+
+
+#### iOS
+
+
+
+
+Add camera and microphone usage descriptions to `app.json`:
+
+```json title='app.json'
+{
+ "expo": {
+ "ios": {
+ "infoPlist": {
+ "NSCameraUsageDescription": "Allow $(PRODUCT_NAME) to access your camera.",
+ "NSMicrophoneUsageDescription": "Allow $(PRODUCT_NAME) to access your microphone."
+ }
+ }
+ }
+}
+```
+
+
+
+
+Ensure `Info.plist` contains camera and microphone usage description entries:
+
+```xml title='Info.plist'
+NSCameraUsageDescription
+Allow $(PRODUCT_NAME) to access your camera.
+NSMicrophoneUsageDescription
+Allow $(PRODUCT_NAME) to access your microphone.
+```
+
+
+
+
+### Build native dependencies
+
+
+
+
+```bash
+npx expo prebuild
+```
+
+
+
+
+```bash
+cd ios && pod install
+```
+
+
+
+
+### Get your Fishjam ID
+
+1. Log in to [Fishjam Dashboard](https://fishjam.io/app)
+2. Navigate to your Sandbox environment
+3. Copy your Fishjam ID
+
+### Set up Fishjam context
+
+Wrap your app in the `FishjamProvider` component:
+
+```tsx
+import React from "react";
+import { FishjamProvider } from "@fishjam-cloud/react-native-client";
+
+const App = () => null;
+
+// ---cut---
+
+// Check https://fishjam.io/app/ for your Fishjam ID
+const FISHJAM_ID = "YOUR_FISHJAM_ID";
+
+export default function Root() {
+ return (
+
+
+
+ );
+}
+```
+
+:::important
+This won't work on the iOS Simulator, as the Simulator can't access the camera. Test on a real device.
+:::
+
+For more detailed implementation follow the steps below.
+
+## Step 2: Join a room and start streaming
+
+Create a component that joins a room and starts streaming video:
+
+```tsx
+import React from "react";
+import { Button } from "react-native";
+import {
+ useConnection,
+ useSandbox,
+ useInitializeDevices,
+} from "@fishjam-cloud/react-native-client";
+
+export function JoinRoomButton() {
+ const { joinRoom } = useConnection();
+ const { initializeDevices } = useInitializeDevices();
+ const { getSandboxPeerToken } = useSandbox();
+
+ const handleJoinRoom = async () => {
+ const roomName = "testRoom";
+ const peerName = "testUser";
+
+ // In sandbox environment, you can get the peer token from our sandbox API
+ // In production environment, you need to get it from your backend
+ const peerToken = await getSandboxPeerToken(roomName, peerName);
+
+ // Start camera by selecting the first available camera
+ await initializeDevices({ enableAudio: false }); // or just initializeDevices(); if you want both camera and mic
+
+ // Join the room
+ await joinRoom({ peerToken });
+ };
+
+ return ;
+}
+```
+
+## Step 3: Check connection status
+
+Monitor your connection status:
+
+```tsx
+import React from "react";
+import { Text } from "react-native";
+import { useConnection } from "@fishjam-cloud/react-native-client";
+
+// ---cut---
+export function ConnectionStatus() {
+ const { peerStatus } = useConnection();
+ return Status: {peerStatus};
+}
+```
+
+## Step 4: Display your video
+
+Show your own video stream:
+
+```tsx
+import React from "react";
+import { Text, View } from "react-native";
+import { RTCView, useCamera } from "@fishjam-cloud/react-native-client";
+
+export function StreamPreview() {
+ const { cameraStream } = useCamera();
+
+ return (
+
+ {cameraStream ? (
+
+ ) : (
+ No camera stream
+ )}
+
+ );
+}
+```
+
+## Step 5: Display other participants
+
+Show video from other peers in the room:
+
+```tsx
+import React from "react";
+import { View, Text } from "react-native";
+import {
+ usePeers,
+ RTCView,
+ type MediaStream,
+} from "@fishjam-cloud/react-native-client";
+
+function VideoPlayer({ stream }: { stream: MediaStream | null | undefined }) {
+ return (
+
+ {stream ? (
+
+ ) : (
+ No video
+ )}
+
+ );
+}
+
+export function ParticipantsView() {
+ const { remotePeers } = usePeers();
+
+ return (
+
+ {remotePeers.map((peer) => (
+
+ {peer.cameraTrack?.stream && (
+
+ )}
+
+ ))}
+
+ );
+}
+```
+
+## Complete example
+
+Here's a complete working app:
+
+```tsx
+import React, { useState } from "react";
+import { View, Text, Button, ScrollView, StyleSheet } from "react-native";
+import {
+ FishjamProvider,
+ useConnection,
+ useCamera,
+ usePeers,
+ useInitializeDevices,
+ useSandbox,
+ RTCView,
+ type MediaStream,
+} from "@fishjam-cloud/react-native-client";
+
+// Check https://fishjam.io/app/ for your Fishjam ID
+const FISHJAM_ID = "YOUR_FISHJAM_ID";
+
+// ---cut---
+function VideoPlayer({ stream }: { stream: MediaStream | null | undefined }) {
+ if (!stream) {
+ return (
+
+ No video
+
+ );
+ }
+
+ return (
+
+ );
+}
+
+function VideoCall() {
+ const { joinRoom, peerStatus } = useConnection();
+ const { cameraStream } = useCamera();
+ const { remotePeers } = usePeers();
+ const { initializeDevices } = useInitializeDevices();
+ const { getSandboxPeerToken } = useSandbox();
+
+ const [isJoined, setIsJoined] = useState(false);
+
+ const handleJoin = async () => {
+ const roomName = "testRoom";
+ const peerName = `user_${Date.now()}`;
+
+ // Initialize devices first
+ await initializeDevices();
+
+ // In sandbox environment, you can get the peer token from our sandbox API
+ // In production environment, you need to get it from your backend
+ const peerToken = await getSandboxPeerToken(roomName, peerName);
+
+ await joinRoom({ peerToken });
+ setIsJoined(true);
+ };
+
+ return (
+
+ Fishjam Video Call
+ Status: {peerStatus}
+
+ {!isJoined && }
+
+ {cameraStream && (
+
+ Your Video
+
+
+ )}
+
+
+ Other Participants
+ {remotePeers.length === 0 ? (
+ No other participants
+ ) : (
+ remotePeers.map((peer) => (
+
+ {peer.cameraTrack?.stream && (
+
+ )}
+
+ ))
+ )}
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ padding: 20,
+ },
+ title: {
+ fontSize: 24,
+ fontWeight: "bold",
+ marginBottom: 10,
+ },
+ status: {
+ fontSize: 16,
+ marginBottom: 20,
+ },
+ section: {
+ marginTop: 20,
+ },
+ sectionTitle: {
+ fontSize: 18,
+ fontWeight: "600",
+ marginBottom: 10,
+ },
+ participant: {
+ marginBottom: 10,
+ },
+ video: {
+ height: 200,
+ width: "100%",
+ borderRadius: 8,
+ },
+ videoPlaceholder: {
+ height: 200,
+ width: "100%",
+ backgroundColor: "#000",
+ borderRadius: 8,
+ justifyContent: "center",
+ alignItems: "center",
+ },
+});
+
+export default function App() {
+ return (
+
+
+
+ );
+}
+```
+
+## Next steps
+
+Now that you have a basic app working, explore these how-to guides:
+
+- [How to handle screen sharing](../how-to/client/screensharing)
+- [How to implement background streaming](../how-to/client/background-streaming)
+- [How to handle reconnections](../how-to/client/reconnection-handling)
+- [How to work with metadata](../how-to/client/metadata)
+- [Explore React Native examples](../examples/react-native)
+
+Or learn more about Fishjam concepts:
+
+- [Understanding Fishjam architecture](../explanation/architecture)
+- [Rooms](../explanation/rooms)
diff --git a/versioned_docs/version-0.23.0/tutorials/react-quick-start.mdx b/versioned_docs/version-0.26.0/tutorials/react-quick-start.mdx
similarity index 94%
rename from versioned_docs/version-0.23.0/tutorials/react-quick-start.mdx
rename to versioned_docs/version-0.26.0/tutorials/react-quick-start.mdx
index 6d0851f5..fb5930ad 100644
--- a/versioned_docs/version-0.23.0/tutorials/react-quick-start.mdx
+++ b/versioned_docs/version-0.26.0/tutorials/react-quick-start.mdx
@@ -1,6 +1,7 @@
---
type: tutorial
sidebar_position: 1
+description: Step-by-step guide to integrating Fishjam into a React web application with a working video streaming app.
---
import Tabs from "@theme/Tabs";
@@ -274,12 +275,13 @@ export default function App() {
Now that you have a basic app working, explore these how-to guides:
-- [How to manage media devices](../how-to/react/managing-devices)
+- [How to manage media devices](../how-to/client/managing-devices)
- [How to implement livestreaming](../tutorials/livestreaming)
-- [How to work with stream middleware](../how-to/react/stream-middleware)
-- [How to handle custom sources](../how-to/react/custom-sources)
+- [How to work with stream middleware](../how-to/client/stream-middleware)
+- [How to handle custom sources](../how-to/client/custom-sources)
+- [Explore React examples](../examples/react)
Or learn more about Fishjam concepts:
- [Understanding Fishjam architecture](../explanation/architecture)
-- [Room types explained](../explanation/room-types)
+- [Rooms](../explanation/rooms)
diff --git a/versioned_sidebars/version-0.23.0-sidebars.json b/versioned_sidebars/version-0.26.0-sidebars.json
similarity index 100%
rename from versioned_sidebars/version-0.23.0-sidebars.json
rename to versioned_sidebars/version-0.26.0-sidebars.json
diff --git a/versions.json b/versions.json
index 5e258a8a..d74adc81 100644
--- a/versions.json
+++ b/versions.json
@@ -1 +1 @@
-["0.25.0", "0.24.0", "0.23.0"]
+["0.26.0", "0.25.0", "0.24.0"]