Skip to content

[FCE-3631] Documentation for VoIP feature - #279

Open
Magmusacy wants to merge 12 commits into
mainfrom
FCE-3631
Open

[FCE-3631] Documentation for VoIP feature#279
Magmusacy wants to merge 12 commits into
mainfrom
FCE-3631

Conversation

@Magmusacy

@Magmusacy Magmusacy commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Description

Adds a how-to guide for the React Native SDK's VoIP feature: docs/how-to/client/voip-calls.mdx.

The page covers the full app side: native setup (Expo / Bare tabs), the VoipProvider contract (join the room on connecting, reportConnected() when media is live), incoming push payload, outgoing calls, ending calls and lastEndedReason, hold/mute, and Recents redial. All snippets type-check against the bumped web-client-sdk submodule.

Supporting changes: sidebar positions + a cross-link from Background streaming, a twoslash error-handling tweak in docusaurus.config.ts, spelling entries, submodule bumps.

Note: links to the voip-call example 404 until the SDK-side PR merges.

@linear

linear Bot commented Jul 24, 2026

Copy link
Copy Markdown

FCE-3631

@Magmusacy Magmusacy changed the title Voip feature docs v1 [FCE-3439] - Documentation for VoIP feature Jul 24, 2026
@Magmusacy Magmusacy changed the title [FCE-3439] - Documentation for VoIP feature [FCE-3631] - Documentation for VoIP feature Jul 24, 2026
@Magmusacy Magmusacy changed the title [FCE-3631] - Documentation for VoIP feature [FCE-3631] Documentation for VoIP feature Jul 24, 2026
@Magmusacy
Magmusacy requested a review from Copilot July 24, 2026 14:12

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new “VoIP calls” how-to guide for the React Native (mobile) SDK, covering PushKit/APNs on iOS and FCM/Telecom on Android, and updates navigation/supporting docs to incorporate the new page.

Changes:

  • Introduces a comprehensive VoIP calls guide under docs/how-to/client/.
  • Adjusts sidebar ordering (sidebar_position) across nearby client how-to pages to make room for the new guide.
  • Updates spellchecker allowlist to include VoIP/CallKit/PushKit/Telecom/APNs/FCM and related terms.

Reviewed changes

Copilot reviewed 13 out of 13 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
spelling.txt Adds VoIP-related proper nouns/terms to the spellchecker allowlist.
docusaurus.config.ts Tweaks Shiki/Twoslash error filtering helper used during MDX rendering.
docs/how-to/client/voip-calls.mdx New VoIP calls documentation page for React Native apps (iOS/Android).
docs/how-to/client/text-chat.mdx Updates sidebar ordering to accommodate the new VoIP page.
docs/how-to/client/simulcast.mdx Updates sidebar ordering to accommodate the new VoIP page.
docs/how-to/client/migration-guide.mdx Updates sidebar ordering to accommodate the new VoIP page.
docs/how-to/client/ios-simulator-camera.mdx Updates sidebar ordering to accommodate the new VoIP page.
docs/how-to/client/background-streaming.mdx Adds a “See also” link pointing readers to the new VoIP calls guide.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread docusaurus.config.ts Outdated
Comment thread docs/how-to/client/voip-calls.mdx Outdated
Comment thread docs/how-to/client/voip-calls.mdx Outdated
@Magmusacy
Magmusacy marked this pull request as ready for review July 24, 2026 14:31
@Magmusacy
Magmusacy requested a review from czerwiukk July 27, 2026 09:28
Magmusacy added a commit to fishjam-cloud/web-client-sdk that referenced this pull request Jul 29, 2026
## Description

Adds VoIP calling to the Fishjam React Native SDK. Calls ring through
the native call UI —
CallKit on iOS, Core Telecom on Android — even when the app is
backgrounded or killed, and the
media runs over a regular Fishjam room.

**SDK — `@fishjam-cloud/react-native-client`**

- `VoIPProvider` + `useVoIP()`: a call state machine (`available →
incoming | connecting → active`)
driven by native call events. The SDK owns the CallKit/Telecom session,
the VoIP push token, and
hold/mute/end-reason state; joining the room, peer tokens and media stay
in the app, which reacts
to `status` and reports back with `reportConnected()` /
`reportConnectFailed()`.
- Also re-exports the lower-level primitives from the WebRTC fork
(`useVoIPEvents`, `useTelecom`,
`fulfillIncomingCallConnected`, …) for apps that want to drive the
native layer themselves.
- Config plugin: new `android.enableVoIP`, FCM coexistence options
(`voipMessagingService`,
`voipFallbackMessagingService`) and a `voip` block for the native call
timeouts and notification
icon. On Android it injects the manifest entries
(`IncomingCallActivity`,
`EndCallNotificationReceiver`, `PushNotificationService` + FCM intent
filter), the required
permissions and the foreground service. On iOS it writes
`FishjamVoIPEnabled`, the timeout
`Info.plist` keys and the `INStartCallIntent` activity types needed for
Recents redial.

**New package — `@fishjam-cloud/ios-expo-voip`**

An `ExpoAppDelegateSubscriber` with no JS and no VoIP logic of its own.
It starts the PushKit
registry at launch so a push arriving before the JS bundle loads can
still ring, and routes
Siri / Phone-app Recents intents into the SDK. It is a no-op unless the
config plugin enabled VoIP.
Added to the release workflow (published after the WebRTC fork, which
its pod depends on) and to
`bump-version.sh`; excluded from typedoc.

**Example — `examples/mobile-client/voip-call`**

A two-user calling app: an Expo client plus a small Deno push +
signaling server
(`/register`, `/users`, `/call`, `/ws`) that sends the APNs/FCM pushes.
It exercises the whole
surface — device registration, ringing while killed, hold & accept, and
Recents redial.

## Motivation and Context

Fishjam could already carry the media for a call, but not the call
itself. To build one-to-one
calling on top of it, an app had to write its own CallKit and Core
Telecom integration, VoIP push
handling, cold-start wake-up and answer-fulfillment handshake before it
could join a room — a large
amount of platform-specific native work, duplicated by every consumer.

This moves that layer into the SDK. The app keeps what is genuinely its
own (rooms, peer tokens,
media, signaling between users) and reacts to a single `status` value,
while the SDK owns the native
call session on both platforms.

## Documentation impact

- [ ] Documentation update required
- [x] Documentation updated [in another
PR](fishjam-cloud/documentation#279)
- [ ] No documentation update required

## Types of changes

- [ ] Bug fix (non-breaking change which fixes an issue)
- [x] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to
      not work as expected)

---------

Co-authored-by: Miłosz Filimowski <MiloszFilimowski@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants