@dxos/plugin-thread 0.8.4-main.5ea62a8 → 0.8.4-main.ae835ea

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 (244) hide show
  1. package/dist/lib/browser/ChannelContainer-SVV4ZX5T.mjs +16 -0
  2. package/dist/lib/browser/ChatContainer-ALFWQ65B.mjs +15 -0
  3. package/dist/lib/browser/{app-graph-builder-FHAOPO57.mjs → app-graph-builder-ACBXRBOS.mjs} +20 -20
  4. package/dist/lib/browser/app-graph-builder-ACBXRBOS.mjs.map +7 -0
  5. package/dist/lib/browser/{call-manager-EW2QC6Q4.mjs → call-manager-P3MYR2JS.mjs} +7 -7
  6. package/dist/lib/browser/{call-manager-EW2QC6Q4.mjs.map → call-manager-P3MYR2JS.mjs.map} +1 -1
  7. package/dist/lib/browser/{chunk-H63NDV62.mjs → chunk-6CUDBEYP.mjs} +12 -11
  8. package/dist/lib/browser/chunk-6CUDBEYP.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-BBTXGRIR.mjs +18 -0
  10. package/dist/lib/browser/chunk-BBTXGRIR.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-GERVMFQW.mjs → chunk-CP7E2HRE.mjs} +2 -2
  12. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-TQJYDFBU.mjs → chunk-DJOUMWEL.mjs} +20 -18
  14. package/dist/lib/browser/chunk-DJOUMWEL.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-2P3GVRHP.mjs → chunk-HDEQRBOC.mjs} +2 -2
  16. package/dist/lib/browser/{chunk-2P3GVRHP.mjs.map → chunk-HDEQRBOC.mjs.map} +2 -2
  17. package/dist/lib/browser/{chunk-J26C57ZY.mjs → chunk-IQSXEHOW.mjs} +139 -69
  18. package/dist/lib/browser/chunk-IQSXEHOW.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-K2DUJRFJ.mjs +27 -0
  20. package/dist/lib/browser/chunk-K2DUJRFJ.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-L6F2AG6W.mjs +23 -0
  22. package/dist/lib/browser/{chunk-TUSBPMNU.mjs → chunk-US5ZQYC3.mjs} +267 -367
  23. package/dist/lib/browser/chunk-US5ZQYC3.mjs.map +7 -0
  24. package/dist/lib/browser/chunk-UTSLSZED.mjs +178 -0
  25. package/dist/lib/browser/chunk-UTSLSZED.mjs.map +7 -0
  26. package/dist/lib/browser/{chunk-KEXJGF2R.mjs → chunk-XYUJXHYV.mjs} +53 -3
  27. package/dist/lib/browser/chunk-XYUJXHYV.mjs.map +7 -0
  28. package/dist/lib/browser/index.mjs +23 -22
  29. package/dist/lib/browser/index.mjs.map +3 -3
  30. package/dist/lib/browser/{intent-resolver-IB5GYU2D.mjs → intent-resolver-5POQTZ24.mjs} +25 -34
  31. package/dist/lib/browser/intent-resolver-5POQTZ24.mjs.map +7 -0
  32. package/dist/lib/browser/{markdown-Z677YORA.mjs → markdown-L7LDNF56.mjs} +9 -9
  33. package/dist/lib/browser/markdown-L7LDNF56.mjs.map +7 -0
  34. package/dist/lib/browser/meta.json +1 -1
  35. package/dist/lib/browser/react-root-RCJLK4EP.mjs +28 -0
  36. package/dist/lib/browser/react-root-RCJLK4EP.mjs.map +7 -0
  37. package/dist/lib/browser/{react-surface-X2VB6P37.mjs → react-surface-IC576W2W.mjs} +27 -27
  38. package/dist/lib/browser/react-surface-IC576W2W.mjs.map +7 -0
  39. package/dist/lib/browser/{settings-GRKEID73.mjs → settings-5FYGBOGI.mjs} +5 -5
  40. package/dist/lib/browser/{settings-GRKEID73.mjs.map → settings-5FYGBOGI.mjs.map} +1 -1
  41. package/dist/lib/browser/{state-2T4KDWBX.mjs → state-36REWXO5.mjs} +5 -5
  42. package/dist/lib/browser/{state-2T4KDWBX.mjs.map → state-36REWXO5.mjs.map} +1 -1
  43. package/dist/lib/browser/toolkit-PXASLYEQ.mjs +74 -0
  44. package/dist/lib/browser/toolkit-PXASLYEQ.mjs.map +7 -0
  45. package/dist/lib/browser/types/index.mjs +7 -9
  46. package/dist/lib/node-esm/ChannelContainer-63GMQ753.mjs +17 -0
  47. package/dist/lib/node-esm/{ChatContainer-4EGHKHIU.mjs → ChatContainer-MFKPXMIK.mjs} +6 -6
  48. package/dist/lib/node-esm/{app-graph-builder-XEYWX5FC.mjs → app-graph-builder-JXD7KY3G.mjs} +20 -20
  49. package/dist/lib/node-esm/app-graph-builder-JXD7KY3G.mjs.map +7 -0
  50. package/dist/lib/node-esm/{call-manager-N3KASRDQ.mjs → call-manager-FCEFP7EJ.mjs} +7 -7
  51. package/dist/lib/node-esm/{call-manager-N3KASRDQ.mjs.map → call-manager-FCEFP7EJ.mjs.map} +1 -1
  52. package/dist/lib/node-esm/{chunk-CTZ75IFK.mjs → chunk-2MMJF7DW.mjs} +2 -2
  53. package/dist/lib/node-esm/{chunk-CTZ75IFK.mjs.map → chunk-2MMJF7DW.mjs.map} +2 -2
  54. package/dist/lib/node-esm/{chunk-S3D7DTBF.mjs → chunk-2V3WSLUZ.mjs} +53 -3
  55. package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs.map +7 -0
  56. package/dist/lib/node-esm/{chunk-57XR3LEF.mjs → chunk-ABUFOZVX.mjs} +2 -2
  57. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +7 -0
  58. package/dist/lib/node-esm/chunk-AFDO2SUZ.mjs +25 -0
  59. package/dist/lib/node-esm/{chunk-JR7KESLL.mjs → chunk-KGYDYYKJ.mjs} +267 -367
  60. package/dist/lib/node-esm/chunk-KGYDYYKJ.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-UHZQTPXU.mjs → chunk-NWUUMKVQ.mjs} +12 -11
  62. package/dist/lib/node-esm/chunk-NWUUMKVQ.mjs.map +7 -0
  63. package/dist/lib/node-esm/{chunk-NNKKNW57.mjs → chunk-Q7AKKZNY.mjs} +139 -69
  64. package/dist/lib/node-esm/chunk-Q7AKKZNY.mjs.map +7 -0
  65. package/dist/lib/node-esm/{chunk-CCE5LHBE.mjs → chunk-QCQAAU6J.mjs} +20 -18
  66. package/dist/lib/node-esm/chunk-QCQAAU6J.mjs.map +7 -0
  67. package/dist/lib/node-esm/chunk-TYLLHI46.mjs +179 -0
  68. package/dist/lib/node-esm/chunk-TYLLHI46.mjs.map +7 -0
  69. package/dist/lib/node-esm/chunk-XI45H4IV.mjs +28 -0
  70. package/dist/lib/node-esm/chunk-XI45H4IV.mjs.map +7 -0
  71. package/dist/lib/node-esm/chunk-ZQAGII7M.mjs +19 -0
  72. package/dist/lib/node-esm/chunk-ZQAGII7M.mjs.map +7 -0
  73. package/dist/lib/node-esm/index.mjs +23 -22
  74. package/dist/lib/node-esm/index.mjs.map +3 -3
  75. package/dist/lib/node-esm/{intent-resolver-VIMI5VLH.mjs → intent-resolver-63NV3XD2.mjs} +25 -34
  76. package/dist/lib/node-esm/intent-resolver-63NV3XD2.mjs.map +7 -0
  77. package/dist/lib/node-esm/{markdown-FL4IXLRP.mjs → markdown-ZQW7MI5U.mjs} +9 -9
  78. package/dist/lib/node-esm/markdown-ZQW7MI5U.mjs.map +7 -0
  79. package/dist/lib/node-esm/meta.json +1 -1
  80. package/dist/lib/node-esm/react-root-4IDB2SN2.mjs +29 -0
  81. package/dist/lib/node-esm/react-root-4IDB2SN2.mjs.map +7 -0
  82. package/dist/lib/node-esm/{react-surface-OLN3XNND.mjs → react-surface-O4LGTAZ3.mjs} +27 -27
  83. package/dist/lib/node-esm/react-surface-O4LGTAZ3.mjs.map +7 -0
  84. package/dist/lib/node-esm/{settings-F2ODVNNW.mjs → settings-EOBQUZSW.mjs} +5 -5
  85. package/dist/lib/node-esm/{settings-F2ODVNNW.mjs.map → settings-EOBQUZSW.mjs.map} +1 -1
  86. package/dist/lib/node-esm/{state-62TQKQVB.mjs → state-X3W67GTL.mjs} +5 -5
  87. package/dist/lib/node-esm/{state-62TQKQVB.mjs.map → state-X3W67GTL.mjs.map} +1 -1
  88. package/dist/lib/node-esm/toolkit-X2KA4FNC.mjs +75 -0
  89. package/dist/lib/node-esm/toolkit-X2KA4FNC.mjs.map +7 -0
  90. package/dist/lib/node-esm/types/index.mjs +7 -9
  91. package/dist/types/src/ThreadPlugin.d.ts +1 -1
  92. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  93. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  94. package/dist/types/src/calls/types.d.ts.map +1 -1
  95. package/dist/types/src/calls/util/calls-service.d.ts +2 -0
  96. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  97. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  98. package/dist/types/src/calls-service.stories.d.ts +0 -1
  99. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  100. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  101. package/dist/types/src/capabilities/capabilities.d.ts +2 -2
  102. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  103. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  104. package/dist/types/src/capabilities/toolkit.d.ts +21 -2
  105. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -1
  106. package/dist/types/src/components/Call/Toolbar.d.ts +2 -2
  107. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  108. package/dist/types/src/components/CallDebugPanel.d.ts +7 -0
  109. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
  110. package/dist/types/src/components/ChannelContainer.d.ts +2 -2
  111. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
  112. package/dist/types/src/components/ChannelContainer.stories.d.ts +74 -8
  113. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  114. package/dist/types/src/components/Chat.stories.d.ts +74 -6
  115. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  116. package/dist/types/src/components/ChatContainer.d.ts +6 -5
  117. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  118. package/dist/types/src/components/Comments.stories.d.ts +3 -2
  119. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  120. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
  121. package/dist/types/src/components/Media/VideoObject.d.ts +2 -2
  122. package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
  123. package/dist/types/src/components/Media/VideoObject.stories.d.ts +5 -3
  124. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  125. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +4 -2
  126. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  127. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +4 -2
  128. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  129. package/dist/types/src/components/ThreadSettings.d.ts +1 -1
  130. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
  131. package/dist/types/src/components/index.d.ts +1 -1
  132. package/dist/types/src/components/index.d.ts.map +1 -1
  133. package/dist/types/src/components/testing.d.ts +3 -3
  134. package/dist/types/src/components/testing.d.ts.map +1 -1
  135. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  136. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +1 -1
  137. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  138. package/dist/types/src/meta.d.ts +1 -2
  139. package/dist/types/src/meta.d.ts.map +1 -1
  140. package/dist/types/src/testing/stories.d.ts.map +1 -1
  141. package/dist/types/src/translations.d.ts +73 -6
  142. package/dist/types/src/translations.d.ts.map +1 -1
  143. package/dist/types/src/types/Channel.d.ts +16 -0
  144. package/dist/types/src/types/Channel.d.ts.map +1 -0
  145. package/dist/types/src/types/{schema.d.ts → Thread.d.ts} +18 -28
  146. package/dist/types/src/types/Thread.d.ts.map +1 -0
  147. package/dist/types/src/types/index.d.ts +2 -1
  148. package/dist/types/src/types/index.d.ts.map +1 -1
  149. package/dist/types/src/types/types.d.ts +37 -50
  150. package/dist/types/src/types/types.d.ts.map +1 -1
  151. package/dist/types/tsconfig.tsbuildinfo +1 -1
  152. package/package.json +59 -59
  153. package/src/ThreadPlugin.tsx +133 -130
  154. package/src/calls/call-manager.ts +1 -1
  155. package/src/calls/media-manager.ts +2 -1
  156. package/src/calls/types.ts +7 -3
  157. package/src/calls/util/calls-service.ts +12 -7
  158. package/src/calls/util/stub-media-streams.ts +60 -2
  159. package/src/calls-service.stories.tsx +2 -5
  160. package/src/capabilities/app-graph-builder.ts +17 -14
  161. package/src/capabilities/capabilities.ts +7 -7
  162. package/src/capabilities/intent-resolver.ts +14 -19
  163. package/src/capabilities/react-root.tsx +2 -2
  164. package/src/capabilities/react-surface.tsx +15 -15
  165. package/src/capabilities/toolkit.ts +18 -11
  166. package/src/components/Call/Toolbar.tsx +6 -6
  167. package/src/components/CallDebugPanel.tsx +108 -49
  168. package/src/components/ChannelContainer.stories.tsx +9 -9
  169. package/src/components/ChannelContainer.tsx +14 -11
  170. package/src/components/Chat.stories.tsx +13 -18
  171. package/src/components/ChatContainer.tsx +26 -17
  172. package/src/components/Comments.stories.tsx +8 -13
  173. package/src/components/CommentsContainer.tsx +2 -2
  174. package/src/components/CommentsThreadContainer.tsx +19 -14
  175. package/src/components/Media/VideoObject.stories.tsx +12 -7
  176. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +3 -4
  177. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +3 -4
  178. package/src/components/ThreadComplementary.tsx +7 -7
  179. package/src/components/ThreadSettings.tsx +4 -5
  180. package/src/components/testing.ts +5 -5
  181. package/src/extensions/threads.ts +5 -5
  182. package/src/hooks/useVideoStreamTrack.tsx +1 -1
  183. package/src/meta.ts +9 -5
  184. package/src/testing/stories.ts +3 -6
  185. package/src/translations.ts +5 -3
  186. package/src/types/Channel.ts +27 -0
  187. package/src/types/Thread.ts +26 -0
  188. package/src/types/index.ts +2 -1
  189. package/src/types/types.ts +10 -9
  190. package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
  191. package/src/util.ts +1 -1
  192. package/dist/lib/browser/ChannelContainer-GHDNEZT2.mjs +0 -16
  193. package/dist/lib/browser/ChatContainer-42ALOWUA.mjs +0 -15
  194. package/dist/lib/browser/app-graph-builder-FHAOPO57.mjs.map +0 -7
  195. package/dist/lib/browser/chunk-2I277V52.mjs +0 -23
  196. package/dist/lib/browser/chunk-4APCDRSH.mjs +0 -18
  197. package/dist/lib/browser/chunk-4APCDRSH.mjs.map +0 -7
  198. package/dist/lib/browser/chunk-EV4JWI7L.mjs +0 -17
  199. package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
  200. package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
  201. package/dist/lib/browser/chunk-H63NDV62.mjs.map +0 -7
  202. package/dist/lib/browser/chunk-J26C57ZY.mjs.map +0 -7
  203. package/dist/lib/browser/chunk-KEXJGF2R.mjs.map +0 -7
  204. package/dist/lib/browser/chunk-KTWYVC5X.mjs +0 -147
  205. package/dist/lib/browser/chunk-KTWYVC5X.mjs.map +0 -7
  206. package/dist/lib/browser/chunk-TQJYDFBU.mjs.map +0 -7
  207. package/dist/lib/browser/chunk-TUSBPMNU.mjs.map +0 -7
  208. package/dist/lib/browser/intent-resolver-IB5GYU2D.mjs.map +0 -7
  209. package/dist/lib/browser/markdown-Z677YORA.mjs.map +0 -7
  210. package/dist/lib/browser/react-root-PTTTW2MO.mjs +0 -28
  211. package/dist/lib/browser/react-root-PTTTW2MO.mjs.map +0 -7
  212. package/dist/lib/browser/react-surface-X2VB6P37.mjs.map +0 -7
  213. package/dist/lib/browser/toolkit-KUPIIFC6.mjs +0 -80
  214. package/dist/lib/browser/toolkit-KUPIIFC6.mjs.map +0 -7
  215. package/dist/lib/node-esm/ChannelContainer-D5E2S6AI.mjs +0 -17
  216. package/dist/lib/node-esm/app-graph-builder-XEYWX5FC.mjs.map +0 -7
  217. package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
  218. package/dist/lib/node-esm/chunk-CCE5LHBE.mjs.map +0 -7
  219. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs +0 -19
  220. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
  221. package/dist/lib/node-esm/chunk-JR7KESLL.mjs.map +0 -7
  222. package/dist/lib/node-esm/chunk-NNKKNW57.mjs.map +0 -7
  223. package/dist/lib/node-esm/chunk-P6E247RF.mjs +0 -148
  224. package/dist/lib/node-esm/chunk-P6E247RF.mjs.map +0 -7
  225. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs +0 -19
  226. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs.map +0 -7
  227. package/dist/lib/node-esm/chunk-S3D7DTBF.mjs.map +0 -7
  228. package/dist/lib/node-esm/chunk-UHZQTPXU.mjs.map +0 -7
  229. package/dist/lib/node-esm/chunk-UJ2QNRLS.mjs +0 -25
  230. package/dist/lib/node-esm/intent-resolver-VIMI5VLH.mjs.map +0 -7
  231. package/dist/lib/node-esm/markdown-FL4IXLRP.mjs.map +0 -7
  232. package/dist/lib/node-esm/react-root-2HHRRUME.mjs +0 -29
  233. package/dist/lib/node-esm/react-root-2HHRRUME.mjs.map +0 -7
  234. package/dist/lib/node-esm/react-surface-OLN3XNND.mjs.map +0 -7
  235. package/dist/lib/node-esm/toolkit-KZIS7G36.mjs +0 -81
  236. package/dist/lib/node-esm/toolkit-KZIS7G36.mjs.map +0 -7
  237. package/dist/types/src/types/schema.d.ts.map +0 -1
  238. package/src/types/schema.ts +0 -33
  239. /package/dist/lib/browser/{ChannelContainer-GHDNEZT2.mjs.map → ChannelContainer-SVV4ZX5T.mjs.map} +0 -0
  240. /package/dist/lib/browser/{ChatContainer-42ALOWUA.mjs.map → ChatContainer-ALFWQ65B.mjs.map} +0 -0
  241. /package/dist/lib/browser/{chunk-2I277V52.mjs.map → chunk-L6F2AG6W.mjs.map} +0 -0
  242. /package/dist/lib/node-esm/{ChannelContainer-D5E2S6AI.mjs.map → ChannelContainer-63GMQ753.mjs.map} +0 -0
  243. /package/dist/lib/node-esm/{ChatContainer-4EGHKHIU.mjs.map → ChatContainer-MFKPXMIK.mjs.map} +0 -0
  244. /package/dist/lib/node-esm/{chunk-UJ2QNRLS.mjs.map → chunk-AFDO2SUZ.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.5ea62a8",
3
+ "version": "0.8.4-main.ae835ea",
4
4
  "description": "DXOS Threads Surface plugin",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -35,79 +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",
41
- "@effect/ai": "0.25.2",
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",
42
43
  "@peermetrics/webrtc-stats": "5.7.1",
43
44
  "@preact-signals/safe-react": "^0.9.0",
44
- "@preact/signals-core": "^1.9.0",
45
+ "@preact/signals-core": "^1.12.1",
45
46
  "date-fns": "^3.3.1",
46
47
  "extendable-media-recorder": "^9.2.19",
47
48
  "extendable-media-recorder-wav-encoder": "^7.0.123",
48
49
  "md5-hex": "5.0.0",
49
50
  "react-resize-detector": "^11.0.1",
50
51
  "wavefile": "^11.0.0",
51
- "@dxos/app-framework": "0.8.4-main.5ea62a8",
52
- "@dxos/assistant": "0.8.4-main.5ea62a8",
53
- "@dxos/async": "0.8.4-main.5ea62a8",
54
- "@dxos/debug": "0.8.4-main.5ea62a8",
55
- "@dxos/devtools": "0.8.4-main.5ea62a8",
56
- "@dxos/codec-protobuf": "0.8.4-main.5ea62a8",
57
- "@dxos/display-name": "0.8.4-main.5ea62a8",
58
- "@dxos/echo": "0.8.4-main.5ea62a8",
59
- "@dxos/echo-schema": "0.8.4-main.5ea62a8",
60
- "@dxos/invariant": "0.8.4-main.5ea62a8",
61
- "@dxos/keys": "0.8.4-main.5ea62a8",
62
- "@dxos/live-object": "0.8.4-main.5ea62a8",
63
- "@dxos/context": "0.8.4-main.5ea62a8",
64
- "@dxos/log": "0.8.4-main.5ea62a8",
65
- "@dxos/local-storage": "0.8.4-main.5ea62a8",
66
- "@dxos/plugin-attention": "0.8.4-main.5ea62a8",
67
- "@dxos/plugin-deck": "0.8.4-main.5ea62a8",
68
- "@dxos/plugin-graph": "0.8.4-main.5ea62a8",
69
- "@dxos/plugin-markdown": "0.8.4-main.5ea62a8",
70
- "@dxos/plugin-observability": "0.8.4-main.5ea62a8",
71
- "@dxos/plugin-client": "0.8.4-main.5ea62a8",
72
- "@dxos/plugin-space": "0.8.4-main.5ea62a8",
73
- "@dxos/protocols": "0.8.4-main.5ea62a8",
74
- "@dxos/react-client": "0.8.4-main.5ea62a8",
75
- "@dxos/react-ui-dnd": "0.8.4-main.5ea62a8",
76
- "@dxos/react-ui-editor": "0.8.4-main.5ea62a8",
77
- "@dxos/react-ui-form": "0.8.4-main.5ea62a8",
78
- "@dxos/react-ui-attention": "0.8.4-main.5ea62a8",
79
- "@dxos/react-ui-menu": "0.8.4-main.5ea62a8",
80
- "@dxos/react-ui-stack": "0.8.4-main.5ea62a8",
81
- "@dxos/react-ui-sfx": "0.8.4-main.5ea62a8",
82
- "@dxos/react-ui-syntax-highlighter": "0.8.4-main.5ea62a8",
83
- "@dxos/react-ui-tabs": "0.8.4-main.5ea62a8",
84
- "@dxos/schema": "0.8.4-main.5ea62a8",
85
- "@dxos/util": "0.8.4-main.5ea62a8",
86
- "@dxos/react-ui-thread": "0.8.4-main.5ea62a8"
52
+ "@dxos/app-framework": "0.8.4-main.ae835ea",
53
+ "@dxos/assistant": "0.8.4-main.ae835ea",
54
+ "@dxos/async": "0.8.4-main.ae835ea",
55
+ "@dxos/codec-protobuf": "0.8.4-main.ae835ea",
56
+ "@dxos/debug": "0.8.4-main.ae835ea",
57
+ "@dxos/context": "0.8.4-main.ae835ea",
58
+ "@dxos/devtools": "0.8.4-main.ae835ea",
59
+ "@dxos/display-name": "0.8.4-main.ae835ea",
60
+ "@dxos/invariant": "0.8.4-main.ae835ea",
61
+ "@dxos/keys": "0.8.4-main.ae835ea",
62
+ "@dxos/echo": "0.8.4-main.ae835ea",
63
+ "@dxos/local-storage": "0.8.4-main.ae835ea",
64
+ "@dxos/live-object": "0.8.4-main.ae835ea",
65
+ "@dxos/log": "0.8.4-main.ae835ea",
66
+ "@dxos/plugin-attention": "0.8.4-main.ae835ea",
67
+ "@dxos/plugin-deck": "0.8.4-main.ae835ea",
68
+ "@dxos/plugin-client": "0.8.4-main.ae835ea",
69
+ "@dxos/plugin-graph": "0.8.4-main.ae835ea",
70
+ "@dxos/plugin-markdown": "0.8.4-main.ae835ea",
71
+ "@dxos/plugin-observability": "0.8.4-main.ae835ea",
72
+ "@dxos/plugin-space": "0.8.4-main.ae835ea",
73
+ "@dxos/protocols": "0.8.4-main.ae835ea",
74
+ "@dxos/react-client": "0.8.4-main.ae835ea",
75
+ "@dxos/react-ui-attention": "0.8.4-main.ae835ea",
76
+ "@dxos/react-ui-editor": "0.8.4-main.ae835ea",
77
+ "@dxos/react-ui-form": "0.8.4-main.ae835ea",
78
+ "@dxos/react-ui-dnd": "0.8.4-main.ae835ea",
79
+ "@dxos/react-ui-menu": "0.8.4-main.ae835ea",
80
+ "@dxos/react-ui-sfx": "0.8.4-main.ae835ea",
81
+ "@dxos/react-ui-stack": "0.8.4-main.ae835ea",
82
+ "@dxos/react-ui-syntax-highlighter": "0.8.4-main.ae835ea",
83
+ "@dxos/react-ui-thread": "0.8.4-main.ae835ea",
84
+ "@dxos/react-ui-tabs": "0.8.4-main.ae835ea",
85
+ "@dxos/schema": "0.8.4-main.ae835ea",
86
+ "@dxos/util": "0.8.4-main.ae835ea"
87
87
  },
