@dxos/plugin-thread 0.8.3 → 0.8.4-main.1f223c7

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 (320) hide show
  1. package/dist/lib/browser/ChannelContainer-4PYFOIDK.mjs +16 -0
  2. package/dist/lib/browser/ChatContainer-EXNNREYB.mjs +15 -0
  3. package/dist/lib/browser/{app-graph-builder-OY7R7EJP.mjs → app-graph-builder-FHAOPO57.mjs} +8 -8
  4. package/dist/lib/browser/app-graph-builder-FHAOPO57.mjs.map +7 -0
  5. package/dist/lib/browser/{call-manager-APQAZWHT.mjs → call-manager-RMPTWSTF.mjs} +6 -5
  6. package/dist/lib/browser/call-manager-RMPTWSTF.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-R5MDLUPC.mjs → chunk-4APCDRSH.mjs} +3 -3
  8. package/dist/lib/browser/{chunk-R5MDLUPC.mjs.map → chunk-4APCDRSH.mjs.map} +1 -1
  9. package/dist/lib/browser/{chunk-XZKBN3NS.mjs → chunk-7W7QK5ZP.mjs} +253 -250
  10. package/dist/lib/browser/chunk-7W7QK5ZP.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-IIUTBDVB.mjs → chunk-EV4JWI7L.mjs} +2 -2
  12. package/dist/lib/browser/chunk-G4CNILRR.mjs +23 -0
  13. package/dist/lib/browser/{chunk-6NBVNXTM.mjs.map → chunk-G4CNILRR.mjs.map} +3 -3
  14. package/dist/lib/browser/{chunk-JKQUJOTX.mjs → chunk-GERVMFQW.mjs} +2 -2
  15. package/dist/lib/browser/{chunk-AEXWNS6Z.mjs → chunk-KTWYVC5X.mjs} +34 -15
  16. package/dist/lib/browser/chunk-KTWYVC5X.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-TAFSCSUR.mjs → chunk-PBMNFG3B.mjs} +97 -72
  18. package/dist/lib/browser/chunk-PBMNFG3B.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-RI3Z6MK3.mjs +181 -0
  20. package/dist/lib/browser/chunk-RI3Z6MK3.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-XYUJXHYV.mjs +106 -0
  22. package/dist/lib/browser/chunk-XYUJXHYV.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-4H4A264L.mjs → chunk-ZCEU5K23.mjs} +490 -308
  24. package/dist/lib/browser/chunk-ZCEU5K23.mjs.map +7 -0
  25. package/dist/lib/browser/{chunk-PG5CTFKK.mjs → chunk-ZH2WPTNP.mjs} +226 -158
  26. package/dist/lib/browser/chunk-ZH2WPTNP.mjs.map +7 -0
  27. package/dist/lib/browser/index.mjs +49 -44
  28. package/dist/lib/browser/index.mjs.map +3 -3
  29. package/dist/lib/browser/{intent-resolver-FK2MDVDT.mjs → intent-resolver-J7OCP2P6.mjs} +90 -16
  30. package/dist/lib/browser/intent-resolver-J7OCP2P6.mjs.map +7 -0
  31. package/dist/lib/browser/{markdown-TE5SWWNJ.mjs → markdown-Z677YORA.mjs} +8 -8
  32. package/dist/lib/browser/markdown-Z677YORA.mjs.map +7 -0
  33. package/dist/lib/browser/meta.json +1 -1
  34. package/dist/lib/browser/react-root-XKOD4KRB.mjs +28 -0
  35. package/dist/lib/browser/{react-surface-VXUJKSOG.mjs → react-surface-GVGZRBDK.mjs} +12 -11
  36. package/dist/lib/browser/react-surface-GVGZRBDK.mjs.map +7 -0
  37. package/dist/lib/browser/{settings-RB2RSLXV.mjs → settings-GRKEID73.mjs} +4 -4
  38. package/dist/lib/browser/{state-RKL5MSDP.mjs → state-2T4KDWBX.mjs} +4 -4
  39. package/dist/lib/browser/{state-RKL5MSDP.mjs.map → state-2T4KDWBX.mjs.map} +2 -2
  40. package/dist/lib/browser/toolkit-KUPIIFC6.mjs +80 -0
  41. package/dist/lib/browser/toolkit-KUPIIFC6.mjs.map +7 -0
  42. package/dist/lib/browser/types/index.mjs +2 -2
  43. package/dist/lib/node-esm/ChannelContainer-KQQEZWUN.mjs +17 -0
  44. package/dist/lib/node-esm/{ChatContainer-F6CSADV7.mjs → ChatContainer-QVQKFBWA.mjs} +6 -5
  45. package/dist/lib/node-esm/{app-graph-builder-BAHBHYWI.mjs → app-graph-builder-XEYWX5FC.mjs} +8 -8
  46. package/dist/lib/node-esm/app-graph-builder-XEYWX5FC.mjs.map +7 -0
  47. package/dist/lib/node-esm/{call-manager-UUYXLF4T.mjs → call-manager-QAREJFVX.mjs} +6 -5
  48. package/dist/lib/node-esm/call-manager-QAREJFVX.mjs.map +7 -0
  49. package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs +108 -0
  50. package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs.map +7 -0
  51. package/dist/lib/node-esm/chunk-4T45PCKP.mjs +25 -0
  52. package/dist/lib/node-esm/{chunk-O63QJPQX.mjs.map → chunk-4T45PCKP.mjs.map} +3 -3
  53. package/dist/lib/node-esm/{chunk-PGRP3O4O.mjs → chunk-57XR3LEF.mjs} +2 -2
  54. package/dist/lib/node-esm/{chunk-P6RLFCNT.mjs → chunk-DKCQCENK.mjs} +97 -72
  55. package/dist/lib/node-esm/chunk-DKCQCENK.mjs.map +7 -0
  56. package/dist/lib/node-esm/{chunk-ESQC6SYE.mjs → chunk-GRLRWTRU.mjs} +2 -2
  57. package/dist/lib/node-esm/chunk-JNPKMT7O.mjs +182 -0
  58. package/dist/lib/node-esm/chunk-JNPKMT7O.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-UZWVVFT3.mjs → chunk-LE2LIYGX.mjs} +226 -158
  60. package/dist/lib/node-esm/chunk-LE2LIYGX.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-UJMPYKT3.mjs → chunk-P6E247RF.mjs} +34 -15
  62. package/dist/lib/node-esm/chunk-P6E247RF.mjs.map +7 -0
  63. package/dist/lib/node-esm/{chunk-K4KAUOKT.mjs → chunk-PYTVBN5J.mjs} +3 -3
  64. package/dist/lib/node-esm/{chunk-K4KAUOKT.mjs.map → chunk-PYTVBN5J.mjs.map} +1 -1
  65. package/dist/lib/node-esm/{chunk-2RNIPFDA.mjs → chunk-SNKFZQST.mjs} +253 -250
  66. package/dist/lib/node-esm/chunk-SNKFZQST.mjs.map +7 -0
  67. package/dist/lib/node-esm/{chunk-WXNPD542.mjs → chunk-TIPIOH2J.mjs} +489 -308
  68. package/dist/lib/node-esm/chunk-TIPIOH2J.mjs.map +7 -0
  69. package/dist/lib/node-esm/index.mjs +49 -44
  70. package/dist/lib/node-esm/index.mjs.map +3 -3
  71. package/dist/lib/node-esm/{intent-resolver-BU73VYW3.mjs → intent-resolver-SR2LW4HF.mjs} +90 -16
  72. package/dist/lib/node-esm/intent-resolver-SR2LW4HF.mjs.map +7 -0
  73. package/dist/lib/node-esm/{markdown-HJUWNBLS.mjs → markdown-FL4IXLRP.mjs} +8 -8
  74. package/dist/lib/node-esm/markdown-FL4IXLRP.mjs.map +7 -0
  75. package/dist/lib/node-esm/meta.json +1 -1
  76. package/dist/lib/node-esm/{react-root-RUXOAQNW.mjs → react-root-4JWDRIQB.mjs} +12 -11
  77. package/dist/lib/{browser/react-root-NK3A4VG7.mjs.map → node-esm/react-root-4JWDRIQB.mjs.map} +1 -1
  78. package/dist/lib/node-esm/{react-surface-ELXFYKP6.mjs → react-surface-WLQUVRAX.mjs} +12 -11
  79. package/dist/lib/node-esm/react-surface-WLQUVRAX.mjs.map +7 -0
  80. package/dist/lib/node-esm/{settings-EA7DFSM6.mjs → settings-F2ODVNNW.mjs} +4 -4
  81. package/dist/lib/node-esm/{state-6AUTNROZ.mjs → state-62TQKQVB.mjs} +4 -4
  82. package/dist/lib/node-esm/{state-6AUTNROZ.mjs.map → state-62TQKQVB.mjs.map} +2 -2
  83. package/dist/lib/node-esm/toolkit-KZIS7G36.mjs +81 -0
  84. package/dist/lib/node-esm/toolkit-KZIS7G36.mjs.map +7 -0
  85. package/dist/lib/node-esm/types/index.mjs +2 -2
  86. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  87. package/dist/types/src/calls/call-manager.d.ts +1 -1
  88. package/dist/types/src/calls/call-manager.d.ts.map +1 -1
  89. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
  90. package/dist/types/src/calls/media-manager.d.ts +1 -1
  91. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  92. package/dist/types/src/calls/types.d.ts +1 -1
  93. package/dist/types/src/calls/types.d.ts.map +1 -1
  94. package/dist/types/src/calls/util/calls-service.d.ts +8 -3
  95. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  96. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  97. package/dist/types/src/calls-service.stories.d.ts +24 -0
  98. package/dist/types/src/calls-service.stories.d.ts.map +1 -0
  99. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  100. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  101. package/dist/types/src/capabilities/call-manager.d.ts +1 -1
  102. package/dist/types/src/capabilities/call-manager.d.ts.map +1 -1
  103. package/dist/types/src/capabilities/capabilities.d.ts +2 -2
  104. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  105. package/dist/types/src/capabilities/index.d.ts +11 -10
  106. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  107. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  108. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  109. package/dist/types/src/capabilities/markdown.d.ts +1 -1
  110. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  111. package/dist/types/src/capabilities/react-root.d.ts +2 -2
  112. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  113. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  114. package/dist/types/src/capabilities/settings.d.ts +1 -1
  115. package/dist/types/src/capabilities/state.d.ts +2 -2
  116. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  117. package/dist/types/src/capabilities/toolkit.d.ts +5 -0
  118. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -0
  119. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  120. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  121. package/dist/types/src/components/CallDebugPanel.d.ts +7 -0
  122. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
  123. package/dist/types/src/components/CallSidebar.d.ts.map +1 -1
  124. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
  125. package/dist/types/src/components/ChannelContainer.stories.d.ts +89 -4
  126. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  127. package/dist/types/src/components/Chat.stories.d.ts +90 -3
  128. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  129. package/dist/types/src/components/ChatContainer.d.ts +2 -2
  130. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  131. package/dist/types/src/components/Comments.stories.d.ts +156 -3
  132. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  133. package/dist/types/src/components/CommentsContainer.d.ts +4 -4
  134. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  135. package/dist/types/src/components/CommentsThreadContainer.d.ts +14 -0
  136. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -0
  137. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  138. package/dist/types/src/components/Media/VideoObject.d.ts +1 -1
  139. package/dist/types/src/components/Media/VideoObject.stories.d.ts +15 -3
  140. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  141. package/dist/types/src/components/MessageContainer.d.ts +4 -1
  142. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  143. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  144. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
  145. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +154 -2
  146. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  147. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +156 -3
  148. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  149. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  150. package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
  151. package/dist/types/src/components/command-extension.d.ts.map +1 -1
  152. package/dist/types/src/components/index.d.ts +1 -1
  153. package/dist/types/src/components/index.d.ts.map +1 -1
  154. package/dist/types/src/components/testing.d.ts +1 -0
  155. package/dist/types/src/components/testing.d.ts.map +1 -1
  156. package/dist/types/src/extensions/threads.d.ts +2 -2
  157. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  158. package/dist/types/src/hooks/index.d.ts +3 -0
  159. package/dist/types/src/hooks/index.d.ts.map +1 -1
  160. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
  161. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
  162. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts +2 -0
  163. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts.map +1 -0
  164. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +3 -0
  165. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -0
  166. package/dist/types/src/testing/stories.d.ts.map +1 -1
  167. package/dist/types/src/translations.d.ts +76 -194
  168. package/dist/types/src/translations.d.ts.map +1 -1
  169. package/dist/types/src/types/schema.d.ts +125 -81
  170. package/dist/types/src/types/schema.d.ts.map +1 -1
  171. package/dist/types/src/types/types.d.ts +270 -139
  172. package/dist/types/src/types/types.d.ts.map +1 -1
  173. package/dist/types/src/util.d.ts +17 -2
  174. package/dist/types/src/util.d.ts.map +1 -1
  175. package/dist/types/tsconfig.tsbuildinfo +1 -1
  176. package/package.json +56 -53
  177. package/src/ThreadPlugin.tsx +16 -24
  178. package/src/calls/call-manager.ts +8 -4
  179. package/src/calls/call-swarm-synchronizer.ts +1 -1
  180. package/src/calls/media-manager.ts +70 -37
  181. package/src/calls/types.ts +8 -4
  182. package/src/calls/util/calls-service.ts +72 -18
  183. package/src/calls/util/stub-media-streams.ts +62 -8
  184. package/src/calls-service.stories.tsx +232 -0
  185. package/src/capabilities/app-graph-builder.ts +8 -5
  186. package/src/capabilities/call-manager.ts +3 -2
  187. package/src/capabilities/capabilities.ts +2 -2
  188. package/src/capabilities/index.ts +1 -0
  189. package/src/capabilities/intent-resolver.ts +60 -8
  190. package/src/capabilities/markdown.ts +4 -3
  191. package/src/capabilities/react-surface.tsx +5 -4
  192. package/src/capabilities/state.ts +2 -1
  193. package/src/capabilities/toolkit.ts +78 -0
  194. package/src/components/Call/Call.tsx +4 -3
  195. package/src/components/Call/Toolbar.tsx +8 -8
  196. package/src/components/CallDebugPanel.tsx +110 -51
  197. package/src/components/CallSidebar.tsx +2 -1
  198. package/src/components/ChannelContainer.stories.tsx +11 -10
  199. package/src/components/ChannelContainer.tsx +13 -11
  200. package/src/components/Chat.stories.tsx +29 -27
  201. package/src/components/ChatContainer.tsx +20 -15
  202. package/src/components/Comments.stories.tsx +52 -41
  203. package/src/components/CommentsContainer.tsx +17 -11
  204. package/src/components/{CommentContainer.tsx → CommentsThreadContainer.tsx} +53 -82
  205. package/src/components/Lobby/Lobby.tsx +1 -1
  206. package/src/components/Media/VideoObject.stories.tsx +30 -27
  207. package/src/components/MessageContainer.tsx +65 -47
  208. package/src/components/Participant/Participant.tsx +13 -7
  209. package/src/components/Participant/ParticipantGrid.tsx +2 -1
  210. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +7 -6
  211. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +42 -39
  212. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +1 -1
  213. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +4 -4
  214. package/src/components/ThreadComplementary.tsx +40 -10
  215. package/src/components/ThreadSettings.tsx +4 -4
  216. package/src/components/command-extension.ts +5 -2
  217. package/src/components/index.ts +1 -1
  218. package/src/components/testing.ts +24 -2
  219. package/src/extensions/threads.ts +6 -6
  220. package/src/hooks/index.ts +3 -0
  221. package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
  222. package/src/hooks/useDebugMode.ts +1 -1
  223. package/src/hooks/useInaudibleAudioStreamTrack.tsx +27 -0
  224. package/src/hooks/useVideoStreamTrack.tsx +36 -0
  225. package/src/testing/stories.ts +7 -3
  226. package/src/translations.ts +14 -9
  227. package/src/types/types.ts +28 -11
  228. package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
  229. package/src/typings.d.ts +8 -0
  230. package/dist/lib/browser/ChannelContainer-PKFBVENP.mjs +0 -15
  231. package/dist/lib/browser/ChatContainer-RSOKYAMK.mjs +0 -14
  232. package/dist/lib/browser/app-graph-builder-OY7R7EJP.mjs.map +0 -7
  233. package/dist/lib/browser/call-manager-APQAZWHT.mjs.map +0 -7
  234. package/dist/lib/browser/chunk-4H4A264L.mjs.map +0 -7
  235. package/dist/lib/browser/chunk-5P5BH5GE.mjs +0 -88
  236. package/dist/lib/browser/chunk-5P5BH5GE.mjs.map +0 -7
  237. package/dist/lib/browser/chunk-6NBVNXTM.mjs +0 -21
  238. package/dist/lib/browser/chunk-AEXWNS6Z.mjs.map +0 -7
  239. package/dist/lib/browser/chunk-PG5CTFKK.mjs.map +0 -7
  240. package/dist/lib/browser/chunk-TAFSCSUR.mjs.map +0 -7
  241. package/dist/lib/browser/chunk-XZKBN3NS.mjs.map +0 -7
  242. package/dist/lib/browser/intent-resolver-FK2MDVDT.mjs.map +0 -7
  243. package/dist/lib/browser/markdown-TE5SWWNJ.mjs.map +0 -7
  244. package/dist/lib/browser/react-root-NK3A4VG7.mjs +0 -27
  245. package/dist/lib/browser/react-surface-VXUJKSOG.mjs.map +0 -7
  246. package/dist/lib/node/ChannelContainer-YS5YT2ML.cjs +0 -36
  247. package/dist/lib/node/ChannelContainer-YS5YT2ML.cjs.map +0 -7
  248. package/dist/lib/node/ChatContainer-GCOM3M56.cjs +0 -35
  249. package/dist/lib/node/ChatContainer-GCOM3M56.cjs.map +0 -7
  250. package/dist/lib/node/app-graph-builder-PBHJNDQY.cjs +0 -179
  251. package/dist/lib/node/app-graph-builder-PBHJNDQY.cjs.map +0 -7
  252. package/dist/lib/node/call-manager-HV2XJW5O.cjs +0 -37
  253. package/dist/lib/node/call-manager-HV2XJW5O.cjs.map +0 -7
  254. package/dist/lib/node/chunk-44I33JDT.cjs +0 -1731
  255. package/dist/lib/node/chunk-44I33JDT.cjs.map +0 -7
  256. package/dist/lib/node/chunk-4YSNVPWU.cjs +0 -37
  257. package/dist/lib/node/chunk-4YSNVPWU.cjs.map +0 -7
  258. package/dist/lib/node/chunk-E3WBZTTI.cjs +0 -371
  259. package/dist/lib/node/chunk-E3WBZTTI.cjs.map +0 -7
  260. package/dist/lib/node/chunk-ERG7G6FF.cjs +0 -59
  261. package/dist/lib/node/chunk-ERG7G6FF.cjs.map +0 -7
  262. package/dist/lib/node/chunk-FUXJAVFZ.cjs +0 -108
  263. package/dist/lib/node/chunk-FUXJAVFZ.cjs.map +0 -7
  264. package/dist/lib/node/chunk-HLMCEE5K.cjs +0 -41
  265. package/dist/lib/node/chunk-HLMCEE5K.cjs.map +0 -7
  266. package/dist/lib/node/chunk-IP533AMV.cjs +0 -554
  267. package/dist/lib/node/chunk-IP533AMV.cjs.map +0 -7
  268. package/dist/lib/node/chunk-LR5NENBE.cjs +0 -54
  269. package/dist/lib/node/chunk-LR5NENBE.cjs.map +0 -7
  270. package/dist/lib/node/chunk-UM36TPCT.cjs +0 -984
  271. package/dist/lib/node/chunk-UM36TPCT.cjs.map +0 -7
  272. package/dist/lib/node/chunk-ZGDN3XBR.cjs +0 -149
  273. package/dist/lib/node/chunk-ZGDN3XBR.cjs.map +0 -7
  274. package/dist/lib/node/index.cjs +0 -310
  275. package/dist/lib/node/index.cjs.map +0 -7
  276. package/dist/lib/node/intent-resolver-SYSJ5SJG.cjs +0 -363
  277. package/dist/lib/node/intent-resolver-SYSJ5SJG.cjs.map +0 -7
  278. package/dist/lib/node/markdown-GQIPJS2F.cjs +0 -178
  279. package/dist/lib/node/markdown-GQIPJS2F.cjs.map +0 -7
  280. package/dist/lib/node/meta.json +0 -1
  281. package/dist/lib/node/react-root-6HHDMULJ.cjs +0 -51
  282. package/dist/lib/node/react-root-6HHDMULJ.cjs.map +0 -7
  283. package/dist/lib/node/react-surface-NBH42NN2.cjs +0 -122
  284. package/dist/lib/node/react-surface-NBH42NN2.cjs.map +0 -7
  285. package/dist/lib/node/settings-4LQSFEDK.cjs +0 -36
  286. package/dist/lib/node/settings-4LQSFEDK.cjs.map +0 -7
  287. package/dist/lib/node/state-IY5XX3H2.cjs +0 -50
  288. package/dist/lib/node/state-IY5XX3H2.cjs.map +0 -7
  289. package/dist/lib/node/types/index.cjs +0 -38
  290. package/dist/lib/node/types/index.cjs.map +0 -7
  291. package/dist/lib/node-esm/ChannelContainer-O4QJII2P.mjs +0 -16
  292. package/dist/lib/node-esm/app-graph-builder-BAHBHYWI.mjs.map +0 -7
  293. package/dist/lib/node-esm/call-manager-UUYXLF4T.mjs.map +0 -7
  294. package/dist/lib/node-esm/chunk-2RNIPFDA.mjs.map +0 -7
  295. package/dist/lib/node-esm/chunk-O3V45YJP.mjs +0 -90
  296. package/dist/lib/node-esm/chunk-O3V45YJP.mjs.map +0 -7
  297. package/dist/lib/node-esm/chunk-O63QJPQX.mjs +0 -23
  298. package/dist/lib/node-esm/chunk-P6RLFCNT.mjs.map +0 -7
  299. package/dist/lib/node-esm/chunk-UJMPYKT3.mjs.map +0 -7
  300. package/dist/lib/node-esm/chunk-UZWVVFT3.mjs.map +0 -7
  301. package/dist/lib/node-esm/chunk-WXNPD542.mjs.map +0 -7
  302. package/dist/lib/node-esm/intent-resolver-BU73VYW3.mjs.map +0 -7
  303. package/dist/lib/node-esm/markdown-HJUWNBLS.mjs.map +0 -7
  304. package/dist/lib/node-esm/react-surface-ELXFYKP6.mjs.map +0 -7
  305. package/dist/types/src/components/CommentContainer.d.ts +0 -13
  306. package/dist/types/src/components/CommentContainer.d.ts.map +0 -1
  307. package/dist/types/src/peers.stories.d.ts +0 -11
  308. package/dist/types/src/peers.stories.d.ts.map +0 -1
  309. package/src/peers.stories.tsx +0 -189
  310. /package/dist/lib/browser/{ChannelContainer-PKFBVENP.mjs.map → ChannelContainer-4PYFOIDK.mjs.map} +0 -0
  311. /package/dist/lib/browser/{ChatContainer-RSOKYAMK.mjs.map → ChatContainer-EXNNREYB.mjs.map} +0 -0
  312. /package/dist/lib/browser/{chunk-IIUTBDVB.mjs.map → chunk-EV4JWI7L.mjs.map} +0 -0
  313. /package/dist/lib/browser/{chunk-JKQUJOTX.mjs.map → chunk-GERVMFQW.mjs.map} +0 -0
  314. /package/dist/lib/{node-esm/react-root-RUXOAQNW.mjs.map → browser/react-root-XKOD4KRB.mjs.map} +0 -0
  315. /package/dist/lib/browser/{settings-RB2RSLXV.mjs.map → settings-GRKEID73.mjs.map} +0 -0
  316. /package/dist/lib/node-esm/{ChannelContainer-O4QJII2P.mjs.map → ChannelContainer-KQQEZWUN.mjs.map} +0 -0
  317. /package/dist/lib/node-esm/{ChatContainer-F6CSADV7.mjs.map → ChatContainer-QVQKFBWA.mjs.map} +0 -0
  318. /package/dist/lib/node-esm/{chunk-PGRP3O4O.mjs.map → chunk-57XR3LEF.mjs.map} +0 -0
  319. /package/dist/lib/node-esm/{chunk-ESQC6SYE.mjs.map → chunk-GRLRWTRU.mjs.map} +0 -0
  320. /package/dist/lib/node-esm/{settings-EA7DFSM6.mjs.map → settings-F2ODVNNW.mjs.map} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-thread",
