@q9labsai/chalk-react-native 5.0.0 → 5.1.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 (252) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/android/build.gradle +38 -0
  3. package/android/compatibility/ModuleApiCompatibility.java +215 -0
  4. package/android/src/main/kotlin/ai/q9labs/chalk/reactnative/ChalkAudioRouteModule.kt +5 -6
  5. package/android/src/main/kotlin/ai/q9labs/chalk/reactnative/CommunicationDeviceListener.kt +23 -0
  6. package/dist/android/call-service.d.ts +0 -1
  7. package/dist/android/connection-service.d.ts +0 -1
  8. package/dist/avatar/FaceAvatar.d.ts +0 -1
  9. package/dist/avatar/tile-avatar-size.d.ts +0 -1
  10. package/dist/callkit/callkit.d.ts +0 -1
  11. package/dist/callkit/resolve-space-callkit-options.d.ts +0 -1
  12. package/dist/{chunk-OIBT2FNM.js → chunk-MBZRE4US.js} +2 -3
  13. package/dist/client.d.ts +0 -1
  14. package/dist/client.js +8 -5
  15. package/dist/clipboard-store.d.ts +0 -1
  16. package/dist/clipboard.d.ts +0 -1
  17. package/dist/components/EmbeddedWhiteboard.d.ts +0 -1
  18. package/dist/components/RtcVideoView.d.ts +0 -1
  19. package/dist/components/android-connection-service-controller.d.ts +0 -1
  20. package/dist/components/native-media-visibility.d.ts +0 -1
  21. package/dist/components/native-space-callkit-controller.d.ts +0 -1
  22. package/dist/components/native-space-view/screen-share-availability.d.ts +0 -1
  23. package/dist/components/rtc-video-view-availability.d.ts +0 -1
  24. package/dist/components/space-lifecycle.d.ts +0 -1
  25. package/dist/components/useAndroidCallService.d.ts +0 -1
  26. package/dist/components/useAndroidConnectionService.d.ts +0 -1
  27. package/dist/context/space-client-context.d.ts +0 -1
  28. package/dist/dev.d.ts +0 -1
  29. package/dist/diagnostics.d.ts +0 -1
  30. package/dist/dock/Dock.d.ts +0 -1
  31. package/dist/dock/LeaveMenu.d.ts +0 -1
  32. package/dist/dock/MoreSheet.d.ts +0 -1
  33. package/dist/dock/ReactionBurst.d.ts +0 -1
  34. package/dist/dock/RoutePicker.d.ts +0 -1
  35. package/dist/dock/audio-route.d.ts +0 -1
  36. package/dist/frame/CallFrame.d.ts +0 -1
  37. package/dist/frame/Chalk.d.ts +0 -1
  38. package/dist/frame/back-handler.d.ts +0 -1
  39. package/dist/frame/dev-scenario.d.ts +0 -1
  40. package/dist/frame/device-layout.d.ts +0 -1
  41. package/dist/frame/measurement.d.ts +0 -1
  42. package/dist/frame/portal.d.ts +0 -1
  43. package/dist/frame/preferences.d.ts +0 -1
  44. package/dist/frame/regions.d.ts +0 -1
  45. package/dist/haptics/haptics.d.ts +0 -1
  46. package/dist/header/CallDetailsSheet.d.ts +0 -1
  47. package/dist/header/Header.d.ts +0 -1
  48. package/dist/header/QrCode.d.ts +0 -1
  49. package/dist/hooks/external-store.d.ts +0 -1
  50. package/dist/hooks/space-hooks.d.ts +0 -1
  51. package/dist/icons/Icon.d.ts +0 -1
  52. package/dist/icons/icon-element.d.ts +0 -1
  53. package/dist/icons/icon-paths.d.ts +0 -1
  54. package/dist/index.d.ts +0 -1
  55. package/dist/index.js +45 -17
  56. package/dist/invites.d.ts +0 -1
  57. package/dist/limbo/Limbo.d.ts +0 -1
  58. package/dist/limbo/Veil.d.ts +0 -1
  59. package/dist/media/native-capture-error.d.ts +0 -1
  60. package/dist/media/native-webrtc.d.ts +0 -1
  61. package/dist/motion/MovingFrame.d.ts +0 -1
  62. package/dist/motion/motion.d.ts +0 -1
  63. package/dist/motion/presence.d.ts +0 -1
  64. package/dist/motion/press.d.ts +0 -1
  65. package/dist/platform/platform.d.ts +0 -1
  66. package/dist/primitives/BottomSheet.d.ts +0 -1
  67. package/dist/primitives/ChalkText.d.ts +0 -1
  68. package/dist/primitives/CopyButton.d.ts +0 -1
  69. package/dist/primitives/IconButton.d.ts +0 -1
  70. package/dist/primitives/Menu.d.ts +0 -1
  71. package/dist/primitives/NameTag.d.ts +0 -1
  72. package/dist/primitives/PillButton.d.ts +0 -1
  73. package/dist/primitives/SegmentedControl.d.ts +0 -1
  74. package/dist/primitives/SheetGroup.d.ts +0 -1
  75. package/dist/primitives/Switch.d.ts +0 -1
  76. package/dist/primitives/TileShell.d.ts +0 -1
  77. package/dist/primitives/announce.d.ts +0 -1
  78. package/dist/primitives/menu-placement.d.ts +0 -1
  79. package/dist/primitives/toast/Toast.d.ts +0 -1
  80. package/dist/primitives/toast/ToastStack.d.ts +0 -1
  81. package/dist/primitives/toast/toast-store.d.ts +0 -1
  82. package/dist/runtime.d.ts +0 -1
  83. package/dist/sheets/people-chat/ChatNotices.d.ts +0 -1
  84. package/dist/sheets/people-chat/ChatTab.d.ts +0 -1
  85. package/dist/sheets/people-chat/Composer.d.ts +0 -1
  86. package/dist/sheets/people-chat/PeopleChatSheet.d.ts +0 -1
  87. package/dist/sheets/people-chat/PeopleTab.d.ts +0 -1
  88. package/dist/sheets/people-chat/PhotoViewer.d.ts +0 -1
  89. package/dist/sheets/people-chat/TextField.d.ts +0 -1
  90. package/dist/sheets/people-chat/attachments.d.ts +0 -1
  91. package/dist/sheets/people-chat/chat-model.d.ts +0 -1
  92. package/dist/sheets/people-chat/people-model.d.ts +0 -1
  93. package/dist/sounds/sounds.d.ts +0 -1
  94. package/dist/space-client/create-native-space-client.d.ts +0 -1
  95. package/dist/space-client/random-uuid.d.ts +0 -1
  96. package/dist/stage/ContentTile.d.ts +0 -1
  97. package/dist/stage/ParticipantTile.d.ts +0 -1
  98. package/dist/stage/Stage.d.ts +0 -1
  99. package/dist/stage/TileSheet.d.ts +0 -1
  100. package/dist/stage/camera.d.ts +0 -1
  101. package/dist/stage/layout.d.ts +0 -1
  102. package/dist/stage/space-selector.d.ts +0 -1
  103. package/dist/stage/stage-view.d.ts +0 -1
  104. package/dist/status/CallOverlays.d.ts +1 -2
  105. package/dist/status/ChalkArrival.d.ts +0 -1
  106. package/dist/status/StatusPage.d.ts +0 -1
  107. package/dist/status/call-screen.d.ts +0 -1
  108. package/dist/theme/theme.d.ts +0 -1
  109. package/dist/theme/tokens.d.ts +0 -1
  110. package/dist/toasts/CallEventToasts.d.ts +1 -2
  111. package/dist/toasts/media-failure-copy.d.ts +2 -0
  112. package/dist/toasts/notices.d.ts +0 -1
  113. package/dist/ui/ChalkUI.d.ts +0 -1
  114. package/dist/ui.d.ts +0 -1
  115. package/dist/ui.js +1 -1
  116. package/dist/utils/build-chalk-invite-link.d.ts +0 -1
  117. package/dist/utils/ios-simulator.d.ts +0 -1
  118. package/dist/whiteboard/embedded-whiteboard-assets.d.ts +0 -1
  119. package/dist/whiteboard/embedded-whiteboard-viewport.d.ts +0 -1
  120. package/embedded/chalk-whiteboard/asset-manifest.json +2 -2
  121. package/embedded/chalk-whiteboard/renderer.js +579 -579
  122. package/package.json +8 -4
  123. package/src/components/rtc-video-view-availability.ts +1 -1
  124. package/src/dock/Dock.tsx +4 -2
  125. package/src/dock/MoreSheet.tsx +3 -2
  126. package/src/frame/CallFrame.tsx +4 -4
  127. package/src/frame/device-layout.tsx +2 -3
  128. package/src/space-client/create-native-space-client.ts +8 -5
  129. package/src/stage/TileSheet.tsx +5 -1
  130. package/src/status/CallOverlays.tsx +18 -3
  131. package/src/toasts/CallEventToasts.tsx +16 -7
  132. package/src/toasts/media-failure-copy.ts +10 -0
  133. package/dist/android/call-service.d.ts.map +0 -1
  134. package/dist/android/connection-service.d.ts.map +0 -1
  135. package/dist/avatar/FaceAvatar.d.ts.map +0 -1
  136. package/dist/avatar/tile-avatar-size.d.ts.map +0 -1
  137. package/dist/callkit/callkit.d.ts.map +0 -1
  138. package/dist/callkit/resolve-space-callkit-options.d.ts.map +0 -1
  139. package/dist/client.d.ts.map +0 -1
  140. package/dist/clipboard-store.d.ts.map +0 -1
  141. package/dist/clipboard.d.ts.map +0 -1
  142. package/dist/components/EmbeddedWhiteboard.d.ts.map +0 -1
  143. package/dist/components/RtcVideoView.d.ts.map +0 -1
  144. package/dist/components/android-connection-service-controller.d.ts.map +0 -1
  145. package/dist/components/native-media-visibility.d.ts.map +0 -1
  146. package/dist/components/native-space-callkit-controller.d.ts.map +0 -1
  147. package/dist/components/native-space-view/screen-share-availability.d.ts.map +0 -1
  148. package/dist/components/rtc-video-view-availability.d.ts.map +0 -1
  149. package/dist/components/space-lifecycle.d.ts.map +0 -1
  150. package/dist/components/useAndroidCallService.d.ts.map +0 -1
  151. package/dist/components/useAndroidConnectionService.d.ts.map +0 -1
  152. package/dist/context/space-client-context.d.ts.map +0 -1
  153. package/dist/dev.d.ts.map +0 -1
  154. package/dist/diagnostics.d.ts.map +0 -1
  155. package/dist/dock/Dock.d.ts.map +0 -1
  156. package/dist/dock/LeaveMenu.d.ts.map +0 -1
  157. package/dist/dock/MoreSheet.d.ts.map +0 -1
  158. package/dist/dock/ReactionBurst.d.ts.map +0 -1
  159. package/dist/dock/RoutePicker.d.ts.map +0 -1
  160. package/dist/dock/audio-route.d.ts.map +0 -1
  161. package/dist/frame/CallFrame.d.ts.map +0 -1
  162. package/dist/frame/Chalk.d.ts.map +0 -1
  163. package/dist/frame/back-handler.d.ts.map +0 -1
  164. package/dist/frame/dev-scenario.d.ts.map +0 -1
  165. package/dist/frame/device-layout.d.ts.map +0 -1
  166. package/dist/frame/measurement.d.ts.map +0 -1
  167. package/dist/frame/portal.d.ts.map +0 -1
  168. package/dist/frame/preferences.d.ts.map +0 -1
  169. package/dist/frame/regions.d.ts.map +0 -1
  170. package/dist/haptics/haptics.d.ts.map +0 -1
  171. package/dist/header/CallDetailsSheet.d.ts.map +0 -1
  172. package/dist/header/Header.d.ts.map +0 -1
  173. package/dist/header/QrCode.d.ts.map +0 -1
  174. package/dist/hooks/external-store.d.ts.map +0 -1
  175. package/dist/hooks/space-hooks.d.ts.map +0 -1
  176. package/dist/icons/Icon.d.ts.map +0 -1
  177. package/dist/icons/icon-element.d.ts.map +0 -1
  178. package/dist/icons/icon-paths.d.ts.map +0 -1
  179. package/dist/index.d.ts.map +0 -1
  180. package/dist/invites.d.ts.map +0 -1
  181. package/dist/limbo/Limbo.d.ts.map +0 -1
  182. package/dist/limbo/Veil.d.ts.map +0 -1
  183. package/dist/media/native-capture-error.d.ts.map +0 -1
  184. package/dist/media/native-webrtc.d.ts.map +0 -1
  185. package/dist/motion/MovingFrame.d.ts.map +0 -1
  186. package/dist/motion/motion.d.ts.map +0 -1
  187. package/dist/motion/presence.d.ts.map +0 -1
  188. package/dist/motion/press.d.ts.map +0 -1
  189. package/dist/platform/platform.d.ts.map +0 -1
  190. package/dist/primitives/BottomSheet.d.ts.map +0 -1
  191. package/dist/primitives/ChalkText.d.ts.map +0 -1
  192. package/dist/primitives/CopyButton.d.ts.map +0 -1
  193. package/dist/primitives/IconButton.d.ts.map +0 -1
  194. package/dist/primitives/Menu.d.ts.map +0 -1
  195. package/dist/primitives/NameTag.d.ts.map +0 -1
  196. package/dist/primitives/PillButton.d.ts.map +0 -1
  197. package/dist/primitives/SegmentedControl.d.ts.map +0 -1
  198. package/dist/primitives/SheetGroup.d.ts.map +0 -1
  199. package/dist/primitives/Switch.d.ts.map +0 -1
  200. package/dist/primitives/TileShell.d.ts.map +0 -1
  201. package/dist/primitives/announce.d.ts.map +0 -1
  202. package/dist/primitives/menu-placement.d.ts.map +0 -1
  203. package/dist/primitives/toast/Toast.d.ts.map +0 -1
  204. package/dist/primitives/toast/ToastStack.d.ts.map +0 -1
  205. package/dist/primitives/toast/toast-store.d.ts.map +0 -1
  206. package/dist/runtime.d.ts.map +0 -1
  207. package/dist/sheets/people-chat/ChatNotices.d.ts.map +0 -1
  208. package/dist/sheets/people-chat/ChatTab.d.ts.map +0 -1
  209. package/dist/sheets/people-chat/Composer.d.ts.map +0 -1
  210. package/dist/sheets/people-chat/PeopleChatSheet.d.ts.map +0 -1
  211. package/dist/sheets/people-chat/PeopleTab.d.ts.map +0 -1
  212. package/dist/sheets/people-chat/PhotoViewer.d.ts.map +0 -1
  213. package/dist/sheets/people-chat/TextField.d.ts.map +0 -1
  214. package/dist/sheets/people-chat/attachments.d.ts.map +0 -1
  215. package/dist/sheets/people-chat/chat-model.d.ts.map +0 -1
  216. package/dist/sheets/people-chat/people-model.d.ts.map +0 -1
  217. package/dist/sounds/sounds.d.ts.map +0 -1
  218. package/dist/space-client/create-native-space-client.d.ts.map +0 -1
  219. package/dist/space-client/random-uuid.d.ts.map +0 -1
  220. package/dist/stage/ContentTile.d.ts.map +0 -1
  221. package/dist/stage/ParticipantTile.d.ts.map +0 -1
  222. package/dist/stage/Stage.d.ts.map +0 -1
  223. package/dist/stage/TileSheet.d.ts.map +0 -1
  224. package/dist/stage/camera.d.ts.map +0 -1
  225. package/dist/stage/layout.d.ts.map +0 -1
  226. package/dist/stage/space-selector.d.ts.map +0 -1
  227. package/dist/stage/stage-view.d.ts.map +0 -1
  228. package/dist/status/CallOverlays.d.ts.map +0 -1
  229. package/dist/status/ChalkArrival.d.ts.map +0 -1
  230. package/dist/status/StatusPage.d.ts.map +0 -1
  231. package/dist/status/call-screen.d.ts.map +0 -1
  232. package/dist/theme/theme.d.ts.map +0 -1
  233. package/dist/theme/tokens.d.ts.map +0 -1
  234. package/dist/toasts/CallEventToasts.d.ts.map +0 -1
  235. package/dist/toasts/notices.d.ts.map +0 -1
  236. package/dist/ui/ChalkUI.d.ts.map +0 -1
  237. package/dist/ui.d.ts.map +0 -1
  238. package/dist/utils/build-chalk-invite-link.d.ts.map +0 -1
  239. package/dist/utils/ios-simulator.d.ts.map +0 -1
  240. package/dist/whiteboard/embedded-whiteboard-assets.d.ts.map +0 -1
  241. package/dist/whiteboard/embedded-whiteboard-viewport.d.ts.map +0 -1
  242. package/src/callkit/callkit.test.ts +0 -97
  243. package/src/components/native-space-view/screen-share-availability.test.ts +0 -16
  244. package/src/frame/regions.test.ts +0 -38
  245. package/src/media/native-capture-error.test.ts +0 -19
  246. package/src/primitives/menu-placement.test.ts +0 -50
  247. package/src/sheets/people-chat/people-chat-model.test.ts +0 -98
  248. package/src/space-client/whiteboard-watchdog.test.ts +0 -23
  249. package/src/stage/layout.test.ts +0 -77
  250. package/src/status/call-screen.test.ts +0 -42
  251. package/src/toasts/notices.test.ts +0 -92
  252. package/src/whiteboard/embedded-whiteboard-viewport.test.ts +0 -13