88
88
  "devDependencies": {
89
- "@effect-rx/rx-react": "0.38.0",
90
- "@effect/platform": "0.90.2",
91
- "@types/react": "~18.2.0",
92
- "@types/react-dom": "~18.2.0",
93
- "effect": "3.17.7",
94
- "react": "~18.2.0",
95
- "react-dom": "~18.2.0",
96
- "vite": "7.1.1",
97
- "@dxos/plugin-theme": "0.8.4-main.5ea62a8",
98
- "@dxos/random": "0.8.4-main.5ea62a8",
99
- "@dxos/react-ui": "0.8.4-main.5ea62a8",
100
- "@dxos/react-ui-theme": "0.8.4-main.5ea62a8",
101
- "@dxos/storybook-utils": "0.8.4-main.5ea62a8"
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.2",
93
+ "effect": "3.18.3",
94
+ "react": "~19.2.0",
95
+ "react-dom": "~19.2.0",
96
+ "vite": "7.1.9",
97
+ "@dxos/plugin-theme": "0.8.4-main.ae835ea",
98
+ "@dxos/random": "0.8.4-main.ae835ea",
99
+ "@dxos/react-ui": "0.8.4-main.ae835ea",
100
+ "@dxos/react-ui-theme": "0.8.4-main.ae835ea",
101
+ "@dxos/storybook-utils": "0.8.4-main.ae835ea"
102
102
  },
