From 9fc4ae434882a2b11a49fcd01065e8f4dd681467 Mon Sep 17 00:00:00 2001 From: Adrian Czerwiec Date: Thu, 18 Dec 2025 14:42:35 +0100 Subject: [PATCH 01/13] add debug logging article --- docs/how-to/react/debugging.mdx | 53 +++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 docs/how-to/react/debugging.mdx diff --git a/docs/how-to/react/debugging.mdx b/docs/how-to/react/debugging.mdx new file mode 100644 index 00000000..3d4ca8b0 --- /dev/null +++ b/docs/how-to/react/debugging.mdx @@ -0,0 +1,53 @@ +# Debugging and Logging + +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 { FishjamProvider } from "@fishjam-cloud/react-client"; + +function Root() { + return ( + + + + ); +} +``` + +We recommend toggling this based on your environment variables: + +```tsx + + + +``` + +## 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 + +``` From 24d07cf333e9435ba93be07255e93238b00f9e01 Mon Sep 17 00:00:00 2001 From: Adrian Czerwiec Date: Thu, 18 Dec 2025 14:50:55 +0100 Subject: [PATCH 02/13] add docs about the debug option --- docs/how-to/react/{debugging.mdx => debug-logging.mdx} | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) rename docs/how-to/react/{debugging.mdx => debug-logging.mdx} (97%) diff --git a/docs/how-to/react/debugging.mdx b/docs/how-to/react/debug-logging.mdx similarity index 97% rename from docs/how-to/react/debugging.mdx rename to docs/how-to/react/debug-logging.mdx index 3d4ca8b0..01a08794 100644 --- a/docs/how-to/react/debugging.mdx +++ b/docs/how-to/react/debug-logging.mdx @@ -1,4 +1,8 @@ -# Debugging and Logging +--- +sidebar_position: 9 +--- + +# Debug logging 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. From 2521cca3675eec1832d00cbd5fd858ddd5dfb74d Mon Sep 17 00:00:00 2001 From: Adrian Czerwiec Date: Thu, 18 Dec 2025 15:13:20 +0100 Subject: [PATCH 03/13] add cut part --- docs/how-to/react/debug-logging.mdx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/how-to/react/debug-logging.mdx b/docs/how-to/react/debug-logging.mdx index 01a08794..a4ab9234 100644 --- a/docs/how-to/react/debug-logging.mdx +++ b/docs/how-to/react/debug-logging.mdx @@ -32,12 +32,16 @@ function Root() { We recommend toggling this based on your environment variables: ```tsx +const process = { + env: { NODE_ENV: "development", FISHJAM_ID: "your-fishjam-id" }, +}; +// ---cut--- - +; ``` ## Behavior From 734bf1eb9c87585935bb1d3a707baa626d8c6b97 Mon Sep 17 00:00:00 2001 From: Adrian Czerwiec Date: Thu, 18 Dec 2025 15:16:56 +0100 Subject: [PATCH 04/13] remove whiteline --- docs/how-to/react/debug-logging.mdx | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/how-to/react/debug-logging.mdx b/docs/how-to/react/debug-logging.mdx index a4ab9234..d6500fe6 100644 --- a/docs/how-to/react/debug-logging.mdx +++ b/docs/how-to/react/debug-logging.mdx @@ -57,5 +57,4 @@ When enabled, you may see logs similar to: [FISHJAM] Socket closed with reason: ... [FISHJAM] Couldn't get camera permission: NotAllowedError ... [FISHJAM] ICE connection: disconnected - ``` From 205ff65123c527e39745b88c0dd64f2551a9146b Mon Sep 17 00:00:00 2001 From: Adrian Czerwiec Date: Thu, 18 Dec 2025 15:32:00 +0100 Subject: [PATCH 05/13] add react --- docs/how-to/react/debug-logging.mdx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/how-to/react/debug-logging.mdx b/docs/how-to/react/debug-logging.mdx index d6500fe6..5eed183d 100644 --- a/docs/how-to/react/debug-logging.mdx +++ b/docs/how-to/react/debug-logging.mdx @@ -15,6 +15,8 @@ By default, the SDK suppresses internal logs to keep your browser console clean To enable debugging in a React application, pass the `debug` prop to the `FishjamProvider`. ```tsx +import React from "react"; +// ---cut--- import { FishjamProvider } from "@fishjam-cloud/react-client"; function Root() { @@ -32,6 +34,7 @@ function Root() { We recommend toggling this based on your environment variables: ```tsx +import React from "react"; const process = { env: { NODE_ENV: "development", FISHJAM_ID: "your-fishjam-id" }, }; From df0c15f02362e884eb77d0996b490ee90267bbd5 Mon Sep 17 00:00:00 2001 From: Adrian Czerwiec Date: Thu, 18 Dec 2025 15:40:56 +0100 Subject: [PATCH 06/13] add missing vars --- docs/how-to/react/debug-logging.mdx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/how-to/react/debug-logging.mdx b/docs/how-to/react/debug-logging.mdx index 5eed183d..da35fa1e 100644 --- a/docs/how-to/react/debug-logging.mdx +++ b/docs/how-to/react/debug-logging.mdx @@ -16,6 +16,7 @@ To enable debugging in a React application, pass the `debug` prop to the `Fishja ```tsx import React from "react"; +const App = () => null; // ---cut--- import { FishjamProvider } from "@fishjam-cloud/react-client"; @@ -35,9 +36,11 @@ 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--- Date: Thu, 18 Dec 2025 15:58:06 +0100 Subject: [PATCH 07/13] remove stale versoins --- .../version-0.20.0/api/_category_.json | 12 - .../api/mobile/functions/FishjamRoom.md | 31 - .../mobile/functions/LivestreamStreamer.md | 17 - .../api/mobile/functions/LivestreamViewer.md | 17 - .../api/mobile/functions/useAudioSettings.md | 66 --- .../functions/useBandwidthEstimation.md | 17 - .../api/mobile/functions/useCamera.md | 90 --- .../api/mobile/functions/useConnection.md | 51 -- .../mobile/functions/useLivestreamStreamer.md | 18 - .../mobile/functions/useLivestreamViewer.md | 11 - .../api/mobile/functions/useMicrophone.md | 45 -- .../api/mobile/functions/usePeers.md | 39 -- .../api/mobile/functions/useSandbox.md | 60 -- .../api/mobile/functions/useScreenShare.md | 44 -- .../mobile/functions/useUpdatePeerMetadata.md | 31 - .../version-0.20.0/api/mobile/index.md | 87 --- .../interfaces/useLivestreamStreamerResult.md | 42 -- .../interfaces/useLivestreamViewerResult.md | 40 -- .../mobile/type-aliases/AppScreenShareData.md | 39 -- .../mobile/type-aliases/AudioOutputDevice.md | 21 - .../type-aliases/AudioOutputDeviceType.md | 5 - .../mobile/type-aliases/AudioSessionMode.md | 5 - .../api/mobile/type-aliases/AudioTrack.md | 15 - .../api/mobile/type-aliases/Brand.md | 20 - .../api/mobile/type-aliases/Camera.md | 29 - .../api/mobile/type-aliases/CameraConfig.md | 13 - .../mobile/type-aliases/CameraConfigBase.md | 78 --- .../type-aliases/CameraFacingDirection.md | 5 - .../api/mobile/type-aliases/CameraId.md | 5 - .../type-aliases/ConnectViewerConfig.md | 5 - .../mobile/type-aliases/ConnectionConfig.md | 26 - .../type-aliases/DistinguishedTracks.md | 37 -- .../api/mobile/type-aliases/EncodingReason.md | 11 - .../mobile/type-aliases/FishjamRoomProps.md | 25 - .../type-aliases/ForegroundServiceConfig.md | 67 --- .../mobile/type-aliases/GenericMetadata.md | 5 - .../api/mobile/type-aliases/JoinRoomConfig.md | 31 - .../type-aliases/LivestreamStreamerProps.md | 17 - .../type-aliases/LivestreamViewerProps.md | 85 --- .../type-aliases/LivestreamViewerRef.md | 5 - .../api/mobile/type-aliases/Peer.md | 52 -- .../api/mobile/type-aliases/PeerId.md | 5 - .../api/mobile/type-aliases/PeerStatus.md | 12 - .../mobile/type-aliases/PeerTrackMetadata.md | 28 - .../api/mobile/type-aliases/PeerWithTracks.md | 12 - .../mobile/type-aliases/ReconnectionStatus.md | 11 - .../api/mobile/type-aliases/RoomType.md | 5 - .../mobile/type-aliases/ScreenShareOptions.md | 21 - .../mobile/type-aliases/ScreenShareQuality.md | 5 - .../mobile/type-aliases/SimulcastConfig.md | 21 - .../api/mobile/type-aliases/Track.md | 5 - .../api/mobile/type-aliases/TrackBase.md | 37 -- .../api/mobile/type-aliases/TrackId.md | 5 - .../api/mobile/type-aliases/TrackMetadata.md | 21 - .../api/mobile/type-aliases/TrackType.md | 5 - .../api/mobile/type-aliases/UsePeersResult.md | 38 -- .../mobile/type-aliases/UseSandboxProps.md | 5 - .../api/mobile/type-aliases/VadStatus.md | 10 - .../api/mobile/type-aliases/VideoLayout.md | 9 - .../type-aliases/VideoPreviewViewProps.md | 41 -- .../api/mobile/type-aliases/VideoQuality.md | 5 - .../mobile/type-aliases/VideoRendererProps.md | 47 -- .../api/mobile/type-aliases/VideoTrack.md | 15 - .../api/mobile/typedoc-sidebar.cjs | 4 - .../api/mobile/variables/VideoPreviewView.md | 12 - .../api/mobile/variables/VideoRendererView.md | 20 - .../api/mobile/variables/cameras.md | 7 - .../api/mobile/variables/useAppScreenShare.md | 15 - .../mobile/variables/useCameraPermissions.md | 25 - .../mobile/variables/useForegroundService.md | 18 - .../variables/useMicrophonePermissions.md | 25 - .../api/server/classes/BadRequestException.md | 179 ------ .../server/classes/FishjamBaseException.md | 178 ------ .../api/server/classes/FishjamClient.md | 218 ------- .../classes/FishjamNotFoundException.md | 179 ------ .../api/server/classes/FishjamWSNotifier.md | 432 -------------- .../api/server/classes/ForbiddenException.md | 179 ------ .../classes/MissingFishjamIdException.md | 137 ----- .../server/classes/PeerNotFoundException.md | 179 ------ .../server/classes/RoomNotFoundException.md | 179 ------ .../classes/ServiceUnavailableException.md | 179 ------ .../server/classes/UnauthorizedException.md | 179 ------ .../api/server/classes/UnknownException.md | 179 ------ .../api/server/enumerations/PeerStatus.md | 23 - .../version-0.20.0/api/server/index.md | 38 -- .../api/server/interfaces/RoomConfig.md | 79 --- .../api/server/interfaces/StreamerToken.md | 21 - .../api/server/interfaces/ViewerToken.md | 21 - .../api/server/type-aliases/Brand.md | 20 - .../server/type-aliases/CloseEventHandler.md | 16 - .../server/type-aliases/ErrorEventHandler.md | 15 - .../api/server/type-aliases/ExpectedEvents.md | 5 - .../api/server/type-aliases/FishjamConfig.md | 29 - .../server/type-aliases/NotificationEvents.md | 5 - .../api/server/type-aliases/Peer.md | 11 - .../api/server/type-aliases/PeerId.md | 7 - .../api/server/type-aliases/PeerOptions.md | 7 - .../api/server/type-aliases/Room.md | 29 - .../type-aliases/RoomConfigRoomTypeEnum.md | 5 - .../type-aliases/RoomConfigVideoCodecEnum.md | 5 - .../api/server/type-aliases/RoomId.md | 8 - .../api/server/typedoc-sidebar.cjs | 4 - .../variables/RoomConfigRoomTypeEnum.md | 27 - .../variables/RoomConfigVideoCodecEnum.md | 15 - .../api/web/enumerations/Variant.md | 43 -- .../api/web/functions/FishjamProvider.md | 17 - .../api/web/functions/useCamera.md | 96 --- .../api/web/functions/useConnection.md | 53 -- .../api/web/functions/useCustomSource.md | 44 -- .../api/web/functions/useInitializeDevices.md | 25 - .../web/functions/useLivestreamStreamer.md | 11 - .../api/web/functions/useLivestreamViewer.md | 11 - .../api/web/functions/useMicrophone.md | 112 ---- .../api/web/functions/usePeers.md | 39 -- .../api/web/functions/useSandbox.md | 60 -- .../api/web/functions/useScreenShare.md | 81 --- .../web/functions/useUpdatePeerMetadata.md | 31 - .../api/web/functions/useVAD.md | 31 - .../version-0.20.0/api/web/index.md | 69 --- .../web/interfaces/FishjamProviderProps.md | 97 --- .../api/web/interfaces/JoinRoomConfig.md | 39 -- .../api/web/interfaces/SimulcastConfig.md | 27 - .../interfaces/UseLivestreamStreamerResult.md | 62 -- .../interfaces/UseLivestreamViewerResult.md | 70 --- .../api/web/type-aliases/AuthErrorReason.md | 5 - .../api/web/type-aliases/BandwidthLimits.md | 21 - .../api/web/type-aliases/Brand.md | 18 - .../web/type-aliases/ConnectStreamerConfig.md | 23 - .../web/type-aliases/ConnectViewerConfig.md | 5 - .../api/web/type-aliases/CustomSource.md | 40 -- .../api/web/type-aliases/DeviceError.md | 5 - .../api/web/type-aliases/DeviceItem.md | 21 - .../type-aliases/InitializeDevicesResult.md | 29 - .../type-aliases/InitializeDevicesSettings.md | 21 - .../type-aliases/InitializeDevicesStatus.md | 5 - .../api/web/type-aliases/JoinErrorReason.md | 5 - .../api/web/type-aliases/Metadata.md | 28 - .../api/web/type-aliases/MiddlewareResult.md | 25 - .../api/web/type-aliases/PeerId.md | 5 - .../api/web/type-aliases/PeerStatus.md | 12 - .../api/web/type-aliases/PeerWithTracks.md | 84 --- .../type-aliases/PersistLastDeviceHandlers.md | 42 -- .../api/web/type-aliases/ReconnectConfig.md | 37 -- .../web/type-aliases/ReconnectionStatus.md | 5 - .../api/web/type-aliases/RoomType.md | 5 - .../type-aliases/SimulcastBandwidthLimit.md | 9 - .../type-aliases/SimulcastBandwidthLimits.md | 29 - .../api/web/type-aliases/StreamConfig.md | 13 - .../api/web/type-aliases/StreamerInputs.md | 31 - .../api/web/type-aliases/Track.md | 53 -- .../web/type-aliases/TrackBandwidthLimit.md | 8 - .../api/web/type-aliases/TrackId.md | 5 - .../api/web/type-aliases/TrackMiddleware.md | 5 - .../api/web/type-aliases/TracksMiddleware.md | 16 - .../type-aliases/TracksMiddlewareResult.md | 33 -- .../UseInitializeDevicesParams.md | 21 - .../api/web/type-aliases/UseSandboxProps.md | 17 - .../api/web/typedoc-sidebar.cjs | 4 - .../api/web/variables/SimulcastConfig.md | 5 - .../explanation/_category_.json | 11 - .../explanation/architecture.mdx | 91 --- .../version-0.20.0/explanation/glossary.md | 35 -- .../explanation/public-livestreams.mdx | 224 ------- .../version-0.20.0/explanation/room-types.mdx | 130 ---- .../explanation/sandbox-api-concept.mdx | 81 --- .../explanation/security-tokens.mdx | 122 ---- .../explanation/what-is-fishjam.mdx | 67 --- .../version-0.20.0/how-to/_category_.json | 11 - .../how-to/_common/metadata/header.mdx | 10 - .../how-to/_common/metadata/joining_room.mdx | 5 - .../how-to/_common/metadata/reading.mdx | 9 - .../how-to/_common/metadata/updating.mdx | 5 - .../how-to/backend/_category_.json | 4 - .../how-to/backend/fastapi-example.mdx | 99 ---- .../how-to/backend/fastify-example.mdx | 240 -------- .../how-to/backend/production-deployment.mdx | 300 ---------- .../how-to/backend/server-setup.mdx | 295 --------- .../how-to/features/_category_.json | 4 - .../how-to/features/audio-only-calls.mdx | 61 -- .../how-to/features/sandbox-api-testing.mdx | 323 ---------- .../how-to/features/whip-whep.mdx | 228 ------- .../how-to/react-native/_category_.json | 4 - .../_components/configure-permissions.mdx | 91 --- .../_components/install-package.mdx | 27 - .../react-native/assets/ios-new-folder.png | Bin 32047 -> 0 bytes .../react-native/assets/ios-new-group.png | Bin 117421 -> 0 bytes .../react-native/assets/ios-new-target.png | Bin 55333 -> 0 bytes .../react-native/background-streaming.mdx | 98 --- .../how-to/react-native/connecting.mdx | 92 --- .../custom-video-sources/_category_.json | 4 - .../custom-video-sources/index.mdx | 14 - .../custom-video-sources/overview.mdx | 94 --- .../custom-video-sources/vision-camera.mdx | 183 ------ .../how-to/react-native/installation.mdx | 105 ---- .../how-to/react-native/list-other-peers.mdx | 48 -- .../metadata-and-broadcasting.mdx | 101 ---- .../react-native/reconnection-handling.mdx | 38 -- .../how-to/react-native/screensharing.mdx | 192 ------ .../how-to/react-native/start-streaming.mdx | 109 ---- .../how-to/react/_category_.json | 4 - .../how-to/react/_common/metadata/header.mdx | 10 - .../react/_common/metadata/joining_room.mdx | 5 - .../how-to/react/_common/metadata/reading.mdx | 9 - .../react/_common/metadata/updating.mdx | 5 - .../how-to/react/connecting.mdx | 52 -- .../how-to/react/custom-sources.mdx | 175 ------ .../how-to/react/installation.mdx | 49 -- .../how-to/react/list-other-peers.mdx | 38 -- .../how-to/react/managing-devices.mdx | 90 --- .../version-0.20.0/how-to/react/metadata.mdx | 99 ---- .../how-to/react/start-streaming.mdx | 76 --- .../how-to/react/stream-middleware.mdx | 98 --- .../how-to/troubleshooting/_category_.json | 4 - .../how-to/troubleshooting/video-codecs.mdx | 30 - versioned_docs/version-0.20.0/index.mdx | 131 ---- .../version-0.20.0/tutorials/_category_.json | 11 - .../tutorials/backend-quick-start.mdx | 561 ------------------ .../tutorials/livestreaming.mdx | 346 ----------- .../tutorials/react-native-quick-start.mdx | 207 ------- .../tutorials/react-quick-start.mdx | 285 --------- .../_common/agents/definition.mdx | 6 - .../_common/agents/subscriptions.mdx | 4 - .../version-0.21.0/api/_category_.json | 12 - .../api/mobile/classes/WhepClient.md | 59 -- .../api/mobile/classes/WhipClient.md | 89 --- .../mobile/enumerations/VideoParameters.md | 105 ---- .../api/mobile/functions/FishjamRoom.md | 31 - .../mobile/functions/LivestreamStreamer.md | 17 - .../api/mobile/functions/LivestreamViewer.md | 17 - .../api/mobile/functions/useAudioSettings.md | 66 --- .../functions/useBandwidthEstimation.md | 17 - .../api/mobile/functions/useCamera.md | 90 --- .../api/mobile/functions/useConnection.md | 51 -- .../mobile/functions/useLivestreamStreamer.md | 11 - .../mobile/functions/useLivestreamViewer.md | 11 - .../api/mobile/functions/useMicrophone.md | 45 -- .../api/mobile/functions/usePeers.md | 39 -- .../api/mobile/functions/useSandbox.md | 60 -- .../api/mobile/functions/useScreenShare.md | 44 -- .../mobile/functions/useUpdatePeerMetadata.md | 31 - .../version-0.21.0/api/mobile/index.md | 90 --- .../interfaces/useLivestreamStreamerResult.md | 62 -- .../interfaces/useLivestreamViewerResult.md | 50 -- .../mobile/type-aliases/AppScreenShareData.md | 39 -- .../mobile/type-aliases/AudioOutputDevice.md | 21 - .../type-aliases/AudioOutputDeviceType.md | 5 - .../mobile/type-aliases/AudioSessionMode.md | 5 - .../api/mobile/type-aliases/AudioTrack.md | 15 - .../api/mobile/type-aliases/Brand.md | 20 - .../api/mobile/type-aliases/Camera.md | 29 - .../api/mobile/type-aliases/CameraConfig.md | 13 - .../mobile/type-aliases/CameraConfigBase.md | 78 --- .../type-aliases/CameraFacingDirection.md | 5 - .../api/mobile/type-aliases/CameraId.md | 5 - .../type-aliases/ConnectViewerConfig.md | 5 - .../mobile/type-aliases/ConnectionConfig.md | 26 - .../type-aliases/DistinguishedTracks.md | 37 -- .../api/mobile/type-aliases/EncodingReason.md | 11 - .../mobile/type-aliases/FishjamRoomProps.md | 25 - .../type-aliases/ForegroundServiceConfig.md | 67 --- .../mobile/type-aliases/GenericMetadata.md | 5 - .../api/mobile/type-aliases/JoinRoomConfig.md | 31 - .../type-aliases/LivestreamStreamerProps.md | 90 --- .../type-aliases/LivestreamViewerProps.md | 85 --- .../type-aliases/LivestreamViewerRef.md | 5 - .../api/mobile/type-aliases/Peer.md | 52 -- .../api/mobile/type-aliases/PeerId.md | 5 - .../api/mobile/type-aliases/PeerStatus.md | 12 - .../mobile/type-aliases/PeerTrackMetadata.md | 28 - .../api/mobile/type-aliases/PeerWithTracks.md | 12 - .../mobile/type-aliases/ReconnectionStatus.md | 11 - .../api/mobile/type-aliases/RoomType.md | 5 - .../mobile/type-aliases/ScreenShareOptions.md | 21 - .../mobile/type-aliases/ScreenShareQuality.md | 5 - .../mobile/type-aliases/SimulcastConfig.md | 21 - .../api/mobile/type-aliases/Track.md | 5 - .../api/mobile/type-aliases/TrackBase.md | 37 -- .../api/mobile/type-aliases/TrackId.md | 5 - .../api/mobile/type-aliases/TrackMetadata.md | 21 - .../api/mobile/type-aliases/TrackType.md | 5 - .../api/mobile/type-aliases/UsePeersResult.md | 38 -- .../mobile/type-aliases/UseSandboxProps.md | 5 - .../api/mobile/type-aliases/VadStatus.md | 10 - .../api/mobile/type-aliases/VideoLayout.md | 9 - .../type-aliases/VideoPreviewViewProps.md | 41 -- .../api/mobile/type-aliases/VideoQuality.md | 5 - .../mobile/type-aliases/VideoRendererProps.md | 47 -- .../api/mobile/type-aliases/VideoTrack.md | 15 - .../api/mobile/typedoc-sidebar.cjs | 4 - .../api/mobile/variables/VideoPreviewView.md | 12 - .../api/mobile/variables/VideoRendererView.md | 20 - .../api/mobile/variables/cameras.md | 7 - .../api/mobile/variables/useAppScreenShare.md | 15 - .../mobile/variables/useCameraPermissions.md | 25 - .../mobile/variables/useForegroundService.md | 18 - .../variables/useMicrophonePermissions.md | 25 - .../version-0.21.0/api/reference.md | 49 -- .../api/server/classes/BadRequestException.md | 234 -------- .../api/server/classes/FishjamAgent.md | 494 --------------- .../server/classes/FishjamBaseException.md | 233 -------- .../api/server/classes/FishjamClient.md | 241 -------- .../classes/FishjamNotFoundException.md | 234 -------- .../api/server/classes/FishjamWSNotifier.md | 431 -------------- .../api/server/classes/ForbiddenException.md | 234 -------- .../classes/MissingFishjamIdException.md | 192 ------ .../server/classes/PeerNotFoundException.md | 234 -------- .../server/classes/RoomNotFoundException.md | 234 -------- .../classes/ServiceUnavailableException.md | 234 -------- .../server/classes/UnauthorizedException.md | 234 -------- .../api/server/classes/UnknownException.md | 234 -------- .../api/server/enumerations/PeerStatus.md | 23 - .../version-0.21.0/api/server/index.md | 65 -- .../api/server/interfaces/RoomConfig.md | 79 --- .../api/server/interfaces/ServerMessage.md | 197 ------ .../api/server/interfaces/StreamerToken.md | 21 - .../api/server/interfaces/ViewerToken.md | 21 - .../api/server/type-aliases/AgentEvents.md | 5 - .../api/server/type-aliases/AgentTrack.md | 5 - .../type-aliases/AudioCodecParameters.md | 29 - .../api/server/type-aliases/Brand.md | 20 - .../server/type-aliases/CloseEventHandler.md | 16 - .../server/type-aliases/ErrorEventHandler.md | 15 - .../type-aliases/ExpectedAgentEvents.md | 5 - .../api/server/type-aliases/ExpectedEvents.md | 5 - .../api/server/type-aliases/FishjamConfig.md | 29 - .../server/type-aliases/IncomingTrackData.md | 11 - .../server/type-aliases/NotificationEvents.md | 5 - .../server/type-aliases/OutgoingTrackData.md | 11 - .../api/server/type-aliases/Peer.md | 11 - .../api/server/type-aliases/PeerAdded.md | 5 - .../api/server/type-aliases/PeerConnected.md | 5 - .../api/server/type-aliases/PeerCrashed.md | 5 - .../api/server/type-aliases/PeerDeleted.md | 5 - .../server/type-aliases/PeerDisconnected.md | 5 - .../api/server/type-aliases/PeerId.md | 7 - .../type-aliases/PeerMetadataUpdated.md | 5 - .../api/server/type-aliases/PeerOptions.md | 7 - .../api/server/type-aliases/Room.md | 29 - .../type-aliases/RoomConfigRoomTypeEnum.md | 5 - .../type-aliases/RoomConfigVideoCodecEnum.md | 5 - .../api/server/type-aliases/RoomCrashed.md | 5 - .../api/server/type-aliases/RoomCreated.md | 5 - .../api/server/type-aliases/RoomDeleted.md | 5 - .../api/server/type-aliases/RoomId.md | 8 - .../server/type-aliases/StreamConnected.md | 5 - .../server/type-aliases/StreamDisconnected.md | 5 - .../api/server/type-aliases/TrackAdded.md | 5 - .../api/server/type-aliases/TrackId.md | 5 - .../type-aliases/TrackMetadataUpdated.md | 5 - .../api/server/type-aliases/TrackRemoved.md | 5 - .../api/server/type-aliases/TrackType.md | 5 - .../server/type-aliases/ViewerConnected.md | 5 - .../server/type-aliases/ViewerDisconnected.md | 5 - .../api/server/typedoc-sidebar.cjs | 4 - .../variables/RoomConfigRoomTypeEnum.md | 27 - .../variables/RoomConfigVideoCodecEnum.md | 15 - .../api/server/variables/ServerMessage.md | 5 - .../api/web/enumerations/Variant.md | 43 -- .../api/web/functions/FishjamProvider.md | 17 - .../api/web/functions/useCamera.md | 96 --- .../api/web/functions/useConnection.md | 53 -- .../api/web/functions/useCustomSource.md | 44 -- .../api/web/functions/useInitializeDevices.md | 25 - .../web/functions/useLivestreamStreamer.md | 11 - .../api/web/functions/useLivestreamViewer.md | 11 - .../api/web/functions/useMicrophone.md | 112 ---- .../api/web/functions/usePeers.md | 39 -- .../api/web/functions/useSandbox.md | 60 -- .../api/web/functions/useScreenShare.md | 81 --- .../web/functions/useUpdatePeerMetadata.md | 31 - .../api/web/functions/useVAD.md | 31 - .../version-0.21.0/api/web/index.md | 69 --- .../web/interfaces/FishjamProviderProps.md | 97 --- .../api/web/interfaces/JoinRoomConfig.md | 39 -- .../api/web/interfaces/SimulcastConfig.md | 27 - .../interfaces/UseLivestreamStreamerResult.md | 62 -- .../interfaces/UseLivestreamViewerResult.md | 70 --- .../api/web/type-aliases/AuthErrorReason.md | 5 - .../api/web/type-aliases/BandwidthLimits.md | 21 - .../api/web/type-aliases/Brand.md | 18 - .../web/type-aliases/ConnectStreamerConfig.md | 23 - .../web/type-aliases/ConnectViewerConfig.md | 5 - .../api/web/type-aliases/CustomSource.md | 40 -- .../api/web/type-aliases/DeviceError.md | 5 - .../api/web/type-aliases/DeviceItem.md | 21 - .../type-aliases/InitializeDevicesResult.md | 29 - .../type-aliases/InitializeDevicesSettings.md | 21 - .../type-aliases/InitializeDevicesStatus.md | 5 - .../api/web/type-aliases/JoinErrorReason.md | 5 - .../api/web/type-aliases/Metadata.md | 28 - .../api/web/type-aliases/MiddlewareResult.md | 25 - .../api/web/type-aliases/PeerId.md | 5 - .../api/web/type-aliases/PeerStatus.md | 12 - .../api/web/type-aliases/PeerWithTracks.md | 84 --- .../type-aliases/PersistLastDeviceHandlers.md | 42 -- .../api/web/type-aliases/ReconnectConfig.md | 37 -- .../web/type-aliases/ReconnectionStatus.md | 5 - .../api/web/type-aliases/RoomType.md | 5 - .../type-aliases/SimulcastBandwidthLimit.md | 9 - .../type-aliases/SimulcastBandwidthLimits.md | 29 - .../api/web/type-aliases/StreamConfig.md | 13 - .../api/web/type-aliases/StreamerInputs.md | 31 - .../api/web/type-aliases/Track.md | 53 -- .../web/type-aliases/TrackBandwidthLimit.md | 8 - .../api/web/type-aliases/TrackId.md | 5 - .../api/web/type-aliases/TrackMiddleware.md | 5 - .../api/web/type-aliases/TracksMiddleware.md | 16 - .../type-aliases/TracksMiddlewareResult.md | 33 -- .../UseInitializeDevicesParams.md | 21 - .../api/web/type-aliases/UseSandboxProps.md | 17 - .../api/web/typedoc-sidebar.cjs | 4 - .../api/web/variables/SimulcastConfig.md | 5 - .../explanation/_category_.json | 11 - .../explanation/agent-internals.mdx | 93 --- .../explanation/architecture.mdx | 91 --- .../version-0.21.0/explanation/glossary.md | 39 -- .../explanation/public-livestreams.mdx | 224 ------- .../version-0.21.0/explanation/room-types.mdx | 130 ---- .../explanation/sandbox-api-concept.mdx | 81 --- .../explanation/security-tokens.mdx | 122 ---- .../explanation/what-is-fishjam.mdx | 67 --- .../version-0.21.0/how-to/_category_.json | 11 - .../how-to/_common/metadata/header.mdx | 10 - .../how-to/_common/metadata/joining_room.mdx | 5 - .../how-to/_common/metadata/reading.mdx | 9 - .../how-to/_common/metadata/updating.mdx | 5 - .../how-to/backend/_category_.json | 4 - .../how-to/backend/fastapi-example.mdx | 99 ---- .../how-to/backend/fastify-example.mdx | 239 -------- .../how-to/backend/production-deployment.mdx | 300 ---------- .../how-to/backend/server-setup.mdx | 295 --------- .../how-to/features/_category_.json | 4 - .../how-to/features/audio-only-calls.mdx | 61 -- .../how-to/features/sandbox-api-testing.mdx | 323 ---------- .../how-to/features/whip-whep.mdx | 228 ------- .../how-to/react-native/_category_.json | 4 - .../_components/configure-permissions.mdx | 90 --- .../_components/install-package.mdx | 27 - .../react-native/assets/ios-new-folder.png | Bin 32047 -> 0 bytes .../react-native/assets/ios-new-group.png | Bin 117421 -> 0 bytes .../react-native/assets/ios-new-target.png | Bin 55333 -> 0 bytes .../react-native/background-streaming.mdx | 98 --- .../how-to/react-native/connecting.mdx | 92 --- .../custom-video-sources/_category_.json | 4 - .../custom-video-sources/index.mdx | 14 - .../custom-video-sources/overview.mdx | 94 --- .../custom-video-sources/vision-camera.mdx | 183 ------ .../how-to/react-native/installation.mdx | 105 ---- .../how-to/react-native/list-other-peers.mdx | 48 -- .../metadata-and-broadcasting.mdx | 101 ---- .../react-native/reconnection-handling.mdx | 38 -- .../how-to/react-native/screensharing.mdx | 192 ------ .../how-to/react-native/start-streaming.mdx | 109 ---- .../how-to/react/_category_.json | 4 - .../how-to/react/_common/metadata/header.mdx | 10 - .../react/_common/metadata/joining_room.mdx | 5 - .../how-to/react/_common/metadata/reading.mdx | 9 - .../react/_common/metadata/updating.mdx | 5 - .../how-to/react/connecting.mdx | 52 -- .../how-to/react/custom-sources.mdx | 175 ------ .../how-to/react/installation.mdx | 49 -- .../how-to/react/list-other-peers.mdx | 38 -- .../how-to/react/managing-devices.mdx | 90 --- .../version-0.21.0/how-to/react/metadata.mdx | 99 ---- .../how-to/react/start-streaming.mdx | 76 --- .../how-to/react/stream-middleware.mdx | 98 --- .../how-to/troubleshooting/_category_.json | 4 - .../how-to/troubleshooting/video-codecs.mdx | 30 - versioned_docs/version-0.21.0/index.mdx | 131 ---- .../version-0.21.0/tutorials/_category_.json | 11 - .../version-0.21.0/tutorials/agents.mdx | 205 ------- .../tutorials/backend-quick-start.mdx | 561 ------------------ .../tutorials/livestreaming.mdx | 352 ----------- .../tutorials/react-native-quick-start.mdx | 211 ------- .../tutorials/react-quick-start.mdx | 285 --------- .../version-0.20.0-sidebars.json | 8 - .../version-0.21.0-sidebars.json | 8 - 477 files changed, 26474 deletions(-) delete mode 100644 versioned_docs/version-0.20.0/api/_category_.json delete mode 100644 versioned_docs/version-0.20.0/api/mobile/functions/FishjamRoom.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/functions/LivestreamStreamer.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/functions/LivestreamViewer.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/functions/useAudioSettings.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/functions/useBandwidthEstimation.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/functions/useCamera.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/functions/useConnection.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/functions/useLivestreamStreamer.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/functions/useLivestreamViewer.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/functions/useMicrophone.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/functions/usePeers.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/functions/useSandbox.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/functions/useScreenShare.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/functions/useUpdatePeerMetadata.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/index.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/interfaces/useLivestreamStreamerResult.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/interfaces/useLivestreamViewerResult.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/AppScreenShareData.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/AudioOutputDevice.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/AudioOutputDeviceType.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/AudioSessionMode.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/AudioTrack.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/Brand.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/Camera.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/CameraConfig.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/CameraConfigBase.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/CameraFacingDirection.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/CameraId.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/ConnectViewerConfig.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/ConnectionConfig.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/DistinguishedTracks.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/EncodingReason.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/FishjamRoomProps.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/ForegroundServiceConfig.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/GenericMetadata.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/JoinRoomConfig.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/LivestreamStreamerProps.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/LivestreamViewerProps.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/LivestreamViewerRef.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/Peer.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/PeerId.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/PeerStatus.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/PeerTrackMetadata.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/PeerWithTracks.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/ReconnectionStatus.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/RoomType.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/ScreenShareOptions.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/ScreenShareQuality.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/SimulcastConfig.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/Track.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/TrackBase.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/TrackId.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/TrackMetadata.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/TrackType.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/UsePeersResult.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/UseSandboxProps.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/VadStatus.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/VideoLayout.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/VideoPreviewViewProps.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/VideoQuality.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/VideoRendererProps.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/type-aliases/VideoTrack.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/typedoc-sidebar.cjs delete mode 100644 versioned_docs/version-0.20.0/api/mobile/variables/VideoPreviewView.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/variables/VideoRendererView.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/variables/cameras.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/variables/useAppScreenShare.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/variables/useCameraPermissions.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/variables/useForegroundService.md delete mode 100644 versioned_docs/version-0.20.0/api/mobile/variables/useMicrophonePermissions.md delete mode 100644 versioned_docs/version-0.20.0/api/server/classes/BadRequestException.md delete mode 100644 versioned_docs/version-0.20.0/api/server/classes/FishjamBaseException.md delete mode 100644 versioned_docs/version-0.20.0/api/server/classes/FishjamClient.md delete mode 100644 versioned_docs/version-0.20.0/api/server/classes/FishjamNotFoundException.md delete mode 100644 versioned_docs/version-0.20.0/api/server/classes/FishjamWSNotifier.md delete mode 100644 versioned_docs/version-0.20.0/api/server/classes/ForbiddenException.md delete mode 100644 versioned_docs/version-0.20.0/api/server/classes/MissingFishjamIdException.md delete mode 100644 versioned_docs/version-0.20.0/api/server/classes/PeerNotFoundException.md delete mode 100644 versioned_docs/version-0.20.0/api/server/classes/RoomNotFoundException.md delete mode 100644 versioned_docs/version-0.20.0/api/server/classes/ServiceUnavailableException.md delete mode 100644 versioned_docs/version-0.20.0/api/server/classes/UnauthorizedException.md delete mode 100644 versioned_docs/version-0.20.0/api/server/classes/UnknownException.md delete mode 100644 versioned_docs/version-0.20.0/api/server/enumerations/PeerStatus.md delete mode 100644 versioned_docs/version-0.20.0/api/server/index.md delete mode 100644 versioned_docs/version-0.20.0/api/server/interfaces/RoomConfig.md delete mode 100644 versioned_docs/version-0.20.0/api/server/interfaces/StreamerToken.md delete mode 100644 versioned_docs/version-0.20.0/api/server/interfaces/ViewerToken.md delete mode 100644 versioned_docs/version-0.20.0/api/server/type-aliases/Brand.md delete mode 100644 versioned_docs/version-0.20.0/api/server/type-aliases/CloseEventHandler.md delete mode 100644 versioned_docs/version-0.20.0/api/server/type-aliases/ErrorEventHandler.md delete mode 100644 versioned_docs/version-0.20.0/api/server/type-aliases/ExpectedEvents.md delete mode 100644 versioned_docs/version-0.20.0/api/server/type-aliases/FishjamConfig.md delete mode 100644 versioned_docs/version-0.20.0/api/server/type-aliases/NotificationEvents.md delete mode 100644 versioned_docs/version-0.20.0/api/server/type-aliases/Peer.md delete mode 100644 versioned_docs/version-0.20.0/api/server/type-aliases/PeerId.md delete mode 100644 versioned_docs/version-0.20.0/api/server/type-aliases/PeerOptions.md delete mode 100644 versioned_docs/version-0.20.0/api/server/type-aliases/Room.md delete mode 100644 versioned_docs/version-0.20.0/api/server/type-aliases/RoomConfigRoomTypeEnum.md delete mode 100644 versioned_docs/version-0.20.0/api/server/type-aliases/RoomConfigVideoCodecEnum.md delete mode 100644 versioned_docs/version-0.20.0/api/server/type-aliases/RoomId.md delete mode 100644 versioned_docs/version-0.20.0/api/server/typedoc-sidebar.cjs delete mode 100644 versioned_docs/version-0.20.0/api/server/variables/RoomConfigRoomTypeEnum.md delete mode 100644 versioned_docs/version-0.20.0/api/server/variables/RoomConfigVideoCodecEnum.md delete mode 100644 versioned_docs/version-0.20.0/api/web/enumerations/Variant.md delete mode 100644 versioned_docs/version-0.20.0/api/web/functions/FishjamProvider.md delete mode 100644 versioned_docs/version-0.20.0/api/web/functions/useCamera.md delete mode 100644 versioned_docs/version-0.20.0/api/web/functions/useConnection.md delete mode 100644 versioned_docs/version-0.20.0/api/web/functions/useCustomSource.md delete mode 100644 versioned_docs/version-0.20.0/api/web/functions/useInitializeDevices.md delete mode 100644 versioned_docs/version-0.20.0/api/web/functions/useLivestreamStreamer.md delete mode 100644 versioned_docs/version-0.20.0/api/web/functions/useLivestreamViewer.md delete mode 100644 versioned_docs/version-0.20.0/api/web/functions/useMicrophone.md delete mode 100644 versioned_docs/version-0.20.0/api/web/functions/usePeers.md delete mode 100644 versioned_docs/version-0.20.0/api/web/functions/useSandbox.md delete mode 100644 versioned_docs/version-0.20.0/api/web/functions/useScreenShare.md delete mode 100644 versioned_docs/version-0.20.0/api/web/functions/useUpdatePeerMetadata.md delete mode 100644 versioned_docs/version-0.20.0/api/web/functions/useVAD.md delete mode 100644 versioned_docs/version-0.20.0/api/web/index.md delete mode 100644 versioned_docs/version-0.20.0/api/web/interfaces/FishjamProviderProps.md delete mode 100644 versioned_docs/version-0.20.0/api/web/interfaces/JoinRoomConfig.md delete mode 100644 versioned_docs/version-0.20.0/api/web/interfaces/SimulcastConfig.md delete mode 100644 versioned_docs/version-0.20.0/api/web/interfaces/UseLivestreamStreamerResult.md delete mode 100644 versioned_docs/version-0.20.0/api/web/interfaces/UseLivestreamViewerResult.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/AuthErrorReason.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/BandwidthLimits.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/Brand.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/ConnectStreamerConfig.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/ConnectViewerConfig.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/CustomSource.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/DeviceError.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/DeviceItem.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/InitializeDevicesResult.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/InitializeDevicesSettings.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/InitializeDevicesStatus.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/JoinErrorReason.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/Metadata.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/MiddlewareResult.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/PeerId.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/PeerStatus.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/PeerWithTracks.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/PersistLastDeviceHandlers.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/ReconnectConfig.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/ReconnectionStatus.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/RoomType.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/SimulcastBandwidthLimit.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/SimulcastBandwidthLimits.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/StreamConfig.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/StreamerInputs.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/Track.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/TrackBandwidthLimit.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/TrackId.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/TrackMiddleware.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/TracksMiddleware.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/TracksMiddlewareResult.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/UseInitializeDevicesParams.md delete mode 100644 versioned_docs/version-0.20.0/api/web/type-aliases/UseSandboxProps.md delete mode 100644 versioned_docs/version-0.20.0/api/web/typedoc-sidebar.cjs delete mode 100644 versioned_docs/version-0.20.0/api/web/variables/SimulcastConfig.md delete mode 100644 versioned_docs/version-0.20.0/explanation/_category_.json delete mode 100644 versioned_docs/version-0.20.0/explanation/architecture.mdx delete mode 100644 versioned_docs/version-0.20.0/explanation/glossary.md delete mode 100644 versioned_docs/version-0.20.0/explanation/public-livestreams.mdx delete mode 100644 versioned_docs/version-0.20.0/explanation/room-types.mdx delete mode 100644 versioned_docs/version-0.20.0/explanation/sandbox-api-concept.mdx delete mode 100644 versioned_docs/version-0.20.0/explanation/security-tokens.mdx delete mode 100644 versioned_docs/version-0.20.0/explanation/what-is-fishjam.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/_category_.json delete mode 100644 versioned_docs/version-0.20.0/how-to/_common/metadata/header.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/_common/metadata/joining_room.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/_common/metadata/reading.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/_common/metadata/updating.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/backend/_category_.json delete mode 100644 versioned_docs/version-0.20.0/how-to/backend/fastapi-example.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/backend/fastify-example.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/backend/production-deployment.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/backend/server-setup.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/features/_category_.json delete mode 100644 versioned_docs/version-0.20.0/how-to/features/audio-only-calls.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/features/sandbox-api-testing.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/features/whip-whep.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react-native/_category_.json delete mode 100644 versioned_docs/version-0.20.0/how-to/react-native/_components/configure-permissions.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react-native/_components/install-package.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react-native/assets/ios-new-folder.png delete mode 100644 versioned_docs/version-0.20.0/how-to/react-native/assets/ios-new-group.png delete mode 100644 versioned_docs/version-0.20.0/how-to/react-native/assets/ios-new-target.png delete mode 100644 versioned_docs/version-0.20.0/how-to/react-native/background-streaming.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react-native/connecting.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react-native/custom-video-sources/_category_.json delete mode 100644 versioned_docs/version-0.20.0/how-to/react-native/custom-video-sources/index.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react-native/custom-video-sources/overview.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react-native/custom-video-sources/vision-camera.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react-native/installation.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react-native/list-other-peers.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react-native/metadata-and-broadcasting.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react-native/reconnection-handling.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react-native/screensharing.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react-native/start-streaming.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react/_category_.json delete mode 100644 versioned_docs/version-0.20.0/how-to/react/_common/metadata/header.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react/_common/metadata/joining_room.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react/_common/metadata/reading.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react/_common/metadata/updating.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react/connecting.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react/custom-sources.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react/installation.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react/list-other-peers.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react/managing-devices.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react/metadata.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react/start-streaming.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/react/stream-middleware.mdx delete mode 100644 versioned_docs/version-0.20.0/how-to/troubleshooting/_category_.json delete mode 100644 versioned_docs/version-0.20.0/how-to/troubleshooting/video-codecs.mdx delete mode 100644 versioned_docs/version-0.20.0/index.mdx delete mode 100644 versioned_docs/version-0.20.0/tutorials/_category_.json delete mode 100644 versioned_docs/version-0.20.0/tutorials/backend-quick-start.mdx delete mode 100644 versioned_docs/version-0.20.0/tutorials/livestreaming.mdx delete mode 100644 versioned_docs/version-0.20.0/tutorials/react-native-quick-start.mdx delete mode 100644 versioned_docs/version-0.20.0/tutorials/react-quick-start.mdx delete mode 100644 versioned_docs/version-0.21.0/_common/agents/definition.mdx delete mode 100644 versioned_docs/version-0.21.0/_common/agents/subscriptions.mdx delete mode 100644 versioned_docs/version-0.21.0/api/_category_.json delete mode 100644 versioned_docs/version-0.21.0/api/mobile/classes/WhepClient.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/classes/WhipClient.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/enumerations/VideoParameters.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/functions/FishjamRoom.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/functions/LivestreamStreamer.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/functions/LivestreamViewer.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/functions/useAudioSettings.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/functions/useBandwidthEstimation.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/functions/useCamera.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/functions/useConnection.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/functions/useLivestreamStreamer.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/functions/useLivestreamViewer.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/functions/useMicrophone.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/functions/usePeers.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/functions/useSandbox.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/functions/useScreenShare.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/functions/useUpdatePeerMetadata.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/index.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/interfaces/useLivestreamStreamerResult.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/interfaces/useLivestreamViewerResult.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/AppScreenShareData.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/AudioOutputDevice.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/AudioOutputDeviceType.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/AudioSessionMode.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/AudioTrack.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/Brand.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/Camera.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/CameraConfig.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/CameraConfigBase.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/CameraFacingDirection.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/CameraId.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/ConnectViewerConfig.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/ConnectionConfig.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/DistinguishedTracks.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/EncodingReason.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/FishjamRoomProps.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/ForegroundServiceConfig.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/GenericMetadata.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/JoinRoomConfig.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/LivestreamStreamerProps.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/LivestreamViewerProps.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/LivestreamViewerRef.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/Peer.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/PeerId.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/PeerStatus.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/PeerTrackMetadata.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/PeerWithTracks.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/ReconnectionStatus.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/RoomType.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/ScreenShareOptions.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/ScreenShareQuality.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/SimulcastConfig.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/Track.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/TrackBase.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/TrackId.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/TrackMetadata.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/TrackType.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/UsePeersResult.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/UseSandboxProps.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/VadStatus.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/VideoLayout.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/VideoPreviewViewProps.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/VideoQuality.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/VideoRendererProps.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/type-aliases/VideoTrack.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/typedoc-sidebar.cjs delete mode 100644 versioned_docs/version-0.21.0/api/mobile/variables/VideoPreviewView.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/variables/VideoRendererView.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/variables/cameras.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/variables/useAppScreenShare.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/variables/useCameraPermissions.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/variables/useForegroundService.md delete mode 100644 versioned_docs/version-0.21.0/api/mobile/variables/useMicrophonePermissions.md delete mode 100644 versioned_docs/version-0.21.0/api/reference.md delete mode 100644 versioned_docs/version-0.21.0/api/server/classes/BadRequestException.md delete mode 100644 versioned_docs/version-0.21.0/api/server/classes/FishjamAgent.md delete mode 100644 versioned_docs/version-0.21.0/api/server/classes/FishjamBaseException.md delete mode 100644 versioned_docs/version-0.21.0/api/server/classes/FishjamClient.md delete mode 100644 versioned_docs/version-0.21.0/api/server/classes/FishjamNotFoundException.md delete mode 100644 versioned_docs/version-0.21.0/api/server/classes/FishjamWSNotifier.md delete mode 100644 versioned_docs/version-0.21.0/api/server/classes/ForbiddenException.md delete mode 100644 versioned_docs/version-0.21.0/api/server/classes/MissingFishjamIdException.md delete mode 100644 versioned_docs/version-0.21.0/api/server/classes/PeerNotFoundException.md delete mode 100644 versioned_docs/version-0.21.0/api/server/classes/RoomNotFoundException.md delete mode 100644 versioned_docs/version-0.21.0/api/server/classes/ServiceUnavailableException.md delete mode 100644 versioned_docs/version-0.21.0/api/server/classes/UnauthorizedException.md delete mode 100644 versioned_docs/version-0.21.0/api/server/classes/UnknownException.md delete mode 100644 versioned_docs/version-0.21.0/api/server/enumerations/PeerStatus.md delete mode 100644 versioned_docs/version-0.21.0/api/server/index.md delete mode 100644 versioned_docs/version-0.21.0/api/server/interfaces/RoomConfig.md delete mode 100644 versioned_docs/version-0.21.0/api/server/interfaces/ServerMessage.md delete mode 100644 versioned_docs/version-0.21.0/api/server/interfaces/StreamerToken.md delete mode 100644 versioned_docs/version-0.21.0/api/server/interfaces/ViewerToken.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/AgentEvents.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/AgentTrack.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/AudioCodecParameters.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/Brand.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/CloseEventHandler.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/ErrorEventHandler.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/ExpectedAgentEvents.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/ExpectedEvents.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/FishjamConfig.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/IncomingTrackData.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/NotificationEvents.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/OutgoingTrackData.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/Peer.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/PeerAdded.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/PeerConnected.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/PeerCrashed.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/PeerDeleted.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/PeerDisconnected.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/PeerId.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/PeerMetadataUpdated.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/PeerOptions.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/Room.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/RoomConfigRoomTypeEnum.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/RoomConfigVideoCodecEnum.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/RoomCrashed.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/RoomCreated.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/RoomDeleted.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/RoomId.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/StreamConnected.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/StreamDisconnected.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/TrackAdded.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/TrackId.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/TrackMetadataUpdated.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/TrackRemoved.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/TrackType.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/ViewerConnected.md delete mode 100644 versioned_docs/version-0.21.0/api/server/type-aliases/ViewerDisconnected.md delete mode 100644 versioned_docs/version-0.21.0/api/server/typedoc-sidebar.cjs delete mode 100644 versioned_docs/version-0.21.0/api/server/variables/RoomConfigRoomTypeEnum.md delete mode 100644 versioned_docs/version-0.21.0/api/server/variables/RoomConfigVideoCodecEnum.md delete mode 100644 versioned_docs/version-0.21.0/api/server/variables/ServerMessage.md delete mode 100644 versioned_docs/version-0.21.0/api/web/enumerations/Variant.md delete mode 100644 versioned_docs/version-0.21.0/api/web/functions/FishjamProvider.md delete mode 100644 versioned_docs/version-0.21.0/api/web/functions/useCamera.md delete mode 100644 versioned_docs/version-0.21.0/api/web/functions/useConnection.md delete mode 100644 versioned_docs/version-0.21.0/api/web/functions/useCustomSource.md delete mode 100644 versioned_docs/version-0.21.0/api/web/functions/useInitializeDevices.md delete mode 100644 versioned_docs/version-0.21.0/api/web/functions/useLivestreamStreamer.md delete mode 100644 versioned_docs/version-0.21.0/api/web/functions/useLivestreamViewer.md delete mode 100644 versioned_docs/version-0.21.0/api/web/functions/useMicrophone.md delete mode 100644 versioned_docs/version-0.21.0/api/web/functions/usePeers.md delete mode 100644 versioned_docs/version-0.21.0/api/web/functions/useSandbox.md delete mode 100644 versioned_docs/version-0.21.0/api/web/functions/useScreenShare.md delete mode 100644 versioned_docs/version-0.21.0/api/web/functions/useUpdatePeerMetadata.md delete mode 100644 versioned_docs/version-0.21.0/api/web/functions/useVAD.md delete mode 100644 versioned_docs/version-0.21.0/api/web/index.md delete mode 100644 versioned_docs/version-0.21.0/api/web/interfaces/FishjamProviderProps.md delete mode 100644 versioned_docs/version-0.21.0/api/web/interfaces/JoinRoomConfig.md delete mode 100644 versioned_docs/version-0.21.0/api/web/interfaces/SimulcastConfig.md delete mode 100644 versioned_docs/version-0.21.0/api/web/interfaces/UseLivestreamStreamerResult.md delete mode 100644 versioned_docs/version-0.21.0/api/web/interfaces/UseLivestreamViewerResult.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/AuthErrorReason.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/BandwidthLimits.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/Brand.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/ConnectStreamerConfig.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/ConnectViewerConfig.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/CustomSource.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/DeviceError.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/DeviceItem.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/InitializeDevicesResult.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/InitializeDevicesSettings.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/InitializeDevicesStatus.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/JoinErrorReason.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/Metadata.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/MiddlewareResult.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/PeerId.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/PeerStatus.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/PeerWithTracks.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/PersistLastDeviceHandlers.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/ReconnectConfig.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/ReconnectionStatus.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/RoomType.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/SimulcastBandwidthLimit.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/SimulcastBandwidthLimits.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/StreamConfig.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/StreamerInputs.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/Track.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/TrackBandwidthLimit.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/TrackId.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/TrackMiddleware.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/TracksMiddleware.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/TracksMiddlewareResult.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/UseInitializeDevicesParams.md delete mode 100644 versioned_docs/version-0.21.0/api/web/type-aliases/UseSandboxProps.md delete mode 100644 versioned_docs/version-0.21.0/api/web/typedoc-sidebar.cjs delete mode 100644 versioned_docs/version-0.21.0/api/web/variables/SimulcastConfig.md delete mode 100644 versioned_docs/version-0.21.0/explanation/_category_.json delete mode 100644 versioned_docs/version-0.21.0/explanation/agent-internals.mdx delete mode 100644 versioned_docs/version-0.21.0/explanation/architecture.mdx delete mode 100644 versioned_docs/version-0.21.0/explanation/glossary.md delete mode 100644 versioned_docs/version-0.21.0/explanation/public-livestreams.mdx delete mode 100644 versioned_docs/version-0.21.0/explanation/room-types.mdx delete mode 100644 versioned_docs/version-0.21.0/explanation/sandbox-api-concept.mdx delete mode 100644 versioned_docs/version-0.21.0/explanation/security-tokens.mdx delete mode 100644 versioned_docs/version-0.21.0/explanation/what-is-fishjam.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/_category_.json delete mode 100644 versioned_docs/version-0.21.0/how-to/_common/metadata/header.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/_common/metadata/joining_room.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/_common/metadata/reading.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/_common/metadata/updating.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/backend/_category_.json delete mode 100644 versioned_docs/version-0.21.0/how-to/backend/fastapi-example.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/backend/fastify-example.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/backend/production-deployment.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/backend/server-setup.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/features/_category_.json delete mode 100644 versioned_docs/version-0.21.0/how-to/features/audio-only-calls.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/features/sandbox-api-testing.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/features/whip-whep.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react-native/_category_.json delete mode 100644 versioned_docs/version-0.21.0/how-to/react-native/_components/configure-permissions.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react-native/_components/install-package.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react-native/assets/ios-new-folder.png delete mode 100644 versioned_docs/version-0.21.0/how-to/react-native/assets/ios-new-group.png delete mode 100644 versioned_docs/version-0.21.0/how-to/react-native/assets/ios-new-target.png delete mode 100644 versioned_docs/version-0.21.0/how-to/react-native/background-streaming.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react-native/connecting.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react-native/custom-video-sources/_category_.json delete mode 100644 versioned_docs/version-0.21.0/how-to/react-native/custom-video-sources/index.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react-native/custom-video-sources/overview.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react-native/custom-video-sources/vision-camera.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react-native/installation.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react-native/list-other-peers.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react-native/metadata-and-broadcasting.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react-native/reconnection-handling.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react-native/screensharing.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react-native/start-streaming.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react/_category_.json delete mode 100644 versioned_docs/version-0.21.0/how-to/react/_common/metadata/header.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react/_common/metadata/joining_room.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react/_common/metadata/reading.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react/_common/metadata/updating.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react/connecting.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react/custom-sources.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react/installation.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react/list-other-peers.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react/managing-devices.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react/metadata.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react/start-streaming.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/react/stream-middleware.mdx delete mode 100644 versioned_docs/version-0.21.0/how-to/troubleshooting/_category_.json delete mode 100644 versioned_docs/version-0.21.0/how-to/troubleshooting/video-codecs.mdx delete mode 100644 versioned_docs/version-0.21.0/index.mdx delete mode 100644 versioned_docs/version-0.21.0/tutorials/_category_.json delete mode 100644 versioned_docs/version-0.21.0/tutorials/agents.mdx delete mode 100644 versioned_docs/version-0.21.0/tutorials/backend-quick-start.mdx delete mode 100644 versioned_docs/version-0.21.0/tutorials/livestreaming.mdx delete mode 100644 versioned_docs/version-0.21.0/tutorials/react-native-quick-start.mdx delete mode 100644 versioned_docs/version-0.21.0/tutorials/react-quick-start.mdx delete mode 100644 versioned_sidebars/version-0.20.0-sidebars.json delete mode 100644 versioned_sidebars/version-0.21.0-sidebars.json diff --git a/versioned_docs/version-0.20.0/api/_category_.json b/versioned_docs/version-0.20.0/api/_category_.json deleted file mode 100644 index 24fd9392..00000000 --- a/versioned_docs/version-0.20.0/api/_category_.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "label": "API", - "position": 6, - "link": { - "type": "generated-index", - "description": "API documentation for Client and Server SDKs.", - "slug": "/api" - }, - "customProps": { - "id": "generated-api" - } -} diff --git a/versioned_docs/version-0.20.0/api/mobile/functions/FishjamRoom.md b/versioned_docs/version-0.20.0/api/mobile/functions/FishjamRoom.md deleted file mode 100644 index 335dd2f5..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/functions/FishjamRoom.md +++ /dev/null @@ -1,31 +0,0 @@ -# Function: FishjamRoom() - -> **FishjamRoom**(`props`): `Element` - -Defined in: [packages/react-native-client/src/components/FishjamRoom/index.tsx:39](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/FishjamRoom/index.tsx#L39) - -Simple component that enables your camera and show all tracks - -Example usage: -```tsx -import { FishjamRoom } from '@fishjam-cloud/react-native-client'; -import React from 'react'; - -const FISHJAM_URL = 'https://fishjam.io/your_fishjam'; -const PEER_TOKEN = 'your-peer-token'; - - -``` - -## Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `props` | [`FishjamRoomProps`](../type-aliases/FishjamRoomProps.md) | | - -## Returns - -`Element` diff --git a/versioned_docs/version-0.20.0/api/mobile/functions/LivestreamStreamer.md b/versioned_docs/version-0.20.0/api/mobile/functions/LivestreamStreamer.md deleted file mode 100644 index 9a972ae3..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/functions/LivestreamStreamer.md +++ /dev/null @@ -1,17 +0,0 @@ -# Function: LivestreamStreamer() - -> **LivestreamStreamer**(`props`): `Element` - -Defined in: [packages/react-native-client/src/components/LivestreamStreamer.tsx:22](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/LivestreamStreamer.tsx#L22) - -Renders a video player playing the livestream set up with [useLivestreamStreamer](useLivestreamStreamer.md) hook. - -## Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `props` | [`LivestreamStreamerProps`](../type-aliases/LivestreamStreamerProps.md) | | - -## Returns - -`Element` diff --git a/versioned_docs/version-0.20.0/api/mobile/functions/LivestreamViewer.md b/versioned_docs/version-0.20.0/api/mobile/functions/LivestreamViewer.md deleted file mode 100644 index a9ed3e04..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/functions/LivestreamViewer.md +++ /dev/null @@ -1,17 +0,0 @@ -# Function: LivestreamViewer() - -> **LivestreamViewer**(`props`): `Element` - -Defined in: [packages/react-native-client/src/components/LivestreamViewer.tsx:54](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/LivestreamViewer.tsx#L54) - -Renders a video player playing the livestream set up with [useLivestreamViewer](useLivestreamViewer.md) hook. - -## Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `props` | [`LivestreamViewerProps`](../type-aliases/LivestreamViewerProps.md) | | - -## Returns - -`Element` diff --git a/versioned_docs/version-0.20.0/api/mobile/functions/useAudioSettings.md b/versioned_docs/version-0.20.0/api/mobile/functions/useAudioSettings.md deleted file mode 100644 index 5452070d..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/functions/useAudioSettings.md +++ /dev/null @@ -1,66 +0,0 @@ -# Function: useAudioSettings() - -> **useAudioSettings**(): `object` - -Defined in: [packages/react-native-client/src/hooks/useAudioSettings.ts:32](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useAudioSettings.ts#L32) - -This hook manages audio settings. - -## Returns - -### availableDevices - -> **availableDevices**: [`AudioOutputDevice`](../type-aliases/AudioOutputDevice.md)[] - -[Android only] available audio output devices to be set - -### selectAudioSessionMode() - -> **selectAudioSessionMode**: (`audioSessionMode`) => `Promise`\<`void`\> - -[iOS only] selects audio session mode. For more information refer to Apple's documentation: - https://developer.apple.com/documentation/avfaudio/avaudiosession/mode/ - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `audioSessionMode` | [`AudioSessionMode`](../type-aliases/AudioSessionMode.md) | - -#### Returns - -`Promise`\<`void`\> - -### selectedAudioOutputDevice - -> **selectedAudioOutputDevice**: `null` \| [`AudioOutputDevice`](../type-aliases/AudioOutputDevice.md) - -currently selected output audio device - -### selectOutputAudioDevice() - -> **selectOutputAudioDevice**: (`device`) => `Promise`\<`void`\> - -[Android only] selects output audio device. -For detecting and selecting bluetooth devices make sure you have the BLUETOOTH_CONNECT permission. - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `device` | [`AudioOutputDeviceType`](../type-aliases/AudioOutputDeviceType.md) | - -#### Returns - -`Promise`\<`void`\> - -### showAudioRoutePicker() - -> **showAudioRoutePicker**: () => `Promise`\<`void`\> - -[iOS only] Shows a picker modal that allows user to select output audio device. For more -information refer to Apple's documentation: https://developer.apple.com/documentation/avkit/avroutepickerview - -#### Returns - -`Promise`\<`void`\> diff --git a/versioned_docs/version-0.20.0/api/mobile/functions/useBandwidthEstimation.md b/versioned_docs/version-0.20.0/api/mobile/functions/useBandwidthEstimation.md deleted file mode 100644 index fea296e4..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/functions/useBandwidthEstimation.md +++ /dev/null @@ -1,17 +0,0 @@ -# Function: useBandwidthEstimation() - -> **useBandwidthEstimation**(): `object` - -Defined in: [packages/react-native-client/src/hooks/useBandwidthEstimation.ts:11](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useBandwidthEstimation.ts#L11) - -This hook provides current bandwidth estimation -estimation - client's available incoming bitrate estimated -by the server. It's measured in bits per second. - -## Returns - -### estimation - -> **estimation**: `null` \| `number` - -Bandwidth estimation, measured in bits per second diff --git a/versioned_docs/version-0.20.0/api/mobile/functions/useCamera.md b/versioned_docs/version-0.20.0/api/mobile/functions/useCamera.md deleted file mode 100644 index 4f4bfef6..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/functions/useCamera.md +++ /dev/null @@ -1,90 +0,0 @@ -# Function: useCamera() - -> **useCamera**(): `object` - -Defined in: [packages/react-native-client/src/hooks/useCamera.ts:121](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useCamera.ts#L121) - -This hook can toggle camera on/off and provides current camera state. - -## Returns - -### cameras - -> **cameras**: readonly [`Camera`](../type-aliases/Camera.md)[] - -Property that lists cameras available on device. - -#### Returns - -A promise that resolves to the list of available cameras. - -### currentCamera - -> **currentCamera**: `null` \| [`Camera`](../type-aliases/Camera.md) - -Which camera is now used for streaming (or will be used as default when camera will be enabled) - -### isCameraOn - -> **isCameraOn**: `boolean` - -Informs if user camera is streaming video - -### isInitialized - -> **isInitialized**: `boolean` = `isCameraInitialized` - -A value indicating if camera was already initialized (if `prepareCamera` was called). - -### prepareCamera() - -> **prepareCamera**: (`config`) => `Promise`\<`boolean`\> - -Prepares camera and starts local video track - -#### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `config` | `Readonly`\<[`CameraConfig`](../type-aliases/CameraConfig.md)\> | configuration of the camera capture | - -#### Returns - -`Promise`\<`boolean`\> - -A promise that resolves when camera is started. - -### simulcastConfig - -> **simulcastConfig**: [`SimulcastConfig`](../type-aliases/SimulcastConfig.md) - -Simulcast configuration - -### switchCamera() - -> **switchCamera**: (`cameraId`) => `Promise`\<`void`\> - -Switches to the specified camera. -List of available devices can be retrieved from `cameras` variable - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `cameraId` | [`CameraId`](../type-aliases/CameraId.md) | - -#### Returns - -`Promise`\<`void`\> - -A promise that resolves when camera is switched. - -### toggleCamera() - -> **toggleCamera**: () => `Promise`\<`void`\> - -Enable/disable current camera - -#### Returns - -`Promise`\<`void`\> diff --git a/versioned_docs/version-0.20.0/api/mobile/functions/useConnection.md b/versioned_docs/version-0.20.0/api/mobile/functions/useConnection.md deleted file mode 100644 index 684e7a70..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/functions/useConnection.md +++ /dev/null @@ -1,51 +0,0 @@ -# Function: useConnection() - -> **useConnection**(): `object` - -Defined in: [packages/react-native-client/src/hooks/useConnection.ts:87](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useConnection.ts#L87) - -Connect/leave room. And get connection status. - -## Returns - -### joinRoom() - -> **joinRoom**: \<`PeerMetadata`\>(`__namedParameters`) => `Promise`\<`void`\> - -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) | - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `__namedParameters` | [`JoinRoomConfig`](../type-aliases/JoinRoomConfig.md)\<`PeerMetadata`\> | - -#### Returns - -`Promise`\<`void`\> - -### leaveRoom() - -> **leaveRoom**: () => `void` - -Leave room and stop streaming - -#### Returns - -`void` - -### peerStatus - -> **peerStatus**: [`PeerStatus`](../type-aliases/PeerStatus.md) - -### reconnectionStatus - -> **reconnectionStatus**: [`ReconnectionStatus`](../type-aliases/ReconnectionStatus.md) diff --git a/versioned_docs/version-0.20.0/api/mobile/functions/useLivestreamStreamer.md b/versioned_docs/version-0.20.0/api/mobile/functions/useLivestreamStreamer.md deleted file mode 100644 index 88cf5428..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/functions/useLivestreamStreamer.md +++ /dev/null @@ -1,18 +0,0 @@ -# Function: useLivestreamStreamer() - -> **useLivestreamStreamer**(`__namedParameters`): [`useLivestreamStreamerResult`](../interfaces/useLivestreamStreamerResult.md) - -Defined in: [packages/react-native-client/src/hooks/useLivestreamStreamer.ts:31](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useLivestreamStreamer.ts#L31) - -Hook for publishing a livestream, which can be then received with [useLivestreamViewer](useLivestreamViewer.md) - -## Parameters - -| Parameter | Type | -| ------ | ------ | -| `__namedParameters` | \{ `camera?`: `Camera`; \} | -| `__namedParameters.camera?` | `Camera` | - -## Returns - -[`useLivestreamStreamerResult`](../interfaces/useLivestreamStreamerResult.md) diff --git a/versioned_docs/version-0.20.0/api/mobile/functions/useLivestreamViewer.md b/versioned_docs/version-0.20.0/api/mobile/functions/useLivestreamViewer.md deleted file mode 100644 index 9e325ab4..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/functions/useLivestreamViewer.md +++ /dev/null @@ -1,11 +0,0 @@ -# Function: useLivestreamViewer() - -> **useLivestreamViewer**(): [`useLivestreamViewerResult`](../interfaces/useLivestreamViewerResult.md) - -Defined in: [packages/react-native-client/src/hooks/useLivestreamViewer.ts:37](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useLivestreamViewer.ts#L37) - -Hook for receiving a published livestream. - -## Returns - -[`useLivestreamViewerResult`](../interfaces/useLivestreamViewerResult.md) diff --git a/versioned_docs/version-0.20.0/api/mobile/functions/useMicrophone.md b/versioned_docs/version-0.20.0/api/mobile/functions/useMicrophone.md deleted file mode 100644 index 3ddbbe59..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/functions/useMicrophone.md +++ /dev/null @@ -1,45 +0,0 @@ -# Function: useMicrophone() - -> **useMicrophone**(): `object` - -Defined in: [packages/react-native-client/src/hooks/useMicrophone.ts:12](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useMicrophone.ts#L12) - -This hook can toggle microphone on/off and provides current microphone state. - -## Returns - -### isMicrophoneOn - -> **isMicrophoneOn**: `boolean` - -Informs if microphone audio track is active - -### startMicrophone() - -> **startMicrophone**: () => `Promise`\<`void`\> - -Starts microphone and requests permission if needed - -#### Returns - -`Promise`\<`void`\> - -### stopMicrophone() - -> **stopMicrophone**: () => `Promise`\<`void`\> - -Stops microphone (mutes the track without removing it) - -#### Returns - -`Promise`\<`void`\> - -### toggleMicrophone() - -> **toggleMicrophone**: () => `Promise`\<`void`\> - -Toggles microphone on/off based on the value of `isMicrophoneOn` - -#### Returns - -`Promise`\<`void`\> diff --git a/versioned_docs/version-0.20.0/api/mobile/functions/usePeers.md b/versioned_docs/version-0.20.0/api/mobile/functions/usePeers.md deleted file mode 100644 index 127b7ef2..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/functions/usePeers.md +++ /dev/null @@ -1,39 +0,0 @@ -# Function: usePeers() - -> **usePeers**\<`PeerMetadata`, `ServerMetadata`\>(): `object` - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:186](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L186) - -Hook that provides live updates of room peers. - -## Type Parameters - -| Type Parameter | Default type | Description | -| ------ | ------ | ------ | -| `PeerMetadata` *extends* [`GenericMetadata`](../type-aliases/GenericMetadata.md) | [`GenericMetadata`](../type-aliases/GenericMetadata.md) | Type for peer-specific metadata | -| `ServerMetadata` *extends* [`GenericMetadata`](../type-aliases/GenericMetadata.md) | [`GenericMetadata`](../type-aliases/GenericMetadata.md) | Type for server-specific metadata | - -## Returns - -### localPeer - -> **localPeer**: `null` \| [`PeerWithTracks`](../type-aliases/PeerWithTracks.md)\<`PeerMetadata`, `ServerMetadata`\> - -The local peer with distinguished tracks (camera, microphone, screen share). -Will be null if the local peer is not found. - -### ~~peers~~ - -> **peers**: [`Peer`](../type-aliases/Peer.md)\<`PeerMetadata`, `ServerMetadata`\>[] - -#### Deprecated - -Use localPeer and remotePeers instead -Legacy array containing all peers (both local and remote) without distinguished tracks. -This property will be removed in future versions. - -### remotePeers - -> **remotePeers**: [`PeerWithTracks`](../type-aliases/PeerWithTracks.md)\<`PeerMetadata`, `ServerMetadata`\>[] - -Array of remote peers with distinguished tracks (camera, microphone, screen share). diff --git a/versioned_docs/version-0.20.0/api/mobile/functions/useSandbox.md b/versioned_docs/version-0.20.0/api/mobile/functions/useSandbox.md deleted file mode 100644 index 5b13508a..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/functions/useSandbox.md +++ /dev/null @@ -1,60 +0,0 @@ -# Function: useSandbox() - -> **useSandbox**(`__namedParameters`): `object` - -Defined in: [packages/react-native-client/src/hooks/useSandbox.ts:16](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useSandbox.ts#L16) - -## Parameters - -| Parameter | Type | -| ------ | ------ | -| `__namedParameters` | [`UseSandboxProps`](../type-aliases/UseSandboxProps.md) | - -## Returns - -`object` - -### getSandboxLivestream() - -> **getSandboxLivestream**: (`roomName`, `isPublic`) => `Promise`\<\{ `room`: \{ `id`: `string`; `name`: `string`; \}; `streamerToken`: `string`; \}\> - -#### Parameters - -| Parameter | Type | Default value | -| ------ | ------ | ------ | -| `roomName` | `string` | `undefined` | -| `isPublic` | `boolean` | `false` | - -#### Returns - -`Promise`\<\{ `room`: \{ `id`: `string`; `name`: `string`; \}; `streamerToken`: `string`; \}\> - -### getSandboxPeerToken() - -> **getSandboxPeerToken**: (`roomName`, `peerName`, `roomType`) => `Promise`\<`string`\> - -#### Parameters - -| Parameter | Type | Default value | -| ------ | ------ | ------ | -| `roomName` | `string` | `undefined` | -| `peerName` | `string` | `undefined` | -| `roomType` | [`RoomType`](../type-aliases/RoomType.md) | `'conference'` | - -#### Returns - -`Promise`\<`string`\> - -### getSandboxViewerToken() - -> **getSandboxViewerToken**: (`roomName`) => `Promise`\<`string`\> - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `roomName` | `string` | - -#### Returns - -`Promise`\<`string`\> diff --git a/versioned_docs/version-0.20.0/api/mobile/functions/useScreenShare.md b/versioned_docs/version-0.20.0/api/mobile/functions/useScreenShare.md deleted file mode 100644 index b001642b..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/functions/useScreenShare.md +++ /dev/null @@ -1,44 +0,0 @@ -# Function: useScreenShare() - -> **useScreenShare**(): `object` - -Defined in: [packages/react-native-client/src/hooks/useScreenShare.ts:42](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useScreenShare.ts#L42) - -This hook can toggle screen sharing on/off and provides current screen share state. - -## Returns - -An object with functions to manage screen share. - -### handleScreenSharePermission() - -> **handleScreenSharePermission**: () => `Promise`\<`"granted"` \| `"denied"`\> - -#### Returns - -`Promise`\<`"granted"` \| `"denied"`\> - -### isScreenShareOn - -> **isScreenShareOn**: `boolean` - -### simulcastConfig - -> **simulcastConfig**: [`SimulcastConfig`](../type-aliases/SimulcastConfig.md) - -### toggleScreenShare() - -> **toggleScreenShare**: (`screenShareOptions`) => `Promise`\<`void`\> - -Toggles the screen share on/off -Emits warning on ios when user is screensharing app screen. - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `screenShareOptions` | `Partial`\<[`ScreenShareOptions`](../type-aliases/ScreenShareOptions.md)\> | - -#### Returns - -`Promise`\<`void`\> diff --git a/versioned_docs/version-0.20.0/api/mobile/functions/useUpdatePeerMetadata.md b/versioned_docs/version-0.20.0/api/mobile/functions/useUpdatePeerMetadata.md deleted file mode 100644 index ffe06a5f..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/functions/useUpdatePeerMetadata.md +++ /dev/null @@ -1,31 +0,0 @@ -# Function: useUpdatePeerMetadata() - -> **useUpdatePeerMetadata**\<`PeerMetadata`\>(): `object` - -Defined in: [packages/react-native-client/src/hooks/useUpdatePeerMetadata.ts:10](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useUpdatePeerMetadata.ts#L10) - -This hook provides method to update peer metadata - -## Type Parameters - -| Type Parameter | Default type | -| ------ | ------ | -| `PeerMetadata` *extends* [`GenericMetadata`](../type-aliases/GenericMetadata.md) | [`GenericMetadata`](../type-aliases/GenericMetadata.md) | - -## Returns - -### updatePeerMetadata() - -> **updatePeerMetadata**: (`peerMetadata`) => `Promise`\<`void`\> - -Updates metadata send to other peers - -#### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `peerMetadata` | `PeerMetadata` | string indexed record with metadata, that will be available to all other peers | - -#### Returns - -`Promise`\<`void`\> diff --git a/versioned_docs/version-0.20.0/api/mobile/index.md b/versioned_docs/version-0.20.0/api/mobile/index.md deleted file mode 100644 index b4673dcb..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/index.md +++ /dev/null @@ -1,87 +0,0 @@ -# @fishjam-cloud/react-native-client - -## Connection - -- [useConnection](functions/useConnection.md) -- [usePeers](functions/usePeers.md) -- [useScreenShare](functions/useScreenShare.md) -- [useUpdatePeerMetadata](functions/useUpdatePeerMetadata.md) -- [useAppScreenShare](variables/useAppScreenShare.md) -- [useForegroundService](variables/useForegroundService.md) - -## Devices - -- [useAudioSettings](functions/useAudioSettings.md) -- [useCamera](functions/useCamera.md) -- [useMicrophone](functions/useMicrophone.md) - -## Components - -- [FishjamRoom](functions/FishjamRoom.md) -- [LivestreamStreamer](functions/LivestreamStreamer.md) -- [LivestreamViewer](functions/LivestreamViewer.md) -- [VideoPreviewView](variables/VideoPreviewView.md) -- [VideoRendererView](variables/VideoRendererView.md) - -## Livestream - -- [useLivestreamStreamer](functions/useLivestreamStreamer.md) -- [useLivestreamViewer](functions/useLivestreamViewer.md) -- [useLivestreamStreamerResult](interfaces/useLivestreamStreamerResult.md) -- [useLivestreamViewerResult](interfaces/useLivestreamViewerResult.md) - -## Other - -- [useSandbox](functions/useSandbox.md) -- [AppScreenShareData](type-aliases/AppScreenShareData.md) -- [AudioOutputDevice](type-aliases/AudioOutputDevice.md) -- [AudioOutputDeviceType](type-aliases/AudioOutputDeviceType.md) -- [AudioSessionMode](type-aliases/AudioSessionMode.md) -- [AudioTrack](type-aliases/AudioTrack.md) -- [Brand](type-aliases/Brand.md) -- [Camera](type-aliases/Camera.md) -- [CameraConfig](type-aliases/CameraConfig.md) -- [CameraConfigBase](type-aliases/CameraConfigBase.md) -- [CameraFacingDirection](type-aliases/CameraFacingDirection.md) -- [CameraId](type-aliases/CameraId.md) -- [ConnectionConfig](type-aliases/ConnectionConfig.md) -- [ConnectViewerConfig](type-aliases/ConnectViewerConfig.md) -- [DistinguishedTracks](type-aliases/DistinguishedTracks.md) -- [EncodingReason](type-aliases/EncodingReason.md) -- [FishjamRoomProps](type-aliases/FishjamRoomProps.md) -- [ForegroundServiceConfig](type-aliases/ForegroundServiceConfig.md) -- [GenericMetadata](type-aliases/GenericMetadata.md) -- [JoinRoomConfig](type-aliases/JoinRoomConfig.md) -- [LivestreamStreamerProps](type-aliases/LivestreamStreamerProps.md) -- [LivestreamViewerProps](type-aliases/LivestreamViewerProps.md) -- [LivestreamViewerRef](type-aliases/LivestreamViewerRef.md) -- [Peer](type-aliases/Peer.md) -- [PeerId](type-aliases/PeerId.md) -- [PeerStatus](type-aliases/PeerStatus.md) -- [PeerTrackMetadata](type-aliases/PeerTrackMetadata.md) -- [PeerWithTracks](type-aliases/PeerWithTracks.md) -- [ReconnectionStatus](type-aliases/ReconnectionStatus.md) -- [RoomType](type-aliases/RoomType.md) -- [ScreenShareOptions](type-aliases/ScreenShareOptions.md) -- [ScreenShareQuality](type-aliases/ScreenShareQuality.md) -- [SimulcastConfig](type-aliases/SimulcastConfig.md) -- [Track](type-aliases/Track.md) -- [TrackBase](type-aliases/TrackBase.md) -- [TrackId](type-aliases/TrackId.md) -- [TrackMetadata](type-aliases/TrackMetadata.md) -- [TrackType](type-aliases/TrackType.md) -- [UsePeersResult](type-aliases/UsePeersResult.md) -- [UseSandboxProps](type-aliases/UseSandboxProps.md) -- [VadStatus](type-aliases/VadStatus.md) -- [VideoLayout](type-aliases/VideoLayout.md) -- [VideoPreviewViewProps](type-aliases/VideoPreviewViewProps.md) -- [VideoQuality](type-aliases/VideoQuality.md) -- [VideoRendererProps](type-aliases/VideoRendererProps.md) -- [VideoTrack](type-aliases/VideoTrack.md) -- [cameras](variables/cameras.md) -- [useCameraPermissions](variables/useCameraPermissions.md) -- [useMicrophonePermissions](variables/useMicrophonePermissions.md) - -## Debugging - -- [useBandwidthEstimation](functions/useBandwidthEstimation.md) diff --git a/versioned_docs/version-0.20.0/api/mobile/interfaces/useLivestreamStreamerResult.md b/versioned_docs/version-0.20.0/api/mobile/interfaces/useLivestreamStreamerResult.md deleted file mode 100644 index 3b74f288..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/interfaces/useLivestreamStreamerResult.md +++ /dev/null @@ -1,42 +0,0 @@ -# Interface: useLivestreamStreamerResult - -Defined in: [packages/react-native-client/src/hooks/useLivestreamStreamer.ts:14](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useLivestreamStreamer.ts#L14) - -## Properties - -### connect() - -> **connect**: (`token`, `urlOverride?`) => `Promise`\<`void`\> - -Defined in: [packages/react-native-client/src/hooks/useLivestreamStreamer.ts:21](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useLivestreamStreamer.ts#L21) - -Callback used to start publishing the selected audio and video media streams. - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `token` | `string` | -| `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: [packages/react-native-client/src/hooks/useLivestreamStreamer.ts:23](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useLivestreamStreamer.ts#L23) - -Callback to stop publishing anything previously published with [connect](#connect) - -#### Returns - -`void` diff --git a/versioned_docs/version-0.20.0/api/mobile/interfaces/useLivestreamViewerResult.md b/versioned_docs/version-0.20.0/api/mobile/interfaces/useLivestreamViewerResult.md deleted file mode 100644 index 3f7551a6..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/interfaces/useLivestreamViewerResult.md +++ /dev/null @@ -1,40 +0,0 @@ -# Interface: useLivestreamViewerResult - -Defined in: [packages/react-native-client/src/hooks/useLivestreamViewer.ts:21](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useLivestreamViewer.ts#L21) - -## Properties - -### connect() - -> **connect**: (`config`, `url?`) => `Promise`\<`void`\> - -Defined in: [packages/react-native-client/src/hooks/useLivestreamViewer.ts:27](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useLivestreamViewer.ts#L27) - -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: [packages/react-native-client/src/hooks/useLivestreamViewer.ts:29](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useLivestreamViewer.ts#L29) - -Disconnect from a stream previously connected to with [connect](#connect) - -#### Returns - -`void` diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/AppScreenShareData.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/AppScreenShareData.md deleted file mode 100644 index 645f20e4..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/AppScreenShareData.md +++ /dev/null @@ -1,39 +0,0 @@ -# Type Alias: AppScreenShareData - -> **AppScreenShareData** = `object` - -Defined in: [packages/react-native-client/src/hooks/useAppScreenShare.ts:17](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useAppScreenShare.ts#L17) - -## Properties - -### isAppScreenShareOn - -> **isAppScreenShareOn**: `boolean` - -Defined in: [packages/react-native-client/src/hooks/useAppScreenShare.ts:18](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useAppScreenShare.ts#L18) - -*** - -### simulcastConfig - -> **simulcastConfig**: [`SimulcastConfig`](SimulcastConfig.md) - -Defined in: [packages/react-native-client/src/hooks/useAppScreenShare.ts:19](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useAppScreenShare.ts#L19) - -*** - -### toggleAppScreenShare() - -> **toggleAppScreenShare**: (`screenShareOptions?`) => `Promise`\<`void`\> - -Defined in: [packages/react-native-client/src/hooks/useAppScreenShare.ts:20](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useAppScreenShare.ts#L20) - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `screenShareOptions?` | `Partial`\<[`ScreenShareOptions`](ScreenShareOptions.md)\> | - -#### Returns - -`Promise`\<`void`\> diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/AudioOutputDevice.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/AudioOutputDevice.md deleted file mode 100644 index e221593c..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/AudioOutputDevice.md +++ /dev/null @@ -1,21 +0,0 @@ -# Type Alias: AudioOutputDevice - -> **AudioOutputDevice** = `object` - -Defined in: [packages/react-native-client/src/hooks/useAudioSettings.ts:17](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useAudioSettings.ts#L17) - -## Properties - -### name - -> **name**: `string` - -Defined in: [packages/react-native-client/src/hooks/useAudioSettings.ts:19](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useAudioSettings.ts#L19) - -*** - -### type - -> **type**: [`AudioOutputDeviceType`](AudioOutputDeviceType.md) - -Defined in: [packages/react-native-client/src/hooks/useAudioSettings.ts:18](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useAudioSettings.ts#L18) diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/AudioOutputDeviceType.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/AudioOutputDeviceType.md deleted file mode 100644 index 31ac6fdd..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/AudioOutputDeviceType.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: AudioOutputDeviceType - -> **AudioOutputDeviceType** = `"bluetooth"` \| `"headset"` \| `"speaker"` \| `"earpiece"` - -Defined in: [packages/react-native-client/src/hooks/useAudioSettings.ts:9](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useAudioSettings.ts#L9) diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/AudioSessionMode.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/AudioSessionMode.md deleted file mode 100644 index dbd10996..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/AudioSessionMode.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: AudioSessionMode - -> **AudioSessionMode** = `"voiceChat"` \| `"videoChat"` - -Defined in: [packages/react-native-client/src/hooks/useAudioSettings.ts:15](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useAudioSettings.ts#L15) diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/AudioTrack.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/AudioTrack.md deleted file mode 100644 index 7bf17899..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/AudioTrack.md +++ /dev/null @@ -1,15 +0,0 @@ -# Type Alias: AudioTrack - -> **AudioTrack** = [`TrackBase`](TrackBase.md) & `object` - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:34](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L34) - -## Type declaration - -### type - -> **type**: `"Audio"` - -### vadStatus - -> **vadStatus**: [`VadStatus`](VadStatus.md) \| `undefined` diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/Brand.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/Brand.md deleted file mode 100644 index 2ed64dfb..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/Brand.md +++ /dev/null @@ -1,20 +0,0 @@ -# Type Alias: Brand\ - -> **Brand**\<`T`, `TBrand`\> = `T` & `object` - -Defined in: [packages/react-native-client/src/types.ts:34](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/types.ts#L34) - -Branded type - -## Type declaration - -### \[brand\] - -> **\[brand\]**: `TBrand` - -## Type Parameters - -| Type Parameter | -| ------ | -| `T` | -| `TBrand` *extends* `string` | diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/Camera.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/Camera.md deleted file mode 100644 index 80f4c4b3..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/Camera.md +++ /dev/null @@ -1,29 +0,0 @@ -# Type Alias: Camera - -> **Camera** = `object` - -Defined in: [packages/react-native-client/src/hooks/useCamera.ts:12](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useCamera.ts#L12) - -## Properties - -### facingDirection - -> **facingDirection**: [`CameraFacingDirection`](CameraFacingDirection.md) - -Defined in: [packages/react-native-client/src/hooks/useCamera.ts:15](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useCamera.ts#L15) - -*** - -### id - -> **id**: [`CameraId`](CameraId.md) - -Defined in: [packages/react-native-client/src/hooks/useCamera.ts:13](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useCamera.ts#L13) - -*** - -### name - -> **name**: `string` - -Defined in: [packages/react-native-client/src/hooks/useCamera.ts:14](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useCamera.ts#L14) diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/CameraConfig.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/CameraConfig.md deleted file mode 100644 index 52c4f95b..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/CameraConfig.md +++ /dev/null @@ -1,13 +0,0 @@ -# Type Alias: CameraConfig - -> **CameraConfig** = [`CameraConfigBase`](CameraConfigBase.md) & `object` - -Defined in: [packages/react-native-client/src/hooks/useCamera.ts:74](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useCamera.ts#L74) - -## Type declaration - -### simulcastEnabled? - -> `optional` **simulcastEnabled**: `boolean` - -whether video track uses simulcast. By default simulcast is disabled. diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/CameraConfigBase.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/CameraConfigBase.md deleted file mode 100644 index 83205c25..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/CameraConfigBase.md +++ /dev/null @@ -1,78 +0,0 @@ -# Type Alias: CameraConfigBase - -> **CameraConfigBase** = `object` - -Defined in: [packages/react-native-client/src/hooks/useCamera.ts:36](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useCamera.ts#L36) - -## Properties - -### cameraEnabled? - -> `optional` **cameraEnabled**: `boolean` - -Defined in: [packages/react-native-client/src/hooks/useCamera.ts:65](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useCamera.ts#L65) - -whether the camera track is initially enabled, you can toggle it on/off later with toggleCamera method - -#### Default - -`true` - -*** - -### cameraId? - -> `optional` **cameraId**: [`CameraId`](CameraId.md) - -Defined in: [packages/react-native-client/src/hooks/useCamera.ts:71](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useCamera.ts#L71) - -id of the camera to start capture with. Get available cameras with `cameras`. -You can switch the cameras later with `switchCamera` functions. - -#### Default - -`the first front camera` - -*** - -### flipDimensions? - -> `optional` **flipDimensions**: `boolean` - -Defined in: [packages/react-native-client/src/hooks/useCamera.ts:60](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useCamera.ts#L60) - -whether to flip the dimensions of the video, that is whether to film in vertical orientation. -This basically switches width with height and is only used to select closes capture format. - -To record horizontal video your phone orientation must be in landscape and your app must support this orientation. - -Platform specific capture formats: - -#### See - - - [iOS](https://developer.apple.com/documentation/avfoundation/avcapturedevice/format) - - [Android](https://github.com/webrtc-sdk/webrtc/blob/cdc3bba5aa38910a55428b919ba45aceac1ad9ad/sdk/android/api/org/webrtc/CameraEnumerationAndroid.java#L50) - -WebRTC device orientation handling: - - [iOS](https://github.com/webrtc-sdk/webrtc/blob/cdc3bba5aa38910a55428b919ba45aceac1ad9ad/sdk/objc/components/capturer/RTCCameraVideoCapturer.m#L285) - - [Android](https://github.com/pristineio/webrtc-mirror/blob/7a5bcdffaab90a05bc1146b2b1ea71c004e54d71/webrtc/sdk/android/src/java/org/webrtc/Camera2Session.java#L347) - -#### Default - -`true` - -*** - -### quality? - -> `optional` **quality**: [`VideoQuality`](VideoQuality.md) - -Defined in: [packages/react-native-client/src/hooks/useCamera.ts:43](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useCamera.ts#L43) - -resolution + aspect ratio of local video track, one of: `QVGA_169`, `VGA_169`, `QHD_169`, `HD_169`, -`FHD_169`, `QVGA_43`, `VGA_43`, `QHD_43`, `HD_43`, `FHD_43`. Note that quality might be worse than -specified due to device capabilities, internet connection etc. - -#### Default - -`VGA_169` diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/CameraFacingDirection.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/CameraFacingDirection.md deleted file mode 100644 index 203ac17e..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/CameraFacingDirection.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: CameraFacingDirection - -> **CameraFacingDirection** = `"front"` \| `"back"` \| `"unspecified"` - -Defined in: [packages/react-native-client/src/hooks/useCamera.ts:10](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useCamera.ts#L10) diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/CameraId.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/CameraId.md deleted file mode 100644 index 4498cd17..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/CameraId.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: CameraId - -> **CameraId** = [`Brand`](Brand.md)\<`string`, `"CameraId"`\> - -Defined in: [packages/react-native-client/src/hooks/useCamera.ts:8](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useCamera.ts#L8) diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/ConnectViewerConfig.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/ConnectViewerConfig.md deleted file mode 100644 index 6b82b99d..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/ConnectViewerConfig.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: ConnectViewerConfig - -> **ConnectViewerConfig** = \{ `streamId?`: `never`; `token`: `string`; \} \| \{ `streamId`: `string`; `token?`: `never`; \} - -Defined in: [packages/react-native-client/src/hooks/useLivestreamViewer.ts:9](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useLivestreamViewer.ts#L9) diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/ConnectionConfig.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/ConnectionConfig.md deleted file mode 100644 index a2a7d5d0..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/ConnectionConfig.md +++ /dev/null @@ -1,26 +0,0 @@ -# Type Alias: ConnectionConfig - -> **ConnectionConfig** = `object` - -Defined in: [packages/react-native-client/src/common/client.ts:4](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/common/client.ts#L4) - -## Properties - -### reconnectConfig? - -> `optional` **reconnectConfig**: `object` - -Defined in: [packages/react-native-client/src/common/client.ts:13](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/common/client.ts#L13) - -Configuration for automatic reconnection -sdk uses a linear backoff algorithm, that is the formula -for the delay of the nth attempt is -n * delayMs + initialDelayMs - -Pass 0 for maxAttempts to disable automatic reconnection - -| Name | Type | -| ------ | ------ | -| `delayMs?` | `number` | -| `initialDelayMs?` | `number` | -| `maxAttempts?` | `number` | diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/DistinguishedTracks.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/DistinguishedTracks.md deleted file mode 100644 index 20794d66..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/DistinguishedTracks.md +++ /dev/null @@ -1,37 +0,0 @@ -# Type Alias: DistinguishedTracks - -> **DistinguishedTracks** = `object` - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:54](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L54) - -## Properties - -### cameraTrack? - -> `optional` **cameraTrack**: [`VideoTrack`](VideoTrack.md) - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:55](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L55) - -*** - -### microphoneTrack? - -> `optional` **microphoneTrack**: [`AudioTrack`](AudioTrack.md) - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:56](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L56) - -*** - -### screenShareAudioTrack? - -> `optional` **screenShareAudioTrack**: [`AudioTrack`](AudioTrack.md) - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:58](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L58) - -*** - -### screenShareVideoTrack? - -> `optional` **screenShareVideoTrack**: [`VideoTrack`](VideoTrack.md) - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:57](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L57) diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/EncodingReason.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/EncodingReason.md deleted file mode 100644 index b1e667c8..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/EncodingReason.md +++ /dev/null @@ -1,11 +0,0 @@ -# Type Alias: EncodingReason - -> **EncodingReason** = `"other"` \| `"encoding_inactive"` \| `"low_bandwidth"` - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:52](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L52) - -Type describing possible reasons of currently selected encoding. - -- other - the exact reason couldn't be determined -- encoding_inactive - previously selected encoding became inactive -- low_bandwidth - there is no longer enough bandwidth to maintain previously selected encoding diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/FishjamRoomProps.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/FishjamRoomProps.md deleted file mode 100644 index 6c05bc9c..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/FishjamRoomProps.md +++ /dev/null @@ -1,25 +0,0 @@ -# Type Alias: FishjamRoomProps - -> **FishjamRoomProps** = `object` - -Defined in: [packages/react-native-client/src/components/FishjamRoom/index.tsx:7](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/FishjamRoom/index.tsx#L7) - -## Properties - -### fishjamUrl - -> **fishjamUrl**: `string` - -Defined in: [packages/react-native-client/src/components/FishjamRoom/index.tsx:11](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/FishjamRoom/index.tsx#L11) - -URL to your fishjam instance - -*** - -### peerToken - -> **peerToken**: `string` - -Defined in: [packages/react-native-client/src/components/FishjamRoom/index.tsx:15](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/FishjamRoom/index.tsx#L15) - -Peer Token diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/ForegroundServiceConfig.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/ForegroundServiceConfig.md deleted file mode 100644 index 1eca6631..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/ForegroundServiceConfig.md +++ /dev/null @@ -1,67 +0,0 @@ -# Type Alias: ForegroundServiceConfig - -> **ForegroundServiceConfig** = `object` - -Defined in: [packages/react-native-client/src/hooks/useForegroundService.ts:9](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useForegroundService.ts#L9) - -A type representing the configuration for foreground service permissions. - -## Properties - -### channelId? - -> `optional` **channelId**: `string` - -Defined in: [packages/react-native-client/src/hooks/useForegroundService.ts:21](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useForegroundService.ts#L21) - -The id of the channel. Must be unique per package. - -*** - -### channelName? - -> `optional` **channelName**: `string` - -Defined in: [packages/react-native-client/src/hooks/useForegroundService.ts:25](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useForegroundService.ts#L25) - -The user visible name of the channel. - -*** - -### enableCamera? - -> `optional` **enableCamera**: `boolean` - -Defined in: [packages/react-native-client/src/hooks/useForegroundService.ts:13](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useForegroundService.ts#L13) - -Indicates whether the camera is enabled for the foreground service. - -*** - -### enableMicrophone? - -> `optional` **enableMicrophone**: `boolean` - -Defined in: [packages/react-native-client/src/hooks/useForegroundService.ts:17](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useForegroundService.ts#L17) - -Indicates whether the microphone is enabled for the foreground service. - -*** - -### notificationContent? - -> `optional` **notificationContent**: `string` - -Defined in: [packages/react-native-client/src/hooks/useForegroundService.ts:33](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useForegroundService.ts#L33) - -The text (second row) of the notification, in a standard notification. - -*** - -### notificationTitle? - -> `optional` **notificationTitle**: `string` - -Defined in: [packages/react-native-client/src/hooks/useForegroundService.ts:29](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useForegroundService.ts#L29) - -The title (first row) of the notification, in a standard notification. diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/GenericMetadata.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/GenericMetadata.md deleted file mode 100644 index e85d3ffd..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/GenericMetadata.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: GenericMetadata - -> **GenericMetadata** = `Record`\<`string`, `unknown`\> - -Defined in: [packages/react-native-client/src/types.ts:27](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/types.ts#L27) diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/JoinRoomConfig.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/JoinRoomConfig.md deleted file mode 100644 index 366410a7..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/JoinRoomConfig.md +++ /dev/null @@ -1,31 +0,0 @@ -# Type Alias: JoinRoomConfig\ - -> **JoinRoomConfig**\<`PeerMetadata`\> = `object` & \{ `fishjamId`: `string`; `url?`: `never`; \} \| \{ `fishjamId?`: `never`; `url`: `string`; \} - -Defined in: [packages/react-native-client/src/hooks/useConnection.ts:47](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useConnection.ts#L47) - -## Type declaration - -### config? - -> `optional` **config**: [`ConnectionConfig`](ConnectionConfig.md) - -Additional connection configuration - -### peerMetadata? - -> `optional` **peerMetadata**: `PeerMetadata` - -String indexed record with metadata, that will be available to all other peers - -### peerToken - -> **peerToken**: `string` - -Token received from server (or Room Manager) - -## Type Parameters - -| Type Parameter | Default type | -| ------ | ------ | -| `PeerMetadata` *extends* [`GenericMetadata`](GenericMetadata.md) | [`GenericMetadata`](GenericMetadata.md) | diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/LivestreamStreamerProps.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/LivestreamStreamerProps.md deleted file mode 100644 index 588c6225..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/LivestreamStreamerProps.md +++ /dev/null @@ -1,17 +0,0 @@ -# Type Alias: LivestreamStreamerProps - -> **LivestreamStreamerProps** = `object` - -Defined in: [packages/react-native-client/src/components/LivestreamStreamer.tsx:8](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/LivestreamStreamer.tsx#L8) - -Props of the LivestreamView component - -## Properties - -### style? - -> `optional` **style**: `StyleProp`\<`ViewStyle`\> - -Defined in: [packages/react-native-client/src/components/LivestreamStreamer.tsx:12](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/LivestreamStreamer.tsx#L12) - -Styles of the LivestreamView component diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/LivestreamViewerProps.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/LivestreamViewerProps.md deleted file mode 100644 index a3f4e383..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/LivestreamViewerProps.md +++ /dev/null @@ -1,85 +0,0 @@ -# Type Alias: LivestreamViewerProps - -> **LivestreamViewerProps** = `object` - -Defined in: [packages/react-native-client/src/components/LivestreamViewer.tsx:10](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/LivestreamViewer.tsx#L10) - -Props of the LivestreamView component - -## Properties - -### autoStartPip? - -> `optional` **autoStartPip**: `boolean` - -Defined in: [packages/react-native-client/src/components/LivestreamViewer.tsx:29](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/LivestreamViewer.tsx#L29) - -A variable deciding whether the Picture-in-Picture mode should be started automatically after the app is backgrounded. -Defaults to false. - -*** - -### autoStopPip? - -> `optional` **autoStopPip**: `boolean` - -Defined in: [packages/react-native-client/src/components/LivestreamViewer.tsx:35](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/LivestreamViewer.tsx#L35) - -A variable deciding whether the Picture-in-Picture mode should be stopped automatically on iOS after the app is foregrounded. -Always enabled on Android as PiP is not supported in foreground. -Defaults to false. - -*** - -### orientation? - -> `optional` **orientation**: `"landscape"` \| `"portrait"` - -Defined in: [packages/react-native-client/src/components/LivestreamViewer.tsx:19](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/LivestreamViewer.tsx#L19) - -Used to override the orientation of the video (from metadata). -Defaults to "portrait". - -*** - -### pipEnabled? - -> `optional` **pipEnabled**: `boolean` - -Defined in: [packages/react-native-client/src/components/LivestreamViewer.tsx:24](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/LivestreamViewer.tsx#L24) - -A variable deciding whether the Picture-in-Picture is enabled. -Defaults to true. - -*** - -### pipSize? - -> `optional` **pipSize**: `object` - -Defined in: [packages/react-native-client/src/components/LivestreamViewer.tsx:39](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/LivestreamViewer.tsx#L39) - -A variable deciding the size of the Picture-in-Picture mode. - -| Name | Type | -| ------ | ------ | -| `height` | `number` | -| `width` | `number` | - -*** - -### ref? - -> `optional` **ref**: `Ref`\<[`LivestreamViewerRef`](LivestreamViewerRef.md)\> - -Defined in: [packages/react-native-client/src/components/LivestreamViewer.tsx:44](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/LivestreamViewer.tsx#L44) - -*** - -### style? - -> `optional` **style**: `StyleProp`\<`ViewStyle`\> - -Defined in: [packages/react-native-client/src/components/LivestreamViewer.tsx:14](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/LivestreamViewer.tsx#L14) - -Styles of the LivestreamView component diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/LivestreamViewerRef.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/LivestreamViewerRef.md deleted file mode 100644 index 57da907e..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/LivestreamViewerRef.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: LivestreamViewerRef - -> **LivestreamViewerRef** = `WhepClientViewRef` - -Defined in: [packages/react-native-client/src/components/LivestreamViewer.tsx:5](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/LivestreamViewer.tsx#L5) diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/Peer.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/Peer.md deleted file mode 100644 index b8544405..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/Peer.md +++ /dev/null @@ -1,52 +0,0 @@ -# Type Alias: Peer\ - -> **Peer**\<`PeerMetadata`, `ServerMetadata`\> = `object` - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:66](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L66) - -## Type Parameters - -| Type Parameter | Default type | -| ------ | ------ | -| `PeerMetadata` *extends* [`GenericMetadata`](GenericMetadata.md) | [`GenericMetadata`](GenericMetadata.md) | -| `ServerMetadata` *extends* [`GenericMetadata`](GenericMetadata.md) | [`GenericMetadata`](GenericMetadata.md) | - -## Properties - -### id - -> **id**: [`PeerId`](PeerId.md) - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:73](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L73) - -id used to identify a peer - -*** - -### isLocal - -> **isLocal**: `boolean` - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:77](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L77) - -whether the peer is local or remote - -*** - -### metadata - -> **metadata**: [`PeerTrackMetadata`](PeerTrackMetadata.md)\<`PeerMetadata`, `ServerMetadata`\> - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:81](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L81) - -a type containing peer and server metadata - -*** - -### tracks - -> **tracks**: [`Track`](Track.md)[] - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:85](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L85) - -a list of peer's video and audio tracks diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/PeerId.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/PeerId.md deleted file mode 100644 index 7d91f146..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/PeerId.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: PeerId - -> **PeerId** = [`Brand`](Brand.md)\<`string`, `"PeerId"`\> - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:9](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L9) diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/PeerStatus.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/PeerStatus.md deleted file mode 100644 index 2a7570a7..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/PeerStatus.md +++ /dev/null @@ -1,12 +0,0 @@ -# Type Alias: PeerStatus - -> **PeerStatus** = `"connecting"` \| `"connected"` \| `"error"` \| `"idle"` - -Defined in: [packages/react-native-client/src/hooks/useConnection.ts:32](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useConnection.ts#L32) - -Represents the possible statuses of a peer connection to a room (websocket state). - -- `idle` - Peer is not connected, either never connected or successfully disconnected. -- `connecting` - Peer is in the process of connecting. -- `connected` - Peer has successfully connected. -- `error` - There was an error in the connection process. diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/PeerTrackMetadata.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/PeerTrackMetadata.md deleted file mode 100644 index efa1bb11..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/PeerTrackMetadata.md +++ /dev/null @@ -1,28 +0,0 @@ -# Type Alias: PeerTrackMetadata\ - -> **PeerTrackMetadata**\<`PeerMetadata`, `ServerMetadata`\> = `object` - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:22](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L22) - -## Type Parameters - -| Type Parameter | -| ------ | -| `PeerMetadata` | -| `ServerMetadata` | - -## Properties - -### peer - -> **peer**: `PeerMetadata` - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:23](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L23) - -*** - -### server - -> **server**: `ServerMetadata` - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:24](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L24) diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/PeerWithTracks.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/PeerWithTracks.md deleted file mode 100644 index ed45cb5a..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/PeerWithTracks.md +++ /dev/null @@ -1,12 +0,0 @@ -# Type Alias: PeerWithTracks\ - -> **PeerWithTracks**\<`PeerMetadata`, `ServerMetadata`\> = [`Peer`](Peer.md)\<`PeerMetadata`, `ServerMetadata`\> & [`DistinguishedTracks`](DistinguishedTracks.md) - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:61](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L61) - -## Type Parameters - -| Type Parameter | Default type | -| ------ | ------ | -| `PeerMetadata` *extends* [`GenericMetadata`](GenericMetadata.md) | [`GenericMetadata`](GenericMetadata.md) | -| `ServerMetadata` *extends* [`GenericMetadata`](GenericMetadata.md) | [`GenericMetadata`](GenericMetadata.md) | diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/ReconnectionStatus.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/ReconnectionStatus.md deleted file mode 100644 index 78419cba..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/ReconnectionStatus.md +++ /dev/null @@ -1,11 +0,0 @@ -# Type Alias: ReconnectionStatus - -> **ReconnectionStatus** = `"idle"` \| `"reconnecting"` \| `"error"` - -Defined in: [packages/react-native-client/src/hooks/useConnection.ts:22](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useConnection.ts#L22) - -Represents the possible statuses of a peer while reconnecting to room - -- `idle` - No reconnection in progress. See [PeerStatus](PeerStatus.md) for more details -- `reconnecting` - Peer is in the process of reconnecting. -- `error` - There was an error in the reconnection process. diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/RoomType.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/RoomType.md deleted file mode 100644 index 12445374..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/RoomType.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: RoomType - -> **RoomType** = `"conference"` \| `"audio-only"` \| `"livestream"` - -Defined in: [packages/react-native-client/src/types.ts:36](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/types.ts#L36) diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/ScreenShareOptions.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/ScreenShareOptions.md deleted file mode 100644 index 6f830586..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/ScreenShareOptions.md +++ /dev/null @@ -1,21 +0,0 @@ -# Type Alias: ScreenShareOptions - -> **ScreenShareOptions** = `object` - -Defined in: [packages/react-native-client/src/hooks/useScreenShare.ts:12](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useScreenShare.ts#L12) - -## Properties - -### quality - -> **quality**: [`ScreenShareQuality`](ScreenShareQuality.md) - -Defined in: [packages/react-native-client/src/hooks/useScreenShare.ts:19](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useScreenShare.ts#L19) - -Resolution + fps of screen share track, one of: `VGA`, `HD5`, `HD15`, `FHD15`, `FHD30`. -Note that quality might be worse than specified due to device capabilities, internet -connection etc. - -#### Default - -`HD15` diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/ScreenShareQuality.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/ScreenShareQuality.md deleted file mode 100644 index e590fb5a..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/ScreenShareQuality.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: ScreenShareQuality - -> **ScreenShareQuality** = `"VGA"` \| `"HD5"` \| `"HD15"` \| `"FHD15"` \| `"FHD30"` - -Defined in: [packages/react-native-client/src/hooks/useScreenShare.ts:10](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useScreenShare.ts#L10) diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/SimulcastConfig.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/SimulcastConfig.md deleted file mode 100644 index 59f69c46..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/SimulcastConfig.md +++ /dev/null @@ -1,21 +0,0 @@ -# Type Alias: SimulcastConfig - -> **SimulcastConfig** = `object` - -Defined in: [packages/react-native-client/src/types.ts:15](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/types.ts#L15) - -A type describing simulcast configuration. - -At the moment, simulcast track is initialized in three versions - low, medium and high. -High resolution is the original track resolution, while medium and low resolutions are -the original track resolution scaled down by 2 and 4 respectively. - -## Properties - -### enabled - -> **enabled**: `boolean` - -Defined in: [packages/react-native-client/src/types.ts:19](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/types.ts#L19) - -whether to simulcast track or not. By default simulcast is disabled. diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/Track.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/Track.md deleted file mode 100644 index 22e14151..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/Track.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: Track - -> **Track** = [`VideoTrack`](VideoTrack.md) \| [`AudioTrack`](AudioTrack.md) - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:44](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L44) diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/TrackBase.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/TrackBase.md deleted file mode 100644 index 06fcd2af..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/TrackBase.md +++ /dev/null @@ -1,37 +0,0 @@ -# Type Alias: TrackBase - -> **TrackBase** = `object` - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:27](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L27) - -## Properties - -### id - -> **id**: [`TrackId`](TrackId.md) - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:28](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L28) - -*** - -### isActive - -> **isActive**: `boolean` - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:30](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L30) - -*** - -### metadata? - -> `optional` **metadata**: [`TrackMetadata`](TrackMetadata.md) - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:31](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L31) - -*** - -### type - -> **type**: [`TrackType`](TrackType.md) - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:29](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L29) diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/TrackId.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/TrackId.md deleted file mode 100644 index 479aa6a8..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/TrackId.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: TrackId - -> **TrackId** = [`Brand`](Brand.md)\<`string`, `"TrackId"`\> - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:10](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L10) diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/TrackMetadata.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/TrackMetadata.md deleted file mode 100644 index a2b6214c..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/TrackMetadata.md +++ /dev/null @@ -1,21 +0,0 @@ -# Type Alias: TrackMetadata - -> **TrackMetadata** = `object` - -Defined in: [packages/react-native-client/src/types.ts:22](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/types.ts#L22) - -## Properties - -### active - -> **active**: `boolean` - -Defined in: [packages/react-native-client/src/types.ts:23](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/types.ts#L23) - -*** - -### type - -> **type**: `"microphone"` \| `"camera"` \| `"screenShareVideo"` \| `"screenShareAudio"` - -Defined in: [packages/react-native-client/src/types.ts:24](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/types.ts#L24) diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/TrackType.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/TrackType.md deleted file mode 100644 index a9bbb16a..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/TrackType.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: TrackType - -> **TrackType** = `"Audio"` \| `"Video"` - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:12](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L12) diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/UsePeersResult.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/UsePeersResult.md deleted file mode 100644 index cccfe53b..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/UsePeersResult.md +++ /dev/null @@ -1,38 +0,0 @@ -# Type Alias: UsePeersResult\ - -> **UsePeersResult**\<`PeerMetadata`, `ServerMetadata`\> = `object` - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:168](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L168) - -Result type for the usePeers hook. - -## Type Parameters - -| Type Parameter | Default type | Description | -| ------ | ------ | ------ | -| `PeerMetadata` *extends* [`GenericMetadata`](GenericMetadata.md) | [`GenericMetadata`](GenericMetadata.md) | Type for peer-specific metadata | -| `ServerMetadata` *extends* [`GenericMetadata`](GenericMetadata.md) | [`GenericMetadata`](GenericMetadata.md) | Type for server-specific metadata | - -## Properties - -### localPeer - -> **localPeer**: [`PeerWithTracks`](PeerWithTracks.md)\<`PeerMetadata`, `ServerMetadata`\> \| `null` - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:172](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L172) - -*** - -### peers - -> **peers**: [`Peer`](Peer.md)\<`PeerMetadata`, `ServerMetadata`\>[] - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:176](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L176) - -*** - -### remotePeers - -> **remotePeers**: [`PeerWithTracks`](PeerWithTracks.md)\<`PeerMetadata`, `ServerMetadata`\>[] - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:174](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L174) diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/UseSandboxProps.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/UseSandboxProps.md deleted file mode 100644 index 59c72ca9..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/UseSandboxProps.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: UseSandboxProps - -> **UseSandboxProps** = \{ `fishjamId`: `string`; `fishjamUrl?`: `never`; \} \| \{ `fishjamId?`: `never`; `fishjamUrl`: `string`; \} - -Defined in: [packages/react-native-client/src/hooks/useSandbox.ts:12](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useSandbox.ts#L12) diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/VadStatus.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/VadStatus.md deleted file mode 100644 index 97c3636f..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/VadStatus.md +++ /dev/null @@ -1,10 +0,0 @@ -# Type Alias: VadStatus - -> **VadStatus** = `"silence"` \| `"speech"` - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:20](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L20) - -Type describing Voice Activity Detection statuses. - -- `speech` voice activity has been detected -- `silence` - lack of voice activity has been detected diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/VideoLayout.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/VideoLayout.md deleted file mode 100644 index 2b7bb6ad..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/VideoLayout.md +++ /dev/null @@ -1,9 +0,0 @@ -# Type Alias: VideoLayout - -> **VideoLayout** = `"FILL"` \| `"FIT"` - -Defined in: [packages/react-native-client/src/types.ts:6](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/types.ts#L6) - -`FILL` or `FIT` - it works just like RN Image component. `FILL` fills the whole view -with video and it may cut some parts of the video. `FIT` scales the video so the whole -video is visible, but it may leave some empty space in the view. diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/VideoPreviewViewProps.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/VideoPreviewViewProps.md deleted file mode 100644 index 515c9891..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/VideoPreviewViewProps.md +++ /dev/null @@ -1,41 +0,0 @@ -# Type Alias: VideoPreviewViewProps - -> **VideoPreviewViewProps** = `object` - -Defined in: [packages/react-native-client/src/components/VideoPreviewView.tsx:8](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/VideoPreviewView.tsx#L8) - -## Properties - -### cameraId? - -> `optional` **cameraId**: [`CameraId`](CameraId.md) - -Defined in: [packages/react-native-client/src/components/VideoPreviewView.tsx:20](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/VideoPreviewView.tsx#L20) - -Id of the camera used for preview. Get available cameras with `cameras` property. - -#### Default - -`the first front camera` - -*** - -### style? - -> `optional` **style**: `StyleProp`\<`ViewStyle`\> - -Defined in: [packages/react-native-client/src/components/VideoPreviewView.tsx:15](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/VideoPreviewView.tsx#L15) - -*** - -### videoLayout? - -> `optional` **videoLayout**: [`VideoLayout`](VideoLayout.md) - -Defined in: [packages/react-native-client/src/components/VideoPreviewView.tsx:13](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/VideoPreviewView.tsx#L13) - -Video layout inside of the component - -#### Default - -`FILL` diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/VideoQuality.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/VideoQuality.md deleted file mode 100644 index 7452ff92..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/VideoQuality.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: VideoQuality - -> **VideoQuality** = `"QVGA169"` \| `"VGA169"` \| `"QHD169"` \| `"HD169"` \| `"FHD169"` \| `"QVGA43"` \| `"VGA43"` \| `"QHD43"` \| `"HD43"` \| `"FHD43"` - -Defined in: [packages/react-native-client/src/hooks/useCamera.ts:24](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useCamera.ts#L24) diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/VideoRendererProps.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/VideoRendererProps.md deleted file mode 100644 index 8c77b3f8..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/VideoRendererProps.md +++ /dev/null @@ -1,47 +0,0 @@ -# Type Alias: VideoRendererProps - -> **VideoRendererProps** = `object` - -Defined in: [packages/react-native-client/src/components/VideoRendererView.tsx:8](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/VideoRendererView.tsx#L8) - -## Properties - -### skipRenderOutsideVisibleArea? - -> `optional` **skipRenderOutsideVisibleArea**: `boolean` - -Defined in: [packages/react-native-client/src/components/VideoRendererView.tsx:21](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/VideoRendererView.tsx#L21) - -Whether the video should be rendered if it's off screen or hidden. - -*** - -### style? - -> `optional` **style**: `StyleProp`\<`ViewStyle`\> - -Defined in: [packages/react-native-client/src/components/VideoRendererView.tsx:22](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/VideoRendererView.tsx#L22) - -*** - -### trackId - -> **trackId**: [`TrackId`](TrackId.md) - -Defined in: [packages/react-native-client/src/components/VideoRendererView.tsx:12](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/VideoRendererView.tsx#L12) - -id of the video track which you want to render. - -*** - -### videoLayout? - -> `optional` **videoLayout**: [`VideoLayout`](VideoLayout.md) - -Defined in: [packages/react-native-client/src/components/VideoRendererView.tsx:17](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/VideoRendererView.tsx#L17) - -Video layout inside of the component - -#### Default - -`FILL` diff --git a/versioned_docs/version-0.20.0/api/mobile/type-aliases/VideoTrack.md b/versioned_docs/version-0.20.0/api/mobile/type-aliases/VideoTrack.md deleted file mode 100644 index deba2577..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/type-aliases/VideoTrack.md +++ /dev/null @@ -1,15 +0,0 @@ -# Type Alias: VideoTrack - -> **VideoTrack** = [`TrackBase`](TrackBase.md) & `object` - -Defined in: [packages/react-native-client/src/hooks/usePeers.ts:39](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePeers.ts#L39) - -## Type declaration - -### aspectRatio - -> **aspectRatio**: `number` - -### type - -> **type**: `"Video"` diff --git a/versioned_docs/version-0.20.0/api/mobile/typedoc-sidebar.cjs b/versioned_docs/version-0.20.0/api/mobile/typedoc-sidebar.cjs deleted file mode 100644 index 641d3fa8..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/typedoc-sidebar.cjs +++ /dev/null @@ -1,4 +0,0 @@ -// @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/usePeers",label:"usePeers"},{type:"doc",id:"api/mobile/functions/useScreenShare",label:"useScreenShare"},{type:"doc",id:"api/mobile/functions/useUpdatePeerMetadata",label:"useUpdatePeerMetadata"},{type:"doc",id:"api/mobile/variables/useAppScreenShare",label:"useAppScreenShare"},{type:"doc",id:"api/mobile/variables/useForegroundService",label:"useForegroundService"}]},{type:"category",label:"Devices",items:[{type:"doc",id:"api/mobile/functions/useAudioSettings",label:"useAudioSettings"},{type:"doc",id:"api/mobile/functions/useCamera",label:"useCamera"},{type:"doc",id:"api/mobile/functions/useMicrophone",label:"useMicrophone"}]},{type:"category",label:"Components",items:[{type:"doc",id:"api/mobile/functions/FishjamRoom",label:"FishjamRoom"},{type:"doc",id:"api/mobile/functions/LivestreamStreamer",label:"LivestreamStreamer"},{type:"doc",id:"api/mobile/functions/LivestreamViewer",label:"LivestreamViewer"},{type:"doc",id:"api/mobile/variables/VideoPreviewView",label:"VideoPreviewView"},{type:"doc",id:"api/mobile/variables/VideoRendererView",label:"VideoRendererView"}]},{type:"category",label:"Livestream",items:[{type:"doc",id:"api/mobile/functions/useLivestreamStreamer",label:"useLivestreamStreamer"},{type:"doc",id:"api/mobile/functions/useLivestreamViewer",label:"useLivestreamViewer"},{type:"doc",id:"api/mobile/interfaces/useLivestreamStreamerResult",label:"useLivestreamStreamerResult"},{type:"doc",id:"api/mobile/interfaces/useLivestreamViewerResult",label:"useLivestreamViewerResult"}]},{type:"category",label:"Other",items:[{type:"doc",id:"api/mobile/functions/useSandbox",label:"useSandbox"},{type:"doc",id:"api/mobile/type-aliases/AppScreenShareData",label:"AppScreenShareData"},{type:"doc",id:"api/mobile/type-aliases/AudioOutputDevice",label:"AudioOutputDevice"},{type:"doc",id:"api/mobile/type-aliases/AudioOutputDeviceType",label:"AudioOutputDeviceType"},{type:"doc",id:"api/mobile/type-aliases/AudioSessionMode",label:"AudioSessionMode"},{type:"doc",id:"api/mobile/type-aliases/AudioTrack",label:"AudioTrack"},{type:"doc",id:"api/mobile/type-aliases/Brand",label:"Brand"},{type:"doc",id:"api/mobile/type-aliases/Camera",label:"Camera"},{type:"doc",id:"api/mobile/type-aliases/CameraConfig",label:"CameraConfig"},{type:"doc",id:"api/mobile/type-aliases/CameraConfigBase",label:"CameraConfigBase"},{type:"doc",id:"api/mobile/type-aliases/CameraFacingDirection",label:"CameraFacingDirection"},{type:"doc",id:"api/mobile/type-aliases/CameraId",label:"CameraId"},{type:"doc",id:"api/mobile/type-aliases/ConnectionConfig",label:"ConnectionConfig"},{type:"doc",id:"api/mobile/type-aliases/ConnectViewerConfig",label:"ConnectViewerConfig"},{type:"doc",id:"api/mobile/type-aliases/DistinguishedTracks",label:"DistinguishedTracks"},{type:"doc",id:"api/mobile/type-aliases/EncodingReason",label:"EncodingReason"},{type:"doc",id:"api/mobile/type-aliases/FishjamRoomProps",label:"FishjamRoomProps"},{type:"doc",id:"api/mobile/type-aliases/ForegroundServiceConfig",label:"ForegroundServiceConfig"},{type:"doc",id:"api/mobile/type-aliases/GenericMetadata",label:"GenericMetadata"},{type:"doc",id:"api/mobile/type-aliases/JoinRoomConfig",label:"JoinRoomConfig"},{type:"doc",id:"api/mobile/type-aliases/LivestreamStreamerProps",label:"LivestreamStreamerProps"},{type:"doc",id:"api/mobile/type-aliases/LivestreamViewerProps",label:"LivestreamViewerProps"},{type:"doc",id:"api/mobile/type-aliases/LivestreamViewerRef",label:"LivestreamViewerRef"},{type:"doc",id:"api/mobile/type-aliases/Peer",label:"Peer"},{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/PeerTrackMetadata",label:"PeerTrackMetadata"},{type:"doc",id:"api/mobile/type-aliases/PeerWithTracks",label:"PeerWithTracks"},{type:"doc",id:"api/mobile/type-aliases/ReconnectionStatus",label:"ReconnectionStatus"},{type:"doc",id:"api/mobile/type-aliases/RoomType",label:"RoomType"},{type:"doc",id:"api/mobile/type-aliases/ScreenShareOptions",label:"ScreenShareOptions"},{type:"doc",id:"api/mobile/type-aliases/ScreenShareQuality",label:"ScreenShareQuality"},{type:"doc",id:"api/mobile/type-aliases/SimulcastConfig",label:"SimulcastConfig"},{type:"doc",id:"api/mobile/type-aliases/Track",label:"Track"},{type:"doc",id:"api/mobile/type-aliases/TrackBase",label:"TrackBase"},{type:"doc",id:"api/mobile/type-aliases/TrackId",label:"TrackId"},{type:"doc",id:"api/mobile/type-aliases/TrackMetadata",label:"TrackMetadata"},{type:"doc",id:"api/mobile/type-aliases/TrackType",label:"TrackType"},{type:"doc",id:"api/mobile/type-aliases/UsePeersResult",label:"UsePeersResult"},{type:"doc",id:"api/mobile/type-aliases/UseSandboxProps",label:"UseSandboxProps"},{type:"doc",id:"api/mobile/type-aliases/VadStatus",label:"VadStatus"},{type:"doc",id:"api/mobile/type-aliases/VideoLayout",label:"VideoLayout"},{type:"doc",id:"api/mobile/type-aliases/VideoPreviewViewProps",label:"VideoPreviewViewProps"},{type:"doc",id:"api/mobile/type-aliases/VideoQuality",label:"VideoQuality"},{type:"doc",id:"api/mobile/type-aliases/VideoRendererProps",label:"VideoRendererProps"},{type:"doc",id:"api/mobile/type-aliases/VideoTrack",label:"VideoTrack"},{type:"doc",id:"api/mobile/variables/cameras",label:"cameras"},{type:"doc",id:"api/mobile/variables/useCameraPermissions",label:"useCameraPermissions"},{type:"doc",id:"api/mobile/variables/useMicrophonePermissions",label:"useMicrophonePermissions"}]},{type:"category",label:"Debugging",items:[{type:"doc",id:"api/mobile/functions/useBandwidthEstimation",label:"useBandwidthEstimation"}]}]}; -module.exports = typedocSidebar.items; \ No newline at end of file diff --git a/versioned_docs/version-0.20.0/api/mobile/variables/VideoPreviewView.md b/versioned_docs/version-0.20.0/api/mobile/variables/VideoPreviewView.md deleted file mode 100644 index f3a850bc..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/variables/VideoPreviewView.md +++ /dev/null @@ -1,12 +0,0 @@ -# Variable: VideoPreviewView - -> `const` **VideoPreviewView**: `ForwardRefExoticComponent`\<[`VideoPreviewViewProps`](../type-aliases/VideoPreviewViewProps.md) & `RefAttributes`\<`ComponentType`\<[`VideoPreviewViewProps`](../type-aliases/VideoPreviewViewProps.md)\>\>\> - -Defined in: [packages/react-native-client/src/components/VideoPreviewView.tsx:35](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/VideoPreviewView.tsx#L35) - -Render camera preview. -Allows to display camera preview before streaming is started - -## Param - -## Param diff --git a/versioned_docs/version-0.20.0/api/mobile/variables/VideoRendererView.md b/versioned_docs/version-0.20.0/api/mobile/variables/VideoRendererView.md deleted file mode 100644 index f5638089..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/variables/VideoRendererView.md +++ /dev/null @@ -1,20 +0,0 @@ -# Variable: VideoRendererView - -> `const` **VideoRendererView**: `ForwardRefExoticComponent`\<[`VideoRendererProps`](../type-aliases/VideoRendererProps.md) & `RefAttributes`\<`ComponentType`\<[`VideoRendererProps`](../type-aliases/VideoRendererProps.md)\>\>\> - -Defined in: [packages/react-native-client/src/components/VideoRendererView.tsx:45](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/components/VideoRendererView.tsx#L45) - -Render video track received from [usePeers](../functions/usePeers.md) hook - -Example usage: -```js - - ``` - -## Param - -## Param diff --git a/versioned_docs/version-0.20.0/api/mobile/variables/cameras.md b/versioned_docs/version-0.20.0/api/mobile/variables/cameras.md deleted file mode 100644 index 898ac345..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/variables/cameras.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: cameras - -> `const` **cameras**: readonly `Camera`[] - -Defined in: node\_modules/react-native-whip-whep/build/ReactNativeMobileWhepClientModule.d.ts:74 - -Gives access to the cameras available on the device. diff --git a/versioned_docs/version-0.20.0/api/mobile/variables/useAppScreenShare.md b/versioned_docs/version-0.20.0/api/mobile/variables/useAppScreenShare.md deleted file mode 100644 index 6b4b9cc2..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/variables/useAppScreenShare.md +++ /dev/null @@ -1,15 +0,0 @@ -# Variable: useAppScreenShare() - -> `const` **useAppScreenShare**: () => [`AppScreenShareData`](../type-aliases/AppScreenShareData.md) - -Defined in: [packages/react-native-client/src/hooks/useAppScreenShare.ts:80](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useAppScreenShare.ts#L80) - -This hook can toggle client app screen sharing on/off and provides current screen share state. - -It works only on iOS. - -## Returns - -[`AppScreenShareData`](../type-aliases/AppScreenShareData.md) - -An object with functions to manage app screen share on iOS and null on android. diff --git a/versioned_docs/version-0.20.0/api/mobile/variables/useCameraPermissions.md b/versioned_docs/version-0.20.0/api/mobile/variables/useCameraPermissions.md deleted file mode 100644 index 85461913..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/variables/useCameraPermissions.md +++ /dev/null @@ -1,25 +0,0 @@ -# Variable: useCameraPermissions() - -> `const` **useCameraPermissions**: (`options?`) => \[`null` \| `PermissionResponse`, `RequestPermissionMethod`\<`PermissionResponse`\>, `GetPermissionMethod`\<`PermissionResponse`\>\] - -Defined in: [packages/react-native-client/src/hooks/usePermissions.ts:31](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePermissions.ts#L31) - -Check or request permissions to access the camera. -This uses both `requestCameraPermissionsAsync` and `getCameraPermissionsAsync` to interact with the permissions. - -## Parameters - -| Parameter | Type | -| ------ | ------ | -| `options?` | `PermissionHookOptions`\<`object`\> | - -## Returns - -\[`null` \| `PermissionResponse`, `RequestPermissionMethod`\<`PermissionResponse`\>, `GetPermissionMethod`\<`PermissionResponse`\>\] - -## Example - -```ts -import { useCameraPermissions } from '@fishjam-cloud/react-native-client'; -const [status, requestPermission] = useCameraPermissions(); -``` diff --git a/versioned_docs/version-0.20.0/api/mobile/variables/useForegroundService.md b/versioned_docs/version-0.20.0/api/mobile/variables/useForegroundService.md deleted file mode 100644 index 6e7d61c2..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/variables/useForegroundService.md +++ /dev/null @@ -1,18 +0,0 @@ -# Variable: useForegroundService() - -> `const` **useForegroundService**: (`config`) => `void` - -Defined in: [packages/react-native-client/src/hooks/useForegroundService.ts:109](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/useForegroundService.ts#L109) - -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`](../type-aliases/ForegroundServiceConfig.md) | Configuration options for the foreground service. | - -## Returns - -`void` diff --git a/versioned_docs/version-0.20.0/api/mobile/variables/useMicrophonePermissions.md b/versioned_docs/version-0.20.0/api/mobile/variables/useMicrophonePermissions.md deleted file mode 100644 index 1694d912..00000000 --- a/versioned_docs/version-0.20.0/api/mobile/variables/useMicrophonePermissions.md +++ /dev/null @@ -1,25 +0,0 @@ -# Variable: useMicrophonePermissions() - -> `const` **useMicrophonePermissions**: (`options?`) => \[`null` \| `PermissionResponse`, `RequestPermissionMethod`\<`PermissionResponse`\>, `GetPermissionMethod`\<`PermissionResponse`\>\] - -Defined in: [packages/react-native-client/src/hooks/usePermissions.ts:63](https://github.com/fishjam-cloud/mobile-client-sdk/blob/a60616b68cd043388665165d49f98ce759f80517/packages/react-native-client/src/hooks/usePermissions.ts#L63) - -Check or request permissions to access the microphone. -This uses both `requestMicrophonePermissionsAsync` and `getMicrophonePermissionsAsync` to interact with the permissions. - -## Parameters - -| Parameter | Type | -| ------ | ------ | -| `options?` | `PermissionHookOptions`\<`object`\> | - -## Returns - -\[`null` \| `PermissionResponse`, `RequestPermissionMethod`\<`PermissionResponse`\>, `GetPermissionMethod`\<`PermissionResponse`\>\] - -## Example - -```ts -import { useMicrophonePermissions } from '@fishjam-cloud/react-native-client'; -const [status, requestPermission] = useMicrophonePermissions(); -``` diff --git a/versioned_docs/version-0.20.0/api/server/classes/BadRequestException.md b/versioned_docs/version-0.20.0/api/server/classes/BadRequestException.md deleted file mode 100644 index addcb1eb..00000000 --- a/versioned_docs/version-0.20.0/api/server/classes/BadRequestException.md +++ /dev/null @@ -1,179 +0,0 @@ -# Class: BadRequestException - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:21](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L21) - -## Extends - -- [`FishjamBaseException`](FishjamBaseException.md) - -## Constructors - -### Constructor - -> **new BadRequestException**(`error`): `BadRequestException` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L13) - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `AxiosError`\<`Record`\<`string`, `string`\>\> | - -#### Returns - -`BadRequestException` - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`constructor`](FishjamBaseException.md#constructor) - -## Properties - -### axiosCode? - -> `optional` **axiosCode**: `string` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L11) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`axiosCode`](FishjamBaseException.md#axioscode) - -*** - -### cause? - -> `optional` **cause**: `unknown` - -Defined in: node\_modules/typescript/lib/lib.es2022.error.d.ts:26 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`cause`](FishjamBaseException.md#cause) - -*** - -### details? - -> `optional` **details**: `string` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L12) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`details`](FishjamBaseException.md#details) - -*** - -### message - -> **message**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1077 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`message`](FishjamBaseException.md#message) - -*** - -### name - -> **name**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1076 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`name`](FishjamBaseException.md#name) - -*** - -### prepareStackTrace()? - -> `static` `optional` **prepareStackTrace**: (`err`, `stackTraces`) => `any` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:143 - -Optional override for formatting stack traces - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `err` | `Error` | -| `stackTraces` | `CallSite`[] | - -#### Returns - -`any` - -#### See - -https://v8.dev/docs/stack-trace-api#customizing-stack-traces - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`prepareStackTrace`](FishjamBaseException.md#preparestacktrace) - -*** - -### stack? - -> `optional` **stack**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1078 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`stack`](FishjamBaseException.md#stack) - -*** - -### stackTraceLimit - -> `static` **stackTraceLimit**: `number` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:145 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`stackTraceLimit`](FishjamBaseException.md#stacktracelimit) - -*** - -### statusCode - -> **statusCode**: `number` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L10) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`statusCode`](FishjamBaseException.md#statuscode) - -## Methods - -### captureStackTrace() - -> `static` **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:136 - -Create .stack property on a target object - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `targetObject` | `object` | -| `constructorOpt?` | `Function` | - -#### Returns - -`void` - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`captureStackTrace`](FishjamBaseException.md#capturestacktrace) diff --git a/versioned_docs/version-0.20.0/api/server/classes/FishjamBaseException.md b/versioned_docs/version-0.20.0/api/server/classes/FishjamBaseException.md deleted file mode 100644 index f837cbf7..00000000 --- a/versioned_docs/version-0.20.0/api/server/classes/FishjamBaseException.md +++ /dev/null @@ -1,178 +0,0 @@ -# Class: FishjamBaseException - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:9](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L9) - -## Extends - -- `Error` - -## Extended by - -- [`BadRequestException`](BadRequestException.md) -- [`UnauthorizedException`](UnauthorizedException.md) -- [`ForbiddenException`](ForbiddenException.md) -- [`RoomNotFoundException`](RoomNotFoundException.md) -- [`FishjamNotFoundException`](FishjamNotFoundException.md) -- [`PeerNotFoundException`](PeerNotFoundException.md) -- [`ServiceUnavailableException`](ServiceUnavailableException.md) -- [`UnknownException`](UnknownException.md) - -## Constructors - -### Constructor - -> **new FishjamBaseException**(`error`): `FishjamBaseException` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L13) - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `AxiosError`\<`Record`\<`string`, `string`\>\> | - -#### Returns - -`FishjamBaseException` - -#### Overrides - -`Error.constructor` - -## Properties - -### axiosCode? - -> `optional` **axiosCode**: `string` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L11) - -*** - -### cause? - -> `optional` **cause**: `unknown` - -Defined in: node\_modules/typescript/lib/lib.es2022.error.d.ts:26 - -#### Inherited from - -`Error.cause` - -*** - -### details? - -> `optional` **details**: `string` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L12) - -*** - -### message - -> **message**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1077 - -#### Inherited from - -`Error.message` - -*** - -### name - -> **name**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1076 - -#### Inherited from - -`Error.name` - -*** - -### prepareStackTrace()? - -> `static` `optional` **prepareStackTrace**: (`err`, `stackTraces`) => `any` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:143 - -Optional override for formatting stack traces - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `err` | `Error` | -| `stackTraces` | `CallSite`[] | - -#### Returns - -`any` - -#### See - -https://v8.dev/docs/stack-trace-api#customizing-stack-traces - -#### Inherited from - -`Error.prepareStackTrace` - -*** - -### stack? - -> `optional` **stack**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1078 - -#### Inherited from - -`Error.stack` - -*** - -### stackTraceLimit - -> `static` **stackTraceLimit**: `number` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:145 - -#### Inherited from - -`Error.stackTraceLimit` - -*** - -### statusCode - -> **statusCode**: `number` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L10) - -## Methods - -### captureStackTrace() - -> `static` **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:136 - -Create .stack property on a target object - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `targetObject` | `object` | -| `constructorOpt?` | `Function` | - -#### Returns - -`void` - -#### Inherited from - -`Error.captureStackTrace` diff --git a/versioned_docs/version-0.20.0/api/server/classes/FishjamClient.md b/versioned_docs/version-0.20.0/api/server/classes/FishjamClient.md deleted file mode 100644 index b487c0cc..00000000 --- a/versioned_docs/version-0.20.0/api/server/classes/FishjamClient.md +++ /dev/null @@ -1,218 +0,0 @@ -# Class: FishjamClient - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/client.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/client.ts#L12) - -Client class that allows to manage Rooms and Peers for a Fishjam App. -It requires the Fishjam URL and management token that can be retrieved from the Fishjam Dashboard. - -## Constructors - -### Constructor - -> **new FishjamClient**(`config`): `FishjamClient` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/client.ts:28](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/client.ts#L28) - -Create new instance of Fishjam Client. - -Example usage: -``` -const fishjamClient = new FishjamClient({ - fishjamUrl: fastify.config.FISHJAM_URL, - managementToken: fastify.config.FISHJAM_MANAGEMENT_TOKEN, -}); -``` - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `config` | [`FishjamConfig`](../type-aliases/FishjamConfig.md) | - -#### Returns - -`FishjamClient` - -## Methods - -### createLivestreamStreamerToken() - -> **createLivestreamStreamerToken**(`roomId`): `Promise`\<[`StreamerToken`](../interfaces/StreamerToken.md)\> - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/client.ts:161](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/client.ts#L161) - -Creates a livestream streamer token for the given room. - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `roomId` | [`RoomId`](../type-aliases/RoomId.md) | - -#### Returns - -`Promise`\<[`StreamerToken`](../interfaces/StreamerToken.md)\> - -a livestream streamer token - -*** - -### createLivestreamViewerToken() - -> **createLivestreamViewerToken**(`roomId`): `Promise`\<[`ViewerToken`](../interfaces/ViewerToken.md)\> - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/client.ts:148](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/client.ts#L148) - -Creates a livestream viewer token for the given room. - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `roomId` | [`RoomId`](../type-aliases/RoomId.md) | - -#### Returns - -`Promise`\<[`ViewerToken`](../interfaces/ViewerToken.md)\> - -a livestream viewer token - -*** - -### createPeer() - -> **createPeer**(`roomId`, `options`): `Promise`\<\{ `peer`: [`Peer`](../type-aliases/Peer.md); `peerToken`: `string`; \}\> - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/client.ts:89](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/client.ts#L89) - -Create a new peer assigned to a room. - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `roomId` | [`RoomId`](../type-aliases/RoomId.md) | -| `options` | `PeerOptionsWebRTC` | - -#### Returns - -`Promise`\<\{ `peer`: [`Peer`](../type-aliases/Peer.md); `peerToken`: `string`; \}\> - -*** - -### createRoom() - -> **createRoom**(`config`): `Promise`\<[`Room`](../type-aliases/Room.md)\> - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/client.ts:45](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/client.ts#L45) - -Create a new room. All peers connected to the same room will be able to send/receive streams to each other. - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `config` | [`RoomConfig`](../interfaces/RoomConfig.md) | - -#### Returns - -`Promise`\<[`Room`](../type-aliases/Room.md)\> - -*** - -### deletePeer() - -> **deletePeer**(`roomId`, `peerId`): `Promise`\<`void`\> - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/client.ts:122](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/client.ts#L122) - -Delete a peer - this will also disconnect the peer from the room. - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `roomId` | [`RoomId`](../type-aliases/RoomId.md) | -| `peerId` | [`PeerId`](../type-aliases/PeerId.md) | - -#### Returns - -`Promise`\<`void`\> - -*** - -### deleteRoom() - -> **deleteRoom**(`roomId`): `Promise`\<`void`\> - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/client.ts:66](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/client.ts#L66) - -Delete an existing room. All peers connected to this room will be disconnected and removed. - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `roomId` | [`RoomId`](../type-aliases/RoomId.md) | - -#### Returns - -`Promise`\<`void`\> - -*** - -### getAllRooms() - -> **getAllRooms**(): `Promise`\<[`Room`](../type-aliases/Room.md)[]\> - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/client.ts:77](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/client.ts#L77) - -Get a list of all existing rooms. - -#### Returns - -`Promise`\<[`Room`](../type-aliases/Room.md)[]\> - -*** - -### getRoom() - -> **getRoom**(`roomId`): `Promise`\<[`Room`](../type-aliases/Room.md)\> - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/client.ts:109](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/client.ts#L109) - -Get details about a given room. - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `roomId` | [`RoomId`](../type-aliases/RoomId.md) | - -#### Returns - -`Promise`\<[`Room`](../type-aliases/Room.md)\> - -*** - -### refreshPeerToken() - -> **refreshPeerToken**(`roomId`, `peerId`): `Promise`\<`string`\> - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/client.ts:135](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/client.ts#L135) - -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. - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `roomId` | [`RoomId`](../type-aliases/RoomId.md) | -| `peerId` | [`PeerId`](../type-aliases/PeerId.md) | - -#### Returns - -`Promise`\<`string`\> - -refreshed peer token diff --git a/versioned_docs/version-0.20.0/api/server/classes/FishjamNotFoundException.md b/versioned_docs/version-0.20.0/api/server/classes/FishjamNotFoundException.md deleted file mode 100644 index 0344c33d..00000000 --- a/versioned_docs/version-0.20.0/api/server/classes/FishjamNotFoundException.md +++ /dev/null @@ -1,179 +0,0 @@ -# Class: FishjamNotFoundException - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:29](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L29) - -## Extends - -- [`FishjamBaseException`](FishjamBaseException.md) - -## Constructors - -### Constructor - -> **new FishjamNotFoundException**(`error`): `FishjamNotFoundException` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L13) - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `AxiosError`\<`Record`\<`string`, `string`\>\> | - -#### Returns - -`FishjamNotFoundException` - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`constructor`](FishjamBaseException.md#constructor) - -## Properties - -### axiosCode? - -> `optional` **axiosCode**: `string` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L11) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`axiosCode`](FishjamBaseException.md#axioscode) - -*** - -### cause? - -> `optional` **cause**: `unknown` - -Defined in: node\_modules/typescript/lib/lib.es2022.error.d.ts:26 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`cause`](FishjamBaseException.md#cause) - -*** - -### details? - -> `optional` **details**: `string` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L12) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`details`](FishjamBaseException.md#details) - -*** - -### message - -> **message**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1077 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`message`](FishjamBaseException.md#message) - -*** - -### name - -> **name**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1076 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`name`](FishjamBaseException.md#name) - -*** - -### prepareStackTrace()? - -> `static` `optional` **prepareStackTrace**: (`err`, `stackTraces`) => `any` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:143 - -Optional override for formatting stack traces - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `err` | `Error` | -| `stackTraces` | `CallSite`[] | - -#### Returns - -`any` - -#### See - -https://v8.dev/docs/stack-trace-api#customizing-stack-traces - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`prepareStackTrace`](FishjamBaseException.md#preparestacktrace) - -*** - -### stack? - -> `optional` **stack**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1078 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`stack`](FishjamBaseException.md#stack) - -*** - -### stackTraceLimit - -> `static` **stackTraceLimit**: `number` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:145 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`stackTraceLimit`](FishjamBaseException.md#stacktracelimit) - -*** - -### statusCode - -> **statusCode**: `number` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L10) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`statusCode`](FishjamBaseException.md#statuscode) - -## Methods - -### captureStackTrace() - -> `static` **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:136 - -Create .stack property on a target object - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `targetObject` | `object` | -| `constructorOpt?` | `Function` | - -#### Returns - -`void` - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`captureStackTrace`](FishjamBaseException.md#capturestacktrace) diff --git a/versioned_docs/version-0.20.0/api/server/classes/FishjamWSNotifier.md b/versioned_docs/version-0.20.0/api/server/classes/FishjamWSNotifier.md deleted file mode 100644 index 8bb2552e..00000000 --- a/versioned_docs/version-0.20.0/api/server/classes/FishjamWSNotifier.md +++ /dev/null @@ -1,432 +0,0 @@ -# Class: FishjamWSNotifier - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/ws\_notifier.ts:45](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/ws_notifier.ts#L45) - -Notifier object that can be used to get notified about various events related to the Fishjam App. - -## Extends - -- `TypedEventEmitter`\<[`NotificationEvents`](../type-aliases/NotificationEvents.md), `this`\> - -## Constructors - -### Constructor - -> **new FishjamWSNotifier**(`config`, `onError`, `onClose`, `onConnectionFailed`): `FishjamWSNotifier` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/ws\_notifier.ts:48](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/ws_notifier.ts#L48) - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `config` | [`FishjamConfig`](../type-aliases/FishjamConfig.md) | -| `onError` | [`ErrorEventHandler`](../type-aliases/ErrorEventHandler.md) | -| `onClose` | [`CloseEventHandler`](../type-aliases/CloseEventHandler.md) | -| `onConnectionFailed` | [`ErrorEventHandler`](../type-aliases/ErrorEventHandler.md) | - -#### Returns - -`FishjamWSNotifier` - -#### Overrides - -`(EventEmitter as new () => TypedEmitter).constructor` - -## Methods - -### addListener() - -> **addListener**\<`E`\>(`event`, `listener`): `this` - -Defined in: packages/js-server-sdk/node\_modules/typed-emitter/index.d.ts:22 - -#### Type Parameters - -| Type Parameter | -| ------ | -| `E` *extends* [`ExpectedEvents`](../type-aliases/ExpectedEvents.md) | - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `event` | `E` | -| `listener` | [`NotificationEvents`](../type-aliases/NotificationEvents.md)\[`E`\] | - -#### Returns - -`this` - -#### Inherited from - -`(EventEmitter as new () => TypedEmitter).addListener` - -*** - -### emit() - -> **emit**\<`E`\>(`event`, ...`args`): `boolean` - -Defined in: packages/js-server-sdk/node\_modules/typed-emitter/index.d.ts:32 - -#### Type Parameters - -| Type Parameter | -| ------ | -| `E` *extends* [`ExpectedEvents`](../type-aliases/ExpectedEvents.md) | - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `event` | `E` | -| ...`args` | `Parameters`\<[`NotificationEvents`](../type-aliases/NotificationEvents.md)\[`E`\]\> | - -#### Returns - -`boolean` - -#### Inherited from - -`(EventEmitter as new () => TypedEmitter).emit` - -*** - -### eventNames() - -> **eventNames**(): (`string` \| `symbol`)[] - -Defined in: packages/js-server-sdk/node\_modules/typed-emitter/index.d.ts:34 - -#### Returns - -(`string` \| `symbol`)[] - -#### Inherited from - -`(EventEmitter as new () => TypedEmitter).eventNames` - -*** - -### getMaxListeners() - -> **getMaxListeners**(): `number` - -Defined in: packages/js-server-sdk/node\_modules/typed-emitter/index.d.ts:39 - -#### Returns - -`number` - -#### Inherited from - -`(EventEmitter as new () => TypedEmitter).getMaxListeners` - -*** - -### listenerCount() - -> **listenerCount**\<`E`\>(`event`): `number` - -Defined in: packages/js-server-sdk/node\_modules/typed-emitter/index.d.ts:37 - -#### Type Parameters - -| Type Parameter | -| ------ | -| `E` *extends* [`ExpectedEvents`](../type-aliases/ExpectedEvents.md) | - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `event` | `E` | - -#### Returns - -`number` - -#### Inherited from - -`(EventEmitter as new () => TypedEmitter).listenerCount` - -*** - -### listeners() - -> **listeners**\<`E`\>(`event`): [`NotificationEvents`](../type-aliases/NotificationEvents.md)\[`E`\][] - -Defined in: packages/js-server-sdk/node\_modules/typed-emitter/index.d.ts:36 - -#### Type Parameters - -| Type Parameter | -| ------ | -| `E` *extends* [`ExpectedEvents`](../type-aliases/ExpectedEvents.md) | - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `event` | `E` | - -#### Returns - -[`NotificationEvents`](../type-aliases/NotificationEvents.md)\[`E`\][] - -#### Inherited from - -`(EventEmitter as new () => TypedEmitter).listeners` - -*** - -### off() - -> **off**\<`E`\>(`event`, `listener`): `this` - -Defined in: packages/js-server-sdk/node\_modules/typed-emitter/index.d.ts:28 - -#### Type Parameters - -| Type Parameter | -| ------ | -| `E` *extends* [`ExpectedEvents`](../type-aliases/ExpectedEvents.md) | - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `event` | `E` | -| `listener` | [`NotificationEvents`](../type-aliases/NotificationEvents.md)\[`E`\] | - -#### Returns - -`this` - -#### Inherited from - -`(EventEmitter as new () => TypedEmitter).off` - -*** - -### on() - -> **on**\<`E`\>(`event`, `listener`): `this` - -Defined in: packages/js-server-sdk/node\_modules/typed-emitter/index.d.ts:23 - -#### Type Parameters - -| Type Parameter | -| ------ | -| `E` *extends* [`ExpectedEvents`](../type-aliases/ExpectedEvents.md) | - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `event` | `E` | -| `listener` | [`NotificationEvents`](../type-aliases/NotificationEvents.md)\[`E`\] | - -#### Returns - -`this` - -#### Inherited from - -`(EventEmitter as new () => TypedEmitter).on` - -*** - -### once() - -> **once**\<`E`\>(`event`, `listener`): `this` - -Defined in: packages/js-server-sdk/node\_modules/typed-emitter/index.d.ts:24 - -#### Type Parameters - -| Type Parameter | -| ------ | -| `E` *extends* [`ExpectedEvents`](../type-aliases/ExpectedEvents.md) | - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `event` | `E` | -| `listener` | [`NotificationEvents`](../type-aliases/NotificationEvents.md)\[`E`\] | - -#### Returns - -`this` - -#### Inherited from - -`(EventEmitter as new () => TypedEmitter).once` - -*** - -### prependListener() - -> **prependListener**\<`E`\>(`event`, `listener`): `this` - -Defined in: packages/js-server-sdk/node\_modules/typed-emitter/index.d.ts:25 - -#### Type Parameters - -| Type Parameter | -| ------ | -| `E` *extends* [`ExpectedEvents`](../type-aliases/ExpectedEvents.md) | - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `event` | `E` | -| `listener` | [`NotificationEvents`](../type-aliases/NotificationEvents.md)\[`E`\] | - -#### Returns - -`this` - -#### Inherited from - -`(EventEmitter as new () => TypedEmitter).prependListener` - -*** - -### prependOnceListener() - -> **prependOnceListener**\<`E`\>(`event`, `listener`): `this` - -Defined in: packages/js-server-sdk/node\_modules/typed-emitter/index.d.ts:26 - -#### Type Parameters - -| Type Parameter | -| ------ | -| `E` *extends* [`ExpectedEvents`](../type-aliases/ExpectedEvents.md) | - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `event` | `E` | -| `listener` | [`NotificationEvents`](../type-aliases/NotificationEvents.md)\[`E`\] | - -#### Returns - -`this` - -#### Inherited from - -`(EventEmitter as new () => TypedEmitter).prependOnceListener` - -*** - -### rawListeners() - -> **rawListeners**\<`E`\>(`event`): [`NotificationEvents`](../type-aliases/NotificationEvents.md)\[`E`\][] - -Defined in: packages/js-server-sdk/node\_modules/typed-emitter/index.d.ts:35 - -#### Type Parameters - -| Type Parameter | -| ------ | -| `E` *extends* [`ExpectedEvents`](../type-aliases/ExpectedEvents.md) | - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `event` | `E` | - -#### Returns - -[`NotificationEvents`](../type-aliases/NotificationEvents.md)\[`E`\][] - -#### Inherited from - -`(EventEmitter as new () => TypedEmitter).rawListeners` - -*** - -### removeAllListeners() - -> **removeAllListeners**\<`E`\>(`event?`): `this` - -Defined in: packages/js-server-sdk/node\_modules/typed-emitter/index.d.ts:29 - -#### Type Parameters - -| Type Parameter | -| ------ | -| `E` *extends* [`ExpectedEvents`](../type-aliases/ExpectedEvents.md) | - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `event?` | `E` | - -#### Returns - -`this` - -#### Inherited from - -`(EventEmitter as new () => TypedEmitter).removeAllListeners` - -*** - -### removeListener() - -> **removeListener**\<`E`\>(`event`, `listener`): `this` - -Defined in: packages/js-server-sdk/node\_modules/typed-emitter/index.d.ts:30 - -#### Type Parameters - -| Type Parameter | -| ------ | -| `E` *extends* [`ExpectedEvents`](../type-aliases/ExpectedEvents.md) | - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `event` | `E` | -| `listener` | [`NotificationEvents`](../type-aliases/NotificationEvents.md)\[`E`\] | - -#### Returns - -`this` - -#### Inherited from - -`(EventEmitter as new () => TypedEmitter).removeListener` - -*** - -### setMaxListeners() - -> **setMaxListeners**(`maxListeners`): `this` - -Defined in: packages/js-server-sdk/node\_modules/typed-emitter/index.d.ts:40 - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `maxListeners` | `number` | - -#### Returns - -`this` - -#### Inherited from - -`(EventEmitter as new () => TypedEmitter).setMaxListeners` diff --git a/versioned_docs/version-0.20.0/api/server/classes/ForbiddenException.md b/versioned_docs/version-0.20.0/api/server/classes/ForbiddenException.md deleted file mode 100644 index aa09c82a..00000000 --- a/versioned_docs/version-0.20.0/api/server/classes/ForbiddenException.md +++ /dev/null @@ -1,179 +0,0 @@ -# Class: ForbiddenException - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:25](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L25) - -## Extends - -- [`FishjamBaseException`](FishjamBaseException.md) - -## Constructors - -### Constructor - -> **new ForbiddenException**(`error`): `ForbiddenException` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L13) - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `AxiosError`\<`Record`\<`string`, `string`\>\> | - -#### Returns - -`ForbiddenException` - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`constructor`](FishjamBaseException.md#constructor) - -## Properties - -### axiosCode? - -> `optional` **axiosCode**: `string` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L11) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`axiosCode`](FishjamBaseException.md#axioscode) - -*** - -### cause? - -> `optional` **cause**: `unknown` - -Defined in: node\_modules/typescript/lib/lib.es2022.error.d.ts:26 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`cause`](FishjamBaseException.md#cause) - -*** - -### details? - -> `optional` **details**: `string` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L12) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`details`](FishjamBaseException.md#details) - -*** - -### message - -> **message**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1077 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`message`](FishjamBaseException.md#message) - -*** - -### name - -> **name**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1076 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`name`](FishjamBaseException.md#name) - -*** - -### prepareStackTrace()? - -> `static` `optional` **prepareStackTrace**: (`err`, `stackTraces`) => `any` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:143 - -Optional override for formatting stack traces - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `err` | `Error` | -| `stackTraces` | `CallSite`[] | - -#### Returns - -`any` - -#### See - -https://v8.dev/docs/stack-trace-api#customizing-stack-traces - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`prepareStackTrace`](FishjamBaseException.md#preparestacktrace) - -*** - -### stack? - -> `optional` **stack**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1078 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`stack`](FishjamBaseException.md#stack) - -*** - -### stackTraceLimit - -> `static` **stackTraceLimit**: `number` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:145 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`stackTraceLimit`](FishjamBaseException.md#stacktracelimit) - -*** - -### statusCode - -> **statusCode**: `number` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L10) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`statusCode`](FishjamBaseException.md#statuscode) - -## Methods - -### captureStackTrace() - -> `static` **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:136 - -Create .stack property on a target object - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `targetObject` | `object` | -| `constructorOpt?` | `Function` | - -#### Returns - -`void` - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`captureStackTrace`](FishjamBaseException.md#capturestacktrace) diff --git a/versioned_docs/version-0.20.0/api/server/classes/MissingFishjamIdException.md b/versioned_docs/version-0.20.0/api/server/classes/MissingFishjamIdException.md deleted file mode 100644 index 24ee4fe3..00000000 --- a/versioned_docs/version-0.20.0/api/server/classes/MissingFishjamIdException.md +++ /dev/null @@ -1,137 +0,0 @@ -# Class: MissingFishjamIdException - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:3](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L3) - -## Extends - -- `Error` - -## Constructors - -### Constructor - -> **new MissingFishjamIdException**(): `MissingFishjamIdException` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:4](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L4) - -#### Returns - -`MissingFishjamIdException` - -#### Overrides - -`Error.constructor` - -## Properties - -### cause? - -> `optional` **cause**: `unknown` - -Defined in: node\_modules/typescript/lib/lib.es2022.error.d.ts:26 - -#### Inherited from - -`Error.cause` - -*** - -### message - -> **message**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1077 - -#### Inherited from - -`Error.message` - -*** - -### name - -> **name**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1076 - -#### Inherited from - -`Error.name` - -*** - -### prepareStackTrace()? - -> `static` `optional` **prepareStackTrace**: (`err`, `stackTraces`) => `any` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:143 - -Optional override for formatting stack traces - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `err` | `Error` | -| `stackTraces` | `CallSite`[] | - -#### Returns - -`any` - -#### See - -https://v8.dev/docs/stack-trace-api#customizing-stack-traces - -#### Inherited from - -`Error.prepareStackTrace` - -*** - -### stack? - -> `optional` **stack**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1078 - -#### Inherited from - -`Error.stack` - -*** - -### stackTraceLimit - -> `static` **stackTraceLimit**: `number` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:145 - -#### Inherited from - -`Error.stackTraceLimit` - -## Methods - -### captureStackTrace() - -> `static` **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:136 - -Create .stack property on a target object - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `targetObject` | `object` | -| `constructorOpt?` | `Function` | - -#### Returns - -`void` - -#### Inherited from - -`Error.captureStackTrace` diff --git a/versioned_docs/version-0.20.0/api/server/classes/PeerNotFoundException.md b/versioned_docs/version-0.20.0/api/server/classes/PeerNotFoundException.md deleted file mode 100644 index c691d89c..00000000 --- a/versioned_docs/version-0.20.0/api/server/classes/PeerNotFoundException.md +++ /dev/null @@ -1,179 +0,0 @@ -# Class: PeerNotFoundException - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:31](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L31) - -## Extends - -- [`FishjamBaseException`](FishjamBaseException.md) - -## Constructors - -### Constructor - -> **new PeerNotFoundException**(`error`): `PeerNotFoundException` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L13) - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `AxiosError`\<`Record`\<`string`, `string`\>\> | - -#### Returns - -`PeerNotFoundException` - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`constructor`](FishjamBaseException.md#constructor) - -## Properties - -### axiosCode? - -> `optional` **axiosCode**: `string` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L11) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`axiosCode`](FishjamBaseException.md#axioscode) - -*** - -### cause? - -> `optional` **cause**: `unknown` - -Defined in: node\_modules/typescript/lib/lib.es2022.error.d.ts:26 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`cause`](FishjamBaseException.md#cause) - -*** - -### details? - -> `optional` **details**: `string` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L12) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`details`](FishjamBaseException.md#details) - -*** - -### message - -> **message**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1077 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`message`](FishjamBaseException.md#message) - -*** - -### name - -> **name**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1076 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`name`](FishjamBaseException.md#name) - -*** - -### prepareStackTrace()? - -> `static` `optional` **prepareStackTrace**: (`err`, `stackTraces`) => `any` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:143 - -Optional override for formatting stack traces - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `err` | `Error` | -| `stackTraces` | `CallSite`[] | - -#### Returns - -`any` - -#### See - -https://v8.dev/docs/stack-trace-api#customizing-stack-traces - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`prepareStackTrace`](FishjamBaseException.md#preparestacktrace) - -*** - -### stack? - -> `optional` **stack**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1078 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`stack`](FishjamBaseException.md#stack) - -*** - -### stackTraceLimit - -> `static` **stackTraceLimit**: `number` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:145 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`stackTraceLimit`](FishjamBaseException.md#stacktracelimit) - -*** - -### statusCode - -> **statusCode**: `number` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L10) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`statusCode`](FishjamBaseException.md#statuscode) - -## Methods - -### captureStackTrace() - -> `static` **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:136 - -Create .stack property on a target object - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `targetObject` | `object` | -| `constructorOpt?` | `Function` | - -#### Returns - -`void` - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`captureStackTrace`](FishjamBaseException.md#capturestacktrace) diff --git a/versioned_docs/version-0.20.0/api/server/classes/RoomNotFoundException.md b/versioned_docs/version-0.20.0/api/server/classes/RoomNotFoundException.md deleted file mode 100644 index 38f71280..00000000 --- a/versioned_docs/version-0.20.0/api/server/classes/RoomNotFoundException.md +++ /dev/null @@ -1,179 +0,0 @@ -# Class: RoomNotFoundException - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:27](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L27) - -## Extends - -- [`FishjamBaseException`](FishjamBaseException.md) - -## Constructors - -### Constructor - -> **new RoomNotFoundException**(`error`): `RoomNotFoundException` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L13) - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `AxiosError`\<`Record`\<`string`, `string`\>\> | - -#### Returns - -`RoomNotFoundException` - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`constructor`](FishjamBaseException.md#constructor) - -## Properties - -### axiosCode? - -> `optional` **axiosCode**: `string` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L11) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`axiosCode`](FishjamBaseException.md#axioscode) - -*** - -### cause? - -> `optional` **cause**: `unknown` - -Defined in: node\_modules/typescript/lib/lib.es2022.error.d.ts:26 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`cause`](FishjamBaseException.md#cause) - -*** - -### details? - -> `optional` **details**: `string` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L12) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`details`](FishjamBaseException.md#details) - -*** - -### message - -> **message**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1077 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`message`](FishjamBaseException.md#message) - -*** - -### name - -> **name**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1076 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`name`](FishjamBaseException.md#name) - -*** - -### prepareStackTrace()? - -> `static` `optional` **prepareStackTrace**: (`err`, `stackTraces`) => `any` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:143 - -Optional override for formatting stack traces - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `err` | `Error` | -| `stackTraces` | `CallSite`[] | - -#### Returns - -`any` - -#### See - -https://v8.dev/docs/stack-trace-api#customizing-stack-traces - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`prepareStackTrace`](FishjamBaseException.md#preparestacktrace) - -*** - -### stack? - -> `optional` **stack**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1078 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`stack`](FishjamBaseException.md#stack) - -*** - -### stackTraceLimit - -> `static` **stackTraceLimit**: `number` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:145 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`stackTraceLimit`](FishjamBaseException.md#stacktracelimit) - -*** - -### statusCode - -> **statusCode**: `number` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L10) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`statusCode`](FishjamBaseException.md#statuscode) - -## Methods - -### captureStackTrace() - -> `static` **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:136 - -Create .stack property on a target object - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `targetObject` | `object` | -| `constructorOpt?` | `Function` | - -#### Returns - -`void` - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`captureStackTrace`](FishjamBaseException.md#capturestacktrace) diff --git a/versioned_docs/version-0.20.0/api/server/classes/ServiceUnavailableException.md b/versioned_docs/version-0.20.0/api/server/classes/ServiceUnavailableException.md deleted file mode 100644 index fa42c9be..00000000 --- a/versioned_docs/version-0.20.0/api/server/classes/ServiceUnavailableException.md +++ /dev/null @@ -1,179 +0,0 @@ -# Class: ServiceUnavailableException - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:33](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L33) - -## Extends - -- [`FishjamBaseException`](FishjamBaseException.md) - -## Constructors - -### Constructor - -> **new ServiceUnavailableException**(`error`): `ServiceUnavailableException` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L13) - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `AxiosError`\<`Record`\<`string`, `string`\>\> | - -#### Returns - -`ServiceUnavailableException` - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`constructor`](FishjamBaseException.md#constructor) - -## Properties - -### axiosCode? - -> `optional` **axiosCode**: `string` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L11) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`axiosCode`](FishjamBaseException.md#axioscode) - -*** - -### cause? - -> `optional` **cause**: `unknown` - -Defined in: node\_modules/typescript/lib/lib.es2022.error.d.ts:26 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`cause`](FishjamBaseException.md#cause) - -*** - -### details? - -> `optional` **details**: `string` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L12) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`details`](FishjamBaseException.md#details) - -*** - -### message - -> **message**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1077 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`message`](FishjamBaseException.md#message) - -*** - -### name - -> **name**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1076 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`name`](FishjamBaseException.md#name) - -*** - -### prepareStackTrace()? - -> `static` `optional` **prepareStackTrace**: (`err`, `stackTraces`) => `any` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:143 - -Optional override for formatting stack traces - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `err` | `Error` | -| `stackTraces` | `CallSite`[] | - -#### Returns - -`any` - -#### See - -https://v8.dev/docs/stack-trace-api#customizing-stack-traces - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`prepareStackTrace`](FishjamBaseException.md#preparestacktrace) - -*** - -### stack? - -> `optional` **stack**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1078 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`stack`](FishjamBaseException.md#stack) - -*** - -### stackTraceLimit - -> `static` **stackTraceLimit**: `number` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:145 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`stackTraceLimit`](FishjamBaseException.md#stacktracelimit) - -*** - -### statusCode - -> **statusCode**: `number` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L10) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`statusCode`](FishjamBaseException.md#statuscode) - -## Methods - -### captureStackTrace() - -> `static` **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:136 - -Create .stack property on a target object - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `targetObject` | `object` | -| `constructorOpt?` | `Function` | - -#### Returns - -`void` - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`captureStackTrace`](FishjamBaseException.md#capturestacktrace) diff --git a/versioned_docs/version-0.20.0/api/server/classes/UnauthorizedException.md b/versioned_docs/version-0.20.0/api/server/classes/UnauthorizedException.md deleted file mode 100644 index b0b3917b..00000000 --- a/versioned_docs/version-0.20.0/api/server/classes/UnauthorizedException.md +++ /dev/null @@ -1,179 +0,0 @@ -# Class: UnauthorizedException - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:23](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L23) - -## Extends - -- [`FishjamBaseException`](FishjamBaseException.md) - -## Constructors - -### Constructor - -> **new UnauthorizedException**(`error`): `UnauthorizedException` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L13) - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `AxiosError`\<`Record`\<`string`, `string`\>\> | - -#### Returns - -`UnauthorizedException` - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`constructor`](FishjamBaseException.md#constructor) - -## Properties - -### axiosCode? - -> `optional` **axiosCode**: `string` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L11) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`axiosCode`](FishjamBaseException.md#axioscode) - -*** - -### cause? - -> `optional` **cause**: `unknown` - -Defined in: node\_modules/typescript/lib/lib.es2022.error.d.ts:26 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`cause`](FishjamBaseException.md#cause) - -*** - -### details? - -> `optional` **details**: `string` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L12) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`details`](FishjamBaseException.md#details) - -*** - -### message - -> **message**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1077 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`message`](FishjamBaseException.md#message) - -*** - -### name - -> **name**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1076 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`name`](FishjamBaseException.md#name) - -*** - -### prepareStackTrace()? - -> `static` `optional` **prepareStackTrace**: (`err`, `stackTraces`) => `any` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:143 - -Optional override for formatting stack traces - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `err` | `Error` | -| `stackTraces` | `CallSite`[] | - -#### Returns - -`any` - -#### See - -https://v8.dev/docs/stack-trace-api#customizing-stack-traces - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`prepareStackTrace`](FishjamBaseException.md#preparestacktrace) - -*** - -### stack? - -> `optional` **stack**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1078 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`stack`](FishjamBaseException.md#stack) - -*** - -### stackTraceLimit - -> `static` **stackTraceLimit**: `number` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:145 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`stackTraceLimit`](FishjamBaseException.md#stacktracelimit) - -*** - -### statusCode - -> **statusCode**: `number` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L10) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`statusCode`](FishjamBaseException.md#statuscode) - -## Methods - -### captureStackTrace() - -> `static` **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:136 - -Create .stack property on a target object - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `targetObject` | `object` | -| `constructorOpt?` | `Function` | - -#### Returns - -`void` - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`captureStackTrace`](FishjamBaseException.md#capturestacktrace) diff --git a/versioned_docs/version-0.20.0/api/server/classes/UnknownException.md b/versioned_docs/version-0.20.0/api/server/classes/UnknownException.md deleted file mode 100644 index f3249902..00000000 --- a/versioned_docs/version-0.20.0/api/server/classes/UnknownException.md +++ /dev/null @@ -1,179 +0,0 @@ -# Class: UnknownException - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:35](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L35) - -## Extends - -- [`FishjamBaseException`](FishjamBaseException.md) - -## Constructors - -### Constructor - -> **new UnknownException**(`error`): `UnknownException` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:13](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L13) - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `error` | `AxiosError`\<`Record`\<`string`, `string`\>\> | - -#### Returns - -`UnknownException` - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`constructor`](FishjamBaseException.md#constructor) - -## Properties - -### axiosCode? - -> `optional` **axiosCode**: `string` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:11](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L11) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`axiosCode`](FishjamBaseException.md#axioscode) - -*** - -### cause? - -> `optional` **cause**: `unknown` - -Defined in: node\_modules/typescript/lib/lib.es2022.error.d.ts:26 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`cause`](FishjamBaseException.md#cause) - -*** - -### details? - -> `optional` **details**: `string` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:12](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L12) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`details`](FishjamBaseException.md#details) - -*** - -### message - -> **message**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1077 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`message`](FishjamBaseException.md#message) - -*** - -### name - -> **name**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1076 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`name`](FishjamBaseException.md#name) - -*** - -### prepareStackTrace()? - -> `static` `optional` **prepareStackTrace**: (`err`, `stackTraces`) => `any` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:143 - -Optional override for formatting stack traces - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `err` | `Error` | -| `stackTraces` | `CallSite`[] | - -#### Returns - -`any` - -#### See - -https://v8.dev/docs/stack-trace-api#customizing-stack-traces - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`prepareStackTrace`](FishjamBaseException.md#preparestacktrace) - -*** - -### stack? - -> `optional` **stack**: `string` - -Defined in: node\_modules/typescript/lib/lib.es5.d.ts:1078 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`stack`](FishjamBaseException.md#stack) - -*** - -### stackTraceLimit - -> `static` **stackTraceLimit**: `number` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:145 - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`stackTraceLimit`](FishjamBaseException.md#stacktracelimit) - -*** - -### statusCode - -> **statusCode**: `number` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/exceptions/index.ts:10](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/exceptions/index.ts#L10) - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`statusCode`](FishjamBaseException.md#statuscode) - -## Methods - -### captureStackTrace() - -> `static` **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` - -Defined in: packages/js-server-sdk/node\_modules/@types/node/globals.d.ts:136 - -Create .stack property on a target object - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `targetObject` | `object` | -| `constructorOpt?` | `Function` | - -#### Returns - -`void` - -#### Inherited from - -[`FishjamBaseException`](FishjamBaseException.md).[`captureStackTrace`](FishjamBaseException.md#capturestacktrace) diff --git a/versioned_docs/version-0.20.0/api/server/enumerations/PeerStatus.md b/versioned_docs/version-0.20.0/api/server/enumerations/PeerStatus.md deleted file mode 100644 index 8e8a702b..00000000 --- a/versioned_docs/version-0.20.0/api/server/enumerations/PeerStatus.md +++ /dev/null @@ -1,23 +0,0 @@ -# Enumeration: PeerStatus - -Defined in: packages/js-server-sdk/packages/fishjam-openapi/dist/index.d.ts:904 - -Informs about the peer status - -## Export - -## Enumeration Members - -### Connected - -> **Connected**: `"connected"` - -Defined in: packages/js-server-sdk/packages/fishjam-openapi/dist/index.d.ts:905 - -*** - -### Disconnected - -> **Disconnected**: `"disconnected"` - -Defined in: packages/js-server-sdk/packages/fishjam-openapi/dist/index.d.ts:906 diff --git a/versioned_docs/version-0.20.0/api/server/index.md b/versioned_docs/version-0.20.0/api/server/index.md deleted file mode 100644 index 994ac6be..00000000 --- a/versioned_docs/version-0.20.0/api/server/index.md +++ /dev/null @@ -1,38 +0,0 @@ -# @fishjam-cloud/js-server-sdk - -## Client - -- [FishjamClient](classes/FishjamClient.md) -- [FishjamWSNotifier](classes/FishjamWSNotifier.md) - -## Other - -- [PeerStatus](enumerations/PeerStatus.md) -- [BadRequestException](classes/BadRequestException.md) -- [FishjamBaseException](classes/FishjamBaseException.md) -- [FishjamNotFoundException](classes/FishjamNotFoundException.md) -- [ForbiddenException](classes/ForbiddenException.md) -- [MissingFishjamIdException](classes/MissingFishjamIdException.md) -- [PeerNotFoundException](classes/PeerNotFoundException.md) -- [RoomNotFoundException](classes/RoomNotFoundException.md) -- [ServiceUnavailableException](classes/ServiceUnavailableException.md) -- [UnauthorizedException](classes/UnauthorizedException.md) -- [UnknownException](classes/UnknownException.md) -- [RoomConfig](interfaces/RoomConfig.md) -- [StreamerToken](interfaces/StreamerToken.md) -- [ViewerToken](interfaces/ViewerToken.md) -- [Brand](type-aliases/Brand.md) -- [CloseEventHandler](type-aliases/CloseEventHandler.md) -- [ErrorEventHandler](type-aliases/ErrorEventHandler.md) -- [ExpectedEvents](type-aliases/ExpectedEvents.md) -- [FishjamConfig](type-aliases/FishjamConfig.md) -- [NotificationEvents](type-aliases/NotificationEvents.md) -- [Peer](type-aliases/Peer.md) -- [PeerId](type-aliases/PeerId.md) -- [PeerOptions](type-aliases/PeerOptions.md) -- [Room](type-aliases/Room.md) -- [RoomConfigRoomTypeEnum](type-aliases/RoomConfigRoomTypeEnum.md) -- [RoomConfigVideoCodecEnum](type-aliases/RoomConfigVideoCodecEnum.md) -- [RoomId](type-aliases/RoomId.md) -- [RoomConfigRoomTypeEnum](variables/RoomConfigRoomTypeEnum.md) -- [RoomConfigVideoCodecEnum](variables/RoomConfigVideoCodecEnum.md) diff --git a/versioned_docs/version-0.20.0/api/server/interfaces/RoomConfig.md b/versioned_docs/version-0.20.0/api/server/interfaces/RoomConfig.md deleted file mode 100644 index 0c197888..00000000 --- a/versioned_docs/version-0.20.0/api/server/interfaces/RoomConfig.md +++ /dev/null @@ -1,79 +0,0 @@ -# Interface: RoomConfig - -Defined in: packages/js-server-sdk/packages/fishjam-openapi/dist/index.d.ts:958 - -Room configuration - -## Export - -RoomConfig - -## Properties - -### maxPeers? - -> `optional` **maxPeers**: `null` \| `number` - -Defined in: packages/js-server-sdk/packages/fishjam-openapi/dist/index.d.ts:964 - -Maximum amount of peers allowed into the room - -#### Memberof - -RoomConfig - -*** - -### public? - -> `optional` **public**: `boolean` - -Defined in: packages/js-server-sdk/packages/fishjam-openapi/dist/index.d.ts:970 - -True if livestream viewers can omit specifying a token. - -#### Memberof - -RoomConfig - -*** - -### roomType? - -> `optional` **roomType**: [`RoomConfigRoomTypeEnum`](../type-aliases/RoomConfigRoomTypeEnum.md) - -Defined in: packages/js-server-sdk/packages/fishjam-openapi/dist/index.d.ts:976 - -The use-case of the room. If not provided, this defaults to conference. - -#### Memberof - -RoomConfig - -*** - -### videoCodec? - -> `optional` **videoCodec**: `null` \| [`RoomConfigVideoCodecEnum`](../type-aliases/RoomConfigVideoCodecEnum.md) - -Defined in: packages/js-server-sdk/packages/fishjam-openapi/dist/index.d.ts:982 - -Enforces video codec for each peer in the room - -#### Memberof - -RoomConfig - -*** - -### webhookUrl? - -> `optional` **webhookUrl**: `null` \| `string` - -Defined in: packages/js-server-sdk/packages/fishjam-openapi/dist/index.d.ts:988 - -URL where Fishjam notifications will be sent - -#### Memberof - -RoomConfig diff --git a/versioned_docs/version-0.20.0/api/server/interfaces/StreamerToken.md b/versioned_docs/version-0.20.0/api/server/interfaces/StreamerToken.md deleted file mode 100644 index dc52e21f..00000000 --- a/versioned_docs/version-0.20.0/api/server/interfaces/StreamerToken.md +++ /dev/null @@ -1,21 +0,0 @@ -# Interface: StreamerToken - -Defined in: packages/js-server-sdk/packages/fishjam-openapi/dist/index.d.ts:1204 - -Token for authorizing broadcaster streamer connection - -## Export - -StreamerToken - -## Properties - -### token - -> **token**: `string` - -Defined in: packages/js-server-sdk/packages/fishjam-openapi/dist/index.d.ts:1210 - -#### Memberof - -StreamerToken diff --git a/versioned_docs/version-0.20.0/api/server/interfaces/ViewerToken.md b/versioned_docs/version-0.20.0/api/server/interfaces/ViewerToken.md deleted file mode 100644 index 0c9a023b..00000000 --- a/versioned_docs/version-0.20.0/api/server/interfaces/ViewerToken.md +++ /dev/null @@ -1,21 +0,0 @@ -# Interface: ViewerToken - -Defined in: packages/js-server-sdk/packages/fishjam-openapi/dist/index.d.ts:1292 - -Token for authorizing broadcaster viewer connection - -## Export - -ViewerToken - -## Properties - -### token - -> **token**: `string` - -Defined in: packages/js-server-sdk/packages/fishjam-openapi/dist/index.d.ts:1298 - -#### Memberof - -ViewerToken diff --git a/versioned_docs/version-0.20.0/api/server/type-aliases/Brand.md b/versioned_docs/version-0.20.0/api/server/type-aliases/Brand.md deleted file mode 100644 index 8c09dd8d..00000000 --- a/versioned_docs/version-0.20.0/api/server/type-aliases/Brand.md +++ /dev/null @@ -1,20 +0,0 @@ -# Type Alias: Brand\ - -> **Brand**\<`T`, `TBrand`\> = `T` & `object` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/types.ts:8](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/types.ts#L8) - -Branded type helper - -## Type declaration - -### \[brand\] - -> **\[brand\]**: `TBrand` - -## Type Parameters - -| Type Parameter | -| ------ | -| `T` | -| `TBrand` *extends* `string` | diff --git a/versioned_docs/version-0.20.0/api/server/type-aliases/CloseEventHandler.md b/versioned_docs/version-0.20.0/api/server/type-aliases/CloseEventHandler.md deleted file mode 100644 index 9594e9a8..00000000 --- a/versioned_docs/version-0.20.0/api/server/type-aliases/CloseEventHandler.md +++ /dev/null @@ -1,16 +0,0 @@ -# Type Alias: CloseEventHandler() - -> **CloseEventHandler** = (`code`, `reason`) => `void` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/ws\_notifier.ts:38](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/ws_notifier.ts#L38) - -## Parameters - -| Parameter | Type | -| ------ | ------ | -| `code` | `number` | -| `reason` | `string` | - -## Returns - -`void` diff --git a/versioned_docs/version-0.20.0/api/server/type-aliases/ErrorEventHandler.md b/versioned_docs/version-0.20.0/api/server/type-aliases/ErrorEventHandler.md deleted file mode 100644 index 0c4e1b45..00000000 --- a/versioned_docs/version-0.20.0/api/server/type-aliases/ErrorEventHandler.md +++ /dev/null @@ -1,15 +0,0 @@ -# Type Alias: ErrorEventHandler() - -> **ErrorEventHandler** = (`msg`) => `void` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/ws\_notifier.ts:37](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/ws_notifier.ts#L37) - -## Parameters - -| Parameter | Type | -| ------ | ------ | -| `msg` | `Error` | - -## Returns - -`void` diff --git a/versioned_docs/version-0.20.0/api/server/type-aliases/ExpectedEvents.md b/versioned_docs/version-0.20.0/api/server/type-aliases/ExpectedEvents.md deleted file mode 100644 index c9f4da10..00000000 --- a/versioned_docs/version-0.20.0/api/server/type-aliases/ExpectedEvents.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: ExpectedEvents - -> **ExpectedEvents** = `"roomCreated"` \| `"roomDeleted"` \| `"roomCrashed"` \| `"peerAdded"` \| `"peerDeleted"` \| `"peerConnected"` \| `"peerDisconnected"` \| `"peerMetadataUpdated"` \| `"peerCrashed"` \| `"trackAdded"` \| `"trackRemoved"` \| `"trackMetadataUpdated"` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/ws\_notifier.ts:8](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/ws_notifier.ts#L8) diff --git a/versioned_docs/version-0.20.0/api/server/type-aliases/FishjamConfig.md b/versioned_docs/version-0.20.0/api/server/type-aliases/FishjamConfig.md deleted file mode 100644 index 1be5323e..00000000 --- a/versioned_docs/version-0.20.0/api/server/type-aliases/FishjamConfig.md +++ /dev/null @@ -1,29 +0,0 @@ -# Type Alias: FishjamConfig - -> **FishjamConfig** = `object` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/types.ts:28](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/types.ts#L28) - -## Properties - -### fishjamId? - -> `optional` **fishjamId**: `string` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/types.ts:33](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/types.ts#L33) - -*** - -### fishjamUrl? - -> `optional` **fishjamUrl**: `string` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/types.ts:37](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/types.ts#L37) - -*** - -### managementToken - -> **managementToken**: `string` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/types.ts:43](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/types.ts#L43) diff --git a/versioned_docs/version-0.20.0/api/server/type-aliases/NotificationEvents.md b/versioned_docs/version-0.20.0/api/server/type-aliases/NotificationEvents.md deleted file mode 100644 index 353a00d1..00000000 --- a/versioned_docs/version-0.20.0/api/server/type-aliases/NotificationEvents.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: NotificationEvents - -> **NotificationEvents** = `Record`\<[`ExpectedEvents`](ExpectedEvents.md), (`message`) => `void`\> - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/ws\_notifier.ts:39](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/ws_notifier.ts#L39) diff --git a/versioned_docs/version-0.20.0/api/server/type-aliases/Peer.md b/versioned_docs/version-0.20.0/api/server/type-aliases/Peer.md deleted file mode 100644 index a70fef51..00000000 --- a/versioned_docs/version-0.20.0/api/server/type-aliases/Peer.md +++ /dev/null @@ -1,11 +0,0 @@ -# Type Alias: Peer - -> **Peer** = `Omit`\<`OpenApiPeer`, `"id"`\> & `object` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/types.ts:20](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/types.ts#L20) - -## Type declaration - -### id - -> **id**: [`PeerId`](PeerId.md) diff --git a/versioned_docs/version-0.20.0/api/server/type-aliases/PeerId.md b/versioned_docs/version-0.20.0/api/server/type-aliases/PeerId.md deleted file mode 100644 index 2be94124..00000000 --- a/versioned_docs/version-0.20.0/api/server/type-aliases/PeerId.md +++ /dev/null @@ -1,7 +0,0 @@ -# Type Alias: PeerId - -> **PeerId** = [`Brand`](Brand.md)\<`string`, `"PeerId"`\> - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/types.ts:18](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/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.20.0/api/server/type-aliases/PeerOptions.md b/versioned_docs/version-0.20.0/api/server/type-aliases/PeerOptions.md deleted file mode 100644 index bf16f5ee..00000000 --- a/versioned_docs/version-0.20.0/api/server/type-aliases/PeerOptions.md +++ /dev/null @@ -1,7 +0,0 @@ -# Type Alias: PeerOptions - -> **PeerOptions** = `PeerOptionsWebRTC` - -Defined in: packages/js-server-sdk/packages/fishjam-openapi/dist/index.d.ts:851 - -## Export diff --git a/versioned_docs/version-0.20.0/api/server/type-aliases/Room.md b/versioned_docs/version-0.20.0/api/server/type-aliases/Room.md deleted file mode 100644 index 4781f2d1..00000000 --- a/versioned_docs/version-0.20.0/api/server/type-aliases/Room.md +++ /dev/null @@ -1,29 +0,0 @@ -# Type Alias: Room - -> **Room** = `object` - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/types.ts:22](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/types.ts#L22) - -## Properties - -### config - -> **config**: [`RoomConfig`](../interfaces/RoomConfig.md) - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/types.ts:25](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/types.ts#L25) - -*** - -### id - -> **id**: [`RoomId`](RoomId.md) - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/types.ts:23](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/types.ts#L23) - -*** - -### peers - -> **peers**: [`Peer`](Peer.md)[] - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/types.ts:24](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/packages/js-server-sdk/src/types.ts#L24) diff --git a/versioned_docs/version-0.20.0/api/server/type-aliases/RoomConfigRoomTypeEnum.md b/versioned_docs/version-0.20.0/api/server/type-aliases/RoomConfigRoomTypeEnum.md deleted file mode 100644 index 6d7026dd..00000000 --- a/versioned_docs/version-0.20.0/api/server/type-aliases/RoomConfigRoomTypeEnum.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: RoomConfigRoomTypeEnum - -> **RoomConfigRoomTypeEnum** = *typeof* [`RoomConfigRoomTypeEnum`](../variables/RoomConfigRoomTypeEnum.md)\[keyof *typeof* [`RoomConfigRoomTypeEnum`](../variables/RoomConfigRoomTypeEnum.md)\] - -Defined in: packages/js-server-sdk/packages/fishjam-openapi/dist/index.d.ts:990 diff --git a/versioned_docs/version-0.20.0/api/server/type-aliases/RoomConfigVideoCodecEnum.md b/versioned_docs/version-0.20.0/api/server/type-aliases/RoomConfigVideoCodecEnum.md deleted file mode 100644 index 80e1e34e..00000000 --- a/versioned_docs/version-0.20.0/api/server/type-aliases/RoomConfigVideoCodecEnum.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: RoomConfigVideoCodecEnum - -> **RoomConfigVideoCodecEnum** = *typeof* [`RoomConfigVideoCodecEnum`](../variables/RoomConfigVideoCodecEnum.md)\[keyof *typeof* [`RoomConfigVideoCodecEnum`](../variables/RoomConfigVideoCodecEnum.md)\] - -Defined in: packages/js-server-sdk/packages/fishjam-openapi/dist/index.d.ts:998 diff --git a/versioned_docs/version-0.20.0/api/server/type-aliases/RoomId.md b/versioned_docs/version-0.20.0/api/server/type-aliases/RoomId.md deleted file mode 100644 index 6058cdde..00000000 --- a/versioned_docs/version-0.20.0/api/server/type-aliases/RoomId.md +++ /dev/null @@ -1,8 +0,0 @@ -# Type Alias: RoomId - -> **RoomId** = [`Brand`](Brand.md)\<`string`, `"RoomId"`\> - -Defined in: [packages/js-server-sdk/packages/js-server-sdk/src/types.ts:14](https://github.com/fishjam-cloud/js-server-sdk/blob/891a2e978ee650dde85956b1c7d697c5ffa577dc/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.20.0/api/server/typedoc-sidebar.cjs b/versioned_docs/version-0.20.0/api/server/typedoc-sidebar.cjs deleted file mode 100644 index a96910ca..00000000 --- a/versioned_docs/version-0.20.0/api/server/typedoc-sidebar.cjs +++ /dev/null @@ -1,4 +0,0 @@ -// @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/classes/BadRequestException",label:"BadRequestException"},{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/RoomConfig",label:"RoomConfig"},{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/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/ExpectedEvents",label:"ExpectedEvents"},{type:"doc",id:"api/server/type-aliases/FishjamConfig",label:"FishjamConfig"},{type:"doc",id:"api/server/type-aliases/NotificationEvents",label:"NotificationEvents"},{type:"doc",id:"api/server/type-aliases/Peer",label:"Peer"},{type:"doc",id:"api/server/type-aliases/PeerId",label:"PeerId"},{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/RoomConfigRoomTypeEnum",label:"RoomConfigRoomTypeEnum"},{type:"doc",id:"api/server/type-aliases/RoomConfigVideoCodecEnum",label:"RoomConfigVideoCodecEnum"},{type:"doc",id:"api/server/type-aliases/RoomId",label:"RoomId"},{type:"doc",id:"api/server/variables/RoomConfigRoomTypeEnum",label:"RoomConfigRoomTypeEnum"},{type:"doc",id:"api/server/variables/RoomConfigVideoCodecEnum",label:"RoomConfigVideoCodecEnum"}]}]}; -module.exports = typedocSidebar.items; \ No newline at end of file diff --git a/versioned_docs/version-0.20.0/api/server/variables/RoomConfigRoomTypeEnum.md b/versioned_docs/version-0.20.0/api/server/variables/RoomConfigRoomTypeEnum.md deleted file mode 100644 index a0867f7e..00000000 --- a/versioned_docs/version-0.20.0/api/server/variables/RoomConfigRoomTypeEnum.md +++ /dev/null @@ -1,27 +0,0 @@ -# Variable: RoomConfigRoomTypeEnum - -> `const` **RoomConfigRoomTypeEnum**: `object` - -Defined in: packages/js-server-sdk/packages/fishjam-openapi/dist/index.d.ts:990 - -## Type declaration - -### AudioOnly - -> `readonly` **AudioOnly**: `"audio_only"` - -### Broadcaster - -> `readonly` **Broadcaster**: `"broadcaster"` - -### Conference - -> `readonly` **Conference**: `"conference"` - -### FullFeature - -> `readonly` **FullFeature**: `"full_feature"` - -### Livestream - -> `readonly` **Livestream**: `"livestream"` diff --git a/versioned_docs/version-0.20.0/api/server/variables/RoomConfigVideoCodecEnum.md b/versioned_docs/version-0.20.0/api/server/variables/RoomConfigVideoCodecEnum.md deleted file mode 100644 index d17314f7..00000000 --- a/versioned_docs/version-0.20.0/api/server/variables/RoomConfigVideoCodecEnum.md +++ /dev/null @@ -1,15 +0,0 @@ -# Variable: RoomConfigVideoCodecEnum - -> `const` **RoomConfigVideoCodecEnum**: `object` - -Defined in: packages/js-server-sdk/packages/fishjam-openapi/dist/index.d.ts:998 - -## Type declaration - -### H264 - -> `readonly` **H264**: `"h264"` - -### Vp8 - -> `readonly` **Vp8**: `"vp8"` diff --git a/versioned_docs/version-0.20.0/api/web/enumerations/Variant.md b/versioned_docs/version-0.20.0/api/web/enumerations/Variant.md deleted file mode 100644 index 737899e9..00000000 --- a/versioned_docs/version-0.20.0/api/web/enumerations/Variant.md +++ /dev/null @@ -1,43 +0,0 @@ -# Enumeration: Variant - -Defined in: packages/ts-client/dist/index.d.mts:12 - -## Enumeration Members - -### UNRECOGNIZED - -> **UNRECOGNIZED**: `-1` - -Defined in: packages/ts-client/dist/index.d.mts:17 - -*** - -### VARIANT\_HIGH - -> **VARIANT\_HIGH**: `3` - -Defined in: packages/ts-client/dist/index.d.mts:16 - -*** - -### VARIANT\_LOW - -> **VARIANT\_LOW**: `1` - -Defined in: packages/ts-client/dist/index.d.mts:14 - -*** - -### VARIANT\_MEDIUM - -> **VARIANT\_MEDIUM**: `2` - -Defined in: packages/ts-client/dist/index.d.mts:15 - -*** - -### VARIANT\_UNSPECIFIED - -> **VARIANT\_UNSPECIFIED**: `0` - -Defined in: packages/ts-client/dist/index.d.mts:13 diff --git a/versioned_docs/version-0.20.0/api/web/functions/FishjamProvider.md b/versioned_docs/version-0.20.0/api/web/functions/FishjamProvider.md deleted file mode 100644 index bc98f28c..00000000 --- a/versioned_docs/version-0.20.0/api/web/functions/FishjamProvider.md +++ /dev/null @@ -1,17 +0,0 @@ -# Function: FishjamProvider() - -> **FishjamProvider**(`props`): `Element` - -Defined in: [packages/react-client/src/FishjamProvider.tsx:67](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/FishjamProvider.tsx#L67) - -Provides the Fishjam Context - -## Parameters - -| Parameter | Type | -| ------ | ------ | -| `props` | [`FishjamProviderProps`](../interfaces/FishjamProviderProps.md) | - -## Returns - -`Element` diff --git a/versioned_docs/version-0.20.0/api/web/functions/useCamera.md b/versioned_docs/version-0.20.0/api/web/functions/useCamera.md deleted file mode 100644 index fa289336..00000000 --- a/versioned_docs/version-0.20.0/api/web/functions/useCamera.md +++ /dev/null @@ -1,96 +0,0 @@ -# Function: useCamera() - -> **useCamera**(): `object` - -Defined in: [packages/react-client/src/hooks/devices/useCamera.ts:9](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/devices/useCamera.ts#L9) - -This hook can toggle camera on/off, change camera, provides current camera and other. - -## Returns - -### ~~activeCamera~~ - -> **activeCamera**: `null` \| [`DeviceItem`](../type-aliases/DeviceItem.md) = `cameraManager.activeDevice` - -#### Deprecated - -Use `currentCamera` and `isCameraOn` instead -Indicates which camera is now turned on and streaming - -### cameraDeviceError - -> **cameraDeviceError**: `null` \| [`DeviceError`](../type-aliases/DeviceError.md) = `cameraManager.deviceError` - -Possible error thrown while setting up the camera - -### cameraDevices - -> **cameraDevices**: [`DeviceItem`](../type-aliases/DeviceItem.md)[] = `cameraManager.deviceList` - -List of available camera devices - -### cameraStream - -> **cameraStream**: `null` \| `MediaStream` - -The MediaStream object containing the current stream - -### currentCamera - -> **currentCamera**: `null` \| `MediaDeviceInfo` = `cameraManager.selectedDevice` - -Indicates which camera is now selected - -### currentCameraMiddleware - -> **currentCameraMiddleware**: [`TrackMiddleware`](../type-aliases/TrackMiddleware.md) = `videoTrackManager.currentMiddleware` - -The currently set camera middleware function - -### isCameraOn - -> **isCameraOn**: `boolean` = `!!cameraStream` - -Indicates whether the camera is streaming video - -### selectCamera() - -> **selectCamera**: (`deviceId`) => `Promise`\<`undefined` \| [`DeviceError`](../type-aliases/DeviceError.md)\> = `videoTrackManager.selectDevice` - -Selects the camera device - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `deviceId` | `string` | - -#### Returns - -`Promise`\<`undefined` \| [`DeviceError`](../type-aliases/DeviceError.md)\> - -### setCameraTrackMiddleware() - -> **setCameraTrackMiddleware**: (`middleware`) => `Promise`\<`void`\> = `videoTrackManager.setTrackMiddleware` - -Sets the camera middleware - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `middleware` | [`TrackMiddleware`](../type-aliases/TrackMiddleware.md) | - -#### Returns - -`Promise`\<`void`\> - -### toggleCamera() - -> **toggleCamera**: () => `Promise`\<`undefined` \| [`DeviceError`](../type-aliases/DeviceError.md)\> = `videoTrackManager.toggleDevice` - -Toggles current camera on/off - -#### Returns - -`Promise`\<`undefined` \| [`DeviceError`](../type-aliases/DeviceError.md)\> diff --git a/versioned_docs/version-0.20.0/api/web/functions/useConnection.md b/versioned_docs/version-0.20.0/api/web/functions/useConnection.md deleted file mode 100644 index 11045f88..00000000 --- a/versioned_docs/version-0.20.0/api/web/functions/useConnection.md +++ /dev/null @@ -1,53 +0,0 @@ -# Function: useConnection() - -> **useConnection**(): `object` - -Defined in: [packages/react-client/src/hooks/useConnection.ts:30](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useConnection.ts#L30) - -Hook allows to join or leave a room and check the current connection status. - -## Returns - -### joinRoom() - -> **joinRoom**: \<`PeerMetadata`\>(`__namedParameters`) => `Promise`\<`void`\> - -Join room and start streaming camera and microphone - -#### Type Parameters - -| Type Parameter | Default type | -| ------ | ------ | -| `PeerMetadata` *extends* `GenericMetadata` | `GenericMetadata` | - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `__namedParameters` | [`JoinRoomConfig`](../interfaces/JoinRoomConfig.md)\<`PeerMetadata`\> | - -#### Returns - -`Promise`\<`void`\> - -### leaveRoom() - -> **leaveRoom**: () => `void` - -Leave room and stop streaming - -#### Returns - -`void` - -### peerStatus - -> **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.20.0/api/web/functions/useCustomSource.md b/versioned_docs/version-0.20.0/api/web/functions/useCustomSource.md deleted file mode 100644 index bc3c34c9..00000000 --- a/versioned_docs/version-0.20.0/api/web/functions/useCustomSource.md +++ /dev/null @@ -1,44 +0,0 @@ -# Function: useCustomSource() - -> **useCustomSource**\<`T`\>(`sourceId`): `object` - -Defined in: [packages/react-client/src/hooks/useCustomSource.ts:9](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useCustomSource.ts#L9) - -This hook can register/deregister a custom MediaStream with Fishjam. - -## Type Parameters - -| Type Parameter | -| ------ | -| `T` *extends* `string` | - -## Parameters - -| Parameter | Type | -| ------ | ------ | -| `sourceId` | `T` | - -## Returns - -### setStream() - -> **setStream**: (`newStream`) => `Promise`\<`void`\> - -Associates the given stream with the custom source. -This stream will be sent to Fishjam after startStreaming has been called. - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `newStream` | `null` \| `MediaStream` | - -#### Returns - -`Promise`\<`void`\> - -### stream - -> **stream**: `undefined` \| `MediaStream` - -The MediaStream currently associated with the custom source diff --git a/versioned_docs/version-0.20.0/api/web/functions/useInitializeDevices.md b/versioned_docs/version-0.20.0/api/web/functions/useInitializeDevices.md deleted file mode 100644 index 20e8e918..00000000 --- a/versioned_docs/version-0.20.0/api/web/functions/useInitializeDevices.md +++ /dev/null @@ -1,25 +0,0 @@ -# Function: useInitializeDevices() - -> **useInitializeDevices**(): `object` - -Defined in: [packages/react-client/src/hooks/devices/useInitializeDevices.ts:14](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/devices/useInitializeDevices.ts#L14) - -Hook allows you to initialize access to the devices before joining the room. - -## Returns - -### initializeDevices() - -> **initializeDevices**: (`settings?`) => `Promise`\<[`InitializeDevicesResult`](../type-aliases/InitializeDevicesResult.md)\> - -Initialize access to the devices before joining the room - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `settings?` | [`InitializeDevicesSettings`](../type-aliases/InitializeDevicesSettings.md) | - -#### Returns - -`Promise`\<[`InitializeDevicesResult`](../type-aliases/InitializeDevicesResult.md)\> diff --git a/versioned_docs/version-0.20.0/api/web/functions/useLivestreamStreamer.md b/versioned_docs/version-0.20.0/api/web/functions/useLivestreamStreamer.md deleted file mode 100644 index be512f17..00000000 --- a/versioned_docs/version-0.20.0/api/web/functions/useLivestreamStreamer.md +++ /dev/null @@ -1,11 +0,0 @@ -# Function: useLivestreamStreamer() - -> **useLivestreamStreamer**(): [`UseLivestreamStreamerResult`](../interfaces/UseLivestreamStreamerResult.md) - -Defined in: [packages/react-client/src/hooks/useLivestreamStreamer.ts:51](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useLivestreamStreamer.ts#L51) - -Hook for publishing a livestream, which can be then received with [useLivestreamViewer](useLivestreamViewer.md) - -## Returns - -[`UseLivestreamStreamerResult`](../interfaces/UseLivestreamStreamerResult.md) diff --git a/versioned_docs/version-0.20.0/api/web/functions/useLivestreamViewer.md b/versioned_docs/version-0.20.0/api/web/functions/useLivestreamViewer.md deleted file mode 100644 index 0f5a9063..00000000 --- a/versioned_docs/version-0.20.0/api/web/functions/useLivestreamViewer.md +++ /dev/null @@ -1,11 +0,0 @@ -# Function: useLivestreamViewer() - -> **useLivestreamViewer**(): [`UseLivestreamViewerResult`](../interfaces/UseLivestreamViewerResult.md) - -Defined in: [packages/react-client/src/hooks/useLivestreamViewer.ts:41](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useLivestreamViewer.ts#L41) - -Hook for receiving a published livestream. - -## Returns - -[`UseLivestreamViewerResult`](../interfaces/UseLivestreamViewerResult.md) diff --git a/versioned_docs/version-0.20.0/api/web/functions/useMicrophone.md b/versioned_docs/version-0.20.0/api/web/functions/useMicrophone.md deleted file mode 100644 index 127f9257..00000000 --- a/versioned_docs/version-0.20.0/api/web/functions/useMicrophone.md +++ /dev/null @@ -1,112 +0,0 @@ -# Function: useMicrophone() - -> **useMicrophone**(): `object` - -Defined in: [packages/react-client/src/hooks/devices/useMicrophone.ts:9](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/devices/useMicrophone.ts#L9) - -Manage microphone - -## Returns - -### ~~activeMicrophone~~ - -> **activeMicrophone**: `null` \| [`DeviceItem`](../type-aliases/DeviceItem.md) = `microphoneManager.activeDevice` - -#### Deprecated - -Use `currentMicrophone` and `isMicrophoneOn` instead -Indicates which microphone is now turned on and streaming audio - -### currentMicrophone - -> **currentMicrophone**: `null` \| `MediaDeviceInfo` = `microphoneManager.selectedDevice` - -Indicates which microphone is now selected - -### currentMicrophoneMiddleware - -> **currentMicrophoneMiddleware**: [`TrackMiddleware`](../type-aliases/TrackMiddleware.md) = `audioTrackManager.currentMiddleware` - -The currently set microphone middleware function - -### isMicrophoneMuted - -> **isMicrophoneMuted**: `boolean` = `!microphoneManager.deviceEnabled` - -Indicates whether the microphone is muted - -### isMicrophoneOn - -> **isMicrophoneOn**: `boolean` = `!!microphoneStream` - -Indicates whether the microphone is streaming audio - -### microphoneDeviceError - -> **microphoneDeviceError**: `null` \| [`DeviceError`](../type-aliases/DeviceError.md) = `microphoneManager.deviceError` - -Possible error thrown while setting up the microphone - -### microphoneDevices - -> **microphoneDevices**: [`DeviceItem`](../type-aliases/DeviceItem.md)[] = `microphoneManager.deviceList` - -List of available microphone devices - -### microphoneStream - -> **microphoneStream**: `null` \| `MediaStream` - -The MediaStream object containing the current audio stream - -### selectMicrophone() - -> **selectMicrophone**: (`deviceId`) => `Promise`\<`undefined` \| [`DeviceError`](../type-aliases/DeviceError.md)\> = `audioTrackManager.selectDevice` - -Selects the microphone device - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `deviceId` | `string` | - -#### Returns - -`Promise`\<`undefined` \| [`DeviceError`](../type-aliases/DeviceError.md)\> - -### setMicrophoneTrackMiddleware() - -> **setMicrophoneTrackMiddleware**: (`middleware`) => `Promise`\<`void`\> = `audioTrackManager.setTrackMiddleware` - -Sets the microphone middleware - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `middleware` | [`TrackMiddleware`](../type-aliases/TrackMiddleware.md) | - -#### Returns - -`Promise`\<`void`\> - -### toggleMicrophone() - -> **toggleMicrophone**: () => `Promise`\<`undefined` \| [`DeviceError`](../type-aliases/DeviceError.md)\> = `audioTrackManager.toggleDevice` - -Toggles current microphone on/off - -#### Returns - -`Promise`\<`undefined` \| [`DeviceError`](../type-aliases/DeviceError.md)\> - -### toggleMicrophoneMute() - -> **toggleMicrophoneMute**: () => `Promise`\<`void`\> = `audioTrackManager.toggleMute` - -Mutes/unmutes the microphone - -#### Returns - -`Promise`\<`void`\> diff --git a/versioned_docs/version-0.20.0/api/web/functions/usePeers.md b/versioned_docs/version-0.20.0/api/web/functions/usePeers.md deleted file mode 100644 index f8f99b44..00000000 --- a/versioned_docs/version-0.20.0/api/web/functions/usePeers.md +++ /dev/null @@ -1,39 +0,0 @@ -# Function: usePeers() - -> **usePeers**\<`PeerMetadata`, `ServerMetadata`\>(): `object` - -Defined in: [packages/react-client/src/hooks/usePeers.ts:67](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/usePeers.ts#L67) - -Hook allows to access id, tracks and metadata of the local and remote peers. - -## Type Parameters - -| Type Parameter | Default type | Description | -| ------ | ------ | ------ | -| `PeerMetadata` | `Record`\<`string`, `unknown`\> | Type of metadata set by peer while connecting to a room. | -| `ServerMetadata` | `Record`\<`string`, `unknown`\> | Type of metadata set by the server while creating a peer. | - -## Returns - -### localPeer - -> **localPeer**: `null` \| [`PeerWithTracks`](../type-aliases/PeerWithTracks.md)\<`PeerMetadata`, `ServerMetadata`\> - -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` - -#### Deprecated - -Use remotePeers instead -Legacy array containing remote peers. -This property will be removed in future versions. - -### remotePeers - -> **remotePeers**: [`PeerWithTracks`](../type-aliases/PeerWithTracks.md)\<`PeerMetadata`, `ServerMetadata`\>[] - -Array of remote peers with distinguished tracks (camera, microphone, screen share). diff --git a/versioned_docs/version-0.20.0/api/web/functions/useSandbox.md b/versioned_docs/version-0.20.0/api/web/functions/useSandbox.md deleted file mode 100644 index e12a013f..00000000 --- a/versioned_docs/version-0.20.0/api/web/functions/useSandbox.md +++ /dev/null @@ -1,60 +0,0 @@ -# Function: useSandbox() - -> **useSandbox**(`props?`): `object` - -Defined in: [packages/react-client/src/hooks/useSandbox.ts:27](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useSandbox.ts#L27) - -## 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 | Default value | -| ------ | ------ | ------ | -| `roomName` | `string` | `undefined` | -| `isPublic` | `boolean` | `false` | - -#### Returns - -`Promise`\<\{ `room`: \{ `id`: `string`; `name`: `string`; \}; `streamerToken`: `string`; \}\> - -### getSandboxPeerToken() - -> **getSandboxPeerToken**: (`roomName`, `peerName`, `roomType`) => `Promise`\<`string`\> - -#### Parameters - -| Parameter | Type | Default value | -| ------ | ------ | ------ | -| `roomName` | `string` | `undefined` | -| `peerName` | `string` | `undefined` | -| `roomType` | [`RoomType`](../type-aliases/RoomType.md) | `"conference"` | - -#### Returns - -`Promise`\<`string`\> - -### getSandboxViewerToken() - -> **getSandboxViewerToken**: (`roomName`) => `Promise`\<`string`\> - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `roomName` | `string` | - -#### Returns - -`Promise`\<`string`\> diff --git a/versioned_docs/version-0.20.0/api/web/functions/useScreenShare.md b/versioned_docs/version-0.20.0/api/web/functions/useScreenShare.md deleted file mode 100644 index 9232960b..00000000 --- a/versioned_docs/version-0.20.0/api/web/functions/useScreenShare.md +++ /dev/null @@ -1,81 +0,0 @@ -# Function: useScreenShare() - -> **useScreenShare**(): `object` - -Defined in: [packages/react-client/src/hooks/useScreenShare.ts:10](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useScreenShare.ts#L10) - -Hook to enable screen sharing within a room and manage the existing stream. - -## Returns - -### audioTrack - -> **audioTrack**: `null` \| `MediaStreamTrack` = `screenShareManager.audioTrack` - -The separate audio MediaStreamTrack. - -### currentTracksMiddleware - -> **currentTracksMiddleware**: `null` \| [`TracksMiddleware`](../type-aliases/TracksMiddleware.md) = `screenShareManager.currentTracksMiddleware` - -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`\> = `screenShareManager.setTracksMiddleware` - -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`\> = `screenShareManager.startStreaming` - -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`\> = `screenShareManager.stopStreaming` - -Stops the stream and cancels browser screen sharing. - -#### Returns - -`Promise`\<`void`\> - -### stream - -> **stream**: `null` \| `MediaStream` = `screenShareManager.stream` - -The MediaStream object containing both tracks. - -### videoTrack - -> **videoTrack**: `null` \| `MediaStreamTrack` = `screenShareManager.videoTrack` - -The separate video MediaStreamTrack. diff --git a/versioned_docs/version-0.20.0/api/web/functions/useUpdatePeerMetadata.md b/versioned_docs/version-0.20.0/api/web/functions/useUpdatePeerMetadata.md deleted file mode 100644 index de765d9c..00000000 --- a/versioned_docs/version-0.20.0/api/web/functions/useUpdatePeerMetadata.md +++ /dev/null @@ -1,31 +0,0 @@ -# Function: useUpdatePeerMetadata() - -> **useUpdatePeerMetadata**\<`PeerMetadata`\>(): `object` - -Defined in: [packages/react-client/src/hooks/useUpdatePeerMetadata.ts:12](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useUpdatePeerMetadata.ts#L12) - -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.20.0/api/web/functions/useVAD.md b/versioned_docs/version-0.20.0/api/web/functions/useVAD.md deleted file mode 100644 index 3ae45283..00000000 --- a/versioned_docs/version-0.20.0/api/web/functions/useVAD.md +++ /dev/null @@ -1,31 +0,0 @@ -# Function: useVAD() - -> **useVAD**(`peerIds`): `Record`\<[`PeerId`](../type-aliases/PeerId.md), `boolean`\> - -Defined in: [packages/react-client/src/hooks/useVAD.ts:25](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useVAD.ts#L25) - -Voice activity detection. Use this hook to check if voice is detected in audio track for given peer(s). - -Example usage: -```tsx -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(", ")}`; -} -``` - -## Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `peerIds` | \{ `peerIds`: readonly [`PeerId`](../type-aliases/PeerId.md)[]; \} | List of ids of peers to subscribe to for voice activity detection notifications. | -| `peerIds.peerIds` | readonly [`PeerId`](../type-aliases/PeerId.md)[] | - | - -## Returns - -`Record`\<[`PeerId`](../type-aliases/PeerId.md), `boolean`\> - -Each key is a peerId and the boolean value indicates if voice activity is currently detected for that peer. diff --git a/versioned_docs/version-0.20.0/api/web/index.md b/versioned_docs/version-0.20.0/api/web/index.md deleted file mode 100644 index 01c4eb79..00000000 --- a/versioned_docs/version-0.20.0/api/web/index.md +++ /dev/null @@ -1,69 +0,0 @@ -# @fishjam-cloud/react-client - -## Connection - -- [useConnection](functions/useConnection.md) -- [usePeers](functions/usePeers.md) -- [useUpdatePeerMetadata](functions/useUpdatePeerMetadata.md) -- [useVAD](functions/useVAD.md) -- [Metadata](type-aliases/Metadata.md) - -## Devices - -- [useCamera](functions/useCamera.md) -- [useInitializeDevices](functions/useInitializeDevices.md) -- [useMicrophone](functions/useMicrophone.md) -- [useScreenShare](functions/useScreenShare.md) - -## Components - -- [FishjamProvider](functions/FishjamProvider.md) -- [FishjamProviderProps](interfaces/FishjamProviderProps.md) - -## Livestream - -- [useLivestreamStreamer](functions/useLivestreamStreamer.md) -- [useLivestreamViewer](functions/useLivestreamViewer.md) -- [UseLivestreamStreamerResult](interfaces/UseLivestreamStreamerResult.md) -- [UseLivestreamViewerResult](interfaces/UseLivestreamViewerResult.md) -- [ConnectStreamerConfig](type-aliases/ConnectStreamerConfig.md) -- [StreamerInputs](type-aliases/StreamerInputs.md) - -## Other - -- [useCustomSource](functions/useCustomSource.md) -- [useSandbox](functions/useSandbox.md) -- [Variant](enumerations/Variant.md) -- [JoinRoomConfig](interfaces/JoinRoomConfig.md) -- [SimulcastConfig](interfaces/SimulcastConfig.md) -- [AuthErrorReason](type-aliases/AuthErrorReason.md) -- [BandwidthLimits](type-aliases/BandwidthLimits.md) -- [Brand](type-aliases/Brand.md) -- [ConnectViewerConfig](type-aliases/ConnectViewerConfig.md) -- [CustomSource](type-aliases/CustomSource.md) -- [DeviceError](type-aliases/DeviceError.md) -- [DeviceItem](type-aliases/DeviceItem.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) -- [PersistLastDeviceHandlers](type-aliases/PersistLastDeviceHandlers.md) -- [ReconnectConfig](type-aliases/ReconnectConfig.md) -- [ReconnectionStatus](type-aliases/ReconnectionStatus.md) -- [RoomType](type-aliases/RoomType.md) -- [SimulcastBandwidthLimit](type-aliases/SimulcastBandwidthLimit.md) -- [SimulcastBandwidthLimits](type-aliases/SimulcastBandwidthLimits.md) -- [StreamConfig](type-aliases/StreamConfig.md) -- [Track](type-aliases/Track.md) -- [TrackBandwidthLimit](type-aliases/TrackBandwidthLimit.md) -- [TrackId](type-aliases/TrackId.md) -- [TrackMiddleware](type-aliases/TrackMiddleware.md) -- [TracksMiddleware](type-aliases/TracksMiddleware.md) -- [TracksMiddlewareResult](type-aliases/TracksMiddlewareResult.md) -- [UseInitializeDevicesParams](type-aliases/UseInitializeDevicesParams.md) -- [UseSandboxProps](type-aliases/UseSandboxProps.md) -- [SimulcastConfig](variables/SimulcastConfig.md) diff --git a/versioned_docs/version-0.20.0/api/web/interfaces/FishjamProviderProps.md b/versioned_docs/version-0.20.0/api/web/interfaces/FishjamProviderProps.md deleted file mode 100644 index bbad028d..00000000 --- a/versioned_docs/version-0.20.0/api/web/interfaces/FishjamProviderProps.md +++ /dev/null @@ -1,97 +0,0 @@ -# Interface: FishjamProviderProps - -Defined in: [packages/react-client/src/FishjamProvider.tsx:27](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/FishjamProvider.tsx#L27) - -## Extends - -- `PropsWithChildren` - -## Properties - -### audioConfig? - -> `optional` **audioConfig**: [`StreamConfig`](../type-aliases/StreamConfig.md) - -Defined in: [packages/react-client/src/FishjamProvider.tsx:55](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/FishjamProvider.tsx#L55) - -Configure whether to use audio simulcast and which layers to send if so. - -*** - -### bandwidthLimits? - -> `optional` **bandwidthLimits**: `Partial`\<[`BandwidthLimits`](../type-aliases/BandwidthLimits.md)\> - -Defined in: [packages/react-client/src/FishjamProvider.tsx:47](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/FishjamProvider.tsx#L47) - -Adjust max bandwidth limit for a single stream and simulcast. - -*** - -### children? - -> `optional` **children**: `ReactNode` - -Defined in: node\_modules/@types/react/index.d.ts:1398 - -#### Inherited from - -`PropsWithChildren.children` - -*** - -### constraints? - -> `optional` **constraints**: `Pick`\<`MediaStreamConstraints`, `"audio"` \| `"video"`\> - -Defined in: [packages/react-client/src/FishjamProvider.tsx:38](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/FishjamProvider.tsx#L38) - -Set preferred constraints. - -#### Param - -The media stream constraints as defined by the Web API. - -#### See - -[MediaStreamConstraints](https://udn.realityripple.com/docs/Web/API/MediaStreamConstraints) - -*** - -### fishjamId? - -> `optional` **fishjamId**: `string` - -Defined in: [packages/react-client/src/FishjamProvider.tsx:60](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/FishjamProvider.tsx#L60) - -*** - -### persistLastDevice? - -> `optional` **persistLastDevice**: `boolean` \| [`PersistLastDeviceHandlers`](../type-aliases/PersistLastDeviceHandlers.md) - -Defined in: [packages/react-client/src/FishjamProvider.tsx:43](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/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. - -*** - -### reconnect? - -> `optional` **reconnect**: `boolean` \| [`ReconnectConfig`](../type-aliases/ReconnectConfig.md) - -Defined in: [packages/react-client/src/FishjamProvider.tsx:32](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/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. - -*** - -### videoConfig? - -> `optional` **videoConfig**: [`StreamConfig`](../type-aliases/StreamConfig.md) - -Defined in: [packages/react-client/src/FishjamProvider.tsx:51](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/FishjamProvider.tsx#L51) - -Configure whether to use video simulcast and which layers to send if so. diff --git a/versioned_docs/version-0.20.0/api/web/interfaces/JoinRoomConfig.md b/versioned_docs/version-0.20.0/api/web/interfaces/JoinRoomConfig.md deleted file mode 100644 index b23bb196..00000000 --- a/versioned_docs/version-0.20.0/api/web/interfaces/JoinRoomConfig.md +++ /dev/null @@ -1,39 +0,0 @@ -# Interface: JoinRoomConfig\ - -Defined in: [packages/react-client/src/hooks/useConnection.ts:10](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useConnection.ts#L10) - -## Type Parameters - -| Type Parameter | Default type | -| ------ | ------ | -| `PeerMetadata` *extends* `GenericMetadata` | `GenericMetadata` | - -## Properties - -### peerMetadata? - -> `optional` **peerMetadata**: `PeerMetadata` - -Defined in: [packages/react-client/src/hooks/useConnection.ts:22](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useConnection.ts#L22) - -String indexed record with metadata, that will be available to all other peers - -*** - -### peerToken - -> **peerToken**: `string` - -Defined in: [packages/react-client/src/hooks/useConnection.ts:18](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useConnection.ts#L18) - -Token received from server (or Room Manager) - -*** - -### url? - -> `optional` **url**: `string` - -Defined in: [packages/react-client/src/hooks/useConnection.ts:14](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useConnection.ts#L14) - -Overrides the default url derived from the Fishjam ID passed to FishjamProvider diff --git a/versioned_docs/version-0.20.0/api/web/interfaces/SimulcastConfig.md b/versioned_docs/version-0.20.0/api/web/interfaces/SimulcastConfig.md deleted file mode 100644 index ffef1264..00000000 --- a/versioned_docs/version-0.20.0/api/web/interfaces/SimulcastConfig.md +++ /dev/null @@ -1,27 +0,0 @@ -# Interface: SimulcastConfig - -Defined in: packages/ts-client/dist/index.d.mts:158 - -## Properties - -### disabledVariants - -> **disabledVariants**: [`Variant`](../enumerations/Variant.md)[] - -Defined in: packages/ts-client/dist/index.d.mts:161 - -*** - -### enabled - -> **enabled**: `boolean` - -Defined in: packages/ts-client/dist/index.d.mts:159 - -*** - -### enabledVariants - -> **enabledVariants**: [`Variant`](../enumerations/Variant.md)[] - -Defined in: packages/ts-client/dist/index.d.mts:160 diff --git a/versioned_docs/version-0.20.0/api/web/interfaces/UseLivestreamStreamerResult.md b/versioned_docs/version-0.20.0/api/web/interfaces/UseLivestreamStreamerResult.md deleted file mode 100644 index 009c23ad..00000000 --- a/versioned_docs/version-0.20.0/api/web/interfaces/UseLivestreamStreamerResult.md +++ /dev/null @@ -1,62 +0,0 @@ -# Interface: UseLivestreamStreamerResult - -Defined in: [packages/react-client/src/hooks/useLivestreamStreamer.ts:27](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useLivestreamStreamer.ts#L27) - -## Properties - -### connect() - -> **connect**: (`inputs`, `urlOverride?`) => `Promise`\<`void`\> - -Defined in: [packages/react-client/src/hooks/useLivestreamStreamer.ts:34](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useLivestreamStreamer.ts#L34) - -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: [packages/react-client/src/hooks/useLivestreamStreamer.ts:36](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useLivestreamStreamer.ts#L36) - -Callback to stop publishing anything previously published with [connect](#connect) - -#### Returns - -`void` - -*** - -### error - -> **error**: `null` \| `LivestreamError` - -Defined in: [packages/react-client/src/hooks/useLivestreamStreamer.ts:38](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useLivestreamStreamer.ts#L38) - -Any errors encountered in [connect](#connect) will populate this field - -*** - -### isConnected - -> **isConnected**: `boolean` - -Defined in: [packages/react-client/src/hooks/useLivestreamStreamer.ts:40](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useLivestreamStreamer.ts#L40) - -Utility flag which indicates the current connection status diff --git a/versioned_docs/version-0.20.0/api/web/interfaces/UseLivestreamViewerResult.md b/versioned_docs/version-0.20.0/api/web/interfaces/UseLivestreamViewerResult.md deleted file mode 100644 index 225ffada..00000000 --- a/versioned_docs/version-0.20.0/api/web/interfaces/UseLivestreamViewerResult.md +++ /dev/null @@ -1,70 +0,0 @@ -# Interface: UseLivestreamViewerResult - -Defined in: [packages/react-client/src/hooks/useLivestreamViewer.ts:11](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useLivestreamViewer.ts#L11) - -## Properties - -### connect() - -> **connect**: (`config`, `url?`) => `Promise`\<`void`\> - -Defined in: [packages/react-client/src/hooks/useLivestreamViewer.ts:19](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useLivestreamViewer.ts#L19) - -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: [packages/react-client/src/hooks/useLivestreamViewer.ts:21](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useLivestreamViewer.ts#L21) - -Callback used to disconnect from a stream previously connected to with [connect](#connect) - -#### Returns - -`void` - -*** - -### error - -> **error**: `null` \| `LivestreamError` - -Defined in: [packages/react-client/src/hooks/useLivestreamViewer.ts:23](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useLivestreamViewer.ts#L23) - -Any errors encountered in [connect](#connect) will be present in this field. - -*** - -### isConnected - -> **isConnected**: `boolean` - -Defined in: [packages/react-client/src/hooks/useLivestreamViewer.ts:25](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useLivestreamViewer.ts#L25) - -Utility flag which indicates the current connection status - -*** - -### stream - -> **stream**: `null` \| `MediaStream` - -Defined in: [packages/react-client/src/hooks/useLivestreamViewer.ts:13](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useLivestreamViewer.ts#L13) - -The received livestream media diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/AuthErrorReason.md b/versioned_docs/version-0.20.0/api/web/type-aliases/AuthErrorReason.md deleted file mode 100644 index 5d7ef8f5..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/AuthErrorReason.md +++ /dev/null @@ -1,5 +0,0 @@ -# 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.20.0/api/web/type-aliases/BandwidthLimits.md b/versioned_docs/version-0.20.0/api/web/type-aliases/BandwidthLimits.md deleted file mode 100644 index b38a65f6..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/BandwidthLimits.md +++ /dev/null @@ -1,21 +0,0 @@ -# Type Alias: BandwidthLimits - -> **BandwidthLimits** = `object` - -Defined in: [packages/react-client/src/types/public.ts:61](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L61) - -## Properties - -### simulcast - -> **simulcast**: [`SimulcastBandwidthLimits`](SimulcastBandwidthLimits.md) - -Defined in: [packages/react-client/src/types/public.ts:61](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L61) - -*** - -### singleStream - -> **singleStream**: `number` - -Defined in: [packages/react-client/src/types/public.ts:61](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L61) diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/Brand.md b/versioned_docs/version-0.20.0/api/web/type-aliases/Brand.md deleted file mode 100644 index 8432e1a5..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/Brand.md +++ /dev/null @@ -1,18 +0,0 @@ -# Type Alias: Brand\ - -> **Brand**\<`T`, `TBrand`\> = `T` & `object` - -Defined in: [packages/react-client/src/types/public.ts:72](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L72) - -## Type declaration - -### \[brand\] - -> **\[brand\]**: `TBrand` - -## Type Parameters - -| Type Parameter | -| ------ | -| `T` | -| `TBrand` *extends* `string` | diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/ConnectStreamerConfig.md b/versioned_docs/version-0.20.0/api/web/type-aliases/ConnectStreamerConfig.md deleted file mode 100644 index a169d15c..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/ConnectStreamerConfig.md +++ /dev/null @@ -1,23 +0,0 @@ -# Type Alias: ConnectStreamerConfig - -> **ConnectStreamerConfig** = `object` - -Defined in: [packages/react-client/src/hooks/useLivestreamStreamer.ts:20](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useLivestreamStreamer.ts#L20) - -## Properties - -### inputs - -> **inputs**: [`StreamerInputs`](StreamerInputs.md) - -Defined in: [packages/react-client/src/hooks/useLivestreamStreamer.ts:21](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useLivestreamStreamer.ts#L21) - -*** - -### token - -> **token**: `string` - -Defined in: [packages/react-client/src/hooks/useLivestreamStreamer.ts:23](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useLivestreamStreamer.ts#L23) - -Streamer token used to authenticate with Fishjam diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/ConnectViewerConfig.md b/versioned_docs/version-0.20.0/api/web/type-aliases/ConnectViewerConfig.md deleted file mode 100644 index 7534805e..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/ConnectViewerConfig.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: ConnectViewerConfig - -> **ConnectViewerConfig** = \{ `streamId?`: `never`; `token`: `string`; \} \| \{ `streamId`: `string`; `token?`: `never`; \} - -Defined in: [packages/react-client/src/hooks/useLivestreamViewer.ts:6](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useLivestreamViewer.ts#L6) diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/CustomSource.md b/versioned_docs/version-0.20.0/api/web/type-aliases/CustomSource.md deleted file mode 100644 index 771beb93..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/CustomSource.md +++ /dev/null @@ -1,40 +0,0 @@ -# Type Alias: CustomSource\ - -> **CustomSource**\<`T`\> = `object` - -Defined in: [packages/react-client/src/types/public.ts:74](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L74) - -## Type Parameters - -| Type Parameter | -| ------ | -| `T` *extends* `string` | - -## Properties - -### id - -> **id**: `T` - -Defined in: [packages/react-client/src/types/public.ts:75](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L75) - -*** - -### stream? - -> `optional` **stream**: `MediaStream` - -Defined in: [packages/react-client/src/types/public.ts:77](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L77) - -*** - -### trackIds? - -> `optional` **trackIds**: `object` - -Defined in: [packages/react-client/src/types/public.ts:76](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L76) - -| Name | Type | -| ------ | ------ | -| `audioId?` | `string` | -| `videoId?` | `string` | diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/DeviceError.md b/versioned_docs/version-0.20.0/api/web/type-aliases/DeviceError.md deleted file mode 100644 index 4dae1f78..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/DeviceError.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: DeviceError - -> **DeviceError** = \{ `name`: `"OverconstrainedError"`; \} \| \{ `name`: `"NotAllowedError"`; \} \| \{ `name`: `"NotFoundError"`; \} \| \{ `name`: `"UNHANDLED_ERROR"`; \} - -Defined in: [packages/react-client/src/types/public.ts:65](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L65) diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/DeviceItem.md b/versioned_docs/version-0.20.0/api/web/type-aliases/DeviceItem.md deleted file mode 100644 index f11b52f1..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/DeviceItem.md +++ /dev/null @@ -1,21 +0,0 @@ -# Type Alias: DeviceItem - -> **DeviceItem** = `object` - -Defined in: [packages/react-client/src/types/public.ts:46](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L46) - -## Properties - -### deviceId - -> **deviceId**: `string` - -Defined in: [packages/react-client/src/types/public.ts:46](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L46) - -*** - -### label - -> **label**: `string` - -Defined in: [packages/react-client/src/types/public.ts:46](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L46) diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/InitializeDevicesResult.md b/versioned_docs/version-0.20.0/api/web/type-aliases/InitializeDevicesResult.md deleted file mode 100644 index d5e39041..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/InitializeDevicesResult.md +++ /dev/null @@ -1,29 +0,0 @@ -# Type Alias: InitializeDevicesResult - -> **InitializeDevicesResult** = `object` - -Defined in: [packages/react-client/src/types/public.ts:5](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L5) - -## Properties - -### errors - -> **errors**: \{ `audio`: [`DeviceError`](DeviceError.md) \| `null`; `video`: [`DeviceError`](DeviceError.md) \| `null`; \} \| `null` - -Defined in: [packages/react-client/src/types/public.ts:8](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L8) - -*** - -### status - -> **status**: [`InitializeDevicesStatus`](InitializeDevicesStatus.md) - -Defined in: [packages/react-client/src/types/public.ts:6](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L6) - -*** - -### stream - -> **stream**: `MediaStream` \| `null` - -Defined in: [packages/react-client/src/types/public.ts:7](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L7) diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/InitializeDevicesSettings.md b/versioned_docs/version-0.20.0/api/web/type-aliases/InitializeDevicesSettings.md deleted file mode 100644 index 668609d1..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/InitializeDevicesSettings.md +++ /dev/null @@ -1,21 +0,0 @@ -# Type Alias: InitializeDevicesSettings - -> **InitializeDevicesSettings** = `object` - -Defined in: [packages/react-client/src/hooks/internal/devices/useMediaDevices.ts:14](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/internal/devices/useMediaDevices.ts#L14) - -## Properties - -### enableAudio? - -> `optional` **enableAudio**: `boolean` - -Defined in: [packages/react-client/src/hooks/internal/devices/useMediaDevices.ts:14](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/internal/devices/useMediaDevices.ts#L14) - -*** - -### enableVideo? - -> `optional` **enableVideo**: `boolean` - -Defined in: [packages/react-client/src/hooks/internal/devices/useMediaDevices.ts:14](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/internal/devices/useMediaDevices.ts#L14) diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/InitializeDevicesStatus.md b/versioned_docs/version-0.20.0/api/web/type-aliases/InitializeDevicesStatus.md deleted file mode 100644 index 58d334b5..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/InitializeDevicesStatus.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: InitializeDevicesStatus - -> **InitializeDevicesStatus** = `"initialized"` \| `"failed"` \| `"initialized_with_errors"` \| `"already_initialized"` - -Defined in: [packages/react-client/src/types/public.ts:3](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L3) diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/JoinErrorReason.md b/versioned_docs/version-0.20.0/api/web/type-aliases/JoinErrorReason.md deleted file mode 100644 index 14763576..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/JoinErrorReason.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: JoinErrorReason - -> **JoinErrorReason** = *typeof* `JOIN_ERRORS`\[`number`\] - -Defined in: packages/ts-client/dist/index.d.mts:775 diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/Metadata.md b/versioned_docs/version-0.20.0/api/web/type-aliases/Metadata.md deleted file mode 100644 index 2bd4d2c4..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/Metadata.md +++ /dev/null @@ -1,28 +0,0 @@ -# Type Alias: Metadata\ - -> **Metadata**\<`PeerMetadata`, `ServerMetadata`\> = `object` - -Defined in: packages/ts-client/dist/index.d.mts:798 - -## 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:799 - -*** - -### server - -> **server**: `ServerMetadata` - -Defined in: packages/ts-client/dist/index.d.mts:800 diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/MiddlewareResult.md b/versioned_docs/version-0.20.0/api/web/type-aliases/MiddlewareResult.md deleted file mode 100644 index f132241a..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/MiddlewareResult.md +++ /dev/null @@ -1,25 +0,0 @@ -# Type Alias: MiddlewareResult - -> **MiddlewareResult** = `object` - -Defined in: [packages/react-client/src/types/public.ts:23](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L23) - -## Properties - -### onClear()? - -> `optional` **onClear**: () => `void` - -Defined in: [packages/react-client/src/types/public.ts:23](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L23) - -#### Returns - -`void` - -*** - -### track - -> **track**: `MediaStreamTrack` - -Defined in: [packages/react-client/src/types/public.ts:23](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L23) diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/PeerId.md b/versioned_docs/version-0.20.0/api/web/type-aliases/PeerId.md deleted file mode 100644 index 44865168..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/PeerId.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: PeerId - -> **PeerId** = [`Brand`](Brand.md)\<`string`, `"PeerId"`\> - -Defined in: [packages/react-client/src/types/public.ts:12](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L12) diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/PeerStatus.md b/versioned_docs/version-0.20.0/api/web/type-aliases/PeerStatus.md deleted file mode 100644 index 80f7b2cf..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/PeerStatus.md +++ /dev/null @@ -1,12 +0,0 @@ -# Type Alias: PeerStatus - -> **PeerStatus** = `"connecting"` \| `"connected"` \| `"error"` \| `"idle"` - -Defined in: [packages/react-client/src/types/public.ts:44](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L44) - -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. -- `connected` - Peer has successfully connected. -- `error` - There was an error in the connection process. diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/PeerWithTracks.md b/versioned_docs/version-0.20.0/api/web/type-aliases/PeerWithTracks.md deleted file mode 100644 index 72f4092c..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/PeerWithTracks.md +++ /dev/null @@ -1,84 +0,0 @@ -# Type Alias: PeerWithTracks\ - -> **PeerWithTracks**\<`PeerMetadata`, `ServerMetadata`\> = `object` - -Defined in: [packages/react-client/src/hooks/usePeers.ts:13](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/usePeers.ts#L13) - -## Type Parameters - -| Type Parameter | 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. | - -## Properties - -### cameraTrack? - -> `optional` **cameraTrack**: [`Track`](Track.md) - -Defined in: [packages/react-client/src/hooks/usePeers.ts:17](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/usePeers.ts#L17) - -*** - -### customAudioTracks - -> **customAudioTracks**: [`Track`](Track.md)[] - -Defined in: [packages/react-client/src/hooks/usePeers.ts:22](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/usePeers.ts#L22) - -*** - -### customVideoTracks - -> **customVideoTracks**: [`Track`](Track.md)[] - -Defined in: [packages/react-client/src/hooks/usePeers.ts:21](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/usePeers.ts#L21) - -*** - -### id - -> **id**: [`PeerId`](PeerId.md) - -Defined in: [packages/react-client/src/hooks/usePeers.ts:14](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/usePeers.ts#L14) - -*** - -### metadata? - -> `optional` **metadata**: [`Metadata`](Metadata.md)\<`PeerMetadata`, `ServerMetadata`\> - -Defined in: [packages/react-client/src/hooks/usePeers.ts:15](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/usePeers.ts#L15) - -*** - -### microphoneTrack? - -> `optional` **microphoneTrack**: [`Track`](Track.md) - -Defined in: [packages/react-client/src/hooks/usePeers.ts:18](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/usePeers.ts#L18) - -*** - -### screenShareAudioTrack? - -> `optional` **screenShareAudioTrack**: [`Track`](Track.md) - -Defined in: [packages/react-client/src/hooks/usePeers.ts:20](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/usePeers.ts#L20) - -*** - -### screenShareVideoTrack? - -> `optional` **screenShareVideoTrack**: [`Track`](Track.md) - -Defined in: [packages/react-client/src/hooks/usePeers.ts:19](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/usePeers.ts#L19) - -*** - -### tracks - -> **tracks**: [`Track`](Track.md)[] - -Defined in: [packages/react-client/src/hooks/usePeers.ts:16](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/usePeers.ts#L16) diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/PersistLastDeviceHandlers.md b/versioned_docs/version-0.20.0/api/web/type-aliases/PersistLastDeviceHandlers.md deleted file mode 100644 index 8f07b481..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/PersistLastDeviceHandlers.md +++ /dev/null @@ -1,42 +0,0 @@ -# Type Alias: PersistLastDeviceHandlers - -> **PersistLastDeviceHandlers** = `object` - -Defined in: [packages/react-client/src/types/public.ts:48](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L48) - -## Properties - -### getLastDevice() - -> **getLastDevice**: (`deviceType`) => `MediaDeviceInfo` \| `null` - -Defined in: [packages/react-client/src/types/public.ts:49](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L49) - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `deviceType` | `"audio"` \| `"video"` | - -#### Returns - -`MediaDeviceInfo` \| `null` - -*** - -### saveLastDevice() - -> **saveLastDevice**: (`info`, `deviceType`) => `void` - -Defined in: [packages/react-client/src/types/public.ts:50](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L50) - -#### Parameters - -| Parameter | Type | -| ------ | ------ | -| `info` | `MediaDeviceInfo` | -| `deviceType` | `"audio"` \| `"video"` | - -#### Returns - -`void` diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/ReconnectConfig.md b/versioned_docs/version-0.20.0/api/web/type-aliases/ReconnectConfig.md deleted file mode 100644 index 14361829..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/ReconnectConfig.md +++ /dev/null @@ -1,37 +0,0 @@ -# Type Alias: ReconnectConfig - -> **ReconnectConfig** = `object` - -Defined in: packages/ts-client/dist/index.d.mts:779 - -## Properties - -### addTracksOnReconnect? - -> `optional` **addTracksOnReconnect**: `boolean` - -Defined in: packages/ts-client/dist/index.d.mts:783 - -*** - -### delay? - -> `optional` **delay**: `number` - -Defined in: packages/ts-client/dist/index.d.mts:782 - -*** - -### initialDelay? - -> `optional` **initialDelay**: `number` - -Defined in: packages/ts-client/dist/index.d.mts:781 - -*** - -### maxAttempts? - -> `optional` **maxAttempts**: `number` - -Defined in: packages/ts-client/dist/index.d.mts:780 diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/ReconnectionStatus.md b/versioned_docs/version-0.20.0/api/web/type-aliases/ReconnectionStatus.md deleted file mode 100644 index 95225742..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/ReconnectionStatus.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: ReconnectionStatus - -> **ReconnectionStatus** = `"reconnecting"` \| `"idle"` \| `"error"` - -Defined in: packages/ts-client/dist/index.d.mts:778 diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/RoomType.md b/versioned_docs/version-0.20.0/api/web/type-aliases/RoomType.md deleted file mode 100644 index e8ead95f..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/RoomType.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: RoomType - -> **RoomType** = `"conference"` \| `"livestream"` \| `"audio_only"` - -Defined in: [packages/react-client/src/hooks/useSandbox.ts:25](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useSandbox.ts#L25) diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/SimulcastBandwidthLimit.md b/versioned_docs/version-0.20.0/api/web/type-aliases/SimulcastBandwidthLimit.md deleted file mode 100644 index acd7f0c7..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/SimulcastBandwidthLimit.md +++ /dev/null @@ -1,9 +0,0 @@ -# Type Alias: SimulcastBandwidthLimit - -> **SimulcastBandwidthLimit** = `Map`\<[`Variant`](../enumerations/Variant.md), `BandwidthLimit`\> - -Defined in: packages/ts-client/dist/index.d.mts:213 - -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.20.0/api/web/type-aliases/SimulcastBandwidthLimits.md b/versioned_docs/version-0.20.0/api/web/type-aliases/SimulcastBandwidthLimits.md deleted file mode 100644 index 5d167750..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/SimulcastBandwidthLimits.md +++ /dev/null @@ -1,29 +0,0 @@ -# Type Alias: SimulcastBandwidthLimits - -> **SimulcastBandwidthLimits** = `object` - -Defined in: [packages/react-client/src/types/public.ts:53](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L53) - -## Properties - -### 1 - -> **1**: `number` - -Defined in: [packages/react-client/src/types/public.ts:54](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L54) - -*** - -### 2 - -> **2**: `number` - -Defined in: [packages/react-client/src/types/public.ts:55](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L55) - -*** - -### 3 - -> **3**: `number` - -Defined in: [packages/react-client/src/types/public.ts:56](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L56) diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/StreamConfig.md b/versioned_docs/version-0.20.0/api/web/type-aliases/StreamConfig.md deleted file mode 100644 index fa279a10..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/StreamConfig.md +++ /dev/null @@ -1,13 +0,0 @@ -# Type Alias: StreamConfig - -> **StreamConfig** = `object` - -Defined in: [packages/react-client/src/types/public.ts:59](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L59) - -## Properties - -### simulcast? - -> `optional` **simulcast**: [`Variant`](../enumerations/Variant.md)[] \| `false` - -Defined in: [packages/react-client/src/types/public.ts:59](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L59) diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/StreamerInputs.md b/versioned_docs/version-0.20.0/api/web/type-aliases/StreamerInputs.md deleted file mode 100644 index 6459239b..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/StreamerInputs.md +++ /dev/null @@ -1,31 +0,0 @@ -# Type Alias: StreamerInputs - -> **StreamerInputs** = \{ `audio?`: `MediaStream` \| `null`; `video`: `MediaStream`; \} \| \{ `audio`: `MediaStream`; `video?`: `null`; \} - -Defined in: [packages/react-client/src/hooks/useLivestreamStreamer.ts:7](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useLivestreamStreamer.ts#L7) - -## Type declaration - -\{ `audio?`: `MediaStream` \| `null`; `video`: `MediaStream`; \} - -### audio? - -> `optional` **audio**: `MediaStream` \| `null` - -The audio source to publish. e.g. `microphoneStream` from [useMicrophone](../functions/useMicrophone.md) or `stream` from [useScreenShare](../functions/useScreenShare.md) - -### video - -> **video**: `MediaStream` - -The video source to publish. e.g. `cameraStream` from [useCamera](../functions/useCamera.md) or `stream` from [useScreenShare](../functions/useScreenShare.md) - -\{ `audio`: `MediaStream`; `video?`: `null`; \} - -### audio - -> **audio**: `MediaStream` - -### video? - -> `optional` **video**: `null` diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/Track.md b/versioned_docs/version-0.20.0/api/web/type-aliases/Track.md deleted file mode 100644 index f39e8bcb..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/Track.md +++ /dev/null @@ -1,53 +0,0 @@ -# Type Alias: Track - -> **Track** = `object` - -Defined in: [packages/react-client/src/types/public.ts:14](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L14) - -## Properties - -### encoding - -> **encoding**: [`Variant`](../enumerations/Variant.md) \| `null` - -Defined in: [packages/react-client/src/types/public.ts:16](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L16) - -*** - -### metadata? - -> `optional` **metadata**: `TrackMetadata` - -Defined in: [packages/react-client/src/types/public.ts:18](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L18) - -*** - -### simulcastConfig - -> **simulcastConfig**: [`SimulcastConfig`](../interfaces/SimulcastConfig.md) \| `null` - -Defined in: [packages/react-client/src/types/public.ts:19](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L19) - -*** - -### stream - -> **stream**: `MediaStream` \| `null` - -Defined in: [packages/react-client/src/types/public.ts:15](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L15) - -*** - -### track - -> **track**: `MediaStreamTrack` \| `null` - -Defined in: [packages/react-client/src/types/public.ts:20](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L20) - -*** - -### trackId - -> **trackId**: [`TrackId`](TrackId.md) - -Defined in: [packages/react-client/src/types/public.ts:17](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L17) diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/TrackBandwidthLimit.md b/versioned_docs/version-0.20.0/api/web/type-aliases/TrackBandwidthLimit.md deleted file mode 100644 index 0831453a..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/TrackBandwidthLimit.md +++ /dev/null @@ -1,8 +0,0 @@ -# Type Alias: TrackBandwidthLimit - -> **TrackBandwidthLimit** = `BandwidthLimit` \| [`SimulcastBandwidthLimit`](SimulcastBandwidthLimit.md) - -Defined in: packages/ts-client/dist/index.d.mts:218 - -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.20.0/api/web/type-aliases/TrackId.md b/versioned_docs/version-0.20.0/api/web/type-aliases/TrackId.md deleted file mode 100644 index ee28427b..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/TrackId.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: TrackId - -> **TrackId** = [`Brand`](Brand.md)\<`string`, `"TrackId"`\> - -Defined in: [packages/react-client/src/types/public.ts:11](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L11) diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/TrackMiddleware.md b/versioned_docs/version-0.20.0/api/web/type-aliases/TrackMiddleware.md deleted file mode 100644 index 210106a9..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/TrackMiddleware.md +++ /dev/null @@ -1,5 +0,0 @@ -# Type Alias: TrackMiddleware - -> **TrackMiddleware** = (`track`) => [`MiddlewareResult`](MiddlewareResult.md) \| `Promise`\<[`MiddlewareResult`](MiddlewareResult.md)\> \| `null` - -Defined in: [packages/react-client/src/types/public.ts:24](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L24) diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/TracksMiddleware.md b/versioned_docs/version-0.20.0/api/web/type-aliases/TracksMiddleware.md deleted file mode 100644 index adb3caca..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/TracksMiddleware.md +++ /dev/null @@ -1,16 +0,0 @@ -# Type Alias: TracksMiddleware() - -> **TracksMiddleware** = (`videoTrack`, `audioTrack`) => [`TracksMiddlewareResult`](TracksMiddlewareResult.md) \| `Promise`\<[`TracksMiddlewareResult`](TracksMiddlewareResult.md)\> - -Defined in: [packages/react-client/src/types/public.ts:31](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L31) - -## Parameters - -| Parameter | Type | -| ------ | ------ | -| `videoTrack` | `MediaStreamTrack` | -| `audioTrack` | `MediaStreamTrack` \| `null` | - -## Returns - -[`TracksMiddlewareResult`](TracksMiddlewareResult.md) \| `Promise`\<[`TracksMiddlewareResult`](TracksMiddlewareResult.md)\> diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/TracksMiddlewareResult.md b/versioned_docs/version-0.20.0/api/web/type-aliases/TracksMiddlewareResult.md deleted file mode 100644 index 2133abc2..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/TracksMiddlewareResult.md +++ /dev/null @@ -1,33 +0,0 @@ -# Type Alias: TracksMiddlewareResult - -> **TracksMiddlewareResult** = `object` - -Defined in: [packages/react-client/src/types/public.ts:26](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L26) - -## Properties - -### audioTrack - -> **audioTrack**: `MediaStreamTrack` \| `null` - -Defined in: [packages/react-client/src/types/public.ts:28](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L28) - -*** - -### onClear() - -> **onClear**: () => `void` - -Defined in: [packages/react-client/src/types/public.ts:29](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L29) - -#### Returns - -`void` - -*** - -### videoTrack - -> **videoTrack**: `MediaStreamTrack` - -Defined in: [packages/react-client/src/types/public.ts:27](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/types/public.ts#L27) diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/UseInitializeDevicesParams.md b/versioned_docs/version-0.20.0/api/web/type-aliases/UseInitializeDevicesParams.md deleted file mode 100644 index b8409e5a..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/UseInitializeDevicesParams.md +++ /dev/null @@ -1,21 +0,0 @@ -# Type Alias: UseInitializeDevicesParams - -> **UseInitializeDevicesParams** = `object` - -Defined in: [packages/react-client/src/hooks/devices/useInitializeDevices.ts:5](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/devices/useInitializeDevices.ts#L5) - -## Properties - -### enableAudio? - -> `optional` **enableAudio**: `boolean` - -Defined in: [packages/react-client/src/hooks/devices/useInitializeDevices.ts:7](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/devices/useInitializeDevices.ts#L7) - -*** - -### enableVideo? - -> `optional` **enableVideo**: `boolean` - -Defined in: [packages/react-client/src/hooks/devices/useInitializeDevices.ts:6](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/devices/useInitializeDevices.ts#L6) diff --git a/versioned_docs/version-0.20.0/api/web/type-aliases/UseSandboxProps.md b/versioned_docs/version-0.20.0/api/web/type-aliases/UseSandboxProps.md deleted file mode 100644 index 663c4b95..00000000 --- a/versioned_docs/version-0.20.0/api/web/type-aliases/UseSandboxProps.md +++ /dev/null @@ -1,17 +0,0 @@ -# Type Alias: UseSandboxProps - -> **UseSandboxProps** = `object` - -Defined in: [packages/react-client/src/hooks/useSandbox.ts:20](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useSandbox.ts#L20) - -## Properties - -### configOverride? - -> `optional` **configOverride**: `object` - -Defined in: [packages/react-client/src/hooks/useSandbox.ts:22](https://github.com/fishjam-cloud/web-client-sdk/blob/00cc23b021c6e87a4a0f647ceccc9acb897b5a38/packages/react-client/src/hooks/useSandbox.ts#L22) - -| Name | Type | -| ------ | ------ | -| `fishjamUrl?` | `string` | diff --git a/versioned_docs/version-0.20.0/api/web/typedoc-sidebar.cjs b/versioned_docs/version-0.20.0/api/web/typedoc-sidebar.cjs deleted file mode 100644 index 3f4a788e..00000000 --- a/versioned_docs/version-0.20.0/api/web/typedoc-sidebar.cjs +++ /dev/null @@ -1,4 +0,0 @@ -// @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/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/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/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/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/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.20.0/api/web/variables/SimulcastConfig.md b/versioned_docs/version-0.20.0/api/web/variables/SimulcastConfig.md deleted file mode 100644 index 180155b5..00000000 --- a/versioned_docs/version-0.20.0/api/web/variables/SimulcastConfig.md +++ /dev/null @@ -1,5 +0,0 @@ -# Variable: SimulcastConfig - -> **SimulcastConfig**: `MessageFns`\<[`SimulcastConfig`](../interfaces/SimulcastConfig.md)\> - -Defined in: packages/ts-client/dist/index.d.mts:158 diff --git a/versioned_docs/version-0.20.0/explanation/_category_.json b/versioned_docs/version-0.20.0/explanation/_category_.json deleted file mode 100644 index d34d9b78..00000000 --- a/versioned_docs/version-0.20.0/explanation/_category_.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "label": "Explanation", - "position": 4, - "link": { - "type": "generated-index", - "title": "Explanation", - "description": "Big-picture explanations of higher-level Fishjam concepts. Most useful for building understanding of a particular topic.", - "slug": "/explanation" - }, - "collapsible": false -} diff --git a/versioned_docs/version-0.20.0/explanation/architecture.mdx b/versioned_docs/version-0.20.0/explanation/architecture.mdx deleted file mode 100644 index 6501ad92..00000000 --- a/versioned_docs/version-0.20.0/explanation/architecture.mdx +++ /dev/null @@ -1,91 +0,0 @@ ---- -type: explanation -sidebar_position: 2 ---- - -# Fishjam Architecture - -_Understanding how Fishjam works under the hood_ - -This document explains the technical architecture of Fishjam and how data flows through the system. - -## High-level Architecture - -Streaming with Fishjam is simple: you create a room, add peers to it, and start streaming. Below is a high-level overview of how Fishjam works. - -![Fishjam Data Flow](@site/static/img/architecture.svg) - -## Components Overview - -### 1. Your Backend Server - -Your application's backend server is responsible for: - -- Authenticating users -- Creating rooms using Fishjam Server SDKs -- Generating peer tokens for clients -- Managing room lifecycle and permissions - -### 2. Fishjam Media Server - -The Fishjam Media Server is the core infrastructure component that: - -- Routes audio and video streams between participants -- Handles WebRTC negotiations and connections -- Manages different room types (conference, audio-only, livestream) -- Processes and transcodes media when needed -- Enforces security policies and token validation - -### 3. Client Applications - -Client applications (React Native, React) use Fishjam Client SDKs to: - -- Connect to rooms using peer tokens -- Send and receive audio/video streams -- Handle device management (cameras, microphones) -- Manage connection state and reconnections - -## Data Flow - -### 1. Room Creation Flow - -```mermaid -sequenceDiagram - participant FM as Fishjam Media Server - participant BE as Your Backend - participant Client as Client App - - Client->>BE: Request to join room - BE->>FM: Create room (Server SDK) - FM->>BE: Return room ID - BE->>FM: Create peer (Server SDK) - FM->>BE: Return peer token - BE->>Client: Send peer token + Fishjam URL -``` - -### 2. Media Streaming Flow - -```mermaid -sequenceDiagram - participant C1 as Client 1 - participant FM as Fishjam Media Server - participant C2 as Client 2 - - C1->>FM: Connect with peer token - C2->>FM: Connect with peer token - C1->>FM: Send video/audio stream - FM->>C2: Route stream to other peers - C2->>FM: Send video/audio stream - FM->>C1: Route stream to other peers -``` - -## Next Steps - -To understand different room types in detail, see [Room Types Explained](../explanation/room-types). - -To learn about security and token management, see [Security & Token Model](../explanation/security-tokens). - -Ready to implement? Start with our tutorials: - -- [React Native Quick Start](../tutorials/react-native-quick-start) -- [Backend Quick Start](../tutorials/backend-quick-start) diff --git a/versioned_docs/version-0.20.0/explanation/glossary.md b/versioned_docs/version-0.20.0/explanation/glossary.md deleted file mode 100644 index dd92e57c..00000000 --- a/versioned_docs/version-0.20.0/explanation/glossary.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -type: reference ---- - -# Glossary - -A brief walk-through of the terms we use in the documentation. - -### Room - -A collection of peers that can send and receive video/audio to and from other peers. - -### Peer - -A user that is connected to a room. Each peer has some associated metadata and tracks. - -### Track - -A single stream of video or audio from a peer. It could be a camera view, shared screen, or microphone audio. Each peer can stream multiple tracks. - -### Management Token - -A secret token that should be stored on your backend. It allows you to create rooms and add peers. - -### Peer Token - -A token that your backend should pass to end clients to allow access to a specific room. - -### Fishjam ID - -The ID of your Fishjam instance. It is used by your backend server to add peers to rooms (and create rooms). It is also used by end client apps to join rooms. - -### 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). diff --git a/versioned_docs/version-0.20.0/explanation/public-livestreams.mdx b/versioned_docs/version-0.20.0/explanation/public-livestreams.mdx deleted file mode 100644 index 6dc1032c..00000000 --- a/versioned_docs/version-0.20.0/explanation/public-livestreams.mdx +++ /dev/null @@ -1,224 +0,0 @@ ---- -type: explanation -title: Private vs Public Livestreams -sidebar_position: 5 ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -# Private vs Public Livestreams - -:::info -This explanation only applies to Fishjam rooms with type `livestream`. -::: - -When livestreaming with Fishjam, you can chose to make your livestream `private` or `public`. -By default, created livestreams are `private`, to prevent possible bugs. - - - - - ```ts - const fishjamId = ''; - const managementToken = ''; - - // ---cut--- - import { FishjamClient } from '@fishjam-cloud/js-server-sdk'; - - const fishjamClient = new FishjamClient({ - fishjamId, - managementToken, - }); - - const privateRoom = await fishjamClient.createRoom({ roomType: 'livestream' }); // [!code highlight] - const publicRoom = await fishjamClient.createRoom({ roomType: 'livestream', public: true }); // [!code highlight] - ``` - - - - - - ```python - from fishjam import FishjamClient - - fishjam_client = FishjamClient( - fishjam_id=fishjam_id, - management_token=management_token, - ); - - private_room = fishjam_client.create_room(room_type="livestream") # [!code highlight] - public_room = fishjam_client.create_room(room_type="livestream", public=True) # [!code highlight] - ``` - - - - -The choice you make affects how **viewers** connect to the livestream and has no effect on streamers. - -## Private livestreams - -When you create a private livestream, viewers are required to provide a viewer token when connecting to the livestream. - -This aims to provide control over who can view a livestream, but requires you to distribute tokens from your backend application to your frontend applications. - -### Creating a viewer token - -Below we show how you would create a livestream viewer token in a production scenario, with your own backend. -Note that for development purposes, you can [use the Sandbox API to generate a viewer token](../tutorials/livestreaming#obtaining-a-token-1). - - - - - ```ts - const fishjamId = ''; - const managementToken = ''; - - // ---cut--- - import { FishjamClient } from '@fishjam-cloud/js-server-sdk'; - - const fishjamClient = new FishjamClient({ - fishjamId, - managementToken, - }); - - - const privateRoom = await fishjamClient.createRoom({ roomType: 'livestream' }); - const { token: viewerToken } = await fishjamClient.createLivestreamViewerToken(privateRoom.id); // [!code highlight] - ``` - - - - - - ```python - from fishjam import FishjamClient - - fishjam_client = FishjamClient( - fishjam_id=fishjam_id, - management_token=management_token, - ); - - private_room = fishjam_client.create_room(room_type="livestream") - viewer_token = fishjam_client.create_livestream_viewer_token(private_room.id) # [!code highlight] - ``` - - - - -### 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). - - - - - ```tsx - const viewerToken = ''; - - // ---cut--- - import { useLivestreamViewer } from '@fishjam-cloud/react-client'; - - // ... - - const { connect, stream } = useLivestreamViewer(); - - // ... - - await connect({ token: viewerToken }); - // after connecting stream will be available - ``` - - - - - - ```tsx - import React from 'react'; - - const viewerToken = ''; - - // ---cut--- - import { - LivestreamViewer, - useLivestreamViewer, - } from '@fishjam-cloud/react-native-client'; - - // ... - - const { connect } = useLivestreamViewer(); - - // ... - - await connect({ token: viewerToken }); - - // Use `LivestreamViewer` to render the stream - - ``` - - - - -## Public livestreams - -Public livestreams simplify the viewing process by omitting the viewer token. -All a viewer needs to view a public livestream is the ID of the room, so your backend doesn't need to manage the creation and distribution of viewer tokens. - -Note however, that public livestreams are _not suitable for all use-cases_. - -For example, if you are developing an app, which includes exclusive live content that requires a subscription to view, then you will want to authorize viewers before allowing them to view a livestream. -Failing to do so may result in extra costs, as livestreams are billed per-viewer. -Such an application will benefit from the token-based authorization in [private livestreams](#private-livestreams). - -### 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). - - - - - ```tsx - const roomId = ''; - - // ---cut--- - import { useLivestreamViewer } from '@fishjam-cloud/react-client'; - - // ... - - const { connect, stream } = useLivestreamViewer(); - - // ... - - await connect({ streamId: roomId }); - // after connecting `stream` will be available - ``` - - - - - - ```tsx - import React from 'react'; - - const roomId = ''; - - // ---cut--- - import { - LivestreamViewer, - useLivestreamViewer, - } from '@fishjam-cloud/react-native-client'; - - // ... - - const { connect } = useLivestreamViewer(); - - // ... - - await connect({ streamId: roomId }); - - // Use `LivestreamViewer` to render the stream - - ``` - - - diff --git a/versioned_docs/version-0.20.0/explanation/room-types.mdx b/versioned_docs/version-0.20.0/explanation/room-types.mdx deleted file mode 100644 index 2257dd72..00000000 --- a/versioned_docs/version-0.20.0/explanation/room-types.mdx +++ /dev/null @@ -1,130 +0,0 @@ ---- -type: explanation -sidebar_position: 3 ---- - -# Room Types Explained - -_Understanding different types of rooms and when to use them_ - -Fishjam provides three distinct room types, each optimized for different use cases and scenarios. -Understanding these room types helps you choose the right approach for your application. - -## Conference Rooms (Default) - -### What are Conference Rooms? - -Conference rooms are the default room type designed for multi-participant video conferencing scenarios. They support all Fishjam features and provide the most flexibility. - -### Key Characteristics - -- **Multi-participant**: Support for many participants simultaneously -- **Bidirectional media**: All participants can send and receive video/audio -- **Multiple sources**: Participants can share their camera, screen, microphone and more all at once -- **Flexible track management**: Participants can add/remove tracks dynamically - -### Best Use Cases - -- **Video conferencing applications** -- **Interactive webinars** with participant engagement - -### Cost Considerations - -Conference rooms are priced based on total connection time of all peers. - -## Audio-only Rooms - -### What are Audio-only Rooms? - -Audio-only rooms are optimized specifically for voice communication, removing video capabilities to improve performance and reduce costs. - -### Key Characteristics - -- **Voice-only communication**: No video tracks allowed -- **Cheap pricing**: Audio only rooms cost much less than other room types -- **Optimized network usage**: Works well in degraded network conditions - -### Best Use Cases - -- **Audio chat applications** -- **Podcast recording** with multiple participants -- **Large-scale audio events** (town halls, announcements) - -### Cost Benefits - -Audio-only rooms come at a **75% discount** compared to conference rooms: - -- 2 peers for 30 minutes = 60 minutes total time in conference room -- Same scenario in audio-only room = 15 minutes equivalent cost - -### Video Behavior in Audio-only Rooms - -If you attempt to add video to an audio-only room: - -- Video tracks are ignored (not transmitted) -- SDKs log warnings to help with debugging -- Only audio from screen sharing is transmitted -- No errors thrown, graceful degradation - -## Livestream Rooms - -### What are Livestream Rooms? - -Livestream rooms are designed for one-to-many livestreaming scenarios where a single streamer streams to multiple viewers. - -### Key Characteristics - -- **One sender**: Only one streamer can send media -- **Many receivers**: Unlimited viewers can watch -- **Optimized for scale**: Efficient distribution architecture - -### Livestreaming Limitations - -- **Single video track**: Only one video stream allowed -- **Single audio track**: Only one audio stream allowed -- **Additional tracks ignored**: Extra tracks are not forwarded to viewers - -### Viewer Experience - -- **Configurable access**: Livestreams can either be public, where anyone with the stream's ID can join, or private, where every viewer needs a token -- **Standard compatibility**: Any [WHEP](https://blog.swmansion.com/building-interactive-streaming-apps-webrtc-whip-whep-explained-d38f4825ec90)-compatible player works - -### Best Use Cases - -- **Live events** -- **Streaming platforms** and content distribution -- **Corporate livestreams** and announcements -- **Sports and entertainment** streaming - -### Cost Benefits - -Livestream rooms are **20% cheaper** than conference rooms for equivalent usage. - -## Choosing the Right Room Type - -### Decision Matrix - -| Use Case | Room Type | Why | -| ---------------------- | ---------- | ------------------------------------------- | -| Classic video meetings | Conference | Multiple video sources | -| Voice-only meetings | Audio-only | Cheapest and most performant option | -| Live Podcasts | Audio-only | Cheapest and most performant option | -| Sport streaming | Livestream | Highly scalable and cheaper than conference | -| Interactive workshop | Conference | Multiple video sources | - -## 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) - -To learn about the underlying architecture: - -- [Fishjam Architecture](../explanation/architecture) -- [Security & Token Model](../explanation/security-tokens) - -Ready to start building? Check our tutorials: - -- [React Native Quick Start](../tutorials/react-native-quick-start) -- [Backend Quick Start](../tutorials/backend-quick-start) diff --git a/versioned_docs/version-0.20.0/explanation/sandbox-api-concept.mdx b/versioned_docs/version-0.20.0/explanation/sandbox-api-concept.mdx deleted file mode 100644 index a54d5d85..00000000 --- a/versioned_docs/version-0.20.0/explanation/sandbox-api-concept.mdx +++ /dev/null @@ -1,81 +0,0 @@ ---- -type: explanation -sidebar_position: 1 ---- - -# What is the Sandbox API? - -The Sandbox API is a development tool that simplifies getting started with Fishjam by providing a simple backend for testing, eliminating the need to build your own server initially. - -## What can the Sandbox API do? - -The Sandbox API is an HTTP server that comes with Fishjam's Sandbox environment. -It provides basic room creation and peer management functionality without requiring you to set up your own backend infrastructure. - -### Key Characteristics - -- **Development-purposed**: Designed for initial development and testing -- **No authentication**: Simplified access for quick prototyping -- **Sandbox-only**: Only available in the Sandbox environment - -## The Problem Sandbox API Solves - -When starting with videoconferencing or livestreaming development, you typically need: - -1. A **Backend server** to create rooms -2. An **Authentication system** to manage users -3. **Token management** for secure peer access -4. **API endpoints** for your frontend to call - -This creates a problem: to test your frontend, you need a backend, but during prototyping you want to focus on frontend development first. -The Sandbox API mitigates this issue and allows you to start frontend development ASAP. - -## Relationship to Server SDKs - -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 express from "express"; -const fishjamUrl = ""; -const managementToken = ""; -const app = express(); - -// ---cut--- -// What Sandbox API does internally (simplified) -const fishjamClient = new FishjamClient({ fishjamUrl, managementToken }); - -app.get("/", async (req: express.Request, res: express.Response) => { - const { roomName, peerName, roomType } = req.query; - - // Create or get room - const room = await fishjamClient.createRoom({ - roomType: roomType as RoomConfigRoomTypeEnum, - }); - - // Create or get peer - const { peer, peerToken } = await fishjamClient.createPeer(room.id); - - res.json({ peerToken, url: fishjamUrl }); -}); -``` - -This shows you exactly what your production backend needs to do, just with proper authentication and error handling. - -## See also - -To understand how to use The Sandbox API for development: - -- [How to use The Sandbox API for testing](../how-to/features/sandbox-api-testing) - -To learn about building your own backend: - -- [Backend Quick Start Tutorial](../tutorials/backend-quick-start) -- [How to set up your server](../how-to/backend/server-setup) - -To understand the security model: - -- [Security & Token Model](../explanation/security-tokens) diff --git a/versioned_docs/version-0.20.0/explanation/security-tokens.mdx b/versioned_docs/version-0.20.0/explanation/security-tokens.mdx deleted file mode 100644 index 42b628e9..00000000 --- a/versioned_docs/version-0.20.0/explanation/security-tokens.mdx +++ /dev/null @@ -1,122 +0,0 @@ ---- -type: explanation -sidebar_position: 4 ---- - -# Security & Token Model - -_Understanding Fishjam's security architecture and token system_ - -Fishjam uses a token-based security model to ensure secure access control while keeping the developer experience simple. - -## Security Architecture Overview - -Fishjam's security is built on a **two-tier token system**: - -1. **Management Tokens**: For backend-to-Fishjam server communication -2. **Peer Tokens**: For client-to-Fishjam server communication - -This separation ensures that sensitive operations remain on your backend while allowing clients secure, limited access to media streaming. - -## Management Tokens - -### Purpose - -Management tokens provide your backend server with administrative access to Fishjam resources. They allow creating, managing, and deleting rooms and peers. - -### Characteristics - -- **Long-lived**: Management tokens remain valid until manually regenerated -- **High privilege**: Management tokens allow performing administrative operations and should only be used in backend applications. -- **Backend-only**: Management tokens should never be sent to client applications. -- **Environment-specific**: There are different tokens for sandbox and production. - -### What Management Tokens Can Do - -Management tokens give permission to: - -- Create and manage rooms and peers -- Setup [webhooks](../how-to/backend/server-setup#webhooks) -- Set [immutable peer metadata](../how-to/backend/server-setup#metadata) - -## Peer Tokens - -### Purpose - -Peer tokens provide client applications with limited, time-bound access to join a specific room as a specific peer. - -### Characteristics - -- **Short-lived**: Peer tokens expire 24h after creation. -- **Scope-limited**: Peer tokens give access to one specific room as one specific peer only. -- **Client-safe**: Peer tokens are safe to send to frontend applications. - -### What Peer Tokens Can Do - -Peer tokens give permission to: - -- Connect to the specific room they were issued for -- Participate in room activities (audio/video/screen sharing) -- Access peer metadata and room state - -### What Peer Tokens Cannot Do - -- Create or delete rooms -- Access multiple rooms -- Add or remove peers - -### Generation Process - -```typescript -import { FishjamClient, RoomId } from "@fishjam-cloud/js-server-sdk"; -import express from "express"; -const res = {} as any; -const fishjamUrl = ""; -const managementToken = ""; -const roomId = "" as unknown as RoomId; -const fishjamClient = new FishjamClient({ fishjamUrl, managementToken }); - -// ---cut--- -// Backend generates peer token (using management token) -const { peer, peerToken } = await fishjamClient.createPeer(roomId, { - metadata: { name: "John Doe", userId: "user-123" }, -}); - -// Backend sends peer token to client -res.json({ - peerToken, // Client uses this to connect - fishjamUrl, // Fishjam server URL - roomId, // Room information -}); -``` - -### Client Usage - -```typescript -import { useConnection } from "@fishjam-cloud/react-client"; -const joinRoom = {} as any; -const fishjamUrl = ""; -const peerToken = ""; - -// ---cut--- -// Client uses peer token to connect (safe to use in frontend) -await joinRoom({ - url: fishjamUrl, - peerToken: peerToken, // This is safe in client code -}); -``` - -## Next Steps - -To implement secure authentication: - -- [Backend Quick Start Tutorial](../tutorials/backend-quick-start) -- [How to set up your server](../how-to/backend/server-setup) - -To understand the broader architecture: - -- [Fishjam Architecture](../explanation/architecture) - -To learn about the Sandbox API's security limitations: - -- [Understanding the Sandbox API](../explanation/sandbox-api-concept) diff --git a/versioned_docs/version-0.20.0/explanation/what-is-fishjam.mdx b/versioned_docs/version-0.20.0/explanation/what-is-fishjam.mdx deleted file mode 100644 index a2e80309..00000000 --- a/versioned_docs/version-0.20.0/explanation/what-is-fishjam.mdx +++ /dev/null @@ -1,67 +0,0 @@ ---- -type: explanation -sidebar_position: 0 ---- - -# What is Fishjam? - -_Understanding the role and purpose of Fishjam_ - -Fishjam is a multimedia streaming toolkit that allows you to build real-time video and audio streaming applications. -It uses [WebRTC](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API) under the hood to ensure sub-second (in most cases **less than 300ms**) latency. -We provide the infrastructure, media server, and client SDKs so you can focus on building your apps. - -**No WebRTC knowledge is required!** - -## The Problem Fishjam Solves - -Building real-time video and audio applications is complex. Developers typically need to: - -- Set up and manage WebRTC infrastructure -- Handle complex peer-to-peer networking -- Manage media servers and scaling -- Deal with different devices and codec compatibility -- Implement secure token-based authentication - -Fishjam abstracts away this complexity, providing a simple API and managed infrastructure. - -## What Fishjam Provides - -Fishjam consists of several components that work together to provide a seamless multimedia streaming experience: - -| Component | Description | -| --------------------- | ------------------------------------------------------------------------------------------------------- | -| Developer panel | The place to access your credentials and manage your Fishjam usage. | -| Fishjam Media Servers | Media servers route your multimedia traffic. We host and manage them for you. | -| Fishjam Client SDKs | Toolkit used for multimedia integration on endpoint devices. | -| Fishjam Server SDKs | Toolkit for integrating your backend with Fishjam. We currently support Python and NodeJS. | -| Sandbox API | Simple backend for creating test rooms. You can test Fishjam without having to set up your own backend. | - -## Use Cases - -Fishjam is ideal for: - -### Video Conferencing - -Build videoconferencing applications with multiple participants in rooms, screen sharing, and audio/video. - -### Livestreaming - -Stream live content from one streamer to many viewers with low latency. -Perfect for live events or streaming platforms. - -### Audio-only Applications - -Create voice-only experiences like audio conferencing, podcasts, or voice chat applications. - -## Next Steps - -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). - -Ready to start building? Check out our tutorials: - -- [React Native Quick Start](../tutorials/react-native-quick-start) -- [React Quick Start](../tutorials/react-quick-start) -- [Backend Quick Start](../tutorials/backend-quick-start) diff --git a/versioned_docs/version-0.20.0/how-to/_category_.json b/versioned_docs/version-0.20.0/how-to/_category_.json deleted file mode 100644 index a932906d..00000000 --- a/versioned_docs/version-0.20.0/how-to/_category_.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "label": "How-to Guides", - "position": 3, - "link": { - "type": "generated-index", - "title": "How-to Guides", - "description": "Practical step-by-step guides to help you achieve a specific goal. Most useful when you're trying to get something done.", - "slug": "/how-to" - }, - "collapsible": false -} diff --git a/versioned_docs/version-0.20.0/how-to/_common/metadata/header.mdx b/versioned_docs/version-0.20.0/how-to/_common/metadata/header.mdx deleted file mode 100644 index 1602f006..00000000 --- a/versioned_docs/version-0.20.0/how-to/_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.20.0/how-to/_common/metadata/joining_room.mdx b/versioned_docs/version-0.20.0/how-to/_common/metadata/joining_room.mdx deleted file mode 100644 index 517a5b30..00000000 --- a/versioned_docs/version-0.20.0/how-to/_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.20.0/how-to/_common/metadata/reading.mdx b/versioned_docs/version-0.20.0/how-to/_common/metadata/reading.mdx deleted file mode 100644 index b0516650..00000000 --- a/versioned_docs/version-0.20.0/how-to/_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.20.0/how-to/_common/metadata/updating.mdx b/versioned_docs/version-0.20.0/how-to/_common/metadata/updating.mdx deleted file mode 100644 index 97bd1a1b..00000000 --- a/versioned_docs/version-0.20.0/how-to/_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 the `updatePeerMetadata` method of the `useUpdatePeerMetadata` hook: - -{props.children} diff --git a/versioned_docs/version-0.20.0/how-to/backend/_category_.json b/versioned_docs/version-0.20.0/how-to/backend/_category_.json deleted file mode 100644 index 2d5af2e1..00000000 --- a/versioned_docs/version-0.20.0/how-to/backend/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Backend", - "position": 4 -} diff --git a/versioned_docs/version-0.20.0/how-to/backend/fastapi-example.mdx b/versioned_docs/version-0.20.0/how-to/backend/fastapi-example.mdx deleted file mode 100644 index de091849..00000000 --- a/versioned_docs/version-0.20.0/how-to/backend/fastapi-example.mdx +++ /dev/null @@ -1,99 +0,0 @@ ---- -sidebar_position: 1 -title: FastAPI ---- - -# FastAPI example - -The example assumes you've already installed [**our SDK**](https://github.com/fishjam-cloud/python-server-sdk) and you're ready to go. -If you wish to see more general info, visit [**Set up your server**](../../how-to/backend/server-setup) article. - -## Minimal setup - -The same way as in the [**FastAPI docs**](https://fastapi.tiangolo.com/tutorial/first-steps/), the code below can be copied and run immediately. -Just make sure you set `FISHJAM_URL` and `FISHJAM_MANAGEMENT_TOKEN` environment variables. -The `Depends` function allows the `FishjamClient` to be provided to the route function as a dependency, which avoids code duplication and allows easy mocking. - -```python -import os -from typing import Annotated -from fastapi import Depends, FastAPI -from fishjam import FishjamClient - - -app = FastAPI() - -def fishjam_client(): - fishjam_url = os.environ["FISHJAM_URL"] - management_token = os.environ["FISHJAM_MANAGEMENT_TOKEN"] - return FishjamClient(fishjam_url=fishjam_url, management_token=management_token) - - -@app.get("/") -async def get_rooms(fishjam_client: Annotated[FishjamClient, Depends(fishjam_client)]): - rooms = fishjam_client.get_all_rooms() - return {"rooms": rooms} -``` - -## Listening to events - -Fishjam instance is a stateful server that is emitting messages upon certain events. -You can listen for those messages and react as you prefer. -There are two options for obtaining these. - -### Webhooks - -To receive and parse Fishjam protobuf messages, create a dependable function that parses the request body using the `receive_binary` function from the `fishjam` package. -Then, you will be able to use pattern matching to respond to different kinds of events. - -```python -from fastapi import Depends, FastAPI, HTTPException, Request -from fishjam import receive_binary -from fishjam.events import ServerMessagePeerAdded - -app = FastAPI() - -async def parse_fishjam_message(request: Request): - binary = await request.body() - if message := receive_binary(binary): - return message - raise HTTPException(status_code=400, detail="Invalid Fishjam message") - -@app.post("/fishjam-webhook") -async def fishjam_webhook(fishjam_message = Depends(parse_fishjam_message)): - match fishjam_message: - case ServerMessagePeerAdded(): - print(f"Peer added: {fishjam_message.peer_id}") - case _: - ... -``` - -### SDK Notifier - -Use the `asyncio` library to run the SDK notifier. -It doesn't interact with the FastAPI library per se, just start the event loop and it will run alongside the server. - -```python -import asyncio -from fishjam import FishjamNotifier - -notifier = FishjamNotifier(server_address=fishjam_url, server_api_token=management_token) - -@notifier.on_server_notification -def handle_notification(notification): - match notification: - case ServerMessagePeerAdded(): - print(f"Peer added: {notification.peer_id}") - case _: - ... - -async def run_notifier(): - notifier_task = asyncio.create_task(notifier.connect()) - - # Wait for the notifier to be ready to receive messages - await notifier.wait_ready() - - await notifier_task - -asyncio.run(run_notifier()) -``` diff --git a/versioned_docs/version-0.20.0/how-to/backend/fastify-example.mdx b/versioned_docs/version-0.20.0/how-to/backend/fastify-example.mdx deleted file mode 100644 index c9193f7e..00000000 --- a/versioned_docs/version-0.20.0/how-to/backend/fastify-example.mdx +++ /dev/null @@ -1,240 +0,0 @@ ---- -sidebar_position: 0 -title: Fastify ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -# Fastify example - -The example assumes you've already installed [**our SDK**](https://www.npmjs.com/package/@fishjam-cloud/js-server-sdk) and you're ready to go. -If you wish to see more general info, visit [**set up your server**](../../how-to/backend/server-setup) article. - -## Load environment variables to Fastify - -Use [`@fastify/env` package](https://github.com/fastify/fastify-env) to load and set environment variables in your Fastify instance. - -```ts title='main.ts' -import Fastify from "fastify"; -import fastifyEnv from "@fastify/env"; - -const fastify = Fastify(); - -const envSchema = { - type: "object", - required: ["FISHJAM_URL", "FISHJAM_MANAGEMENT_TOKEN"], - properties: { - FISHJAM_URL: { - type: "string", - }, - FISHJAM_MANAGEMENT_TOKEN: { - type: "string", - }, - }, -}; - -await fastify.register(fastifyEnv, { schema: envSchema }); - -fastify.listen({ port: 3000 }); -``` - -## Setup Fishjam Fastify plugin - -Fastify allows you to create plugins to encapsulate functionality in scopes. -Check out [fastify documentation](https://fastify.dev/docs/latest/Reference/Plugins) for a deeper understanding of the concept. - -First, extend the `FastifyInstance` interface with `fishjam` entry. -This will provide types of FishjamClient wherever you access `fastify.fishjam` in the codebase. -Then, declare the plugin by invoking the `fp` function with the setup function with as an argument. - -```ts title='fishjamPlugin.ts' -import fastifyPlugin from "fastify-plugin"; -import { FishjamClient } from "@fishjam-cloud/js-server-sdk"; - -declare module "fastify" { - interface FastifyInstance { - fishjam: FishjamClient; - config: { - FISHJAM_URL: string; - FISHJAM_MANAGEMENT_TOKEN: string; - }; - } -} - -export const fishjamPlugin = fastifyPlugin((fastify) => { - const fishjamClient = new FishjamClient({ - fishjamUrl: fastify.config.FISHJAM_URL, - managementToken: fastify.config.FISHJAM_MANAGEMENT_TOKEN, - }); - - fastify.decorate("fishjam", fishjamClient); -}); -``` - -Now, after registering the plugin, we will be able to use Fishjam client by accessing the `fastify.fishjam` property. - -```ts title='main.ts' -import fastifyPlugin from "fastify-plugin"; -import { FishjamClient } from "@fishjam-cloud/js-server-sdk"; -import Fastify from "fastify"; - -declare module "fastify" { - interface FastifyInstance { - fishjam: FishjamClient; - config: { - FISHJAM_URL: string; - FISHJAM_MANAGEMENT_TOKEN: string; - }; - } -} - -export const fishjamPlugin = fastifyPlugin((fastify) => { - const fishjamClient = new FishjamClient({ - fishjamUrl: fastify.config.FISHJAM_URL, - managementToken: fastify.config.FISHJAM_MANAGEMENT_TOKEN, - }); - - fastify.decorate("fishjam", fishjamClient); -}); - -const fastify = Fastify(); - -// ---cut--- -await fastify.register(fishjamPlugin); - -fastify.get("/rooms", () => fastify.fishjam.getAllRooms()); - -fastify.listen({ port: 3000 }); -``` - -## Listening to events - -Fishjam instance is a stateful server that is emitting messages upon certain events. -You can listen for those messages and react as you prefer. -There are two options to obtain these. - -### Webhooks - -To receive and parse the Fishjam protobuf messages, add a content type parser to your global (or scoped) Fastify instance. -Then, you will be able to access the parsed message at `request.Body`. - -```ts title='main.ts' -import Fastify, { FastifyRequest } from "fastify"; -import { ServerMessage } from "@fishjam-cloud/js-server-sdk/proto"; - -const fastify = Fastify(); - -fastify.addContentTypeParser( - "application/x-protobuf", - { parseAs: "buffer" }, - async (_: FastifyRequest, body: Buffer) => - ServerMessage.decode(new Uint8Array(body)), -); - -fastify.post<{ Body: ServerMessage }>("/fishjam-webhook", (request) => { - // handle the message - console.log(request.body); -}); -``` - -### SDK Notifier - -You can also leverage the Fastify plugin mechanism to use websockets to receive messages from Fishjam. -Let's create another plugin in `fishjamNotifierPlugin.ts` file. - -In this case, we don't need to extend the Fastify instance type, because the plugin doesn't decorate the Fastify instance with any properties. It will work in the background. - -```ts title='fishjamNotifierPlugin.ts' -import fastifyPlugin from "fastify-plugin"; -import { FishjamClient } from "@fishjam-cloud/js-server-sdk"; -import Fastify from "fastify"; - -declare module "fastify" { - interface FastifyInstance { - fishjam: FishjamClient; - config: { - FISHJAM_URL: string; - FISHJAM_MANAGEMENT_TOKEN: string; - }; - } -} - -export const fishjamPlugin = fastifyPlugin((fastify) => { - const fishjamClient = new FishjamClient({ - fishjamUrl: fastify.config.FISHJAM_URL, - managementToken: fastify.config.FISHJAM_MANAGEMENT_TOKEN, - }); - - fastify.decorate("fishjam", fishjamClient); -}); - -const fastify = Fastify(); - -// ---cut--- -import { type FastifyInstance } from "fastify"; -import fp from "fastify-plugin"; -import { FishjamWSNotifier } from "@fishjam-cloud/js-server-sdk"; - -export const fishjamNotifierPlugin = fp((fastify) => { - const fishjamUrl = fastify.config.FISHJAM_URL; - const managementToken = fastify.config.FISHJAM_MANAGEMENT_TOKEN; - - const fishjamNotifier = new FishjamWSNotifier( - { fishjamUrl, managementToken }, - (err) => fastify.log.error(err), - () => fastify.log.info("Websocket connection to Fishjam closed"), - () => fastify.log.error("Failed to connect Fishjam notifier"), - ); - - // handle the messages - const handleRoomCreated = console.log; - const handlePeerAdded = console.log; - - fishjamNotifier.on("roomCreated", handleRoomCreated); - fishjamNotifier.on("peerAdded", handlePeerAdded); -}); -``` - -Don't forget to register your plugin. - -```ts title='main.ts' -import fastifyPlugin from "fastify-plugin"; -import { FishjamClient } from "@fishjam-cloud/js-server-sdk"; -import Fastify from "fastify"; -import { FishjamWSNotifier } from "@fishjam-cloud/js-server-sdk"; - -declare module "fastify" { - interface FastifyInstance { - fishjam: FishjamClient; - config: { - FISHJAM_URL: string; - FISHJAM_MANAGEMENT_TOKEN: string; - }; - } -} - -export const fishjamPlugin = fastifyPlugin((fastify) => { - const fishjamClient = new FishjamClient({ - fishjamUrl: "aaa", - managementToken: "bbb", - }); - - fastify.decorate("fishjam", fishjamClient); -}); - -const fastify = Fastify(); - -const fishjamNotifierPlugin = fastifyPlugin((fastify) => { - const fishjamNotifier = new FishjamWSNotifier( - { fishjamUrl: "aaa", managementToken: "bbb" }, - (err) => fastify.log.error(err), - () => fastify.log.info("Websocket connection to Fishjam closed"), - () => fastify.log.error("Failed to connect Fishjam notifier"), - ); -}); - -// ---cut--- -await fastify.register(fishjamPlugin); -await fastify.register(fishjamNotifierPlugin); -``` diff --git a/versioned_docs/version-0.20.0/how-to/backend/production-deployment.mdx b/versioned_docs/version-0.20.0/how-to/backend/production-deployment.mdx deleted file mode 100644 index 4dc43dc2..00000000 --- a/versioned_docs/version-0.20.0/how-to/backend/production-deployment.mdx +++ /dev/null @@ -1,300 +0,0 @@ ---- -type: how-to ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -# How to Deploy Fishjam to Production - -**How-to Guide** - _Deploy your Fishjam backend safely to production_ - -This guide covers the essential steps to move from development (using the Sandbox API) to a production-ready Fishjam backend deployment. - -## Prerequisites - -- Working Fishjam backend (see [Backend Quick Start](../../tutorials/backend-quick-start)) -- Production Fishjam environment (not Sandbox) -- Domain and SSL certificates for your backend -- Production database and infrastructure - -## Step 1: Set up production Fishjam environment - -### Get production credentials - -1. Log in to [Fishjam Dashboard](https://fishjam.io/app) -2. Create or select your **Production** environment (not Sandbox) -3. Copy your production **Fishjam URL** and **Management Token** -4. Note: These are different from your sandbox credentials - -### Environment variables setup - -Create production environment variables: - -```bash -# Production Fishjam credentials -FISHJAM_URL="your-production-fishjam-url" -FISHJAM_MANAGEMENT_TOKEN="your-production-management-token" - -# Your application settings -NODE_ENV="production" -PORT="3000" -DATABASE_URL="your-production-database-url" - -# Security settings -JWT_SECRET="your-secure-jwt-secret" -CORS_ORIGIN="https://yourdomain.com" -``` - -## Step 2: Implement proper authentication - -### Replace Sandbox API calls - -Remove any Sandbox API dependencies from your client code: - -```typescript -// @noErrors: 2451 -import { useSandbox } from "@fishjam-cloud/react-client"; -import express from "express"; - -const authenticateUser = {} as any; -const app = express(); - -const { getSandboxPeerToken } = useSandbox(); - -const userToken = ""; -const roomName = ""; -const userName = ""; - -// ---cut--- -// ❌ Remove: Sandbox API calls -const peerToken = await getSandboxPeerToken(roomName, userName); - -// ✅ Replace with: Your authenticated API -const response = await fetch("https://your-backend.com/api/join-room", { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${userToken}`, - }, - body: JSON.stringify({ roomName, userName }), -}); -``` - -### Implement user authentication - -```typescript -// @noErrors: 2339 -const jwt = {} as any; -import { FishjamClient, Room } from "@fishjam-cloud/js-server-sdk"; -import express from "express"; - -const app = express(); -const getUserById = async (userId: string) => ({ - id: userId, - name: "User", - avatar: "", - role: "user", -}); -const getOrCreateRoom = async (roomName: string) => - ({ id: "room-id" }) as unknown as Room; -const canUserJoinRoom = (user: any, room: any) => true; -process.env.FISHJAM_URL = ""; -process.env.FISHJAM_MANAGEMENT_TOKEN = ""; -process.env.JWT_SECRET = ""; - -// ---cut--- -const fishjamClient = new FishjamClient({ - fishjamUrl: process.env.FISHJAM_URL!, - managementToken: process.env.FISHJAM_MANAGEMENT_TOKEN!, -}); - -// Authentication middleware -const authenticateUser = async ( - req: express.Request, - res: express.Response, - next: express.NextFunction, -) => { - try { - const token = req.headers.authorization?.replace("Bearer ", ""); - if (!token) { - return res.status(401).json({ error: "Authentication required" }); - } - - const decoded = jwt.verify(token, process.env.JWT_SECRET); - req.user = await getUserById(decoded.userId); - next(); - } catch (error) { - res.status(401).json({ error: "Invalid token" }); - } -}; - -// Protected endpoint for joining rooms -app.post("/api/join-room", authenticateUser, async (req, res) => { - try { - const { roomName } = req.body; - const user = req.user; - - // Create or get room - const room = await getOrCreateRoom(roomName); - - // Verify user has permission to join this room - if (!canUserJoinRoom(user, room)) { - return res.status(403).json({ error: "Access denied" }); - } - - // Create peer with user metadata - const { peer, peerToken } = await fishjamClient.createPeer(room.id, { - metadata: { - userId: user.id, - name: user.name, - avatar: user.avatar, - role: user.role, - }, - }); - - res.json({ - peerToken, - fishjamUrl: process.env.FISHJAM_URL, - }); - } catch (error) { - console.error("Join room error:", error); - res.status(500).json({ error: "Failed to join room" }); - } -}); -``` - -## (Optional) Step 3: Handle webhooks and events - -You may wish to receive events from Fishjam regarding created rooms and peers. -All you need for this is a single api endpoint: - -### Webhook endpoint - -```typescript -import express from "express"; -const crypto = {} as any; -const app = express(); - -const handlePeerConnected = {} as any; -const handlePeerDisconnected = {} as any; -const handleRoomEmpty = {} as any; - -// ---cut--- -// Webhook signature verification -const verifyWebhookSignature = ( - req: express.Request, - res: express.Response, - next: express.NextFunction, -) => { - const signature = req.headers["x-fishjam-signature"]; - const payload = JSON.stringify(req.body); - - const expectedSignature = crypto - .createHmac("sha256", process.env.WEBHOOK_SECRET) - .update(payload, "utf8") - .digest("hex"); - - if (signature !== expectedSignature) { - return res.status(401).json({ error: "Invalid signature" }); - } - - next(); -}; - -// Webhook handler -app.post( - "/api/webhooks/fishjam", - express.raw({ type: "application/json" }), - verifyWebhookSignature, - (req: express.Request, res: express.Response) => { - const event = req.body; - - switch (event.type) { - case "peer_connected": - handlePeerConnected(event.data); - break; - case "peer_disconnected": - handlePeerDisconnected(event.data); - break; - case "room_empty": - handleRoomEmpty(event.data); - break; - default: - console.log("Unhandled event type:", event.type); - } - - res.status(200).json({ received: true }); - }, -); -``` - -### Enabling webhooks - -Now, with your endpoint setup, all you need to do is supply your webhook endpoint to Fishjam when creating a room: - -```typescript -import { FishjamClient } from "@fishjam-cloud/js-server-sdk"; -const fishjamClient = {} as any; - -// ---cut--- -const createRoomWithWebhooks = async ( - roomName: string, - roomType = "conference", -) => { - const room = await fishjamClient.createRoom({ - roomType, - webhookUrl: `${process.env.BASE_URL}/api/webhooks/fishjam`, - }); - - return room; -}; -``` - -## Common production issues - -### Issue: Token expiration handling - -Peer tokens expire 24h after creation. -We encourage keeping room and peer lifetimes as short as possible -(typically a single room corresponds to a single video call or stream). -However, if you wish to reuse a single peer over multiple days, you can make use of token refreshing: - - - - - ```ts - import { FishjamClient, RoomId, PeerId } from "@fishjam-cloud/js-server-sdk"; - const fishjamClient = new FishjamClient({ - fishjamUrl: "", - managementToken: "", - }); - const roomId = "" as RoomId; - const peerId = "" as PeerId; - - // ---cut--- - const newToken = fishjamClient.refreshPeerToken(roomId, peerId); - ``` - - - - - - ```python - new_token = fishjam_client.refresh_peer_token(room_id, peer_id) - ``` - - - - -## See also - -For scaling considerations: - -- [Understanding Fishjam Architecture](../../explanation/architecture) -- [Security best practices](../../explanation/security-tokens) - -For specific backend frameworks: - -- [FastAPI example](../../how-to/backend/fastapi-example) -- [Fastify example](../../how-to/backend/fastify-example) diff --git a/versioned_docs/version-0.20.0/how-to/backend/server-setup.mdx b/versioned_docs/version-0.20.0/how-to/backend/server-setup.mdx deleted file mode 100644 index a188e8e2..00000000 --- a/versioned_docs/version-0.20.0/how-to/backend/server-setup.mdx +++ /dev/null @@ -1,295 +0,0 @@ ---- -sidebar_position: 0 ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -# Set up your server - -## Install the SDK - -Install the SDK for the language of your choice. We provide libraries for [**Node**](https://github.com/fishjam-cloud/js-server-sdk) and [**Python**](https://github.com/fishjam-cloud/python-server-sdk). -It's also possible to use the bare REST API, in this case you can skip this step. - - - - - ```bash - npm install @fishjam-cloud/js-server-sdk - ``` - - - - - - ```bash - yarn add @fishjam-cloud/js-server-sdk - ``` - - - - - - ```bash - pip install fishjam-server-sdk - ``` - - - - - - ```bash - poetry add fishjam-server-sdk - ``` - - - - -## Setup your client - -Let's setup everything you need to start communicating with a Fishjam instance. -First of all, view your app in the [**Fishjam developer panel**](https://fishjam.io/app) and copy your **Fishjam URL** and the **Management Token**. -They are required to proceed. Now, we are ready to dive into the code. - - - - - ```ts - process.env.FISHJAM_URL = "https://fishjam.io"; - process.env.FISHJAM_MANAGEMENT_TOKEN = "bbb"; - - // ---cut--- - import { FishjamClient } from '@fishjam-cloud/js-server-sdk'; - - const fishjamUrl = process.env.FISHJAM_URL; - const managementToken = process.env.FISHJAM_MANAGEMENT_TOKEN; - - const fishjamClient = new FishjamClient({ fishjamUrl, managementToken }); - ``` - - - - - - ```python - import os - from fishjam import FishjamClient - - fishjam_url = os.environ["FISHJAM_URL"] - management_token = os.environ["FISHJAM_MANAGEMENT_TOKEN"] - - fishjam_client = FishjamClient(fishjam_url, management_token) - ``` - - - - -### Managing rooms - -Create a room to get the `roomId` and be able to start adding peers. - - - - - ```ts - import { FishjamClient } from '@fishjam-cloud/js-server-sdk'; - const fishjamClient = new FishjamClient({ - - fishjamUrl: "https://fishjam.io", - managementToken: "bbb", - }); - // ---cut--- - const createdRoom = await fishjamClient.createRoom(); - - const theSameRoom = await fishjamClient.getRoom(createdRoom.id); - - await fishjamClient.deleteRoom(theSameRoom.id) - - // puff, it's gone! - ``` - - - - - - ```python - created_room = fishjam_client.create_room() - - the_same_room = fishjam_client.get_room(created_room.id) - - fishjam_client.delete_room(the_same_room.id) - - # puff, it's gone! - ``` - - - - - -### Managing peers - -Create a peer to obtain the peer token allowing your user to join the room. -At any time you can terminate user's access by deleting the peer. - - - - - ```ts - import { FishjamClient } from '@fishjam-cloud/js-server-sdk'; - const fishjamClient = new FishjamClient({ - fishjamUrl: "https://fishjam.io", - managementToken: "bbb", - }); - const created_room = await fishjamClient.createRoom(); - // ---cut--- - const { peer, peerToken } = await fishjamClient.createPeer(created_room.id); - - await fishjamClient.deletePeer(created_room.id, peer.id); - ``` - - - - - - ```python - peer, token = fishjam_client.create_peer(room_id) - - fishjam_client.delete_peer(room_id, peer.id) - ``` - - - - - -#### 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-and-broadcasting) -or [web SDK](../../how-to/react/metadata). This metadata can be only set when creating the peer and can't be updated later. - - - - - ```ts - import { FishjamClient } from '@fishjam-cloud/js-server-sdk'; - const fishjamClient = new FishjamClient({ - fishjamUrl: "https://fishjam.io", - managementToken: "bbb", - }); - const created_room = await fishjamClient.createRoom(); - // ---cut--- - const { peer, peerToken } = await fishjamClient.createPeer(created_room.id, { - metadata: { realName: 'Tom Reeves' }, - }); - ``` - - - - - - ```py - options = PeerOptions( - metadata={"realName": "Tom Reeves"}, - ) - peer, token = self.fishjam_client.create_peer(room_id, options=options) - ``` - - - - -## Listening to events - -Fishjam instance is a stateful server that is emitting messages upon certain events. -You can listen for those messages and react as you prefer. -There are two options to obtain these. - -### Webhooks - -Simply pass the your webhook url as a `webhookUrl` parameter when creating a room. - - - - - ```ts - import { FishjamClient } from '@fishjam-cloud/js-server-sdk'; - - const fishjamClient = new FishjamClient({ - fishjamUrl: "https://fishjam.io", - managementToken: "bbb", - }); - // ---cut--- - const webhookUrl = "https://example.com/"; - await fishjamClient.createRoom({ webhookUrl }); - ``` - - - - - - ```python - from fishjam import RoomOptions - - options = RoomOptions(webhook_url="https://example.com/") - - fishjam_client.create_room(options) - ``` - - - - - -### SDK Notifier - -Our SDKs come equipped with a Notifier allowing you to subscribe for messages. -It sets up a websocket connection with a Fishjam instance and provides a simple interface allowing you to handle messages. - - - - - ```ts - const fishjamUrl = "https://fishjam.io"; - const managementToken = "bbb"; - // ---cut--- - import { FishjamWSNotifier } from '@fishjam-cloud/js-server-sdk'; - - const onClose = console.log; - const onError = console.error; - const onConnectionFailed = console.error; - - const fishjamNotifier = new FishjamWSNotifier({ fishjamUrl, managementToken }, onError, onClose, onConnectionFailed); - - fishjamNotifier.on('roomCreated', console.log); - ``` - - - - - - ```python - import asyncio - from fishjam import FishjamNotifier - - notifier = FishjamNotifier(server_address=fishjam_url, server_api_token=management_token) - - @notifier.on_server_notification - def handle_notification(notification): - match notification: - case ServerMessageRoomCreated(): - print(notification) - case _: - ... - - async def run_notifier(): - notifier_task = asyncio.create_task(notifier.connect()) - - # Wait for notifier to be ready to receive messages - await notifier.wait_ready() - - await notifier_task - - asyncio.run(run_notifier()) - ``` - - - - diff --git a/versioned_docs/version-0.20.0/how-to/features/_category_.json b/versioned_docs/version-0.20.0/how-to/features/_category_.json deleted file mode 100644 index 4aaeb074..00000000 --- a/versioned_docs/version-0.20.0/how-to/features/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Features", - "position": 3 -} diff --git a/versioned_docs/version-0.20.0/how-to/features/audio-only-calls.mdx b/versioned_docs/version-0.20.0/how-to/features/audio-only-calls.mdx deleted file mode 100644 index 7fb48a2d..00000000 --- a/versioned_docs/version-0.20.0/how-to/features/audio-only-calls.mdx +++ /dev/null @@ -1,61 +0,0 @@ ---- -type: how-to ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -# Audio-only Calls - -**How-to Guide** - _Set up voice-only communication with cost savings_ - -In many use cases, you only need real-time audio, without any video streaming. -If your use case falls into this category, then you can benefit greatly from using `audio_only` rooms in Fishjam. - -## Why Should I Care? - -Audio-only rooms are heavily discounted compared to normal rooms. -As described in more detail on the [pricing page](https://fishjam.io/#pricing), Fishjam rooms are priced based on the total connection time of peers in them. -Audio-only rooms come at a 75% discount. -For example, if you have a normal room with 2 peers connected for 30 minutes, then the total cost of the room will be equal to the cost of 60 minutes. -If the same room were audio-only, then the final cost of the room will only be equal to 15 minutes. - -## How Do I Use It? - -Using this feature is as easy as setting the `roomType` field to `audio_only` when creating a room using our [Server SDKs](../../how-to/backend/server-setup) - - - - - ```ts - import { FishjamClient } from '@fishjam-cloud/js-server-sdk'; - const fishjamClient = new FishjamClient({ - fishjamUrl: "aaa", - managementToken: "bbb", - }); - // ---cut--- - const createdRoom = await fishjamClient.createRoom({ roomType: 'audio_only' }); - ``` - - - - - - ```python - options = RoomOptions(room_type="audio_only") - created_room = fishjam_client.create_room(options) - ``` - - - - -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. - -:::info -The React Native and React SDKs will log a warning in the console if any attempt to add video to an audio-only room is made. -This aims to assist in debugging, as adding video to an audio-only room does nothing and is most likely a mistake. -::: - -### Screen sharing - -If you attempt to screen share when connected to an `audio_only` room, then only the audio will actually be sent to the other peers. diff --git a/versioned_docs/version-0.20.0/how-to/features/sandbox-api-testing.mdx b/versioned_docs/version-0.20.0/how-to/features/sandbox-api-testing.mdx deleted file mode 100644 index 896b9413..00000000 --- a/versioned_docs/version-0.20.0/how-to/features/sandbox-api-testing.mdx +++ /dev/null @@ -1,323 +0,0 @@ ---- -type: how-to ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -# Testing with the Sandbox API - -**How-to Guide** - _Use Sandbox API to test your Fishjam integration quickly without a backend_ - -The Sandbox API is a development tool that lets you create rooms and peers for testing without setting up your own backend server. This guide shows you how to use it effectively. - -## Prerequisites - -- Access to [Fishjam Dashboard](https://fishjam.io/app) -- A Sandbox environment set up - -## Step 1: Get your Fishjam ID - -1. Log in to [Fishjam Dashboard](https://fishjam.io/app) -2. Navigate to your [Sandbox Environment](https://fishjam.io/app/sandbox) -3. Copy your **Fishjam ID** - -:::note -`FISHJAM_ID` is your unique sandbox identifier. Anyone who knows this ID can join your rooms, so keep it secure during development. -::: - -## Step 2: Create a room and get peer tokens - -### With the `useSandbox` hook - - - - - ```ts - const FISHJAM_ID = "..."; - const roomName = "testRoom"; - const peerName = "testUser"; - // ---cut--- - import { useSandbox } from '@fishjam-cloud/react-native-client'; - - // ... - - const { getSandboxPeerToken } = useSandbox({ fishjamId: FISHJAM_ID }); - const peerToken = await getSandboxPeerToken(roomName, peerName); - ``` - - - - - - ```ts - const FISHJAM_ID = "..."; - const roomName = "testRoom"; - const peerName = "testUser"; - // ---cut--- - import { useSandbox } from '@fishjam-cloud/react-client'; - - // ... - - const { getSandboxPeerToken } = useSandbox(); - const peerToken = await getSandboxPeerToken(roomName, peerName); - ``` - - - - -### Required parameters - -- `roomName` - Name of the room to create/join -- `peerName` - Name for the peer joining the room - -### Optional parameters - -- `roomType` - Type of room to create (defaults to `conference`) - -### Room types available - -- `conference` - For video/audio conferencing (default) -- `audio-only` - For audio-only conferencing -- `livestream` - For one-to-many video/audio streaming - -## Step 3: Handle the response - -The Sandbox API returns a JSON response with connection details: - -```json -{ - "peerToken": "", - "url": "wss://fishjam.io/api/v1/connect/${YOUR_APP_UUID}", - "room": { - "id": "", - "name": "foo" - }, - "peer": { - "id": "", - "name": "bar" - } -} -``` - -## Step 4: Use the tokens in your client app - -Below are examples on how to use tokens from the Sandbox API in your frontend applications: - - - - - ```tsx - import React, { useEffect, useState } from "react"; - import { Text } from "react-native"; - - const roomName = "testRoom"; - const peerName = `user_${Date.now()}`; - const FISHJAM_ID = "..."; - - const RoomView = (props: {peerToken: string}) => null; - // ---cut--- - import { useSandbox } from "@fishjam-cloud/react-native-client"; - - export default function TestScreen() { - const [peerToken, setPeerToken] = useState(null); - const { getSandboxPeerToken } = useSandbox({ fishjamId: FISHJAM_ID }); - - useEffect(() => { - const fetchPeerToken = async () => { - try { - const token = await getSandboxPeerToken(roomName, peerName); - setPeerToken(token); - } catch (error) { - console.error("Failed to create room:", error); - } - }; - - fetchPeerToken(); - }, []); - - if (!peerToken) { - return Creating room...; - } - - return ( - - ); - } - ``` - - - - - - ```tsx - import React, { useState, useEffect } from "react"; - - const FISHJAM_ID = "your-app-uuid-here"; - // ---cut--- - import { FishjamProvider, useConnection, useSandbox } from "@fishjam-cloud/react-client"; - - function VideoCallComponent() { - const { joinRoom, peerStatus } = useConnection(); - const { getSandboxPeerToken } = useSandbox(); - - const handleJoinRoom = async () => { - const roomName = "testRoom"; - const peerName = `user_${Date.now()}`; - - try { - const peerToken = await getSandboxPeerToken(roomName, peerName) - await joinRoom({ peerToken }); - } catch (error) { - console.error("Failed to join room:", error); - } - }; - - const isConnected = peerStatus === "connected"; - - return ( -
- {isConnected ?

Connected to room!

: } -
- ); - } - - export default function App() { - return ( - - - - ); - } - ``` - -
-
- -## Step 5: Test different room types - -### Testing audio-only rooms - -```ts -import { useSandbox } from "@fishjam-cloud/react-client"; -const { getSandboxPeerToken } = useSandbox(); -// ---cut--- -const audioOnlyUrl = await getSandboxPeerToken( - "audioTest", - "user1", - "audio_only", -); -``` - -### Testing livestream rooms - -```ts -import { useSandbox } from "@fishjam-cloud/react-client"; -const { getSandboxLivestream, getSandboxViewerToken } = useSandbox(); -// ---cut--- - -const livestreamName = "livestream1"; -// For the streamer -const streamerUrl = await getSandboxLivestream(livestreamName); - -// For viewers, you need a viewer token (different endpoint) -const viewerTokenUrl = await getSandboxViewerToken(livestreamName); -``` - -## Step 6: Handle multiple peers - -To test with multiple participants, create multiple peer tokens with different peer names: - -```ts -import { useSandbox } from "@fishjam-cloud/react-client"; -const { getSandboxPeerToken } = useSandbox(); -// ---cut--- -// First peer -const peer1Response = await getSandboxPeerToken("multiTest", "alice"); - -// Second peer -const peer2Response = await getSandboxPeerToken("multiTest", "bob"); -``` - -Both peers will join the same room (`multiTest`) and can communicate with each other. - -## Common testing patterns - -### Pattern 1: Random room names for isolation - -```ts -const roomName = `test_${Math.random().toString(36).substring(7)}`; -const peerName = `user_${Date.now()}`; -``` - -### Pattern 2: Consistent naming for repeated tests - -```ts -// @noErrors: 2451 -const roomName = "development-room"; -const peerName = `developer_1`; -``` - -### Pattern 3: Feature-specific room names - -```ts -// @noErrors: 2451 -const roomName = `screenshare-test-${Date.now()}`; -const roomName = `audio-only-test`; -const roomName = `livestream-demo`; -``` - -## Troubleshooting - -### Issue: Room not found errors - -**Problem**: Rooms might not persist between requests. - -**Solution**: Always create rooms fresh for each test session. - -### Issue: Connection failures - -**Problem**: Invalid Fishjam ID or network issues. - -**Solution**: - -1. Verify your Fishjam ID in the Fishjam Dashboard -2. Check network connectivity -3. Ensure you're using the sandbox environment - -## Security reminder - -:::danger -**The Sandbox API is not safe for production!** - -- No authentication required -- Anyone with your Fishjam ID can join rooms -- Identical room/peer names get the same tokens -- No rate limiting or abuse protection - -Only use the Sandbox API for development and testing. -::: - -## Resetting your app - -If you need to reset your Sandbox API: - -1. Go to [Fishjam Dashboard](https://fishjam.io/app/sandbox) -2. Click **Settings** -3. Click **Reset App** -4. Get your new Fishjam ID - -This will invalidate all existing tokens (including the management token!) and give you a fresh sandbox environment. - -## Next steps - -Once you've tested your integration with the Sandbox API: - -- [Set up your own backend](../../tutorials/backend-quick-start) -- [Learn more about the Sandbox API](../../explanation/sandbox-api-concept) -- [Understand security implications](../../explanation/security-tokens) - -For production deployment: - -- [How to set up a production server](../../how-to/backend/server-setup) -- [How to implement proper authentication](../../explanation/security-tokens) diff --git a/versioned_docs/version-0.20.0/how-to/features/whip-whep.mdx b/versioned_docs/version-0.20.0/how-to/features/whip-whep.mdx deleted file mode 100644 index d7de8b01..00000000 --- a/versioned_docs/version-0.20.0/how-to/features/whip-whep.mdx +++ /dev/null @@ -1,228 +0,0 @@ ---- -type: how-to -title: WHIP/WHEP with Fishjam ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -# Livestreaming using WHIP/WHEP - -:::tip -Make sure to read [Livestreaming with Fishjam](../../tutorials/livestreaming) before reading this guide. -This guide focuses on a low-level way to communicate with Fishjam. - -The majority of use-cases should prefer to use the methods described in [Livestreaming with Fishjam](../../tutorials/livestreaming). -::: - -If you've reading this guide, it is more than likely that you've already heard of **WHIP** (WebRTC HTTP Ingress Protocol) and **WHEP** (WebRTC HTTP Egress Protocol). -If not, then we recommend to read our [article about WHIP/WHEP](https://blog.swmansion.com/building-interactive-streaming-apps-webrtc-whip-whep-explained-d38f4825ec90). -In short, these are two protocols which standardize real-time livestreaming. -This prevents vendor lock-in and allows implementations and solutions to be reused in different scenarios. - -Fishjam supports both WHIP and WHEP, so you can choose how to publish and receive streams. -For example, you can use [OBS Studio](https://obsproject.com/) to publish a livestream with WHIP and then receive the stream using any public online WHEP player you like. - -## WHIP with Fishjam - -WHIP is the protocol used by streamers to start publishing. -To use WHIP you need two things: - -1. The URL of an HTTP endpoint implementing the WHIP specification. -2. A token, used by the endpoint to authorize the streamer. - -### Getting the URL - -Fishjam's WHIP endpoint is available at - -```sh -https://fishjam.io/api/v1/live/api/whip -``` - -You can paste this URL in your WHIP client of choice to start streaming. - -### Getting the token - -To authenticate a streamer, you need to first create a room of type `livestream` and a streamer token for that room. -You can read about this in detail in [Production Livestreaming with Server SDKs](../../tutorials/livestreaming#production-livestreaming-with-server-sdks), but the TL;DR is - - - - - ```ts - const fishjamId = ""; - const managementToken = ""; - - // ---cut--- - import { FishjamClient } from '@fishjam-cloud/js-server-sdk'; - - const fishjamClient = new FishjamClient({ - fishjamId, - managementToken, - }); - - const room = await fishjamClient.createRoom({ roomType: 'livestream' }); - const { token: streamerToken } = await fishjamClient.createLivestreamStreamerToken(room.id); // [!code highlight] - ``` - - - - - - ```python - from fishjam import FishjamClient - - fishjam_client = FishjamClient( - fishjam_id=fishjam_id, - management_token=management_token, - ); - - room = fishjam_client.create_room(room_type="livestream") - streamer_token = fishjam_client.create_livestream_streamer_token(room.id) # [!code highlight] - ``` - - - - -The created streamer token must be supplied in the HTTP headers of the WHIP request: - -```sh -POST https://fishjam.io/api/v1/live/api/whip -Authorization: Bearer [STREAMER-TOKEN] -``` - -## WHEP with Fishjam - -WHEP is the protocol used by viewers to start receiving a published livestream. -The usage of WHEP is very similar to WHIP, as you need the following: - -1. The URL of an HTTP endpoint implementing the WHEP specification. -2. **(Optional)** A token, used by the endpoint to authorize the viewer. - -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. -In this guide we demonstrate how to view each livestream type using WHEP directly. - -### Private livestreams - -#### Getting the URL - -For private livestreams, Fishjam's WHEP endpoint is available at - -```sh -https://fishjam.io/api/v1/live/api/whep -``` - -You can paste this URL in your WHEP client of choice to start viewing. - -#### Getting the token - -To authenticate a viewer, you need to create a viewer token for a room of `livestream` type. -You can read about this in detail in [Production Livestreaming with Server SDKs](../../tutorials/livestreaming#production-livestreaming-with-server-sdks), but the TL;DR is - - - - - ```ts - const fishjamId = ""; - const managementToken = ""; - - // ---cut--- - import { FishjamClient } from '@fishjam-cloud/js-server-sdk'; - - const fishjamClient = new FishjamClient({ - fishjamId, - managementToken, - }); - - const room = await fishjamClient.createRoom({ roomType: 'livestream', public: false }); - - // ... - - const { token: viewerToken } = await fishjamClient.createLivestreamViewerToken(room.id); // [!code highlight] - ``` - - - - - - ```python - from fishjam import FishjamClient - - fishjam_client = FishjamClient( - fishjam_id=fishjam_id, - management_token=management_token, - ); - - room = fishjam_client.create_room(room_type="livestream", public=False) - - # ... - - viewer_token = fishjam_client.create_livestream_viewer_token(room.id) # [!code highlight] - ``` - - - - -The created viewer token must be supplied in the HTTP headers of the WHEP request: - -```sh -POST https://fishjam.io/api/v1/live/api/whep -Authorization: Bearer [VIEWER-TOKEN] -``` - -### Public livestreams - -For public livestreams, you don't need a token, however you still need a room of `livestream` type with the `public` flag enabled. - - - - - ```ts - import { FishjamClient } from '@fishjam-cloud/js-server-sdk'; - - const fishjamId = ""; - const managementToken = ""; - const fishjamClient = new FishjamClient({ - fishjamId, - managementToken, - }); - - // ---cut--- - const room = await fishjamClient.createRoom({ roomType: 'livestream', public: true }); - // now you can use room.id to start viewing - ``` - - - - - - ```python - room = fishjam_client.create_room(room_type="livestream", public=True) - # now you can use room.id to start viewing - ``` - - - - -Once you have such a room, you can view a stream published to that room by supplying the following URL: - -```sh -http://fishjam.io/api/v1/live/api/whep/[ROOM-ID] -``` - -## See also - -More on livestreaming: - -- [Livestreaming tutorial](../../tutorials/livestreaming) -- [Private vs Public livestreams](../../explanation/public-livestreams) - -If livestreaming doesn't fit your use case: - -- [Room types explained](../../explanation/room-types) -- [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) diff --git a/versioned_docs/version-0.20.0/how-to/react-native/_category_.json b/versioned_docs/version-0.20.0/how-to/react-native/_category_.json deleted file mode 100644 index 1fd79841..00000000 --- a/versioned_docs/version-0.20.0/how-to/react-native/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "React Native", - "position": 1 -} diff --git a/versioned_docs/version-0.20.0/how-to/react-native/_components/configure-permissions.mdx b/versioned_docs/version-0.20.0/how-to/react-native/_components/configure-permissions.mdx deleted file mode 100644 index bd5debcc..00000000 --- a/versioned_docs/version-0.20.0/how-to/react-native/_components/configure-permissions.mdx +++ /dev/null @@ -1,91 +0,0 @@ -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -Your app needs to have permissions configured in order to use the microphone and camera. - -### Android - -Permissions below are required to stream audio and video with Fishjam on Android. - -- `android.permission.CAMERA` -- `android.permission.RECORD_AUDIO` -- `android.permission.MODIFY_AUDIO_SETTINGS` - - - - - -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" - ] - } - } -} -``` - - - - -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. -``` - - - diff --git a/versioned_docs/version-0.20.0/how-to/react-native/_components/install-package.mdx b/versioned_docs/version-0.20.0/how-to/react-native/_components/install-package.mdx deleted file mode 100644 index 356da871..00000000 --- a/versioned_docs/version-0.20.0/how-to/react-native/_components/install-package.mdx +++ /dev/null @@ -1,27 +0,0 @@ -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - - - - -```bash npm2yarn -npm install @fishjam-cloud/react-native-client -``` - - - - - -### Install Expo dependencies - -Follow instructions from official [Expo documentation](https://docs.expo.dev/bare/installing-expo-modules/). - -### Install Fishjam - - ```sh - npx expo install @fishjam-cloud/react-native-client - ``` - - - - diff --git a/versioned_docs/version-0.20.0/how-to/react-native/assets/ios-new-folder.png b/versioned_docs/version-0.20.0/how-to/react-native/assets/ios-new-folder.png deleted file mode 100644 index 59299cf3b7695602b3763788adb5a454409700a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32047 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 AVGGj(LY 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 ^s*jo-|E5s3ILkSXBn1;z#YkuKEuE*-=$p-Zmn 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 diff --git a/versioned_docs/version-0.20.0/how-to/react-native/assets/ios-new-target.png b/versioned_docs/version-0.20.0/how-to/react-native/assets/ios-new-target.png deleted file mode 100644 index 4ecff3584dff617acb4ed442c8732ddccc3eb87a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55333 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 diff --git a/versioned_docs/version-0.20.0/how-to/react-native/background-streaming.mdx b/versioned_docs/version-0.20.0/how-to/react-native/background-streaming.mdx deleted file mode 100644 index d51054e3..00000000 --- a/versioned_docs/version-0.20.0/how-to/react-native/background-streaming.mdx +++ /dev/null @@ -1,98 +0,0 @@ ---- -sidebar_position: 6 ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -# Streaming from background - -On Android, it is possible to continue streaming when app is in background. Unfortunately this functionality is not available on iOS (due to Apple limitations) - -Below is configuration required to make it work: - - - - - -You need to modify `app.json` file and add our plugin: - -```json -{ - "expo": { - ... - "plugins": { - ... - [ - "@fishjam-cloud/react-native-client", - { - "android": { - "enableForegroundService": true - } - } - ], - ... - } - } -} -``` - - - - -You need to modify `AndroidManifest.xml` file and add below service: - -```xml title='AndroidManifest.xml' - - ... - - ... - - - -``` - - - - -## Usage - - - - - -You can use [`useForegroundService`](../../api/mobile/variables/useForegroundService) hook to handle how foreground service behaves on Android. - -:::important[Permissions] - -If you want to use [`enableCamera`](../../api/mobile/type-aliases/ForegroundServiceConfig#enablecamera) or [`enableMicrophone`](../../api/mobile/type-aliases/ForegroundServiceConfig#enablemicrophone), -user must first grant permission for this resource. [`useForegroundService`](../../api/mobile/variables/useForegroundService) will check if permission is -granted and only then allow to start a service. - -::: - -```tsx -import { - useForegroundService, - useCamera, - useMicrophone, -} from "@fishjam-cloud/react-native-client"; - -const { isCameraOn } = useCamera(); -const { isMicrophoneOn } = useMicrophone(); - -useForegroundService({ - 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, -}); -``` - - - -This feature is unavailable on iOS. - - diff --git a/versioned_docs/version-0.20.0/how-to/react-native/connecting.mdx b/versioned_docs/version-0.20.0/how-to/react-native/connecting.mdx deleted file mode 100644 index 42c6388f..00000000 --- a/versioned_docs/version-0.20.0/how-to/react-native/connecting.mdx +++ /dev/null @@ -1,92 +0,0 @@ ---- -sidebar_position: 2 ---- - -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](../../how-to/features/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-native-client"; -const SANDBOX_FISHJAM_ID = "..."; -const roomName = "room"; -const peerName = "user"; -// ---cut--- - -// The `useSandbox` hook will work ONLY with the FISHJAM_ID of the Sandbox environment -const { getSandboxPeerToken } = useSandbox({ fishjamId: SANDBOX_FISHJAM_ID }); -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](../../how-to/backend/server-setup). - - - - -## Connecting - -In order to connect, call [`joinRoom`](../../api/mobile/functions/useConnection#joinroom) method with the `peerToken` and the fishjam ID: - -```tsx -import React, { useCallback } from "react"; -import { Button } from "react-native"; -import { useConnection, useSandbox } from "@fishjam-cloud/react-native-client"; - -// Check https://fishjam.io/app/ for your Fishjam ID -const FISHJAM_ID = "..."; - -export function JoinRoomButton() { - const { joinRoom } = useConnection(); // [!code highlight] - const { getSandboxPeerToken } = useSandbox({ fishjamId: FISHJAM_ID }); - - const onPressJoin = useCallback(async () => { - // in production environment, get the peerToken from your backend - const peerToken = await getSandboxPeerToken("Room", "User"); - - await joinRoom({ fishjamId: FISHJAM_ID, peerToken }); // [!code highlight] - }, [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.20.0/how-to/react/custom-sources.mdx b/versioned_docs/version-0.20.0/how-to/react/custom-sources.mdx deleted file mode 100644 index 14e7fde0..00000000 --- a/versioned_docs/version-0.20.0/how-to/react/custom-sources.mdx +++ /dev/null @@ -1,175 +0,0 @@ ---- -sidebar_position: 8 ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -# Custom sources - -:::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. - -::: - -This section demonstrates how to stream non-standard video or audio to other peers in your web app. -The utilities in this section allow you to integrate Fishjam with powerful browser APIs such as [WebGL](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API) and [WebGPU](https://developer.mozilla.org/en-US/docs/Web/API/WebGPU_API), -or higher level libraries, which leverage these APIs, such as [Three.js](https://threejs.org/), [Smelter](https://smelter.dev) or [PixiJS](https://pixijs.com/) - -## Creating a custom source - [`useCustomSource()`](../../api/web/functions/useCustomSource) - -To create a custom source, you only need to do two things: - -1. Call the `useCustomSource` hook. -2. Call the [`setStream`](../../api/web/functions/useCustomSource#setstream) callback provided by the `useCustomSource` hook with a [MediaStream](#how-to-get-a-mediastream-object) object. - -#### Usage Example - -```tsx -import React, { useEffect } from "react"; -import { useCustomSource } from "@fishjam-cloud/react-client"; - -const stream: MediaStream | null = null; // Replace with your MediaStream object -const { setStream } = useCustomSource("my-custom-source"); - -useEffect(() => { - setStream(stream); -}, [stream, setStream]); -``` - -### Using a created custom source - -Once you have called [`setStream`](../../api/web/functions/useCustomSource#setstream) for a given source ID (in the above example, `"my-custom-source"`), any subsequent calls to `useCustomSource` with the same ID will return the same state. -This enables multiple components to control and read a shared custom source. - -### Deleting a custom source - -If you wish to remove a custom source, then you should call the [`setStream`](../../api/web/functions/useCustomSource#setstream) callback with `null` as its argument. - -#### Usage Example - -```tsx -import { useCustomSource } from "@fishjam-cloud/react-client"; -// ---cut--- -const { setStream } = useCustomSource("my-custom-source"); -// ... -await setStream(null); -``` - -## How to get a MediaStream object? - -Depending on your use-case, the way you can obtain a [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream) will vary. -Below are some common examples of how to obtain one from an existing video or audio source. - -### Canvas - -If you have a `` HTML element, then you will need to call the [`captureStream`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/captureStream) method of the given canvas. -This is particularly useful if you are using [Three.js](https://threejs.org/) or [PixiJS](https://pixijs.com/) to render complex animations and more. - -#### Usage Example - -```tsx -import React, { useCallback, useState } from "react"; - -export function CanvasExample() { - const [canvasStream, setCanvasStream] = useState(); - - const streamFromCanvas = useCallback((canvas: HTMLCanvasElement | null) => { - if (!canvas) return; - setCanvasStream(canvas.captureStream()); - }, []); - - // use canvasStream as desired - - return ; -} -``` - -### Smelter - -If you are using [Smelter](https://smelter.dev), then all you need to do is register an output via [`registerOutput`](https://smelter.dev/ts-sdk/outputs/wasm-stream/). - -#### Usage Example - -:::tip - -If you want to see a full example React app which uses Fishjam with Smelter, then you can check out our [full example on GitHub](https://github.com/fishjam-cloud/web-client-sdk/tree/main/examples/react-client/minimal-smelter). - -::: - -```tsx -import React from "react"; -import Smelter, { setWasmBundleUrl } from "@swmansion/smelter-web-wasm"; -import { View } from "@swmansion/smelter"; - -setWasmBundleUrl("/assets/smelter.wasm"); - -async function run() { - const smelter = new Smelter({ framerate: 30 }); - const { stream } = await smelter.registerOutput("example-output", , { - type: "stream", - video: { - resolution: { width: 1920, height: 1080 }, - }, - }); - await smelter.init(); -} -``` - -### Video/Audio HTML tag - -If you have a `