package/CHANGELOG.md ADDED
@@ -0,0 +1,25 @@
1
+ # Changelog
2
+
3
+ ## 5.1.0
4
+
5
+ - Bound each Sync and whiteboard WebSocket opening attempt to the existing 30-second startup allowance, or to `syncStartupTimeoutMs` when set. `syncStartupTimeoutMs` accepts 1 to 60,000 ms, and each attempt gets at least 10 seconds. The whiteboard retries a timed-out attempt through the existing reconnect backoff, and so does Sync once the call is live, such as after a drop or a return to the foreground. A first join does not retry a Sync socket that never opens: the join fails when its startup wait of `syncStartupTimeoutMs` ends, and a setting below 10 seconds ends the join before the attempt's own 10-second minimum. The client's 10-second default does not apply to React Native.
6
+ - Size the call from the enclosing safe-area frame instead of the global window size. Orientation and call-region arrangement now follow the space `Chalk` is given, so a call rendered inside a smaller container, split view or modal lays out for that container rather than the whole screen. Full-screen calls look the same.
7
+ - Render registered native WebRTC host components so remote screen shares and camera video no longer disappear when React Native exports the video view as a string.
8
+ - Disable reaction sending and media enable controls until Sync is live, and keep recovery notices non-blocking.
9
+ - Show plain connection-not-ready and confirmation-timeout media feedback without exposing raw internal exception messages.
10
+ - Run the Android module API compatibility check only in the Chalk repository, so an app's `./gradlew check` no longer needs Chalk's test fixtures or the API 30 platform.
11
+
12
+ ## 5.0.1
13
+
14
+ - Fix the Android 11 crash when joining a call by isolating API 31 audio listeners from React Native module signatures.
15
+
16
+ ## 5.0.0
17
+
18
+ - Rebuild `Chalk` with a call header, Spotlight and Grid layouts, a dock, People and Chat sheets, and status pages.
19
+ - Add `ChalkArrival`, light and dark color schemes, call sounds and haptics, and permission recovery callbacks.
20
+ - BREAKING: replace the old layout and theme exports with `ChalkProps`, `ColorScheme`, and `Palette`. Remove the `/appearance` and platform-specific entry points.
21
+ - BREAKING: call `onLeave` when the user chooses Home on the post-call page, not immediately after leaving.
22
+ - BREAKING: add Expo audio, haptics, clipboard, document picker, file system, and `expo-crypto` peers. Add Reanimated, Worklets, Gesture Handler, and Safe Area Context peers.
23
+ - Use the v5 client, whiteboard, and facehash packages.
24
+
25
+ See the [project changelog](../../../CHANGELOG.md) for the full export removals and migration details.
@@ -41,3 +41,41 @@ dependencies {
41
41
  implementation("com.facebook.react:react-android")
42
42
  implementation("androidx.core:core:1.16.0")
43
43
  }
