@dxos/plugin-thread 0.8.4-main.28f8d3d → 0.8.4-main.406dc2a

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 (246) hide show
  1. package/dist/lib/browser/ChannelContainer-BGDGZHV4.mjs +16 -0
  2. package/dist/lib/browser/ChatContainer-75KJZ4XR.mjs +15 -0
  3. package/dist/lib/browser/{app-graph-builder-AF3M7UWN.mjs → app-graph-builder-ODKIAXR7.mjs} +17 -17
  4. package/dist/lib/browser/app-graph-builder-ODKIAXR7.mjs.map +7 -0
  5. package/dist/lib/browser/{call-manager-XRRCAVLI.mjs → call-manager-BCKLI4QD.mjs} +7 -7
  6. package/dist/lib/browser/{call-manager-XRRCAVLI.mjs.map → call-manager-BCKLI4QD.mjs.map} +1 -1
  7. package/dist/lib/browser/chunk-2MUYQOQE.mjs +23 -0
  8. package/dist/lib/browser/{chunk-2CWJBXBH.mjs.map → chunk-2MUYQOQE.mjs.map} +3 -3
  9. package/dist/lib/browser/chunk-B7YQ7QR2.mjs +376 -0
  10. package/dist/lib/browser/chunk-B7YQ7QR2.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-ZJ7QBXK6.mjs → chunk-CMCVHULC.mjs} +17 -15
  12. package/dist/lib/browser/chunk-CMCVHULC.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-GERVMFQW.mjs → chunk-CP7E2HRE.mjs} +2 -2
  14. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-X5PIP5YR.mjs → chunk-HDEQRBOC.mjs} +37 -5
  16. package/dist/lib/{node-esm/chunk-SED3O2XO.mjs.map → browser/chunk-HDEQRBOC.mjs.map} +4 -4
  17. package/dist/lib/browser/chunk-L326LSNS.mjs +18 -0
  18. package/dist/lib/browser/chunk-L326LSNS.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-EV4JWI7L.mjs → chunk-T4KJ5JR4.mjs} +5 -7
  20. package/dist/lib/browser/chunk-T4KJ5JR4.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-VJMKS4CZ.mjs +619 -0
  22. package/dist/lib/browser/chunk-VJMKS4CZ.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-DW7JD64V.mjs → chunk-VTYX3SIM.mjs} +26 -16
  24. package/dist/lib/browser/chunk-VTYX3SIM.mjs.map +7 -0
  25. package/dist/lib/browser/{chunk-JGKMMI65.mjs → chunk-XYUJXHYV.mjs} +54 -4
  26. package/dist/lib/browser/chunk-XYUJXHYV.mjs.map +7 -0
  27. package/dist/lib/browser/{chunk-TUFWPOVS.mjs → chunk-ZCEU5K23.mjs} +460 -268
  28. package/dist/lib/browser/chunk-ZCEU5K23.mjs.map +7 -0
  29. package/dist/lib/browser/index.mjs +22 -13
  30. package/dist/lib/browser/index.mjs.map +3 -3
  31. package/dist/lib/browser/{intent-resolver-DCY4P4OX.mjs → intent-resolver-VOQD3TQ2.mjs} +73 -15
  32. package/dist/lib/browser/intent-resolver-VOQD3TQ2.mjs.map +7 -0
  33. package/dist/lib/browser/{markdown-WZSXCEZJ.mjs → markdown-R6MGRIA6.mjs} +6 -6
  34. package/dist/lib/browser/{markdown-WZSXCEZJ.mjs.map → markdown-R6MGRIA6.mjs.map} +1 -1
  35. package/dist/lib/browser/meta.json +1 -1
  36. package/dist/lib/browser/react-root-UMSBTN6H.mjs +28 -0
  37. package/dist/lib/browser/react-root-UMSBTN6H.mjs.map +7 -0
  38. package/dist/lib/browser/{react-surface-PYAMIADB.mjs → react-surface-SXMQEWKE.mjs} +22 -22
  39. package/dist/lib/browser/react-surface-SXMQEWKE.mjs.map +7 -0
  40. package/dist/lib/browser/{settings-AC6YSASL.mjs → settings-TCNF54PN.mjs} +5 -5
  41. package/dist/lib/browser/{settings-AC6YSASL.mjs.map → settings-TCNF54PN.mjs.map} +1 -1
  42. package/dist/lib/browser/{state-2T4KDWBX.mjs → state-ZQ4IPOJT.mjs} +5 -5
  43. package/dist/lib/browser/{state-2T4KDWBX.mjs.map → state-ZQ4IPOJT.mjs.map} +1 -1
  44. package/dist/lib/browser/toolkit-JF4B4QIO.mjs +84 -0
  45. package/dist/lib/browser/toolkit-JF4B4QIO.mjs.map +7 -0
  46. package/dist/lib/browser/types/index.mjs +2 -2
  47. package/dist/lib/node-esm/ChannelContainer-OXC6BTU7.mjs +17 -0
  48. package/dist/lib/node-esm/{ChatContainer-2CT4PJ7I.mjs → ChatContainer-SH6LTFQL.mjs} +6 -6
  49. package/dist/lib/node-esm/{app-graph-builder-OLSJVCWY.mjs → app-graph-builder-DMPT3MY6.mjs} +17 -17
  50. package/dist/lib/node-esm/app-graph-builder-DMPT3MY6.mjs.map +7 -0
  51. package/dist/lib/node-esm/{call-manager-EI7FXRAU.mjs → call-manager-Q7RY2YP4.mjs} +7 -7
  52. package/dist/lib/node-esm/{call-manager-EI7FXRAU.mjs.map → call-manager-Q7RY2YP4.mjs.map} +1 -1
  53. package/dist/lib/node-esm/{chunk-YIDU3DXK.mjs → chunk-2KZ4ODHU.mjs} +17 -15
  54. package/dist/lib/node-esm/chunk-2KZ4ODHU.mjs.map +7 -0
  55. package/dist/lib/node-esm/{chunk-SED3O2XO.mjs → chunk-2MMJF7DW.mjs} +37 -5
  56. package/dist/lib/node-esm/chunk-2MMJF7DW.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-QBHKLWGR.mjs → chunk-2V3WSLUZ.mjs} +54 -4
  58. package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-57XR3LEF.mjs → chunk-ABUFOZVX.mjs} +2 -2
  60. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-XVKWHTH4.mjs → chunk-BAMZXJS4.mjs} +26 -16
  62. package/dist/lib/node-esm/chunk-BAMZXJS4.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-BTGKI5IK.mjs +377 -0
  64. package/dist/lib/node-esm/chunk-BTGKI5IK.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-GZ4WL2IS.mjs +25 -0
  66. package/dist/lib/node-esm/{chunk-6CRHHOST.mjs.map → chunk-GZ4WL2IS.mjs.map} +3 -3
  67. package/dist/lib/node-esm/chunk-LCHTNRK7.mjs +19 -0
  68. package/dist/lib/node-esm/chunk-LCHTNRK7.mjs.map +7 -0
  69. package/dist/lib/node-esm/chunk-NHSIAEDW.mjs +620 -0
  70. package/dist/lib/node-esm/chunk-NHSIAEDW.mjs.map +7 -0
  71. package/dist/lib/node-esm/{chunk-GRLRWTRU.mjs → chunk-OBVAURUU.mjs} +5 -7
  72. package/dist/lib/node-esm/chunk-OBVAURUU.mjs.map +7 -0
  73. package/dist/lib/node-esm/{chunk-4TME3BR4.mjs → chunk-TIPIOH2J.mjs} +460 -268
  74. package/dist/lib/node-esm/chunk-TIPIOH2J.mjs.map +7 -0
  75. package/dist/lib/node-esm/index.mjs +22 -13
  76. package/dist/lib/node-esm/index.mjs.map +3 -3
  77. package/dist/lib/node-esm/{intent-resolver-QGTPU6QB.mjs → intent-resolver-AKVH66PH.mjs} +73 -15
  78. package/dist/lib/node-esm/intent-resolver-AKVH66PH.mjs.map +7 -0
  79. package/dist/lib/node-esm/{markdown-3MZXUGUA.mjs → markdown-MYGTDXT6.mjs} +6 -6
  80. package/dist/lib/node-esm/{markdown-3MZXUGUA.mjs.map → markdown-MYGTDXT6.mjs.map} +1 -1
  81. package/dist/lib/node-esm/meta.json +1 -1
  82. package/dist/lib/node-esm/react-root-W6AVTL5M.mjs +29 -0
  83. package/dist/lib/node-esm/react-root-W6AVTL5M.mjs.map +7 -0
  84. package/dist/lib/node-esm/{react-surface-UJFCSFNO.mjs → react-surface-NLSZJGMO.mjs} +22 -22
  85. package/dist/lib/node-esm/react-surface-NLSZJGMO.mjs.map +7 -0
  86. package/dist/lib/node-esm/{settings-N52O7MLS.mjs → settings-ZQHGVFBY.mjs} +5 -5
  87. package/dist/lib/node-esm/{settings-N52O7MLS.mjs.map → settings-ZQHGVFBY.mjs.map} +1 -1
  88. package/dist/lib/node-esm/{state-62TQKQVB.mjs → state-FSLLJ5TZ.mjs} +5 -5
  89. package/dist/lib/node-esm/{state-62TQKQVB.mjs.map → state-FSLLJ5TZ.mjs.map} +1 -1
  90. package/dist/lib/node-esm/toolkit-DHPKJITO.mjs +85 -0
  91. package/dist/lib/node-esm/toolkit-DHPKJITO.mjs.map +7 -0
  92. package/dist/lib/node-esm/types/index.mjs +2 -2
  93. package/dist/types/src/ThreadPlugin.d.ts +1 -1
  94. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  95. package/dist/types/src/calls/media-manager.d.ts +1 -1
  96. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  97. package/dist/types/src/calls/types.d.ts.map +1 -1
  98. package/dist/types/src/calls/util/calls-service.d.ts +3 -1
  99. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  100. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  101. package/dist/types/src/calls-service.stories.d.ts +10 -9
  102. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  103. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  104. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  105. package/dist/types/src/capabilities/call-manager.d.ts +1 -1
  106. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  107. package/dist/types/src/capabilities/index.d.ts +11 -10
  108. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  109. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  110. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  111. package/dist/types/src/capabilities/markdown.d.ts +1 -1
  112. package/dist/types/src/capabilities/react-root.d.ts +2 -2
  113. package/dist/types/src/capabilities/react-surface.d.ts +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/toolkit.d.ts +6 -0
  117. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -0
  118. package/dist/types/src/components/CallDebugPanel.d.ts +7 -0
  119. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
  120. package/dist/types/src/components/ChannelContainer.stories.d.ts +89 -5
  121. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  122. package/dist/types/src/components/Chat.stories.d.ts +91 -5
  123. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  124. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  125. package/dist/types/src/components/Comments.stories.d.ts +156 -4
  126. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  127. package/dist/types/src/components/CommentsThreadContainer.d.ts +2 -2
  128. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
  129. package/dist/types/src/components/Media/VideoObject.d.ts +2 -2
  130. package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
  131. package/dist/types/src/components/Media/VideoObject.stories.d.ts +18 -4
  132. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  133. package/dist/types/src/components/MessageContainer.d.ts +4 -1
  134. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  135. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  136. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +155 -3
  137. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  138. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +157 -4
  139. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  140. package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
  141. package/dist/types/src/components/ThreadSettings.d.ts +1 -1
  142. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
  143. package/dist/types/src/components/command-extension.d.ts.map +1 -1
  144. package/dist/types/src/components/testing.d.ts +1 -0
  145. package/dist/types/src/components/testing.d.ts.map +1 -1
  146. package/dist/types/src/hooks/index.d.ts +1 -0
  147. package/dist/types/src/hooks/index.d.ts.map +1 -1
  148. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
  149. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
  150. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +1 -1
  151. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  152. package/dist/types/src/meta.d.ts +1 -2
  153. package/dist/types/src/meta.d.ts.map +1 -1
  154. package/dist/types/src/translations.d.ts +3 -1
  155. package/dist/types/src/translations.d.ts.map +1 -1
  156. package/dist/types/src/types/schema.d.ts +126 -111
  157. package/dist/types/src/types/schema.d.ts.map +1 -1
  158. package/dist/types/src/types/types.d.ts +259 -174
  159. package/dist/types/src/types/types.d.ts.map +1 -1
  160. package/dist/types/tsconfig.tsbuildinfo +1 -1
  161. package/package.json +60 -58
  162. package/src/ThreadPlugin.tsx +128 -122
  163. package/src/calls/call-manager.ts +1 -1
  164. package/src/calls/media-manager.ts +58 -32
  165. package/src/calls/types.ts +7 -3
  166. package/src/calls/util/calls-service.ts +61 -11
  167. package/src/calls/util/stub-media-streams.ts +60 -3
  168. package/src/calls-service.stories.tsx +76 -63
  169. package/src/capabilities/app-graph-builder.ts +13 -10
  170. package/src/capabilities/capabilities.ts +5 -5
  171. package/src/capabilities/index.ts +1 -0
  172. package/src/capabilities/intent-resolver.ts +39 -6
  173. package/src/capabilities/react-root.tsx +2 -2
  174. package/src/capabilities/react-surface.tsx +9 -9
  175. package/src/capabilities/toolkit.ts +82 -0
  176. package/src/components/Call/Toolbar.tsx +4 -4
  177. package/src/components/CallDebugPanel.tsx +108 -49
  178. package/src/components/ChannelContainer.stories.tsx +9 -9
  179. package/src/components/ChannelContainer.tsx +1 -1
  180. package/src/components/Chat.stories.tsx +31 -29
  181. package/src/components/ChatContainer.tsx +4 -1
  182. package/src/components/Comments.stories.tsx +33 -35
  183. package/src/components/CommentsThreadContainer.tsx +8 -7
  184. package/src/components/Media/VideoObject.stories.tsx +35 -28
  185. package/src/components/MessageContainer.tsx +40 -7
  186. package/src/components/Participant/Participant.tsx +13 -7
  187. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +5 -6
  188. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +41 -40
  189. package/src/components/ThreadComplementary.tsx +36 -6
  190. package/src/components/ThreadSettings.tsx +6 -7
  191. package/src/components/command-extension.ts +4 -1
  192. package/src/components/testing.ts +22 -0
  193. package/src/hooks/index.ts +1 -0
  194. package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
  195. package/src/hooks/useVideoStreamTrack.tsx +6 -3
  196. package/src/meta.ts +3 -4
  197. package/src/testing/stories.ts +1 -1
  198. package/src/translations.ts +3 -1
  199. package/src/types/schema.ts +1 -1
  200. package/src/types/types.ts +21 -13
  201. package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
  202. package/src/util.ts +1 -1
  203. package/dist/lib/browser/ChannelContainer-O2SFQJU7.mjs +0 -16
  204. package/dist/lib/browser/ChatContainer-PVT3DUZJ.mjs +0 -15
  205. package/dist/lib/browser/app-graph-builder-AF3M7UWN.mjs.map +0 -7
  206. package/dist/lib/browser/chunk-2CWJBXBH.mjs +0 -21
  207. package/dist/lib/browser/chunk-4APCDRSH.mjs +0 -18
  208. package/dist/lib/browser/chunk-4APCDRSH.mjs.map +0 -7
  209. package/dist/lib/browser/chunk-DW7JD64V.mjs.map +0 -7
  210. package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
  211. package/dist/lib/browser/chunk-FY4ZRD5X.mjs +0 -367
  212. package/dist/lib/browser/chunk-FY4ZRD5X.mjs.map +0 -7
  213. package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
  214. package/dist/lib/browser/chunk-J3JO5NWO.mjs +0 -477
  215. package/dist/lib/browser/chunk-J3JO5NWO.mjs.map +0 -7
  216. package/dist/lib/browser/chunk-JGKMMI65.mjs.map +0 -7
  217. package/dist/lib/browser/chunk-TUFWPOVS.mjs.map +0 -7
  218. package/dist/lib/browser/chunk-X5PIP5YR.mjs.map +0 -7
  219. package/dist/lib/browser/chunk-ZJ7QBXK6.mjs.map +0 -7
  220. package/dist/lib/browser/intent-resolver-DCY4P4OX.mjs.map +0 -7
  221. package/dist/lib/browser/react-root-QXPALOUQ.mjs +0 -28
  222. package/dist/lib/browser/react-root-QXPALOUQ.mjs.map +0 -7
  223. package/dist/lib/browser/react-surface-PYAMIADB.mjs.map +0 -7
  224. package/dist/lib/node-esm/ChannelContainer-B2ZGAE4P.mjs +0 -17
  225. package/dist/lib/node-esm/app-graph-builder-OLSJVCWY.mjs.map +0 -7
  226. package/dist/lib/node-esm/chunk-4TME3BR4.mjs.map +0 -7
  227. package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
  228. package/dist/lib/node-esm/chunk-6CRHHOST.mjs +0 -23
  229. package/dist/lib/node-esm/chunk-BF4UKS55.mjs +0 -368
  230. package/dist/lib/node-esm/chunk-BF4UKS55.mjs.map +0 -7
  231. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
  232. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs +0 -19
  233. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs.map +0 -7
  234. package/dist/lib/node-esm/chunk-QBHKLWGR.mjs.map +0 -7
  235. package/dist/lib/node-esm/chunk-VNG6M2IY.mjs +0 -478
  236. package/dist/lib/node-esm/chunk-VNG6M2IY.mjs.map +0 -7
  237. package/dist/lib/node-esm/chunk-XVKWHTH4.mjs.map +0 -7
  238. package/dist/lib/node-esm/chunk-YIDU3DXK.mjs.map +0 -7
  239. package/dist/lib/node-esm/intent-resolver-QGTPU6QB.mjs.map +0 -7
  240. package/dist/lib/node-esm/react-root-7ZFJYVUZ.mjs +0 -29
  241. package/dist/lib/node-esm/react-root-7ZFJYVUZ.mjs.map +0 -7
  242. package/dist/lib/node-esm/react-surface-UJFCSFNO.mjs.map +0 -7
  243. /package/dist/lib/browser/{ChannelContainer-O2SFQJU7.mjs.map → ChannelContainer-BGDGZHV4.mjs.map} +0 -0
  244. /package/dist/lib/browser/{ChatContainer-PVT3DUZJ.mjs.map → ChatContainer-75KJZ4XR.mjs.map} +0 -0
  245. /package/dist/lib/node-esm/{ChannelContainer-B2ZGAE4P.mjs.map → ChannelContainer-OXC6BTU7.mjs.map} +0 -0
  246. /package/dist/lib/node-esm/{ChatContainer-2CT4PJ7I.mjs.map → ChatContainer-SH6LTFQL.mjs.map} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-thread",
