@cometchat/skills 4.4.2 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +55 -0
- package/.claude-plugin/plugin.json +14 -0
- package/CHANGELOG.md +44 -0
- package/LICENSE +21 -0
- package/MIGRATING.md +187 -0
- package/README.md +52 -156
- package/RULES.md +125 -0
- package/bin/cometchat-skills.mjs +1280 -0
- package/bin/legacy-skills.json +95 -0
- package/catalogs/android-v6.json +1646 -0
- package/catalogs/flutter-v6.json +651 -0
- package/catalogs/ios-v5.json +1383 -0
- package/catalogs/rn-calls-v5.json +134 -0
- package/catalogs/rn-calls-v5.symbols.txt +58 -0
- package/catalogs/rn-sdk-v4.json +672 -0
- package/catalogs/rn-v5.json +449 -0
- package/catalogs/rn-v5.symbols.txt +216 -0
- package/catalogs/sdk-android-v5.json +514 -0
- package/contracts.android-calls-v5.json +122 -0
- package/contracts.android-v6.json +135 -0
- package/contracts.angular-v5.json +694 -0
- package/contracts.flutter-calls-v5.json +77 -0
- package/contracts.flutter-v6.json +126 -0
- package/contracts.ios-calls-v5.json +67 -0
- package/contracts.ios-v5.json +436 -0
- package/contracts.json +82 -0
- package/contracts.rn-calls-v5.json +77 -0
- package/contracts.rn-v5.json +727 -0
- package/contracts.sdk-android-v5.json +15 -0
- package/contracts.web-calls-v5.json +45 -0
- package/features.android-calls-v5.json +246 -0
- package/features.android-v6.json +65 -0
- package/features.angular-v5.json +521 -0
- package/features.flutter-calls-v5.json +286 -0
- package/features.flutter-v6.json +484 -0
- package/features.ios-calls-v5.json +236 -0
- package/features.ios-v5.json +573 -0
- package/features.json +61 -0
- package/features.rn-calls-v5.json +187 -0
- package/features.rn-v5.json +614 -0
- package/features.sdk-android-v5.json +40 -0
- package/features.sdk-jsv4.json +24 -0
- package/features.web-calls-v5.json +108 -0
- package/package.json +156 -74
- package/peers.yaml +355 -0
- package/registry/README.md +31 -0
- package/registry/android-calls-v5.json +94 -0
- package/registry/android-v6.json +177 -0
- package/registry/angular-v5.json +154 -0
- package/registry/flutter-calls-v5.json +94 -0
- package/registry/flutter-v6.json +159 -0
- package/registry/ios-calls-v5.json +99 -0
- package/registry/ios-v5.json +152 -0
- package/registry/rn-calls-v5.json +99 -0
- package/registry/rn-v5.json +169 -0
- package/registry/sdk-android-v5.json +93 -0
- package/registry/sdk-jsv4.json +93 -0
- package/registry/web-calls-v5.json +94 -0
- package/registry/web-v7.json +154 -0
- package/skills/cometchat/SKILL.md +47 -2096
- package/skills/cometchat-a11y/SKILL.md +44 -472
- package/skills/cometchat-analytics/SKILL.md +61 -0
- package/skills/cometchat-android-v5-calls-sdk/SKILL.md +206 -0
- package/skills/cometchat-android-v5-calls-sdk/references/build-truth.md +63 -0
- package/skills/cometchat-android-v5-calls-sdk/references/docs-map.md +119 -0
- package/skills/cometchat-android-v5-calls-sdk/references/method-map.md +53 -0
- package/skills/cometchat-android-v5-calls-sdk/references/pitfalls.md +72 -0
- package/skills/cometchat-android-v5-calls-sdk/references/ringing.md +92 -0
- package/skills/cometchat-android-v5-calls-sdk/references/user-switch.md +90 -0
- package/skills/cometchat-android-v5-sdk/SKILL.md +127 -0
- package/skills/cometchat-android-v5-sdk/references/app-surface.md +88 -0
- package/skills/cometchat-android-v5-sdk/references/docs-map.md +91 -0
- package/skills/cometchat-android-v6-builder-settings/SKILL.md +51 -137
- package/skills/cometchat-android-v6-calls/SKILL.md +128 -413
- package/skills/cometchat-android-v6-compose-components/SKILL.md +84 -194
- package/skills/cometchat-android-v6-compose-customization/SKILL.md +66 -411
- package/skills/cometchat-android-v6-compose-placement/SKILL.md +154 -237
- package/skills/cometchat-android-v6-core/SKILL.md +236 -672
- package/skills/cometchat-android-v6-core/references/anti-patterns.md +31 -0
- package/skills/cometchat-android-v6-core/references/component-props.md +168 -0
- package/skills/cometchat-android-v6-core/references/docs-map.md +153 -0
- package/skills/cometchat-android-v6-core/references/layout.md +112 -0
- package/skills/cometchat-android-v6-core/references/lifecycle.md +75 -0
- package/skills/cometchat-android-v6-core/references/setup-credentials.md +105 -0
- package/skills/cometchat-android-v6-core/references/troubleshooting.md +36 -0
- package/skills/cometchat-android-v6-events/SKILL.md +46 -184
- package/skills/cometchat-android-v6-extensions/SKILL.md +39 -179
- package/skills/cometchat-android-v6-features/SKILL.md +74 -143
- package/skills/cometchat-android-v6-kotlin-components/SKILL.md +75 -193
- package/skills/cometchat-android-v6-kotlin-customization/SKILL.md +67 -419
- package/skills/cometchat-android-v6-kotlin-placement/SKILL.md +77 -223
- package/skills/cometchat-android-v6-migration/SKILL.md +67 -378
- package/skills/cometchat-android-v6-production/SKILL.md +41 -179
- package/skills/cometchat-android-v6-push/SKILL.md +39 -289
- package/skills/cometchat-android-v6-testing/SKILL.md +50 -265
- package/skills/cometchat-android-v6-troubleshooting/SKILL.md +70 -254
- package/skills/cometchat-angular-v5-calls/SKILL.md +193 -0
- package/skills/cometchat-angular-v5-components/SKILL.md +131 -0
- package/skills/cometchat-angular-v5-components/references/catalog.md +111 -0
- package/skills/cometchat-angular-v5-components/references/host-composed.md +46 -0
- package/skills/cometchat-angular-v5-core/SKILL.md +300 -0
- package/skills/cometchat-angular-v5-core/references/anti-patterns.md +49 -0
- package/skills/cometchat-angular-v5-core/references/component-props.md +55 -0
- package/skills/cometchat-angular-v5-core/references/dependencies.md +66 -0
- package/skills/cometchat-angular-v5-core/references/docs-map.md +132 -0
- package/skills/cometchat-angular-v5-core/references/layout.md +64 -0
- package/skills/cometchat-angular-v5-core/references/lifecycle.md +202 -0
- package/skills/cometchat-angular-v5-core/references/setup-credentials.md +137 -0
- package/skills/cometchat-angular-v5-core/references/theming.md +70 -0
- package/skills/cometchat-angular-v5-core/references/troubleshooting.md +27 -0
- package/skills/cometchat-angular-v5-customization/SKILL.md +94 -0
- package/skills/cometchat-angular-v5-features/SKILL.md +107 -0
- package/skills/cometchat-angular-v5-features/references/custom-messages.md +133 -0
- package/skills/cometchat-angular-v5-features/references/formatters.md +28 -0
- package/skills/cometchat-angular-v5-features/references/host-composed-extensions.md +85 -0
- package/skills/cometchat-angular-v5-migration/SKILL.md +40 -0
- package/skills/cometchat-angular-v5-migration/references/migration-guide.md +165 -0
- package/skills/cometchat-angular-v5-patterns/SKILL.md +107 -0
- package/skills/cometchat-angular-v5-placement/SKILL.md +133 -0
- package/skills/cometchat-angular-v5-placement/references/combined-app.md +174 -0
- package/skills/cometchat-angular-v5-placement/references/core-surface.md +199 -0
- package/skills/cometchat-angular-v5-production/SKILL.md +102 -0
- package/skills/cometchat-angular-v5-push/SKILL.md +61 -0
- package/skills/cometchat-angular-v5-testing/SKILL.md +112 -0
- package/skills/cometchat-angular-v5-troubleshooting/SKILL.md +96 -0
- package/skills/cometchat-audit/SKILL.md +61 -0
- package/skills/cometchat-compliance/SKILL.md +63 -0
- package/skills/cometchat-flutter-v5-sdk/SKILL.md +188 -0
- package/skills/cometchat-flutter-v5-sdk/references/doc-corrections.md +55 -0
- package/skills/cometchat-flutter-v5-sdk/references/docs-map.md +211 -0
- package/skills/cometchat-flutter-v5-sdk/references/platform-notes.md +48 -0
- package/skills/cometchat-flutter-v5-sdk/references/transcription.md +87 -0
- package/skills/cometchat-flutter-v6-calls/SKILL.md +75 -389
- package/skills/cometchat-flutter-v6-components/SKILL.md +88 -361
- package/skills/cometchat-flutter-v6-core/SKILL.md +154 -593
- package/skills/cometchat-flutter-v6-core/references/anti-patterns.md +55 -0
- package/skills/cometchat-flutter-v6-core/references/docs-map.md +143 -0
- package/skills/cometchat-flutter-v6-core/references/layout.md +45 -0
- package/skills/cometchat-flutter-v6-core/references/lifecycle.md +87 -0
- package/skills/cometchat-flutter-v6-core/references/setup-credentials.md +84 -0
- package/skills/cometchat-flutter-v6-core/references/troubleshooting.md +26 -0
- package/skills/cometchat-flutter-v6-customization/SKILL.md +70 -712
- package/skills/cometchat-flutter-v6-events/SKILL.md +79 -174
- package/skills/cometchat-flutter-v6-features/SKILL.md +55 -394
- package/skills/cometchat-flutter-v6-migration/SKILL.md +68 -367
- package/skills/cometchat-flutter-v6-migration/references/migration-guide.md +132 -0
- package/skills/cometchat-flutter-v6-patterns/SKILL.md +61 -0
- package/skills/cometchat-flutter-v6-placement/SKILL.md +94 -381
- package/skills/cometchat-flutter-v6-production/SKILL.md +59 -615
- package/skills/cometchat-flutter-v6-push/SKILL.md +46 -455
- package/skills/cometchat-flutter-v6-testing/SKILL.md +68 -299
- package/skills/cometchat-flutter-v6-troubleshooting/SKILL.md +54 -878
- package/skills/cometchat-i18n/SKILL.md +35 -404
- package/skills/cometchat-ios-calls/SKILL.md +112 -563
- package/skills/cometchat-ios-components/SKILL.md +44 -834
- package/skills/cometchat-ios-core/SKILL.md +182 -1068
- package/skills/cometchat-ios-core/references/anti-patterns.md +113 -0
- package/skills/cometchat-ios-core/references/docs-map.md +124 -0
- package/skills/cometchat-ios-core/references/install.md +23 -0
- package/skills/cometchat-ios-core/references/layout.md +219 -0
- package/skills/cometchat-ios-core/references/setup-credentials.md +197 -0
- package/skills/cometchat-ios-core/references/swiftui.md +91 -0
- package/skills/cometchat-ios-core/references/troubleshooting.md +100 -0
- package/skills/cometchat-ios-customization/SKILL.md +33 -968
- package/skills/cometchat-ios-features/SKILL.md +29 -738
- package/skills/cometchat-ios-migration/SKILL.md +39 -0
- package/skills/cometchat-ios-placement/SKILL.md +51 -729
- package/skills/cometchat-ios-production/SKILL.md +67 -723
- package/skills/cometchat-ios-push/SKILL.md +24 -602
- package/skills/cometchat-ios-testing/SKILL.md +36 -355
- package/skills/cometchat-ios-troubleshooting/SKILL.md +31 -989
- package/skills/cometchat-ios-v5-sdk/SKILL.md +161 -0
- package/skills/cometchat-ios-v5-sdk/references/docs-map.md +326 -0
- package/skills/cometchat-js-v5-sdk/SKILL.md +95 -0
- package/skills/cometchat-js-v5-sdk/references/docs-map.md +114 -0
- package/skills/cometchat-migrate-from-getstream/SKILL.md +65 -0
- package/skills/cometchat-migrate-from-getstream/references/concept-map.md +98 -0
- package/skills/cometchat-migrate-from-getstream/references/data-migration.md +74 -0
- package/skills/cometchat-migrate-from-getstream/references/feature-map.md +108 -0
- package/skills/cometchat-migrate-from-getstream/references/inventory.md +82 -0
- package/skills/cometchat-migrate-from-getstream/references/native-build.md +9 -0
- package/skills/cometchat-migrate-from-getstream/references/report-template.md +59 -0
- package/skills/cometchat-migrate-from-sendbird/SKILL.md +64 -0
- package/skills/cometchat-migrate-from-sendbird/references/concept-map.md +99 -0
- package/skills/cometchat-migrate-from-sendbird/references/data-migration.md +74 -0
- package/skills/cometchat-migrate-from-sendbird/references/feature-map.md +104 -0
- package/skills/cometchat-migrate-from-sendbird/references/inventory.md +86 -0
- package/skills/cometchat-migrate-from-sendbird/references/native-build.md +10 -0
- package/skills/cometchat-migrate-from-sendbird/references/report-template.md +59 -0
- package/skills/cometchat-migrate-from-twilio/SKILL.md +52 -0
- package/skills/cometchat-migrate-from-twilio/references/concept-map.md +49 -0
- package/skills/cometchat-migrate-from-twilio/references/data-migration.md +50 -0
- package/skills/cometchat-migrate-from-twilio/references/feature-map.md +27 -0
- package/skills/cometchat-migrate-from-twilio/references/inventory.md +53 -0
- package/skills/cometchat-migrate-from-twilio/references/report-template.md +52 -0
- package/skills/cometchat-moderation/SKILL.md +58 -0
- package/skills/cometchat-onboarding/SKILL.md +92 -0
- package/skills/cometchat-onboarding/references/archetypes.md +51 -0
- package/skills/cometchat-onboarding/references/calling-first.md +77 -0
- package/skills/cometchat-onboarding/references/not-in-this-pack.md +8 -0
- package/skills/cometchat-onboarding/references/plan-artifact.md +133 -0
- package/skills/cometchat-onboarding/references/platforms.md +105 -0
- package/skills/cometchat-react-native-bare-patterns/SKILL.md +120 -0
- package/skills/cometchat-react-native-calls/SKILL.md +200 -0
- package/skills/cometchat-react-native-components/SKILL.md +142 -0
- package/skills/cometchat-react-native-core/SKILL.md +335 -0
- package/skills/cometchat-react-native-core/references/anti-patterns.md +79 -0
- package/skills/cometchat-react-native-core/references/component-props.md +105 -0
- package/skills/cometchat-react-native-core/references/dependencies.md +62 -0
- package/skills/cometchat-react-native-core/references/docs-map.md +127 -0
- package/skills/cometchat-react-native-core/references/layout.md +61 -0
- package/skills/cometchat-react-native-core/references/lifecycle.md +64 -0
- package/skills/cometchat-react-native-core/references/setup-credentials.md +39 -0
- package/skills/cometchat-react-native-customization/SKILL.md +198 -0
- package/skills/cometchat-react-native-expo-patterns/SKILL.md +116 -0
- package/skills/cometchat-react-native-features/SKILL.md +122 -0
- package/skills/cometchat-react-native-migration/SKILL.md +103 -0
- package/skills/cometchat-react-native-placement/SKILL.md +158 -0
- package/skills/cometchat-react-native-production/SKILL.md +79 -0
- package/skills/cometchat-react-native-push/SKILL.md +88 -0
- package/skills/cometchat-react-native-sdk/SKILL.md +133 -0
- package/skills/cometchat-react-native-sdk/references/method-map.md +239 -0
- package/skills/cometchat-react-native-sdk/references/page-map.md +96 -0
- package/skills/cometchat-react-native-testing/SKILL.md +94 -0
- package/skills/cometchat-react-native-troubleshooting/SKILL.md +174 -0
- package/skills/cometchat-react-native-v5-sdk/SKILL.md +150 -0
- package/skills/cometchat-react-native-v5-sdk/references/docs-map.md +127 -0
- package/skills/cometchat-react-native-v5-sdk/references/ringing-voip.md +369 -0
- package/skills/cometchat-react-v7-calls/SKILL.md +75 -0
- package/skills/cometchat-react-v7-components/SKILL.md +72 -0
- package/skills/cometchat-react-v7-core/SKILL.md +101 -0
- package/skills/cometchat-react-v7-core/references/anti-patterns.md +19 -0
- package/skills/cometchat-react-v7-core/references/component-props.md +82 -0
- package/skills/cometchat-react-v7-core/references/dependencies.md +23 -0
- package/skills/cometchat-react-v7-core/references/docs-map.md +117 -0
- package/skills/cometchat-react-v7-core/references/layout.md +150 -0
- package/skills/cometchat-react-v7-core/references/lifecycle.md +74 -0
- package/skills/cometchat-react-v7-core/references/setup-credentials.md +58 -0
- package/skills/cometchat-react-v7-core/references/ssr.md +11 -0
- package/skills/cometchat-react-v7-core/references/theming.md +52 -0
- package/skills/cometchat-react-v7-customization/SKILL.md +84 -0
- package/skills/cometchat-react-v7-features/SKILL.md +92 -0
- package/skills/cometchat-react-v7-migration/SKILL.md +39 -0
- package/skills/cometchat-react-v7-migration/references/migration-guide.md +119 -0
- package/skills/cometchat-react-v7-patterns/SKILL.md +43 -0
- package/skills/cometchat-react-v7-placement/SKILL.md +106 -0
- package/skills/cometchat-react-v7-placement/references/recipes.md +354 -0
- package/skills/cometchat-react-v7-production/SKILL.md +84 -0
- package/skills/cometchat-react-v7-push/SKILL.md +53 -0
- package/skills/cometchat-react-v7-testing/SKILL.md +60 -0
- package/skills/cometchat-react-v7-troubleshooting/SKILL.md +47 -0
- package/skills/cometchat-security/SKILL.md +80 -0
- package/skills/cometchat-self-host/SKILL.md +56 -0
- package/test-suite/README.md +70 -0
- package/test-suite/catalogs/android-calls-v5.json +830 -0
- package/test-suite/catalogs/android-calls-v5.symbols.txt +499 -0
- package/test-suite/catalogs/android-v6.json +1646 -0
- package/test-suite/catalogs/android-v6.symbols.txt +298 -0
- package/test-suite/catalogs/angular-v5.json +7587 -0
- package/test-suite/catalogs/flutter-calls-v5.json +196 -0
- package/test-suite/catalogs/flutter-calls-v5.symbols.txt +59 -0
- package/test-suite/catalogs/flutter-v6.json +651 -0
- package/test-suite/catalogs/ios-calls-v5.json +158 -0
- package/test-suite/catalogs/ios-calls-v5.symbols.txt +70 -0
- package/test-suite/catalogs/ios-v5.json +1383 -0
- package/test-suite/catalogs/ios-v5.symbols.txt +699 -0
- package/test-suite/catalogs/rn-calls-v5.json +134 -0
- package/test-suite/catalogs/rn-sdk-v4.json +672 -0
- package/test-suite/catalogs/rn-v5.json +449 -0
- package/test-suite/catalogs/sdk-android-v5.json +514 -0
- package/test-suite/catalogs/sdk-android-v5.symbols.txt +254 -0
- package/test-suite/catalogs/sdk-jsv4.json +800 -0
- package/test-suite/catalogs/web-calls-v5.json +195 -0
- package/test-suite/catalogs/web-v7.json +1243 -0
- package/test-suite/scripts/build-registry.mjs +113 -0
- package/test-suite/scripts/catalog-refresh-dart.mjs +151 -0
- package/test-suite/scripts/catalog-refresh.mjs +100 -0
- package/test-suite/scripts/lint-skills.mjs +932 -0
- package/test-suite/scripts/measure-tokens.mjs +169 -0
- package/test-suite/scripts/typecheck-fences-dart.mjs +437 -0
- package/test-suite/scripts/typecheck-fences-kotlin.mjs +269 -0
- package/test-suite/scripts/typecheck-fences.mjs +206 -0
- package/test-suite/scripts/verify-catalog.mjs +242 -0
- package/test-suite/scripts/verify-contract-fences.mjs +94 -0
- package/test-suite/scripts/verify-detection.mjs +178 -0
- package/test-suite/scripts/verify-docs-base.mjs +91 -0
- package/test-suite/scripts/verify-family-agnostic.mjs +134 -0
- package/test-suite/scripts/verify-golden-path.mjs +138 -0
- package/test-suite/scripts/verify-oracle-components.mjs +133 -0
- package/test-suite/scripts/verify-template-bindings.mjs +148 -0
- package/test-suite/typecheck/angular-v5/package.json +21 -0
- package/test-suite/typecheck/angular-v5/tsconfig.json +21 -0
- package/test-suite/typecheck/flutter-v6/analysis_options.yaml +25 -0
- package/test-suite/typecheck/flutter-v6/pubspec.yaml +21 -0
- package/test-suite/typecheck/web-v7/package.json +18 -0
- package/test-suite/typecheck/web-v7/tsconfig.json +19 -0
- package/bin/install.js +0 -1003
- package/skills/.claude-plugin/marketplace.json +0 -86
- package/skills/cometchat/references/asking-questions.md +0 -48
- package/skills/cometchat-android-v5/SKILL.md +0 -121
- package/skills/cometchat-android-v5-calls/SKILL.md +0 -429
- package/skills/cometchat-android-v5-calls/references/README.md +0 -53
- package/skills/cometchat-android-v5-calls/references/add-calls-to-existing-chat.md +0 -197
- package/skills/cometchat-android-v5-calls/references/audio-controls.md +0 -91
- package/skills/cometchat-android-v5-calls/references/background-handling.md +0 -168
- package/skills/cometchat-android-v5-calls/references/call-layouts.md +0 -131
- package/skills/cometchat-android-v5-calls/references/call-logs.md +0 -113
- package/skills/cometchat-android-v5-calls/references/call-session.md +0 -274
- package/skills/cometchat-android-v5-calls/references/custom-ui.md +0 -150
- package/skills/cometchat-android-v5-calls/references/event-listeners.md +0 -123
- package/skills/cometchat-android-v5-calls/references/group-calls.md +0 -205
- package/skills/cometchat-android-v5-calls/references/idle-timeout.md +0 -117
- package/skills/cometchat-android-v5-calls/references/in-call-chat.md +0 -134
- package/skills/cometchat-android-v5-calls/references/join-session.md +0 -120
- package/skills/cometchat-android-v5-calls/references/migration-v4-to-v5.md +0 -222
- package/skills/cometchat-android-v5-calls/references/participant-management.md +0 -110
- package/skills/cometchat-android-v5-calls/references/picture-in-picture.md +0 -106
- package/skills/cometchat-android-v5-calls/references/raise-hand.md +0 -248
- package/skills/cometchat-android-v5-calls/references/recording.md +0 -101
- package/skills/cometchat-android-v5-calls/references/ringing-integration.md +0 -152
- package/skills/cometchat-android-v5-calls/references/screen-sharing.md +0 -78
- package/skills/cometchat-android-v5-calls/references/server-fcm-voip.md +0 -215
- package/skills/cometchat-android-v5-calls/references/session-settings.md +0 -121
- package/skills/cometchat-android-v5-calls/references/setup.md +0 -137
- package/skills/cometchat-android-v5-calls/references/share-invite.md +0 -156
- package/skills/cometchat-android-v5-calls/references/video-controls.md +0 -87
- package/skills/cometchat-android-v5-calls/references/voip-calling.md +0 -526
- package/skills/cometchat-android-v5-components/SKILL.md +0 -431
- package/skills/cometchat-android-v5-core/SKILL.md +0 -486
- package/skills/cometchat-android-v5-customization/SKILL.md +0 -469
- package/skills/cometchat-android-v5-extensions/SKILL.md +0 -127
- package/skills/cometchat-android-v5-features/SKILL.md +0 -131
- package/skills/cometchat-android-v5-placement/SKILL.md +0 -277
- package/skills/cometchat-android-v5-production/SKILL.md +0 -95
- package/skills/cometchat-android-v5-push/SKILL.md +0 -619
- package/skills/cometchat-android-v5-testing/SKILL.md +0 -188
- package/skills/cometchat-android-v5-theming/SKILL.md +0 -167
- package/skills/cometchat-android-v5-troubleshooting/SKILL.md +0 -74
- package/skills/cometchat-android-v6/SKILL.md +0 -108
- package/skills/cometchat-android-v6-calls/references/add-calls-to-existing-chat.md +0 -97
- package/skills/cometchat-android-v6-calls/references/advanced-features.md +0 -87
- package/skills/cometchat-android-v6-calls/references/call-layouts.md +0 -100
- package/skills/cometchat-android-v6-calls/references/call-session.md +0 -163
- package/skills/cometchat-android-v6-calls/references/device-management.md +0 -172
- package/skills/cometchat-android-v6-calls/references/group-calls.md +0 -191
- package/skills/cometchat-android-v6-calls/references/idle-timeout.md +0 -110
- package/skills/cometchat-android-v6-calls/references/in-call-chat.md +0 -141
- package/skills/cometchat-android-v6-calls/references/raise-hand.md +0 -188
- package/skills/cometchat-android-v6-calls/references/ringing-integration.md +0 -176
- package/skills/cometchat-android-v6-calls/references/server-fcm-voip.md +0 -127
- package/skills/cometchat-android-v6-calls/references/share-invite.md +0 -105
- package/skills/cometchat-android-v6-compose-theming/SKILL.md +0 -250
- package/skills/cometchat-android-v6-kotlin-theming/SKILL.md +0 -233
- package/skills/cometchat-angular-calls/SKILL.md +0 -380
- package/skills/cometchat-angular-calls/references/add-calls-to-existing-chat.md +0 -96
- package/skills/cometchat-angular-calls/references/call-layouts.md +0 -123
- package/skills/cometchat-angular-calls/references/call-session.md +0 -167
- package/skills/cometchat-angular-calls/references/custom-ui.md +0 -239
- package/skills/cometchat-angular-calls/references/device-management.md +0 -154
- package/skills/cometchat-angular-calls/references/group-calls.md +0 -433
- package/skills/cometchat-angular-calls/references/idle-timeout.md +0 -161
- package/skills/cometchat-angular-calls/references/in-call-chat.md +0 -148
- package/skills/cometchat-angular-calls/references/lazy-loading-pitfalls.md +0 -205
- package/skills/cometchat-angular-calls/references/migration-v4-to-v5.md +0 -53
- package/skills/cometchat-angular-calls/references/ngzone-and-async-callbacks.md +0 -184
- package/skills/cometchat-angular-calls/references/picture-in-picture.md +0 -285
- package/skills/cometchat-angular-calls/references/raise-hand.md +0 -172
- package/skills/cometchat-angular-calls/references/recording-screen-share.md +0 -260
- package/skills/cometchat-angular-calls/references/ringing-integration.md +0 -133
- package/skills/cometchat-angular-calls/references/server-web-push-vapid.md +0 -100
- package/skills/cometchat-angular-calls/references/share-invite.md +0 -122
- package/skills/cometchat-angular-calls/references/virtual-background.md +0 -29
- package/skills/cometchat-angular-components/SKILL.md +0 -235
- package/skills/cometchat-angular-core/SKILL.md +0 -386
- package/skills/cometchat-angular-customization/SKILL.md +0 -616
- package/skills/cometchat-angular-features/SKILL.md +0 -329
- package/skills/cometchat-angular-patterns/SKILL.md +0 -256
- package/skills/cometchat-angular-placement/SKILL.md +0 -314
- package/skills/cometchat-angular-production/SKILL.md +0 -564
- package/skills/cometchat-angular-push/SKILL.md +0 -389
- package/skills/cometchat-angular-testing/SKILL.md +0 -605
- package/skills/cometchat-angular-theming/SKILL.md +0 -290
- package/skills/cometchat-angular-troubleshooting/SKILL.md +0 -364
- package/skills/cometchat-astro-patterns/SKILL.md +0 -708
- package/skills/cometchat-calls/SKILL.md +0 -364
- package/skills/cometchat-calls/references/use-case-broadcast.md +0 -199
- package/skills/cometchat-calls/references/use-case-marketplace.md +0 -157
- package/skills/cometchat-calls/references/use-case-support.md +0 -189
- package/skills/cometchat-calls/references/use-case-team.md +0 -180
- package/skills/cometchat-calls/references/use-case-telehealth.md +0 -153
- package/skills/cometchat-components/SKILL.md +0 -1142
- package/skills/cometchat-core/SKILL.md +0 -1048
- package/skills/cometchat-customization/SKILL.md +0 -580
- package/skills/cometchat-customization/references/component-catalog.md +0 -236
- package/skills/cometchat-features/SKILL.md +0 -861
- package/skills/cometchat-flutter-v5/SKILL.md +0 -173
- package/skills/cometchat-flutter-v5-calls/SKILL.md +0 -455
- package/skills/cometchat-flutter-v5-calls/references/add-calls-to-existing-chat.md +0 -193
- package/skills/cometchat-flutter-v5-calls/references/call-layouts.md +0 -103
- package/skills/cometchat-flutter-v5-calls/references/call-session.md +0 -285
- package/skills/cometchat-flutter-v5-calls/references/device-management.md +0 -124
- package/skills/cometchat-flutter-v5-calls/references/group-calls.md +0 -181
- package/skills/cometchat-flutter-v5-calls/references/idle-timeout.md +0 -99
- package/skills/cometchat-flutter-v5-calls/references/in-call-chat.md +0 -135
- package/skills/cometchat-flutter-v5-calls/references/migration-v4-to-v5.md +0 -210
- package/skills/cometchat-flutter-v5-calls/references/raise-hand.md +0 -255
- package/skills/cometchat-flutter-v5-calls/references/ringing-integration.md +0 -196
- package/skills/cometchat-flutter-v5-calls/references/server-push-bridge.md +0 -101
- package/skills/cometchat-flutter-v5-calls/references/share-invite.md +0 -148
- package/skills/cometchat-flutter-v5-conversations/SKILL.md +0 -118
- package/skills/cometchat-flutter-v5-core/SKILL.md +0 -239
- package/skills/cometchat-flutter-v5-customization/SKILL.md +0 -358
- package/skills/cometchat-flutter-v5-events/SKILL.md +0 -156
- package/skills/cometchat-flutter-v5-messages/SKILL.md +0 -259
- package/skills/cometchat-flutter-v5-production/SKILL.md +0 -216
- package/skills/cometchat-flutter-v5-push/SKILL.md +0 -285
- package/skills/cometchat-flutter-v5-testing/SKILL.md +0 -401
- package/skills/cometchat-flutter-v5-theming/SKILL.md +0 -161
- package/skills/cometchat-flutter-v5-troubleshooting/SKILL.md +0 -130
- package/skills/cometchat-flutter-v5-users-groups/SKILL.md +0 -152
- package/skills/cometchat-flutter-v6/SKILL.md +0 -446
- package/skills/cometchat-flutter-v6-calls/references/add-calls-to-existing-chat.md +0 -136
- package/skills/cometchat-flutter-v6-calls/references/advanced-features.md +0 -89
- package/skills/cometchat-flutter-v6-calls/references/call-layouts.md +0 -105
- package/skills/cometchat-flutter-v6-calls/references/call-session.md +0 -229
- package/skills/cometchat-flutter-v6-calls/references/device-management.md +0 -105
- package/skills/cometchat-flutter-v6-calls/references/group-calls.md +0 -190
- package/skills/cometchat-flutter-v6-calls/references/idle-timeout.md +0 -88
- package/skills/cometchat-flutter-v6-calls/references/in-call-chat.md +0 -125
- package/skills/cometchat-flutter-v6-calls/references/raise-hand.md +0 -275
- package/skills/cometchat-flutter-v6-calls/references/ringing-integration.md +0 -171
- package/skills/cometchat-flutter-v6-calls/references/server-push-bridge.md +0 -93
- package/skills/cometchat-flutter-v6-calls/references/share-invite.md +0 -102
- package/skills/cometchat-flutter-v6-conversations/SKILL.md +0 -238
- package/skills/cometchat-flutter-v6-messages/SKILL.md +0 -384
- package/skills/cometchat-flutter-v6-theming/SKILL.md +0 -293
- package/skills/cometchat-flutter-v6-users-groups/SKILL.md +0 -224
- package/skills/cometchat-ios/SKILL.md +0 -325
- package/skills/cometchat-ios-calls/references/add-calls-to-existing-chat.md +0 -181
- package/skills/cometchat-ios-calls/references/audio-modes-and-controls.md +0 -45
- package/skills/cometchat-ios-calls/references/avaudiosession-routing.md +0 -188
- package/skills/cometchat-ios-calls/references/call-layouts.md +0 -76
- package/skills/cometchat-ios-calls/references/call-session.md +0 -218
- package/skills/cometchat-ios-calls/references/callkit-and-pushkit.md +0 -357
- package/skills/cometchat-ios-calls/references/custom-ui.md +0 -322
- package/skills/cometchat-ios-calls/references/device-management.md +0 -171
- package/skills/cometchat-ios-calls/references/group-calls.md +0 -359
- package/skills/cometchat-ios-calls/references/idle-timeout.md +0 -184
- package/skills/cometchat-ios-calls/references/in-call-chat.md +0 -179
- package/skills/cometchat-ios-calls/references/migration-v4-to-v5.md +0 -196
- package/skills/cometchat-ios-calls/references/picture-in-picture.md +0 -246
- package/skills/cometchat-ios-calls/references/raise-hand.md +0 -26
- package/skills/cometchat-ios-calls/references/recording-screen-share.md +0 -252
- package/skills/cometchat-ios-calls/references/ringing-integration.md +0 -143
- package/skills/cometchat-ios-calls/references/server-apns-pushkit.md +0 -267
- package/skills/cometchat-ios-calls/references/share-invite.md +0 -148
- package/skills/cometchat-ios-calls/references/swiftui-uikit-hosting.md +0 -246
- package/skills/cometchat-ios-calls/references/voip-cert-setup.md +0 -166
- package/skills/cometchat-ios-theming/SKILL.md +0 -667
- package/skills/cometchat-native-bare-patterns/SKILL.md +0 -550
- package/skills/cometchat-native-calls/SKILL.md +0 -671
- package/skills/cometchat-native-calls/references/add-calls-to-existing-chat.md +0 -203
- package/skills/cometchat-native-calls/references/call-layouts.md +0 -125
- package/skills/cometchat-native-calls/references/call-session.md +0 -182
- package/skills/cometchat-native-calls/references/custom-ui.md +0 -254
- package/skills/cometchat-native-calls/references/device-management.md +0 -158
- package/skills/cometchat-native-calls/references/expo-vs-bare.md +0 -179
- package/skills/cometchat-native-calls/references/group-calls.md +0 -296
- package/skills/cometchat-native-calls/references/idle-timeout.md +0 -128
- package/skills/cometchat-native-calls/references/in-call-chat.md +0 -145
- package/skills/cometchat-native-calls/references/migration-v4-to-v5.md +0 -72
- package/skills/cometchat-native-calls/references/picture-in-picture.md +0 -276
- package/skills/cometchat-native-calls/references/raise-hand.md +0 -205
- package/skills/cometchat-native-calls/references/recording-screen-share.md +0 -169
- package/skills/cometchat-native-calls/references/ringing-integration.md +0 -118
- package/skills/cometchat-native-calls/references/server-push-bridge.md +0 -135
- package/skills/cometchat-native-calls/references/server-push-payloads.md +0 -193
- package/skills/cometchat-native-calls/references/share-invite.md +0 -146
- package/skills/cometchat-native-calls/references/voip-push-end-to-end.md +0 -319
- package/skills/cometchat-native-components/SKILL.md +0 -628
- package/skills/cometchat-native-core/SKILL.md +0 -679
- package/skills/cometchat-native-customization/SKILL.md +0 -716
- package/skills/cometchat-native-expo-patterns/SKILL.md +0 -552
- package/skills/cometchat-native-features/SKILL.md +0 -638
- package/skills/cometchat-native-placement/SKILL.md +0 -509
- package/skills/cometchat-native-production/SKILL.md +0 -700
- package/skills/cometchat-native-push/SKILL.md +0 -594
- package/skills/cometchat-native-testing/SKILL.md +0 -582
- package/skills/cometchat-native-theming/SKILL.md +0 -681
- package/skills/cometchat-native-troubleshooting/SKILL.md +0 -501
- package/skills/cometchat-nextjs-patterns/SKILL.md +0 -899
- package/skills/cometchat-placement/SKILL.md +0 -1360
- package/skills/cometchat-production/SKILL.md +0 -1027
- package/skills/cometchat-react-calls/SKILL.md +0 -752
- package/skills/cometchat-react-calls/references/add-calls-to-existing-chat.md +0 -146
- package/skills/cometchat-react-calls/references/call-layouts.md +0 -160
- package/skills/cometchat-react-calls/references/call-session.md +0 -235
- package/skills/cometchat-react-calls/references/custom-ui.md +0 -247
- package/skills/cometchat-react-calls/references/device-management.md +0 -210
- package/skills/cometchat-react-calls/references/group-calls.md +0 -257
- package/skills/cometchat-react-calls/references/idle-timeout.md +0 -188
- package/skills/cometchat-react-calls/references/in-call-chat.md +0 -212
- package/skills/cometchat-react-calls/references/migration-v4-to-v5.md +0 -170
- package/skills/cometchat-react-calls/references/picture-in-picture.md +0 -245
- package/skills/cometchat-react-calls/references/raise-hand.md +0 -238
- package/skills/cometchat-react-calls/references/recording-screen-share.md +0 -144
- package/skills/cometchat-react-calls/references/ringing-integration.md +0 -255
- package/skills/cometchat-react-calls/references/server-web-push-vapid.md +0 -241
- package/skills/cometchat-react-calls/references/share-invite.md +0 -175
- package/skills/cometchat-react-calls/references/testing-calls-on-web.md +0 -216
- package/skills/cometchat-react-calls/references/virtual-background.md +0 -32
- package/skills/cometchat-react-calls/references/voip-and-web-push.md +0 -165
- package/skills/cometchat-react-patterns/SKILL.md +0 -628
- package/skills/cometchat-react-push/SKILL.md +0 -634
- package/skills/cometchat-react-router-patterns/SKILL.md +0 -758
- package/skills/cometchat-react-testing/SKILL.md +0 -413
- package/skills/cometchat-theming/SKILL.md +0 -498
- package/skills/cometchat-troubleshooting/SKILL.md +0 -294
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
# Ringing — call signaling with custom UI (React Native)
|
|
2
|
-
|
|
3
|
-
Same SDK shape as web; RN-specific deltas: navigation-aware listener mount, CallKeep + VoIP push for backgrounded ring delivery, audio file paths via require.
|
|
4
|
-
|
|
5
|
-
**Read first:** `cometchat-react-calls/references/ringing-integration.md` — full architecture, hard rules, web reference.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## SDK API
|
|
10
|
-
|
|
11
|
-
```ts
|
|
12
|
-
import { CometChat } from "@cometchat/chat-sdk-react-native";
|
|
13
|
-
import { CometChatCalls } from "@cometchat/calls-sdk-react-native";
|
|
14
|
-
|
|
15
|
-
const call = new CometChat.Call(
|
|
16
|
-
receiverUid,
|
|
17
|
-
CometChat.CALL_TYPE.VIDEO,
|
|
18
|
-
CometChat.RECEIVER_TYPE.USER,
|
|
19
|
-
);
|
|
20
|
-
const outgoingCall = await CometChat.initiateCall(call, 60);
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
## Listener mount: at NavigationContainer root, NOT inside a screen
|
|
26
|
-
|
|
27
|
-
```tsx
|
|
28
|
-
// App.tsx — sibling of NavigationContainer's content
|
|
29
|
-
import { useEffect } from "react";
|
|
30
|
-
import { NavigationContainer } from "@react-navigation/native";
|
|
31
|
-
|
|
32
|
-
export default function App() {
|
|
33
|
-
useCometChatCallListener();
|
|
34
|
-
return (
|
|
35
|
-
<NavigationContainer>
|
|
36
|
-
<RootNavigator />
|
|
37
|
-
</NavigationContainer>
|
|
38
|
-
);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function useCometChatCallListener() {
|
|
42
|
-
useEffect(() => {
|
|
43
|
-
CometChat.addCallListener("app", new CometChat.CallListener({
|
|
44
|
-
onIncomingCallReceived: (call) => navigationRef.current?.navigate("IncomingCall", { call }),
|
|
45
|
-
onOutgoingCallAccepted: (call) => navigationRef.current?.navigate("ActiveCall", { sessionId: call.getSessionId() }),
|
|
46
|
-
onIncomingCallCancelled: () => navigationRef.current?.goBack(),
|
|
47
|
-
onOutgoingCallRejected: () => navigationRef.current?.goBack(),
|
|
48
|
-
onCallEndedMessageReceived: () => navigationRef.current?.popToTop(),
|
|
49
|
-
}));
|
|
50
|
-
return () => CometChat.removeCallListener("app");
|
|
51
|
-
}, []);
|
|
52
|
-
}
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
Use a `navigationRef` (per `@react-navigation/native` docs) so listener callbacks can navigate without prop-drilling.
|
|
56
|
-
|
|
57
|
-
---
|
|
58
|
-
|
|
59
|
-
## Backgrounded ring delivery — VoIP push is the bridge
|
|
60
|
-
|
|
61
|
-
When the app is backgrounded or killed, `addCallListener` doesn't fire — the JS bundle isn't running. **VoIP push** wakes the app + surfaces the ring via CallKit (iOS) / ConnectionService (Android). On accept, route the user to the same screen the foreground listener would.
|
|
62
|
-
|
|
63
|
-
Wire VoIP push per `cometchat-native-calls/references/server-push-bridge.md`. Server fires push → CallKeep shows OS-level UI → user taps Accept → app launches/foregrounds → call session starts.
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
## Ringtone via expo-av or react-native-sound
|
|
68
|
-
|
|
69
|
-
```tsx
|
|
70
|
-
import { Audio } from "expo-av"; // Expo
|
|
71
|
-
// OR: import Sound from "react-native-sound";
|
|
72
|
-
|
|
73
|
-
let ringtoneSound: Audio.Sound | null = null;
|
|
74
|
-
|
|
75
|
-
async function playRingtone() {
|
|
76
|
-
ringtoneSound = new Audio.Sound();
|
|
77
|
-
await ringtoneSound.loadAsync(require("../assets/ringtone.mp3"));
|
|
78
|
-
await ringtoneSound.setIsLoopingAsync(true);
|
|
79
|
-
await ringtoneSound.playAsync();
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
async function stopRingtone() {
|
|
83
|
-
await ringtoneSound?.stopAsync();
|
|
84
|
-
await ringtoneSound?.unloadAsync();
|
|
85
|
-
ringtoneSound = null;
|
|
86
|
-
}
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
For backgrounded ring, **don't** play ringtone from JS — CallKit/ConnectionService plays the system ringtone. JS-side ringtone is for in-foreground ringing only.
|
|
90
|
-
|
|
91
|
-
---
|
|
92
|
-
|
|
93
|
-
## Anti-patterns
|
|
94
|
-
|
|
95
|
-
Web sister rules apply, plus RN-specific:
|
|
96
|
-
|
|
97
|
-
1. **`addCallListener` inside a screen component.** Listener tears down on screen unmount → backgrounded calls miss.
|
|
98
|
-
2. **Expecting `addCallListener` to fire when app is killed.** It doesn't — VoIP push is the only way. If you skipped VoIP push, your "background ring" doesn't work.
|
|
99
|
-
3. **Playing JS ringtone during a CallKit/ConnectionService ring.** Two ringtones at once. Suppress JS-side when OS UI is active.
|
|
100
|
-
|
|
101
|
-
---
|
|
102
|
-
|
|
103
|
-
## Verification checklist
|
|
104
|
-
|
|
105
|
-
- [ ] Listener registered at NavigationContainer level
|
|
106
|
-
- [ ] navigationRef wired (forwards refs from listener callbacks)
|
|
107
|
-
- [ ] VoIP push registered for backgrounded ring delivery
|
|
108
|
-
- [ ] Ringtone plays in foreground only (suppressed when CallKit/ConnectionService active)
|
|
109
|
-
- [ ] Real-device smoke: 2 phones, foreground ring, backgrounded ring, killed-app ring all work
|
|
110
|
-
|
|
111
|
-
---
|
|
112
|
-
|
|
113
|
-
## Pointers
|
|
114
|
-
|
|
115
|
-
- `cometchat-react-calls/references/ringing-integration.md` — canonical (architecture + hard rules)
|
|
116
|
-
- `cometchat-native-calls/SKILL.md` — RN seven hard rules
|
|
117
|
-
- `cometchat-native-calls/references/server-push-bridge.md` — VoIP push for backgrounded ring
|
|
118
|
-
- Canonical docs: https://www.cometchat.com/docs/calls/react-native/ringing
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
# Server-side push routing for React Native (iOS PushKit + Android FCM)
|
|
2
|
-
|
|
3
|
-
React Native projects target iOS and Android — your server needs to dispatch the right kind of push to each platform. Use the iOS canonical (APNs PushKit + .p8) for iPhone tokens and the Android canonical (FCM HTTP v1 + service account) for Android tokens.
|
|
4
|
-
|
|
5
|
-
**Canonical docs:**
|
|
6
|
-
- iOS: `cometchat-ios-calls/references/server-apns-pushkit.md`
|
|
7
|
-
- Android: `cometchat-android-v5-calls/references/server-fcm-voip.md`
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Token registration (RN client)
|
|
12
|
-
|
|
13
|
-
```tsx
|
|
14
|
-
// On app start, after CometChat login completes
|
|
15
|
-
import VoipPushNotification from "react-native-voip-push-notification";
|
|
16
|
-
import messaging from "@react-native-firebase/messaging";
|
|
17
|
-
import { Platform } from "react-native";
|
|
18
|
-
|
|
19
|
-
async function registerCallPushTokens(userUid: string) {
|
|
20
|
-
if (Platform.OS === "ios") {
|
|
21
|
-
VoipPushNotification.addEventListener("register", async (token) => {
|
|
22
|
-
await api.registerCallToken({
|
|
23
|
-
uid: userUid,
|
|
24
|
-
platform: "ios-voip",
|
|
25
|
-
token,
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
VoipPushNotification.addEventListener("notification", (payload) => {
|
|
29
|
-
// CallKeep takes over from here — see cometchat-native-calls/SKILL.md rule 4
|
|
30
|
-
});
|
|
31
|
-
VoipPushNotification.registerVoipToken();
|
|
32
|
-
} else if (Platform.OS === "android") {
|
|
33
|
-
await messaging().requestPermission();
|
|
34
|
-
const fcmToken = await messaging().getToken();
|
|
35
|
-
await api.registerCallToken({
|
|
36
|
-
uid: userUid,
|
|
37
|
-
platform: "android-fcm",
|
|
38
|
-
token: fcmToken,
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
messaging().onTokenRefresh(async (newToken) => {
|
|
42
|
-
await api.registerCallToken({
|
|
43
|
-
uid: userUid,
|
|
44
|
-
platform: "android-fcm",
|
|
45
|
-
token: newToken,
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
---
|
|
53
|
-
|
|
54
|
-
## Server-side dispatcher
|
|
55
|
-
|
|
56
|
-
Single webhook handler routes by platform:
|
|
57
|
-
|
|
58
|
-
```js
|
|
59
|
-
import { sendVoipPush as sendApns } from "./apns-pushkit.js"; // iOS canonical template
|
|
60
|
-
import { sendAndroidVoipPush } from "./fcm-voip.js"; // Android canonical template
|
|
61
|
-
|
|
62
|
-
app.post("/webhooks/call", verifyCometChatWebhook, async (req, res) => {
|
|
63
|
-
if (req.body.trigger !== "call_initiated") return res.status(200).end();
|
|
64
|
-
|
|
65
|
-
const { sessionId, type, initiator, receiver } = req.body.data;
|
|
66
|
-
const tokens = await db.getActiveCallTokens(receiver.uid); // returns [{platform, token}, ...]
|
|
67
|
-
|
|
68
|
-
// Fan out to all the user's devices in parallel
|
|
69
|
-
const sends = tokens.map((t) => {
|
|
70
|
-
const payload = {
|
|
71
|
-
recipientUid: receiver.uid,
|
|
72
|
-
sessionId,
|
|
73
|
-
callerName: initiator.name,
|
|
74
|
-
callerUid: initiator.uid,
|
|
75
|
-
callType: type,
|
|
76
|
-
};
|
|
77
|
-
if (t.platform === "ios-voip") return sendApns({ ...payload, pushKitToken: t.token });
|
|
78
|
-
if (t.platform === "android-fcm") return sendAndroidVoipPush({ ...payload, fcmToken: t.token });
|
|
79
|
-
return Promise.resolve();
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
await Promise.allSettled(sends);
|
|
83
|
-
res.status(200).end();
|
|
84
|
-
});
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
---
|
|
88
|
-
|
|
89
|
-
## Schema for tokens
|
|
90
|
-
|
|
91
|
-
```sql
|
|
92
|
-
CREATE TABLE call_push_tokens (
|
|
93
|
-
uid text NOT NULL,
|
|
94
|
-
platform text NOT NULL CHECK (platform IN ('ios-voip', 'android-fcm')),
|
|
95
|
-
token text NOT NULL,
|
|
96
|
-
device_id text,
|
|
97
|
-
registered_at timestamptz NOT NULL DEFAULT now(),
|
|
98
|
-
PRIMARY KEY (uid, platform, token)
|
|
99
|
-
);
|
|
100
|
-
|
|
101
|
-
CREATE INDEX idx_call_push_tokens_uid ON call_push_tokens(uid);
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
Why include `device_id`: a user may have iPhone + iPad + Android tablet. Allow multiple tokens per (uid, platform).
|
|
105
|
-
|
|
106
|
-
---
|
|
107
|
-
|
|
108
|
-
## Anti-patterns
|
|
109
|
-
|
|
110
|
-
iOS + Android sister rules apply, plus RN-specific:
|
|
111
|
-
|
|
112
|
-
1. **Single token table without `platform` column.** Can't tell which dispatcher to use → wrong push API → silent failure.
|
|
113
|
-
2. **Registering FCM token before login.** No user UID, can't store correctly. Register tokens AFTER `CometChat.login` resolves.
|
|
114
|
-
3. **Forgetting `messaging().onTokenRefresh`.** FCM tokens rotate every few months. Without refresh, push silently breaks.
|
|
115
|
-
4. **Returning the Promise.allSettled to the webhook caller.** CometChat retries on slow/failed webhooks; awaiting all pushes can block 5+ seconds. Use a queue (BullMQ/SQS): enqueue job, return 200 immediately.
|
|
116
|
-
|
|
117
|
-
---
|
|
118
|
-
|
|
119
|
-
## Verification checklist
|
|
120
|
-
|
|
121
|
-
- [ ] iOS: VoipPushNotification configured + token registered post-login
|
|
122
|
-
- [ ] Android: messaging() permission requested + token registered + onTokenRefresh handler
|
|
123
|
-
- [ ] Server has both apns-pushkit + fcm-voip dispatchers wired
|
|
124
|
-
- [ ] Webhook returns 200 within 1s (push enqueued)
|
|
125
|
-
- [ ] Token table supports multiple devices per user
|
|
126
|
-
- [ ] Real-device smoke: iPhone + Android both ring when caller dials
|
|
127
|
-
|
|
128
|
-
---
|
|
129
|
-
|
|
130
|
-
## Pointers
|
|
131
|
-
|
|
132
|
-
- `cometchat-ios-calls/references/server-apns-pushkit.md` — iOS canonical
|
|
133
|
-
- `cometchat-android-v5-calls/references/server-fcm-voip.md` — Android canonical
|
|
134
|
-
- `cometchat-native-calls` SKILL.md — RN seven hard rules (CallKeep + VoipPush wiring)
|
|
135
|
-
- `cometchat-native-push/SKILL.md` — chat push (sister, different payload)
|
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
# Server-side push payloads for RN calls
|
|
2
|
-
|
|
3
|
-
The RN client only handles received pushes. The server side — building and sending the payloads — is yours to implement. This reference is a copy-paste-ready Node.js example the skill points users at.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## What the server has to do
|
|
8
|
-
|
|
9
|
-
1. Subscribe to CometChat's `call.received` webhook (Dashboard → Webhooks)
|
|
10
|
-
2. When fired, look up the receiver UID's stored push tokens (PushKit + FCM)
|
|
11
|
-
3. Send a VoIP-shaped payload to each platform with the right priority + cert
|
|
12
|
-
|
|
13
|
-
Two endpoints, two payload shapes, one webhook. Simple but easy to get wrong.
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## Express skeleton
|
|
18
|
-
|
|
19
|
-
```ts
|
|
20
|
-
// server/push-handler.ts
|
|
21
|
-
import express from "express";
|
|
22
|
-
import apn from "node-apn"; // npm i node-apn
|
|
23
|
-
import admin from "firebase-admin"; // npm i firebase-admin
|
|
24
|
-
|
|
25
|
-
const app = express();
|
|
26
|
-
app.use(express.json());
|
|
27
|
-
|
|
28
|
-
// Initialize APNs (PushKit) provider with your VoIP cert
|
|
29
|
-
const voipCert = apn.Provider({
|
|
30
|
-
token: undefined,
|
|
31
|
-
cert: process.env.APNS_VOIP_CERT_PATH, // path to your VoIP .p12 / .pem
|
|
32
|
-
key: process.env.APNS_VOIP_KEY_PATH,
|
|
33
|
-
passphrase: process.env.APNS_VOIP_PASSPHRASE,
|
|
34
|
-
production: process.env.NODE_ENV === "production",
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
// Initialize Firebase Admin
|
|
38
|
-
admin.initializeApp({
|
|
39
|
-
credential: admin.credential.cert({
|
|
40
|
-
projectId: process.env.FIREBASE_PROJECT_ID!,
|
|
41
|
-
clientEmail: process.env.FIREBASE_CLIENT_EMAIL!,
|
|
42
|
-
privateKey: process.env.FIREBASE_PRIVATE_KEY!.replace(/\\n/g, "\n"),
|
|
43
|
-
}),
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
// CometChat webhook — fired when a call is initiated
|
|
47
|
-
app.post("/webhook/cometchat/call-received", async (req, res) => {
|
|
48
|
-
const { receiver, sender, sessionId, type } = req.body.data;
|
|
49
|
-
const subs = await getPushSubscriptionsForUid(receiver); // your DB
|
|
50
|
-
|
|
51
|
-
await Promise.allSettled([
|
|
52
|
-
...subs.ios.map((token) => sendIOSVoip(token, { sessionId, callerName: sender.name, callerUid: sender.uid, callType: type })),
|
|
53
|
-
...subs.android.map((token) => sendAndroidVoip(token, { sessionId, callerName: sender.name, callerUid: sender.uid, callType: type })),
|
|
54
|
-
]);
|
|
55
|
-
|
|
56
|
-
res.status(200).send({ ok: true });
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
async function sendIOSVoip(token: string, payload: { sessionId: string; callerName: string; callerUid: string; callType: string }) {
|
|
60
|
-
const note = new apn.Notification();
|
|
61
|
-
note.topic = `${process.env.IOS_BUNDLE_ID}.voip`; // CRITICAL: voip topic, not the bundle id
|
|
62
|
-
note.pushType = "voip"; // CRITICAL
|
|
63
|
-
note.priority = 10;
|
|
64
|
-
note.expiry = Math.floor(Date.now() / 1000) + 30; // expire in 30s — call rings or doesn't
|
|
65
|
-
note.payload = {
|
|
66
|
-
"content-available": 1,
|
|
67
|
-
data: payload,
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
const result = await voipCert.send(note, token);
|
|
71
|
-
if (result.failed.length > 0) {
|
|
72
|
-
console.error("PushKit send failed:", result.failed);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
async function sendAndroidVoip(token: string, payload: { sessionId: string; callerName: string; callerUid: string; callType: string }) {
|
|
77
|
-
await admin.messaging().send({
|
|
78
|
-
token,
|
|
79
|
-
android: {
|
|
80
|
-
priority: "high", // CRITICAL — without this, FCM may delay
|
|
81
|
-
ttl: 30 * 1000, // 30s TTL
|
|
82
|
-
},
|
|
83
|
-
data: { // CRITICAL — `data`, not `notification`
|
|
84
|
-
type: "incoming_call",
|
|
85
|
-
sessionId: payload.sessionId,
|
|
86
|
-
callerName: payload.callerName,
|
|
87
|
-
callerUid: payload.callerUid,
|
|
88
|
-
callType: payload.callType,
|
|
89
|
-
},
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
app.listen(3000);
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
The skill writes this file as `server/push.example.ts` next to a README pointing at the env vars + cert paths.
|
|
97
|
-
|
|
98
|
-
---
|
|
99
|
-
|
|
100
|
-
## Token registration endpoint
|
|
101
|
-
|
|
102
|
-
The client sends its tokens to your server when the user logs in:
|
|
103
|
-
|
|
104
|
-
```ts
|
|
105
|
-
// Client side
|
|
106
|
-
import VoipPushNotification from "react-native-voip-push-notification";
|
|
107
|
-
import messaging from "@react-native-firebase/messaging";
|
|
108
|
-
|
|
109
|
-
async function registerPushTokens(cometchatUid: string) {
|
|
110
|
-
if (Platform.OS === "ios") {
|
|
111
|
-
VoipPushNotification.addEventListener("register", async (token) => {
|
|
112
|
-
await fetch("/api/push/register", {
|
|
113
|
-
method: "POST",
|
|
114
|
-
headers: { "Content-Type": "application/json" },
|
|
115
|
-
body: JSON.stringify({ uid: cometchatUid, platform: "ios", token }),
|
|
116
|
-
});
|
|
117
|
-
});
|
|
118
|
-
VoipPushNotification.registerVoipToken();
|
|
119
|
-
} else {
|
|
120
|
-
const token = await messaging().getToken();
|
|
121
|
-
await fetch("/api/push/register", {
|
|
122
|
-
method: "POST",
|
|
123
|
-
headers: { "Content-Type": "application/json" },
|
|
124
|
-
body: JSON.stringify({ uid: cometchatUid, platform: "android", token }),
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
Server stores tokens keyed by `(cometchatUid, platform)`. On logout, call `/api/push/unregister` to clean up.
|
|
131
|
-
|
|
132
|
-
---
|
|
133
|
-
|
|
134
|
-
## Token rotation
|
|
135
|
-
|
|
136
|
-
Both PushKit and FCM tokens can rotate without warning (OS upgrades, app reinstalls, expirations).
|
|
137
|
-
|
|
138
|
-
- iOS PushKit: handle `didInvalidatePushToken` and re-register
|
|
139
|
-
- FCM: handle `messaging().onTokenRefresh` and re-register
|
|
140
|
-
|
|
141
|
-
```ts
|
|
142
|
-
// iOS
|
|
143
|
-
VoipPushNotification.addEventListener("didInvalidatePushToken", async () => {
|
|
144
|
-
// wait for next register event, will fire automatically
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
// Android
|
|
148
|
-
messaging().onTokenRefresh(async (newToken) => {
|
|
149
|
-
await fetch("/api/push/register", {
|
|
150
|
-
method: "POST",
|
|
151
|
-
body: JSON.stringify({ uid: getCurrentUid(), platform: "android", token: newToken }),
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
---
|
|
157
|
-
|
|
158
|
-
## Webhook verification
|
|
159
|
-
|
|
160
|
-
CometChat signs webhooks. Verify the signature before trusting payloads:
|
|
161
|
-
|
|
162
|
-
```ts
|
|
163
|
-
import crypto from "crypto";
|
|
164
|
-
|
|
165
|
-
app.post("/webhook/cometchat/call-received", (req, res, next) => {
|
|
166
|
-
const signature = req.header("x-cometchat-signature");
|
|
167
|
-
const expected = crypto
|
|
168
|
-
.createHmac("sha256", process.env.COMETCHAT_WEBHOOK_SECRET!)
|
|
169
|
-
.update(JSON.stringify(req.body))
|
|
170
|
-
.digest("hex");
|
|
171
|
-
if (signature !== expected) return res.status(401).send({ error: "invalid signature" });
|
|
172
|
-
next();
|
|
173
|
-
});
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
Without this, anyone with your endpoint URL can ring your users.
|
|
177
|
-
|
|
178
|
-
---
|
|
179
|
-
|
|
180
|
-
## Rate limits
|
|
181
|
-
|
|
182
|
-
- **APNs:** 4000 notifications/sec per cert. Far above what an app needs for VoIP.
|
|
183
|
-
- **FCM:** 1000 tokens per `send()` call (use `sendMulticast` for batches). Per-token rate limits not enforced strictly.
|
|
184
|
-
|
|
185
|
-
For one-call-at-a-time semantics, you won't hit either. For broadcast scenarios (multi-party "ring everyone"), batch sends instead of looping `send()`.
|
|
186
|
-
|
|
187
|
-
---
|
|
188
|
-
|
|
189
|
-
## Testing the server locally
|
|
190
|
-
|
|
191
|
-
ngrok the webhook endpoint to a public URL, register it in CometChat dashboard. Two real devices (one iOS, one Android) on real networks. Trigger a call from device A to device B; watch the server logs for the webhook fire and the push send.
|
|
192
|
-
|
|
193
|
-
For unit tests, mock the apn + firebase-admin modules. Don't try to test real APNs/FCM in CI — certs and rate limits make it hostile.
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
# Share invite on React Native
|
|
2
|
-
|
|
3
|
-
Same SDK API as web. RN-specific: use the platform's native share sheet via `Share.share()` (built into RN) or `react-native-share` for richer options.
|
|
4
|
-
|
|
5
|
-
**Canonical docs:** https://www.cometchat.com/docs/calls/react-native/share-invite
|
|
6
|
-
**Read first:** `cometchat-react-calls/references/share-invite.md` — deep-link routing rule + dialog UX.
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## Hard rule: deep-link routing
|
|
11
|
-
|
|
12
|
-
Same rule as web. Configure your app's URL scheme + universal/app links so `https://yourapp.com/call/:sessionId` opens the app:
|
|
13
|
-
|
|
14
|
-
```tsx
|
|
15
|
-
// App.tsx — react-navigation linking config
|
|
16
|
-
const linking = {
|
|
17
|
-
prefixes: ["https://yourapp.com", "yourapp://"],
|
|
18
|
-
config: {
|
|
19
|
-
screens: {
|
|
20
|
-
Call: "call/:sessionId",
|
|
21
|
-
},
|
|
22
|
-
},
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
<NavigationContainer linking={linking}>
|
|
26
|
-
{/* ... */}
|
|
27
|
-
</NavigationContainer>
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
iOS: configure Associated Domains entitlement.
|
|
31
|
-
Android: add `<intent-filter>` with `android:autoVerify="true"` to `AndroidManifest.xml`.
|
|
32
|
-
|
|
33
|
-
Without these, share-invite URLs land in browser, not the app.
|
|
34
|
-
|
|
35
|
-
---
|
|
36
|
-
|
|
37
|
-
## SDK API
|
|
38
|
-
|
|
39
|
-
```ts
|
|
40
|
-
import { CometChatCalls } from "@cometchat/calls-sdk-react-native";
|
|
41
|
-
|
|
42
|
-
// SessionSettings OBJECT field — there is NO setHideShareInviteButton builder method:
|
|
43
|
-
const callSettings = {
|
|
44
|
-
hideShareInviteButton: false,
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
useEffect(() => {
|
|
48
|
-
const handler = () => shareCallInvite(sessionId);
|
|
49
|
-
// addEventListener returns the unsubscribe fn — call it on cleanup.
|
|
50
|
-
const off = CometChatCalls.addEventListener("onShareInviteButtonClicked", handler);
|
|
51
|
-
return () => off();
|
|
52
|
-
}, [sessionId]);
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
---
|
|
56
|
-
|
|
57
|
-
## Native share sheet
|
|
58
|
-
|
|
59
|
-
RN ships `Share` from `react-native`:
|
|
60
|
-
|
|
61
|
-
```tsx
|
|
62
|
-
import { Share, Platform } from "react-native";
|
|
63
|
-
|
|
64
|
-
async function shareCallInvite(sessionId: string) {
|
|
65
|
-
const url = `https://yourapp.com/call/${sessionId}`;
|
|
66
|
-
const message = "I'm on a call — tap to join.";
|
|
67
|
-
|
|
68
|
-
try {
|
|
69
|
-
const result = await Share.share({
|
|
70
|
-
url: Platform.OS === "ios" ? url : undefined, // iOS prefers `url`
|
|
71
|
-
message: Platform.OS === "android" ? `${message}\n${url}` : message,
|
|
72
|
-
title: "Join my call", // Android only
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
if (result.action === Share.dismissedAction) {
|
|
76
|
-
// User cancelled — silent
|
|
77
|
-
}
|
|
78
|
-
} catch (err) {
|
|
79
|
-
console.warn("Share failed", err);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
`Share.share` opens iOS UIActivityViewController and Android's chooser intent. For both: pass `url` on iOS (separate field), append URL to `message` on Android (the `url` field is iOS-only).
|
|
85
|
-
|
|
86
|
-
---
|
|
87
|
-
|
|
88
|
-
## Clipboard fallback
|
|
89
|
-
|
|
90
|
-
```tsx
|
|
91
|
-
import Clipboard from "@react-native-clipboard/clipboard";
|
|
92
|
-
import { Alert } from "react-native";
|
|
93
|
-
|
|
94
|
-
async function copyLink(url: string) {
|
|
95
|
-
Clipboard.setString(url);
|
|
96
|
-
Alert.alert("Copied", "Call link copied to clipboard");
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
Most apps don't need this — `Share.share` always succeeds, even if no targets are available it shows the system "no apps installed" toast. Clipboard is a nice-to-have alongside the share sheet, not a fallback.
|
|
101
|
-
|
|
102
|
-
---
|
|
103
|
-
|
|
104
|
-
## react-native-share for richer UX
|
|
105
|
-
|
|
106
|
-
For per-channel buttons (just WhatsApp, just SMS, etc.):
|
|
107
|
-
|
|
108
|
-
```tsx
|
|
109
|
-
import Share from "react-native-share";
|
|
110
|
-
|
|
111
|
-
await Share.shareSingle({
|
|
112
|
-
social: Share.Social.WHATSAPP,
|
|
113
|
-
message: "Join my call",
|
|
114
|
-
url: callLink,
|
|
115
|
-
});
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
Use only if your UX requires it. Native share sheet is usually enough.
|
|
119
|
-
|
|
120
|
-
---
|
|
121
|
-
|
|
122
|
-
## Anti-patterns
|
|
123
|
-
|
|
124
|
-
Web sister rules apply, plus RN-specific:
|
|
125
|
-
|
|
126
|
-
1. **Setting `url` on Android Share.share.** Android ignores it; URL doesn't appear in shared content. Concat to `message` instead.
|
|
127
|
-
2. **No deep-link config.** URL opens in browser → web fallback or 404.
|
|
128
|
-
3. **Sharing without `await`.** Caller doesn't know if the user cancelled, success messaging fires for cancelled shares.
|
|
129
|
-
|
|
130
|
-
---
|
|
131
|
-
|
|
132
|
-
## Verification checklist
|
|
133
|
-
|
|
134
|
-
- [ ] `react-navigation` `linking` config maps `/call/:sessionId`
|
|
135
|
-
- [ ] Universal links (iOS) + auto-verified app links (Android) configured
|
|
136
|
-
- [ ] `Share.share` URL field passed on iOS, concat'd to message on Android
|
|
137
|
-
- [ ] Listener cleaned up on unmount
|
|
138
|
-
- [ ] Real-device smoke: share via WhatsApp/Messages → tap → opens your app at the call
|
|
139
|
-
|
|
140
|
-
---
|
|
141
|
-
|
|
142
|
-
## Pointers
|
|
143
|
-
|
|
144
|
-
- `cometchat-react-calls/references/share-invite.md` — sister
|
|
145
|
-
- `cometchat-native-calls` SKILL.md
|
|
146
|
-
- Canonical docs: https://www.cometchat.com/docs/calls/react-native/share-invite
|