{"id":28489628,"url":"https://github.com/cap-go/capacitor-streamcall","last_synced_at":"2026-04-13T09:01:38.913Z","repository":{"id":277446768,"uuid":"926573014","full_name":"Cap-go/capacitor-streamcall","owner":"Cap-go","description":"Capacitor plugin for streamcall SDK for capacitor","archived":false,"fork":false,"pushed_at":"2026-04-06T14:28:09.000Z","size":2631,"stargazers_count":10,"open_issues_count":4,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-06T16:23:24.607Z","etag":null,"topics":["capacitor","capacitor-plugin","plugin"],"latest_commit_sha":null,"homepage":"https://capgo.app","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Cap-go.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":"Cap-go","patreon":null,"open_collective":"capgo","ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2025-02-03T13:53:49.000Z","updated_at":"2026-04-06T11:17:48.000Z","dependencies_parsed_at":"2026-02-19T17:05:00.631Z","dependency_job_id":null,"html_url":"https://github.com/Cap-go/capacitor-streamcall","commit_stats":null,"previous_names":["cap-go/capacitor-streamcall","cap-go/streamcall"],"tags_count":187,"template":false,"template_full_name":null,"purl":"pkg:github/Cap-go/capacitor-streamcall","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cap-go%2Fcapacitor-streamcall","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cap-go%2Fcapacitor-streamcall/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cap-go%2Fcapacitor-streamcall/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cap-go%2Fcapacitor-streamcall/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Cap-go","download_url":"https://codeload.github.com/Cap-go/capacitor-streamcall/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cap-go%2Fcapacitor-streamcall/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31746113,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T06:26:45.479Z","status":"ssl_error","status_checked_at":"2026-04-13T06:26:44.645Z","response_time":93,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["capacitor","capacitor-plugin","plugin"],"created_at":"2025-06-08T06:37:16.605Z","updated_at":"2026-04-13T09:01:38.907Z","avatar_url":"https://github.com/Cap-go.png","language":"Kotlin","funding_links":["https://github.com/sponsors/Cap-go","https://opencollective.com/capgo"],"categories":[],"sub_categories":[],"readme":"# @capgo/capacitor-stream-call\n \u003ca href=\"https://capgo.app/\"\u003e\u003cimg src='https://raw.githubusercontent.com/Cap-go/capgo/main/assets/capgo_banner.png' alt='Capgo - Instant updates for capacitor'/\u003e\u003c/a\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ch2\u003e\u003ca href=\"https://capgo.app/?ref=plugin_streamcall\"\u003e ➡️ Get Instant updates for your App with Capgo\u003c/a\u003e\u003c/h2\u003e\n  \u003ch2\u003e\u003ca href=\"https://capgo.app/consulting/?ref=plugin_streamcall\"\u003e Missing a feature? We’ll build the plugin for you 💪\u003c/a\u003e\u003c/h2\u003e\n\u003c/div\u003e\n\nA Capacitor plugin that uses the [Stream Video SDK](https://getstream.io/) to enable video calling functionality in your app.\n\n## Documentation\n\nThe most complete doc is available here: https://capgo.app/docs/plugins/streamcall/\n\n## Compatibility\n\n| Plugin version | Capacitor compatibility | Maintained |\n| -------------- | ----------------------- | ---------- |\n| v8.\\*.\\*       | v8.\\*.\\*                | ✅          |\n| v7.\\*.\\*       | v7.\\*.\\*                | On demand   |\n| v6.\\*.\\*       | v6.\\*.\\*                | ❌          |\n| v5.\\*.\\*       | v5.\\*.\\*                | ❌          |\n\n\u003e **Note:** The major version of this plugin follows the major version of Capacitor. Use the version that matches your Capacitor installation (e.g., plugin v8 for Capacitor 8). Only the latest major version is actively maintained.\n\n## Installation\n\n```bash\nnpm install @capgo/capacitor-stream-call\nnpx cap sync\n```\n\n## Configuration\n\n### iOS Setup\n\n#### 1. API Key Configuration\nAdd your Stream Video API key to `ios/App/App/Info.plist`:\n\n```xml\n\u003cdict\u003e\n  \u003ckey\u003eCAPACITOR_STREAM_VIDEO_APIKEY\u003c/key\u003e\n  \u003cstring\u003eyour_api_key_here\u003c/string\u003e\n  \u003c!-- other keys --\u003e\n\u003c/dict\u003e\n```\n\n#### 2. Localization (Optional)\nTo support multiple languages:\n\n1. Add localization files to your Xcode project:\n   - `/App/App/en.lproj/Localizable.strings`\n   - `/App/App/en.lproj/Localizable.stringsdict`\n\n2. Add translations in `Localizable.strings`:\n```swift\n\"stream.video.call.incoming\" = \"Incoming call from %@\";\n\"stream.video.call.accept\" = \"Accept\";\n\"stream.video.call.reject\" = \"Reject\";\n\"stream.video.call.hangup\" = \"Hang up\";\n\"stream.video.call.joining\" = \"Joining...\";\n\"stream.video.call.reconnecting\" = \"Reconnecting...\";\n```\n\n3. Configure localization in your `AppDelegate.swift`:\n```swift\nimport StreamVideo\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -\u003e Bool {\n        Appearance.localizationProvider = { key, table in\n            Bundle.main.localizedString(forKey: key, value: nil, table: table)\n        }\n        return true\n    }\n}\n```\n\n### Android Setup\n\n#### 1. API Key Configuration\nAdd your Stream Video API key to `android/app/src/main/res/values/strings.xml`:\n\n```xml\n\u003cstring name=\"CAPACITOR_STREAM_VIDEO_APIKEY\"\u003eyour_api_key_here\u003c/string\u003e\n```\n\n#### 2. MainActivity Configuration\nModify your `MainActivity.java` to handle incoming calls:\n\n```java\n@Override\nprotected void onCreate(Bundle savedInstanceState) {\n  super.onCreate(savedInstanceState);\n  \n  // Enable activity to show over lock screen\n  if (android.os.Build.VERSION.SDK_INT \u003e= android.os.Build.VERSION_CODES.O_MR1) {\n    setShowWhenLocked(true);\n    setTurnScreenOn(true);\n  } else {\n    getWindow().addFlags(android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | android.view.WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);\n  }\n}\n```\n\n#### 3. Application Class Configuration\nCreate or modify your Application class to initialize the plugin:\n\n```java\nimport ee.forgr.capacitor.streamcall.StreamCallPlugin;\n\n@Override\npublic void onCreate() {\n  super.onCreate();\n  \n  // Initialize Firebase\n  com.google.firebase.FirebaseApp.initializeApp(this);\n  \n  // Pre-initialize StreamCall plugin\n  try {\n    StreamCallPlugin.preLoadInit(this, this);\n  } catch (Exception e) {\n    Log.e(\"App\", \"Failed to pre-initialize StreamVideo Plugin\", e);\n  }\n}\n```\n\n\u003e **Note:** If you don't have an Application class, you need to create one and reference it in your `AndroidManifest.xml` with `android:name=\".YourApplicationClass\"`.\n\n#### 4. Localization (Optional)\nAdd string resources for different languages:\n\n**Default (`values/strings.xml`):**\n```xml\n\u003cresources\u003e\n    \u003cstring name=\"stream_video_call_incoming\"\u003eIncoming call from %1$s\u003c/string\u003e\n    \u003cstring name=\"stream_video_call_accept\"\u003eAccept\u003c/string\u003e\n    \u003cstring name=\"stream_video_call_reject\"\u003eReject\u003c/string\u003e\n    \u003cstring name=\"stream_video_call_hangup\"\u003eHang up\u003c/string\u003e\n    \u003cstring name=\"stream_video_call_joining\"\u003eJoining...\u003c/string\u003e\n    \u003cstring name=\"stream_video_call_reconnecting\"\u003eReconnecting...\u003c/string\u003e\n\u003c/resources\u003e\n```\n\n**French (`values-fr/strings.xml`):**\n```xml\n\u003cresources\u003e\n    \u003cstring name=\"stream_video_call_incoming\"\u003eAppel entrant de %1$s\u003c/string\u003e\n    \u003cstring name=\"stream_video_call_accept\"\u003eAccepter\u003c/string\u003e\n    \u003cstring name=\"stream_video_call_reject\"\u003eRefuser\u003c/string\u003e\n    \u003cstring name=\"stream_video_call_hangup\"\u003eRaccrocher\u003c/string\u003e\n    \u003cstring name=\"stream_video_call_joining\"\u003eConnexion...\u003c/string\u003e\n    \u003cstring name=\"stream_video_call_reconnecting\"\u003eReconnexion...\u003c/string\u003e\n\u003c/resources\u003e\n```\n\n## Displaying Caller Information\n\nWhen receiving incoming calls, you can access caller information including name, user ID, and profile image. This information is automatically extracted from the call data and passed through the event system.\n\n### Getting Caller Information\n\nThe caller information is available in two ways:\n\n**1. Through Call Events**\n\nThe `callEvent` listener provides caller information for incoming calls:\n\n```typescript\nStreamCall.addListener('callEvent', (event) =\u003e {\n  if (event.state === 'ringing' \u0026\u0026 event.caller) {\n    console.log('Incoming call from:', event.caller.name || event.caller.userId);\n    console.log('Caller image:', event.caller.imageURL);\n    // Update your UI to show caller information\n    showIncomingCallUI(event.caller);\n  }\n});\n```\n\n**2. Through Incoming Call Events (Android lock-screen)**\n\nThe `incomingCall` listener also includes caller information:\n\n```typescript\nStreamCall.addListener('incomingCall', (payload) =\u003e {\n  if (payload.caller) {\n    console.log('Lock-screen call from:', payload.caller.name || payload.caller.userId);\n    // Update your lock-screen UI\n    updateLockScreenUI(payload.caller);\n  }\n});\n```\n\n### Caller Information Structure\n\n```typescript\ninterface CallMember {\n  userId: string;      // User ID (always present)\n  name?: string;       // Display name (optional)\n  imageURL?: string;   // Profile image URL (optional)\n  role?: string;       // User role (optional)\n}\n```\n\n### Example Implementation\n\nHere's how to implement a proper incoming call screen with caller information:\n\n```typescript\nexport class CallService {\n  private callerInfo: CallMember | null = null;\n\n  constructor() {\n    this.setupCallListeners();\n  }\n\n  private setupCallListeners() {\n    StreamCall.addListener('callEvent', (event) =\u003e {\n      if (event.state === 'ringing') {\n        this.callerInfo = event.caller || null;\n        this.showIncomingCallScreen();\n      } else if (event.state === 'joined' || event.state === 'left') {\n        this.callerInfo = null;\n        this.hideIncomingCallScreen();\n      }\n    });\n\n    // Android lock-screen support\n    if (Capacitor.getPlatform() === 'android') {\n      StreamCall.addListener('incomingCall', (payload) =\u003e {\n        this.callerInfo = payload.caller || null;\n        this.showLockScreenIncomingCall();\n      });\n    }\n  }\n\n  private showIncomingCallScreen() {\n    const callerName = this.callerInfo?.name || 'Unknown Caller';\n    const callerImage = this.callerInfo?.imageURL || 'default-avatar.png';\n    \n    // Update your UI components\n    document.getElementById('caller-name').textContent = callerName;\n    document.getElementById('caller-image').src = callerImage;\n    document.getElementById('incoming-call-screen').style.display = 'block';\n  }\n}\n```\n\n## API\n\n\u003cdocgen-index\u003e\n\n* [`login(...)`](#login)\n* [`logout()`](#logout)\n* [`call(...)`](#call)\n* [`endCall()`](#endcall)\n* [`joinCall(...)`](#joincall)\n* [`setMicrophoneEnabled(...)`](#setmicrophoneenabled)\n* [`setCameraEnabled(...)`](#setcameraenabled)\n* [`addListener('callEvent', ...)`](#addlistenercallevent-)\n* [`addListener('incomingCall', ...)`](#addlistenerincomingcall-)\n* [`removeAllListeners()`](#removealllisteners)\n* [`enableBluetooth()`](#enablebluetooth)\n* [`acceptCall()`](#acceptcall)\n* [`rejectCall()`](#rejectcall)\n* [`isCameraEnabled()`](#iscameraenabled)\n* [`getCallStatus()`](#getcallstatus)\n* [`getRingingCall()`](#getringingcall)\n* [`toggleViews()`](#toggleviews)\n* [`setSpeaker(...)`](#setspeaker)\n* [`switchCamera(...)`](#switchcamera)\n* [`getCallInfo(...)`](#getcallinfo)\n* [`setDynamicStreamVideoApikey(...)`](#setdynamicstreamvideoapikey)\n* [`getDynamicStreamVideoApikey()`](#getdynamicstreamvideoapikey)\n* [`getCurrentUser()`](#getcurrentuser)\n* [`getPluginVersion()`](#getpluginversion)\n* [Interfaces](#interfaces)\n* [Type Aliases](#type-aliases)\n* [Enums](#enums)\n\n\u003c/docgen-index\u003e\n\n\u003cdocgen-api\u003e\n\u003c!--Update the source file JSDoc comments and rerun docgen to update the docs below--\u003e\n\n### login(...)\n\n```typescript\nlogin(options: LoginOptions) =\u003e Promise\u003cSuccessResponse\u003e\n```\n\nLogin to Stream Video service\n\n| Param         | Type                                                  | Description           |\n| ------------- | ----------------------------------------------------- | --------------------- |\n| **`options`** | \u003ccode\u003e\u003ca href=\"#loginoptions\"\u003eLoginOptions\u003c/a\u003e\u003c/code\u003e | - Login configuration |\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;\u003ca href=\"#successresponse\"\u003eSuccessResponse\u003c/a\u003e\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### logout()\n\n```typescript\nlogout() =\u003e Promise\u003cSuccessResponse\u003e\n```\n\nLogout from Stream Video service\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;\u003ca href=\"#successresponse\"\u003eSuccessResponse\u003c/a\u003e\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### call(...)\n\n```typescript\ncall(options: CallOptions) =\u003e Promise\u003cSuccessResponse\u003e\n```\n\nInitiate a call to another user\n\n| Param         | Type                                                | Description          |\n| ------------- | --------------------------------------------------- | -------------------- |\n| **`options`** | \u003ccode\u003e\u003ca href=\"#calloptions\"\u003eCallOptions\u003c/a\u003e\u003c/code\u003e | - Call configuration |\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;\u003ca href=\"#successresponse\"\u003eSuccessResponse\u003c/a\u003e\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### endCall()\n\n```typescript\nendCall() =\u003e Promise\u003cSuccessResponse\u003e\n```\n\nEnd the current call\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;\u003ca href=\"#successresponse\"\u003eSuccessResponse\u003c/a\u003e\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### joinCall(...)\n\n```typescript\njoinCall(options: { callId: string; callType: string; }) =\u003e Promise\u003cSuccessResponse\u003e\n```\n\nJoin an existing call\n\n| Param         | Type                                               | Description        |\n| ------------- | -------------------------------------------------- | ------------------ |\n| **`options`** | \u003ccode\u003e{ callId: string; callType: string; }\u003c/code\u003e | - Microphone state |\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;\u003ca href=\"#successresponse\"\u003eSuccessResponse\u003c/a\u003e\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### setMicrophoneEnabled(...)\n\n```typescript\nsetMicrophoneEnabled(options: { enabled: boolean; }) =\u003e Promise\u003cSuccessResponse\u003e\n```\n\nEnable or disable microphone\n\n| Param         | Type                               | Description        |\n| ------------- | ---------------------------------- | ------------------ |\n| **`options`** | \u003ccode\u003e{ enabled: boolean; }\u003c/code\u003e | - Microphone state |\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;\u003ca href=\"#successresponse\"\u003eSuccessResponse\u003c/a\u003e\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### setCameraEnabled(...)\n\n```typescript\nsetCameraEnabled(options: { enabled: boolean; }) =\u003e Promise\u003cSuccessResponse\u003e\n```\n\nEnable or disable camera\n\n| Param         | Type                               | Description    |\n| ------------- | ---------------------------------- | -------------- |\n| **`options`** | \u003ccode\u003e{ enabled: boolean; }\u003c/code\u003e | - Camera state |\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;\u003ca href=\"#successresponse\"\u003eSuccessResponse\u003c/a\u003e\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### addListener('callEvent', ...)\n\n```typescript\naddListener(eventName: 'callEvent', listenerFunc: (event: CallEvent) =\u003e void) =\u003e Promise\u003c{ remove: () =\u003e Promise\u003cvoid\u003e; }\u003e\n```\n\nAdd listener for call events\n\n| Param              | Type                                                                | Description                       |\n| ------------------ | ------------------------------------------------------------------- | --------------------------------- |\n| **`eventName`**    | \u003ccode\u003e'callEvent'\u003c/code\u003e                                            | - Name of the event to listen for |\n| **`listenerFunc`** | \u003ccode\u003e(event: \u003ca href=\"#callevent\"\u003eCallEvent\u003c/a\u003e) =\u0026gt; void\u003c/code\u003e | - Callback function               |\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;{ remove: () =\u0026gt; Promise\u0026lt;void\u0026gt;; }\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### addListener('incomingCall', ...)\n\n```typescript\naddListener(eventName: 'incomingCall', listenerFunc: (event: IncomingCallPayload) =\u003e void) =\u003e Promise\u003c{ remove: () =\u003e Promise\u003cvoid\u003e; }\u003e\n```\n\nListen for lock-screen incoming call (Android only).\nFired when the app is shown by full-screen intent before user interaction.\n\n| Param              | Type                                                                                    |\n| ------------------ | --------------------------------------------------------------------------------------- |\n| **`eventName`**    | \u003ccode\u003e'incomingCall'\u003c/code\u003e                                                             |\n| **`listenerFunc`** | \u003ccode\u003e(event: \u003ca href=\"#incomingcallpayload\"\u003eIncomingCallPayload\u003c/a\u003e) =\u0026gt; void\u003c/code\u003e |\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;{ remove: () =\u0026gt; Promise\u0026lt;void\u0026gt;; }\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### removeAllListeners()\n\n```typescript\nremoveAllListeners() =\u003e Promise\u003cvoid\u003e\n```\n\nRemove all event listeners\n\n--------------------\n\n\n### enableBluetooth()\n\n```typescript\nenableBluetooth() =\u003e Promise\u003cSuccessResponse\u003e\n```\n\nEnable bluetooth audio\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;\u003ca href=\"#successresponse\"\u003eSuccessResponse\u003c/a\u003e\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### acceptCall()\n\n```typescript\nacceptCall() =\u003e Promise\u003cSuccessResponse\u003e\n```\n\nAccept an incoming call\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;\u003ca href=\"#successresponse\"\u003eSuccessResponse\u003c/a\u003e\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### rejectCall()\n\n```typescript\nrejectCall() =\u003e Promise\u003cSuccessResponse\u003e\n```\n\nReject an incoming call\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;\u003ca href=\"#successresponse\"\u003eSuccessResponse\u003c/a\u003e\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### isCameraEnabled()\n\n```typescript\nisCameraEnabled() =\u003e Promise\u003cCameraEnabledResponse\u003e\n```\n\nCheck if camera is enabled\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;\u003ca href=\"#cameraenabledresponse\"\u003eCameraEnabledResponse\u003c/a\u003e\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### getCallStatus()\n\n```typescript\ngetCallStatus() =\u003e Promise\u003cCallEvent\u003e\n```\n\nGet the current call status\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;\u003ca href=\"#callevent\"\u003eCallEvent\u003c/a\u003e\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### getRingingCall()\n\n```typescript\ngetRingingCall() =\u003e Promise\u003cCallEvent\u003e\n```\n\nGet the current ringing call\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;\u003ca href=\"#callevent\"\u003eCallEvent\u003c/a\u003e\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### toggleViews()\n\n```typescript\ntoggleViews() =\u003e Promise\u003c{ newLayout: StreamCallLayout; }\u003e\n```\n\nCycle through the available video layouts\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;{ newLayout: \u003ca href=\"#streamcalllayout\"\u003eStreamCallLayout\u003c/a\u003e; }\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### setSpeaker(...)\n\n```typescript\nsetSpeaker(options: { name: string; }) =\u003e Promise\u003cSuccessResponse\u003e\n```\n\nSet speakerphone on\n\n| Param         | Type                           | Description         |\n| ------------- | ------------------------------ | ------------------- |\n| **`options`** | \u003ccode\u003e{ name: string; }\u003c/code\u003e | - Speakerphone name |\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;\u003ca href=\"#successresponse\"\u003eSuccessResponse\u003c/a\u003e\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### switchCamera(...)\n\n```typescript\nswitchCamera(options: { camera: 'front' | 'back'; }) =\u003e Promise\u003cSuccessResponse\u003e\n```\n\nSwitch camera\n\n| Param         | Type                                        | Description           |\n| ------------- | ------------------------------------------- | --------------------- |\n| **`options`** | \u003ccode\u003e{ camera: 'front' \\| 'back'; }\u003c/code\u003e | - Camera to switch to |\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;\u003ca href=\"#successresponse\"\u003eSuccessResponse\u003c/a\u003e\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### getCallInfo(...)\n\n```typescript\ngetCallInfo(options: { callId: string; }) =\u003e Promise\u003cCallEvent\u003e\n```\n\nGet detailed information about an active call including caller details\n\n| Param         | Type                             | Description                      |\n| ------------- | -------------------------------- | -------------------------------- |\n| **`options`** | \u003ccode\u003e{ callId: string; }\u003c/code\u003e | - Options containing the call ID |\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;\u003ca href=\"#callevent\"\u003eCallEvent\u003c/a\u003e\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### setDynamicStreamVideoApikey(...)\n\n```typescript\nsetDynamicStreamVideoApikey(options: { apiKey: string; }) =\u003e Promise\u003cSuccessResponse\u003e\n```\n\nSet a dynamic Stream Video API key that overrides the static one\n\n| Param         | Type                             | Description          |\n| ------------- | -------------------------------- | -------------------- |\n| **`options`** | \u003ccode\u003e{ apiKey: string; }\u003c/code\u003e | - The API key to set |\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;\u003ca href=\"#successresponse\"\u003eSuccessResponse\u003c/a\u003e\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### getDynamicStreamVideoApikey()\n\n```typescript\ngetDynamicStreamVideoApikey() =\u003e Promise\u003cDynamicApiKeyResponse\u003e\n```\n\nGet the currently set dynamic Stream Video API key\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;\u003ca href=\"#dynamicapikeyresponse\"\u003eDynamicApiKeyResponse\u003c/a\u003e\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### getCurrentUser()\n\n```typescript\ngetCurrentUser() =\u003e Promise\u003cCurrentUserResponse\u003e\n```\n\nGet the current user's information\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;\u003ca href=\"#currentuserresponse\"\u003eCurrentUserResponse\u003c/a\u003e\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### getPluginVersion()\n\n```typescript\ngetPluginVersion() =\u003e Promise\u003c{ version: string; }\u003e\n```\n\nGet the native Capacitor plugin version\n\n**Returns:** \u003ccode\u003ePromise\u0026lt;{ version: string; }\u0026gt;\u003c/code\u003e\n\n--------------------\n\n\n### Interfaces\n\n\n#### SuccessResponse\n\n| Prop          | Type                 | Description                          |\n| ------------- | -------------------- | ------------------------------------ |\n| **`success`** | \u003ccode\u003eboolean\u003c/code\u003e | Whether the operation was successful |\n| **`callId`**  | \u003ccode\u003estring\u003c/code\u003e  |                                      |\n\n\n#### LoginOptions\n\n| Prop                          | Type                                                                        | Description                                             |\n| ----------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------- |\n| **`token`**                   | \u003ccode\u003estring\u003c/code\u003e                                                         | Stream Video API token                                  |\n| **`userId`**                  | \u003ccode\u003estring\u003c/code\u003e                                                         | User ID for the current user                            |\n| **`name`**                    | \u003ccode\u003estring\u003c/code\u003e                                                         | Display name for the current user                       |\n| **`imageURL`**                | \u003ccode\u003estring\u003c/code\u003e                                                         | Optional avatar URL for the current user                |\n| **`apiKey`**                  | \u003ccode\u003estring\u003c/code\u003e                                                         | Stream Video API key                                    |\n| **`magicDivId`**              | \u003ccode\u003estring\u003c/code\u003e                                                         | ID of the HTML element where the video will be rendered |\n| **`pushNotificationsConfig`** | \u003ccode\u003e\u003ca href=\"#pushnotificationsconfig\"\u003ePushNotificationsConfig\u003c/a\u003e\u003c/code\u003e |                                                         |\n\n\n#### PushNotificationsConfig\n\n| Prop                   | Type                |\n| ---------------------- | ------------------- |\n| **`pushProviderName`** | \u003ccode\u003estring\u003c/code\u003e |\n| **`voipProviderName`** | \u003ccode\u003estring\u003c/code\u003e |\n\n\n#### CallOptions\n\n| Prop          | Type                                                                                                                                                                                                                      | Description                                                     |\n| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------- |\n| **`userIds`** | \u003ccode\u003estring[]\u003c/code\u003e                                                                                                                                                                                                     | User ID of the person to call                                   |\n| **`type`**    | \u003ccode\u003e\u003ca href=\"#calltype\"\u003eCallType\u003c/a\u003e\u003c/code\u003e                                                                                                                                                                             | Type of call, defaults to 'default'                             |\n| **`ring`**    | \u003ccode\u003eboolean\u003c/code\u003e                                                                                                                                                                                                      | Whether to ring the other user, defaults to true                |\n| **`team`**    | \u003ccode\u003estring\u003c/code\u003e                                                                                                                                                                                                       | Team name to call                                               |\n| **`video`**   | \u003ccode\u003eboolean\u003c/code\u003e                                                                                                                                                                                                      | Whether to start the call with video enabled, defaults to false |\n| **`custom`**  | \u003ccode\u003e\u003ca href=\"#record\"\u003eRecord\u003c/a\u003e\u0026lt; string, \\| string \\| boolean \\| number \\| null \\| \u003ca href=\"#record\"\u003eRecord\u003c/a\u003e\u0026lt;string, string \\| boolean \\| number \\| null\u0026gt; \\| string[] \\| boolean[] \\| number[] \u0026gt;\u003c/code\u003e | Custom data to be passed to the call                            |\n\n\n#### CallEvent\n\n| Prop          | Type                                                                                                                                                                                                                      | Description                                                    |\n| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- |\n| **`callId`**  | \u003ccode\u003estring\u003c/code\u003e                                                                                                                                                                                                       | ID of the call                                                 |\n| **`state`**   | \u003ccode\u003e\u003ca href=\"#callstate\"\u003eCallState\u003c/a\u003e\u003c/code\u003e                                                                                                                                                                           | Current state of the call                                      |\n| **`userId`**  | \u003ccode\u003estring\u003c/code\u003e                                                                                                                                                                                                       | User ID of the participant in the call who triggered the event |\n| **`reason`**  | \u003ccode\u003estring\u003c/code\u003e                                                                                                                                                                                                       | Reason for the call state change, if applicable                |\n| **`caller`**  | \u003ccode\u003e\u003ca href=\"#callmember\"\u003eCallMember\u003c/a\u003e\u003c/code\u003e                                                                                                                                                                         | Information about the caller (for incoming calls)              |\n| **`members`** | \u003ccode\u003eCallMember[]\u003c/code\u003e                                                                                                                                                                                                 | List of call members                                           |\n| **`custom`**  | \u003ccode\u003e\u003ca href=\"#record\"\u003eRecord\u003c/a\u003e\u0026lt; string, \\| string \\| boolean \\| number \\| null \\| \u003ca href=\"#record\"\u003eRecord\u003c/a\u003e\u0026lt;string, string \\| boolean \\| number \\| null\u0026gt; \\| string[] \\| boolean[] \\| number[] \u0026gt;\u003c/code\u003e |                                                                |\n| **`count`**   | \u003ccode\u003enumber\u003c/code\u003e                                                                                                                                                                                                       |                                                                |\n\n\n#### CallState\n\n\u003ca href=\"#callstate\"\u003eCallState\u003c/a\u003e is the current state of the call\nas seen by an SFU.\n\n| Prop                   | Type                                                          | Description                                                                                                                                                                                                                                                                   |\n| ---------------------- | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **`participants`**     | \u003ccode\u003eParticipant[]\u003c/code\u003e                                    | participants is the list of participants in the call. In large calls, the list could be truncated in which case, the list of participants contains fewer participants than the counts returned in participant_count. Anonymous participants are **NOT** included in the list. |\n| **`startedAt`**        | \u003ccode\u003e\u003ca href=\"#timestamp\"\u003eTimestamp\u003c/a\u003e\u003c/code\u003e               | started_at is the time the call session actually started.                                                                                                                                                                                                                     |\n| **`participantCount`** | \u003ccode\u003e\u003ca href=\"#participantcount\"\u003eParticipantCount\u003c/a\u003e\u003c/code\u003e | participant_count contains the summary of the counts.                                                                                                                                                                                                                         |\n| **`pins`**             | \u003ccode\u003ePin[]\u003c/code\u003e                                            | the list of pins in the call. Pins are ordered in descending order (most important first).                                                                                                                                                                                    |\n\n\n#### Participant\n\nthose who are online in the call\n\n| Prop                    | Type                                                            | Description                   |\n| ----------------------- | --------------------------------------------------------------- | ----------------------------- |\n| **`userId`**            | \u003ccode\u003estring\u003c/code\u003e                                             |                               |\n| **`sessionId`**         | \u003ccode\u003estring\u003c/code\u003e                                             |                               |\n| **`publishedTracks`**   | \u003ccode\u003eTrackType[]\u003c/code\u003e                                        | map of track id to track type |\n| **`joinedAt`**          | \u003ccode\u003e\u003ca href=\"#timestamp\"\u003eTimestamp\u003c/a\u003e\u003c/code\u003e                 |                               |\n| **`trackLookupPrefix`** | \u003ccode\u003estring\u003c/code\u003e                                             |                               |\n| **`connectionQuality`** | \u003ccode\u003e\u003ca href=\"#connectionquality\"\u003eConnectionQuality\u003c/a\u003e\u003c/code\u003e |                               |\n| **`isSpeaking`**        | \u003ccode\u003eboolean\u003c/code\u003e                                            |                               |\n| **`isDominantSpeaker`** | \u003ccode\u003eboolean\u003c/code\u003e                                            |                               |\n| **`audioLevel`**        | \u003ccode\u003enumber\u003c/code\u003e                                             |                               |\n| **`name`**              | \u003ccode\u003estring\u003c/code\u003e                                             |                               |\n| **`image`**             | \u003ccode\u003estring\u003c/code\u003e                                             |                               |\n| **`custom`**            | \u003ccode\u003e\u003ca href=\"#struct\"\u003eStruct\u003c/a\u003e\u003c/code\u003e                       |                               |\n| **`roles`**             | \u003ccode\u003estring[]\u003c/code\u003e                                           |                               |\n\n\n#### Timestamp\n\nA \u003ca href=\"#timestamp\"\u003eTimestamp\u003c/a\u003e represents a point in time independent of any time zone or local\ncalendar, encoded as a count of seconds and fractions of seconds at\nnanosecond resolution. The count is relative to an epoch at UTC midnight on\nJanuary 1, 1970, in the proleptic Gregorian calendar which extends the\nGregorian calendar backwards to year one.\n\nAll minutes are 60 seconds long. Leap seconds are \"smeared\" so that no leap\nsecond table is needed for interpretation, using a [24-hour linear\nsmear](https://developers.google.com/time/smear).\n\nThe range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By\nrestricting to that range, we ensure that we can convert to and from [RFC\n3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.\n\n# Examples\n\nExample 1: Compute \u003ca href=\"#timestamp\"\u003eTimestamp\u003c/a\u003e from POSIX `time()`.\n\n    \u003ca href=\"#timestamp\"\u003eTimestamp\u003c/a\u003e timestamp;\n    timestamp.set_seconds(time(NULL));\n    timestamp.set_nanos(0);\n\nExample 2: Compute \u003ca href=\"#timestamp\"\u003eTimestamp\u003c/a\u003e from POSIX `gettimeofday()`.\n\n    struct timeval tv;\n    gettimeofday(\u0026tv, NULL);\n\n    \u003ca href=\"#timestamp\"\u003eTimestamp\u003c/a\u003e timestamp;\n    timestamp.set_seconds(tv.tv_sec);\n    timestamp.set_nanos(tv.tv_usec * 1000);\n\nExample 3: Compute \u003ca href=\"#timestamp\"\u003eTimestamp\u003c/a\u003e from Win32 `GetSystemTimeAsFileTime()`.\n\n    FILETIME ft;\n    GetSystemTimeAsFileTime(\u0026ft);\n    UINT64 ticks = (((UINT64)ft.dwHighDateTime) \u0026lt;\u0026lt; 32) | ft.dwLowDateTime;\n\n    // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z\n    // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.\n    \u003ca href=\"#timestamp\"\u003eTimestamp\u003c/a\u003e timestamp;\n    timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));\n    timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));\n\nExample 4: Compute \u003ca href=\"#timestamp\"\u003eTimestamp\u003c/a\u003e from Java `System.currentTimeMillis()`.\n\n    long millis = System.currentTimeMillis();\n\n    \u003ca href=\"#timestamp\"\u003eTimestamp\u003c/a\u003e timestamp = \u003ca href=\"#timestamp\"\u003eTimestamp\u003c/a\u003e.newBuilder().setSeconds(millis / 1000)\n        .setNanos((int) ((millis % 1000) * 1000000)).build();\n\n\nExample 5: Compute \u003ca href=\"#timestamp\"\u003eTimestamp\u003c/a\u003e from Java `Instant.now()`.\n\n    Instant now = Instant.now();\n\n    \u003ca href=\"#timestamp\"\u003eTimestamp\u003c/a\u003e timestamp =\n        \u003ca href=\"#timestamp\"\u003eTimestamp\u003c/a\u003e.newBuilder().setSeconds(now.getEpochSecond())\n            .setNanos(now.getNano()).build();\n\n\nExample 6: Compute \u003ca href=\"#timestamp\"\u003eTimestamp\u003c/a\u003e from current time in Python.\n\n    timestamp = \u003ca href=\"#timestamp\"\u003eTimestamp\u003c/a\u003e()\n    timestamp.GetCurrentTime()\n\n# JSON Mapping\n\nIn JSON format, the \u003ca href=\"#timestamp\"\u003eTimestamp\u003c/a\u003e type is encoded as a string in the\n[RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the\nformat is \"{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z\"\nwhere {year} is always expressed using four digits while {month}, {day},\n{hour}, {min}, and {sec} are zero-padded to two digits each. The fractional\nseconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),\nare optional. The \"Z\" suffix indicates the timezone (\"UTC\"); the timezone\nis required. A proto3 JSON serializer should always use UTC (as indicated by\n\"Z\") when printing the \u003ca href=\"#timestamp\"\u003eTimestamp\u003c/a\u003e type and a proto3 JSON parser should be\nable to accept both UTC and other timezones (as indicated by an offset).\n\nFor example, \"2017-01-15T01:30:15.01Z\" encodes 15.01 seconds past\n01:30 UTC on January 15, 2017.\n\nIn JavaScript, one can convert a Date object to this format using the\nstandard\n[toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)\nmethod. In Python, a standard `datetime.datetime` object can be converted\nto this format using\n[`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with\nthe time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use\nthe Joda Time's [`ISODateTimeFormat.dateTime()`](\nhttp://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime%2D%2D\n) to obtain a formatter capable of generating timestamps in this format.\n\n| Prop          | Type                | Description                                                                                                                                                                                                       |\n| ------------- | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **`seconds`** | \u003ccode\u003estring\u003c/code\u003e | Represents seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive.                                                                        |\n| **`nanos`**   | \u003ccode\u003enumber\u003c/code\u003e | Non-negative fractions of a second at nanosecond resolution. Negative second values with fractions must still have non-negative nanos values that count forward in time. Must be from 0 to 999,999,999 inclusive. |\n\n\n#### Struct\n\n\u003ca href=\"#struct\"\u003e`Struct`\u003c/a\u003e represents a structured data value, consisting of fields\nwhich map to dynamically typed values. In some languages, `Struct`\nmight be supported by a native representation. For example, in\nscripting languages like JS a struct is represented as an\nobject. The details of that representation are described together\nwith the proto support for the language.\n\nThe JSON representation for \u003ca href=\"#struct\"\u003e`Struct`\u003c/a\u003e is JSON object.\n\n| Prop         | Type                                                        | Description                                |\n| ------------ | ----------------------------------------------------------- | ------------------------------------------ |\n| **`fields`** | \u003ccode\u003e{ [key: string]: \u003ca href=\"#value\"\u003eValue\u003c/a\u003e; }\u003c/code\u003e | Unordered map of dynamically typed values. |\n\n\n#### Value\n\n\u003ca href=\"#value\"\u003e`Value`\u003c/a\u003e represents a dynamically typed value which can be either\nnull, a number, a string, a boolean, a recursive struct value, or a\nlist of values. A producer of value is expected to set one of these\nvariants. Absence of any variant indicates an error.\n\nThe JSON representation for \u003ca href=\"#value\"\u003e`Value`\u003c/a\u003e is JSON value.\n\n| Prop       | Type                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **`kind`** | \u003ccode\u003e{ oneofKind: 'nullValue'; nullValue: \u003ca href=\"#nullvalue\"\u003eNullValue\u003c/a\u003e; } \\| { oneofKind: 'numberValue'; numberValue: number; } \\| { oneofKind: 'stringValue'; stringValue: string; } \\| { oneofKind: 'boolValue'; boolValue: boolean; } \\| { oneofKind: 'structValue'; structValue: \u003ca href=\"#struct\"\u003eStruct\u003c/a\u003e; } \\| { oneofKind: 'listValue'; listValue: \u003ca href=\"#listvalue\"\u003eListValue\u003c/a\u003e; } \\| { oneofKind: undefined; }\u003c/code\u003e |\n\n\n#### ListValue\n\n\u003ca href=\"#listvalue\"\u003e`ListValue`\u003c/a\u003e is a wrapper around a repeated field of values.\n\nThe JSON representation for \u003ca href=\"#listvalue\"\u003e`ListValue`\u003c/a\u003e is JSON array.\n\n| Prop         | Type                 | Description                                 |\n| ------------ | -------------------- | ------------------------------------------- |\n| **`values`** | \u003ccode\u003eValue[]\u003c/code\u003e | Repeated field of dynamically typed values. |\n\n\n#### ParticipantCount\n\n| Prop            | Type                | Description                                                                    |\n| --------------- | ------------------- | ------------------------------------------------------------------------------ |\n| **`total`**     | \u003ccode\u003enumber\u003c/code\u003e | Total number of participants in the call including the anonymous participants. |\n| **`anonymous`** | \u003ccode\u003enumber\u003c/code\u003e | Total number of anonymous participants in the call.                            |\n\n\n#### Pin\n\n| Prop            | Type                | Description                                                         |\n| --------------- | ------------------- | ------------------------------------------------------------------- |\n| **`userId`**    | \u003ccode\u003estring\u003c/code\u003e | the user to pin                                                     |\n| **`sessionId`** | \u003ccode\u003estring\u003c/code\u003e | the user sesion_id to pin, if not provided, applies to all sessions |\n\n\n#### CallMember\n\n| Prop           | Type                | Description                   |\n| -------------- | ------------------- | ----------------------------- |\n| **`userId`**   | \u003ccode\u003estring\u003c/code\u003e | User ID of the member         |\n| **`name`**     | \u003ccode\u003estring\u003c/code\u003e | Display name of the user      |\n| **`imageURL`** | \u003ccode\u003estring\u003c/code\u003e | Profile image URL of the user |\n| **`role`**     | \u003ccode\u003estring\u003c/code\u003e | Role of the user in the call  |\n\n\n#### IncomingCallPayload\n\n| Prop         | Type                                                                                                                                                                                                                      | Description                              |\n| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------- |\n| **`cid`**    | \u003ccode\u003estring\u003c/code\u003e                                                                                                                                                                                                       | Full call CID (e.g. default:123)         |\n| **`type`**   | \u003ccode\u003e'incoming'\u003c/code\u003e                                                                                                                                                                                                   | Event type (currently always \"incoming\") |\n| **`caller`** | \u003ccode\u003e\u003ca href=\"#callmember\"\u003eCallMember\u003c/a\u003e\u003c/code\u003e                                                                                                                                                                         | Information about the caller             |\n| **`custom`** | \u003ccode\u003e\u003ca href=\"#record\"\u003eRecord\u003c/a\u003e\u0026lt; string, \\| string \\| boolean \\| number \\| null \\| \u003ca href=\"#record\"\u003eRecord\u003c/a\u003e\u0026lt;string, string \\| boolean \\| number \\| null\u0026gt; \\| string[] \\| boolean[] \\| number[] \u0026gt;\u003c/code\u003e | Custom data to be passed to the call     |\n\n| Method               | Signature                                    | Description                             |\n| -------------------- | -------------------------------------------- | --------------------------------------- |\n| **getPluginVersion** | () =\u0026gt; Promise\u0026lt;{ version: string; }\u0026gt; | Get the native Capacitor plugin version |\n\n\n#### CameraEnabledResponse\n\n| Prop          | Type                 |\n| ------------- | -------------------- |\n| **`enabled`** | \u003ccode\u003eboolean\u003c/code\u003e |\n\n\n#### DynamicApiKeyResponse\n\n| Prop                | Type                        | Description                             |\n| ------------------- | --------------------------- | --------------------------------------- |\n| **`apiKey`**        | \u003ccode\u003estring \\| null\u003c/code\u003e | The dynamic API key if set, null if not |\n| **`hasDynamicKey`** | \u003ccode\u003eboolean\u003c/code\u003e        | Whether a dynamic key is currently set  |\n\n\n#### CurrentUserResponse\n\n| Prop             | Type                 | Description                             |\n| ---------------- | -------------------- | --------------------------------------- |\n| **`userId`**     | \u003ccode\u003estring\u003c/code\u003e  | User ID of the current user             |\n| **`name`**       | \u003ccode\u003estring\u003c/code\u003e  | Display name of the current user        |\n| **`imageURL`**   | \u003ccode\u003estring\u003c/code\u003e  | Avatar URL of the current user          |\n| **`isLoggedIn`** | \u003ccode\u003eboolean\u003c/code\u003e | Whether the user is currently logged in |\n\n\n### Type Aliases\n\n\n#### CallType\n\n\u003ccode\u003e'default' | 'audio' | 'audio_room' | 'livestream' | 'development'\u003c/code\u003e\n\n\n#### Record\n\nConstruct a type with a set of properties K of type T\n\n\u003ccode\u003e{\r [P in K]: T;\r }\u003c/code\u003e\n\n\n#### CallState\n\n\u003ccode\u003e'idle' | 'ringing' | 'joining' | 'reconnecting' | 'joined' | 'leaving' | 'left' | 'created' | 'session_started' | 'rejected' | 'participant_counts' | 'missed' | 'accepted' | 'ended' | 'camera_enabled' | 'camera_disabled' | 'speaker_enabled' | 'speaker_disabled' | 'microphone_enabled' | 'microphone_disabled' | 'outgoing_call_ended' | 'unknown'\u003c/code\u003e\n\n\n#### StreamCallLayout\n\n\u003ccode\u003e'grid' | 'spotlight' | 'dynamic' | 'fullScreen' | 'fullscreen'\u003c/code\u003e\n\n\n### Enums\n\n\n#### TrackType\n\n| Members                  | Value          |\n| ------------------------ | -------------- |\n| **`UNSPECIFIED`**        | \u003ccode\u003e0\u003c/code\u003e |\n| **`AUDIO`**              | \u003ccode\u003e1\u003c/code\u003e |\n| **`VIDEO`**              | \u003ccode\u003e2\u003c/code\u003e |\n| **`SCREEN_SHARE`**       | \u003ccode\u003e3\u003c/code\u003e |\n| **`SCREEN_SHARE_AUDIO`** | \u003ccode\u003e4\u003c/code\u003e |\n\n\n#### ConnectionQuality\n\n| Members           | Value          |\n| ----------------- | -------------- |\n| **`UNSPECIFIED`** | \u003ccode\u003e0\u003c/code\u003e |\n| **`POOR`**        | \u003ccode\u003e1\u003c/code\u003e |\n| **`GOOD`**        | \u003ccode\u003e2\u003c/code\u003e |\n| **`EXCELLENT`**   | \u003ccode\u003e3\u003c/code\u003e |\n\n\n#### NullValue\n\n| Members          | Value          | Description |\n| ---------------- | -------------- | ----------- |\n| **`NULL_VALUE`** | \u003ccode\u003e0\u003c/code\u003e | Null value. |\n\n\u003c/docgen-api\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcap-go%2Fcapacitor-streamcall","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcap-go%2Fcapacitor-streamcall","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcap-go%2Fcapacitor-streamcall/lists"}