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

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 (558) hide show
  1. package/dist/lib/browser/add-message-3FTZANTW.mjs +89 -0
  2. package/dist/lib/browser/add-message-3FTZANTW.mjs.map +7 -0
  3. package/dist/lib/browser/append-channel-message-CO3M6FSA.mjs +40 -0
  4. package/dist/lib/browser/append-channel-message-CO3M6FSA.mjs.map +7 -0
  5. package/dist/lib/browser/blueprints/index.mjs +37 -0
  6. package/dist/lib/browser/blueprints/index.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  8. package/dist/lib/browser/chunk-MR4CWITF.mjs +31 -0
  9. package/dist/lib/browser/chunk-MR4CWITF.mjs.map +7 -0
  10. package/dist/lib/browser/chunk-TPNZ43NB.mjs +258 -0
  11. package/dist/lib/browser/chunk-TPNZ43NB.mjs.map +7 -0
  12. package/dist/lib/browser/create-GMUAPFZM.mjs +55 -0
  13. package/dist/lib/browser/create-GMUAPFZM.mjs.map +7 -0
  14. package/dist/lib/browser/create-channel-ZXKSLHGN.mjs +19 -0
  15. package/dist/lib/browser/create-channel-ZXKSLHGN.mjs.map +7 -0
  16. package/dist/lib/browser/create-proposals-AV5CREPV.mjs +56 -0
  17. package/dist/lib/browser/create-proposals-AV5CREPV.mjs.map +7 -0
  18. package/dist/lib/browser/delete-673YOWCG.mjs +59 -0
  19. package/dist/lib/browser/delete-673YOWCG.mjs.map +7 -0
  20. package/dist/lib/browser/delete-message-RQ72ZY5D.mjs +55 -0
  21. package/dist/lib/browser/delete-message-RQ72ZY5D.mjs.map +7 -0
  22. package/dist/lib/browser/index.mjs +1783 -270
  23. package/dist/lib/browser/index.mjs.map +4 -4
  24. package/dist/lib/browser/meta.json +1 -1
  25. package/dist/lib/browser/on-create-space-SPE3QVFZ.mjs +24 -0
  26. package/dist/lib/browser/on-create-space-SPE3QVFZ.mjs.map +7 -0
  27. package/dist/lib/browser/operations/index.mjs +13 -0
  28. package/dist/lib/browser/operations/index.mjs.map +7 -0
  29. package/dist/lib/browser/restore-VX7FLZOZ.mjs +32 -0
  30. package/dist/lib/browser/restore-VX7FLZOZ.mjs.map +7 -0
  31. package/dist/lib/browser/restore-message-D65NSWUA.mjs +33 -0
  32. package/dist/lib/browser/restore-message-D65NSWUA.mjs.map +7 -0
  33. package/dist/lib/browser/select-DO4AYSCB.mjs +26 -0
  34. package/dist/lib/browser/select-DO4AYSCB.mjs.map +7 -0
  35. package/dist/lib/browser/toggle-resolved-JD3D4WBZ.mjs +36 -0
  36. package/dist/lib/browser/toggle-resolved-JD3D4WBZ.mjs.map +7 -0
  37. package/dist/lib/browser/translations.mjs +90 -0
  38. package/dist/lib/browser/translations.mjs.map +7 -0
  39. package/dist/lib/browser/types/index.mjs +6 -12
  40. package/dist/lib/node-esm/add-message-56J2HLJB.mjs +90 -0
  41. package/dist/lib/node-esm/add-message-56J2HLJB.mjs.map +7 -0
  42. package/dist/lib/node-esm/append-channel-message-F7KGBSWP.mjs +41 -0
  43. package/dist/lib/node-esm/append-channel-message-F7KGBSWP.mjs.map +7 -0
  44. package/dist/lib/node-esm/blueprints/index.mjs +38 -0
  45. package/dist/lib/node-esm/blueprints/index.mjs.map +7 -0
  46. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  47. package/dist/lib/node-esm/chunk-L6UL3NVS.mjs +32 -0
  48. package/dist/lib/node-esm/chunk-L6UL3NVS.mjs.map +7 -0
  49. package/dist/lib/node-esm/chunk-XKUMDYGR.mjs +259 -0
  50. package/dist/lib/node-esm/chunk-XKUMDYGR.mjs.map +7 -0
  51. package/dist/lib/node-esm/create-LEXHIPUT.mjs +56 -0
  52. package/dist/lib/node-esm/create-LEXHIPUT.mjs.map +7 -0
  53. package/dist/lib/node-esm/create-channel-6VHTC2OR.mjs +20 -0
  54. package/dist/lib/node-esm/create-channel-6VHTC2OR.mjs.map +7 -0
  55. package/dist/lib/node-esm/create-proposals-P5O2ICOL.mjs +57 -0
  56. package/dist/lib/node-esm/create-proposals-P5O2ICOL.mjs.map +7 -0
  57. package/dist/lib/node-esm/delete-4KSU4UEJ.mjs +60 -0
  58. package/dist/lib/node-esm/delete-4KSU4UEJ.mjs.map +7 -0
  59. package/dist/lib/node-esm/delete-message-PGNLB6TL.mjs +56 -0
  60. package/dist/lib/node-esm/delete-message-PGNLB6TL.mjs.map +7 -0
  61. package/dist/lib/node-esm/index.mjs +1783 -270
  62. package/dist/lib/node-esm/index.mjs.map +4 -4
  63. package/dist/lib/node-esm/meta.json +1 -1
  64. package/dist/lib/node-esm/on-create-space-TFBSHWQ4.mjs +25 -0
  65. package/dist/lib/node-esm/on-create-space-TFBSHWQ4.mjs.map +7 -0
  66. package/dist/lib/node-esm/operations/index.mjs +14 -0
  67. package/dist/lib/node-esm/operations/index.mjs.map +7 -0
  68. package/dist/lib/node-esm/restore-E27OAIFJ.mjs +33 -0
  69. package/dist/lib/node-esm/restore-E27OAIFJ.mjs.map +7 -0
  70. package/dist/lib/node-esm/restore-message-J3CH6NGI.mjs +34 -0
  71. package/dist/lib/node-esm/restore-message-J3CH6NGI.mjs.map +7 -0
  72. package/dist/lib/node-esm/select-NDHRM75K.mjs +27 -0
  73. package/dist/lib/node-esm/select-NDHRM75K.mjs.map +7 -0
  74. package/dist/lib/node-esm/toggle-resolved-VS6NKXL3.mjs +37 -0
  75. package/dist/lib/node-esm/toggle-resolved-VS6NKXL3.mjs.map +7 -0
  76. package/dist/lib/node-esm/translations.mjs +91 -0
  77. package/dist/lib/node-esm/translations.mjs.map +7 -0
  78. package/dist/lib/node-esm/types/index.mjs +6 -12
  79. package/dist/types/src/ThreadPlugin.d.ts +3 -1
  80. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  81. package/dist/types/src/ThreadPlugin.node.d.ts +4 -0
  82. package/dist/types/src/ThreadPlugin.node.d.ts.map +1 -0
  83. package/dist/types/src/ThreadPlugin.test.d.ts +2 -0
  84. package/dist/types/src/ThreadPlugin.test.d.ts.map +1 -0
  85. package/dist/types/src/blueprints/index.d.ts +2 -0
  86. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  87. package/dist/types/src/blueprints/thread-blueprint.d.ts +4 -0
  88. package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -0
  89. package/dist/types/src/calls/call-manager.d.ts +40 -30
  90. package/dist/types/src/calls/call-manager.d.ts.map +1 -1
  91. package/dist/types/src/calls/call-swarm-synchronizer.d.ts +2 -2
  92. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
  93. package/dist/types/src/calls/media-manager.d.ts +2 -2
  94. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  95. package/dist/types/src/calls/speaking-monitor.d.ts +0 -3
  96. package/dist/types/src/calls/speaking-monitor.d.ts.map +1 -1
  97. package/dist/types/src/calls/types.d.ts +1 -1
  98. package/dist/types/src/calls/types.d.ts.map +1 -1
  99. package/dist/types/src/calls/util/audio.d.ts.map +1 -1
  100. package/dist/types/src/calls/util/calls-service.d.ts +11 -6
  101. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  102. package/dist/types/src/calls/util/history-cache.d.ts.map +1 -1
  103. package/dist/types/src/calls/util/media.d.ts.map +1 -1
  104. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  105. package/dist/types/src/calls/util/task-scheduling.d.ts +2 -2
  106. package/dist/types/src/calls/util/task-scheduling.d.ts.map +1 -1
  107. package/dist/types/src/calls-service.stories.d.ts +23 -0
  108. package/dist/types/src/calls-service.stories.d.ts.map +1 -0
  109. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  110. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  111. package/dist/types/src/capabilities/blueprint-definition.d.ts +6 -0
  112. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  113. package/dist/types/src/capabilities/call-manager.d.ts +3 -2
  114. package/dist/types/src/capabilities/call-manager.d.ts.map +1 -1
  115. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  116. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  117. package/dist/types/src/capabilities/index.d.ts +19 -13
  118. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  119. package/dist/types/src/capabilities/markdown.d.ts +3 -2
  120. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  121. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  122. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  123. package/dist/types/src/capabilities/react-root.d.ts +4 -2
  124. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  125. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  126. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  127. package/dist/types/src/capabilities/settings.d.ts +5 -2
  128. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  129. package/dist/types/src/capabilities/state.d.ts +5 -5
  130. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  131. package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
  132. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
  133. package/dist/types/src/components/Call/Call.d.ts +32 -4
  134. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  135. package/dist/types/src/components/Call/Toolbar.d.ts +6 -6
  136. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  137. package/dist/types/src/components/Chat/Chat.d.ts +51 -0
  138. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -0
  139. package/dist/types/src/components/Chat/index.d.ts +2 -0
  140. package/dist/types/src/components/Chat/index.d.ts.map +1 -0
  141. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts +13 -0
  142. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts.map +1 -0
  143. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts +160 -0
  144. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts.map +1 -0
  145. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts +14 -0
  146. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts.map +1 -0
  147. package/dist/types/src/components/CommentsPanel/index.d.ts +3 -0
  148. package/dist/types/src/components/CommentsPanel/index.d.ts.map +1 -0
  149. package/dist/types/src/components/Lobby/Lobby.d.ts +24 -3
  150. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  151. package/dist/types/src/components/Media/VideoObject.d.ts +3 -3
  152. package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
  153. package/dist/types/src/components/Media/VideoObject.stories.d.ts +18 -4
  154. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  155. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts +15 -0
  156. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts.map +1 -0
  157. package/dist/types/src/components/MessagePanel/index.d.ts +2 -0
  158. package/dist/types/src/components/MessagePanel/index.d.ts.map +1 -0
  159. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  160. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
  161. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +1 -1
  162. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +160 -5
  163. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  164. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  165. package/dist/types/src/components/ResponsiveGrid/{ResponsiveContainer.d.ts → ResponsivePanel.d.ts} +4 -4
  166. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.d.ts.map +1 -0
  167. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts +164 -0
  168. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts.map +1 -0
  169. package/dist/types/src/components/ResponsiveGrid/index.d.ts +1 -1
  170. package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +1 -1
  171. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts +6 -0
  172. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts.map +1 -0
  173. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts +161 -0
  174. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts.map +1 -0
  175. package/dist/types/src/components/ThreadSettings/index.d.ts +2 -0
  176. package/dist/types/src/components/ThreadSettings/index.d.ts.map +1 -0
  177. package/dist/types/src/components/index.d.ts +5 -9
  178. package/dist/types/src/components/index.d.ts.map +1 -1
  179. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts +15 -0
  180. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts.map +1 -0
  181. package/dist/types/src/containers/CallDebugPanel/index.d.ts +2 -0
  182. package/dist/types/src/containers/CallDebugPanel/index.d.ts.map +1 -0
  183. package/dist/types/src/{components → containers/CallSidebar}/CallSidebar.d.ts +0 -1
  184. package/dist/types/src/containers/CallSidebar/CallSidebar.d.ts.map +1 -0
  185. package/dist/types/src/containers/CallSidebar/index.d.ts +2 -0
  186. package/dist/types/src/containers/CallSidebar/index.d.ts.map +1 -0
  187. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts +20 -0
  188. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts.map +1 -0
  189. package/dist/types/src/containers/ChannelChat/index.d.ts +4 -0
  190. package/dist/types/src/containers/ChannelChat/index.d.ts.map +1 -0
  191. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts +12 -0
  192. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts.map +1 -0
  193. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts +162 -0
  194. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts.map +1 -0
  195. package/dist/types/src/containers/ChannelContainer/index.d.ts +2 -0
  196. package/dist/types/src/containers/ChannelContainer/index.d.ts.map +1 -0
  197. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts +8 -0
  198. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts.map +1 -0
  199. package/dist/types/src/containers/ThreadCompanion/index.d.ts +2 -0
  200. package/dist/types/src/containers/ThreadCompanion/index.d.ts.map +1 -0
  201. package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts +20 -0
  202. package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts.map +1 -0
  203. package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts +162 -0
  204. package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts.map +1 -0
  205. package/dist/types/src/containers/ThreadContainer/index.d.ts +4 -0
  206. package/dist/types/src/containers/ThreadContainer/index.d.ts.map +1 -0
  207. package/dist/types/src/containers/index.d.ts +8 -0
  208. package/dist/types/src/containers/index.d.ts.map +1 -0
  209. package/dist/types/src/{components/command-extension.d.ts → extensions/command.d.ts} +1 -1
  210. package/dist/types/src/extensions/command.d.ts.map +1 -0
  211. package/dist/types/src/extensions/index.d.ts +1 -0
  212. package/dist/types/src/extensions/index.d.ts.map +1 -1
  213. package/dist/types/src/extensions/threads.d.ts +9 -4
  214. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  215. package/dist/types/src/hooks/analytics.d.ts +2 -3
  216. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  217. package/dist/types/src/hooks/index.d.ts +3 -0
  218. package/dist/types/src/hooks/index.d.ts.map +1 -1
  219. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
  220. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
  221. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts +2 -0
  222. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts.map +1 -0
  223. package/dist/types/src/hooks/useStatus.d.ts.map +1 -1
  224. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +3 -0
  225. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -0
  226. package/dist/types/src/index.d.ts +4 -3
  227. package/dist/types/src/index.d.ts.map +1 -1
  228. package/dist/types/src/meta.d.ts +3 -4
  229. package/dist/types/src/meta.d.ts.map +1 -1
  230. package/dist/types/src/operations/add-message.d.ts +5 -0
  231. package/dist/types/src/operations/add-message.d.ts.map +1 -0
  232. package/dist/types/src/operations/append-channel-message.d.ts +5 -0
  233. package/dist/types/src/operations/append-channel-message.d.ts.map +1 -0
  234. package/dist/types/src/operations/create-channel.d.ts +5 -0
  235. package/dist/types/src/operations/create-channel.d.ts.map +1 -0
  236. package/dist/types/src/operations/create-proposals.d.ts +5 -0
  237. package/dist/types/src/operations/create-proposals.d.ts.map +1 -0
  238. package/dist/types/src/operations/create.d.ts +5 -0
  239. package/dist/types/src/operations/create.d.ts.map +1 -0
  240. package/dist/types/src/operations/definitions.d.ts +1995 -0
  241. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  242. package/dist/types/src/operations/delete-message.d.ts +5 -0
  243. package/dist/types/src/operations/delete-message.d.ts.map +1 -0
  244. package/dist/types/src/operations/delete.d.ts +5 -0
  245. package/dist/types/src/operations/delete.d.ts.map +1 -0
  246. package/dist/types/src/operations/index.d.ts +4 -0
  247. package/dist/types/src/operations/index.d.ts.map +1 -0
  248. package/dist/types/src/operations/on-create-space.d.ts +5 -0
  249. package/dist/types/src/operations/on-create-space.d.ts.map +1 -0
  250. package/dist/types/src/operations/restore-message.d.ts +5 -0
  251. package/dist/types/src/operations/restore-message.d.ts.map +1 -0
  252. package/dist/types/src/operations/restore.d.ts +5 -0
  253. package/dist/types/src/operations/restore.d.ts.map +1 -0
  254. package/dist/types/src/operations/select.d.ts +5 -0
  255. package/dist/types/src/operations/select.d.ts.map +1 -0
  256. package/dist/types/src/operations/toggle-resolved.d.ts +5 -0
  257. package/dist/types/src/operations/toggle-resolved.d.ts.map +1 -0
  258. package/dist/types/src/testing/data.d.ts +5 -0
  259. package/dist/types/src/testing/data.d.ts.map +1 -0
  260. package/dist/types/src/testing/index.d.ts +1 -1
  261. package/dist/types/src/testing/index.d.ts.map +1 -1
  262. package/dist/types/src/translations.d.ts +144 -194
  263. package/dist/types/src/translations.d.ts.map +1 -1
  264. package/dist/types/src/types/Settings.d.ts +5 -0
  265. package/dist/types/src/types/Settings.d.ts.map +1 -0
  266. package/dist/types/src/types/capabilities.d.ts +29 -0
  267. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  268. package/dist/types/src/types/index.d.ts +1 -1
  269. package/dist/types/src/types/index.d.ts.map +1 -1
  270. package/dist/types/src/types/types.d.ts +4 -326
  271. package/dist/types/src/types/types.d.ts.map +1 -1
  272. package/dist/types/src/util.d.ts +21 -3
  273. package/dist/types/src/util.d.ts.map +1 -1
  274. package/dist/types/tsconfig.tsbuildinfo +1 -1
  275. package/package.json +119 -75
  276. package/src/ThreadPlugin.node.ts +39 -0
  277. package/src/ThreadPlugin.test.ts +37 -0
  278. package/src/ThreadPlugin.tsx +66 -149
  279. package/src/blueprints/index.ts +5 -0
  280. package/src/blueprints/thread-blueprint.ts +36 -0
  281. package/src/calls/call-manager.ts +78 -50
  282. package/src/calls/call-swarm-synchronizer.ts +3 -3
  283. package/src/calls/media-manager.ts +77 -41
  284. package/src/calls/types.ts +8 -4
  285. package/src/calls/util/calls-service.ts +74 -19
  286. package/src/calls/util/stub-media-streams.ts +65 -9
  287. package/src/calls/util/task-scheduling.ts +4 -4
  288. package/src/calls-service.stories.tsx +230 -0
  289. package/src/capabilities/app-graph-builder.ts +177 -162
  290. package/src/capabilities/blueprint-definition.ts +19 -0
  291. package/src/capabilities/call-manager.ts +19 -11
  292. package/src/capabilities/create-object.ts +29 -0
  293. package/src/capabilities/index.ts +17 -11
  294. package/src/capabilities/markdown.ts +55 -37
  295. package/src/capabilities/operation-handler.ts +16 -0
  296. package/src/capabilities/react-root.tsx +12 -9
  297. package/src/capabilities/react-surface.tsx +83 -74
  298. package/src/capabilities/settings.ts +28 -12
  299. package/src/capabilities/state.ts +14 -17
  300. package/src/capabilities/undo-mappings.ts +46 -0
  301. package/src/components/Call/Call.tsx +17 -12
  302. package/src/components/Call/Toolbar.tsx +63 -46
  303. package/src/components/Chat/Chat.tsx +258 -0
  304. package/src/components/Chat/index.ts +5 -0
  305. package/src/components/CommentsPanel/CommentsPanel.stories.tsx +95 -0
  306. package/src/components/CommentsPanel/CommentsPanel.tsx +71 -0
  307. package/src/components/CommentsPanel/CommentsThread.tsx +172 -0
  308. package/src/components/CommentsPanel/index.ts +6 -0
  309. package/src/components/Lobby/Lobby.tsx +21 -17
  310. package/src/components/Media/AudioStream.tsx +2 -2
  311. package/src/components/Media/VideoObject.stories.tsx +37 -30
  312. package/src/components/Media/VideoObject.tsx +1 -1
  313. package/src/components/MessagePanel/MessagePanel.tsx +225 -0
  314. package/src/components/MessagePanel/index.ts +5 -0
  315. package/src/components/Participant/Participant.tsx +35 -15
  316. package/src/components/Participant/ParticipantGrid.tsx +1 -1
  317. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +51 -49
  318. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +6 -6
  319. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +15 -12
  320. package/src/components/ResponsiveGrid/{ResponsiveContainer.stories.tsx → ResponsivePanel.stories.tsx} +12 -12
  321. package/src/components/ResponsiveGrid/{ResponsiveContainer.tsx → ResponsivePanel.tsx} +5 -5
  322. package/src/components/ResponsiveGrid/index.ts +1 -1
  323. package/src/components/ThreadSettings/ThreadSettings.stories.tsx +32 -0
  324. package/src/components/ThreadSettings/ThreadSettings.tsx +20 -0
  325. package/src/components/ThreadSettings/index.ts +5 -0
  326. package/src/components/index.ts +6 -12
  327. package/src/containers/CallDebugPanel/CallDebugPanel.tsx +173 -0
  328. package/src/containers/CallDebugPanel/index.ts +5 -0
  329. package/src/containers/CallSidebar/CallSidebar.tsx +18 -0
  330. package/src/containers/CallSidebar/index.ts +5 -0
  331. package/src/containers/ChannelChat/ChannelChat.tsx +75 -0
  332. package/src/containers/ChannelChat/index.ts +8 -0
  333. package/src/containers/ChannelContainer/ChannelContainer.stories.tsx +105 -0
  334. package/src/containers/ChannelContainer/ChannelContainer.tsx +223 -0
  335. package/src/containers/ChannelContainer/index.ts +5 -0
  336. package/src/containers/ThreadCompanion/ThreadCompanion.tsx +215 -0
  337. package/src/containers/ThreadCompanion/index.ts +5 -0
  338. package/src/containers/ThreadContainer/ThreadContainer.stories.tsx +86 -0
  339. package/src/containers/ThreadContainer/ThreadContainer.tsx +75 -0
  340. package/src/containers/ThreadContainer/index.ts +8 -0
  341. package/src/containers/index.ts +12 -0
  342. package/src/{components/command-extension.ts → extensions/command.ts} +7 -4
  343. package/src/extensions/index.ts +1 -0
  344. package/src/extensions/threads.ts +89 -44
  345. package/src/hooks/analytics.ts +22 -21
  346. package/src/hooks/index.ts +4 -0
  347. package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
  348. package/src/hooks/useDebugMode.ts +1 -1
  349. package/src/hooks/useInaudibleAudioStreamTrack.tsx +27 -0
  350. package/src/hooks/useVideoStreamTrack.tsx +36 -0
  351. package/src/index.ts +11 -4
  352. package/src/meta.ts +11 -7
  353. package/src/operations/add-message.ts +81 -0
  354. package/src/operations/append-channel-message.ts +36 -0
  355. package/src/operations/create-channel.ts +20 -0
  356. package/src/operations/create-proposals.ts +49 -0
  357. package/src/operations/create.ts +48 -0
  358. package/src/operations/definitions.ts +177 -0
  359. package/src/operations/delete-message.ts +53 -0
  360. package/src/operations/delete.ts +63 -0
  361. package/src/operations/index.ts +22 -0
  362. package/src/operations/on-create-space.ts +27 -0
  363. package/src/operations/restore-message.ts +38 -0
  364. package/src/operations/restore.ts +38 -0
  365. package/src/operations/select.ts +24 -0
  366. package/src/operations/toggle-resolved.ts +41 -0
  367. package/src/testing/data.ts +49 -0
  368. package/src/testing/index.ts +1 -1
  369. package/src/translations.ts +77 -73
  370. package/src/types/Settings.ts +10 -0
  371. package/src/types/capabilities.ts +42 -0
  372. package/src/types/index.ts +1 -1
  373. package/src/types/types.ts +5 -91
  374. package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
  375. package/src/typings.d.ts +8 -0
  376. package/src/util.ts +38 -6
  377. package/dist/lib/browser/ChannelContainer-PKFBVENP.mjs +0 -15
  378. package/dist/lib/browser/ChatContainer-RSOKYAMK.mjs +0 -14
  379. package/dist/lib/browser/app-graph-builder-OY7R7EJP.mjs +0 -171
  380. package/dist/lib/browser/app-graph-builder-OY7R7EJP.mjs.map +0 -7
  381. package/dist/lib/browser/call-manager-APQAZWHT.mjs +0 -23
  382. package/dist/lib/browser/call-manager-APQAZWHT.mjs.map +0 -7
  383. package/dist/lib/browser/chunk-4H4A264L.mjs +0 -1708
  384. package/dist/lib/browser/chunk-4H4A264L.mjs.map +0 -7
  385. package/dist/lib/browser/chunk-5P5BH5GE.mjs +0 -88
  386. package/dist/lib/browser/chunk-5P5BH5GE.mjs.map +0 -7
  387. package/dist/lib/browser/chunk-6NBVNXTM.mjs +0 -21
  388. package/dist/lib/browser/chunk-6NBVNXTM.mjs.map +0 -7
  389. package/dist/lib/browser/chunk-AEXWNS6Z.mjs +0 -128
  390. package/dist/lib/browser/chunk-AEXWNS6Z.mjs.map +0 -7
  391. package/dist/lib/browser/chunk-IIUTBDVB.mjs +0 -17
  392. package/dist/lib/browser/chunk-IIUTBDVB.mjs.map +0 -7
  393. package/dist/lib/browser/chunk-JKQUJOTX.mjs +0 -31
  394. package/dist/lib/browser/chunk-JKQUJOTX.mjs.map +0 -7
  395. package/dist/lib/browser/chunk-PG5CTFKK.mjs +0 -550
  396. package/dist/lib/browser/chunk-PG5CTFKK.mjs.map +0 -7
  397. package/dist/lib/browser/chunk-R5MDLUPC.mjs +0 -18
  398. package/dist/lib/browser/chunk-R5MDLUPC.mjs.map +0 -7
  399. package/dist/lib/browser/chunk-TAFSCSUR.mjs +0 -351
  400. package/dist/lib/browser/chunk-TAFSCSUR.mjs.map +0 -7
  401. package/dist/lib/browser/chunk-XZKBN3NS.mjs +0 -983
  402. package/dist/lib/browser/chunk-XZKBN3NS.mjs.map +0 -7
  403. package/dist/lib/browser/intent-resolver-FK2MDVDT.mjs +0 -353
  404. package/dist/lib/browser/intent-resolver-FK2MDVDT.mjs.map +0 -7
  405. package/dist/lib/browser/markdown-TE5SWWNJ.mjs +0 -169
  406. package/dist/lib/browser/markdown-TE5SWWNJ.mjs.map +0 -7
  407. package/dist/lib/browser/react-root-NK3A4VG7.mjs +0 -27
  408. package/dist/lib/browser/react-root-NK3A4VG7.mjs.map +0 -7
  409. package/dist/lib/browser/react-surface-VXUJKSOG.mjs +0 -108
  410. package/dist/lib/browser/react-surface-VXUJKSOG.mjs.map +0 -7
  411. package/dist/lib/browser/settings-RB2RSLXV.mjs +0 -22
  412. package/dist/lib/browser/settings-RB2RSLXV.mjs.map +0 -7
  413. package/dist/lib/browser/state-RKL5MSDP.mjs +0 -34
  414. package/dist/lib/browser/state-RKL5MSDP.mjs.map +0 -7
  415. package/dist/lib/node/ChannelContainer-YS5YT2ML.cjs +0 -36
  416. package/dist/lib/node/ChannelContainer-YS5YT2ML.cjs.map +0 -7
  417. package/dist/lib/node/ChatContainer-GCOM3M56.cjs +0 -35
  418. package/dist/lib/node/ChatContainer-GCOM3M56.cjs.map +0 -7
  419. package/dist/lib/node/app-graph-builder-PBHJNDQY.cjs +0 -179
  420. package/dist/lib/node/app-graph-builder-PBHJNDQY.cjs.map +0 -7
  421. package/dist/lib/node/call-manager-HV2XJW5O.cjs +0 -37
  422. package/dist/lib/node/call-manager-HV2XJW5O.cjs.map +0 -7
  423. package/dist/lib/node/chunk-44I33JDT.cjs +0 -1731
  424. package/dist/lib/node/chunk-44I33JDT.cjs.map +0 -7
  425. package/dist/lib/node/chunk-4YSNVPWU.cjs +0 -37
  426. package/dist/lib/node/chunk-4YSNVPWU.cjs.map +0 -7
  427. package/dist/lib/node/chunk-E3WBZTTI.cjs +0 -371
  428. package/dist/lib/node/chunk-E3WBZTTI.cjs.map +0 -7
  429. package/dist/lib/node/chunk-ERG7G6FF.cjs +0 -59
  430. package/dist/lib/node/chunk-ERG7G6FF.cjs.map +0 -7
  431. package/dist/lib/node/chunk-FUXJAVFZ.cjs +0 -108
  432. package/dist/lib/node/chunk-FUXJAVFZ.cjs.map +0 -7
  433. package/dist/lib/node/chunk-HLMCEE5K.cjs +0 -41
  434. package/dist/lib/node/chunk-HLMCEE5K.cjs.map +0 -7
  435. package/dist/lib/node/chunk-IP533AMV.cjs +0 -554
  436. package/dist/lib/node/chunk-IP533AMV.cjs.map +0 -7
  437. package/dist/lib/node/chunk-LR5NENBE.cjs +0 -54
  438. package/dist/lib/node/chunk-LR5NENBE.cjs.map +0 -7
  439. package/dist/lib/node/chunk-UM36TPCT.cjs +0 -984
  440. package/dist/lib/node/chunk-UM36TPCT.cjs.map +0 -7
  441. package/dist/lib/node/chunk-ZGDN3XBR.cjs +0 -149
  442. package/dist/lib/node/chunk-ZGDN3XBR.cjs.map +0 -7
  443. package/dist/lib/node/index.cjs +0 -310
  444. package/dist/lib/node/index.cjs.map +0 -7
  445. package/dist/lib/node/intent-resolver-SYSJ5SJG.cjs +0 -363
  446. package/dist/lib/node/intent-resolver-SYSJ5SJG.cjs.map +0 -7
  447. package/dist/lib/node/markdown-GQIPJS2F.cjs +0 -178
  448. package/dist/lib/node/markdown-GQIPJS2F.cjs.map +0 -7
  449. package/dist/lib/node/meta.json +0 -1
  450. package/dist/lib/node/react-root-6HHDMULJ.cjs +0 -51
  451. package/dist/lib/node/react-root-6HHDMULJ.cjs.map +0 -7
  452. package/dist/lib/node/react-surface-NBH42NN2.cjs +0 -122
  453. package/dist/lib/node/react-surface-NBH42NN2.cjs.map +0 -7
  454. package/dist/lib/node/settings-4LQSFEDK.cjs +0 -36
  455. package/dist/lib/node/settings-4LQSFEDK.cjs.map +0 -7
  456. package/dist/lib/node/state-IY5XX3H2.cjs +0 -50
  457. package/dist/lib/node/state-IY5XX3H2.cjs.map +0 -7
  458. package/dist/lib/node/types/index.cjs +0 -38
  459. package/dist/lib/node/types/index.cjs.map +0 -7
  460. package/dist/lib/node-esm/ChannelContainer-O4QJII2P.mjs +0 -16
  461. package/dist/lib/node-esm/ChannelContainer-O4QJII2P.mjs.map +0 -7
  462. package/dist/lib/node-esm/ChatContainer-F6CSADV7.mjs +0 -15
  463. package/dist/lib/node-esm/ChatContainer-F6CSADV7.mjs.map +0 -7
  464. package/dist/lib/node-esm/app-graph-builder-BAHBHYWI.mjs +0 -172
  465. package/dist/lib/node-esm/app-graph-builder-BAHBHYWI.mjs.map +0 -7
  466. package/dist/lib/node-esm/call-manager-UUYXLF4T.mjs +0 -24
  467. package/dist/lib/node-esm/call-manager-UUYXLF4T.mjs.map +0 -7
  468. package/dist/lib/node-esm/chunk-2RNIPFDA.mjs +0 -984
  469. package/dist/lib/node-esm/chunk-2RNIPFDA.mjs.map +0 -7
  470. package/dist/lib/node-esm/chunk-ESQC6SYE.mjs +0 -19
  471. package/dist/lib/node-esm/chunk-ESQC6SYE.mjs.map +0 -7
  472. package/dist/lib/node-esm/chunk-K4KAUOKT.mjs +0 -19
  473. package/dist/lib/node-esm/chunk-K4KAUOKT.mjs.map +0 -7
  474. package/dist/lib/node-esm/chunk-O3V45YJP.mjs +0 -90
  475. package/dist/lib/node-esm/chunk-O3V45YJP.mjs.map +0 -7
  476. package/dist/lib/node-esm/chunk-O63QJPQX.mjs +0 -23
  477. package/dist/lib/node-esm/chunk-O63QJPQX.mjs.map +0 -7
  478. package/dist/lib/node-esm/chunk-P6RLFCNT.mjs +0 -352
  479. package/dist/lib/node-esm/chunk-P6RLFCNT.mjs.map +0 -7
  480. package/dist/lib/node-esm/chunk-PGRP3O4O.mjs +0 -33
  481. package/dist/lib/node-esm/chunk-PGRP3O4O.mjs.map +0 -7
  482. package/dist/lib/node-esm/chunk-UJMPYKT3.mjs +0 -129
  483. package/dist/lib/node-esm/chunk-UJMPYKT3.mjs.map +0 -7
  484. package/dist/lib/node-esm/chunk-UZWVVFT3.mjs +0 -551
  485. package/dist/lib/node-esm/chunk-UZWVVFT3.mjs.map +0 -7
  486. package/dist/lib/node-esm/chunk-WXNPD542.mjs +0 -1710
  487. package/dist/lib/node-esm/chunk-WXNPD542.mjs.map +0 -7
  488. package/dist/lib/node-esm/intent-resolver-BU73VYW3.mjs +0 -354
  489. package/dist/lib/node-esm/intent-resolver-BU73VYW3.mjs.map +0 -7
  490. package/dist/lib/node-esm/markdown-HJUWNBLS.mjs +0 -170
  491. package/dist/lib/node-esm/markdown-HJUWNBLS.mjs.map +0 -7
  492. package/dist/lib/node-esm/react-root-RUXOAQNW.mjs +0 -28
  493. package/dist/lib/node-esm/react-root-RUXOAQNW.mjs.map +0 -7
  494. package/dist/lib/node-esm/react-surface-ELXFYKP6.mjs +0 -109
  495. package/dist/lib/node-esm/react-surface-ELXFYKP6.mjs.map +0 -7
  496. package/dist/lib/node-esm/settings-EA7DFSM6.mjs +0 -23
  497. package/dist/lib/node-esm/settings-EA7DFSM6.mjs.map +0 -7
  498. package/dist/lib/node-esm/state-6AUTNROZ.mjs +0 -35
  499. package/dist/lib/node-esm/state-6AUTNROZ.mjs.map +0 -7
  500. package/dist/types/src/capabilities/capabilities.d.ts +0 -27
  501. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  502. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  503. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  504. package/dist/types/src/components/CallDebugPanel.d.ts +0 -8
  505. package/dist/types/src/components/CallDebugPanel.d.ts.map +0 -1
  506. package/dist/types/src/components/CallSidebar.d.ts.map +0 -1
  507. package/dist/types/src/components/ChannelContainer.d.ts +0 -14
  508. package/dist/types/src/components/ChannelContainer.d.ts.map +0 -1
  509. package/dist/types/src/components/ChannelContainer.stories.d.ts +0 -10
  510. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +0 -1
  511. package/dist/types/src/components/Chat.stories.d.ts +0 -6
  512. package/dist/types/src/components/Chat.stories.d.ts.map +0 -1
  513. package/dist/types/src/components/ChatContainer.d.ts +0 -17
  514. package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
  515. package/dist/types/src/components/CommentContainer.d.ts +0 -13
  516. package/dist/types/src/components/CommentContainer.d.ts.map +0 -1
  517. package/dist/types/src/components/Comments.stories.d.ts +0 -6
  518. package/dist/types/src/components/Comments.stories.d.ts.map +0 -1
  519. package/dist/types/src/components/CommentsContainer.d.ts +0 -13
  520. package/dist/types/src/components/CommentsContainer.d.ts.map +0 -1
  521. package/dist/types/src/components/MessageContainer.d.ts +0 -11
  522. package/dist/types/src/components/MessageContainer.d.ts.map +0 -1
  523. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts.map +0 -1
  524. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +0 -10
  525. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +0 -1
  526. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  527. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  528. package/dist/types/src/components/ThreadSettings.d.ts +0 -6
  529. package/dist/types/src/components/ThreadSettings.d.ts.map +0 -1
  530. package/dist/types/src/components/command-extension.d.ts.map +0 -1
  531. package/dist/types/src/components/testing.d.ts +0 -4
  532. package/dist/types/src/components/testing.d.ts.map +0 -1
  533. package/dist/types/src/peers.stories.d.ts +0 -11
  534. package/dist/types/src/peers.stories.d.ts.map +0 -1
  535. package/dist/types/src/testing/stories.d.ts +0 -2
  536. package/dist/types/src/testing/stories.d.ts.map +0 -1
  537. package/dist/types/src/types/schema.d.ts +0 -133
  538. package/dist/types/src/types/schema.d.ts.map +0 -1
  539. package/src/capabilities/capabilities.ts +0 -33
  540. package/src/capabilities/intent-resolver.ts +0 -296
  541. package/src/components/CallDebugPanel.tsx +0 -115
  542. package/src/components/CallSidebar.tsx +0 -17
  543. package/src/components/ChannelContainer.stories.tsx +0 -58
  544. package/src/components/ChannelContainer.tsx +0 -199
  545. package/src/components/Chat.stories.tsx +0 -88
  546. package/src/components/ChatContainer.tsx +0 -140
  547. package/src/components/CommentContainer.tsx +0 -198
  548. package/src/components/Comments.stories.tsx +0 -85
  549. package/src/components/CommentsContainer.tsx +0 -66
  550. package/src/components/MessageContainer.tsx +0 -167
  551. package/src/components/ThreadComplementary.tsx +0 -151
  552. package/src/components/ThreadSettings.tsx +0 -17
  553. package/src/components/testing.ts +0 -29
  554. package/src/peers.stories.tsx +0 -189
  555. package/src/testing/stories.ts +0 -50
  556. package/src/types/schema.ts +0 -33
  557. /package/dist/lib/browser/{ChannelContainer-PKFBVENP.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  558. /package/dist/lib/{browser/ChatContainer-RSOKYAMK.mjs.map → node-esm/chunk-HSLMI22Q.mjs.map} +0 -0
@@ -2,20 +2,20 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { PersistentLifecycle } from '@dxos/async';
5
+ import { PersistentLifecycle, Trigger, scheduleTask } from '@dxos/async';
6
6
  import { type Context, Resource } from '@dxos/context';
7
7
  import { invariant } from '@dxos/invariant';
8
8
  import { log } from '@dxos/log';
9
9
 
10
- import { HistoryCache } from './history-cache';
11
- import { BulkRequestDispatcher, FIFOScheduler } from './task-scheduling';
12
10
  import {
13
- type SessionResponse,
14
11
  type ErrorResponse,
15
12
  type RenegotiationResponse,
13
+ type SessionResponse,
16
14
  type TrackObject,
17
15
  type TracksResponse,
18
16
  } from '../types';
17
+ import { HistoryCache } from './history-cache';
18
+ import { BulkRequestDispatcher, FIFOScheduler } from './task-scheduling';
19
19
 
20
20
  const NETWORK_TIMEOUT = 5_000;
21
21
 
@@ -26,18 +26,20 @@ export type Session = {
26
26
 
27
27
  export type CallsServiceConfig = {
28
28
  apiBase: string;
29
- apiExtraParams?: string;
29
+ apiExtraProps?: string;
30
30
  iceServers?: RTCIceServer[];
31
31
  };
32
32
 
33
33
  export type HistoryRecord =
34
34
  | {
35
+ endpoint: string;
35
36
  type: 'request';
36
37
  time: string;
37
38
  method: string;
38
39
  body: any;
39
40
  }
40
41
  | {
42
+ endpoint: string;
41
43
  type: 'response';
42
44
  time: string;
43
45
  status: number;
@@ -73,7 +75,10 @@ export class CallsServicePeer extends Resource {
73
75
  pullTrackDispatcher = new BulkRequestDispatcher<
74
76
  TrackObject,
75
77
  {
76
- trackMap: Map<TrackObject, { resolvedTrack: Promise<MediaStreamTrack>; mid: string }>;
78
+ /**
79
+ * trackName -> { resolvedTrack, mid }
80
+ */
81
+ trackMap: Map<string, { resolvedTrack: Promise<MediaStreamTrack>; mid: string }>;
77
82
  }
78
83
  >(32);
79
84
 
@@ -112,7 +117,7 @@ export class CallsServicePeer extends Resource {
112
117
  });
113
118
  peerConnection.addEventListener('connectionstatechange', () => {
114
119
  if (peerConnection.connectionState === 'failed' || peerConnection.connectionState === 'closed') {
115
- log.warn('calls connection failed', { state: peerConnection.connectionState });
120
+ log.info('calls connection failed', { state: peerConnection.connectionState });
116
121
  void this._persistentLifecycle.scheduleRestart();
117
122
  }
118
123
  });
@@ -121,7 +126,7 @@ export class CallsServicePeer extends Resource {
121
126
  peerConnection.addEventListener('iceconnectionstatechange', () => {
122
127
  clearTimeout(iceTimeout);
123
128
  if (peerConnection.iceConnectionState === 'failed' || peerConnection.iceConnectionState === 'closed') {
124
- log.warn('calls connection to ICEs failed', { state: peerConnection.iceConnectionState });
129
+ log.info('calls connection to ICEs failed', { state: peerConnection.iceConnectionState });
125
130
  void this._persistentLifecycle.scheduleRestart();
126
131
  } else if (peerConnection.iceConnectionState === 'disconnected') {
127
132
  // TODO(mykola): we should start to inspect the connection stats from here on for
@@ -134,7 +139,7 @@ export class CallsServicePeer extends Resource {
134
139
  return;
135
140
  }
136
141
 
137
- log.warn('calls iceConnectionState timed out', { state: peerConnection.iceConnectionState, timeoutSeconds });
142
+ log.info('calls iceConnectionState timed out', { state: peerConnection.iceConnectionState, timeoutSeconds });
138
143
  void this._persistentLifecycle.scheduleRestart();
139
144
  }, timeoutSeconds * 1_000);
140
145
  }
@@ -151,6 +156,7 @@ export class CallsServicePeer extends Resource {
151
156
 
152
157
  private async _fetch<T extends ErrorResponse>(relativePath: string, requestInit?: RequestInit): Promise<T> {
153
158
  this.history.push({
159
+ endpoint: relativePath,
154
160
  type: 'request',
155
161
  time: new Date().toISOString(),
156
162
  method: requestInit?.method ?? 'GET',
@@ -166,6 +172,7 @@ export class CallsServicePeer extends Resource {
166
172
  try {
167
173
  const data = (await response.clone().json()) as T;
168
174
  this.history.push({
175
+ endpoint: relativePath,
169
176
  type: 'response',
170
177
  time: new Date().toISOString(),
171
178
  status: response.status,
@@ -179,6 +186,7 @@ export class CallsServicePeer extends Resource {
179
186
  } catch (error) {
180
187
  const text = await response.text();
181
188
  this.history.push({
189
+ endpoint: relativePath,
182
190
  type: 'response',
183
191
  time: new Date().toISOString(),
184
192
  status: response.status,
@@ -200,11 +208,11 @@ export class CallsServicePeer extends Resource {
200
208
  sessionId,
201
209
  trackName,
202
210
  }: {
211
+ ctx: Context;
203
212
  peerConnection: RTCPeerConnection;
204
213
  transceiver: RTCRtpTransceiver;
205
214
  sessionId: string;
206
215
  trackName: string;
207
- ctx?: Context;
208
216
  }): Promise<TrackObject | void> {
209
217
  log.verbose('pushing track ', trackName);
210
218
  const pushedTrackPromise = this.pushTrackDispatcher
@@ -242,9 +250,13 @@ export class CallsServicePeer extends Resource {
242
250
  };
243
251
  }),
244
252
  )
245
- .then(({ tracks }) => {
253
+ .then(async ({ tracks }) => {
246
254
  const trackData = tracks.find((t) => t.mid === transceiver.mid);
247
255
  if (trackData) {
256
+ // we wait for the transceiver to start sending data before we emit
257
+ // the track metadata to ensure that the track will be able to be
258
+ // pulled before making the metadata available to anyone else.
259
+ // await waitForTransceiverToSendData(ctx, transceiver);
248
260
  return {
249
261
  ...trackData,
250
262
  sessionId,
@@ -253,9 +265,6 @@ export class CallsServicePeer extends Resource {
253
265
  } else {
254
266
  log.error('missing track data');
255
267
  }
256
- })
257
- .catch((err) => {
258
- log.catch(err);
259
268
  });
260
269
 
261
270
  const onDispose = async () => {
@@ -277,8 +286,8 @@ export class CallsServicePeer extends Resource {
277
286
  previousTrack,
278
287
  }: {
279
288
  track: MediaStreamTrack | null;
289
+ ctx: Context;
280
290
  encodings?: RTCRtpEncodingParameters[];
281
- ctx?: Context;
282
291
  previousTrack?: TrackObject;
283
292
  }): Promise<TrackObject | undefined> {
284
293
  await this.waitUntilOpen();
@@ -354,14 +363,14 @@ export class CallsServicePeer extends Resource {
354
363
  );
355
364
 
356
365
  if (pulledTrackData && pulledTrackData.mid) {
357
- acc.set(track, {
366
+ acc.set(track.trackName!, {
358
367
  mid: pulledTrackData.mid,
359
368
  resolvedTrack: resolveTrack(peerConnection, (t) => t.mid === pulledTrackData.mid),
360
369
  });
361
370
  }
362
371
 
363
372
  return acc;
364
- }, new Map<TrackObject, { resolvedTrack: Promise<MediaStreamTrack>; mid: string }>());
373
+ }, new Map<string, { resolvedTrack: Promise<MediaStreamTrack>; mid: string }>());
365
374
 
366
375
  if (newTrackResponse.requiresImmediateRenegotiation) {
367
376
  await peerConnection.setRemoteDescription(new RTCSessionDescription(newTrackResponse.sessionDescription));
@@ -392,7 +401,7 @@ export class CallsServicePeer extends Resource {
392
401
  }),
393
402
  )
394
403
  .then(({ trackMap }) => {
395
- const trackInfo = trackMap.get(trackData);
404
+ const trackInfo = trackMap.get(trackData.trackName!);
396
405
  if (trackInfo) {
397
406
  return trackInfo.resolvedTrack
398
407
  .then((track) => {
@@ -401,7 +410,7 @@ export class CallsServicePeer extends Resource {
401
410
  })
402
411
  .catch((err) => log.catch(err));
403
412
  } else {
404
- log.error('missing track info');
413
+ log.info('missing track info', { trackData, availableTracks: Array.from(trackMap.keys()) });
405
414
  }
406
415
  });
407
416
 
@@ -525,3 +534,49 @@ const peerConnectionIsConnected = async (peerConnection: RTCPeerConnection) => {
525
534
  await connected;
526
535
  }
527
536
  };
537
+
538
+ const INITIAL_DELAY = 50;
539
+ const MAX_DELAY = 500;
540
+ const MAX_RETRIES = 20;
541
+ const WAIT_FOR_DATA_TIMEOUT = 10_000;
542
+
543
+ const waitForTransceiverToSendData = async (ctx: Context, transceiver: RTCRtpTransceiver): Promise<void> => {
544
+ let delay = INITIAL_DELAY;
545
+ let checks = 0;
546
+ const waitForData = new Trigger();
547
+ ctx.onDispose(() => waitForData.throw(new Error('Transceiver was closed')));
548
+
549
+ const checkStats = async () => {
550
+ if (ctx.disposed) {
551
+ return;
552
+ }
553
+
554
+ try {
555
+ const stats = await transceiver.sender.getStats();
556
+ let dataFound = false;
557
+ stats.forEach((stat) => {
558
+ if (stat.type === 'outbound-rtp' && stat.bytesSent > 0) {
559
+ dataFound = true;
560
+ }
561
+ });
562
+
563
+ if (dataFound) {
564
+ waitForData.wake();
565
+ return;
566
+ }
567
+ } catch {
568
+ // Stats might not be available yet, continue checking
569
+ }
570
+ checks++;
571
+ if (checks > MAX_RETRIES) {
572
+ waitForData.throw(new Error('Transceiver did not send data'));
573
+ return;
574
+ }
575
+
576
+ delay = Math.min(delay * 2, MAX_DELAY); // Exponential backoff with max cap
577
+ scheduleTask(ctx, checkStats, delay);
578
+ };
579
+
580
+ void checkStats();
581
+ return waitForData.wait({ timeout: WAIT_FOR_DATA_TIMEOUT });
582
+ };
@@ -3,8 +3,8 @@
3
3
  //
4
4
  //
5
5
 
6
- import { waitForCondition, scheduleTaskInterval } from '@dxos/async';
7
- import { cancelWithContext, type Context } from '@dxos/context';
6
+ import { scheduleTaskInterval, waitForCondition } from '@dxos/async';
7
+ import { type Context, cancelWithContext } from '@dxos/context';
8
8
  import { invariant } from '@dxos/invariant';
9
9
 
10
10
  /**
@@ -30,7 +30,7 @@ export const createBlackCanvasStreamTrack = async ({
30
30
  canvasCtx.fillStyle = 'black';
31
31
  canvasCtx.fillRect(0, 0, canvas.width, canvas.height);
32
32
  };
33
- scheduleTaskInterval(ctx, async () => drawFrame(), 1_000);
33
+ scheduleTaskInterval(ctx, async () => drawFrame(), 200);
34
34
 
35
35
  const track = canvas.captureStream().getVideoTracks()[0];
36
36
  drawFrame();
@@ -40,30 +40,86 @@ 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.
46
60
  */
47
61
  export const createInaudibleAudioStreamTrack = async ({ ctx }: { ctx: Context }): Promise<MediaStreamTrack> => {
48
62
  const audioContext = new window.AudioContext();
63
+
49
64
  const oscillator = audioContext.createOscillator();
50
65
  oscillator.type = 'triangle';
51
-
52
- // set to 0.1 to make inaudible
53
- oscillator.frequency.setValueAtTime(0.1, audioContext.currentTime);
66
+ oscillator.frequency.setValueAtTime(20, audioContext.currentTime);
54
67
 
55
68
  const gainNode = audioContext.createGain();
56
- // even w/ gain at 0 some packets are sent
57
69
  gainNode.gain.setValueAtTime(0, audioContext.currentTime);
58
-
59
70
  oscillator.connect(gainNode);
60
71
 
61
72
  const destination = audioContext.createMediaStreamDestination();
62
73
  gainNode.connect(destination);
63
74
 
64
- oscillator.start();
75
+ let oscillatorStarted = false;
76
+ const ensureOscillatorStarted = () => {
77
+ if (oscillatorStarted) {
78
+ return;
79
+ }
80
+ oscillator.start();
81
+ oscillatorStarted = true;
82
+ };
83
+
84
+ const stateChangeHandler = () => {
85
+ if (audioContext.state === 'running') {
86
+ audioContextStartedPreviously = true;
87
+ ensureOscillatorStarted();
88
+ }
89
+
90
+ if (audioContext.state === 'suspended' || (audioContext.state as string) === 'interrupted') {
91
+ resumeAudioContext();
92
+ }
93
+ };
94
+
95
+ audioContext.addEventListener('statechange', stateChangeHandler);
96
+
97
+ const resumeAudioContext = () => {
98
+ void audioContext.resume().then(() => {
99
+ cleanUpUserGestureListeners();
100
+ });
101
+ };
102
+
103
+ const cleanUpUserGestureListeners = () => {
104
+ userGestureEvents.forEach((gesture) => {
105
+ document.removeEventListener(gesture, resumeAudioContext, {
106
+ capture: true,
107
+ });
108
+ });
109
+ };
110
+
111
+ if (audioContextStartedPreviously) {
112
+ resumeAudioContext();
113
+ } else {
114
+ userGestureEvents.forEach((gesture) => {
115
+ document.addEventListener(gesture, resumeAudioContext, {
116
+ capture: true,
117
+ });
118
+ });
119
+ }
65
120
 
66
121
  ctx.onDispose(async () => {
122
+ cleanUpUserGestureListeners();
67
123
  oscillator.disconnect();
68
124
  oscillator.stop();
69
125
  await audioContext.close();
@@ -27,8 +27,8 @@ export class FIFOScheduler {
27
27
  }
28
28
 
29
29
  // TODO(mykola): Reconcile with @dxos/async task scheduling.
30
- export class BulkRequestDispatcher<RequestEntryParams, BulkResponse> {
31
- #currentBatch: RequestEntryParams[];
30
+ export class BulkRequestDispatcher<RequestEntryProps, BulkResponse> {
31
+ #currentBatch: RequestEntryProps[];
32
32
  #currentBulkResponse: Promise<BulkResponse> | null;
33
33
  #batchSizeLimit: number;
34
34
 
@@ -43,8 +43,8 @@ export class BulkRequestDispatcher<RequestEntryParams, BulkResponse> {
43
43
  * At the event loop iteration end, the accumulated entries will be dispatched as a bulk request.
44
44
  */
45
45
  doBulkRequest(
46
- params: RequestEntryParams,
47
- bulkRequestFunc: (bulkCopy: RequestEntryParams[]) => Promise<BulkResponse>,
46
+ params: RequestEntryProps,
47
+ bulkRequestFunc: (bulkCopy: RequestEntryProps[]) => Promise<BulkResponse>,
48
48
  ): Promise<BulkResponse> {
49
49
  if (this.#currentBatch.length >= this.#batchSizeLimit) {
50
50
  // If it reaches the batch size limit, we make another bulk request.
@@ -0,0 +1,230 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
7
+
8
+ import { scheduleTask, sleep } from '@dxos/async';
9
+ import { Context } from '@dxos/context';
10
+ import { invariant } from '@dxos/invariant';
11
+ import { log } from '@dxos/log';
12
+ import { Config, useConfig } from '@dxos/react-client';
13
+ import { withClientProvider } from '@dxos/react-client/testing';
14
+ import { Button } from '@dxos/react-ui';
15
+ import { JsonHighlighter } from '@dxos/react-ui-syntax-highlighter';
16
+ import { withTheme } from '@dxos/react-ui/testing';
17
+
18
+ const testVideo = new URL('../testing/video.mp4', import.meta.url).href;
19
+
20
+ import { useBlackCanvasStreamTrack, useInaudibleAudioStreamTrack, useVideoStreamTrack } from '#hooks';
21
+
22
+ import { CALLS_URL, CallsServicePeer, type TrackObject } from './calls';
23
+
24
+ // TODO(burdon): THIS IS TOO COMPLEX FOR A TEST SETUP.
25
+ const pushAndPullTrack = (mediaStreamTrack?: MediaStreamTrack) => {
26
+ const config = useConfig();
27
+ const callsConfig = {
28
+ iceServers: config.get('runtime.services.ice'),
29
+ apiBase: `${CALLS_URL}/api/calls`,
30
+ };
31
+ const peerPush = useMemo(() => new CallsServicePeer(callsConfig), []);
32
+ const peerPull = useMemo(() => new CallsServicePeer(callsConfig), []);
33
+ const [metrics, setMetrics] = useState<Record<string, any>>({});
34
+ const trackInfo = useRef<TrackObject | undefined>(undefined);
35
+ const pullCtx = useRef<Context | undefined>(undefined);
36
+ const [pulledTrack, setPulledTrack] = useState<MediaStreamTrack | undefined>(undefined);
37
+ const hadRun = useRef(false);
38
+
39
+ const deps: any[] = [];
40
+ // Push/pull video stream track to cloudflare.
41
+ useEffect(() => {
42
+ if (hadRun.current || !mediaStreamTrack || !peerPush || !peerPull) {
43
+ return;
44
+ }
45
+ hadRun.current = true;
46
+ const ctx = Context.default();
47
+ log.info('setting up ctx', { ctx, mediaStreamTrack, peerPush, peerPull });
48
+ deps.push([ctx, mediaStreamTrack, peerPush, peerPull]);
49
+ ctx.onDispose(() => {
50
+ log.info('disposing ctx', {});
51
+ });
52
+ scheduleTask(
53
+ ctx,
54
+ async () => {
55
+ log.info('starting push/pull', { mediaStreamTrack });
56
+ await peerPush.open();
57
+ await peerPull.open();
58
+ ctx.onDispose(() => {
59
+ void peerPush.close();
60
+ void peerPull.close();
61
+ });
62
+
63
+ // Push track to cloudflare.
64
+ performance.mark('push:begin');
65
+ log.info('pushing track', { track: mediaStreamTrack });
66
+ trackInfo.current = await peerPush.pushTrack({ track: mediaStreamTrack, ctx: Context.default() });
67
+ performance.mark('push:end');
68
+ const pushTime = performance.measure('push', 'push:begin', 'push:end').duration;
69
+ log.info('successfully pushed track', { pushTime, trackInfo: trackInfo.current });
70
+ setMetrics((prev) => ({ ...prev, 'time to push track [ms]': Math.round(pushTime) }));
71
+
72
+ // Pull track from cloudflare.
73
+ performance.mark('pullTrack:begin');
74
+ pullCtx.current = Context.default();
75
+ let retries = 0;
76
+ let pulledTrack: MediaStreamTrack | undefined;
77
+ while (!pulledTrack && retries < 3) {
78
+ retries++;
79
+ log.info('pulling track', {
80
+ trackData: { ...trackInfo.current!, mid: undefined },
81
+ retries,
82
+ pulledTrack,
83
+ });
84
+ pulledTrack = await peerPull.pullTrack({
85
+ trackData: { ...trackInfo.current!, mid: undefined },
86
+ ctx: pullCtx.current,
87
+ });
88
+ await sleep(200);
89
+ }
90
+ invariant(pulledTrack);
91
+ setPulledTrack(pulledTrack);
92
+ performance.mark('pullTrack:end');
93
+ const pullTime = performance.measure('pullTrack', 'pullTrack:begin', 'pullTrack:end').duration;
94
+ setMetrics((prev) => ({ ...prev, 'time to pull track [ms]': Math.round(pullTime) }));
95
+ log.info('successfully pulled track', { pullTime, pulledTrack });
96
+ },
97
+ 1000,
98
+ );
99
+
100
+ return () => {
101
+ void ctx.dispose();
102
+ };
103
+ }, [mediaStreamTrack, peerPush, peerPull]);
104
+
105
+ const rePullTrack = useCallback(async () => {
106
+ performance.mark('rePullVideo:begin');
107
+ if (!pulledTrack) {
108
+ log.info('no pulled track, skipping re-pull', { pulledTrack });
109
+ return;
110
+ }
111
+ pulledTrack.stop();
112
+ await pullCtx.current!.dispose();
113
+ pullCtx.current = Context.default();
114
+ const newPulledTrack = await peerPull.pullTrack({
115
+ trackData: { ...trackInfo.current!, mid: undefined },
116
+ ctx: pullCtx.current,
117
+ });
118
+ invariant(newPulledTrack);
119
+ setPulledTrack(newPulledTrack);
120
+ performance.mark('rePullVideo:end');
121
+ const rePullTime = performance.measure('rePullVideo', 'rePullVideo:begin', 'rePullVideo:end').duration;
122
+ setMetrics((prev) => ({ ...prev, 'time to re-pull video [ms]': Math.round(rePullTime) }));
123
+ }, [peerPull, trackInfo.current, pullCtx.current, pulledTrack]);
124
+
125
+ return {
126
+ pulledTrack,
127
+ rePullTrack,
128
+ metrics,
129
+ pushService: peerPush,
130
+ pullService: peerPull,
131
+ };
132
+ };
133
+
134
+ type DefaultStoryProps = { source: string };
135
+
136
+ const DefaultStory = ({ source }: DefaultStoryProps) => {
137
+ const pushVideoElement = useRef<HTMLVideoElement>(null);
138
+ const pullVideoElement = useRef<HTMLVideoElement>(null);
139
+ // Get video stream track.
140
+ const videoStreamTrack = useVideoStreamTrack(pushVideoElement, source);
141
+ const { pulledTrack, rePullTrack, metrics } = pushAndPullTrack(videoStreamTrack);
142
+ const hadRun = useRef(false);
143
+
144
+ // Push/pull video stream track to cloudflare.
145
+ useEffect(() => {
146
+ if (!pulledTrack || hadRun.current) {
147
+ return;
148
+ }
149
+ hadRun.current = true;
150
+ const ctx = Context.default();
151
+ scheduleTask(ctx, async () => {
152
+ pullVideoElement.current!.srcObject = new MediaStream([pulledTrack]);
153
+ await pullVideoElement.current!.play();
154
+ });
155
+
156
+ return () => {
157
+ void ctx.dispose();
158
+ };
159
+ }, [pulledTrack]);
160
+
161
+ return (
162
+ <div className='grid grid-rows-3 gap-4 items-center'>
163
+ <video ref={pushVideoElement} muted autoPlay loop />
164
+ <div className='flex flex-col gap-4'>
165
+ <video ref={pullVideoElement} muted />
166
+ <Button disabled={!pulledTrack} onClick={rePullTrack}>
167
+ Re-pull video
168
+ </Button>
169
+ </div>
170
+ <JsonHighlighter data={metrics} />
171
+ </div>
172
+ );
173
+ };
174
+
175
+ const meta = {
176
+ title: 'plugins/plugin-thread/experimental/Calls',
177
+ render: DefaultStory,
178
+ decorators: [
179
+ withTheme(),
180
+ withClientProvider({
181
+ config: new Config({
182
+ runtime: {
183
+ services: {
184
+ iceProviders: [{ urls: 'https://edge.dxos.workers.dev/ice' }],
185
+ },
186
+ },
187
+ }),
188
+ }),
189
+ ],
190
+ parameters: {
191
+ layout: 'centered',
192
+ },
193
+ } satisfies Meta<typeof DefaultStory>;
194
+
195
+ export default meta;
196
+
197
+ type Story = StoryObj<typeof meta>;
198
+
199
+ export const Default: Story = {
200
+ args: {
201
+ source: testVideo,
202
+ },
203
+ };
204
+
205
+ export const InaudibleAudioStreamTrack = {
206
+ render: () => {
207
+ const audioStreamTrack = useInaudibleAudioStreamTrack();
208
+ const { rePullTrack, metrics } = pushAndPullTrack(audioStreamTrack);
209
+
210
+ return (
211
+ <div className='flex flex-col gap-4 items-center'>
212
+ <JsonHighlighter data={metrics} />
213
+ <Button onClick={rePullTrack}>Re-pull audio</Button>
214
+ </div>
215
+ );
216
+ },
217
+ };
218
+
219
+ export const BlackVideoStreamTrack = {
220
+ render: () => {
221
+ const videoStreamTrack = useBlackCanvasStreamTrack();
222
+ const { rePullTrack, metrics } = pushAndPullTrack(videoStreamTrack);
223
+ return (
224
+ <div className='flex flex-col gap-4 items-center'>
225
+ <JsonHighlighter data={metrics} />
226
+ <Button onClick={rePullTrack}>Re-pull audio</Button>
227
+ </div>
228
+ );
229
+ },
230
+ };