44
+
45
+ def compatibilityClasses = layout.buildDirectory.dir("compatibility/classes")
46
+ def compileCompatibility = tasks.register("compileModuleApiCompatibility", JavaCompile) {
47
+ source fileTree("compatibility") { include "*.java" }
48
+ classpath = files()
49
+ destinationDirectory = compatibilityClasses
50
+ sourceCompatibility = "17"
51
+ targetCompatibility = "17"
52
+ }
53
+
54
+ // Check the bytecode RN actually reflects, including inferred/private/synthetic getters.
55
+ tasks.register("checkModuleApiCompatibility", JavaExec) {
56
+ dependsOn compileCompatibility, "compileDebugKotlin", "compileDebugJavaWithJavac",
57
+ "compileDebugUnitTestKotlin"
58
+ classpath = files(compatibilityClasses)
59
+ mainClass = "ModuleApiCompatibility"
60
+ doFirst {
61
+ def manifest = layout.buildDirectory.file("compatibility/classpath.txt").get().asFile
62
+ def paths = [android.bootClasspath.first(),
63
+ tasks.named("compileDebugUnitTestKotlin").get().destinationDirectory.get().asFile,
64
+ tasks.named("compileDebugKotlin").get().destinationDirectory.get().asFile,
65
+ tasks.named("compileDebugJavaWithJavac").get().destinationDirectory.get().asFile]
66
+ paths.addAll(configurations.debugCompileClasspath.files)
67
+ manifest.text = paths.collect { it.absolutePath }.join("\n")
68
+ def platforms = [android.defaultConfig.minSdkVersion.apiLevel, 30].unique().collect {
69
+ new File(android.sdkDirectory, "platforms/android-${it}/android.jar")
70
+ }
71
+ platforms.each {
72
+ if (!it.isFile()) throw new GradleException("Install compatibility platform: sdkmanager 'platforms;${it.parentFile.name}'")
73
+ }
74
+ args = [manifest.absolutePath, layout.buildDirectory.dir("compatibility/dependencies").get().asFile.absolutePath] + platforms*.absolutePath
75
+ }
76
+ }
77
+
78
+ // The published package leaves out src/test and its fixtures, so only the Chalk repo runs this check.
79
+ if (file("src/test").isDirectory()) {
80
+ tasks.named("check").configure { dependsOn "checkModuleApiCompatibility" }
81
+ }
@@ -0,0 +1,215 @@
1
+ import java.io.*;
2
+ import java.net.*;
3
+ import java.nio.file.*;
4
+ import java.util.*;
5
+ import java.util.jar.JarFile;
6
+ import java.util.regex.Pattern;
7
+ import java.util.zip.ZipFile;
8
+
9
+ /** Runs without Android initialization: RN reflects private and synthetic members too. */
10
+ public final class ModuleApiCompatibility {
11
+ private static final Set<String> ROOTS = Set.of(
12
+ "com/facebook/react/bridge/NativeModule", "com/facebook/react/uimanager/ViewManager");
13
+ private static final Pattern TYPE = Pattern.compile("L([^;]+);");
14
+
15
+ record Member(String name, String descriptor) {}
16
+ record ClassInfo(String name, List<String> parents, List<Member> members) {}
17
+
18
+ private static ClassInfo readClass(InputStream stream) throws IOException {
19
+ try (var in = new DataInputStream(stream)) {
20
+ if (in.readInt() != 0xcafebabe) throw new IOException("Not a class file");
21
+ in.skipNBytes(4);
22
+ Object[] pool = new Object[in.readUnsignedShort()];
23
+ for (int i = 1; i < pool.length; i++) {
24
+ switch (in.readUnsignedByte()) {
25
+ case 1 -> pool[i] = in.readUTF();
26
+ case 7 -> pool[i] = in.readUnsignedShort();
27
+ case 3, 4, 9, 10, 11, 12, 17, 18 -> in.skipNBytes(4);
28
+ case 5, 6 -> { in.skipNBytes(8); i++; }
29
+ case 8, 16, 19, 20 -> in.skipNBytes(2);
30
+ case 15 -> in.skipNBytes(3);
31
+ default -> throw new IOException("Unknown constant pool entry");
32
+ }
33
+ }
34
+ in.readUnsignedShort();
35
+ String name = (String) pool[(int) pool[in.readUnsignedShort()]];
36
+ var parents = new ArrayList<String>();
37
+ int superclass = in.readUnsignedShort();
38
+ if (superclass != 0) parents.add((String) pool[(int) pool[superclass]]);
39
+ int interfaces = in.readUnsignedShort();
40
+ for (int i = 0; i < interfaces; i++) {
41
+ parents.add((String) pool[(int) pool[in.readUnsignedShort()]]);
42
+ }
43
+ var members = new ArrayList<Member>();
44
+ // Both field_info and method_info have the same layout.
45
+ for (int kind = 0; kind < 2; kind++) {
46
+ int count = in.readUnsignedShort();
47
+ for (int i = 0; i < count; i++) {
48
+ in.readUnsignedShort();
49
+ members.add(new Member((String) pool[in.readUnsignedShort()],
50
+ (String) pool[in.readUnsignedShort()]));
51
+ int attributes = in.readUnsignedShort();
52
+ for (int j = 0; j < attributes; j++) {
53
+ in.readUnsignedShort();
54
+ in.skipNBytes(Integer.toUnsignedLong(in.readInt()));
55
+ }
56
+ }
57
+ }
58
+ return new ClassInfo(name, parents, members);
59
+ }
60
+ }
61
+
62
+ private static boolean reflected(String name, ClassLoader classes, Map<String, Boolean> cache)
63
+ throws IOException {
64
+ if (ROOTS.contains(name)) return true;
65
+ if (cache.containsKey(name)) return cache.get(name);
66
+ var stream = classes.getResourceAsStream(name + ".class");
67
+ if (stream == null) throw new IOException("Missing hierarchy class: " + name);
68
+ var info = readClass(stream);
69
+ for (String parent : info.parents()) {
70
+ if (reflected(parent, classes, cache)) {
71
+ cache.put(name, true);
72
+ return true;
73
+ }
74
+ }
75
+ cache.put(name, false);
76
+ return false;
77
+ }
78
+
79
+ private static Set<String> platformTypes(Path jar) throws IOException {
80
+ try (var zip = new JarFile(jar.toFile())) {
81
+ var types = new HashSet<String>();
82
+ zip.stream().filter(e -> e.getName().endsWith(".class"))
83
+ .forEach(e -> types.add(e.getName().replaceFirst("\\.class$", "")));
84
+ return types;
85
+ }
86
+ }
87
+
88
+ private static List<String> check(ClassInfo info, ClassLoader runtime,
89
+ Set<String> compileTypes, Set<String> supportedTypes) throws ClassNotFoundException {
90
+ var errors = new ArrayList<String>();
91
+ for (var member : info.members()) {
92
+ var types = TYPE.matcher(member.descriptor());
93
+ while (types.find()) {
94
+ String type = types.group(1);
95
+ // Also covers Java platform types that the host JDK could otherwise mask.
96
+ if (compileTypes.contains(type) && !supportedTypes.contains(type)) {
97
+ errors.add(member.name() + member.descriptor() + " missing " + type);
98
+ }
99
+ }
100
+ }
101
+ try {
102
+ Class<?> module = Class.forName(info.name().replace('/', '.'), false, runtime);
103
+ try { module.getDeclaredMethods(); }
104
+ catch (LinkageError e) { errors.add("getDeclaredMethods: " + e); }
105
+ try { module.getDeclaredFields(); }
106
+ catch (LinkageError e) { errors.add("getDeclaredFields: " + e); }
107
+ } catch (LinkageError e) {
108
+ errors.add("class loading: " + e);
109
+ }
110
+ return errors;
111
+ }
112
+
113
+ private static List<ClassInfo> classes(Path directory) throws IOException {
114
+ try (var files = Files.walk(directory)) {
115
+ var result = new ArrayList<ClassInfo>();
116
+ for (Path file : files.filter(p -> p.toString().endsWith(".class")).sorted().toList()) {
117
+ result.add(readClass(Files.newInputStream(file)));
118
+ }
119
+ return result;
120
+ }
121
+ }
122
+
123
+ private static URLClassLoader loader(List<Path> paths) throws MalformedURLException {
124
+ var urls = new ArrayList<URL>();
125
+ for (Path path : paths) urls.add(path.toUri().toURL());
126
+ return new URLClassLoader(urls.toArray(URL[]::new), ClassLoader.getPlatformClassLoader());
127
+ }
128
+
129
+ public static void main(String[] args) throws Exception {
130
+ // Gradle writes paths one per line, avoiding command-line length limits.
131
+ List<Path> paths = Files.readAllLines(Path.of(args[0])).stream().map(Path::of).toList();
132
+ Path compilePlatform = paths.get(0);
133
+ Path fixtureDirectory = paths.get(1);
134
+ List<Path> moduleDirectories = paths.subList(2, 4);
135
+ var dependencies = new ArrayList<Path>();
136
+ Path extracted = Path.of(args[1]);
137
+ Files.createDirectories(extracted);
138
+ for (Path path : paths.subList(4, paths.size())) {
139
+ if (!path.toString().endsWith(".aar")) { dependencies.add(path); continue; }
140
+ try (var aar = new ZipFile(path.toFile())) {
141
+ for (var entry : aar.stream().filter(e -> e.getName().endsWith(".jar")).toList()) {
142
+ Path jar = extracted.resolve(dependencies.size() + ".jar");
143
+ try (var stream = aar.getInputStream(entry)) {
144
+ Files.copy(stream, jar, StandardCopyOption.REPLACE_EXISTING);
145
+ }
146
+ dependencies.add(jar);
147
+ }
148
+ }
149
+ }
150
+ var ownClasses = new ArrayList<ClassInfo>();
151
+ for (Path directory : moduleDirectories) {
152
+ if (Files.isDirectory(directory)) ownClasses.addAll(classes(directory));
153
+ }
154
+ if (ownClasses.isEmpty()) throw new AssertionError("No compiled SDK classes");
155
+ var classpath = new ArrayList<Path>(moduleDirectories);
156
+ classpath.add(fixtureDirectory);
157
+ classpath.addAll(dependencies);
158
+ var hierarchyPath = new ArrayList<Path>(classpath);
159
+ hierarchyPath.add(compilePlatform);
160
+ Set<String> compileTypes = platformTypes(compilePlatform);
161
+ try (var hierarchy = loader(hierarchyPath)) {
162
+ var cache = new HashMap<String, Boolean>();
163
+ var modules = new ArrayList<ClassInfo>();
164
+ for (var info : ownClasses) {
165
+ if (reflected(info.name(), hierarchy, cache)) modules.add(info);
166
+ }
167
+ if (modules.isEmpty()) throw new AssertionError("No React Native modules/view managers");
168
+ var fixtures = classes(fixtureDirectory);
169
+ var expected = Map.of(
170
+ "OriginalListenerModule", "AudioManager$OnCommunicationDeviceChangedListener",
171
+ "FactoryInferredModule", "AudioManager$OnCommunicationDeviceChangedListener",
172
+ "ModeListenerViewManager", "AudioManager$OnModeChangedListener");
173
+ int failures = 0;
174
+ for (int index = 2; index < args.length; index++) {
175
+ Path platform = Path.of(args[index]);
176
+ Set<String> supportedTypes = platformTypes(platform);
177
+ var runtimePath = new ArrayList<Path>();
178
+ runtimePath.add(platform);
179
+ runtimePath.addAll(classpath);
180
+ try (var runtime = loader(runtimePath)) {
181
+ for (var module : modules) {
182
+ var errors = check(module, runtime, compileTypes, supportedTypes);
183
+ for (String error : errors) System.err.println(platform + ": " + module.name() + ": " + error);
184
+ if (!errors.isEmpty()) failures++;
185
+ }
186
+ int rejected = 0;
187
+ for (var fixture : fixtures) {
188
+ String simpleName = fixture.name().substring(fixture.name().lastIndexOf('/') + 1);
189
+ if (!expected.containsKey(simpleName)) continue;
190
+ if (!reflected(fixture.name(), hierarchy, cache)) {
191
+ throw new AssertionError("Fixture is not a module/view manager: " + simpleName);
192
+ }
193
+ var errors = check(fixture, runtime, compileTypes, supportedTypes);
194
+ String missing = expected.get(simpleName);
195
+ if (supportedTypes.contains("android/media/" + missing)) {
196
+ if (!errors.isEmpty()) throw new AssertionError("Supported fixture failed: " + simpleName + ": " + errors);
197
+ rejected++;
198
+ System.out.println("EXPECTED PASS " + platform.getParent().getFileName() + " " + simpleName);
199
+ continue;
200
+ }
201
+ if (errors.stream().noneMatch(e -> e.contains("missing android/media/" + missing))
202
+ || errors.stream().noneMatch(e -> e.contains("getDeclaredMethods: java.lang.NoClassDefFoundError"))) {
203
+ throw new AssertionError("Unsafe fixture escaped: " + simpleName + ": " + errors);
204
+ }
205
+ rejected++;
206
+ System.out.println("EXPECTED FAIL " + platform.getParent().getFileName() + " " + simpleName + ": " + errors);
207
+ }
208
+ if (rejected != expected.size()) throw new AssertionError("Missing negative fixtures");
209
+ System.out.println("Checked " + modules.size() + " SDK modules/view managers against " + platform);
210
+ }
211
+ }
212
+ if (args.length < 3 || failures != 0) throw new AssertionError("Incompatible SDK classes: " + failures);
213
+ }
214
+ }
215
+ }
@@ -31,8 +31,8 @@ class ChalkAudioRouteModule(
31
31
  override fun onAudioDevicesAdded(addedDevices: Array<out AudioDeviceInfo>) = emit()
32
32
  override fun onAudioDevicesRemoved(removedDevices: Array<out AudioDeviceInfo>) = emit()
33
33
  }