3
- "version": "0.8.3",
3
+ "version": "0.8.4-main.1f223c7",
4
4
  "description": "DXOS Threads Surface plugin",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -10,11 +10,13 @@
10
10
  "type": "module",
11
11
  "exports": {
12
12
  ".": {
13
+ "source": "./src/index.ts",
13
14
  "types": "./dist/types/src/index.d.ts",
14
15
  "browser": "./dist/lib/browser/index.mjs",
15
16
  "node": "./dist/lib/node-esm/index.mjs"
16
17
  },
17
18
  "./types": {
19
+ "source": "./src/types/index.ts",
18
20
  "types": "./dist/types/src/types/index.d.ts",
19
21
  "browser": "./dist/lib/browser/types/index.mjs",
20
22
  "node": "./dist/lib/node-esm/types/index.mjs"
@@ -33,9 +35,10 @@
33
35
  "src"
34
36
  ],
35
37
  "dependencies": {
36
- "@codemirror/language": "^6.10.3",
37
- "@codemirror/state": "^6.4.1",
38
- "@codemirror/view": "^6.34.1",
38
+ "@codemirror/language": "^6.11.3",
39
+ "@codemirror/state": "^6.5.2",
40
+ "@codemirror/view": "^6.38.2",
41
+ "@effect/ai": "0.25.2",
39
42
  "@peermetrics/webrtc-stats": "5.7.1",
40
43
  "@preact-signals/safe-react": "^0.9.0",
41
44
  "@preact/signals-core": "^1.9.0",
@@ -43,68 +46,68 @@
43
46
  "extendable-media-recorder": "^9.2.19",
44
47
  "extendable-media-recorder-wav-encoder": "^7.0.123",
45
48
  "md5-hex": "5.0.0",
46
- "react-resize-detector": "^12.0.2",
49
+ "react-resize-detector": "^11.0.1",
47
50
  "wavefile": "^11.0.0",
48
- "@dxos/app-framework": "0.8.3",
49
- "@dxos/codec-protobuf": "0.8.3",
50
- "@dxos/async": "0.8.3",
51
- "@dxos/context": "0.8.3",
52
- "@dxos/devtools": "0.8.3",
53
- "@dxos/echo": "0.8.3",
54
- "@dxos/echo-schema": "0.8.3",
55
- "@dxos/keys": "0.8.3",
56
- "@dxos/display-name": "0.8.3",
57
- "@dxos/invariant": "0.8.3",
58
- "@dxos/local-storage": "0.8.3",
59
- "@dxos/live-object": "0.8.3",
60
- "@dxos/log": "0.8.3",
61
- "@dxos/plugin-attention": "0.8.3",
62
- "@dxos/plugin-client": "0.8.3",
63
- "@dxos/plugin-deck": "0.8.3",
64
- "@dxos/plugin-graph": "0.8.3",
65
- "@dxos/plugin-observability": "0.8.3",
66
- "@dxos/plugin-space": "0.8.3",
67
- "@dxos/plugin-markdown": "0.8.3",
68
- "@dxos/protocols": "0.8.3",
69
- "@dxos/react-client": "0.8.3",
70
- "@dxos/react-ui-attention": "0.8.3",
71
- "@dxos/react-ui-editor": "0.8.3",
72
- "@dxos/react-ui-form": "0.8.3",
73
- "@dxos/react-ui-dnd": "0.8.3",
74
- "@dxos/react-ui-menu": "0.8.3",
75
- "@dxos/react-ui-syntax-highlighter": "0.8.3",
76
- "@dxos/react-ui-sfx": "0.8.3",
77
- "@dxos/react-ui-stack": "0.8.3",
78
- "@dxos/react-ui-tabs": "0.8.3",
79
- "@dxos/schema": "0.8.3",
80
- "@dxos/util": "0.8.3",
81
- "@dxos/react-ui-thread": "0.8.3"
51
+ "@dxos/app-framework": "0.8.4-main.1f223c7",
52
+ "@dxos/async": "0.8.4-main.1f223c7",
53
+ "@dxos/context": "0.8.4-main.1f223c7",
54
+ "@dxos/codec-protobuf": "0.8.4-main.1f223c7",
55
+ "@dxos/debug": "0.8.4-main.1f223c7",
56
+ "@dxos/assistant": "0.8.4-main.1f223c7",
57
+ "@dxos/display-name": "0.8.4-main.1f223c7",
58
+ "@dxos/echo": "0.8.4-main.1f223c7",
59
+ "@dxos/devtools": "0.8.4-main.1f223c7",
60
+ "@dxos/invariant": "0.8.4-main.1f223c7",
61
+ "@dxos/echo-schema": "0.8.4-main.1f223c7",
62
+ "@dxos/keys": "0.8.4-main.1f223c7",
63
+ "@dxos/live-object": "0.8.4-main.1f223c7",
64
+ "@dxos/local-storage": "0.8.4-main.1f223c7",
65
+ "@dxos/log": "0.8.4-main.1f223c7",
66
+ "@dxos/plugin-attention": "0.8.4-main.1f223c7",
67
+ "@dxos/plugin-client": "0.8.4-main.1f223c7",
68
+ "@dxos/plugin-deck": "0.8.4-main.1f223c7",
69
+ "@dxos/plugin-markdown": "0.8.4-main.1f223c7",
70
+ "@dxos/plugin-space": "0.8.4-main.1f223c7",
71
+ "@dxos/plugin-observability": "0.8.4-main.1f223c7",
72
+ "@dxos/protocols": "0.8.4-main.1f223c7",
73
+ "@dxos/plugin-graph": "0.8.4-main.1f223c7",
74
+ "@dxos/react-client": "0.8.4-main.1f223c7",
75
+ "@dxos/react-ui-attention": "0.8.4-main.1f223c7",
76
+ "@dxos/react-ui-dnd": "0.8.4-main.1f223c7",
77
+ "@dxos/react-ui-editor": "0.8.4-main.1f223c7",
78
+ "@dxos/react-ui-form": "0.8.4-main.1f223c7",
79
+ "@dxos/react-ui-menu": "0.8.4-main.1f223c7",
80
+ "@dxos/react-ui-sfx": "0.8.4-main.1f223c7",
81
+ "@dxos/react-ui-stack": "0.8.4-main.1f223c7",
82
+ "@dxos/react-ui-syntax-highlighter": "0.8.4-main.1f223c7",
83
+ "@dxos/react-ui-tabs": "0.8.4-main.1f223c7",
84
+ "@dxos/react-ui-thread": "0.8.4-main.1f223c7",
85
+ "@dxos/util": "0.8.4-main.1f223c7",
86
+ "@dxos/schema": "0.8.4-main.1f223c7"
82
87
  },
83
88
  "devDependencies": {
84
- "@effect-rx/rx-react": "^0.34.1",
85
- "@effect/platform": "0.80.12",
86
- "@phosphor-icons/react": "^2.1.5",
89
+ "@effect-rx/rx-react": "0.38.0",
90
+ "@effect/platform": "0.90.2",
87
91
  "@types/react": "~18.2.0",
88
92
  "@types/react-dom": "~18.2.0",
89
- "effect": "3.14.21",
93
+ "effect": "3.17.7",
90
94
  "react": "~18.2.0",
91
95
  "react-dom": "~18.2.0",
92
- "vite": "5.4.7",
93
- "@dxos/random": "0.8.3",
94
- "@dxos/plugin-theme": "0.8.3",
95
- "@dxos/react-ui": "0.8.3",
96
- "@dxos/storybook-utils": "0.8.3",
97
- "@dxos/react-ui-theme": "0.8.3"
96
+ "vite": "7.1.1",
97
+ "@dxos/react-ui": "0.8.4-main.1f223c7",
98
+ "@dxos/random": "0.8.4-main.1f223c7",
99
+ "@dxos/react-ui-theme": "0.8.4-main.1f223c7",
100
+ "@dxos/plugin-theme": "0.8.4-main.1f223c7",
101
+ "@dxos/storybook-utils": "0.8.4-main.1f223c7"
98
102
  },
99
103
  "peerDependencies": {
100
104
  "@effect-rx/rx-react": "^0.34.1",
101
- "@effect/platform": "0.80.12",
102
- "@phosphor-icons/react": "^2.1.5",
105
+ "@effect/platform": "^0.80.12",
103
106
  "effect": "^3.13.3",
104
107
  "react": "~18.2.0",
105
108
  "react-dom": "~18.2.0",
106
- "@dxos/react-ui": "0.8.3",
107
- "@dxos/react-ui-theme": "0.8.3"
109
+ "@dxos/react-ui": "0.8.4-main.1f223c7",
110
+ "@dxos/react-ui-theme": "0.8.4-main.1f223c7"
108
111
  },
109
112
  "publishConfig": {
110
113
  "access": "public"
@@ -2,14 +2,12 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { Effect } from 'effect';
6
-
7
- import { Capabilities, contributes, createIntent, defineModule, definePlugin, Events } from '@dxos/app-framework';
8
- import { Ref, Type } from '@dxos/echo';
5
+ import { Capabilities, Events, contributes, createIntent, defineModule, definePlugin } from '@dxos/app-framework';
6
+ import { Ref } from '@dxos/echo';
9
7
  import { ClientCapabilities, ClientEvents } from '@dxos/plugin-client';
10
8
  import { MarkdownEvents } from '@dxos/plugin-markdown';
11
9
  import { SpaceCapabilities, SpaceEvents } from '@dxos/plugin-space';
12
- import { CollectionAction, defineObjectForm } from '@dxos/plugin-space/types';
10
+ import { defineObjectForm } from '@dxos/plugin-space/types';
13
11
  import { translations as threadTranslations } from '@dxos/react-ui-thread';
14
12
  import { AnchoredTo, DataType } from '@dxos/schema';
15
13
 
@@ -21,9 +19,10 @@ import {
21
19
  ReactRoot,
22
20
  ReactSurface,
23
21
  ThreadState,
22
+ Toolkit,
24
23
  } from './capabilities';
25
- import { meta, THREAD_ITEM } from './meta';
26
- import translations from './translations';
24
+ import { THREAD_ITEM, meta } from './meta';
25
+ import { translations } from './translations';
27
26
  import { ChannelType, ThreadAction, ThreadType } from './types';
28
27
 
29
28
  // TODO(Zan): Every instance of `cursor` should be replaced with `anchor`.
@@ -124,23 +123,10 @@ export const ThreadPlugin = () =>
124
123
  defineModule({
125
124
  id: `${meta.id}/module/on-space-created`,
126
125
  activatesOn: SpaceEvents.SpaceCreated,
127
- activate: (context) => {
128
- const { dispatch } = context.getCapability(Capabilities.IntentDispatcher);
129
- return contributes(SpaceCapabilities.OnSpaceCreated, async ({ space, rootCollection }) => {
130
- const program = Effect.gen(function* () {
131
- const { object: collection } = yield* dispatch(
132
- createIntent(CollectionAction.CreateQueryCollection, { typename: Type.getTypename(ChannelType) }),
133
- );
134
- rootCollection.objects.push(Ref.make(collection));
135
-
136
- const { object: channel } = yield* dispatch(
137
- createIntent(ThreadAction.CreateChannel, { name: 'General', spaceId: space.id }),
138
- );
139
- space.db.add(channel);
140
- });
141
- await Effect.runPromise(program);
142
- });
143
- },
126
+ activate: () =>
127
+ contributes(SpaceCapabilities.OnSpaceCreated, ({ space, rootCollection }) =>
128
+ createIntent(ThreadAction.OnSpaceCreated, { space, rootCollection }),
129
+ ),
144
130
  }),
145
131
  defineModule({
146
132
  id: `${meta.id}/module/markdown`,
@@ -167,4 +153,10 @@ export const ThreadPlugin = () =>
167
153
  activatesOn: Events.SetupAppGraph,
168
154
  activate: AppGraphBuilder,
169
155
  }),
156
+ defineModule({
157
+ id: `${meta.id}/module/toolkit`,
158
+ // TODO(wittjosiah): Shouldn't use the startup event.
159
+ activatesOn: Events.Startup,
160
+ activate: Toolkit,
161
+ }),
170
162
  ]);