103
103
  "peerDependencies": {
104
104
  "@effect-rx/rx-react": "^0.34.1",
105
105
  "@effect/platform": "^0.80.12",
106
106
  "effect": "^3.13.3",
107
- "react": "~18.2.0",
108
- "react-dom": "~18.2.0",
109
- "@dxos/react-ui": "0.8.4-main.5ea62a8",
110
- "@dxos/react-ui-theme": "0.8.4-main.5ea62a8"
107
+ "react": "^19.0.0",
108
+ "react-dom": "^19.0.0",
109
+ "@dxos/react-ui": "0.8.4-main.ae835ea",
110
+ "@dxos/react-ui-theme": "0.8.4-main.ae835ea"
111
111
  },
112
112
  "publishConfig": {
113
113
  "access": "public"
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { Capabilities, Events, contributes, createIntent, defineModule, definePlugin } from '@dxos/app-framework';
6
- import { Ref } from '@dxos/echo';
6
+ import { Ref, Type } from '@dxos/echo';
7
7
  import { ClientCapabilities, ClientEvents } from '@dxos/plugin-client';
8
8
  import { MarkdownEvents } from '@dxos/plugin-markdown';
9
9
  import { SpaceCapabilities, SpaceEvents } from '@dxos/plugin-space';
@@ -23,140 +23,143 @@ import {
23
23
  } from './capabilities';
24
24
  import { THREAD_ITEM, meta } from './meta';
25
25
  import { translations } from './translations';
26
- import { ChannelType, ThreadAction, ThreadType } from './types';
26
+ import { Channel, Thread, ThreadAction } from './types';
27
27
 
28
28
  // TODO(Zan): Every instance of `cursor` should be replaced with `anchor`.
29
29
  // NOTE(burdon): Review/discuss CursorConverter semantics.
30
30
 
31
31
  // TODO(wittjosiah): Rename to ChatPlugin.
32
32
  // TODO(wittjosiah): Enabling comments should likely be factored out of this plugin but depend on it's capabilities.
33
- export const ThreadPlugin = () =>
34
- definePlugin(meta, [
35
- defineModule({
36
- id: `${meta.id}/module/call-manager`,
37
- activatesOn: ClientEvents.ClientReady,
38
- activate: CallManager,
39
- }),
40
- // TODO(wittjosiah): Currently not used but leaving because there will likely be settings for threads again.
41
- // defineModule({
42
- // id: `${meta.id}/module/settings`,
43
- // activatesOn: Events.SetupSettings,
44
- // activate: ThreadSettings,
45
- // }),
46
- defineModule({
47
- id: `${meta.id}/module/state`,
48
- // TODO(wittjosiah): Does not integrate with settings store.
49
- // Should this be a different event?
50
- // Should settings store be renamed to be more generic?
51
- activatesOn: Events.SetupSettings,
52
- activate: ThreadState,
53
- }),
54
- defineModule({
55
- id: `${meta.id}/module/translations`,
56
- activatesOn: Events.SetupTranslations,
57
- activate: () => contributes(Capabilities.Translations, [...translations, ...threadTranslations]),
58
- }),
59
- defineModule({
60
- id: `${meta.id}/module/metadata`,
61
- activatesOn: Events.SetupMetadata,
62
- activate: () => [
63
- contributes(Capabilities.Metadata, {
64
- id: ChannelType.typename,
65
- metadata: {
66
- 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: Type.getTypename(Channel.Channel),
64
+ metadata: {
65
+ icon: 'ph--hash--regular',
66
+ iconHue: 'rose',
67
+ },
68
+ }),
69
+ contributes(Capabilities.Metadata, {
70
+ id: Type.getTypename(Thread.Thread),
71
+ metadata: {
72
+ // TODO(wittjosiah): Move out of metadata.
73
+ loadReferences: async (thread: Thread.Thread) => await Ref.Array.loadAll(thread.messages ?? []),
74
+ },
75
+ }),
76
+ contributes(Capabilities.Metadata, {
77
+ id: DataType.Message.typename,
78
+ metadata: {
79
+ // TODO(wittjosiah): Move out of metadata.
80
+ loadReferences: () => [], // loadObjectReferences(message, (message) => [...message.parts, message.context]),
81
+ },
82
+ }),
83
+ contributes(Capabilities.Metadata, {
84
+ id: THREAD_ITEM,
85
+ metadata: {
86
+ parse: (item: Thread.Thread, type: string) => {
87
+ switch (type) {
88
+ case 'node':
89
+ return { id: item.id, label: item.name, data: item };
90
+ case 'object':
91
+ return item;
92
+ case 'view-object':
93
+ return { id: `${item.id}-view`, object: item };
94
+ }
67
95
  },
96
+ },
97
+ }),
98
+ ],
99
+ }),
100
+ defineModule({
101
+ id: `${meta.id}/module/object-form`,
102
+ activatesOn: ClientEvents.SetupSchema,
103
+ activate: () =>
104
+ contributes(
105
+ SpaceCapabilities.ObjectForm,
106
+ defineObjectForm({
107
+ objectSchema: Channel.Channel,
108
+ getIntent: (_, options) =>
109
+ createIntent(ThreadAction.CreateChannel, {
110
+ spaceId: options.space.id,
111
+ }),
68
112
  }),
69
- contributes(Capabilities.Metadata, {
70
- id: ThreadType.typename,
71
- metadata: {
72
- // TODO(wittjosiah): Move out of metadata.
73
- loadReferences: async (thread: ThreadType) => await Ref.Array.loadAll(thread.messages ?? []),
74
- },
75
- }),
76
- contributes(Capabilities.Metadata, {
77
- id: DataType.Message.typename,
78
- metadata: {
79
- // TODO(wittjosiah): Move out of metadata.
80
- loadReferences: (message: DataType.Message) => [], // loadObjectReferences(message, (message) => [...message.parts, message.context]),
81
- },
82
- }),
83
- contributes(Capabilities.Metadata, {
84
- id: THREAD_ITEM,
85
- metadata: {
86
- parse: (item: ThreadType, type: string) => {
87
- switch (type) {
88
- case 'node':
89
- return { id: item.id, label: item.name, data: item };
90
- case 'object':
91
- return item;
92
- case 'view-object':
93
- return { id: `${item.id}-view`, object: item };
94
- }
95
- },
96
- },
97
- }),
98
- ],
99
- }),
100
- defineModule({
101
- id: `${meta.id}/module/object-form`,
102
- activatesOn: ClientEvents.SetupSchema,
103
- activate: () =>
104
- contributes(
105
- SpaceCapabilities.ObjectForm,
106
- defineObjectForm({
107
- objectSchema: ChannelType,
108
- getIntent: (_, options) => createIntent(ThreadAction.CreateChannel, { spaceId: options.space.id }),
109
- }),
110
- ),
111
- }),
112
- defineModule({
113
- id: `${meta.id}/module/schema`,
114
- activatesOn: ClientEvents.SetupSchema,
115
- activate: () =>
116
- contributes(ClientCapabilities.Schema, [AnchoredTo, ThreadType, DataType.Message, DataType.MessageV1]),
117
- }),
118
- defineModule({
119
- id: `${meta.id}/module/migration`,
120
- activatesOn: ClientEvents.SetupMigration,
121
- activate: () => contributes(ClientCapabilities.Migration, [DataType.MessageV1ToV2]),
122
- }),
123
- defineModule({
124
- id: `${meta.id}/module/on-space-created`,
125
- activatesOn: SpaceEvents.SpaceCreated,
126
- activate: () =>
127
- contributes(SpaceCapabilities.OnSpaceCreated, ({ space, rootCollection }) =>
128
- createIntent(ThreadAction.OnSpaceCreated, { space, rootCollection }),
129
- ),
130
- }),
131
- defineModule({
132
- id: `${meta.id}/module/markdown`,
133
- activatesOn: MarkdownEvents.SetupExtensions,
134
- activate: Markdown,
135
- }),
136
- defineModule({
137
- id: `${meta.id}/module/react-root`,
138
- activatesOn: Events.Startup,
139
- activate: ReactRoot,
140
- }),
141
- defineModule({
142
- id: `${meta.id}/module/react-surface`,
143
- activatesOn: Events.SetupReactSurface,
144
- activate: ReactSurface,
145
- }),
146
- defineModule({
147
- id: `${meta.id}/module/intent-resolver`,
148
- activatesOn: Events.SetupIntentResolver,
149
- activate: IntentResolver,
150
- }),
151
- defineModule({
152
- id: `${meta.id}/module/app-graph-builder`,
153
- activatesOn: Events.SetupAppGraph,
154
- activate: AppGraphBuilder,
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
- }),
162
- ]);
113
+ ),
114
+ }),
115
+ defineModule({
116
+ id: `${meta.id}/module/schema`,
117
+ activatesOn: ClientEvents.SetupSchema,
118
+ activate: () =>
119
+ contributes(ClientCapabilities.Schema, [AnchoredTo, Thread.Thread, DataType.Message, DataType.MessageV1]),
120
+ }),
121
+ defineModule({
122
+ id: `${meta.id}/module/migration`,
123
+ activatesOn: ClientEvents.SetupMigration,
124
+ activate: () => contributes(ClientCapabilities.Migration, [DataType.MessageV1ToV2]),
125
+ }),
126
+ defineModule({
127
+ id: `${meta.id}/module/on-space-created`,
128
+ activatesOn: SpaceEvents.SpaceCreated,
129
+ activate: () =>
130
+ contributes(SpaceCapabilities.onCreateSpace, ({ space, rootCollection }) =>
131
+ createIntent(ThreadAction.onCreateSpace, { space, rootCollection }),
132
+ ),
133
+ }),
134
+ defineModule({
135
+ id: `${meta.id}/module/markdown`,
136
+ activatesOn: MarkdownEvents.SetupExtensions,
137
+ activate: Markdown,
138
+ }),
139
+ defineModule({
140
+ id: `${meta.id}/module/react-root`,
141
+ activatesOn: Events.Startup,
142
+ activate: ReactRoot,
143
+ }),
144
+ defineModule({
145
+ id: `${meta.id}/module/react-surface`,
146
+ activatesOn: Events.SetupReactSurface,
147
+ activate: ReactSurface,
148
+ }),
149
+ defineModule({
150
+ id: `${meta.id}/module/intent-resolver`,
151
+ activatesOn: Events.SetupIntentResolver,
152
+ activate: IntentResolver,
153
+ }),
154
+ defineModule({
155
+ id: `${meta.id}/module/app-graph-builder`,
156
+ activatesOn: Events.SetupAppGraph,
157
+ activate: AppGraphBuilder,
158
+ }),
159
+ defineModule({
160
+ id: `${meta.id}/module/toolkit`,
161
+ // TODO(wittjosiah): Shouldn't use the startup event.
162
+ activatesOn: Events.Startup,
163
+ activate: Toolkit,
164
+ }),
165
+ ]);
@@ -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[]);
@@ -313,7 +313,8 @@ export class MediaManager extends Resource {
313
313
  const ctx = this._ctx.derive();
314
314
  try {
315
315
  const trackData = TrackNameCodec.decode(name);
316
- 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 });
317
318
  if (track?.readyState === 'ended') {
318
319
  throw new Error('Pulled track ended immediately');
319
320
  }