3
- "version": "0.8.4-main.28f8d3d",
3
+ "version": "0.8.4-main.406dc2a",
4
4
  "description": "DXOS Threads Surface plugin",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -35,77 +35,79 @@
35
35
  "src"
36
36
  ],
37
37
  "dependencies": {
38
- "@codemirror/language": "^6.10.3",
39
- "@codemirror/state": "^6.4.1",
40
- "@codemirror/view": "^6.34.1",
38
+ "@codemirror/language": "^6.11.3",
39
+ "@codemirror/state": "^6.5.2",
40
+ "@codemirror/view": "^6.38.4",
41
+ "@effect/ai": "0.29.1",
42
+ "@effect/experimental": "0.56.0",
41
43
  "@peermetrics/webrtc-stats": "5.7.1",
42
44
  "@preact-signals/safe-react": "^0.9.0",
43
- "@preact/signals-core": "^1.9.0",
45
+ "@preact/signals-core": "^1.12.1",
44
46
  "date-fns": "^3.3.1",
45
47
  "extendable-media-recorder": "^9.2.19",
46
48
  "extendable-media-recorder-wav-encoder": "^7.0.123",
47
49
  "md5-hex": "5.0.0",
48
- "react-resize-detector": "^12.0.2",
50
+ "react-resize-detector": "^11.0.1",
49
51
  "wavefile": "^11.0.0",
50
- "@dxos/app-framework": "0.8.4-main.28f8d3d",
51
- "@dxos/async": "0.8.4-main.28f8d3d",
52
- "@dxos/codec-protobuf": "0.8.4-main.28f8d3d",
53
- "@dxos/debug": "0.8.4-main.28f8d3d",
54
- "@dxos/context": "0.8.4-main.28f8d3d",
55
- "@dxos/devtools": "0.8.4-main.28f8d3d",
56
- "@dxos/display-name": "0.8.4-main.28f8d3d",
57
- "@dxos/echo": "0.8.4-main.28f8d3d",
58
- "@dxos/echo-schema": "0.8.4-main.28f8d3d",
59
- "@dxos/invariant": "0.8.4-main.28f8d3d",
60
- "@dxos/keys": "0.8.4-main.28f8d3d",
61
- "@dxos/live-object": "0.8.4-main.28f8d3d",
62
- "@dxos/local-storage": "0.8.4-main.28f8d3d",
63
- "@dxos/log": "0.8.4-main.28f8d3d",
64
- "@dxos/plugin-deck": "0.8.4-main.28f8d3d",
65
- "@dxos/plugin-attention": "0.8.4-main.28f8d3d",
66
- "@dxos/plugin-graph": "0.8.4-main.28f8d3d",
67
- "@dxos/plugin-client": "0.8.4-main.28f8d3d",
68
- "@dxos/plugin-markdown": "0.8.4-main.28f8d3d",
69
- "@dxos/plugin-observability": "0.8.4-main.28f8d3d",
70
- "@dxos/plugin-space": "0.8.4-main.28f8d3d",
71
- "@dxos/protocols": "0.8.4-main.28f8d3d",
72
- "@dxos/react-client": "0.8.4-main.28f8d3d",
73
- "@dxos/react-ui-dnd": "0.8.4-main.28f8d3d",
74
- "@dxos/react-ui-attention": "0.8.4-main.28f8d3d",
75
- "@dxos/react-ui-editor": "0.8.4-main.28f8d3d",
76
- "@dxos/react-ui-form": "0.8.4-main.28f8d3d",
77
- "@dxos/react-ui-stack": "0.8.4-main.28f8d3d",
78
- "@dxos/react-ui-sfx": "0.8.4-main.28f8d3d",
79
- "@dxos/react-ui-menu": "0.8.4-main.28f8d3d",
80
- "@dxos/react-ui-syntax-highlighter": "0.8.4-main.28f8d3d",
81
- "@dxos/react-ui-tabs": "0.8.4-main.28f8d3d",
82
- "@dxos/react-ui-thread": "0.8.4-main.28f8d3d",
83
- "@dxos/schema": "0.8.4-main.28f8d3d",
84
- "@dxos/util": "0.8.4-main.28f8d3d"
52
+ "@dxos/app-framework": "0.8.4-main.406dc2a",
53
+ "@dxos/assistant": "0.8.4-main.406dc2a",
54
+ "@dxos/codec-protobuf": "0.8.4-main.406dc2a",
55
+ "@dxos/async": "0.8.4-main.406dc2a",
56
+ "@dxos/context": "0.8.4-main.406dc2a",
57
+ "@dxos/devtools": "0.8.4-main.406dc2a",
58
+ "@dxos/display-name": "0.8.4-main.406dc2a",
59
+ "@dxos/echo": "0.8.4-main.406dc2a",
60
+ "@dxos/invariant": "0.8.4-main.406dc2a",
61
+ "@dxos/keys": "0.8.4-main.406dc2a",
62
+ "@dxos/live-object": "0.8.4-main.406dc2a",
63
+ "@dxos/debug": "0.8.4-main.406dc2a",
64
+ "@dxos/local-storage": "0.8.4-main.406dc2a",
65
+ "@dxos/log": "0.8.4-main.406dc2a",
66
+ "@dxos/plugin-attention": "0.8.4-main.406dc2a",
67
+ "@dxos/plugin-client": "0.8.4-main.406dc2a",
68
+ "@dxos/plugin-deck": "0.8.4-main.406dc2a",
69
+ "@dxos/plugin-observability": "0.8.4-main.406dc2a",
70
+ "@dxos/plugin-graph": "0.8.4-main.406dc2a",
71
+ "@dxos/plugin-space": "0.8.4-main.406dc2a",
72
+ "@dxos/react-client": "0.8.4-main.406dc2a",
73
+ "@dxos/react-ui-dnd": "0.8.4-main.406dc2a",
74
+ "@dxos/react-ui-attention": "0.8.4-main.406dc2a",
75
+ "@dxos/protocols": "0.8.4-main.406dc2a",
76
+ "@dxos/react-ui-form": "0.8.4-main.406dc2a",
77
+ "@dxos/react-ui-menu": "0.8.4-main.406dc2a",
78
+ "@dxos/react-ui-sfx": "0.8.4-main.406dc2a",
79
+ "@dxos/react-ui-stack": "0.8.4-main.406dc2a",
80
+ "@dxos/react-ui-editor": "0.8.4-main.406dc2a",
81
+ "@dxos/react-ui-syntax-highlighter": "0.8.4-main.406dc2a",
82
+ "@dxos/plugin-markdown": "0.8.4-main.406dc2a",
83
+ "@dxos/react-ui-tabs": "0.8.4-main.406dc2a",
84
+ "@dxos/schema": "0.8.4-main.406dc2a",
85
+ "@dxos/react-ui-thread": "0.8.4-main.406dc2a",
86
+ "@dxos/util": "0.8.4-main.406dc2a"
85
87
  },