@@ -12,7 +12,7 @@ import { live } from '@dxos/live-object';
12
12
  import { type Tracks } from '@dxos/protocols/proto/dxos/edge/calls';
13
13
  import { isNonNullable } from '@dxos/util';
14
14
 
15
- import { CallSwarmSynchronizer, type CallState } from './call-swarm-synchronizer';
15
+ import { type CallState, CallSwarmSynchronizer } from './call-swarm-synchronizer';
16
16
  import { MediaManager, type MediaState } from './media-manager';
17
17
  import { type ActivityState, CALLS_URL, type EncodedTrackName, TrackNameCodec, type UserState } from './types';
18
18
 
@@ -88,8 +88,12 @@ export class CallManager extends Resource {
88
88
  }
89
89
 
90
90
  /** @reactive */
91
- get pulledAudioTracks() {
92
- return Object.values(this._state.media.pulledAudioTracks).map((track) => track.track);
91
+ get audioTracksToPlay(): MediaStreamTrack[] {
92
+ return (this._state.call.users ?? [])
93
+ .map((user) => (user.tracks?.audioEnabled ? user.tracks?.audio : undefined))
94
+ .filter(isNonNullable)
95
+ .map((track) => this._state.media.pulledAudioTracks[track as EncodedTrackName]?.track)
96
+ .filter(isNonNullable);
93
97
  }
94
98
 
95
99
  /** @reactive */
@@ -206,7 +210,7 @@ export class CallManager extends Resource {
206
210
 
207
211
  private _onCallStateUpdated(state: CallState): void {
208
212
  const tracksToPull = state.users
209
- ?.filter((user) => user.joined && user.id !== state.self?.id)
213
+ ?.filter((user) => user.joined && user.id !== state.self!.id)
210
214
  ?.flatMap((user) => [user.tracks?.video, user.tracks?.audio, user.tracks?.screenshare])
211
215
  .filter(isNonNullable);
212
216
  this._mediaManager._schedulePullTracks(tracksToPull as EncodedTrackName[]);
@@ -17,7 +17,7 @@ import { type Device, type NetworkService } from '@dxos/protocols/proto/dxos/cli
17
17
  import { ConnectionState, type SwarmResponse } from '@dxos/protocols/proto/dxos/edge/messenger';
18
18
  import { isNonNullable } from '@dxos/util';
19
19
 
20
- import { codec, type ActivityState, type UserState } from './types';
20
+ import { type ActivityState, type UserState, codec } from './types';
21
21
 
22
22
  export type CallState = {
23
23
  /**
@@ -3,11 +3,12 @@
3
3
  //
4
4
 
5
5
  import { DeferredTask, Event, sleep, synchronized } from '@dxos/async';
6
- import { cancelWithContext, type Context, Resource } from '@dxos/context';
6
+ import { type Context, Resource, cancelWithContext } from '@dxos/context';
7
+ import { invariant } from '@dxos/invariant';
7
8
  import { log } from '@dxos/log';
8
9
 
9
10
  import { SpeakingMonitor } from './speaking-monitor';
10
- import { TrackNameCodec, type EncodedTrackName, type TrackObject } from './types';
11
+ import { type EncodedTrackName, TrackNameCodec, type TrackObject } from './types';
11
12
  import {
12
13
  type CallsServiceConfig,
13
14
  CallsServicePeer,
@@ -48,12 +49,14 @@ const VIDEO_WIDTH = 1280;
48
49
  const VIDEO_HEIGHT = 720;
49
50
  const MAX_WEB_CAM_FRAMERATE = 24;
50
51
  const MAX_WEB_CAM_BITRATE = 120_0000;
51
- const RETRY_INTERVAL = 500;
52
+ const RETRY_INTERVAL = 100;
52
53
 
53
54
  export type MediaManagerParams = {
54
55
  serviceConfig: CallsServiceConfig;
55
56
  };
56
57
 
58
+ const USE_INAUDIBLE_AUDIO = true;
59
+
57
60
  export class MediaManager extends Resource {
58
61
  public readonly stateUpdated = new Event<MediaState>();
59
62
  private readonly _state: MediaState = { pulledVideoStreams: {}, pulledAudioTracks: {} };
@@ -86,8 +89,10 @@ export class MediaManager extends Resource {
86
89
  this._state.videoStream = new MediaStream();
87
90
  this._state.videoStream.addTrack(this._state.videoTrack);
88
91
 
89
- this._inaudibleAudioStreamTrack = await createInaudibleAudioStreamTrack({ ctx: this._ctx });
90
- this._state.audioTrack = this._inaudibleAudioStreamTrack;
92
+ if (USE_INAUDIBLE_AUDIO) {
93
+ this._inaudibleAudioStreamTrack = await createInaudibleAudioStreamTrack({ ctx: this._ctx });
94
+ this._state.audioTrack = this._inaudibleAudioStreamTrack;
95
+ }
91
96
 
92
97
  this._pushTracksTask = new DeferredTask(this._ctx, async () => {
93
98
  await this._pushTracks();
@@ -170,11 +175,14 @@ export class MediaManager extends Resource {
170
175
  async turnAudioOff(): Promise<void> {
171
176
  void this._speakingMonitor?.close();
172
177
  this._speakingMonitor = undefined;
173
- if (this._state.audioTrack !== this._inaudibleAudioStreamTrack) {
178
+ this._state.audioEnabled = false;
179
+ if (USE_INAUDIBLE_AUDIO && this._state.audioTrack !== this._inaudibleAudioStreamTrack) {
174
180
  this._state.audioTrack?.stop();
175
181
  this._state.audioTrack = this._inaudibleAudioStreamTrack;
182
+ } else {
183
+ this._state.audioTrack?.stop();
184
+ this._state.audioTrack = undefined;
176
185
  }
177
- this._state.audioEnabled = false;
178
186
  this.stateUpdated.emit(this._state);
179
187
  this._pushTracksTask!.schedule();
180
188
  }
@@ -241,7 +249,7 @@ export class MediaManager extends Resource {
241
249
  });
242
250
 
243
251
  // Pull new tracks.
244
- await Promise.all(tracksToPull.map((name) => this._pullTrack(name)));
252
+ const pullResults = await Promise.all(tracksToPull.map((name) => this._pullTrack(name)));
245
253
 
246
254
  // Close old tracks.
247
255
  await Promise.all([...audioTracksToClose, ...videoStreamsToClose].map(([_, { ctx }]) => ctx.dispose()));
@@ -251,6 +259,13 @@ export class MediaManager extends Resource {
251
259
  currentVideoStreams: Object.keys(this._state.pulledVideoStreams),
252
260
  });
253
261
  this.stateUpdated.emit(this._state);
262
+
263
+ if (pullResults.some(({ shouldRetry }) => shouldRetry)) {
264
+ await cancelWithContext(this._ctx, sleep(RETRY_INTERVAL));
265
+ log.info('retrying pull tracks', { tracksToPull });
266
+ invariant(this._pullTracksTask);
267
+ this._pullTracksTask.schedule();
268
+ }
254
269
  }
255
270
 
256
271
  private async _pushTracks(): Promise<void> {
@@ -259,38 +274,47 @@ export class MediaManager extends Resource {
259
274
  }
260
275
 
261
276
  let updated = false;
262
- const [pushedVideoTrack, pushedAudioTrack, pushedScreenshareTrack] = await Promise.all([
263
- this._pushTrack(this._state.videoTrack, this._state.pushedVideoTrack, [
277
+ const [pushVideoResult, pushAudioResult, pushScreenshareResult] = await Promise.all([
278
+ this._maybePushTrack(this._state.videoTrack, this._state.pushedVideoTrack, [
264
279
  { maxFramerate: MAX_WEB_CAM_FRAMERATE, maxBitrate: MAX_WEB_CAM_BITRATE },
265
280
  ]),
266
- this._pushTrack(this._state.audioTrack, this._state.pushedAudioTrack, [{ networkPriority: 'high' }]),
267
- this._pushTrack(this._state.screenshareTrack, this._state.pushedScreenshareTrack),
281
+ this._maybePushTrack(this._state.audioTrack, this._state.pushedAudioTrack, [{ networkPriority: 'high' }]),
282
+ this._maybePushTrack(this._state.screenshareTrack, this._state.pushedScreenshareTrack),
268
283
  ]);
269
284
 
270
- if (pushedVideoTrack !== this._state.pushedVideoTrack) {
271
- this._state.pushedVideoTrack = pushedVideoTrack;
285
+ if (pushVideoResult.track !== this._state.pushedVideoTrack) {
286
+ this._state.pushedVideoTrack = pushVideoResult.track;
272
287
  updated = true;
273
288
  }
274
- if (pushedAudioTrack !== this._state.pushedAudioTrack) {
275
- this._state.pushedAudioTrack = pushedAudioTrack;
289
+ if (pushAudioResult.track !== this._state.pushedAudioTrack) {
290
+ this._state.pushedAudioTrack = pushAudioResult.track;
276
291
  updated = true;
277
292
  }
278
- if (pushedScreenshareTrack !== this._state.pushedScreenshareTrack) {
279
- this._state.pushedScreenshareTrack = pushedScreenshareTrack;
293
+ if (pushScreenshareResult.track !== this._state.pushedScreenshareTrack) {
294
+ this._state.pushedScreenshareTrack = pushScreenshareResult.track;
280
295
  updated = true;
281
296
  }
282
- if (!updated) {
283
- return;
297
+
298
+ const shouldRetry = pushVideoResult.shouldRetry || pushAudioResult.shouldRetry || pushScreenshareResult.shouldRetry;
299
+
300
+ if (updated) {
301
+ this.stateUpdated.emit(this._state);
284
302
  }
285
303
 
286
- this.stateUpdated.emit(this._state);
304
+ if (shouldRetry) {
305
+ await cancelWithContext(this._ctx, sleep(RETRY_INTERVAL));
306
+ log.info('retrying push tracks', { pushVideoResult, pushAudioResult, pushScreenshareResult });
307
+ invariant(this._pushTracksTask);
308
+ this._pushTracksTask.schedule();
309
+ }
287
310
  }
288
311
 
289
- private async _pullTrack(name: EncodedTrackName): Promise<void> {
312
+ private async _pullTrack(name: EncodedTrackName): Promise<{ shouldRetry: boolean }> {
290
313
  const ctx = this._ctx.derive();
291
314
  try {
292
315
  const trackData = TrackNameCodec.decode(name);
293
- const track = await this._state.peer!.pullTrack({ trackData, ctx });
316
+ // We need to set mid here to `undefined`, because mid is peer specific.
317
+ const track = await this._state.peer!.pullTrack({ trackData: { ...trackData, mid: undefined }, ctx });
294
318
  if (track?.readyState === 'ended') {
295
319
  throw new Error('Pulled track ended immediately');
296
320
  }
@@ -299,7 +323,7 @@ export class MediaManager extends Resource {
299
323
  case 'audio': {
300
324
  this._state.pulledAudioTracks[name] = { track, ctx };
301
325
  ctx.onDispose(() => delete this._state.pulledAudioTracks[name]);
302
- break;
326
+ return { shouldRetry: false };
303
327
  }
304
328
  case 'video': {
305
329
  const mediaStream = new MediaStream();
@@ -310,33 +334,42 @@ export class MediaManager extends Resource {
310
334
  track.stop();
311
335
  delete this._state.pulledVideoStreams[name];
312
336
  });
313
- break;
337
+ return { shouldRetry: false };
314
338
  }
315
339
  default:
316
340
  throw new Error(`Invalid track kind: ${track?.kind}`);
317
341
  }
318
342
  } catch (err) {
319
- log.verbose('failed to pull track', { err, name });
343
+ log.info('failed to pull track', { err, name });
320
344
  void ctx.dispose();
321
- await cancelWithContext(this._ctx, sleep(RETRY_INTERVAL));
322
- log.verbose('retrying pull track', { name });
323
- this._pullTracksTask!.schedule();
345
+ return { shouldRetry: true };
324
346
  }
325
347
  }
326
348
 
327
- private async _pushTrack(
349
+ private async _maybePushTrack(
328
350
  track?: MediaStreamTrack,
329
351
  previousTrack?: TrackObject,
330
352
  encodings?: RTCRtpEncodingParameters[],
331
- ): Promise<TrackObject | undefined> {
353
+ ): Promise<{ track?: TrackObject; shouldRetry?: boolean }> {
332
354
  if (!track && !previousTrack) {
333
- return;
355
+ return { track: undefined };
334
356
  }
335
357
 
336
- return this._state.peer!.pushTrack({
337
- track: track ?? null,
338
- previousTrack,
339
- encodings,
340
- });
358
+ const ctx = this._ctx.derive();
359
+
360
+ try {
361
+ return {
362
+ track: await this._state.peer!.pushTrack({
363
+ ctx,
364
+ track: track ?? null,
365
+ previousTrack,
366
+ encodings,
367
+ }),
368
+ };
369
+ } catch (err) {
370
+ log.info('failed to push track', { err, track, previousTrack, encodings });
371
+ void ctx.dispose();
372
+ return { shouldRetry: true };
373
+ }
341
374
  }
342
375
  }
@@ -2,11 +2,12 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ import { invariant } from '@dxos/invariant';
5
6
  import { buf } from '@dxos/protocols/buf';
6
7
  import {
7
8
  type ActivitySchema,
8
- UserStateSchema,
9
9
  type UserState as UserStateProto,
10
+ UserStateSchema,
10
11
  } from '@dxos/protocols/buf/dxos/edge/calls_pb';
11
12
 
12
13
  /**
@@ -61,10 +62,13 @@ export type EncodedTrackName = string & { __brand: 'EncodedTrackName' };
61
62
 
62
63
  export const TrackNameCodec = {
63
64
  encode: (trackData: TrackObject): EncodedTrackName => {
64
- return (trackData.sessionId + '/' + trackData.trackName) as EncodedTrackName;
65
+ invariant(trackData.sessionId);
66
+ invariant(trackData.trackName);
67
+ invariant(trackData.mid);
68
+ return (trackData.sessionId + '/' + trackData.trackName + '/' + trackData.mid) as EncodedTrackName;
65
69
  },
66
70
  decode: (name: EncodedTrackName): TrackObject => {
67
- const [sessionId, trackName] = name.split('/');
68
- return { sessionId, trackName, location: 'remote' };
71
+ const [sessionId, trackName, mid] = name.split('/');
72
+ return { sessionId, trackName, location: 'remote', mid };
69
73
  },
70
74
  };