34
- // Created only on Android 12 and later, where the listener type exists.
35
- private val communicationListener by lazy { AudioManager.OnCommunicationDeviceChangedListener { emit() } }
34
+ // React Native reflects private methods too, so their types must exist on every supported API.
35
+ private var communicationListener: AutoCloseable? = null
36
36
 
37
37
  override fun getName(): String = "ChalkAudioRouteModule"
38
38
 
@@ -44,7 +44,7 @@ class ChalkAudioRouteModule(
44
44
  listening = true
45
45
  audioManager.registerAudioDeviceCallback(deviceCallback, handler)
46
46
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
47
- audioManager.addOnCommunicationDeviceChangedListener(reactContext.mainExecutor, communicationListener)
47
+ communicationListener = CommunicationDeviceListener(audioManager, reactContext.mainExecutor) { emit() }
48
48
  }
49
49
  }
50
50
 
@@ -56,9 +56,8 @@ class ChalkAudioRouteModule(
56
56
  override fun invalidate() {
57
57
  if (listening) {
58
58
  audioManager.unregisterAudioDeviceCallback(deviceCallback)
59
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
60
- audioManager.removeOnCommunicationDeviceChangedListener(communicationListener)
61
- }
59
+ communicationListener?.close()
60
+ communicationListener = null
62
61
  }
63
62
  super.invalidate()
64
63
  }
