@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.
Files changed (490) hide show
  1. package/.claude-plugin/marketplace.json +55 -0
  2. package/.claude-plugin/plugin.json +14 -0
  3. package/CHANGELOG.md +36 -0
  4. package/LICENSE +21 -0
  5. package/README.md +41 -163
  6. package/RULES.md +114 -0
  7. package/bin/cometchat-skills.mjs +1180 -0
  8. package/bin/legacy-skills.json +95 -0
  9. package/catalogs/android-v6.json +1646 -0
  10. package/catalogs/flutter-v6.json +651 -0
  11. package/catalogs/ios-v5.json +1383 -0
  12. package/catalogs/rn-calls-v5.json +134 -0
  13. package/catalogs/rn-calls-v5.symbols.txt +58 -0
  14. package/catalogs/rn-sdk-v4.json +672 -0
  15. package/catalogs/rn-v5.json +449 -0
  16. package/catalogs/rn-v5.symbols.txt +216 -0
  17. package/catalogs/sdk-android-v5.json +514 -0
  18. package/contracts.android-calls-v5.json +122 -0
  19. package/contracts.android-v6.json +135 -0
  20. package/contracts.angular-v5.json +694 -0
  21. package/contracts.flutter-calls-v5.json +77 -0
  22. package/contracts.flutter-v6.json +126 -0
  23. package/contracts.ios-calls-v5.json +67 -0
  24. package/contracts.ios-v5.json +436 -0
  25. package/contracts.json +82 -0
  26. package/contracts.rn-calls-v5.json +77 -0
  27. package/contracts.rn-v5.json +727 -0
  28. package/contracts.sdk-android-v5.json +15 -0
  29. package/contracts.web-calls-v5.json +45 -0
  30. package/features.android-calls-v5.json +246 -0
  31. package/features.android-v6.json +65 -0
  32. package/features.angular-v5.json +521 -0
  33. package/features.flutter-calls-v5.json +286 -0
  34. package/features.flutter-v6.json +484 -0
  35. package/features.ios-calls-v5.json +236 -0
  36. package/features.ios-v5.json +573 -0
  37. package/features.json +61 -0
  38. package/features.rn-calls-v5.json +187 -0
  39. package/features.rn-v5.json +614 -0
  40. package/features.sdk-android-v5.json +40 -0
  41. package/features.sdk-jsv4.json +24 -0
  42. package/features.web-calls-v5.json +108 -0
  43. package/package.json +151 -74
  44. package/peers.yaml +312 -0
  45. package/registry/README.md +31 -0
  46. package/registry/android-calls-v5.json +54 -0
  47. package/registry/android-v6.json +137 -0
  48. package/registry/angular-v5.json +114 -0
  49. package/registry/flutter-calls-v5.json +54 -0
  50. package/registry/flutter-v6.json +119 -0
  51. package/registry/ios-calls-v5.json +59 -0
  52. package/registry/ios-v5.json +97 -0
  53. package/registry/rn-calls-v5.json +59 -0
  54. package/registry/rn-v5.json +129 -0
  55. package/registry/sdk-android-v5.json +53 -0
  56. package/registry/sdk-jsv4.json +53 -0
  57. package/registry/web-calls-v5.json +54 -0
  58. package/registry/web-v7.json +99 -0
  59. package/skills/cometchat/SKILL.md +42 -2096
  60. package/skills/cometchat-android-v5-calls-sdk/SKILL.md +206 -0
  61. package/skills/cometchat-android-v5-calls-sdk/references/build-truth.md +63 -0
  62. package/skills/cometchat-android-v5-calls-sdk/references/docs-map.md +119 -0
  63. package/skills/cometchat-android-v5-calls-sdk/references/method-map.md +53 -0
  64. package/skills/cometchat-android-v5-calls-sdk/references/pitfalls.md +72 -0
  65. package/skills/cometchat-android-v5-calls-sdk/references/ringing.md +92 -0
  66. package/skills/cometchat-android-v5-calls-sdk/references/user-switch.md +90 -0
  67. package/skills/cometchat-android-v5-sdk/SKILL.md +127 -0
  68. package/skills/cometchat-android-v5-sdk/references/app-surface.md +88 -0
  69. package/skills/cometchat-android-v5-sdk/references/docs-map.md +91 -0
  70. package/skills/cometchat-android-v6-builder-settings/SKILL.md +51 -137
  71. package/skills/cometchat-android-v6-calls/SKILL.md +128 -413
  72. package/skills/cometchat-android-v6-compose-components/SKILL.md +84 -194
  73. package/skills/cometchat-android-v6-compose-customization/SKILL.md +66 -411
  74. package/skills/cometchat-android-v6-compose-placement/SKILL.md +154 -237
  75. package/skills/cometchat-android-v6-core/SKILL.md +236 -672
  76. package/skills/cometchat-android-v6-core/references/anti-patterns.md +31 -0
  77. package/skills/cometchat-android-v6-core/references/component-props.md +168 -0
  78. package/skills/cometchat-android-v6-core/references/docs-map.md +153 -0
  79. package/skills/cometchat-android-v6-core/references/layout.md +112 -0
  80. package/skills/cometchat-android-v6-core/references/lifecycle.md +75 -0
  81. package/skills/cometchat-android-v6-core/references/setup-credentials.md +105 -0
  82. package/skills/cometchat-android-v6-core/references/troubleshooting.md +36 -0
  83. package/skills/cometchat-android-v6-events/SKILL.md +46 -184
  84. package/skills/cometchat-android-v6-extensions/SKILL.md +39 -179
  85. package/skills/cometchat-android-v6-features/SKILL.md +74 -143
  86. package/skills/cometchat-android-v6-kotlin-components/SKILL.md +75 -193
  87. package/skills/cometchat-android-v6-kotlin-customization/SKILL.md +67 -419
  88. package/skills/cometchat-android-v6-kotlin-placement/SKILL.md +77 -223
  89. package/skills/cometchat-android-v6-migration/SKILL.md +67 -378
  90. package/skills/cometchat-android-v6-production/SKILL.md +40 -179
  91. package/skills/cometchat-android-v6-push/SKILL.md +39 -289
  92. package/skills/cometchat-android-v6-testing/SKILL.md +50 -265
  93. package/skills/cometchat-android-v6-troubleshooting/SKILL.md +70 -254
  94. package/skills/cometchat-angular-v5-calls/SKILL.md +193 -0
  95. package/skills/cometchat-angular-v5-components/SKILL.md +131 -0
  96. package/skills/cometchat-angular-v5-components/references/catalog.md +111 -0
  97. package/skills/cometchat-angular-v5-components/references/host-composed.md +46 -0
  98. package/skills/cometchat-angular-v5-core/SKILL.md +300 -0
  99. package/skills/cometchat-angular-v5-core/references/anti-patterns.md +49 -0
  100. package/skills/cometchat-angular-v5-core/references/component-props.md +55 -0
  101. package/skills/cometchat-angular-v5-core/references/dependencies.md +66 -0
  102. package/skills/cometchat-angular-v5-core/references/docs-map.md +132 -0
  103. package/skills/cometchat-angular-v5-core/references/layout.md +64 -0
  104. package/skills/cometchat-angular-v5-core/references/lifecycle.md +202 -0
  105. package/skills/cometchat-angular-v5-core/references/setup-credentials.md +137 -0
  106. package/skills/cometchat-angular-v5-core/references/theming.md +70 -0
  107. package/skills/cometchat-angular-v5-core/references/troubleshooting.md +27 -0
  108. package/skills/cometchat-angular-v5-customization/SKILL.md +94 -0
  109. package/skills/cometchat-angular-v5-features/SKILL.md +107 -0
  110. package/skills/cometchat-angular-v5-features/references/custom-messages.md +133 -0
  111. package/skills/cometchat-angular-v5-features/references/formatters.md +28 -0
  112. package/skills/cometchat-angular-v5-features/references/host-composed-extensions.md +85 -0
  113. package/skills/cometchat-angular-v5-migration/SKILL.md +40 -0
  114. package/skills/cometchat-angular-v5-migration/references/migration-guide.md +165 -0
  115. package/skills/cometchat-angular-v5-patterns/SKILL.md +107 -0
  116. package/skills/cometchat-angular-v5-placement/SKILL.md +133 -0
  117. package/skills/cometchat-angular-v5-placement/references/combined-app.md +174 -0
  118. package/skills/cometchat-angular-v5-placement/references/core-surface.md +199 -0
  119. package/skills/cometchat-angular-v5-production/SKILL.md +101 -0
  120. package/skills/cometchat-angular-v5-push/SKILL.md +61 -0
  121. package/skills/cometchat-angular-v5-testing/SKILL.md +112 -0
  122. package/skills/cometchat-angular-v5-troubleshooting/SKILL.md +96 -0
  123. package/skills/cometchat-flutter-v5-sdk/SKILL.md +188 -0
  124. package/skills/cometchat-flutter-v5-sdk/references/doc-corrections.md +55 -0
  125. package/skills/cometchat-flutter-v5-sdk/references/docs-map.md +211 -0
  126. package/skills/cometchat-flutter-v5-sdk/references/platform-notes.md +48 -0
  127. package/skills/cometchat-flutter-v5-sdk/references/transcription.md +87 -0
  128. package/skills/cometchat-flutter-v6-calls/SKILL.md +75 -389
  129. package/skills/cometchat-flutter-v6-components/SKILL.md +88 -361
  130. package/skills/cometchat-flutter-v6-core/SKILL.md +154 -593
  131. package/skills/cometchat-flutter-v6-core/references/anti-patterns.md +55 -0
  132. package/skills/cometchat-flutter-v6-core/references/docs-map.md +143 -0
  133. package/skills/cometchat-flutter-v6-core/references/layout.md +45 -0
  134. package/skills/cometchat-flutter-v6-core/references/lifecycle.md +87 -0
  135. package/skills/cometchat-flutter-v6-core/references/setup-credentials.md +84 -0
  136. package/skills/cometchat-flutter-v6-core/references/troubleshooting.md +26 -0
  137. package/skills/cometchat-flutter-v6-customization/SKILL.md +70 -712
  138. package/skills/cometchat-flutter-v6-events/SKILL.md +79 -174
  139. package/skills/cometchat-flutter-v6-features/SKILL.md +55 -394
  140. package/skills/cometchat-flutter-v6-migration/SKILL.md +68 -367
  141. package/skills/cometchat-flutter-v6-migration/references/migration-guide.md +131 -0
  142. package/skills/cometchat-flutter-v6-patterns/SKILL.md +61 -0
  143. package/skills/cometchat-flutter-v6-placement/SKILL.md +94 -381
  144. package/skills/cometchat-flutter-v6-production/SKILL.md +58 -615
  145. package/skills/cometchat-flutter-v6-push/SKILL.md +46 -455
  146. package/skills/cometchat-flutter-v6-testing/SKILL.md +68 -299
  147. package/skills/cometchat-flutter-v6-troubleshooting/SKILL.md +54 -878
  148. package/skills/cometchat-ios-calls/SKILL.md +112 -563
  149. package/skills/cometchat-ios-components/SKILL.md +44 -834
  150. package/skills/cometchat-ios-core/SKILL.md +181 -1068
  151. package/skills/cometchat-ios-core/references/anti-patterns.md +80 -0
  152. package/skills/cometchat-ios-core/references/docs-map.md +123 -0
  153. package/skills/cometchat-ios-core/references/install.md +23 -0
  154. package/skills/cometchat-ios-core/references/layout.md +186 -0
  155. package/skills/cometchat-ios-core/references/setup-credentials.md +197 -0
  156. package/skills/cometchat-ios-core/references/swiftui.md +91 -0
  157. package/skills/cometchat-ios-core/references/troubleshooting.md +100 -0
  158. package/skills/cometchat-ios-customization/SKILL.md +33 -968
  159. package/skills/cometchat-ios-features/SKILL.md +29 -738
  160. package/skills/cometchat-ios-migration/SKILL.md +39 -0
  161. package/skills/cometchat-ios-placement/SKILL.md +51 -729
  162. package/skills/cometchat-ios-push/SKILL.md +24 -602
  163. package/skills/cometchat-ios-v5-sdk/SKILL.md +161 -0
  164. package/skills/cometchat-ios-v5-sdk/references/docs-map.md +326 -0
  165. package/skills/cometchat-js-v5-sdk/SKILL.md +95 -0
  166. package/skills/cometchat-js-v5-sdk/references/docs-map.md +114 -0
  167. package/skills/cometchat-onboarding/SKILL.md +89 -0
  168. package/skills/cometchat-onboarding/references/archetypes.md +51 -0
  169. package/skills/cometchat-onboarding/references/calling-first.md +77 -0
  170. package/skills/cometchat-onboarding/references/not-in-this-pack.md +8 -0
  171. package/skills/cometchat-onboarding/references/plan-artifact.md +133 -0
  172. package/skills/cometchat-onboarding/references/platforms.md +90 -0
  173. package/skills/cometchat-react-native-bare-patterns/SKILL.md +120 -0
  174. package/skills/cometchat-react-native-calls/SKILL.md +200 -0
  175. package/skills/cometchat-react-native-components/SKILL.md +142 -0
  176. package/skills/cometchat-react-native-core/SKILL.md +313 -0
  177. package/skills/cometchat-react-native-core/references/anti-patterns.md +79 -0
  178. package/skills/cometchat-react-native-core/references/component-props.md +105 -0
  179. package/skills/cometchat-react-native-core/references/dependencies.md +62 -0
  180. package/skills/cometchat-react-native-core/references/docs-map.md +126 -0
  181. package/skills/cometchat-react-native-core/references/layout.md +61 -0
  182. package/skills/cometchat-react-native-core/references/lifecycle.md +64 -0
  183. package/skills/cometchat-react-native-core/references/setup-credentials.md +39 -0
  184. package/skills/cometchat-react-native-customization/SKILL.md +198 -0
  185. package/skills/cometchat-react-native-expo-patterns/SKILL.md +116 -0
  186. package/skills/cometchat-react-native-features/SKILL.md +122 -0
  187. package/skills/cometchat-react-native-migration/SKILL.md +103 -0
  188. package/skills/cometchat-react-native-placement/SKILL.md +158 -0
  189. package/skills/cometchat-react-native-production/SKILL.md +78 -0
  190. package/skills/cometchat-react-native-push/SKILL.md +88 -0
  191. package/skills/cometchat-react-native-sdk/SKILL.md +126 -0
  192. package/skills/cometchat-react-native-sdk/references/method-map.md +239 -0
  193. package/skills/cometchat-react-native-sdk/references/page-map.md +96 -0
  194. package/skills/cometchat-react-native-testing/SKILL.md +94 -0
  195. package/skills/cometchat-react-native-troubleshooting/SKILL.md +116 -0
  196. package/skills/cometchat-react-native-v5-sdk/SKILL.md +150 -0
  197. package/skills/cometchat-react-native-v5-sdk/references/docs-map.md +127 -0
  198. package/skills/cometchat-react-native-v5-sdk/references/ringing-voip.md +369 -0
  199. package/skills/cometchat-react-v7-calls/SKILL.md +75 -0
  200. package/skills/cometchat-react-v7-components/SKILL.md +72 -0
  201. package/skills/cometchat-react-v7-core/SKILL.md +101 -0
  202. package/skills/cometchat-react-v7-core/references/anti-patterns.md +19 -0
  203. package/skills/cometchat-react-v7-core/references/component-props.md +82 -0
  204. package/skills/cometchat-react-v7-core/references/dependencies.md +23 -0
  205. package/skills/cometchat-react-v7-core/references/docs-map.md +117 -0
  206. package/skills/cometchat-react-v7-core/references/i18n-rtl-a11y.md +22 -0
  207. package/skills/cometchat-react-v7-core/references/layout.md +158 -0
  208. package/skills/cometchat-react-v7-core/references/lifecycle.md +74 -0
  209. package/skills/cometchat-react-v7-core/references/setup-credentials.md +58 -0
  210. package/skills/cometchat-react-v7-core/references/ssr.md +11 -0
  211. package/skills/cometchat-react-v7-core/references/theming.md +52 -0
  212. package/skills/cometchat-react-v7-core/references/troubleshooting.md +28 -0
  213. package/skills/cometchat-react-v7-customization/SKILL.md +84 -0
  214. package/skills/cometchat-react-v7-features/SKILL.md +92 -0
  215. package/skills/cometchat-react-v7-migration/SKILL.md +39 -0
  216. package/skills/cometchat-react-v7-migration/references/migration-guide.md +119 -0
  217. package/skills/cometchat-react-v7-patterns/SKILL.md +43 -0
  218. package/skills/cometchat-react-v7-placement/SKILL.md +106 -0
  219. package/skills/cometchat-react-v7-placement/references/recipes.md +354 -0
  220. package/skills/cometchat-react-v7-push/SKILL.md +53 -0
  221. package/test-suite/README.md +70 -0
  222. package/test-suite/catalogs/android-calls-v5.json +830 -0
  223. package/test-suite/catalogs/android-calls-v5.symbols.txt +499 -0
  224. package/test-suite/catalogs/android-v6.json +1646 -0
  225. package/test-suite/catalogs/android-v6.symbols.txt +298 -0
  226. package/test-suite/catalogs/angular-v5.json +7587 -0
  227. package/test-suite/catalogs/flutter-calls-v5.json +196 -0
  228. package/test-suite/catalogs/flutter-calls-v5.symbols.txt +59 -0
  229. package/test-suite/catalogs/flutter-v6.json +651 -0
  230. package/test-suite/catalogs/ios-calls-v5.json +158 -0
  231. package/test-suite/catalogs/ios-calls-v5.symbols.txt +70 -0
  232. package/test-suite/catalogs/ios-v5.json +1383 -0
  233. package/test-suite/catalogs/ios-v5.symbols.txt +699 -0
  234. package/test-suite/catalogs/rn-calls-v5.json +134 -0
  235. package/test-suite/catalogs/rn-sdk-v4.json +672 -0
  236. package/test-suite/catalogs/rn-v5.json +449 -0
  237. package/test-suite/catalogs/sdk-android-v5.json +514 -0
  238. package/test-suite/catalogs/sdk-android-v5.symbols.txt +254 -0
  239. package/test-suite/catalogs/sdk-jsv4.json +800 -0
  240. package/test-suite/catalogs/web-calls-v5.json +195 -0
  241. package/test-suite/catalogs/web-v7.json +1243 -0
  242. package/test-suite/scripts/build-registry.mjs +113 -0
  243. package/test-suite/scripts/catalog-refresh-dart.mjs +151 -0
  244. package/test-suite/scripts/catalog-refresh.mjs +100 -0
  245. package/test-suite/scripts/lint-skills.mjs +909 -0
  246. package/test-suite/scripts/measure-tokens.mjs +169 -0
  247. package/test-suite/scripts/typecheck-fences-dart.mjs +437 -0
  248. package/test-suite/scripts/typecheck-fences-kotlin.mjs +269 -0
  249. package/test-suite/scripts/typecheck-fences.mjs +206 -0
  250. package/test-suite/scripts/verify-catalog.mjs +242 -0
  251. package/test-suite/scripts/verify-contract-fences.mjs +94 -0
  252. package/test-suite/scripts/verify-detection.mjs +178 -0
  253. package/test-suite/scripts/verify-docs-base.mjs +91 -0
  254. package/test-suite/scripts/verify-family-agnostic.mjs +130 -0
  255. package/test-suite/scripts/verify-golden-path.mjs +138 -0
  256. package/test-suite/scripts/verify-oracle-components.mjs +133 -0
  257. package/test-suite/scripts/verify-template-bindings.mjs +148 -0
  258. package/test-suite/typecheck/angular-v5/package.json +21 -0
  259. package/test-suite/typecheck/angular-v5/tsconfig.json +21 -0
  260. package/test-suite/typecheck/flutter-v6/analysis_options.yaml +25 -0
  261. package/test-suite/typecheck/flutter-v6/pubspec.yaml +21 -0
  262. package/test-suite/typecheck/web-v7/package.json +18 -0
  263. package/test-suite/typecheck/web-v7/tsconfig.json +19 -0
  264. package/bin/install.js +0 -1003
  265. package/skills/.claude-plugin/marketplace.json +0 -86
  266. package/skills/cometchat/references/asking-questions.md +0 -48
  267. package/skills/cometchat-a11y/SKILL.md +0 -477
  268. package/skills/cometchat-android-v5/SKILL.md +0 -121
  269. package/skills/cometchat-android-v5-calls/SKILL.md +0 -429
  270. package/skills/cometchat-android-v5-calls/references/README.md +0 -53
  271. package/skills/cometchat-android-v5-calls/references/add-calls-to-existing-chat.md +0 -197
  272. package/skills/cometchat-android-v5-calls/references/audio-controls.md +0 -91
  273. package/skills/cometchat-android-v5-calls/references/background-handling.md +0 -168
  274. package/skills/cometchat-android-v5-calls/references/call-layouts.md +0 -131
  275. package/skills/cometchat-android-v5-calls/references/call-logs.md +0 -113
  276. package/skills/cometchat-android-v5-calls/references/call-session.md +0 -274
  277. package/skills/cometchat-android-v5-calls/references/custom-ui.md +0 -150
  278. package/skills/cometchat-android-v5-calls/references/event-listeners.md +0 -123
  279. package/skills/cometchat-android-v5-calls/references/group-calls.md +0 -205
  280. package/skills/cometchat-android-v5-calls/references/idle-timeout.md +0 -117
  281. package/skills/cometchat-android-v5-calls/references/in-call-chat.md +0 -134
  282. package/skills/cometchat-android-v5-calls/references/join-session.md +0 -120
  283. package/skills/cometchat-android-v5-calls/references/migration-v4-to-v5.md +0 -222
  284. package/skills/cometchat-android-v5-calls/references/participant-management.md +0 -110
  285. package/skills/cometchat-android-v5-calls/references/picture-in-picture.md +0 -106
  286. package/skills/cometchat-android-v5-calls/references/raise-hand.md +0 -248
  287. package/skills/cometchat-android-v5-calls/references/recording.md +0 -101
  288. package/skills/cometchat-android-v5-calls/references/ringing-integration.md +0 -152
  289. package/skills/cometchat-android-v5-calls/references/screen-sharing.md +0 -78
  290. package/skills/cometchat-android-v5-calls/references/server-fcm-voip.md +0 -215
  291. package/skills/cometchat-android-v5-calls/references/session-settings.md +0 -121
  292. package/skills/cometchat-android-v5-calls/references/setup.md +0 -137
  293. package/skills/cometchat-android-v5-calls/references/share-invite.md +0 -156
  294. package/skills/cometchat-android-v5-calls/references/video-controls.md +0 -87
  295. package/skills/cometchat-android-v5-calls/references/voip-calling.md +0 -526
  296. package/skills/cometchat-android-v5-components/SKILL.md +0 -431
  297. package/skills/cometchat-android-v5-core/SKILL.md +0 -486
  298. package/skills/cometchat-android-v5-customization/SKILL.md +0 -469
  299. package/skills/cometchat-android-v5-extensions/SKILL.md +0 -127
  300. package/skills/cometchat-android-v5-features/SKILL.md +0 -131
  301. package/skills/cometchat-android-v5-placement/SKILL.md +0 -277
  302. package/skills/cometchat-android-v5-production/SKILL.md +0 -95
  303. package/skills/cometchat-android-v5-push/SKILL.md +0 -619
  304. package/skills/cometchat-android-v5-testing/SKILL.md +0 -188
  305. package/skills/cometchat-android-v5-theming/SKILL.md +0 -167
  306. package/skills/cometchat-android-v5-troubleshooting/SKILL.md +0 -74
  307. package/skills/cometchat-android-v6/SKILL.md +0 -108
  308. package/skills/cometchat-android-v6-calls/references/add-calls-to-existing-chat.md +0 -97
  309. package/skills/cometchat-android-v6-calls/references/advanced-features.md +0 -87
  310. package/skills/cometchat-android-v6-calls/references/call-layouts.md +0 -100
  311. package/skills/cometchat-android-v6-calls/references/call-session.md +0 -163
  312. package/skills/cometchat-android-v6-calls/references/device-management.md +0 -172
  313. package/skills/cometchat-android-v6-calls/references/group-calls.md +0 -191
  314. package/skills/cometchat-android-v6-calls/references/idle-timeout.md +0 -110
  315. package/skills/cometchat-android-v6-calls/references/in-call-chat.md +0 -141
  316. package/skills/cometchat-android-v6-calls/references/raise-hand.md +0 -188
  317. package/skills/cometchat-android-v6-calls/references/ringing-integration.md +0 -176
  318. package/skills/cometchat-android-v6-calls/references/server-fcm-voip.md +0 -127
  319. package/skills/cometchat-android-v6-calls/references/share-invite.md +0 -105
  320. package/skills/cometchat-android-v6-compose-theming/SKILL.md +0 -250
  321. package/skills/cometchat-android-v6-kotlin-theming/SKILL.md +0 -233
  322. package/skills/cometchat-angular-calls/SKILL.md +0 -380
  323. package/skills/cometchat-angular-calls/references/add-calls-to-existing-chat.md +0 -96
  324. package/skills/cometchat-angular-calls/references/call-layouts.md +0 -123
  325. package/skills/cometchat-angular-calls/references/call-session.md +0 -167
  326. package/skills/cometchat-angular-calls/references/custom-ui.md +0 -239
  327. package/skills/cometchat-angular-calls/references/device-management.md +0 -154
  328. package/skills/cometchat-angular-calls/references/group-calls.md +0 -433
  329. package/skills/cometchat-angular-calls/references/idle-timeout.md +0 -161
  330. package/skills/cometchat-angular-calls/references/in-call-chat.md +0 -148
  331. package/skills/cometchat-angular-calls/references/lazy-loading-pitfalls.md +0 -205
  332. package/skills/cometchat-angular-calls/references/migration-v4-to-v5.md +0 -53
  333. package/skills/cometchat-angular-calls/references/ngzone-and-async-callbacks.md +0 -184
  334. package/skills/cometchat-angular-calls/references/picture-in-picture.md +0 -285
  335. package/skills/cometchat-angular-calls/references/raise-hand.md +0 -172
  336. package/skills/cometchat-angular-calls/references/recording-screen-share.md +0 -260
  337. package/skills/cometchat-angular-calls/references/ringing-integration.md +0 -133
  338. package/skills/cometchat-angular-calls/references/server-web-push-vapid.md +0 -100
  339. package/skills/cometchat-angular-calls/references/share-invite.md +0 -122
  340. package/skills/cometchat-angular-calls/references/virtual-background.md +0 -29
  341. package/skills/cometchat-angular-components/SKILL.md +0 -235
  342. package/skills/cometchat-angular-core/SKILL.md +0 -386
  343. package/skills/cometchat-angular-customization/SKILL.md +0 -616
  344. package/skills/cometchat-angular-features/SKILL.md +0 -329
  345. package/skills/cometchat-angular-patterns/SKILL.md +0 -256
  346. package/skills/cometchat-angular-placement/SKILL.md +0 -314
  347. package/skills/cometchat-angular-production/SKILL.md +0 -564
  348. package/skills/cometchat-angular-push/SKILL.md +0 -389
  349. package/skills/cometchat-angular-testing/SKILL.md +0 -605
  350. package/skills/cometchat-angular-theming/SKILL.md +0 -290
  351. package/skills/cometchat-angular-troubleshooting/SKILL.md +0 -364
  352. package/skills/cometchat-astro-patterns/SKILL.md +0 -708
  353. package/skills/cometchat-calls/SKILL.md +0 -364
  354. package/skills/cometchat-calls/references/use-case-broadcast.md +0 -199
  355. package/skills/cometchat-calls/references/use-case-marketplace.md +0 -157
  356. package/skills/cometchat-calls/references/use-case-support.md +0 -189
  357. package/skills/cometchat-calls/references/use-case-team.md +0 -180
  358. package/skills/cometchat-calls/references/use-case-telehealth.md +0 -153
  359. package/skills/cometchat-components/SKILL.md +0 -1142
  360. package/skills/cometchat-core/SKILL.md +0 -1048
  361. package/skills/cometchat-customization/SKILL.md +0 -580
  362. package/skills/cometchat-customization/references/component-catalog.md +0 -236
  363. package/skills/cometchat-features/SKILL.md +0 -861
  364. package/skills/cometchat-flutter-v5/SKILL.md +0 -173
  365. package/skills/cometchat-flutter-v5-calls/SKILL.md +0 -455
  366. package/skills/cometchat-flutter-v5-calls/references/add-calls-to-existing-chat.md +0 -193
  367. package/skills/cometchat-flutter-v5-calls/references/call-layouts.md +0 -103
  368. package/skills/cometchat-flutter-v5-calls/references/call-session.md +0 -285
  369. package/skills/cometchat-flutter-v5-calls/references/device-management.md +0 -124
  370. package/skills/cometchat-flutter-v5-calls/references/group-calls.md +0 -181
  371. package/skills/cometchat-flutter-v5-calls/references/idle-timeout.md +0 -99
  372. package/skills/cometchat-flutter-v5-calls/references/in-call-chat.md +0 -135
  373. package/skills/cometchat-flutter-v5-calls/references/migration-v4-to-v5.md +0 -210
  374. package/skills/cometchat-flutter-v5-calls/references/raise-hand.md +0 -255
  375. package/skills/cometchat-flutter-v5-calls/references/ringing-integration.md +0 -196
  376. package/skills/cometchat-flutter-v5-calls/references/server-push-bridge.md +0 -101
  377. package/skills/cometchat-flutter-v5-calls/references/share-invite.md +0 -148
  378. package/skills/cometchat-flutter-v5-conversations/SKILL.md +0 -118
  379. package/skills/cometchat-flutter-v5-core/SKILL.md +0 -239
  380. package/skills/cometchat-flutter-v5-customization/SKILL.md +0 -358
  381. package/skills/cometchat-flutter-v5-events/SKILL.md +0 -156
  382. package/skills/cometchat-flutter-v5-messages/SKILL.md +0 -259
  383. package/skills/cometchat-flutter-v5-production/SKILL.md +0 -216
  384. package/skills/cometchat-flutter-v5-push/SKILL.md +0 -285
  385. package/skills/cometchat-flutter-v5-testing/SKILL.md +0 -401
  386. package/skills/cometchat-flutter-v5-theming/SKILL.md +0 -161
  387. package/skills/cometchat-flutter-v5-troubleshooting/SKILL.md +0 -130
  388. package/skills/cometchat-flutter-v5-users-groups/SKILL.md +0 -152
  389. package/skills/cometchat-flutter-v6/SKILL.md +0 -446
  390. package/skills/cometchat-flutter-v6-calls/references/add-calls-to-existing-chat.md +0 -136
  391. package/skills/cometchat-flutter-v6-calls/references/advanced-features.md +0 -89
  392. package/skills/cometchat-flutter-v6-calls/references/call-layouts.md +0 -105
  393. package/skills/cometchat-flutter-v6-calls/references/call-session.md +0 -229
  394. package/skills/cometchat-flutter-v6-calls/references/device-management.md +0 -105
  395. package/skills/cometchat-flutter-v6-calls/references/group-calls.md +0 -190
  396. package/skills/cometchat-flutter-v6-calls/references/idle-timeout.md +0 -88
  397. package/skills/cometchat-flutter-v6-calls/references/in-call-chat.md +0 -125
  398. package/skills/cometchat-flutter-v6-calls/references/raise-hand.md +0 -275
  399. package/skills/cometchat-flutter-v6-calls/references/ringing-integration.md +0 -171
  400. package/skills/cometchat-flutter-v6-calls/references/server-push-bridge.md +0 -93
  401. package/skills/cometchat-flutter-v6-calls/references/share-invite.md +0 -102
  402. package/skills/cometchat-flutter-v6-conversations/SKILL.md +0 -238
  403. package/skills/cometchat-flutter-v6-messages/SKILL.md +0 -384
  404. package/skills/cometchat-flutter-v6-theming/SKILL.md +0 -293
  405. package/skills/cometchat-flutter-v6-users-groups/SKILL.md +0 -224
  406. package/skills/cometchat-i18n/SKILL.md +0 -419
  407. package/skills/cometchat-ios/SKILL.md +0 -325
  408. package/skills/cometchat-ios-calls/references/add-calls-to-existing-chat.md +0 -181
  409. package/skills/cometchat-ios-calls/references/audio-modes-and-controls.md +0 -45
  410. package/skills/cometchat-ios-calls/references/avaudiosession-routing.md +0 -188
  411. package/skills/cometchat-ios-calls/references/call-layouts.md +0 -76
  412. package/skills/cometchat-ios-calls/references/call-session.md +0 -218
  413. package/skills/cometchat-ios-calls/references/callkit-and-pushkit.md +0 -357
  414. package/skills/cometchat-ios-calls/references/custom-ui.md +0 -322
  415. package/skills/cometchat-ios-calls/references/device-management.md +0 -171
  416. package/skills/cometchat-ios-calls/references/group-calls.md +0 -359
  417. package/skills/cometchat-ios-calls/references/idle-timeout.md +0 -184
  418. package/skills/cometchat-ios-calls/references/in-call-chat.md +0 -179
  419. package/skills/cometchat-ios-calls/references/migration-v4-to-v5.md +0 -196
  420. package/skills/cometchat-ios-calls/references/picture-in-picture.md +0 -246
  421. package/skills/cometchat-ios-calls/references/raise-hand.md +0 -26
  422. package/skills/cometchat-ios-calls/references/recording-screen-share.md +0 -252
  423. package/skills/cometchat-ios-calls/references/ringing-integration.md +0 -143
  424. package/skills/cometchat-ios-calls/references/server-apns-pushkit.md +0 -267
  425. package/skills/cometchat-ios-calls/references/share-invite.md +0 -148
  426. package/skills/cometchat-ios-calls/references/swiftui-uikit-hosting.md +0 -246
  427. package/skills/cometchat-ios-calls/references/voip-cert-setup.md +0 -166
  428. package/skills/cometchat-ios-production/SKILL.md +0 -738
  429. package/skills/cometchat-ios-testing/SKILL.md +0 -376
  430. package/skills/cometchat-ios-theming/SKILL.md +0 -667
  431. package/skills/cometchat-ios-troubleshooting/SKILL.md +0 -1003
  432. package/skills/cometchat-native-bare-patterns/SKILL.md +0 -550
  433. package/skills/cometchat-native-calls/SKILL.md +0 -671
  434. package/skills/cometchat-native-calls/references/add-calls-to-existing-chat.md +0 -203
  435. package/skills/cometchat-native-calls/references/call-layouts.md +0 -125
  436. package/skills/cometchat-native-calls/references/call-session.md +0 -182
  437. package/skills/cometchat-native-calls/references/custom-ui.md +0 -254
  438. package/skills/cometchat-native-calls/references/device-management.md +0 -158
  439. package/skills/cometchat-native-calls/references/expo-vs-bare.md +0 -179
  440. package/skills/cometchat-native-calls/references/group-calls.md +0 -296
  441. package/skills/cometchat-native-calls/references/idle-timeout.md +0 -128
  442. package/skills/cometchat-native-calls/references/in-call-chat.md +0 -145
  443. package/skills/cometchat-native-calls/references/migration-v4-to-v5.md +0 -72
  444. package/skills/cometchat-native-calls/references/picture-in-picture.md +0 -276
  445. package/skills/cometchat-native-calls/references/raise-hand.md +0 -205
  446. package/skills/cometchat-native-calls/references/recording-screen-share.md +0 -169
  447. package/skills/cometchat-native-calls/references/ringing-integration.md +0 -118
  448. package/skills/cometchat-native-calls/references/server-push-bridge.md +0 -135
  449. package/skills/cometchat-native-calls/references/server-push-payloads.md +0 -193
  450. package/skills/cometchat-native-calls/references/share-invite.md +0 -146
  451. package/skills/cometchat-native-calls/references/voip-push-end-to-end.md +0 -319
  452. package/skills/cometchat-native-components/SKILL.md +0 -628
  453. package/skills/cometchat-native-core/SKILL.md +0 -679
  454. package/skills/cometchat-native-customization/SKILL.md +0 -716
  455. package/skills/cometchat-native-expo-patterns/SKILL.md +0 -552
  456. package/skills/cometchat-native-features/SKILL.md +0 -638
  457. package/skills/cometchat-native-placement/SKILL.md +0 -509
  458. package/skills/cometchat-native-production/SKILL.md +0 -700
  459. package/skills/cometchat-native-push/SKILL.md +0 -594
  460. package/skills/cometchat-native-testing/SKILL.md +0 -582
  461. package/skills/cometchat-native-theming/SKILL.md +0 -681
  462. package/skills/cometchat-native-troubleshooting/SKILL.md +0 -501
  463. package/skills/cometchat-nextjs-patterns/SKILL.md +0 -899
  464. package/skills/cometchat-placement/SKILL.md +0 -1360
  465. package/skills/cometchat-production/SKILL.md +0 -1027
  466. package/skills/cometchat-react-calls/SKILL.md +0 -752
  467. package/skills/cometchat-react-calls/references/add-calls-to-existing-chat.md +0 -146
  468. package/skills/cometchat-react-calls/references/call-layouts.md +0 -160
  469. package/skills/cometchat-react-calls/references/call-session.md +0 -235
  470. package/skills/cometchat-react-calls/references/custom-ui.md +0 -247
  471. package/skills/cometchat-react-calls/references/device-management.md +0 -210
  472. package/skills/cometchat-react-calls/references/group-calls.md +0 -257
  473. package/skills/cometchat-react-calls/references/idle-timeout.md +0 -188
  474. package/skills/cometchat-react-calls/references/in-call-chat.md +0 -212
  475. package/skills/cometchat-react-calls/references/migration-v4-to-v5.md +0 -170
  476. package/skills/cometchat-react-calls/references/picture-in-picture.md +0 -245
  477. package/skills/cometchat-react-calls/references/raise-hand.md +0 -238
  478. package/skills/cometchat-react-calls/references/recording-screen-share.md +0 -144
  479. package/skills/cometchat-react-calls/references/ringing-integration.md +0 -255
  480. package/skills/cometchat-react-calls/references/server-web-push-vapid.md +0 -241
  481. package/skills/cometchat-react-calls/references/share-invite.md +0 -175
  482. package/skills/cometchat-react-calls/references/testing-calls-on-web.md +0 -216
  483. package/skills/cometchat-react-calls/references/virtual-background.md +0 -32
  484. package/skills/cometchat-react-calls/references/voip-and-web-push.md +0 -165
  485. package/skills/cometchat-react-patterns/SKILL.md +0 -628
  486. package/skills/cometchat-react-push/SKILL.md +0 -634
  487. package/skills/cometchat-react-router-patterns/SKILL.md +0 -758
  488. package/skills/cometchat-react-testing/SKILL.md +0 -413
  489. package/skills/cometchat-theming/SKILL.md +0 -498
  490. package/skills/cometchat-troubleshooting/SKILL.md +0 -294