@@ -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
  };
@@ -33,12 +33,14 @@ export type CallsServiceConfig = {
33
33
 
34
34
  export type HistoryRecord =
35
35
  | {
36
+ endpoint: string;
36
37
  type: 'request';
37
38
  time: string;
38
39
  method: string;
39
40
  body: any;
40
41
  }
41
42
  | {
43
+ endpoint: string;
42
44
  type: 'response';
43
45
  time: string;
44
46
  status: number;
@@ -116,7 +118,7 @@ export class CallsServicePeer extends Resource {
116
118
  });
117
119
  peerConnection.addEventListener('connectionstatechange', () => {
118
120
  if (peerConnection.connectionState === 'failed' || peerConnection.connectionState === 'closed') {
119
- log.warn('calls connection failed', { state: peerConnection.connectionState });
121
+ log.info('calls connection failed', { state: peerConnection.connectionState });
120
122
  void this._persistentLifecycle.scheduleRestart();
121
123
  }
122
124
  });
@@ -125,7 +127,7 @@ export class CallsServicePeer extends Resource {
125
127
  peerConnection.addEventListener('iceconnectionstatechange', () => {
126
128
  clearTimeout(iceTimeout);
127
129
  if (peerConnection.iceConnectionState === 'failed' || peerConnection.iceConnectionState === 'closed') {
128
- log.warn('calls connection to ICEs failed', { state: peerConnection.iceConnectionState });
130
+ log.info('calls connection to ICEs failed', { state: peerConnection.iceConnectionState });
129
131
  void this._persistentLifecycle.scheduleRestart();
130
132
  } else if (peerConnection.iceConnectionState === 'disconnected') {
131
133
  // TODO(mykola): we should start to inspect the connection stats from here on for
@@ -138,7 +140,7 @@ export class CallsServicePeer extends Resource {
138
140
  return;
139
141
  }
140
142
 
141
- log.warn('calls iceConnectionState timed out', { state: peerConnection.iceConnectionState, timeoutSeconds });
143
+ log.info('calls iceConnectionState timed out', { state: peerConnection.iceConnectionState, timeoutSeconds });
142
144
  void this._persistentLifecycle.scheduleRestart();
143
145
  }, timeoutSeconds * 1_000);
144
146
  }
@@ -155,6 +157,7 @@ export class CallsServicePeer extends Resource {
155
157
 
156
158
  private async _fetch<T extends ErrorResponse>(relativePath: string, requestInit?: RequestInit): Promise<T> {
157
159
  this.history.push({
160
+ endpoint: relativePath,
158
161
  type: 'request',
159
162
  time: new Date().toISOString(),
160
163
  method: requestInit?.method ?? 'GET',
@@ -170,6 +173,7 @@ export class CallsServicePeer extends Resource {
170
173
  try {
171
174
  const data = (await response.clone().json()) as T;
172
175
  this.history.push({
176
+ endpoint: relativePath,
173
177
  type: 'response',
174
178
  time: new Date().toISOString(),
175
179
  status: response.status,
@@ -183,6 +187,7 @@ export class CallsServicePeer extends Resource {
183
187
  } catch (error) {
184
188
  const text = await response.text();
185
189
  this.history.push({
190
+ endpoint: relativePath,
186
191
  type: 'response',
187
192
  time: new Date().toISOString(),
188
193
  status: response.status,
@@ -252,7 +257,7 @@ export class CallsServicePeer extends Resource {
252
257
  // we wait for the transceiver to start sending data before we emit
253
258
  // the track metadata to ensure that the track will be able to be
254
259
  // pulled before making the metadata available to anyone else.
255
- await waitForTransceiverToSendData(ctx, transceiver);
260
+ // await waitForTransceiverToSendData(ctx, transceiver);
256
261
  return {
257
262
  ...trackData,
258
263
  sessionId,
@@ -406,7 +411,7 @@ export class CallsServicePeer extends Resource {
406
411
  })
407
412
  .catch((err) => log.catch(err));
408
413
  } else {
409
- log.warn('missing track info', { trackData, availableTracks: Array.from(trackMap.keys()) });
414
+ log.info('missing track info', { trackData, availableTracks: Array.from(trackMap.keys()) });
410
415
  }
411
416
  });
412
417
 
@@ -533,8 +538,8 @@ const peerConnectionIsConnected = async (peerConnection: RTCPeerConnection) => {
533
538
 
534
539
  const INITIAL_DELAY = 50;
535
540
  const MAX_DELAY = 500;
536
- const MAX_RETRIES = 50;
537
- const WAIT_FOR_DATA_TIMEOUT = 20_000;
541
+ const MAX_RETRIES = 20;
542
+ const WAIT_FOR_DATA_TIMEOUT = 10_000;
538
543
 
539
544
  const waitForTransceiverToSendData = async (ctx: Context, transceiver: RTCRtpTransceiver): Promise<void> => {
540
545
  let delay = INITIAL_DELAY;
@@ -40,6 +40,20 @@ export const createBlackCanvasStreamTrack = async ({
40
40
  return track;
41
41
  };
42
42
 
43
+ let audioContextStartedPreviously = false;
44
+ const userGestureEvents = [
45
+ 'click',
46
+ 'contextmenu',
47
+ 'auxclick',
48
+ 'dblclick',
49
+ 'mousedown',
50
+ 'mouseup',
51
+ 'pointerup',
52
+ 'touchend',
53
+ 'keydown',
54
+ 'keyup',
55
+ ];
56
+
43
57
  /**
44
58
  * Creates an inaudible audio stream track.
45
59
  * We need this to have audio track available when audio is disabled.
@@ -52,14 +66,58 @@ export const createInaudibleAudioStreamTrack = async ({ ctx }: { ctx: Context })
52
66
  oscillator.frequency.setValueAtTime(20, audioContext.currentTime);
53
67
 
54
68
  const gainNode = audioContext.createGain();
55
- gainNode.gain.setValueAtTime(0.01, audioContext.currentTime);
69
+ // even w/ gain at 0 some packets are sent
70
+ gainNode.gain.setValueAtTime(0, audioContext.currentTime);
56
71
  oscillator.connect(gainNode);
57
72
 
58
73
  const destination = audioContext.createMediaStreamDestination();
59
74
  gainNode.connect(destination);
60
- oscillator.start();
75
+
76
+ let oscillatorStarted = false;
77
+ const ensureOscillatorStarted = () => {
78
+ if (oscillatorStarted) return;
79
+ oscillator.start();
80
+ oscillatorStarted = true;
81
+ };
82
+
83
+ const stateChangeHandler = () => {
84
+ if (audioContext.state === 'running') {
85
+ audioContextStartedPreviously = true;
86
+ ensureOscillatorStarted();
87
+ }
88
+ if (audioContext.state === 'suspended' || (audioContext.state as string) === 'interrupted') {
89
+ resumeAudioContext();
90
+ }
91
+ };
92
+
93
+ audioContext.addEventListener('statechange', stateChangeHandler);
94
+
95
+ const resumeAudioContext = () => {
96
+ void audioContext.resume().then(() => {
97
+ cleanUpUserGestureListeners();
98
+ });
99
+ };
100
+
101
+ const cleanUpUserGestureListeners = () => {
102
+ userGestureEvents.forEach((gesture) => {
103
+ document.removeEventListener(gesture, resumeAudioContext, {
104
+ capture: true,
105
+ });
106
+ });
107
+ };
108
+
109
+ if (audioContextStartedPreviously) {
110
+ resumeAudioContext();
111
+ } else {
112
+ userGestureEvents.forEach((gesture) => {
113
+ document.addEventListener(gesture, resumeAudioContext, {
114
+ capture: true,
115
+ });
116
+ });
117
+ }
61
118
 
62
119
  ctx.onDispose(async () => {
120
+ cleanUpUserGestureListeners();
63
121
  oscillator.disconnect();
64
122
  oscillator.stop();
65
123
  await audioContext.close();