@@ -0,0 +1,23 @@
1
+ package ai.q9labs.chalk.reactnative
2
+
3
+ import android.media.AudioManager
4
+ import android.os.Build
5
+ import androidx.annotation.RequiresApi
6
+ import java.util.concurrent.Executor
7
+
8
+ @RequiresApi(Build.VERSION_CODES.S)
9
+ internal class CommunicationDeviceListener(
10
+ private val audioManager: AudioManager,
11
+ executor: Executor,
12
+ onChanged: () -> Unit,
13
+ ) : AutoCloseable {
14
+ private val listener = AudioManager.OnCommunicationDeviceChangedListener { onChanged() }
15
+
16
+ init {
17
+ audioManager.addOnCommunicationDeviceChangedListener(executor, listener)
18
+ }
19
+
20
+ override fun close() {
21
+ audioManager.removeOnCommunicationDeviceChangedListener(listener)
22
+ }
23
+ }
@@ -1,4 +1,3 @@
1
1
  /** Starts the Android foreground service for the call. Resolves false when there's nothing to keep running (no microphone or camera permission) or Android refused the start. */
2
2
  export declare function startAndroidCallService(): Promise<boolean>;
3
3
  export declare function stopAndroidCallService(): Promise<void>;
4
- //# sourceMappingURL=call-service.d.ts.map
@@ -23,4 +23,3 @@ export declare function setAndroidConnectionServiceActive(callId: string): Promi
23
23
  export declare function endAndroidConnectionServiceCall(callId: string, options?: AndroidConnectionServiceEndCallOptions): Promise<boolean>;
