@cometchat/skills 4.4.1 → 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 (489) 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/README.md +41 -163
  5. package/RULES.md +114 -0
  6. package/bin/cometchat-skills.mjs +1180 -0
  7. package/bin/legacy-skills.json +95 -0
  8. package/catalogs/android-v6.json +1646 -0
  9. package/catalogs/flutter-v6.json +651 -0
  10. package/catalogs/ios-v5.json +1383 -0
  11. package/catalogs/rn-calls-v5.json +134 -0
  12. package/catalogs/rn-calls-v5.symbols.txt +58 -0
  13. package/catalogs/rn-sdk-v4.json +672 -0
  14. package/catalogs/rn-v5.json +449 -0
  15. package/catalogs/rn-v5.symbols.txt +216 -0
  16. package/catalogs/sdk-android-v5.json +514 -0
  17. package/contracts.android-calls-v5.json +122 -0
  18. package/contracts.android-v6.json +135 -0
  19. package/contracts.angular-v5.json +694 -0
  20. package/contracts.flutter-calls-v5.json +77 -0
  21. package/contracts.flutter-v6.json +126 -0
  22. package/contracts.ios-calls-v5.json +67 -0
  23. package/contracts.ios-v5.json +436 -0
  24. package/contracts.json +82 -0
  25. package/contracts.rn-calls-v5.json +77 -0
  26. package/contracts.rn-v5.json +727 -0
  27. package/contracts.sdk-android-v5.json +15 -0
  28. package/contracts.web-calls-v5.json +45 -0
  29. package/features.android-calls-v5.json +246 -0
  30. package/features.android-v6.json +65 -0
  31. package/features.angular-v5.json +521 -0
  32. package/features.flutter-calls-v5.json +286 -0
  33. package/features.flutter-v6.json +484 -0
  34. package/features.ios-calls-v5.json +236 -0
  35. package/features.ios-v5.json +573 -0
  36. package/features.json +61 -0
  37. package/features.rn-calls-v5.json +187 -0
  38. package/features.rn-v5.json +614 -0
  39. package/features.sdk-android-v5.json +40 -0
  40. package/features.sdk-jsv4.json +24 -0
  41. package/features.web-calls-v5.json +108 -0
  42. package/package.json +151 -74
  43. package/peers.yaml +312 -0
  44. package/registry/README.md +31 -0
  45. package/registry/android-calls-v5.json +54 -0
  46. package/registry/android-v6.json +137 -0
  47. package/registry/angular-v5.json +114 -0
  48. package/registry/flutter-calls-v5.json +54 -0
  49. package/registry/flutter-v6.json +119 -0
  50. package/registry/ios-calls-v5.json +59 -0
  51. package/registry/ios-v5.json +97 -0
  52. package/registry/rn-calls-v5.json +59 -0
  53. package/registry/rn-v5.json +129 -0
  54. package/registry/sdk-android-v5.json +53 -0
  55. package/registry/sdk-jsv4.json +53 -0
  56. package/registry/web-calls-v5.json +54 -0
  57. package/registry/web-v7.json +99 -0
  58. package/skills/cometchat/SKILL.md +42 -2096
  59. package/skills/cometchat-android-v5-calls-sdk/SKILL.md +206 -0
  60. package/skills/cometchat-android-v5-calls-sdk/references/build-truth.md +63 -0
  61. package/skills/cometchat-android-v5-calls-sdk/references/docs-map.md +119 -0
  62. package/skills/cometchat-android-v5-calls-sdk/references/method-map.md +53 -0
  63. package/skills/cometchat-android-v5-calls-sdk/references/pitfalls.md +72 -0
  64. package/skills/cometchat-android-v5-calls-sdk/references/ringing.md +92 -0
  65. package/skills/cometchat-android-v5-calls-sdk/references/user-switch.md +90 -0
  66. package/skills/cometchat-android-v5-sdk/SKILL.md +127 -0
  67. package/skills/cometchat-android-v5-sdk/references/app-surface.md +88 -0
  68. package/skills/cometchat-android-v5-sdk/references/docs-map.md +91 -0
  69. package/skills/cometchat-android-v6-builder-settings/SKILL.md +51 -137
  70. package/skills/cometchat-android-v6-calls/SKILL.md +128 -411
  71. package/skills/cometchat-android-v6-compose-components/SKILL.md +84 -194
  72. package/skills/cometchat-android-v6-compose-customization/SKILL.md +66 -411
  73. package/skills/cometchat-android-v6-compose-placement/SKILL.md +154 -237
  74. package/skills/cometchat-android-v6-core/SKILL.md +236 -672
  75. package/skills/cometchat-android-v6-core/references/anti-patterns.md +31 -0
  76. package/skills/cometchat-android-v6-core/references/component-props.md +168 -0
  77. package/skills/cometchat-android-v6-core/references/docs-map.md +153 -0
  78. package/skills/cometchat-android-v6-core/references/layout.md +112 -0
  79. package/skills/cometchat-android-v6-core/references/lifecycle.md +75 -0
  80. package/skills/cometchat-android-v6-core/references/setup-credentials.md +105 -0
  81. package/skills/cometchat-android-v6-core/references/troubleshooting.md +36 -0
  82. package/skills/cometchat-android-v6-events/SKILL.md +46 -184
  83. package/skills/cometchat-android-v6-extensions/SKILL.md +39 -179
  84. package/skills/cometchat-android-v6-features/SKILL.md +74 -143
  85. package/skills/cometchat-android-v6-kotlin-components/SKILL.md +75 -193
  86. package/skills/cometchat-android-v6-kotlin-customization/SKILL.md +67 -419
  87. package/skills/cometchat-android-v6-kotlin-placement/SKILL.md +77 -223
  88. package/skills/cometchat-android-v6-migration/SKILL.md +67 -378
  89. package/skills/cometchat-android-v6-production/SKILL.md +40 -179
  90. package/skills/cometchat-android-v6-push/SKILL.md +39 -289
  91. package/skills/cometchat-android-v6-testing/SKILL.md +50 -265
  92. package/skills/cometchat-android-v6-troubleshooting/SKILL.md +70 -254
  93. package/skills/cometchat-angular-v5-calls/SKILL.md +193 -0
  94. package/skills/cometchat-angular-v5-components/SKILL.md +131 -0
  95. package/skills/cometchat-angular-v5-components/references/catalog.md +111 -0
  96. package/skills/cometchat-angular-v5-components/references/host-composed.md +46 -0
  97. package/skills/cometchat-angular-v5-core/SKILL.md +300 -0
  98. package/skills/cometchat-angular-v5-core/references/anti-patterns.md +49 -0
  99. package/skills/cometchat-angular-v5-core/references/component-props.md +55 -0
  100. package/skills/cometchat-angular-v5-core/references/dependencies.md +66 -0
  101. package/skills/cometchat-angular-v5-core/references/docs-map.md +132 -0
  102. package/skills/cometchat-angular-v5-core/references/layout.md +64 -0
  103. package/skills/cometchat-angular-v5-core/references/lifecycle.md +202 -0
  104. package/skills/cometchat-angular-v5-core/references/setup-credentials.md +137 -0
  105. package/skills/cometchat-angular-v5-core/references/theming.md +70 -0
  106. package/skills/cometchat-angular-v5-core/references/troubleshooting.md +27 -0
  107. package/skills/cometchat-angular-v5-customization/SKILL.md +94 -0
  108. package/skills/cometchat-angular-v5-features/SKILL.md +107 -0
  109. package/skills/cometchat-angular-v5-features/references/custom-messages.md +133 -0
  110. package/skills/cometchat-angular-v5-features/references/formatters.md +28 -0
  111. package/skills/cometchat-angular-v5-features/references/host-composed-extensions.md +85 -0
  112. package/skills/cometchat-angular-v5-migration/SKILL.md +40 -0
  113. package/skills/cometchat-angular-v5-migration/references/migration-guide.md +165 -0
  114. package/skills/cometchat-angular-v5-patterns/SKILL.md +107 -0
  115. package/skills/cometchat-angular-v5-placement/SKILL.md +133 -0
  116. package/skills/cometchat-angular-v5-placement/references/combined-app.md +174 -0
  117. package/skills/cometchat-angular-v5-placement/references/core-surface.md +199 -0
  118. package/skills/cometchat-angular-v5-production/SKILL.md +101 -0
  119. package/skills/cometchat-angular-v5-push/SKILL.md +61 -0
  120. package/skills/cometchat-angular-v5-testing/SKILL.md +112 -0
  121. package/skills/cometchat-angular-v5-troubleshooting/SKILL.md +96 -0
  122. package/skills/cometchat-flutter-v5-sdk/SKILL.md +188 -0
  123. package/skills/cometchat-flutter-v5-sdk/references/doc-corrections.md +55 -0
  124. package/skills/cometchat-flutter-v5-sdk/references/docs-map.md +211 -0
  125. package/skills/cometchat-flutter-v5-sdk/references/platform-notes.md +48 -0
  126. package/skills/cometchat-flutter-v5-sdk/references/transcription.md +87 -0
  127. package/skills/cometchat-flutter-v6-calls/SKILL.md +75 -387
  128. package/skills/cometchat-flutter-v6-components/SKILL.md +88 -361
  129. package/skills/cometchat-flutter-v6-core/SKILL.md +154 -593
  130. package/skills/cometchat-flutter-v6-core/references/anti-patterns.md +55 -0
  131. package/skills/cometchat-flutter-v6-core/references/docs-map.md +143 -0
  132. package/skills/cometchat-flutter-v6-core/references/layout.md +45 -0
  133. package/skills/cometchat-flutter-v6-core/references/lifecycle.md +87 -0
  134. package/skills/cometchat-flutter-v6-core/references/setup-credentials.md +84 -0
  135. package/skills/cometchat-flutter-v6-core/references/troubleshooting.md +26 -0
  136. package/skills/cometchat-flutter-v6-customization/SKILL.md +70 -712
  137. package/skills/cometchat-flutter-v6-events/SKILL.md +79 -174
  138. package/skills/cometchat-flutter-v6-features/SKILL.md +55 -394
  139. package/skills/cometchat-flutter-v6-migration/SKILL.md +68 -367
  140. package/skills/cometchat-flutter-v6-migration/references/migration-guide.md +131 -0
  141. package/skills/cometchat-flutter-v6-patterns/SKILL.md +61 -0
  142. package/skills/cometchat-flutter-v6-placement/SKILL.md +94 -381
  143. package/skills/cometchat-flutter-v6-production/SKILL.md +58 -615
  144. package/skills/cometchat-flutter-v6-push/SKILL.md +46 -455
  145. package/skills/cometchat-flutter-v6-testing/SKILL.md +68 -299
  146. package/skills/cometchat-flutter-v6-troubleshooting/SKILL.md +54 -878
  147. package/skills/cometchat-ios-calls/SKILL.md +105 -511
  148. package/skills/cometchat-ios-components/SKILL.md +44 -834
  149. package/skills/cometchat-ios-core/SKILL.md +181 -1068
  150. package/skills/cometchat-ios-core/references/anti-patterns.md +80 -0
  151. package/skills/cometchat-ios-core/references/docs-map.md +123 -0
  152. package/skills/cometchat-ios-core/references/install.md +23 -0
  153. package/skills/cometchat-ios-core/references/layout.md +186 -0
  154. package/skills/cometchat-ios-core/references/setup-credentials.md +197 -0
  155. package/skills/cometchat-ios-core/references/swiftui.md +91 -0
  156. package/skills/cometchat-ios-core/references/troubleshooting.md +100 -0
  157. package/skills/cometchat-ios-customization/SKILL.md +33 -968
  158. package/skills/cometchat-ios-features/SKILL.md +29 -738
  159. package/skills/cometchat-ios-migration/SKILL.md +39 -0
  160. package/skills/cometchat-ios-placement/SKILL.md +51 -729
  161. package/skills/cometchat-ios-push/SKILL.md +24 -602
  162. package/skills/cometchat-ios-v5-sdk/SKILL.md +161 -0
  163. package/skills/cometchat-ios-v5-sdk/references/docs-map.md +326 -0
  164. package/skills/cometchat-js-v5-sdk/SKILL.md +95 -0
  165. package/skills/cometchat-js-v5-sdk/references/docs-map.md +114 -0
  166. package/skills/cometchat-onboarding/SKILL.md +89 -0
  167. package/skills/cometchat-onboarding/references/archetypes.md +51 -0
  168. package/skills/cometchat-onboarding/references/calling-first.md +77 -0
  169. package/skills/cometchat-onboarding/references/not-in-this-pack.md +8 -0
  170. package/skills/cometchat-onboarding/references/plan-artifact.md +133 -0
  171. package/skills/cometchat-onboarding/references/platforms.md +90 -0
  172. package/skills/cometchat-react-native-bare-patterns/SKILL.md +120 -0
  173. package/skills/cometchat-react-native-calls/SKILL.md +200 -0
  174. package/skills/cometchat-react-native-components/SKILL.md +142 -0
  175. package/skills/cometchat-react-native-core/SKILL.md +313 -0
  176. package/skills/cometchat-react-native-core/references/anti-patterns.md +79 -0
  177. package/skills/cometchat-react-native-core/references/component-props.md +105 -0
  178. package/skills/cometchat-react-native-core/references/dependencies.md +62 -0
  179. package/skills/cometchat-react-native-core/references/docs-map.md +126 -0
  180. package/skills/cometchat-react-native-core/references/layout.md +61 -0
  181. package/skills/cometchat-react-native-core/references/lifecycle.md +64 -0
  182. package/skills/cometchat-react-native-core/references/setup-credentials.md +39 -0
  183. package/skills/cometchat-react-native-customization/SKILL.md +198 -0
  184. package/skills/cometchat-react-native-expo-patterns/SKILL.md +116 -0
  185. package/skills/cometchat-react-native-features/SKILL.md +122 -0
  186. package/skills/cometchat-react-native-migration/SKILL.md +103 -0
  187. package/skills/cometchat-react-native-placement/SKILL.md +158 -0
  188. package/skills/cometchat-react-native-production/SKILL.md +78 -0
  189. package/skills/cometchat-react-native-push/SKILL.md +88 -0
  190. package/skills/cometchat-react-native-sdk/SKILL.md +126 -0
  191. package/skills/cometchat-react-native-sdk/references/method-map.md +239 -0
  192. package/skills/cometchat-react-native-sdk/references/page-map.md +96 -0
  193. package/skills/cometchat-react-native-testing/SKILL.md +94 -0
  194. package/skills/cometchat-react-native-troubleshooting/SKILL.md +116 -0
  195. package/skills/cometchat-react-native-v5-sdk/SKILL.md +150 -0
  196. package/skills/cometchat-react-native-v5-sdk/references/docs-map.md +127 -0
  197. package/skills/cometchat-react-native-v5-sdk/references/ringing-voip.md +369 -0
  198. package/skills/cometchat-react-v7-calls/SKILL.md +75 -0
  199. package/skills/cometchat-react-v7-components/SKILL.md +72 -0
  200. package/skills/cometchat-react-v7-core/SKILL.md +101 -0
  201. package/skills/cometchat-react-v7-core/references/anti-patterns.md +19 -0
  202. package/skills/cometchat-react-v7-core/references/component-props.md +82 -0
  203. package/skills/cometchat-react-v7-core/references/dependencies.md +23 -0
  204. package/skills/cometchat-react-v7-core/references/docs-map.md +117 -0
  205. package/skills/cometchat-react-v7-core/references/i18n-rtl-a11y.md +22 -0
  206. package/skills/cometchat-react-v7-core/references/layout.md +158 -0
  207. package/skills/cometchat-react-v7-core/references/lifecycle.md +74 -0
  208. package/skills/cometchat-react-v7-core/references/setup-credentials.md +58 -0
  209. package/skills/cometchat-react-v7-core/references/ssr.md +11 -0
  210. package/skills/cometchat-react-v7-core/references/theming.md +52 -0
  211. package/skills/cometchat-react-v7-core/references/troubleshooting.md +28 -0
  212. package/skills/cometchat-react-v7-customization/SKILL.md +84 -0
  213. package/skills/cometchat-react-v7-features/SKILL.md +92 -0
  214. package/skills/cometchat-react-v7-migration/SKILL.md +39 -0
  215. package/skills/cometchat-react-v7-migration/references/migration-guide.md +119 -0
  216. package/skills/cometchat-react-v7-patterns/SKILL.md +43 -0
  217. package/skills/cometchat-react-v7-placement/SKILL.md +106 -0
  218. package/skills/cometchat-react-v7-placement/references/recipes.md +354 -0
  219. package/skills/cometchat-react-v7-push/SKILL.md +53 -0
  220. package/test-suite/README.md +70 -0
  221. package/test-suite/catalogs/android-calls-v5.json +830 -0
  222. package/test-suite/catalogs/android-calls-v5.symbols.txt +499 -0
  223. package/test-suite/catalogs/android-v6.json +1646 -0
  224. package/test-suite/catalogs/android-v6.symbols.txt +298 -0
  225. package/test-suite/catalogs/angular-v5.json +7587 -0
  226. package/test-suite/catalogs/flutter-calls-v5.json +196 -0
  227. package/test-suite/catalogs/flutter-calls-v5.symbols.txt +59 -0
  228. package/test-suite/catalogs/flutter-v6.json +651 -0
  229. package/test-suite/catalogs/ios-calls-v5.json +158 -0
  230. package/test-suite/catalogs/ios-calls-v5.symbols.txt +70 -0
  231. package/test-suite/catalogs/ios-v5.json +1383 -0
  232. package/test-suite/catalogs/ios-v5.symbols.txt +699 -0
  233. package/test-suite/catalogs/rn-calls-v5.json +134 -0
  234. package/test-suite/catalogs/rn-sdk-v4.json +672 -0
  235. package/test-suite/catalogs/rn-v5.json +449 -0
  236. package/test-suite/catalogs/sdk-android-v5.json +514 -0
  237. package/test-suite/catalogs/sdk-android-v5.symbols.txt +254 -0
  238. package/test-suite/catalogs/sdk-jsv4.json +800 -0
  239. package/test-suite/catalogs/web-calls-v5.json +195 -0
  240. package/test-suite/catalogs/web-v7.json +1243 -0
  241. package/test-suite/scripts/build-registry.mjs +113 -0
  242. package/test-suite/scripts/catalog-refresh-dart.mjs +151 -0
  243. package/test-suite/scripts/catalog-refresh.mjs +100 -0
  244. package/test-suite/scripts/lint-skills.mjs +909 -0
  245. package/test-suite/scripts/measure-tokens.mjs +169 -0
  246. package/test-suite/scripts/typecheck-fences-dart.mjs +437 -0
  247. package/test-suite/scripts/typecheck-fences-kotlin.mjs +269 -0
  248. package/test-suite/scripts/typecheck-fences.mjs +206 -0
  249. package/test-suite/scripts/verify-catalog.mjs +242 -0
  250. package/test-suite/scripts/verify-contract-fences.mjs +94 -0
  251. package/test-suite/scripts/verify-detection.mjs +178 -0
  252. package/test-suite/scripts/verify-docs-base.mjs +91 -0
  253. package/test-suite/scripts/verify-family-agnostic.mjs +130 -0
  254. package/test-suite/scripts/verify-golden-path.mjs +138 -0
  255. package/test-suite/scripts/verify-oracle-components.mjs +133 -0
  256. package/test-suite/scripts/verify-template-bindings.mjs +148 -0
  257. package/test-suite/typecheck/angular-v5/package.json +21 -0
  258. package/test-suite/typecheck/angular-v5/tsconfig.json +21 -0
  259. package/test-suite/typecheck/flutter-v6/analysis_options.yaml +25 -0
  260. package/test-suite/typecheck/flutter-v6/pubspec.yaml +21 -0
  261. package/test-suite/typecheck/web-v7/package.json +18 -0
  262. package/test-suite/typecheck/web-v7/tsconfig.json +19 -0
  263. package/bin/install.js +0 -1003
  264. package/skills/.claude-plugin/marketplace.json +0 -86
  265. package/skills/cometchat/references/asking-questions.md +0 -48
  266. package/skills/cometchat-a11y/SKILL.md +0 -477
  267. package/skills/cometchat-android-v5/SKILL.md +0 -121
  268. package/skills/cometchat-android-v5-calls/SKILL.md +0 -427
  269. package/skills/cometchat-android-v5-calls/references/README.md +0 -53
  270. package/skills/cometchat-android-v5-calls/references/add-calls-to-existing-chat.md +0 -197
  271. package/skills/cometchat-android-v5-calls/references/audio-controls.md +0 -91
  272. package/skills/cometchat-android-v5-calls/references/background-handling.md +0 -168
  273. package/skills/cometchat-android-v5-calls/references/call-layouts.md +0 -131
  274. package/skills/cometchat-android-v5-calls/references/call-logs.md +0 -113
  275. package/skills/cometchat-android-v5-calls/references/call-session.md +0 -274
  276. package/skills/cometchat-android-v5-calls/references/custom-ui.md +0 -150
  277. package/skills/cometchat-android-v5-calls/references/event-listeners.md +0 -123
  278. package/skills/cometchat-android-v5-calls/references/group-calls.md +0 -205
  279. package/skills/cometchat-android-v5-calls/references/idle-timeout.md +0 -117
  280. package/skills/cometchat-android-v5-calls/references/in-call-chat.md +0 -134
  281. package/skills/cometchat-android-v5-calls/references/join-session.md +0 -120
  282. package/skills/cometchat-android-v5-calls/references/migration-v4-to-v5.md +0 -222
  283. package/skills/cometchat-android-v5-calls/references/participant-management.md +0 -110
  284. package/skills/cometchat-android-v5-calls/references/picture-in-picture.md +0 -106
  285. package/skills/cometchat-android-v5-calls/references/raise-hand.md +0 -248
  286. package/skills/cometchat-android-v5-calls/references/recording.md +0 -101
  287. package/skills/cometchat-android-v5-calls/references/ringing-integration.md +0 -152
  288. package/skills/cometchat-android-v5-calls/references/screen-sharing.md +0 -78
  289. package/skills/cometchat-android-v5-calls/references/server-fcm-voip.md +0 -215
  290. package/skills/cometchat-android-v5-calls/references/session-settings.md +0 -121
  291. package/skills/cometchat-android-v5-calls/references/setup.md +0 -137
  292. package/skills/cometchat-android-v5-calls/references/share-invite.md +0 -156
  293. package/skills/cometchat-android-v5-calls/references/video-controls.md +0 -87
  294. package/skills/cometchat-android-v5-calls/references/voip-calling.md +0 -526
  295. package/skills/cometchat-android-v5-components/SKILL.md +0 -431
  296. package/skills/cometchat-android-v5-core/SKILL.md +0 -486
  297. package/skills/cometchat-android-v5-customization/SKILL.md +0 -469
  298. package/skills/cometchat-android-v5-extensions/SKILL.md +0 -127
  299. package/skills/cometchat-android-v5-features/SKILL.md +0 -131
  300. package/skills/cometchat-android-v5-placement/SKILL.md +0 -277
  301. package/skills/cometchat-android-v5-production/SKILL.md +0 -95
  302. package/skills/cometchat-android-v5-push/SKILL.md +0 -619
  303. package/skills/cometchat-android-v5-testing/SKILL.md +0 -188
  304. package/skills/cometchat-android-v5-theming/SKILL.md +0 -167
  305. package/skills/cometchat-android-v5-troubleshooting/SKILL.md +0 -74
  306. package/skills/cometchat-android-v6/SKILL.md +0 -108
  307. package/skills/cometchat-android-v6-calls/references/add-calls-to-existing-chat.md +0 -97
  308. package/skills/cometchat-android-v6-calls/references/advanced-features.md +0 -87
  309. package/skills/cometchat-android-v6-calls/references/call-layouts.md +0 -100
  310. package/skills/cometchat-android-v6-calls/references/call-session.md +0 -163
  311. package/skills/cometchat-android-v6-calls/references/device-management.md +0 -172
  312. package/skills/cometchat-android-v6-calls/references/group-calls.md +0 -191
  313. package/skills/cometchat-android-v6-calls/references/idle-timeout.md +0 -110
  314. package/skills/cometchat-android-v6-calls/references/in-call-chat.md +0 -141
  315. package/skills/cometchat-android-v6-calls/references/raise-hand.md +0 -188
  316. package/skills/cometchat-android-v6-calls/references/ringing-integration.md +0 -176
  317. package/skills/cometchat-android-v6-calls/references/server-fcm-voip.md +0 -127
  318. package/skills/cometchat-android-v6-calls/references/share-invite.md +0 -105
  319. package/skills/cometchat-android-v6-compose-theming/SKILL.md +0 -250
  320. package/skills/cometchat-android-v6-kotlin-theming/SKILL.md +0 -233
  321. package/skills/cometchat-angular-calls/SKILL.md +0 -378
  322. package/skills/cometchat-angular-calls/references/add-calls-to-existing-chat.md +0 -96
  323. package/skills/cometchat-angular-calls/references/call-layouts.md +0 -123
  324. package/skills/cometchat-angular-calls/references/call-session.md +0 -167
  325. package/skills/cometchat-angular-calls/references/custom-ui.md +0 -239
  326. package/skills/cometchat-angular-calls/references/device-management.md +0 -154
  327. package/skills/cometchat-angular-calls/references/group-calls.md +0 -433
  328. package/skills/cometchat-angular-calls/references/idle-timeout.md +0 -161
  329. package/skills/cometchat-angular-calls/references/in-call-chat.md +0 -148
  330. package/skills/cometchat-angular-calls/references/lazy-loading-pitfalls.md +0 -205
  331. package/skills/cometchat-angular-calls/references/migration-v4-to-v5.md +0 -53
  332. package/skills/cometchat-angular-calls/references/ngzone-and-async-callbacks.md +0 -184
  333. package/skills/cometchat-angular-calls/references/picture-in-picture.md +0 -285
  334. package/skills/cometchat-angular-calls/references/raise-hand.md +0 -172
  335. package/skills/cometchat-angular-calls/references/recording-screen-share.md +0 -260
  336. package/skills/cometchat-angular-calls/references/ringing-integration.md +0 -133
  337. package/skills/cometchat-angular-calls/references/server-web-push-vapid.md +0 -100
  338. package/skills/cometchat-angular-calls/references/share-invite.md +0 -122
  339. package/skills/cometchat-angular-calls/references/virtual-background.md +0 -29
  340. package/skills/cometchat-angular-components/SKILL.md +0 -235
  341. package/skills/cometchat-angular-core/SKILL.md +0 -386
  342. package/skills/cometchat-angular-customization/SKILL.md +0 -616
  343. package/skills/cometchat-angular-features/SKILL.md +0 -329
  344. package/skills/cometchat-angular-patterns/SKILL.md +0 -256
  345. package/skills/cometchat-angular-placement/SKILL.md +0 -314
  346. package/skills/cometchat-angular-production/SKILL.md +0 -564
  347. package/skills/cometchat-angular-push/SKILL.md +0 -389
  348. package/skills/cometchat-angular-testing/SKILL.md +0 -605
  349. package/skills/cometchat-angular-theming/SKILL.md +0 -290
  350. package/skills/cometchat-angular-troubleshooting/SKILL.md +0 -364
  351. package/skills/cometchat-astro-patterns/SKILL.md +0 -708
  352. package/skills/cometchat-calls/SKILL.md +0 -364
  353. package/skills/cometchat-calls/references/use-case-broadcast.md +0 -199
  354. package/skills/cometchat-calls/references/use-case-marketplace.md +0 -157
  355. package/skills/cometchat-calls/references/use-case-support.md +0 -189
  356. package/skills/cometchat-calls/references/use-case-team.md +0 -180
  357. package/skills/cometchat-calls/references/use-case-telehealth.md +0 -153
  358. package/skills/cometchat-components/SKILL.md +0 -1142
  359. package/skills/cometchat-core/SKILL.md +0 -1048
  360. package/skills/cometchat-customization/SKILL.md +0 -580
  361. package/skills/cometchat-customization/references/component-catalog.md +0 -236
  362. package/skills/cometchat-features/SKILL.md +0 -861
  363. package/skills/cometchat-flutter-v5/SKILL.md +0 -173
  364. package/skills/cometchat-flutter-v5-calls/SKILL.md +0 -453
  365. package/skills/cometchat-flutter-v5-calls/references/add-calls-to-existing-chat.md +0 -193
  366. package/skills/cometchat-flutter-v5-calls/references/call-layouts.md +0 -103
  367. package/skills/cometchat-flutter-v5-calls/references/call-session.md +0 -285
  368. package/skills/cometchat-flutter-v5-calls/references/device-management.md +0 -124
  369. package/skills/cometchat-flutter-v5-calls/references/group-calls.md +0 -181
  370. package/skills/cometchat-flutter-v5-calls/references/idle-timeout.md +0 -99
  371. package/skills/cometchat-flutter-v5-calls/references/in-call-chat.md +0 -135
  372. package/skills/cometchat-flutter-v5-calls/references/migration-v4-to-v5.md +0 -210
  373. package/skills/cometchat-flutter-v5-calls/references/raise-hand.md +0 -255
  374. package/skills/cometchat-flutter-v5-calls/references/ringing-integration.md +0 -196
  375. package/skills/cometchat-flutter-v5-calls/references/server-push-bridge.md +0 -101
  376. package/skills/cometchat-flutter-v5-calls/references/share-invite.md +0 -148
  377. package/skills/cometchat-flutter-v5-conversations/SKILL.md +0 -118
  378. package/skills/cometchat-flutter-v5-core/SKILL.md +0 -239
  379. package/skills/cometchat-flutter-v5-customization/SKILL.md +0 -358
  380. package/skills/cometchat-flutter-v5-events/SKILL.md +0 -156
  381. package/skills/cometchat-flutter-v5-messages/SKILL.md +0 -259
  382. package/skills/cometchat-flutter-v5-production/SKILL.md +0 -216
  383. package/skills/cometchat-flutter-v5-push/SKILL.md +0 -285
  384. package/skills/cometchat-flutter-v5-testing/SKILL.md +0 -401
  385. package/skills/cometchat-flutter-v5-theming/SKILL.md +0 -161
  386. package/skills/cometchat-flutter-v5-troubleshooting/SKILL.md +0 -130
  387. package/skills/cometchat-flutter-v5-users-groups/SKILL.md +0 -152
  388. package/skills/cometchat-flutter-v6/SKILL.md +0 -446
  389. package/skills/cometchat-flutter-v6-calls/references/add-calls-to-existing-chat.md +0 -136
  390. package/skills/cometchat-flutter-v6-calls/references/advanced-features.md +0 -89
  391. package/skills/cometchat-flutter-v6-calls/references/call-layouts.md +0 -105
  392. package/skills/cometchat-flutter-v6-calls/references/call-session.md +0 -229
  393. package/skills/cometchat-flutter-v6-calls/references/device-management.md +0 -105
  394. package/skills/cometchat-flutter-v6-calls/references/group-calls.md +0 -190
  395. package/skills/cometchat-flutter-v6-calls/references/idle-timeout.md +0 -88
  396. package/skills/cometchat-flutter-v6-calls/references/in-call-chat.md +0 -125
  397. package/skills/cometchat-flutter-v6-calls/references/raise-hand.md +0 -275
  398. package/skills/cometchat-flutter-v6-calls/references/ringing-integration.md +0 -171
  399. package/skills/cometchat-flutter-v6-calls/references/server-push-bridge.md +0 -93
  400. package/skills/cometchat-flutter-v6-calls/references/share-invite.md +0 -102
  401. package/skills/cometchat-flutter-v6-conversations/SKILL.md +0 -238
  402. package/skills/cometchat-flutter-v6-messages/SKILL.md +0 -384
  403. package/skills/cometchat-flutter-v6-theming/SKILL.md +0 -293
  404. package/skills/cometchat-flutter-v6-users-groups/SKILL.md +0 -224
  405. package/skills/cometchat-i18n/SKILL.md +0 -419
  406. package/skills/cometchat-ios/SKILL.md +0 -325
  407. package/skills/cometchat-ios-calls/references/add-calls-to-existing-chat.md +0 -174
  408. package/skills/cometchat-ios-calls/references/audio-modes-and-controls.md +0 -45
  409. package/skills/cometchat-ios-calls/references/avaudiosession-routing.md +0 -188
  410. package/skills/cometchat-ios-calls/references/call-layouts.md +0 -76
  411. package/skills/cometchat-ios-calls/references/call-session.md +0 -218
  412. package/skills/cometchat-ios-calls/references/callkit-and-pushkit.md +0 -357
  413. package/skills/cometchat-ios-calls/references/custom-ui.md +0 -322
  414. package/skills/cometchat-ios-calls/references/device-management.md +0 -171
  415. package/skills/cometchat-ios-calls/references/group-calls.md +0 -359
  416. package/skills/cometchat-ios-calls/references/idle-timeout.md +0 -184
  417. package/skills/cometchat-ios-calls/references/in-call-chat.md +0 -179
  418. package/skills/cometchat-ios-calls/references/migration-v4-to-v5.md +0 -196
  419. package/skills/cometchat-ios-calls/references/picture-in-picture.md +0 -246
  420. package/skills/cometchat-ios-calls/references/raise-hand.md +0 -26
  421. package/skills/cometchat-ios-calls/references/recording-screen-share.md +0 -252
  422. package/skills/cometchat-ios-calls/references/ringing-integration.md +0 -143
  423. package/skills/cometchat-ios-calls/references/server-apns-pushkit.md +0 -267
  424. package/skills/cometchat-ios-calls/references/share-invite.md +0 -148
  425. package/skills/cometchat-ios-calls/references/swiftui-uikit-hosting.md +0 -246
  426. package/skills/cometchat-ios-calls/references/voip-cert-setup.md +0 -166
  427. package/skills/cometchat-ios-production/SKILL.md +0 -738
  428. package/skills/cometchat-ios-testing/SKILL.md +0 -376
  429. package/skills/cometchat-ios-theming/SKILL.md +0 -667
  430. package/skills/cometchat-ios-troubleshooting/SKILL.md +0 -1003
  431. package/skills/cometchat-native-bare-patterns/SKILL.md +0 -550
  432. package/skills/cometchat-native-calls/SKILL.md +0 -669
  433. package/skills/cometchat-native-calls/references/add-calls-to-existing-chat.md +0 -203
  434. package/skills/cometchat-native-calls/references/call-layouts.md +0 -125
  435. package/skills/cometchat-native-calls/references/call-session.md +0 -182
  436. package/skills/cometchat-native-calls/references/custom-ui.md +0 -254
  437. package/skills/cometchat-native-calls/references/device-management.md +0 -158
  438. package/skills/cometchat-native-calls/references/expo-vs-bare.md +0 -179
  439. package/skills/cometchat-native-calls/references/group-calls.md +0 -296
  440. package/skills/cometchat-native-calls/references/idle-timeout.md +0 -128
  441. package/skills/cometchat-native-calls/references/in-call-chat.md +0 -145
  442. package/skills/cometchat-native-calls/references/migration-v4-to-v5.md +0 -72
  443. package/skills/cometchat-native-calls/references/picture-in-picture.md +0 -276
  444. package/skills/cometchat-native-calls/references/raise-hand.md +0 -205
  445. package/skills/cometchat-native-calls/references/recording-screen-share.md +0 -169
  446. package/skills/cometchat-native-calls/references/ringing-integration.md +0 -118
  447. package/skills/cometchat-native-calls/references/server-push-bridge.md +0 -135
  448. package/skills/cometchat-native-calls/references/server-push-payloads.md +0 -193
  449. package/skills/cometchat-native-calls/references/share-invite.md +0 -146
  450. package/skills/cometchat-native-calls/references/voip-push-end-to-end.md +0 -319
  451. package/skills/cometchat-native-components/SKILL.md +0 -628
  452. package/skills/cometchat-native-core/SKILL.md +0 -679
  453. package/skills/cometchat-native-customization/SKILL.md +0 -716
  454. package/skills/cometchat-native-expo-patterns/SKILL.md +0 -552
  455. package/skills/cometchat-native-features/SKILL.md +0 -638
  456. package/skills/cometchat-native-placement/SKILL.md +0 -509
  457. package/skills/cometchat-native-production/SKILL.md +0 -700
  458. package/skills/cometchat-native-push/SKILL.md +0 -594
  459. package/skills/cometchat-native-testing/SKILL.md +0 -582
  460. package/skills/cometchat-native-theming/SKILL.md +0 -681
  461. package/skills/cometchat-native-troubleshooting/SKILL.md +0 -501
  462. package/skills/cometchat-nextjs-patterns/SKILL.md +0 -899
  463. package/skills/cometchat-placement/SKILL.md +0 -1360
  464. package/skills/cometchat-production/SKILL.md +0 -1027
  465. package/skills/cometchat-react-calls/SKILL.md +0 -749
  466. package/skills/cometchat-react-calls/references/add-calls-to-existing-chat.md +0 -146
  467. package/skills/cometchat-react-calls/references/call-layouts.md +0 -160
  468. package/skills/cometchat-react-calls/references/call-session.md +0 -235
  469. package/skills/cometchat-react-calls/references/custom-ui.md +0 -247
  470. package/skills/cometchat-react-calls/references/device-management.md +0 -210
  471. package/skills/cometchat-react-calls/references/group-calls.md +0 -257
  472. package/skills/cometchat-react-calls/references/idle-timeout.md +0 -188
  473. package/skills/cometchat-react-calls/references/in-call-chat.md +0 -212
  474. package/skills/cometchat-react-calls/references/migration-v4-to-v5.md +0 -170
  475. package/skills/cometchat-react-calls/references/picture-in-picture.md +0 -245
  476. package/skills/cometchat-react-calls/references/raise-hand.md +0 -238
  477. package/skills/cometchat-react-calls/references/recording-screen-share.md +0 -144
  478. package/skills/cometchat-react-calls/references/ringing-integration.md +0 -255
  479. package/skills/cometchat-react-calls/references/server-web-push-vapid.md +0 -241
  480. package/skills/cometchat-react-calls/references/share-invite.md +0 -175
  481. package/skills/cometchat-react-calls/references/testing-calls-on-web.md +0 -216
  482. package/skills/cometchat-react-calls/references/virtual-background.md +0 -32
  483. package/skills/cometchat-react-calls/references/voip-and-web-push.md +0 -165
  484. package/skills/cometchat-react-patterns/SKILL.md +0 -628
  485. package/skills/cometchat-react-push/SKILL.md +0 -634
  486. package/skills/cometchat-react-router-patterns/SKILL.md +0 -758
  487. package/skills/cometchat-react-testing/SKILL.md +0 -413
  488. package/skills/cometchat-theming/SKILL.md +0 -498
  489. 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).