86
88
  "devDependencies": {
87
- "@effect-rx/rx-react": "0.38.0",
88
- "@effect/platform": "0.90.2",
89
- "@types/react": "~18.2.0",
90
- "@types/react-dom": "~18.2.0",
91
- "effect": "3.17.7",
92
- "react": "~18.2.0",
93
- "react-dom": "~18.2.0",
94
- "vite": "5.4.7",
95
- "@dxos/random": "0.8.4-main.28f8d3d",
96
- "@dxos/react-ui": "0.8.4-main.28f8d3d",
97
- "@dxos/react-ui-theme": "0.8.4-main.28f8d3d",
98
- "@dxos/storybook-utils": "0.8.4-main.28f8d3d",
99
- "@dxos/plugin-theme": "0.8.4-main.28f8d3d"
89
+ "@effect-rx/rx-react": "0.42.4",
90
+ "@effect/platform": "0.92.1",
91
+ "@types/react": "~19.2.2",
92
+ "@types/react-dom": "~19.2.1",
93
+ "effect": "3.18.3",
94
+ "react": "~19.2.0",
95
+ "react-dom": "~19.2.0",
96
+ "vite": "7.1.9",
97
+ "@dxos/random": "0.8.4-main.406dc2a",
98
+ "@dxos/plugin-theme": "0.8.4-main.406dc2a",
99
+ "@dxos/storybook-utils": "0.8.4-main.406dc2a",
100
+ "@dxos/react-ui": "0.8.4-main.406dc2a",
101
+ "@dxos/react-ui-theme": "0.8.4-main.406dc2a"
100
102
  },