24
24
  export declare function addAndroidConnectionServiceListener(listener: (event: AndroidConnectionServiceEvent) => void): () => void;
25
25
  export {};
26
- //# sourceMappingURL=connection-service.d.ts.map
@@ -16,4 +16,3 @@ export type FaceAvatarProps = {
16
16
  * stops with reduced motion. Decorative: the parent names the person.
17
17
  */
18
18
  export declare const FaceAvatar: import("react").MemoExoticComponent<({ name, size, style, level, lookAround, testID }: FaceAvatarProps) => React.JSX.Element>;
19
- //# sourceMappingURL=FaceAvatar.d.ts.map
@@ -1,3 +1,2 @@
1
1
  /** A camera-off tile's avatar is 42 % of the tile's shorter side, between 32 and 150 pt. */
2
2
  export declare function tileAvatarSize(width: number, height: number): number;
3
- //# sourceMappingURL=tile-avatar-size.d.ts.map
@@ -58,4 +58,3 @@ export declare const callKit: {
58
58
  } | null>;
59
59
  updateCall(options: CallKitCallOptions): Promise<void>;
60
60
  };
61
- //# sourceMappingURL=callkit.d.ts.map
@@ -14,4 +14,3 @@ export declare function resolveSpaceCallKitOptions({ callKit, hasVideo, spaceId,
14
14
  spaceId: string;
15
15
  spaceName?: string;
16
16
  }): ResolvedSpaceCallKitOptions | null;