@@ -1,175 +0,0 @@
1
- # Share invite on web (React)
2
-
3
- Let participants share the call link with others. The kit ships a share-invite button (hidden by default); your app intercepts the click and runs the platform's native share UI.
4
-
5
- **Canonical docs:** https://www.cometchat.com/docs/calls/javascript/share-invite
6
-
7
- ---
8
-
9
- ## Hard rule: deep-link routing must work BEFORE you ship share-invite
10
-
11
- A share button that copies a URL nobody can open is worse than no share button. Verify your app's `/call/:sessionId` route handles all four states:
12
-
13
- 1. **User logged in, in-app** → join call directly
14
- 2. **User logged in, fresh tab** → restore session, join call
15
- 3. **User logged out** → login, then redirect to call
16
- 4. **User doesn't have account** → signup flow with `?invite=...` query param
17
-
18
- Build the deep-link route first, then turn on the share button.
19
-
20
- ---
21
-
22
- ## Show the kit's share button
23
-
24
- ```tsx
25
- const callSettings = {
26
- hideShareInviteButton: false,
27
- // ... rest
28
- };
29
- ```
30
-
31
- ---
32
-
33
- ## Handle the click
34
-
35
- ```tsx
36
- useEffect(() => {
37
- const handler = () => shareCallInvite(sessionId);
38
- // addEventListener returns an unsubscribe fn — there is no removeEventListener.
39
- const off = CometChatCalls.addEventListener("onShareInviteButtonClicked", handler);
40
- return () => off();
41
- }, [sessionId]);
42
- ```
43
-
44
- ---
45
-
46
- ## Native Web Share API + clipboard fallback
47
-
48
- ```tsx
49
- async function shareCallInvite(sessionId: string) {
50
- const url = `https://yourapp.com/call/${sessionId}`;
51
- const shareData = {
52
- title: "Join my call",
53
- text: "I'm on a call — tap to join.",
54
- url,
55
- };
56
-
57
- if (navigator.share && navigator.canShare?.(shareData)) {
58
- try {
59
- await navigator.share(shareData);
60
- } catch (err) {
61
- // User cancelled — that's fine, no toast needed
62
- if ((err as Error).name !== "AbortError") {
63
- console.warn("Share failed", err);
64
- }
65
- }
66
- return;
67
- }
68
-
69
- // Fallback: clipboard
70
- try {
71
- await navigator.clipboard.writeText(url);
72
- showToast("Link copied to clipboard");
73
- } catch {
74
- // Clipboard API requires user gesture + secure context (https) — must always have a manual fallback
75
- promptManualCopy(url);
76
- }
77
- }
78
- ```
79
-
80
- `navigator.share` is iOS Safari + Android Chrome + recent desktop Chrome. `navigator.clipboard.writeText` is everywhere modern but **only works in secure contexts (https)** — localhost is fine; non-https staging hosts will throw.
81
-
82
- ---
83
-
84
- ## Custom share dialog (when you want more control)
85
-
86
- ```tsx
87
- function ShareDialog({ sessionId, onClose }: Props) {
88
- const url = `https://yourapp.com/call/${sessionId}`;
89
- return (
90
- <dialog open className="share-dialog" role="dialog" aria-label="Share call invite">
91
- <button onClick={() => navigator.clipboard.writeText(url)}>Copy link</button>
92
- <a href={`mailto:?subject=Join%20my%20call&body=${encodeURIComponent(url)}`}>Email</a>
93
- <a href={`sms:?body=${encodeURIComponent(url)}`}>SMS</a>
94
- <button onClick={onClose}>Close</button>
95
- </dialog>
96
- );
97
- }
98
- ```
99
-
100
- `mailto:` opens default email client; `sms:` opens default SMS app on mobile (no-op on most desktops). Both are universal — no provider lock-in.
101
-
102
- ---
103
-
104
- ## QR code for in-person sharing
105
-
106
- For "share to the person sitting next to you" UX, a QR is faster than a link:
107
-
108
- ```tsx
109
- import QRCode from "qrcode.react";
110
-
111
- function CallQR({ sessionId }: { sessionId: string }) {
112
- const url = `https://yourapp.com/call/${sessionId}`;
113
- return (
114
- <div>
115
- <QRCode value={url} size={192} />
116
- <p>{url}</p>
117
- </div>
118
- );
119
- }
120
- ```
121
-
122
- ---
123
-
124
- ## Anti-patterns
125
-
126
- 1. **Sharing the raw `sessionId` instead of a deep link.** Recipients can't open it.
127
- 2. **Wiring share before the deep-link route works.** Recipients click → 404.
128
- 3. **`navigator.clipboard.writeText` without a manual-copy fallback.** Fails in non-https contexts (e.g., embedded iframes, dev tunnels).
129
- 4. **Showing "Link copied!" toast even when share was cancelled.** `AbortError` is the user dismissing the share sheet — silent.
130
- 5. **Forgetting to call the unsubscribe fn on unmount.** `addEventListener` returns a `() => void` — call it in cleanup (there is no `removeEventListener`). Otherwise the listener accumulates → multiple share sheets per click.
131
- 6. **Hard-coding `https://yourapp.com`.** Use `window.location.origin` or `import.meta.env.VITE_APP_URL`.
132
-
133
- ---
134
-
135
- ## Server-side: deep links + auth bridge
136
-
137
- If invitee isn't logged in, `https://yourapp.com/call/SESSION_ID` should redirect them through login THEN to the call. Pattern:
138
-
139
- ```ts
140
- // pages/call/[sessionId].tsx (Next.js example)
141
- export async function getServerSideProps({ params, req }) {
142
- const session = await getSession(req);
143
- if (!session) {
144
- return {
145
- redirect: {
146
- destination: `/login?next=/call/${params.sessionId}`,
147
- permanent: false,
148
- },
149
- };
150
- }
151
- return { props: { sessionId: params.sessionId } };
152
- }
153
- ```
154
-
155
- For invitees without an account, send them to `/signup?invite=SESSION_ID` and store the pending invite in `localStorage` until signup completes.
156
-
157
- ---
158
-
159
- ## Verification checklist
160
-
161
- - [ ] Deep-link route `/call/:sessionId` works in 4 states (logged in / logged out / no account / fresh tab)
162
- - [ ] `hideShareInviteButton: false` in CallSettings
163
- - [ ] `onShareInviteButtonClicked` listener cleaned up on unmount
164
- - [ ] `navigator.share` used when available; clipboard fallback; manual-copy fallback for non-https
165
- - [ ] AbortError silenced
166
- - [ ] App URL not hard-coded — read from env
167
- - [ ] Smoke: copy link → paste in incognito → can join call
168
-
169
- ---
170
-
171
- ## Pointers
172
-
173
- - `cometchat-react-calls/SKILL.md` — call architecture
174
- - `cometchat-react-calls/references/in-call-chat.md` — sister cross-cutting concern
175
- - Canonical docs: https://www.cometchat.com/docs/calls/javascript/share-invite
@@ -1,216 +0,0 @@
1
- # Testing calls on web
2
-
3
- Calls are the hardest CometChat surface to unit-test because they touch native browser APIs (`getUserMedia`, `RTCPeerConnection`) that don't exist in jsdom. Three layers, three strategies:
4
-
5
- 1. **Unit tests** — mock the entire Calls SDK; assert your code calls the right methods in the right order.
6
- 2. **Component tests** — Vitest + React Testing Library; mock `getUserMedia` and `RTCPeerConnection`; assert your custom UI renders correctly given mocked SDK events.
7
- 3. **E2E tests** — Playwright with the headless WebRTC flag; real two-tab call between two test users.
8
-
9
- This reference covers all three. For chat-side testing patterns, see `cometchat-react-testing` (sibling skill).
10
-
11
- ---
12
-
13
- ## ⚠️ Ringing-mode manual testing needs TWO ISOLATED browser contexts (not two tabs)
14
-
15
- The single most common "incoming call never rings / Accept never appears" report is a **test-setup** problem, not a code bug:
16
-
17
- **The Chat SDK is one session per browser origin.** `CometChat.login()` persists the logged-in user in **IndexedDB/localStorage keyed by `appId`** and maintains **one WebSocket per origin** — both **shared across every tab** of `localhost:5173`. Two tabs in the *same* browser therefore CANNOT hold two different logins: the second tab's login overwrites the shared session, so there is no independent callee connected to receive `onIncomingCallReceived`. A per-tab `sessionStorage` "user switcher" only changes what *your app* thinks the user is — the Chat SDK underneath is still a single shared session.
18
-
19
- - **Ringing mode (1:1 / `initiateCall` → `onIncomingCallReceived`)** → needs **two isolated contexts**: a normal window for the caller + an **Incognito/Private window** (or a different browser, or a second device) for the callee. Only then are there two distinct Chat-SDK sessions + sockets.
20
- - **Session/meeting mode (`joinSession` on a shared `sessionId`)** → two tabs in the *same* browser are fine — it doesn't depend on two live Chat-SDK logins; both sides just join the same session id.
21
-
22
- Sanity-check in the callee context's console — it must show the callee, not the caller:
23
- ```js
24
- await CometChat.getLoggedinUser() // → User { uid: "cometchat-uid-2", ... }
25
- ```
26
- If it shows the caller's uid (or `null`), the callee isn't an independent receiver — that's the shared-session symptom.
27
-
28
- Two devices on a LAN need HTTPS for `getUserMedia` (secure-context), but the ring itself arrives over plain `localhost` in incognito.
29
-
30
- ---
31
-
32
- ## 1. Unit tests — mock the SDK module
33
-
34
- Vitest's `vi.mock` with a hoisted factory:
35
-
36
- ```ts
37
- // __tests__/CallButton.test.tsx
38
- import { describe, it, expect, vi, beforeEach } from "vitest";
39
- import { render, screen, fireEvent } from "@testing-library/react";
40
- import { CometChatCalls } from "@cometchat/calls-sdk-javascript";
41
- import { CallButton } from "../src/components/CallButton";
42
-
43
- vi.mock("@cometchat/chat-sdk-javascript", () => ({
44
- CometChat: {
45
- initiateCall: vi.fn().mockResolvedValue({ getSessionId: () => "session-123" }),
46
- Call: vi.fn((uid, type, recv) => ({ uid, type, recv })),
47
- CALL_TYPE: { VOICE: "voice", VIDEO: "video" },
48
- RECEIVER_TYPE: { USER: "user" },
49
- },
50
- }));
51
-
52
- vi.mock("@cometchat/calls-sdk-javascript", () => ({
53
- CometChatCalls: {
54
- init: vi.fn(),
55
- generateToken: vi.fn().mockResolvedValue({ token: "rtc-token" }),
56
- startSession: vi.fn(),
57
- endSession: vi.fn(),
58
- CallSettingsBuilder: class {
59
- setIsAudioOnlyCall() { return this; }
60
- enableDefaultLayout() { return this; }
61
- build() { return {}; }
62
- },
63
- },
64
- }));
65
-
66
- beforeEach(() => vi.clearAllMocks());
67
-
68
- describe("CallButton", () => {
69
- it("initiates a video call when video button clicked", async () => {
70
- const { CometChat } = await import("@cometchat/chat-sdk-javascript");
71
- render(<CallButton user={{ uid: "alice" }} />);
72
-
73
- await fireEvent.click(screen.getByLabelText("Start video call"));
74
-
75
- expect(CometChat.initiateCall).toHaveBeenCalledWith(
76
- expect.objectContaining({ uid: "alice", type: "video" }),
77
- );
78
- });
79
- });
80
- ```
81
-
82
- ---
83
-
84
- ## 2. Component tests — mock `getUserMedia` + `RTCPeerConnection`
85
-
86
- For tests that exercise your custom UI's reaction to track-arrived events:
87
-
88
- ```ts
89
- // vitest.setup.ts
90
- import { vi } from "vitest";
91
-
92
- beforeAll(() => {
93
- // jsdom doesn't have navigator.mediaDevices — polyfill it
94
- Object.defineProperty(navigator, "mediaDevices", {
95
- writable: true,
96
- value: {
97
- getUserMedia: vi.fn().mockResolvedValue({
98
- getTracks: () => [
99
- { kind: "audio", stop: vi.fn() },
100
- { kind: "video", stop: vi.fn() },
101
- ],
102
- }),
103
- getDisplayMedia: vi.fn().mockResolvedValue({ getTracks: () => [{ stop: vi.fn() }] }),
104
- enumerateDevices: vi.fn().mockResolvedValue([]),
105
- },
106
- });
107
-
108
- // Polyfill RTCPeerConnection
109
- (global as Record<string, unknown>).RTCPeerConnection = class {
110
- addTrack = vi.fn();
111
- addEventListener = vi.fn();
112
- createOffer = vi.fn().mockResolvedValue({ sdp: "fake-offer", type: "offer" });
113
- createAnswer = vi.fn().mockResolvedValue({ sdp: "fake-answer", type: "answer" });
114
- setLocalDescription = vi.fn();
115
- setRemoteDescription = vi.fn();
116
- close = vi.fn();
117
- };
118
- });
119
- ```
120
-
121
- Reference this in `vitest.config.ts`:
122
-
123
- ```ts
124
- export default defineConfig({
125
- test: {
126
- setupFiles: ["./vitest.setup.ts"],
127
- environment: "jsdom",
128
- },
129
- });
130
- ```
131
-
132
- ---
133
-
134
- ## 3. E2E tests — Playwright with WebRTC enabled
135
-
136
- Playwright supports real WebRTC in headless mode with the right Chromium flag:
137
-
138
- ```ts
139
- // playwright.config.ts
140
- import { defineConfig } from "@playwright/test";
141
-
142
- export default defineConfig({
143
- use: {
144
- launchOptions: {
145
- args: [
146
- "--use-fake-ui-for-media-stream", // auto-grants getUserMedia
147
- "--use-fake-device-for-media-stream", // synthetic camera (animated pattern)
148
- "--allow-running-insecure-content",
149
- ],
150
- },
151
- },
152
- });
153
- ```
154
-
155
- Then a two-page test exercises the full call flow:
156
-
157
- ```ts
158
- import { test, expect, type Page } from "@playwright/test";
159
-
160
- async function login(page: Page, uid: string) {
161
- await page.goto("/");
162
- await page.evaluate((uid) => localStorage.setItem("cc-test-uid", uid), uid);
163
- await page.reload();
164
- await expect(page.getByTestId("logged-in-banner")).toBeVisible();
165
- }
166
-
167
- test("alice calls bob; bob answers; both see two-way video", async ({ browser }) => {
168
- const aliceCtx = await browser.newContext();
169
- const bobCtx = await browser.newContext();
170
- const alice = await aliceCtx.newPage();
171
- const bob = await bobCtx.newPage();
172
-
173
- await login(alice, "cometchat-uid-1");
174
- await login(bob, "cometchat-uid-2");
175
-
176
- // Alice clicks call on Bob's profile
177
- await alice.goto("/users/cometchat-uid-2");
178
- await alice.getByLabel("Start video call").click();
179
-
180
- // Bob's IncomingCall overlay appears
181
- await expect(bob.getByText("Incoming call from")).toBeVisible({ timeout: 10_000 });
182
- await bob.getByRole("button", { name: "Accept" }).click();
183
-
184
- // Both see the ongoing-call view
185
- await expect(alice.getByTestId("ongoing-call")).toBeVisible();
186
- await expect(bob.getByTestId("ongoing-call")).toBeVisible();
187
-
188
- // Verify two video elements are playing (synthetic streams)
189
- const aliceVideos = await alice.locator("video").count();
190
- expect(aliceVideos).toBeGreaterThanOrEqual(2); // local + remote
191
-
192
- // Hangup
193
- await alice.getByRole("button", { name: "End" }).click();
194
- await expect(alice.getByTestId("ongoing-call")).not.toBeVisible();
195
- await expect(bob.getByTestId("ongoing-call")).not.toBeVisible();
196
- });
197
- ```
198
-
199
- **Synthetic stream gotcha:** the `--use-fake-device-for-media-stream` flag makes Chrome stream a green-and-blue animated pattern. Real cameras / mics are NOT used, so you cannot assert "this video shows the user's face." You CAN assert "two video elements with `srcObject` set," which is what 90% of tests need.
200
-
201
- ---
202
-
203
- ## CI gotchas
204
-
205
- - **Linux GPU + WebRTC:** GitHub Actions Ubuntu runners have headless Chrome but no GPU. Pass `--disable-gpu` if you see WebRTC errors about GPU process crash; the synthetic stream still works.
206
- - **Test isolation:** real CometChat App ID + Auth Key in CI. Use a dedicated test app (Dashboard → New App → "ci-tests"); don't reuse production credentials.
207
- - **Rate limits:** the CometChat backend rate-limits `initiateCall` per user. Tests that loop call/hangup quickly hit limits; throttle to ~5 calls/minute per test UID or rotate UIDs (`cometchat-uid-1` through `cometchat-uid-5` are pre-seeded).
208
- - **Cleanup:** kill any active calls between tests via `CometChatCalls.leaveSession()` in afterEach. Stale sessions cause the next test's `initiateCall` to fail.
209
-
210
- ---
211
-
212
- ## What NOT to mock
213
-
214
- - **Don't mock `useEffect` cleanup.** It's where rule 1.3's track-stop happens; mocking hides bugs in the cleanup path.
215
- - **Don't mock `navigator.mediaDevices` to return synchronous values.** Real APIs are async; mocks should be too, otherwise you mask race conditions in your real code.
216
- - **Don't mock the kit components themselves** (`<CometChatIncomingCall />` etc.) for unit tests — they're tested by CometChat. Mock the SDK that the kit calls.
@@ -1,32 +0,0 @@
1
- # Virtual Background (web)
2
-
3
- Verified against `@cometchat/calls-sdk-javascript@5`. Web (React/Angular) is one of the few platforms that supports virtual background (native iOS/Android do not). Two ways to expose it:
4
-
5
- ## A. Let the kit show its built-in setting (additive / kit components)
6
-
7
- Enable the kit's own Virtual Background button on the call settings builder — it renders a blur/image/clear picker inside the call UI, no custom code:
8
-
9
- ```ts
10
- const settings = new CometChatCalls.CallSettingsBuilder()
11
- .enableDefaultLayout(true)
12
- .showVirtualBackgroundSetting(true) // ← shows the built-in VB control
13
- .build();
14
- ```
15
-
16
- To read the current state, call `getVirtualBackground()` on a built `CallSettings` instance — it's an **instance** method on `CallSettings` (`callSettings.getVirtualBackground(): VirtualBackground`), not a `CometChatCalls` static.
17
-
18
- ## B. Apply programmatically (custom call surface)
19
-
20
- Three static methods on `CometChatCalls`, callable during an active session:
21
-
22
- ```ts
23
- import { CometChatCalls } from "@cometchat/calls-sdk-javascript";
24
-
25
- CometChatCalls.setVirtualBackgroundBlurLevel(50); // blur (0–100)
26
- CometChatCalls.setVirtualBackgroundImage("https://…/bg.jpg"); // custom image
27
- CometChatCalls.clearVirtualBackground(); // remove
28
- ```
29
-
30
- > The older `setBackgroundBlur()` / `setBackgroundImage()` names are **deprecated** — use the `setVirtualBackground*` forms above.
31
-
32
- Verified (calls-sdk `index.d.ts`): `CallSettingsBuilder.showVirtualBackgroundSetting(boolean)`, instance `CallSettings.getVirtualBackground(): VirtualBackground`, and the statics `CometChatCalls.setVirtualBackgroundBlurLevel(number)` / `setVirtualBackgroundImage(string)` / `clearVirtualBackground()`.
@@ -1,165 +0,0 @@
1
- # VoIP push on web — there isn't any
2
-
3
- Web browsers do not have VoIP push. You cannot ring a user whose tab is closed. The closest equivalents are:
4
-
5
- 1. **Web Push** (Service Worker + Push API + Notification API) — can fire a system-level notification while the browser is open even if the tab is backgrounded. Limitations:
6
- - Service Worker must be installed (one prior visit required)
7
- - User must have granted notification permission
8
- - Browser must be running (Chrome/Edge can deliver to closed tabs IF the browser process is alive; Safari requires Safari to be running; Firefox stops Service Workers aggressively)
9
- - Does NOT bypass closed browser. Production calling apps on web pair this with email/SMS fallback for missed calls.
10
-
11
- 2. **Email/SMS missed-call fallback** — server-side. When a call rings unanswered for ~30 seconds, send a "missed call from X" email/SMS with a deep link back into the app.
12
-
13
- This reference covers Web Push end-to-end. Email/SMS is out of scope (server-side only, not skill-scaffoldable).
14
-
15
- ---
16
-
17
- ## Web Push setup (Service Worker + push subscription)
18
-
19
- ### 1. Generate VAPID keys (server-side, one-time)
20
-
21
- ```bash
22
- npx web-push generate-vapid-keys
23
- ```
24
-
25
- Stores public + private keys. Public goes to the client; private stays on the push server.
26
-
27
- ### 2. Register the Service Worker
28
-
29
- `public/sw.js`:
30
-
31
- ```js
32
- self.addEventListener("push", (event) => {
33
- if (!event.data) return;
34
- const payload = event.data.json();
35
- if (payload.type !== "incoming_call") return;
36
-
37
- event.waitUntil(
38
- self.registration.showNotification("Incoming call", {
39
- body: `${payload.callerName} is calling`,
40
- icon: "/icons/call.png",
41
- tag: `call-${payload.sessionId}`, // dedupe — only one ring per session
42
- requireInteraction: true, // don't auto-dismiss
43
- data: { sessionId: payload.sessionId, callerUid: payload.callerUid },
44
- }),
45
- );
46
- });
47
-
48
- self.addEventListener("notificationclick", (event) => {
49
- event.notification.close();
50
- event.waitUntil(
51
- clients.matchAll({ type: "window", includeUncontrolled: true }).then((wins) => {
52
- // Focus existing tab if open, otherwise open a new one
53
- for (const w of wins) {
54
- if (w.url.includes(self.registration.scope)) {
55
- w.focus();
56
- w.postMessage({ type: "incoming_call_click", ...event.notification.data });
57
- return;
58
- }
59
- }
60
- return clients.openWindow(`/calls/incoming?sessionId=${event.notification.data.sessionId}`);
61
- }),
62
- );
63
- });
64
- ```
65
-
66
- ### 3. Register from the app
67
-
68
- ```ts
69
- // cometchat/registerWebPush.ts
70
- const VAPID_PUBLIC = import.meta.env.VITE_VAPID_PUBLIC_KEY;
71
-
72
- export async function registerWebPushForCalls(uid: string): Promise<void> {
73
- if (!("serviceWorker" in navigator) || !("PushManager" in window)) return;
74
-
75
- const reg = await navigator.serviceWorker.register("/sw.js");
76
- const permission = await Notification.requestPermission();
77
- if (permission !== "granted") return;
78
-
79
- const subscription = await reg.pushManager.subscribe({
80
- userVisibleOnly: true,
81
- applicationServerKey: urlBase64ToUint8Array(VAPID_PUBLIC),
82
- });
83
-
84
- // Send subscription to YOUR server, keyed by uid
85
- await fetch("/api/push/subscribe", {
86
- method: "POST",
87
- headers: { "Content-Type": "application/json" },
88
- body: JSON.stringify({ uid, subscription }),
89
- });
90
- }
91
-
92
- function urlBase64ToUint8Array(base64: string): Uint8Array {
93
- const padding = "=".repeat((4 - (base64.length % 4)) % 4);
94
- const raw = atob((base64 + padding).replace(/-/g, "+").replace(/_/g, "/"));
95
- return Uint8Array.from(raw, (c) => c.charCodeAt(0));
96
- }
97
- ```
98
-
99
- ### 4. Listen for SW messages in your React app
100
-
101
- ```tsx
102
- // CometChatProvider.tsx
103
- useEffect(() => {
104
- const handler = (event: MessageEvent) => {
105
- if (event.data?.type === "incoming_call_click") {
106
- // Navigate to the call screen and let CometChatIncomingCall pick it up
107
- navigate(`/calls/incoming?sessionId=${event.data.sessionId}`);
108
- }
109
- };
110
- navigator.serviceWorker.addEventListener("message", handler);
111
- return () => navigator.serviceWorker.removeEventListener("message", handler);
112
- }, [navigate]);
113
- ```
114
-
115
- ### 5. Server-side push send (signaling integration)
116
-
117
- Your CometChat backend (or webhook listener) detects an incoming call event and sends Web Push to the receiver's subscription:
118
-
119
- ```ts
120
- // server (Node.js) — runs when CometChat fires the call.received webhook
121
- import webpush from "web-push";
122
-
123
- webpush.setVapidDetails("mailto:you@example.com", VAPID_PUBLIC, VAPID_PRIVATE);
124
-
125
- async function sendIncomingCallPush(receiverUid: string, sessionId: string, callerName: string, callerUid: string) {
126
- const subs = await getSubscriptionsForUid(receiverUid); // your DB
127
- await Promise.allSettled(
128
- subs.map((sub) =>
129
- webpush.sendNotification(sub, JSON.stringify({
130
- type: "incoming_call",
131
- sessionId,
132
- callerName,
133
- callerUid,
134
- })),
135
- ),
136
- );
137
- }
138
- ```
139
-
140
- The webhook setup itself is server-side; the skill scaffolds the client side and points users at this template for the server.
141
-
142
- ---
143
-
144
- ## Browser support matrix
145
-
146
- | Browser | Push API | Notification while tab closed | Service Worker terminated background |
147
- |---|---|---|---|
148
- | Chrome/Edge desktop | ✓ | ✓ if browser process alive | After ~30s idle |
149
- | Chrome/Edge mobile | ✓ | ✓ | Aggressive; Web Push is best-effort |
150
- | Firefox desktop | ✓ | ✓ | After ~30s idle |
151
- | Safari 16+ desktop | ✓ | ✓ if Safari running | Tighter |
152
- | Safari iOS 16.4+ | ✓ | Only when added to Home Screen as PWA | N/A — PWA only |
153
- | Mobile Web (any) | Limited | Often not delivered when browser killed | OS-driven |
154
-
155
- **Bottom line:** Web Push is "best-effort ring" — it works often enough to be worth wiring, but production calling apps must have a missed-call email/SMS fallback. The skill warns the user about this explicitly during scaffold.
156
-
157
- ---
158
-
159
- ## When NOT to bother with Web Push
160
-
161
- - Internal tools where users keep the tab open during work hours — `<CometChatIncomingCall />` mounted at root rings the tab itself, which is enough.
162
- - Apps where the call surface is a route the user navigates to deliberately (telehealth waiting room) — the ring happens when they arrive on the route; they don't need to be paged.
163
- - Greenfield projects that haven't shipped to production yet — add it later when missed-calls become a real complaint.
164
-
165
- The dispatcher's Step 3 in `cometchat-react-calls/SKILL.md` asks the user whether to scaffold Web Push. Default = no for "just exploring" / "messaging app" intents; default = yes for "support" / "marketplace" intents (where users may receive a call without expecting it).