101
103
  "peerDependencies": {
102
104
  "@effect-rx/rx-react": "^0.34.1",
103
105
  "@effect/platform": "^0.80.12",
104
106
  "effect": "^3.13.3",
105
- "react": "~18.2.0",
106
- "react-dom": "~18.2.0",
107
- "@dxos/react-ui": "0.8.4-main.28f8d3d",
108
- "@dxos/react-ui-theme": "0.8.4-main.28f8d3d"
107
+ "react": "^19.0.0",
108
+ "react-dom": "^19.0.0",
109
+ "@dxos/react-ui": "0.8.4-main.406dc2a",
110
+ "@dxos/react-ui-theme": "0.8.4-main.406dc2a"
109
111
  },
110
112
  "publishConfig": {
111
113
  "access": "public"
@@ -19,6 +19,7 @@ import {
19
19
  ReactRoot,
20
20
  ReactSurface,
21
21
  ThreadState,
22
+ Toolkit,
22
23
  } from './capabilities';
23
24
  import { THREAD_ITEM, meta } from './meta';
24
25
  import { translations } from './translations';
@@ -29,127 +30,132 @@ import { ChannelType, ThreadAction, ThreadType } from './types';
29
30
 
30
31
  // TODO(wittjosiah): Rename to ChatPlugin.
31
32
  // TODO(wittjosiah): Enabling comments should likely be factored out of this plugin but depend on it's capabilities.
32
- export const ThreadPlugin = () =>
33
- definePlugin(meta, [
34
- defineModule({
35
- id: `${meta.id}/module/call-manager`,
36
- activatesOn: ClientEvents.ClientReady,
37
- activate: CallManager,
38
- }),
39
- // TODO(wittjosiah): Currently not used but leaving because there will likely be settings for threads again.
40
- // defineModule({
41
- // id: `${meta.id}/module/settings`,
42
- // activatesOn: Events.SetupSettings,
43
- // activate: ThreadSettings,
44
- // }),
45
- defineModule({
46
- id: `${meta.id}/module/state`,
47
- // TODO(wittjosiah): Does not integrate with settings store.
48
- // Should this be a different event?
49
- // Should settings store be renamed to be more generic?
50
- activatesOn: Events.SetupSettings,
51
- activate: ThreadState,
52
- }),
53
- defineModule({
54
- id: `${meta.id}/module/translations`,
55
- activatesOn: Events.SetupTranslations,
56
- activate: () => contributes(Capabilities.Translations, [...translations, ...threadTranslations]),
57
- }),
58
- defineModule({
59
- id: `${meta.id}/module/metadata`,
60
- activatesOn: Events.SetupMetadata,
61
- activate: () => [
62
- contributes(Capabilities.Metadata, {
63
- id: ChannelType.typename,
64
- metadata: {
65
- icon: 'ph--hash--regular',
33
+ export const ThreadPlugin = definePlugin(meta, () => [
34
+ defineModule({
35
+ id: `${meta.id}/module/call-manager`,
36
+ activatesOn: ClientEvents.ClientReady,
37
+ activate: CallManager,
38
+ }),
39
+ // TODO(wittjosiah): Currently not used but leaving because there will likely be settings for threads again.
40
+ // defineModule({
41
+ // id: `${meta.id}/module/settings`,
42
+ // activatesOn: Events.SetupSettings,
43
+ // activate: ThreadSettings,
44
+ // }),
45
+ defineModule({
46
+ id: `${meta.id}/module/state`,
47
+ // TODO(wittjosiah): Does not integrate with settings store.
48
+ // Should this be a different event?
49
+ // Should settings store be renamed to be more generic?
50
+ activatesOn: Events.SetupSettings,
51
+ activate: ThreadState,
52
+ }),
53
+ defineModule({
54
+ id: `${meta.id}/module/translations`,
55
+ activatesOn: Events.SetupTranslations,
56
+ activate: () => contributes(Capabilities.Translations, [...translations, ...threadTranslations]),
57
+ }),
58
+ defineModule({
59
+ id: `${meta.id}/module/metadata`,
60
+ activatesOn: Events.SetupMetadata,
61
+ activate: () => [
62
+ contributes(Capabilities.Metadata, {
63
+ id: ChannelType.typename,
64
+ metadata: {
65
+ icon: 'ph--hash--regular',
66
+ },
67
+ }),
68
+ contributes(Capabilities.Metadata, {
69
+ id: ThreadType.typename,
70
+ metadata: {
71
+ // TODO(wittjosiah): Move out of metadata.
72
+ loadReferences: async (thread: ThreadType) => await Ref.Array.loadAll(thread.messages ?? []),
73
+ },
74
+ }),
75
+ contributes(Capabilities.Metadata, {
76
+ id: DataType.Message.typename,
77
+ metadata: {
78
+ // TODO(wittjosiah): Move out of metadata.
79
+ loadReferences: (message: DataType.Message) => [], // loadObjectReferences(message, (message) => [...message.parts, message.context]),
80
+ },
81
+ }),
82
+ contributes(Capabilities.Metadata, {
83
+ id: THREAD_ITEM,
84
+ metadata: {
85
+ parse: (item: ThreadType, type: string) => {
86
+ switch (type) {
87
+ case 'node':
88
+ return { id: item.id, label: item.name, data: item };
89
+ case 'object':
90
+ return item;
91
+ case 'view-object':
92
+ return { id: `${item.id}-view`, object: item };
93
+ }
66
94
  },
95
+ },
96
+ }),
97
+ ],
98
+ }),
99
+ defineModule({
100
+ id: `${meta.id}/module/object-form`,
101
+ activatesOn: ClientEvents.SetupSchema,
102
+ activate: () =>
103
+ contributes(
104
+ SpaceCapabilities.ObjectForm,
105
+ defineObjectForm({
106
+ objectSchema: ChannelType,
107
+ getIntent: (_, options) => createIntent(ThreadAction.CreateChannel, { spaceId: options.space.id }),
67
108
  }),
68
- contributes(Capabilities.Metadata, {
69
- id: ThreadType.typename,
70
- metadata: {
71
- // TODO(wittjosiah): Move out of metadata.
72
- loadReferences: async (thread: ThreadType) => await Ref.Array.loadAll(thread.messages ?? []),
73
- },
74
- }),
75
- contributes(Capabilities.Metadata, {
76
- id: DataType.Message.typename,
77
- metadata: {
78
- // TODO(wittjosiah): Move out of metadata.
79
- loadReferences: (message: DataType.Message) => [], // loadObjectReferences(message, (message) => [...message.parts, message.context]),
80
- },
81
- }),
82
- contributes(Capabilities.Metadata, {
83
- id: THREAD_ITEM,
84
- metadata: {
85
- parse: (item: ThreadType, type: string) => {
86
- switch (type) {
87
- case 'node':
88
- return { id: item.id, label: item.name, data: item };
89
- case 'object':
90
- return item;
91
- case 'view-object':
92
- return { id: `${item.id}-view`, object: item };
93
- }
94
- },
95
- },
96
- }),
97
- ],
98
- }),
99
- defineModule({
100
- id: `${meta.id}/module/object-form`,
101
- activatesOn: ClientEvents.SetupSchema,
102
- activate: () =>
103
- contributes(
104
- SpaceCapabilities.ObjectForm,
105
- defineObjectForm({
106
- objectSchema: ChannelType,
107
- getIntent: (_, options) => createIntent(ThreadAction.CreateChannel, { spaceId: options.space.id }),
108
- }),
109
- ),
110
- }),
111
- defineModule({
112
- id: `${meta.id}/module/schema`,
113
- activatesOn: ClientEvents.SetupSchema,
114
- activate: () =>
115
- contributes(ClientCapabilities.Schema, [AnchoredTo, ThreadType, DataType.Message, DataType.MessageV1]),
116
- }),
117
- defineModule({
118
- id: `${meta.id}/module/migration`,
119
- activatesOn: ClientEvents.SetupMigration,
120
- activate: () => contributes(ClientCapabilities.Migration, [DataType.MessageV1ToV2]),
121
- }),
122
- defineModule({
123
- id: `${meta.id}/module/on-space-created`,
124
- activatesOn: SpaceEvents.SpaceCreated,
125
- activate: () =>
126
- contributes(SpaceCapabilities.OnSpaceCreated, ({ space, rootCollection }) =>
127
- createIntent(ThreadAction.OnSpaceCreated, { space, rootCollection }),
128
- ),
129
- }),
130
- defineModule({
131
- id: `${meta.id}/module/markdown`,
132
- activatesOn: MarkdownEvents.SetupExtensions,
133
- activate: Markdown,
134
- }),
135
- defineModule({
136
- id: `${meta.id}/module/react-root`,
137
- activatesOn: Events.Startup,
138
- activate: ReactRoot,
139
- }),
140
- defineModule({
141
- id: `${meta.id}/module/react-surface`,
142
- activatesOn: Events.SetupReactSurface,
143
- activate: ReactSurface,
144
- }),
145
- defineModule({
146
- id: `${meta.id}/module/intent-resolver`,
147
- activatesOn: Events.SetupIntentResolver,
148
- activate: IntentResolver,
149
- }),
150
- defineModule({
151
- id: `${meta.id}/module/app-graph-builder`,
152
- activatesOn: Events.SetupAppGraph,
153
- activate: AppGraphBuilder,
154
- }),
155
- ]);
109
+ ),
110
+ }),
111
+ defineModule({
112
+ id: `${meta.id}/module/schema`,
113
+ activatesOn: ClientEvents.SetupSchema,
114
+ activate: () =>
115
+ contributes(ClientCapabilities.Schema, [AnchoredTo, ThreadType, DataType.Message, DataType.MessageV1]),
116
+ }),
117
+ defineModule({
118
+ id: `${meta.id}/module/migration`,
119
+ activatesOn: ClientEvents.SetupMigration,
120
+ activate: () => contributes(ClientCapabilities.Migration, [DataType.MessageV1ToV2]),
121
+ }),
122
+ defineModule({
123
+ id: `${meta.id}/module/on-space-created`,
124
+ activatesOn: SpaceEvents.SpaceCreated,
125
+ activate: () =>
126
+ contributes(SpaceCapabilities.onCreateSpace, ({ space, rootCollection }) =>
127
+ createIntent(ThreadAction.onCreateSpace, { space, rootCollection }),
128
+ ),
129
+ }),
130
+ defineModule({
131
+ id: `${meta.id}/module/markdown`,
132
+ activatesOn: MarkdownEvents.SetupExtensions,
133
+ activate: Markdown,
134
+ }),
135
+ defineModule({
136
+ id: `${meta.id}/module/react-root`,
137
+ activatesOn: Events.Startup,
138
+ activate: ReactRoot,
139
+ }),
140
+ defineModule({
141
+ id: `${meta.id}/module/react-surface`,
142
+ activatesOn: Events.SetupReactSurface,
143
+ activate: ReactSurface,
144
+ }),
145
+ defineModule({
146
+ id: `${meta.id}/module/intent-resolver`,
147
+ activatesOn: Events.SetupIntentResolver,
148
+ activate: IntentResolver,
149
+ }),
150
+ defineModule({
151
+ id: `${meta.id}/module/app-graph-builder`,
152
+ activatesOn: Events.SetupAppGraph,
153
+ activate: AppGraphBuilder,
154
+ }),
155
+ defineModule({
156
+ id: `${meta.id}/module/toolkit`,
157
+ // TODO(wittjosiah): Shouldn't use the startup event.
158
+ activatesOn: Events.Startup,
159
+ activate: Toolkit,
160
+ }),
161
+ ]);
@@ -210,7 +210,7 @@ export class CallManager extends Resource {
210
210
 
211
211
  private _onCallStateUpdated(state: CallState): void {
212
212
  const tracksToPull = state.users
213
- ?.filter((user) => user.joined && user.id !== state.self?.id)
213
+ ?.filter((user) => user.joined && user.id !== state.self!.id)
214
214
  ?.flatMap((user) => [user.tracks?.video, user.tracks?.audio, user.tracks?.screenshare])
215
215
  .filter(isNonNullable);
216
216
  this._mediaManager._schedulePullTracks(tracksToPull as EncodedTrackName[]);
@@ -4,6 +4,7 @@
4
4
 
5
5
  import { DeferredTask, Event, sleep, synchronized } from '@dxos/async';
6
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';
@@ -48,13 +49,13 @@ 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
 
57
- const USE_INAUDIBLE_AUDIO = false;
58
+ const USE_INAUDIBLE_AUDIO = true;
58
59
 
59
60
  export class MediaManager extends Resource {
60
61
  public readonly stateUpdated = new Event<MediaState>();
@@ -248,7 +249,7 @@ export class MediaManager extends Resource {
248
249
  });
249
250
 
250
251
  // Pull new tracks.
251
- await Promise.all(tracksToPull.map((name) => this._pullTrack(name)));
252
+ const pullResults = await Promise.all(tracksToPull.map((name) => this._pullTrack(name)));
252
253
 
253
254
  // Close old tracks.
254
255
  await Promise.all([...audioTracksToClose, ...videoStreamsToClose].map(([_, { ctx }]) => ctx.dispose()));
@@ -258,6 +259,13 @@ export class MediaManager extends Resource {
258
259
  currentVideoStreams: Object.keys(this._state.pulledVideoStreams),
259
260
  });
260
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
+ }
261
269
  }
262
270
 
263
271
  private async _pushTracks(): Promise<void> {
@@ -266,38 +274,47 @@ export class MediaManager extends Resource {
266
274
  }
267
275
 
268
276
  let updated = false;
269
- const [pushedVideoTrack, pushedAudioTrack, pushedScreenshareTrack] = await Promise.all([
270
- 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, [
271
279
  { maxFramerate: MAX_WEB_CAM_FRAMERATE, maxBitrate: MAX_WEB_CAM_BITRATE },
272
280
  ]),
273
- this._pushTrack(this._state.audioTrack, this._state.pushedAudioTrack, [{ networkPriority: 'high' }]),
274
- 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),
275
283
  ]);
276
284
 
277
- if (pushedVideoTrack !== this._state.pushedVideoTrack) {
278
- this._state.pushedVideoTrack = pushedVideoTrack;
285
+ if (pushVideoResult.track !== this._state.pushedVideoTrack) {
286
+ this._state.pushedVideoTrack = pushVideoResult.track;
279
287
  updated = true;
280
288
  }
281
- if (pushedAudioTrack !== this._state.pushedAudioTrack) {
282
- this._state.pushedAudioTrack = pushedAudioTrack;
289
+ if (pushAudioResult.track !== this._state.pushedAudioTrack) {
290
+ this._state.pushedAudioTrack = pushAudioResult.track;
283
291
  updated = true;
284
292
  }
285
- if (pushedScreenshareTrack !== this._state.pushedScreenshareTrack) {
286
- this._state.pushedScreenshareTrack = pushedScreenshareTrack;
293
+ if (pushScreenshareResult.track !== this._state.pushedScreenshareTrack) {
294
+ this._state.pushedScreenshareTrack = pushScreenshareResult.track;
287
295
  updated = true;
288
296
  }
289
- if (!updated) {
290
- return;
297
+
298
+ const shouldRetry = pushVideoResult.shouldRetry || pushAudioResult.shouldRetry || pushScreenshareResult.shouldRetry;
299
+
300
+ if (updated) {
301
+ this.stateUpdated.emit(this._state);
291
302
  }
292
303
 
293
- 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
+ }
294
310
  }
295
311
 
296
- private async _pullTrack(name: EncodedTrackName): Promise<void> {
312
+ private async _pullTrack(name: EncodedTrackName): Promise<{ shouldRetry: boolean }> {
297
313
  const ctx = this._ctx.derive();
298
314
  try {
299
315
  const trackData = TrackNameCodec.decode(name);
300
- 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 });
301
318
  if (track?.readyState === 'ended') {
302
319
  throw new Error('Pulled track ended immediately');
303
320
  }
@@ -306,7 +323,7 @@ export class MediaManager extends Resource {
306
323
  case 'audio': {
307
324
  this._state.pulledAudioTracks[name] = { track, ctx };
308
325
  ctx.onDispose(() => delete this._state.pulledAudioTracks[name]);
309
- break;
326
+ return { shouldRetry: false };
310
327
  }
311
328
  case 'video': {
312
329
  const mediaStream = new MediaStream();
@@ -317,33 +334,42 @@ export class MediaManager extends Resource {
317
334
  track.stop();
318
335
  delete this._state.pulledVideoStreams[name];
319
336
  });
320
- break;
337
+ return { shouldRetry: false };
321
338
  }
322
339
  default:
323
340
  throw new Error(`Invalid track kind: ${track?.kind}`);
324
341
  }
325
342
  } catch (err) {
326
- log.verbose('failed to pull track', { err, name });
343
+ log.info('failed to pull track', { err, name });
327
344
  void ctx.dispose();
328
- await cancelWithContext(this._ctx, sleep(RETRY_INTERVAL));
329
- log.verbose('retrying pull track', { name });
330
- this._pullTracksTask!.schedule();
345
+ return { shouldRetry: true };
331
346
  }
332
347
  }
333
348
 
334
- private async _pushTrack(
349
+ private async _maybePushTrack(
335
350
  track?: MediaStreamTrack,
336
351
  previousTrack?: TrackObject,
337
352
  encodings?: RTCRtpEncodingParameters[],
338
- ): Promise<TrackObject | undefined> {
353
+ ): Promise<{ track?: TrackObject; shouldRetry?: boolean }> {
339
354
  if (!track && !previousTrack) {
340
- return;
355
+ return { track: undefined };
341
356
  }
342
357
 
343
- return this._state.peer!.pushTrack({
344
- track: track ?? null,
345
- previousTrack,
346
- encodings,
347
- });
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
+ }
348
374
  }
349
375
  }
@@ -2,6 +2,7 @@
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,
@@ -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
  };