@cometchat/skills 4.4.2 → 5.0.0
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 +36 -0
- package/LICENSE +21 -0
- package/README.md +41 -163
- package/RULES.md +114 -0
- package/bin/cometchat-skills.mjs +1180 -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 +151 -74
- package/peers.yaml +312 -0
- package/registry/README.md +31 -0
- package/registry/android-calls-v5.json +54 -0
- package/registry/android-v6.json +137 -0
- package/registry/angular-v5.json +114 -0
- package/registry/flutter-calls-v5.json +54 -0
- package/registry/flutter-v6.json +119 -0
- package/registry/ios-calls-v5.json +59 -0
- package/registry/ios-v5.json +97 -0
- package/registry/rn-calls-v5.json +59 -0
- package/registry/rn-v5.json +129 -0
- package/registry/sdk-android-v5.json +53 -0
- package/registry/sdk-jsv4.json +53 -0
- package/registry/web-calls-v5.json +54 -0
- package/registry/web-v7.json +99 -0
- package/skills/cometchat/SKILL.md +42 -2096
- 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 +40 -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 +101 -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-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 +131 -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 +58 -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-ios-calls/SKILL.md +112 -563
- package/skills/cometchat-ios-components/SKILL.md +44 -834
- package/skills/cometchat-ios-core/SKILL.md +181 -1068
- package/skills/cometchat-ios-core/references/anti-patterns.md +80 -0
- package/skills/cometchat-ios-core/references/docs-map.md +123 -0
- package/skills/cometchat-ios-core/references/install.md +23 -0
- package/skills/cometchat-ios-core/references/layout.md +186 -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-push/SKILL.md +24 -602
- 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-onboarding/SKILL.md +89 -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 +90 -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 +313 -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 +126 -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 +78 -0
- package/skills/cometchat-react-native-push/SKILL.md +88 -0
- package/skills/cometchat-react-native-sdk/SKILL.md +126 -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 +116 -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/i18n-rtl-a11y.md +22 -0
- package/skills/cometchat-react-v7-core/references/layout.md +158 -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-core/references/troubleshooting.md +28 -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-push/SKILL.md +53 -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 +909 -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 +130 -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-a11y/SKILL.md +0 -477
- 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-i18n/SKILL.md +0 -419
- 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-production/SKILL.md +0 -738
- package/skills/cometchat-ios-testing/SKILL.md +0 -376
- package/skills/cometchat-ios-theming/SKILL.md +0 -667
- package/skills/cometchat-ios-troubleshooting/SKILL.md +0 -1003
- 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,154 +0,0 @@
|
|
|
1
|
-
# Device management on Angular
|
|
2
|
-
|
|
3
|
-
Same JS SDK as web. Angular wraps device-list state in a service with RxJS observables.
|
|
4
|
-
|
|
5
|
-
**Canonical docs:** https://www.cometchat.com/docs/calls/javascript/device-management
|
|
6
|
-
**Read first:** `cometchat-react-calls/references/device-management.md` — pre-call picker + empty-label gotcha.
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## Service-driven device lists
|
|
11
|
-
|
|
12
|
-
```ts
|
|
13
|
-
import { Injectable, NgZone, OnDestroy } from "@angular/core";
|
|
14
|
-
import { BehaviorSubject } from "rxjs";
|
|
15
|
-
import { CometChatCalls } from "@cometchat/calls-sdk-javascript";
|
|
16
|
-
|
|
17
|
-
// SDK returns standard DOM MediaDeviceInfo objects — use `.deviceId`, NOT `.id`.
|
|
18
|
-
|
|
19
|
-
@Injectable({ providedIn: "root" })
|
|
20
|
-
export class CallDevicesService implements OnDestroy {
|
|
21
|
-
readonly mics$ = new BehaviorSubject<MediaDeviceInfo[]>([]);
|
|
22
|
-
readonly cameras$ = new BehaviorSubject<MediaDeviceInfo[]>([]);
|
|
23
|
-
readonly speakers$ = new BehaviorSubject<MediaDeviceInfo[]>([]);
|
|
24
|
-
|
|
25
|
-
// addEventListener returns an unsubscribe fn — there is NO CometChatCalls.removeEventListener.
|
|
26
|
-
private offs: Array<() => void> = [];
|
|
27
|
-
|
|
28
|
-
constructor(private zone: NgZone) {
|
|
29
|
-
// Valid device-change event keys (plural = full updated list):
|
|
30
|
-
this.offs.push(
|
|
31
|
-
CometChatCalls.addEventListener("onAudioInputDevicesChanged", () => {
|
|
32
|
-
this.zone.run(() => this.refresh());
|
|
33
|
-
}),
|
|
34
|
-
CometChatCalls.addEventListener("onAudioOutputDevicesChanged", () => {
|
|
35
|
-
this.zone.run(() => this.refresh());
|
|
36
|
-
}),
|
|
37
|
-
CometChatCalls.addEventListener("onVideoInputDevicesChanged", () => {
|
|
38
|
-
this.zone.run(() => this.refresh());
|
|
39
|
-
}),
|
|
40
|
-
);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
async ensurePermission(): Promise<void> {
|
|
44
|
-
try {
|
|
45
|
-
const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true });
|
|
46
|
-
stream.getTracks().forEach(t => t.stop()); // immediately release; we just wanted permission
|
|
47
|
-
} catch {
|
|
48
|
-
// permission denied
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// Device getters are SYNCHRONOUS — they return arrays, not Promises. No await / Promise.all.
|
|
53
|
-
refresh(): void {
|
|
54
|
-
this.mics$.next(CometChatCalls.getAudioInputDevices());
|
|
55
|
-
this.cameras$.next(CometChatCalls.getVideoInputDevices());
|
|
56
|
-
this.speakers$.next(CometChatCalls.getAudioOutputDevices());
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Setters are SYNCHRONOUS void — no await. They take the deviceId string.
|
|
60
|
-
selectMic(deviceId: string): void {
|
|
61
|
-
CometChatCalls.setAudioInputDevice(deviceId);
|
|
62
|
-
}
|
|
63
|
-
selectCamera(deviceId: string): void {
|
|
64
|
-
CometChatCalls.setVideoInputDevice(deviceId);
|
|
65
|
-
}
|
|
66
|
-
selectSpeaker(deviceId: string): void {
|
|
67
|
-
CometChatCalls.setAudioOutputDevice(deviceId);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
ngOnDestroy(): void {
|
|
71
|
-
this.offs.forEach(off => off()); // call the captured unsubscribe fns
|
|
72
|
-
this.offs = [];
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
---
|
|
78
|
-
|
|
79
|
-
## Picker component
|
|
80
|
-
|
|
81
|
-
```ts
|
|
82
|
-
@Component({
|
|
83
|
-
selector: "app-device-picker",
|
|
84
|
-
template: `
|
|
85
|
-
<form (ngSubmit)="confirm()">
|
|
86
|
-
<label>Microphone
|
|
87
|
-
<select [(ngModel)]="selectedMic" name="mic">
|
|
88
|
-
<option *ngFor="let d of mics$ | async" [value]="d.deviceId">
|
|
89
|
-
{{ d.label || ('Mic ' + d.deviceId.substring(0, 6)) }}
|
|
90
|
-
</option>
|
|
91
|
-
</select>
|
|
92
|
-
</label>
|
|
93
|
-
<!-- camera + speaker selects same pattern -->
|
|
94
|
-
<button type="submit">Join call</button>
|
|
95
|
-
</form>
|
|
96
|
-
`,
|
|
97
|
-
})
|
|
98
|
-
export class DevicePickerComponent implements OnInit {
|
|
99
|
-
mics$ = this.devices.mics$;
|
|
100
|
-
cameras$ = this.devices.cameras$;
|
|
101
|
-
speakers$ = this.devices.speakers$;
|
|
102
|
-
selectedMic = "";
|
|
103
|
-
selectedCamera = "";
|
|
104
|
-
selectedSpeaker = "";
|
|
105
|
-
|
|
106
|
-
constructor(private devices: CallDevicesService) {}
|
|
107
|
-
|
|
108
|
-
async ngOnInit() {
|
|
109
|
-
await this.devices.ensurePermission(); // getUserMedia IS async
|
|
110
|
-
this.devices.refresh(); // device list reads are sync
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
confirm() {
|
|
114
|
-
if (this.selectedMic) this.devices.selectMic(this.selectedMic);
|
|
115
|
-
if (this.selectedCamera) this.devices.selectCamera(this.selectedCamera);
|
|
116
|
-
if (this.selectedSpeaker) this.devices.selectSpeaker(this.selectedSpeaker);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
---
|
|
122
|
-
|
|
123
|
-
## Anti-patterns
|
|
124
|
-
|
|
125
|
-
Web sister rules apply, plus Angular-specific:
|
|
126
|
-
|
|
127
|
-
1. **No `NgZone.run` wrap on the device-change events.** BehaviorSubject emits but UI doesn't update with OnPush.
|
|
128
|
-
2. **Service NOT provided in `root`.** Lazy-loaded → device events miss.
|
|
129
|
-
3. **`async pipe` not used.** Manual `subscribe` without `unsubscribe` leaks.
|
|
130
|
-
4. **`await`-ing the device getters/setters.** They are synchronous (`getAudioInputDevices()` returns `MediaDeviceInfo[]`; setters return `void`). `await` on them is a no-op that masks the real (sync) signature.
|
|
131
|
-
5. **Reading `device.id`.** The SDK returns DOM `MediaDeviceInfo` — the identifier is `device.deviceId`.
|
|
132
|
-
6. **Expecting `CometChatCalls.removeEventListener`.** It does not exist. `addEventListener` returns a `() => void`; capture and call it to clean up.
|
|
133
|
-
|
|
134
|
-
---
|
|
135
|
-
|
|
136
|
-
## Verification checklist
|
|
137
|
-
|
|
138
|
-
- [ ] `CallDevicesService` provided in root
|
|
139
|
-
- [ ] `NgZone.run` wraps the device-update events (`onAudioInputDevicesChanged` / `onAudioOutputDevicesChanged` / `onVideoInputDevicesChanged`)
|
|
140
|
-
- [ ] Listener unsubscribe fns captured and called in `ngOnDestroy` (no `removeEventListener`)
|
|
141
|
-
- [ ] Device getters/setters called WITHOUT `await` (they are sync); options use `device.deviceId`
|
|
142
|
-
- [ ] Picker uses `async` pipe (not manual subscribe)
|
|
143
|
-
- [ ] `ensurePermission()` called before `refresh()` (empty-label fix)
|
|
144
|
-
- [ ] Browser smoke: plug/unplug headphones during call → list updates
|
|
145
|
-
- [ ] Safari smoke: speaker picker hidden (Safari limitation)
|
|
146
|
-
|
|
147
|
-
---
|
|
148
|
-
|
|
149
|
-
## Pointers
|
|
150
|
-
|
|
151
|
-
- `cometchat-react-calls/references/device-management.md` — sister web reference
|
|
152
|
-
- `cometchat-angular-calls` SKILL.md
|
|
153
|
-
- `references/ngzone-and-async-callbacks.md` — NgZone primer
|
|
154
|
-
- Canonical docs: https://www.cometchat.com/docs/calls/javascript/device-management
|
|
@@ -1,433 +0,0 @@
|
|
|
1
|
-
# Group calls (meetings) on Angular
|
|
2
|
-
|
|
3
|
-
Angular wraps the same JS Calls SDK as React/Vue/Svelte; the SDK semantics are identical. The wiring differences are Angular-specific: NgZone for dominant-speaker updates, `@Input` / `@Output` patterns for participant components, OnPush + `markForCheck` for roster changes.
|
|
4
|
-
|
|
5
|
-
> **v5 event note.** `CometChatCalls.OngoingCallListener` is `@deprecated` in calls-sdk-javascript v5 (use `CometChatCalls.addEventListener(...)`). It still works for roster events (`onUserJoined` / `onUserLeft` / `onUserListUpdated` / `onCallEnded` / `onError`), but there is **no `onActiveSpeakerUpdated` callback on the listener** — the dominant-speaker signal is only available as the `addEventListener` event key `onDominantSpeakerChanged`. The examples below use `addEventListener` for dominant speaker and may keep the listener for roster events.
|
|
6
|
-
|
|
7
|
-
For SDK-level semantics — capacity limits, bandwidth scaling, moderator actions — see `cometchat-native-calls/references/group-calls.md`. This reference covers the Angular-specific patterns.
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Signaling architecture — meeting-message broadcast, NOT call ringing
|
|
12
|
-
|
|
13
|
-
**Critical to read first.** Group calls do NOT use the Ringing channel (`CometChat.initiateCall` → `onIncomingCallReceived`). That channel is **1:1 user calls only**. The kit broadcasts a **custom message of type `"meeting"`** to the group; receivers see a "Join meeting" card in their `<cometchat-message-list />` (kit Angular components) or need an explicit `MessageListener.onCustomMessageReceived` (custom UI — the common Angular path since many Angular apps build custom call surfaces).
|
|
14
|
-
|
|
15
|
-
Confirmed 2026-05-15 by direct test: Pixel 3 (kit-based RN, group call initiated) → Angular custom-UI app at `localhost:4200` (uid-5 in same group) → Angular received NOTHING because it only registered `CometChat.addCallListener`. Adding `CometChat.addMessageListener` filtering for `category === CATEGORY_CUSTOM && type === 'meeting'` fixed it.
|
|
16
|
-
|
|
17
|
-
```
|
|
18
|
-
Caller (uid-A, member of group-X) CometChat Receivers (members of group-X)
|
|
19
|
-
│ │ │
|
|
20
|
-
│ kit: <cometchat-call-buttons │ │
|
|
21
|
-
│ [group]="g"> │ │
|
|
22
|
-
│ — OR — custom Angular code: │ │
|
|
23
|
-
│ CometChat.sendCustomMessage( │ │
|
|
24
|
-
│ new CometChat.CustomMessage( │ │
|
|
25
|
-
│ guid, GROUP, "meeting", │ │
|
|
26
|
-
│ { callType, sessionId })) │ │
|
|
27
|
-
├─────────────────────────────────────────>│ │
|
|
28
|
-
│ │ onCustomMessageReceived │
|
|
29
|
-
│ ├─────────────────────────────>│ (each receiver's
|
|
30
|
-
│ │ │ MessageListener,
|
|
31
|
-
│ │ │ wrapped in NgZone.run)
|
|
32
|
-
│ ───── WebRTC session active (sessionId = group GUID) ───── │
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
| Channel | 1:1 user calls | Group calls |
|
|
36
|
-
|---|---|---|
|
|
37
|
-
| Signaling API (caller) | `CometChat.initiateCall(call)` | `CometChat.sendCustomMessage(meetingMessage)` with type="meeting" |
|
|
38
|
-
| Receiver event | `CallListener.onIncomingCallReceived` | `MessageListener.onCustomMessageReceived` (category=CATEGORY_CUSTOM + type="meeting") |
|
|
39
|
-
| Session ID | server-generated unique per call | the group's GUID (persistent) |
|
|
40
|
-
| Ring/decline semantics | yes — `CometChat.acceptCall` / `rejectCall` | no — receivers join or ignore |
|
|
41
|
-
| Auto-cancel timeout | yes (45s default) | no — meeting persists in chat history |
|
|
42
|
-
|
|
43
|
-
### Receiver — custom Angular UI: `CallStateService` extension
|
|
44
|
-
|
|
45
|
-
The canonical pattern in `cometchat-angular-calls/SKILL.md` puts call state in a `CallStateService`. Extend it with a `MessageListener` for group meetings:
|
|
46
|
-
|
|
47
|
-
```ts
|
|
48
|
-
// services/call-state.service.ts (extension)
|
|
49
|
-
import { Injectable, NgZone, inject, signal } from '@angular/core';
|
|
50
|
-
import { CometChat } from '@cometchat/chat-sdk-javascript';
|
|
51
|
-
|
|
52
|
-
const GROUP_MEETING_LISTENER_ID = 'app-root-group-meeting-listener';
|
|
53
|
-
|
|
54
|
-
@Injectable({ providedIn: 'root' })
|
|
55
|
-
export class CallStateService {
|
|
56
|
-
private readonly zone = inject(NgZone);
|
|
57
|
-
|
|
58
|
-
// existing signals: phase, statusMessage, errorMessage, incoming, ...
|
|
59
|
-
readonly incomingMeeting = signal<{
|
|
60
|
-
sessionId: string;
|
|
61
|
-
callType: 'audio' | 'video';
|
|
62
|
-
fromUid: string;
|
|
63
|
-
groupGuid: string;
|
|
64
|
-
} | null>(null);
|
|
65
|
-
|
|
66
|
-
start(): void {
|
|
67
|
-
// existing CometChat.addCallListener (1:1 user calls)
|
|
68
|
-
// ...
|
|
69
|
-
|
|
70
|
-
// NEW — addMessageListener for group meetings:
|
|
71
|
-
CometChat.addMessageListener(
|
|
72
|
-
GROUP_MEETING_LISTENER_ID,
|
|
73
|
-
new CometChat.MessageListener({
|
|
74
|
-
onCustomMessageReceived: (msg: any) => {
|
|
75
|
-
if (msg.getCategory?.() !== CometChat.CATEGORY_CUSTOM) return;
|
|
76
|
-
if (msg.getType?.() !== 'meeting') return;
|
|
77
|
-
const customData = msg.getCustomData?.() ?? {};
|
|
78
|
-
this.zone.run(() => {
|
|
79
|
-
this.incomingMeeting.set({
|
|
80
|
-
sessionId: customData.sessionId ?? msg.getReceiverId(),
|
|
81
|
-
callType: customData.callType ?? 'video',
|
|
82
|
-
fromUid: msg.getSender().getUid(),
|
|
83
|
-
groupGuid: msg.getReceiverId(),
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
},
|
|
87
|
-
}),
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
Then in your root template (next to where the 1:1 incoming-call overlay lives):
|
|
94
|
-
|
|
95
|
-
```html
|
|
96
|
-
@if (state.incomingMeeting(); as meeting) {
|
|
97
|
-
<app-incoming-meeting-overlay
|
|
98
|
-
[meeting]="meeting"
|
|
99
|
-
(joined)="state.acceptMeeting(meeting.sessionId, meeting.callType)"
|
|
100
|
-
(dismissed)="state.incomingMeeting.set(null)"
|
|
101
|
-
/>
|
|
102
|
-
}
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
### Why this matters specifically for Angular
|
|
106
|
-
|
|
107
|
-
Angular apps disproportionately build custom call UI (raw SDK + their own component templates) rather than dropping in `<cometchat-call-buttons>` / `<cometchat-incoming-call>` selectors. The Angular UI Kit is less prevalent than React's UI Kit. So **most Angular customers hit this gap** if they only follow the 1:1 ringing-integration guidance.
|
|
108
|
-
|
|
109
|
-
The two listeners (`addCallListener` for user channel + `addMessageListener` for meeting channel) MUST coexist in any Angular app that supports both 1:1 and group calling. Wire both in `CallStateService.start()` and tear both down in `ngOnDestroy` / hangup.
|
|
110
|
-
|
|
111
|
-
---
|
|
112
|
-
|
|
113
|
-
## Initiating a group call
|
|
114
|
-
|
|
115
|
-
```ts
|
|
116
|
-
// services/group-call.service.ts
|
|
117
|
-
import { Injectable } from "@angular/core";
|
|
118
|
-
import { CometChat } from "@cometchat/chat-sdk-javascript";
|
|
119
|
-
|
|
120
|
-
@Injectable({ providedIn: "root" })
|
|
121
|
-
export class GroupCallService {
|
|
122
|
-
async initiate(guid: string, callType: "voice" | "video"): Promise<unknown> {
|
|
123
|
-
const group = await CometChat.getGroup(guid);
|
|
124
|
-
const cometchatType = callType === "video"
|
|
125
|
-
? CometChat.CALL_TYPE.VIDEO
|
|
126
|
-
: CometChat.CALL_TYPE.AUDIO;
|
|
127
|
-
const call = new CometChat.Call(group.getGuid(), cometchatType, CometChat.RECEIVER_TYPE.GROUP);
|
|
128
|
-
return CometChat.initiateCall(call);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
The receiver is the GROUP (`RECEIVER_TYPE.GROUP`) — anyone in the group can `acceptCall` until the call ends.
|
|
134
|
-
|
|
135
|
-
---
|
|
136
|
-
|
|
137
|
-
## Roster + active-speaker — NgZone-aware
|
|
138
|
-
|
|
139
|
-
The SDK's `OngoingCallListener` callbacks fire outside Angular's zone. Wrap with `NgZone.run` (general rule from `references/ngzone-and-async-callbacks.md`):
|
|
140
|
-
|
|
141
|
-
```ts
|
|
142
|
-
@Component({
|
|
143
|
-
selector: "app-group-call",
|
|
144
|
-
template: `
|
|
145
|
-
<div class="spotlight">
|
|
146
|
-
<app-participant-tile *ngIf="activeSpeaker" [participant]="activeSpeaker" [size]="'large'"></app-participant-tile>
|
|
147
|
-
</div>
|
|
148
|
-
<div class="strip">
|
|
149
|
-
<app-participant-tile
|
|
150
|
-
*ngFor="let p of others; trackBy: trackByUid"
|
|
151
|
-
[participant]="p"
|
|
152
|
-
[size]="'small'">
|
|
153
|
-
</app-participant-tile>
|
|
154
|
-
</div>
|
|
155
|
-
`,
|
|
156
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
157
|
-
})
|
|
158
|
-
export class GroupCallComponent implements OnInit, OnDestroy {
|
|
159
|
-
participants: Participant[] = [];
|
|
160
|
-
activeSpeaker: Participant | null = null;
|
|
161
|
-
others: Participant[] = [];
|
|
162
|
-
|
|
163
|
-
constructor(private zone: NgZone, private cd: ChangeDetectorRef) {}
|
|
164
|
-
|
|
165
|
-
private offSpeaker?: () => void;
|
|
166
|
-
|
|
167
|
-
ngOnInit() {
|
|
168
|
-
// Roster via the (deprecated but functional) OngoingCallListener:
|
|
169
|
-
const listener = new CometChatCalls.OngoingCallListener({
|
|
170
|
-
onUserListUpdated: (users: Participant[]) => {
|
|
171
|
-
this.zone.run(() => {
|
|
172
|
-
this.participants = users;
|
|
173
|
-
this.recomputeLayout();
|
|
174
|
-
this.cd.markForCheck(); // OnPush — must mark
|
|
175
|
-
});
|
|
176
|
-
},
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
// Dominant speaker is NOT a listener callback — subscribe via addEventListener.
|
|
180
|
-
// addEventListener returns an unsubscribe fn (there is no removeEventListener).
|
|
181
|
-
this.offSpeaker = CometChatCalls.addEventListener(
|
|
182
|
-
"onDominantSpeakerChanged",
|
|
183
|
-
(participant: { uid: string }) => {
|
|
184
|
-
this.zone.run(() => {
|
|
185
|
-
// Debounce — see "Debouncing dominant-speaker" below
|
|
186
|
-
this.scheduleSpeakerSwap(participant.uid);
|
|
187
|
-
});
|
|
188
|
-
},
|
|
189
|
-
);
|
|
190
|
-
// ... pass a SessionSettings object + call token to CometChatCalls.joinSession ...
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
ngOnDestroy() {
|
|
194
|
-
this.offSpeaker?.();
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
trackByUid(_: number, p: Participant) {
|
|
198
|
-
return p.uid;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
private recomputeLayout() {
|
|
202
|
-
const localUid = this.getLocalUid();
|
|
203
|
-
const remote = this.participants.filter(p => p.uid !== localUid);
|
|
204
|
-
this.activeSpeaker = remote.find(p => p.uid === this.activeSpeakerUid) ?? remote[0] ?? null;
|
|
205
|
-
this.others = remote.filter(p => p.uid !== this.activeSpeaker?.uid);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
private speakerSwapTimeout: ReturnType<typeof setTimeout> | null = null;
|
|
209
|
-
private activeSpeakerUid: string | null = null;
|
|
210
|
-
private scheduleSpeakerSwap(uid: string) {
|
|
211
|
-
if (this.speakerSwapTimeout) clearTimeout(this.speakerSwapTimeout);
|
|
212
|
-
this.speakerSwapTimeout = setTimeout(() => {
|
|
213
|
-
this.zone.run(() => {
|
|
214
|
-
this.activeSpeakerUid = uid;
|
|
215
|
-
this.recomputeLayout();
|
|
216
|
-
this.cd.markForCheck();
|
|
217
|
-
});
|
|
218
|
-
}, 500);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
`trackByUid` is critical — without it, every roster update re-creates every tile, which destroys the WebRTC video track each time. The roster jitters and call quality degrades.
|
|
224
|
-
|
|
225
|
-
---
|
|
226
|
-
|
|
227
|
-
## Debouncing dominant-speaker
|
|
228
|
-
|
|
229
|
-
Same rule as RN — `onDominantSpeakerChanged` can fire many times per second in a noisy call. Debounce to 500ms minimum:
|
|
230
|
-
|
|
231
|
-
```ts
|
|
232
|
-
private speakerSwapTimeout: ReturnType<typeof setTimeout> | null = null;
|
|
233
|
-
|
|
234
|
-
scheduleSpeakerSwap(uid: string) {
|
|
235
|
-
if (this.speakerSwapTimeout) clearTimeout(this.speakerSwapTimeout);
|
|
236
|
-
this.speakerSwapTimeout = setTimeout(() => {
|
|
237
|
-
this.zone.run(() => {
|
|
238
|
-
this.activeSpeakerUid = uid;
|
|
239
|
-
this.recomputeLayout();
|
|
240
|
-
this.cd.markForCheck();
|
|
241
|
-
});
|
|
242
|
-
}, 500);
|
|
243
|
-
}
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
Or use RxJS:
|
|
247
|
-
|
|
248
|
-
```ts
|
|
249
|
-
import { Subject } from "rxjs";
|
|
250
|
-
import { debounceTime } from "rxjs/operators";
|
|
251
|
-
|
|
252
|
-
private speakerSubject = new Subject<string>();
|
|
253
|
-
|
|
254
|
-
ngOnInit() {
|
|
255
|
-
this.speakerSubject.pipe(debounceTime(500)).subscribe((uid) => {
|
|
256
|
-
this.zone.run(() => { this.activeSpeakerUid = uid; this.recomputeLayout(); this.cd.markForCheck(); });
|
|
257
|
-
});
|
|
258
|
-
|
|
259
|
-
// Dominant speaker comes from addEventListener, not the listener object:
|
|
260
|
-
this.offSpeaker = CometChatCalls.addEventListener(
|
|
261
|
-
"onDominantSpeakerChanged",
|
|
262
|
-
(participant: { uid: string }) => this.speakerSubject.next(participant.uid),
|
|
263
|
-
);
|
|
264
|
-
}
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
---
|
|
268
|
-
|
|
269
|
-
## Moderator actions — guarded by group scope
|
|
270
|
-
|
|
271
|
-
The v5 SDK exposes **`CometChatCalls.muteParticipant(participantId)`** (sync, void) — there is
|
|
272
|
-
no `muteUser` / `removeUser`. **There is NO kick/remove-participant API in the JS Calls SDK** —
|
|
273
|
-
removal must be done at the chat layer (e.g. `CometChat.kickGroupMember`), not via the Calls SDK.
|
|
274
|
-
|
|
275
|
-
```ts
|
|
276
|
-
// In your component or a CallControlsService
|
|
277
|
-
muteParticipant(participantId: string) {
|
|
278
|
-
if (!this.canModerate()) return;
|
|
279
|
-
CometChatCalls.muteParticipant(participantId); // sync, void — no await
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
muteAll() {
|
|
283
|
-
if (!this.canModerate()) return;
|
|
284
|
-
for (const p of this.others) {
|
|
285
|
-
CometChatCalls.muteParticipant(p.uid);
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
// NOTE: no kick/remove API exists in @cometchat/calls-sdk-javascript.
|
|
290
|
-
// To eject someone, remove them from the group via the Chat SDK
|
|
291
|
-
// (CometChat.kickGroupMember(...)) — they then lose access to the session.
|
|
292
|
-
|
|
293
|
-
private canModerate(): boolean {
|
|
294
|
-
const scope = this.group?.getScope();
|
|
295
|
-
return scope === "admin" || scope === "moderator";
|
|
296
|
-
}
|
|
297
|
-
```
|
|
298
|
-
|
|
299
|
-
Hide the moderator-only buttons in the template:
|
|
300
|
-
|
|
301
|
-
```html
|
|
302
|
-
<div *ngIf="canModerate()" class="moderator-controls">
|
|
303
|
-
<button (click)="muteAll()">Mute all</button>
|
|
304
|
-
<button (click)="muteParticipant(p.uid)" *ngFor="let p of others">Mute</button>
|
|
305
|
-
</div>
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
---
|
|
309
|
-
|
|
310
|
-
## Capacity-error handling
|
|
311
|
-
|
|
312
|
-
```ts
|
|
313
|
-
const listener = new CometChatCalls.OngoingCallListener({
|
|
314
|
-
onError: (error: { code: string; message: string }) => {
|
|
315
|
-
this.zone.run(() => {
|
|
316
|
-
if (error.code === "ERR_CALL_FULL") {
|
|
317
|
-
this.snackBar.open("This meeting is full.", "Dismiss", { duration: 5000 });
|
|
318
|
-
} else if (error.code === "ERR_NOT_GROUP_MEMBER") {
|
|
319
|
-
this.snackBar.open("You're not a member of this group.", "Dismiss", { duration: 5000 });
|
|
320
|
-
} else {
|
|
321
|
-
this.snackBar.open(`Call error: ${error.message}`, "Dismiss", { duration: 5000 });
|
|
322
|
-
}
|
|
323
|
-
});
|
|
324
|
-
},
|
|
325
|
-
});
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
Material's `MatSnackBar` is the canonical Angular surface for transient errors — pick whatever the project uses.
|
|
329
|
-
|
|
330
|
-
---
|
|
331
|
-
|
|
332
|
-
## Bandwidth + battery — auto-downgrade to audio-only
|
|
333
|
-
|
|
334
|
-
Angular doesn't have a first-party battery API, but `BatteryManager` works in browsers (deprecated but functional in Chrome/Edge):
|
|
335
|
-
|
|
336
|
-
```ts
|
|
337
|
-
async observeBattery() {
|
|
338
|
-
if ("getBattery" in navigator) {
|
|
339
|
-
const battery = await (navigator as unknown as { getBattery: () => Promise<{ level: number; addEventListener: (e: string, h: () => void) => void }> }).getBattery();
|
|
340
|
-
|
|
341
|
-
const check = () => {
|
|
342
|
-
if (battery.level < 0.2 && this.callActive) {
|
|
343
|
-
this.zone.run(() => {
|
|
344
|
-
CometChatCalls.pauseVideo(); // no-arg in v5 (pauses local video)
|
|
345
|
-
this.snackBar.open("Video paused — low battery", "Dismiss", { duration: 5000 });
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
|
-
};
|
|
349
|
-
battery.addEventListener("levelchange", check);
|
|
350
|
-
check();
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
```
|
|
354
|
-
|
|
355
|
-
Firefox + Safari don't have `getBattery()` — gracefully skip. For mobile-web users, network-quality detection (Network Information API) is more reliable.
|
|
356
|
-
|
|
357
|
-
---
|
|
358
|
-
|
|
359
|
-
## Joining a group call already in progress
|
|
360
|
-
|
|
361
|
-
Angular `Resolver` for the group-detail route can pre-check active call state:
|
|
362
|
-
|
|
363
|
-
```ts
|
|
364
|
-
@Injectable({ providedIn: "root" })
|
|
365
|
-
export class GroupCallStateResolver implements Resolve<{ activeCall: unknown | null }> {
|
|
366
|
-
async resolve(route: ActivatedRouteSnapshot): Promise<{ activeCall: unknown | null }> {
|
|
367
|
-
const activeCall = await CometChat.getActiveCall();
|
|
368
|
-
return {
|
|
369
|
-
activeCall: activeCall && activeCall.getReceiverType() === "group"
|
|
370
|
-
? activeCall
|
|
371
|
-
: null,
|
|
372
|
-
};
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
```
|
|
376
|
-
|
|
377
|
-
Wire on the route:
|
|
378
|
-
|
|
379
|
-
```ts
|
|
380
|
-
{
|
|
381
|
-
path: "groups/:guid",
|
|
382
|
-
component: GroupDetailComponent,
|
|
383
|
-
resolve: { callState: GroupCallStateResolver },
|
|
384
|
-
}
|
|
385
|
-
```
|
|
386
|
-
|
|
387
|
-
In the component:
|
|
388
|
-
|
|
389
|
-
```ts
|
|
390
|
-
ngOnInit() {
|
|
391
|
-
const callState = this.route.snapshot.data["callState"];
|
|
392
|
-
if (callState.activeCall) {
|
|
393
|
-
// Show "Join meeting" button
|
|
394
|
-
this.activeCall = callState.activeCall;
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
```
|
|
398
|
-
|
|
399
|
-
---
|
|
400
|
-
|
|
401
|
-
## Anti-patterns
|
|
402
|
-
|
|
403
|
-
1. **Roster updates without `trackByUid`** in `*ngFor`. Tiles re-create; video tracks die.
|
|
404
|
-
2. **Skipping `markForCheck`** with OnPush. Roster updates don't render.
|
|
405
|
-
3. **No debounce on dominant-speaker.** Tiles jitter at 5+ Hz.
|
|
406
|
-
4. **Moderator buttons rendered for non-moderators.** SDK rejects but UI is misleading.
|
|
407
|
-
(Remember: only `muteParticipant` exists — there is no kick/remove in the Calls SDK.)
|
|
408
|
-
5. **`getBattery()` without feature detect.** Firefox/Safari throws.
|
|
409
|
-
6. **Leaving the call doesn't unsubscribe RxJS subjects.** Memory leak across multiple call sessions.
|
|
410
|
-
7. **Group call from a lazy-loaded module.** CallInitService must be eager (cf. `references/lazy-loading-pitfalls.md`).
|
|
411
|
-
|
|
412
|
-
---
|
|
413
|
-
|
|
414
|
-
## Verification checklist
|
|
415
|
-
|
|
416
|
-
- [ ] `*ngFor` over participants uses `trackBy: trackByUid`
|
|
417
|
-
- [ ] OnPush components call `cd.markForCheck()` on roster updates
|
|
418
|
-
- [ ] Dominant-speaker updates (via `addEventListener("onDominantSpeakerChanged", …)`) debounced ≥500ms
|
|
419
|
-
- [ ] All SDK callbacks wrapped in `zone.run`
|
|
420
|
-
- [ ] Moderator controls hidden for non-moderator scopes
|
|
421
|
-
- [ ] Capacity error handled (`ERR_CALL_FULL`) with user-facing snackbar
|
|
422
|
-
- [ ] Battery API feature-detected before use
|
|
423
|
-
- [ ] `Resolver` checks `getActiveCall()` on group route entry
|
|
424
|
-
- [ ] RxJS subscriptions cleaned up in `ngOnDestroy`
|
|
425
|
-
|
|
426
|
-
---
|
|
427
|
-
|
|
428
|
-
## Pointers
|
|
429
|
-
|
|
430
|
-
- `references/ngzone-and-async-callbacks.md` — NgZone primer
|
|
431
|
-
- `references/lazy-loading-pitfalls.md` — eager-load CallInitService rule
|
|
432
|
-
- `references/custom-ui.md` — multi-tile custom layouts
|
|
433
|
-
- `cometchat-native-calls/references/group-calls.md` — sister reference (same SDK, RN-flavored patterns; capacity/bandwidth/moderator actions covered there)
|