17
- //# sourceMappingURL=resolve-space-callkit-options.d.ts.map
@@ -4,8 +4,7 @@ import {
4
4
 
5
5
  // src/frame/device-layout.tsx
6
6
  import { createContext, useContext, useMemo } from "react";
7
- import { useWindowDimensions } from "react-native";
8
- import { useSafeAreaInsets } from "react-native-safe-area-context";
7
+ import { useSafeAreaFrame, useSafeAreaInsets } from "react-native-safe-area-context";
9
8
 
10
9
  // src/frame/regions.ts
11
10
  function arrangementFor(width, height) {
@@ -46,7 +45,7 @@ function frameRegions(arrangement, width, height, insets, cardOpen = false) {
46
45
  import { jsx } from "react/jsx-runtime";
47
46
  var DeviceLayoutContext = createContext(null);
48
47
  function DeviceLayoutProvider({ children }) {
49
- const { width, height } = useWindowDimensions();
48
+ const { width, height } = useSafeAreaFrame();
50
49
  const insets = useSafeAreaInsets();
51
50
  const value = useMemo(() => {
52
51
  const arrangement = arrangementFor(width, height);
package/dist/client.d.ts CHANGED
@@ -1,4 +1,3 @@
1
1
  /** Native client construction for applications that own the call lifecycle. */
2
2
  export { createNativeSpaceClient } from "./space-client/create-native-space-client";
3
3
  export type { NativeSpaceClientOptions } from "./space-client/create-native-space-client";
4
- //# sourceMappingURL=client.d.ts.map
package/dist/client.js CHANGED
@@ -39,6 +39,7 @@ function ensureRandomUUID() {
39
39
  function createNativeSpaceClient(options) {
40
40
  ensureRandomUUID();
41
41
  const { storage } = options;
42
+ const syncStartupTimeoutMs = options.syncStartupTimeoutMs ?? 3e4;
42
43
  const apiBaseURL = options.baseUrl ?? "https://api.chalkmeet.com";
43
44
  const syncURL = options.syncUrl ?? defaultSyncURL(apiBaseURL);
44
45
  const fetch = globalThis.fetch;
@@ -61,9 +62,9 @@ function createNativeSpaceClient(options) {
61
62
  getDisplayMedia: async () => await mediaDevices.getDisplayMedia()
62
63
  },
63
64
  createMediaClient: (input) => createMediaClient(apiBaseURL, input, fetch),
64
- createSyncClient: (input) => createSyncClient(syncURL, input, lifecycle, webSocket, storage),
65
+ createSyncClient: (input) => createSyncClient(syncURL, input, lifecycle, webSocket, storage, syncStartupTimeoutMs),
65
66
  createChatFileTransport: (input) => createChatFileTransport(apiBaseURL, input, fetch),
66
- createWhiteboardClient: options.whiteboardURL === null ? void 0 : (input) => createWhiteboardClient(apiBaseURL, options.whiteboardURL ?? whiteboardURL(syncURL), input, fetch, lifecycle, webSocket),
67
+ createWhiteboardClient: options.whiteboardURL === null ? void 0 : (input) => createWhiteboardClient(apiBaseURL, options.whiteboardURL ?? whiteboardURL(syncURL), input, fetch, lifecycle, webSocket, syncStartupTimeoutMs),
67
68
  subscribeForeground: (listener) => {
68
69
  const subscription = AppState.addEventListener("change", (state) => {
69
70
  if (state === "active") listener();
@@ -79,7 +80,7 @@ function createNativeSpaceClient(options) {
79
80
  whiteboardUrl: options.whiteboardURL,
80
81
  dependencies,
81
82
  fetch,
82
- syncStartupTimeoutMs: options.syncStartupTimeoutMs ?? 3e4,
83
+ syncStartupTimeoutMs,
83
84
  initialMicrophoneEnabled: options.microphone,
84
85
  initialCameraEnabled: options.camera
85
86
  }
@@ -135,7 +136,7 @@ function createSFUConnectionMediaClient(client) {
135
136
  subscribe: client.subscribe.bind(client)
136
137
  };
137
138
  }
138
- function createSyncClient(syncURL, input, lifecycle, webSocket, storage) {
139
+ function createSyncClient(syncURL, input, lifecycle, webSocket, storage, dialTimeoutMs) {
139
140
  const subject = input.access.subject;
140
141
  const scope = `${subject.tenantId}:${subject.episodeId}:${subject.participantId}`;
141
142
  return createV1SyncClient({
@@ -144,13 +145,14 @@ function createSyncClient(syncURL, input, lifecycle, webSocket, storage) {
144
145
  mediaPlane: input.media,
145
146
  lifecycle,
146
147
  webSocket,
148
+ dialTimeoutMs,
147
149
  ...storage ? { pendingStore: new AsyncStorageV1PendingTargetStore({ scope, storage }) } : {}
148
150
  });
149
151
  }
150
152
  function createChatFileTransport(apiBaseURL, input, fetch) {
151
153
  return createChalkChatFileHttpTransport({ baseUrl: apiBaseURL, token: input.token, fetch });
152
154
  }
153
- function createWhiteboardClient(apiBaseURL, url, input, fetch, lifecycle, webSocket) {
155
+ function createWhiteboardClient(apiBaseURL, url, input, fetch, lifecycle, webSocket, dialTimeoutMs) {
154
156
  const files = createChalkWhiteboardV1FileDownloadTransport({
155
157
  baseUrl: apiBaseURL,
156
158
  token: input.token,
@@ -162,6 +164,7 @@ function createWhiteboardClient(apiBaseURL, url, input, fetch, lifecycle, webSoc
162
164
  files,
163
165
  lifecycle,
164
166
  webSocket,
167
+ dialTimeoutMs,
165
168
  onWatchdogReplacement: input.onWatchdogReplacement,
166
169
  onSummary: (summary) => {
167
170
  input.onSummary(summary);
@@ -14,4 +14,3 @@ export interface ClipboardTextStore {
14
14
  subscribe(listener: () => void): () => void;
15
15
  }
16
16
  export declare function createClipboardTextStore({ clipboard, shouldReadClipboard, subscribeToAppState }: ClipboardTextStoreOptions): ClipboardTextStore;
17
- //# sourceMappingURL=clipboard-store.d.ts.map
@@ -7,4 +7,3 @@ export interface UseClipboardInviteSuggestionOptions {
7
7
  getSuggestion: (clipboardText: string | null | undefined, currentInput: string) => string | null;
8
8
  }
9
9
  export declare function useClipboardInviteSuggestion(currentInput: string, { clipboard, getSuggestion }: UseClipboardInviteSuggestionOptions): string | null;
10
- //# sourceMappingURL=clipboard.d.ts.map
@@ -43,4 +43,3 @@ export declare const embeddedWhiteboardWebViewSecurityPolicy: Readonly<{
43
43
  thirdPartyCookiesEnabled: false;
44
44
  }>;
45
45
  export declare function EmbeddedWhiteboard({ transport, journeyId, traceparent, tracestate, canDraw, canClear, theme: themeOverride, localParticipantColor, rendererURL: rendererURLOverride, style, testID, onMetric, onError, onUserExport }: EmbeddedWhiteboardProps): React.JSX.Element;
46
- //# sourceMappingURL=EmbeddedWhiteboard.d.ts.map
@@ -1,4 +1,3 @@
1
1
  import { type RtcVideoViewProps } from "./rtc-video-view-availability";
2
2
  export declare function hasRtcVideoView(): boolean;
3
3
  export declare function RtcVideoView(props: RtcVideoViewProps): React.JSX.Element | null;
4
- //# sourceMappingURL=RtcVideoView.d.ts.map
@@ -30,4 +30,3 @@ export declare class AndroidConnectionServiceController {
30
30
  readonly subscribe: (listener: () => void) => (() => void);
31
31
  readonly update: (input: AndroidConnectionServiceControllerInput) => void;
32
32
  }
33
- //# sourceMappingURL=android-connection-service-controller.d.ts.map
@@ -6,4 +6,3 @@ export declare function shouldRenderNativeMediaTrack({ participant, track, media
6
6
  track: MediaStreamTrack | NativeMediaStreamTrack | null | undefined;
7
7
  mediaKind?: "camera" | "screen-share";
8
8
  }): boolean;
9
- //# sourceMappingURL=native-media-visibility.d.ts.map
@@ -36,4 +36,3 @@ export declare class SpaceCallKitController {
36
36
  readonly endCall: () => Promise<void>;
37
37
  readonly stop: () => void;
38
38
  }
39
- //# sourceMappingURL=native-space-callkit-controller.d.ts.map
@@ -9,4 +9,3 @@ export declare function resolveNativeScreenShareAvailability({ featureEnabled, p
9
9
  simulator: boolean;
10
10
  captureAvailable: boolean;
11
11
  }): NativeScreenShareAvailability;
12
- //# sourceMappingURL=screen-share-availability.d.ts.map
@@ -10,4 +10,3 @@ export interface RtcVideoViewProps extends ViewProps {
10
10
  type RtcVideoViewComponent = ComponentType<RtcVideoViewProps>;
11
11
  export declare function canRenderRtcVideoView(component: unknown): component is RtcVideoViewComponent;
12
12
  export {};
13
- //# sourceMappingURL=rtc-video-view-availability.d.ts.map
@@ -1,3 +1,2 @@
1
1
  /** Lifecycle phases used by native operating-system call integrations. */
2
2
  export type SpaceLifecyclePhase = "entrance" | "joining" | "live" | "left";
3
- //# sourceMappingURL=space-lifecycle.d.ts.map
@@ -5,4 +5,3 @@
5
5
  * to the foreground, because Android can refuse a start made while the app is in the background.
6
6
  */
7
7
  export declare function useAndroidCallService(): void;
8
- //# sourceMappingURL=useAndroidCallService.d.ts.map
@@ -11,4 +11,3 @@ interface UseAndroidConnectionServiceOptions {
11
11
  }
12
12
  export declare function useAndroidConnectionService({ displayName, enabled, hasVideo, joinNonce, onDisconnectRequest, phase, spaceId, spaceName }: UseAndroidConnectionServiceOptions): void;
13
13
  export {};
14
- //# sourceMappingURL=useAndroidConnectionService.d.ts.map
@@ -6,4 +6,3 @@ export type ChalkProviderProps = {
6
6
  };
7
7
  export declare function ChalkProvider({ children, client }: ChalkProviderProps): React.JSX.Element;
8
8
  export declare function useSpaceClient(): SpaceClient;
9
- //# sourceMappingURL=space-client-context.d.ts.map
package/dist/dev.d.ts CHANGED
@@ -7,4 +7,3 @@ export type { DevScenario } from "./frame/dev-scenario";
7
7
  export type { AudioRoute, AudioRouteKind, AudioRoutes } from "./dock/audio-route";
8
8
  export { setMeasurementRegistry } from "./frame/measurement";
9
9
  export type { MeasuredFrame, Measurement, MeasurementRegistry } from "./frame/measurement";
10
- //# sourceMappingURL=dev.d.ts.map
@@ -47,4 +47,3 @@ export declare function recordDiagnosticsFailure(source: string, message: string
47
47
  export declare function clearDevDiagnosticsLogs(): void;
48
48
  export declare function resetDevDiagnosticsState(): void;
49
49
  export declare function buildDevDiagnosticsCopyText(): string;
50
- //# sourceMappingURL=diagnostics.d.ts.map
@@ -20,4 +20,3 @@ export type DockProps = {
20
20
  * More and Leave. Spread across the phone in portrait, centred with 14 pt gaps in landscape.
21
21
  */
22
22
  export declare const Dock: import("react").MemoExoticComponent<({ arrangement, microphoneOn, cameraOn, onToggleMicrophone, onToggleCamera, onOpenMore, onLeave, moreOpen, leaveOpen, moreRef, leaveRef }: DockProps) => import("react").JSX.Element>;
23
- //# sourceMappingURL=Dock.d.ts.map
@@ -9,4 +9,3 @@ export type LeaveMenuProps = {
9
9
  };
10
10
  /** A host's Leave button asks whether to leave alone or end the call for everyone. */
11
11
  export declare function LeaveMenu({ open, onClose, anchorRef, onLeave, onEnd }: LeaveMenuProps): React.JSX.Element | null;
12
- //# sourceMappingURL=LeaveMenu.d.ts.map
@@ -14,4 +14,3 @@ export type MoreSheetProps = {
14
14
  * Chat, People and the stage layout. Actions that change the call close the sheet; copying keeps it open.
15
15
  */
16
16
  export declare function MoreSheet({ open, onClose, onOpenPeople, onOpenChat, inviteLink, returnFocusRef }: MoreSheetProps): React.JSX.Element;
17
- //# sourceMappingURL=MoreSheet.d.ts.map
@@ -5,4 +5,3 @@
5
5
  export declare const ReactionBurst: import("react").MemoExoticComponent<({ participantId }: {
6
6
  readonly participantId: string;
7
7
  }) => React.JSX.Element | null>;
8
- //# sourceMappingURL=ReactionBurst.d.ts.map
@@ -13,4 +13,3 @@ export type RoutePickerProps = {
13
13
  * button on iOS, where the mockup draws the system route menu, and a sheet on Android.
14
14
  */
15
15
  export declare function RoutePicker({ open, onClose, onSelect, output, anchorRef }: RoutePickerProps): React.JSX.Element | null;
16
- //# sourceMappingURL=RoutePicker.d.ts.map
@@ -22,4 +22,3 @@ export declare function routeName(route: AudioRoute): string;
22
22
  * native build doesn't include the module yet, so the dock leaves the button out.
23
23
  */
24
24
  export declare function useAudioOutput(): AudioOutput | null;
25
- //# sourceMappingURL=audio-route.d.ts.map
@@ -14,4 +14,3 @@ export type CallFrameProps = {
14
14
  * arrangement. Each region lives in its own folder so the part lanes can work in parallel.
15
15
  */
16
16
  export declare function CallFrame({ displayName, callName, inviteLink, onLeave, onOpenSettings, onRejoin, resumedAfterSettings }: CallFrameProps): React.JSX.Element;
17
- //# sourceMappingURL=CallFrame.d.ts.map
@@ -37,4 +37,3 @@ export type ChalkProps = {
37
37
  * off, and draws everything inside the safe area in portrait, landscape and on iPad.
38
38
  */
39
39
  export declare function Chalk({ client, colorScheme, onColorSchemeChange, soundsEnabled, onSoundsEnabledChange, ...frame }: ChalkProps): React.JSX.Element;
40
- //# sourceMappingURL=Chalk.d.ts.map
@@ -3,4 +3,3 @@
3
3
  * first, so the sheet or menu opened last closes first.
4
4
  */
5
5
  export declare function useBackHandler(active: boolean, onBack: () => void): void;
6
- //# sourceMappingURL=back-handler.d.ts.map
@@ -25,4 +25,3 @@ export type DevScenario = {
25
25
  };
26
26
  export declare function setDevScenario(next: DevScenario | null): void;
27
27
  export declare function useDevScenario(): DevScenario;
28
- //# sourceMappingURL=dev-scenario.d.ts.map
@@ -13,4 +13,3 @@ export declare function DeviceLayoutProvider({ children }: {
13
13
  readonly children: ReactNode;
14
14
  }): React.JSX.Element;
15
15
  export declare function useDeviceLayout(): DeviceLayout;
16
- //# sourceMappingURL=device-layout.d.ts.map
@@ -25,4 +25,3 @@ export declare function setMeasurementRegistry(next: MeasurementRegistry | null)
25
25
  /** A ref for the host view that carries `testID`; attach it to that view. */
26
26
  export declare function useMeasuredRef<TNode extends MeasurableNode>(testID: string | undefined, style: StyleProp<ViewStyle | TextStyle>): RefObject<TNode | null>;
27
27
  export {};
28
- //# sourceMappingURL=measurement.d.ts.map