@dxos/plugin-thread 0.8.4-main.abd8ff62ef → 0.8.4-main.bc2380dfbc

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 (431) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/neutral/ChannelArticle-ACZD7YFT.mjs +28 -0
  4. package/dist/lib/neutral/ChannelArticle-ACZD7YFT.mjs.map +7 -0
  5. package/dist/lib/neutral/ChannelChat-6YTD5HWL.mjs +10 -0
  6. package/dist/lib/neutral/ThreadCompanion-NQWPS2H6.mjs +208 -0
  7. package/dist/lib/neutral/ThreadCompanion-NQWPS2H6.mjs.map +7 -0
  8. package/dist/lib/neutral/ThreadContainer-XYEPEOSD.mjs +61 -0
  9. package/dist/lib/neutral/ThreadContainer-XYEPEOSD.mjs.map +7 -0
  10. package/dist/lib/neutral/ThreadPlugin.mjs +80 -0
  11. package/dist/lib/neutral/ThreadPlugin.mjs.map +7 -0
  12. package/dist/lib/neutral/ThreadPlugin.node.mjs +40 -0
  13. package/dist/lib/neutral/ThreadPlugin.node.mjs.map +7 -0
  14. package/dist/lib/neutral/ThreadPlugin.workerd.mjs +24 -0
  15. package/dist/lib/neutral/ThreadPlugin.workerd.mjs.map +7 -0
  16. package/dist/lib/neutral/ThreadSettings-5MKTDK3A.mjs +15 -0
  17. package/dist/lib/neutral/ThreadSettings-5MKTDK3A.mjs.map +7 -0
  18. package/dist/lib/{browser/add-message-LRVGIHDH.mjs → neutral/add-message-FBIROBEZ.mjs} +8 -10
  19. package/dist/lib/neutral/add-message-FBIROBEZ.mjs.map +7 -0
  20. package/dist/lib/neutral/app-graph-builder-7Q6MA6RT.mjs +120 -0
  21. package/dist/lib/neutral/app-graph-builder-7Q6MA6RT.mjs.map +7 -0
  22. package/dist/lib/{browser/append-channel-message-CO3M6FSA.mjs → neutral/append-channel-message-FTFAD3PK.mjs} +5 -5
  23. package/dist/lib/neutral/append-channel-message-FTFAD3PK.mjs.map +7 -0
  24. package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs +15 -0
  25. package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs.map +7 -0
  26. package/dist/lib/neutral/blueprints/index.mjs +8 -0
  27. package/dist/lib/neutral/capabilities/index.mjs +25 -0
  28. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  29. package/dist/lib/{browser/blueprints/index.mjs → neutral/chunk-5T5LPLBN.mjs} +4 -5
  30. package/dist/lib/neutral/chunk-5T5LPLBN.mjs.map +7 -0
  31. package/dist/lib/neutral/chunk-7GHUS3IX.mjs +20 -0
  32. package/dist/lib/neutral/chunk-7GHUS3IX.mjs.map +7 -0
  33. package/dist/lib/neutral/chunk-D5LGFCUY.mjs +55 -0
  34. package/dist/lib/neutral/chunk-D5LGFCUY.mjs.map +7 -0
  35. package/dist/lib/neutral/chunk-JLY4NVTA.mjs +38 -0
  36. package/dist/lib/neutral/chunk-JLY4NVTA.mjs.map +7 -0
  37. package/dist/lib/neutral/chunk-KRXHIW4P.mjs +164 -0
  38. package/dist/lib/neutral/chunk-KRXHIW4P.mjs.map +7 -0
  39. package/dist/lib/{browser/chunk-TPNZ43NB.mjs → neutral/chunk-PE7IH7EL.mjs} +86 -73
  40. package/dist/lib/neutral/chunk-PE7IH7EL.mjs.map +7 -0
  41. package/dist/lib/neutral/chunk-QFDT33VT.mjs +69 -0
  42. package/dist/lib/neutral/chunk-QFDT33VT.mjs.map +7 -0
  43. package/dist/lib/neutral/chunk-QMLVLKE3.mjs +8 -0
  44. package/dist/lib/neutral/chunk-QMLVLKE3.mjs.map +7 -0
  45. package/dist/lib/neutral/components/index.mjs +539 -0
  46. package/dist/lib/neutral/components/index.mjs.map +7 -0
  47. package/dist/lib/neutral/containers/index.mjs +15 -0
  48. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  49. package/dist/lib/{browser/create-BTGLHLBA.mjs → neutral/create-OAQJ6LXN.mjs} +7 -10
  50. package/dist/lib/neutral/create-OAQJ6LXN.mjs.map +7 -0
  51. package/dist/lib/{browser/create-channel-ZXKSLHGN.mjs → neutral/create-channel-3E4FJ662.mjs} +4 -4
  52. package/dist/lib/neutral/create-channel-3E4FJ662.mjs.map +7 -0
  53. package/dist/lib/neutral/create-object-HIEWSBZB.mjs +27 -0
  54. package/dist/lib/neutral/create-object-HIEWSBZB.mjs.map +7 -0
  55. package/dist/lib/{browser/create-proposals-AV5CREPV.mjs → neutral/create-proposals-GRYZXRMV.mjs} +4 -4
  56. package/dist/lib/neutral/create-proposals-GRYZXRMV.mjs.map +7 -0
  57. package/dist/lib/{browser/delete-GLYEP7NE.mjs → neutral/delete-HCCG5RVR.mjs} +7 -9
  58. package/dist/lib/neutral/delete-HCCG5RVR.mjs.map +7 -0
  59. package/dist/lib/{browser/delete-message-RQ72ZY5D.mjs → neutral/delete-message-DHFRACB4.mjs} +6 -7
  60. package/dist/lib/neutral/delete-message-DHFRACB4.mjs.map +7 -0
  61. package/dist/lib/neutral/hooks/index.mjs +10 -0
  62. package/dist/lib/neutral/index.mjs +28 -0
  63. package/dist/lib/neutral/index.mjs.map +7 -0
  64. package/dist/lib/neutral/markdown-BUORNCPG.mjs +83 -0
  65. package/dist/lib/neutral/markdown-BUORNCPG.mjs.map +7 -0
  66. package/dist/lib/neutral/meta.json +1 -0
  67. package/dist/lib/neutral/meta.mjs +10 -0
  68. package/dist/lib/neutral/meta.mjs.map +7 -0
  69. package/dist/lib/{browser/on-create-space-SPE3QVFZ.mjs → neutral/on-create-space-OEBRKOAM.mjs} +5 -6
  70. package/dist/lib/neutral/on-create-space-OEBRKOAM.mjs.map +7 -0
  71. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs +13 -0
  72. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs.map +7 -0
  73. package/dist/lib/neutral/operations/index.mjs +8 -0
  74. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  75. package/dist/lib/neutral/plugin.mjs +16 -0
  76. package/dist/lib/neutral/plugin.mjs.map +7 -0
  77. package/dist/lib/neutral/react-surface-XY23GVZH.mjs +76 -0
  78. package/dist/lib/neutral/react-surface-XY23GVZH.mjs.map +7 -0
  79. package/dist/lib/{browser/restore-VX7FLZOZ.mjs → neutral/restore-P4ZLXLF7.mjs} +5 -5
  80. package/dist/lib/neutral/restore-P4ZLXLF7.mjs.map +7 -0
  81. package/dist/lib/{browser/restore-message-D65NSWUA.mjs → neutral/restore-message-AUBOP2DF.mjs} +5 -5
  82. package/dist/lib/neutral/restore-message-AUBOP2DF.mjs.map +7 -0
  83. package/dist/lib/{browser/select-AT4L7EBU.mjs → neutral/select-LIVAMBCE.mjs} +6 -8
  84. package/dist/lib/neutral/select-LIVAMBCE.mjs.map +7 -0
  85. package/dist/lib/neutral/settings-HK4EB6TF.mjs +30 -0
  86. package/dist/lib/neutral/settings-HK4EB6TF.mjs.map +7 -0
  87. package/dist/lib/neutral/state-UU7VEAKV.mjs +22 -0
  88. package/dist/lib/neutral/state-UU7VEAKV.mjs.map +7 -0
  89. package/dist/lib/neutral/testing/index.mjs +58 -0
  90. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  91. package/dist/lib/{browser/toggle-resolved-JD3D4WBZ.mjs → neutral/toggle-resolved-RQBDQZSV.mjs} +5 -5
  92. package/dist/lib/neutral/toggle-resolved-RQBDQZSV.mjs.map +7 -0
  93. package/dist/lib/{browser → neutral}/translations.mjs +2 -2
  94. package/dist/lib/neutral/translations.mjs.map +7 -0
  95. package/dist/lib/neutral/types/index.mjs +12 -0
  96. package/dist/lib/neutral/types/index.mjs.map +7 -0
  97. package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs +54 -0
  98. package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs.map +7 -0
  99. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  100. package/dist/types/src/ThreadPlugin.node.d.ts.map +1 -1
  101. package/dist/types/src/ThreadPlugin.workerd.d.ts +4 -0
  102. package/dist/types/src/ThreadPlugin.workerd.d.ts.map +1 -0
  103. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  104. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  105. package/dist/types/src/capabilities/index.d.ts +7 -6
  106. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  107. package/dist/types/src/capabilities/markdown.d.ts +1 -1
  108. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  109. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  110. package/dist/types/src/components/Chat/Chat.d.ts +8 -1
  111. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -1
  112. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts.map +1 -1
  113. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts.map +1 -1
  114. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts.map +1 -1
  115. package/dist/types/src/components/index.d.ts +0 -1
  116. package/dist/types/src/components/index.d.ts.map +1 -1
  117. package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts +13 -0
  118. package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts.map +1 -0
  119. package/dist/types/src/containers/{ChannelContainer/ChannelContainer.stories.d.ts → ChannelArticle/ChannelArticle.stories.d.ts} +4 -4
  120. package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts.map +1 -0
  121. package/dist/types/src/containers/ChannelArticle/index.d.ts +2 -0
  122. package/dist/types/src/containers/{CallDebugPanel → ChannelArticle}/index.d.ts.map +1 -1
  123. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts +4 -0
  124. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts.map +1 -1
  125. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts.map +1 -1
  126. package/dist/types/src/containers/index.d.ts +1 -3
  127. package/dist/types/src/containers/index.d.ts.map +1 -1
  128. package/dist/types/src/extensions/threads.d.ts +1 -1
  129. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  130. package/dist/types/src/hooks/index.d.ts +0 -4
  131. package/dist/types/src/hooks/index.d.ts.map +1 -1
  132. package/dist/types/src/index.d.ts +3 -5
  133. package/dist/types/src/index.d.ts.map +1 -1
  134. package/dist/types/src/meta.d.ts.map +1 -1
  135. package/dist/types/src/operations/add-message.d.ts +2 -2
  136. package/dist/types/src/operations/add-message.d.ts.map +1 -1
  137. package/dist/types/src/operations/append-channel-message.d.ts +2 -2
  138. package/dist/types/src/operations/append-channel-message.d.ts.map +1 -1
  139. package/dist/types/src/operations/create-channel.d.ts +2 -2
  140. package/dist/types/src/operations/create-channel.d.ts.map +1 -1
  141. package/dist/types/src/operations/create-proposals.d.ts +2 -2
  142. package/dist/types/src/operations/create-proposals.d.ts.map +1 -1
  143. package/dist/types/src/operations/create.d.ts +2 -2
  144. package/dist/types/src/operations/create.d.ts.map +1 -1
  145. package/dist/types/src/operations/delete-message.d.ts +2 -2
  146. package/dist/types/src/operations/delete-message.d.ts.map +1 -1
  147. package/dist/types/src/operations/delete.d.ts +2 -2
  148. package/dist/types/src/operations/delete.d.ts.map +1 -1
  149. package/dist/types/src/operations/index.d.ts +0 -1
  150. package/dist/types/src/operations/index.d.ts.map +1 -1
  151. package/dist/types/src/operations/on-create-space.d.ts +2 -2
  152. package/dist/types/src/operations/on-create-space.d.ts.map +1 -1
  153. package/dist/types/src/operations/restore-message.d.ts +2 -2
  154. package/dist/types/src/operations/restore-message.d.ts.map +1 -1
  155. package/dist/types/src/operations/restore.d.ts +2 -2
  156. package/dist/types/src/operations/restore.d.ts.map +1 -1
  157. package/dist/types/src/operations/select.d.ts +2 -2
  158. package/dist/types/src/operations/select.d.ts.map +1 -1
  159. package/dist/types/src/operations/toggle-resolved.d.ts +2 -2
  160. package/dist/types/src/operations/toggle-resolved.d.ts.map +1 -1
  161. package/dist/types/src/plugin.d.ts +4 -0
  162. package/dist/types/src/plugin.d.ts.map +1 -0
  163. package/dist/types/src/translations.d.ts.map +1 -1
  164. package/dist/types/src/types/ThreadCapabilities.d.ts +13 -0
  165. package/dist/types/src/types/ThreadCapabilities.d.ts.map +1 -0
  166. package/dist/types/src/{operations/definitions.d.ts → types/ThreadOperation.d.ts} +1 -1
  167. package/dist/types/src/types/ThreadOperation.d.ts.map +1 -0
  168. package/dist/types/src/types/index.d.ts +3 -1
  169. package/dist/types/src/types/index.d.ts.map +1 -1
  170. package/dist/types/src/types/types.d.ts +1 -1
  171. package/dist/types/src/types/types.d.ts.map +1 -1
  172. package/dist/types/src/util.d.ts +4 -1
  173. package/dist/types/src/util.d.ts.map +1 -1
  174. package/dist/types/tsconfig.tsbuildinfo +1 -1
  175. package/package.json +123 -99
  176. package/src/ThreadPlugin.node.ts +5 -50
  177. package/src/ThreadPlugin.test.ts +3 -3
  178. package/src/ThreadPlugin.tsx +6 -59
  179. package/src/ThreadPlugin.workerd.ts +20 -0
  180. package/src/blueprints/thread-blueprint.ts +1 -1
  181. package/src/capabilities/app-graph-builder.ts +18 -69
  182. package/src/capabilities/create-object.ts +29 -0
  183. package/src/capabilities/index.ts +1 -2
  184. package/src/capabilities/markdown.ts +1 -1
  185. package/src/capabilities/react-surface.tsx +4 -26
  186. package/src/capabilities/settings.ts +1 -3
  187. package/src/capabilities/undo-mappings.ts +1 -1
  188. package/src/components/Chat/Chat.tsx +52 -12
  189. package/src/components/CommentsPanel/CommentsPanel.stories.tsx +1 -1
  190. package/src/components/CommentsPanel/CommentsPanel.tsx +4 -4
  191. package/src/components/CommentsPanel/CommentsThread.tsx +2 -3
  192. package/src/components/MessagePanel/MessagePanel.tsx +7 -8
  193. package/src/components/ThreadSettings/ThreadSettings.tsx +0 -1
  194. package/src/components/index.ts +0 -1
  195. package/src/containers/{ChannelContainer/ChannelContainer.stories.tsx → ChannelArticle/ChannelArticle.stories.tsx} +10 -10
  196. package/src/containers/ChannelArticle/ChannelArticle.tsx +42 -0
  197. package/src/containers/ChannelArticle/index.ts +5 -0
  198. package/src/containers/ChannelChat/ChannelChat.tsx +12 -2
  199. package/src/containers/ThreadCompanion/ThreadCompanion.tsx +10 -12
  200. package/src/containers/index.ts +1 -3
  201. package/src/extensions/command.ts +1 -1
  202. package/src/extensions/threads.ts +2 -2
  203. package/src/hooks/analytics.ts +1 -1
  204. package/src/hooks/index.ts +0 -5
  205. package/src/index.ts +3 -10
  206. package/src/meta.ts +1 -2
  207. package/src/operations/add-message.ts +4 -4
  208. package/src/operations/append-channel-message.ts +20 -19
  209. package/src/operations/create-channel.ts +2 -2
  210. package/src/operations/create-proposals.ts +2 -2
  211. package/src/operations/create.ts +3 -3
  212. package/src/operations/delete-message.ts +4 -4
  213. package/src/operations/delete.ts +3 -3
  214. package/src/operations/index.ts +0 -2
  215. package/src/operations/on-create-space.ts +3 -3
  216. package/src/operations/restore-message.ts +3 -3
  217. package/src/operations/restore.ts +3 -3
  218. package/src/operations/select.ts +2 -2
  219. package/src/operations/toggle-resolved.ts +3 -3
  220. package/src/plugin.ts +11 -0
  221. package/src/translations.ts +2 -2
  222. package/src/types/ThreadCapabilities.ts +26 -0
  223. package/src/{operations/definitions.ts → types/ThreadOperation.ts} +5 -4
  224. package/src/types/index.ts +4 -1
  225. package/src/types/types.ts +0 -2
  226. package/src/util.ts +36 -4
  227. package/dist/lib/browser/add-message-LRVGIHDH.mjs.map +0 -7
  228. package/dist/lib/browser/append-channel-message-CO3M6FSA.mjs.map +0 -7
  229. package/dist/lib/browser/blueprints/index.mjs.map +0 -7
  230. package/dist/lib/browser/chunk-E4GG3NX2.mjs +0 -29
  231. package/dist/lib/browser/chunk-E4GG3NX2.mjs.map +0 -7
  232. package/dist/lib/browser/chunk-TPNZ43NB.mjs.map +0 -7
  233. package/dist/lib/browser/create-BTGLHLBA.mjs.map +0 -7
  234. package/dist/lib/browser/create-channel-ZXKSLHGN.mjs.map +0 -7
  235. package/dist/lib/browser/create-proposals-AV5CREPV.mjs.map +0 -7
  236. package/dist/lib/browser/delete-GLYEP7NE.mjs.map +0 -7
  237. package/dist/lib/browser/delete-message-RQ72ZY5D.mjs.map +0 -7
  238. package/dist/lib/browser/index.mjs +0 -1821
  239. package/dist/lib/browser/index.mjs.map +0 -7
  240. package/dist/lib/browser/meta.json +0 -1
  241. package/dist/lib/browser/on-create-space-SPE3QVFZ.mjs.map +0 -7
  242. package/dist/lib/browser/operations/index.mjs +0 -13
  243. package/dist/lib/browser/operations/index.mjs.map +0 -7
  244. package/dist/lib/browser/restore-VX7FLZOZ.mjs.map +0 -7
  245. package/dist/lib/browser/restore-message-D65NSWUA.mjs.map +0 -7
  246. package/dist/lib/browser/select-AT4L7EBU.mjs.map +0 -7
  247. package/dist/lib/browser/toggle-resolved-JD3D4WBZ.mjs.map +0 -7
  248. package/dist/lib/browser/translations.mjs.map +0 -7
  249. package/dist/lib/browser/types/index.mjs +0 -10
  250. package/dist/lib/node-esm/add-message-4EAQ2ZPI.mjs +0 -90
  251. package/dist/lib/node-esm/add-message-4EAQ2ZPI.mjs.map +0 -7
  252. package/dist/lib/node-esm/append-channel-message-F7KGBSWP.mjs +0 -41
  253. package/dist/lib/node-esm/append-channel-message-F7KGBSWP.mjs.map +0 -7
  254. package/dist/lib/node-esm/blueprints/index.mjs +0 -38
  255. package/dist/lib/node-esm/blueprints/index.mjs.map +0 -7
  256. package/dist/lib/node-esm/chunk-BVEZBGIY.mjs +0 -30
  257. package/dist/lib/node-esm/chunk-BVEZBGIY.mjs.map +0 -7
  258. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
  259. package/dist/lib/node-esm/chunk-XKUMDYGR.mjs +0 -259
  260. package/dist/lib/node-esm/chunk-XKUMDYGR.mjs.map +0 -7
  261. package/dist/lib/node-esm/create-DEZFPN2Y.mjs +0 -56
  262. package/dist/lib/node-esm/create-DEZFPN2Y.mjs.map +0 -7
  263. package/dist/lib/node-esm/create-channel-6VHTC2OR.mjs +0 -20
  264. package/dist/lib/node-esm/create-channel-6VHTC2OR.mjs.map +0 -7
  265. package/dist/lib/node-esm/create-proposals-P5O2ICOL.mjs +0 -57
  266. package/dist/lib/node-esm/create-proposals-P5O2ICOL.mjs.map +0 -7
  267. package/dist/lib/node-esm/delete-QG45QLPY.mjs +0 -60
  268. package/dist/lib/node-esm/delete-QG45QLPY.mjs.map +0 -7
  269. package/dist/lib/node-esm/delete-message-PGNLB6TL.mjs +0 -56
  270. package/dist/lib/node-esm/delete-message-PGNLB6TL.mjs.map +0 -7
  271. package/dist/lib/node-esm/index.mjs +0 -1822
  272. package/dist/lib/node-esm/index.mjs.map +0 -7
  273. package/dist/lib/node-esm/meta.json +0 -1
  274. package/dist/lib/node-esm/on-create-space-TFBSHWQ4.mjs +0 -25
  275. package/dist/lib/node-esm/on-create-space-TFBSHWQ4.mjs.map +0 -7
  276. package/dist/lib/node-esm/operations/index.mjs +0 -14
  277. package/dist/lib/node-esm/operations/index.mjs.map +0 -7
  278. package/dist/lib/node-esm/restore-E27OAIFJ.mjs +0 -33
  279. package/dist/lib/node-esm/restore-E27OAIFJ.mjs.map +0 -7
  280. package/dist/lib/node-esm/restore-message-J3CH6NGI.mjs +0 -34
  281. package/dist/lib/node-esm/restore-message-J3CH6NGI.mjs.map +0 -7
  282. package/dist/lib/node-esm/select-UU6Q2XAB.mjs +0 -27
  283. package/dist/lib/node-esm/select-UU6Q2XAB.mjs.map +0 -7
  284. package/dist/lib/node-esm/toggle-resolved-VS6NKXL3.mjs +0 -37
  285. package/dist/lib/node-esm/toggle-resolved-VS6NKXL3.mjs.map +0 -7
  286. package/dist/lib/node-esm/translations.mjs +0 -91
  287. package/dist/lib/node-esm/translations.mjs.map +0 -7
  288. package/dist/lib/node-esm/types/index.mjs +0 -11
  289. package/dist/types/src/calls/call-manager.d.ts +0 -87
  290. package/dist/types/src/calls/call-manager.d.ts.map +0 -1
  291. package/dist/types/src/calls/call-swarm-synchronizer.d.ts +0 -66
  292. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +0 -1
  293. package/dist/types/src/calls/index.d.ts +0 -7
  294. package/dist/types/src/calls/index.d.ts.map +0 -1
  295. package/dist/types/src/calls/media-manager.d.ts +0 -60
  296. package/dist/types/src/calls/media-manager.d.ts.map +0 -1
  297. package/dist/types/src/calls/speaking-monitor.d.ts +0 -21
  298. package/dist/types/src/calls/speaking-monitor.d.ts.map +0 -1
  299. package/dist/types/src/calls/types.d.ts +0 -45
  300. package/dist/types/src/calls/types.d.ts.map +0 -1
  301. package/dist/types/src/calls/util/audio.d.ts +0 -6
  302. package/dist/types/src/calls/util/audio.d.ts.map +0 -1
  303. package/dist/types/src/calls/util/calls-service.d.ts +0 -77
  304. package/dist/types/src/calls/util/calls-service.d.ts.map +0 -1
  305. package/dist/types/src/calls/util/history-cache.d.ts +0 -11
  306. package/dist/types/src/calls/util/history-cache.d.ts.map +0 -1
  307. package/dist/types/src/calls/util/index.d.ts +0 -5
  308. package/dist/types/src/calls/util/index.d.ts.map +0 -1
  309. package/dist/types/src/calls/util/media.d.ts +0 -6
  310. package/dist/types/src/calls/util/media.d.ts.map +0 -1
  311. package/dist/types/src/calls/util/stub-media-streams.d.ts +0 -18
  312. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +0 -1
  313. package/dist/types/src/calls/util/task-scheduling.d.ts +0 -17
  314. package/dist/types/src/calls/util/task-scheduling.d.ts.map +0 -1
  315. package/dist/types/src/calls-service.stories.d.ts +0 -23
  316. package/dist/types/src/calls-service.stories.d.ts.map +0 -1
  317. package/dist/types/src/capabilities/call-manager.d.ts +0 -6
  318. package/dist/types/src/capabilities/call-manager.d.ts.map +0 -1
  319. package/dist/types/src/capabilities/react-root.d.ts +0 -9
  320. package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
  321. package/dist/types/src/components/Call/Call.d.ts +0 -45
  322. package/dist/types/src/components/Call/Call.d.ts.map +0 -1
  323. package/dist/types/src/components/Call/Toolbar.d.ts +0 -16
  324. package/dist/types/src/components/Call/Toolbar.d.ts.map +0 -1
  325. package/dist/types/src/components/Call/index.d.ts +0 -3
  326. package/dist/types/src/components/Call/index.d.ts.map +0 -1
  327. package/dist/types/src/components/Lobby/Lobby.d.ts +0 -36
  328. package/dist/types/src/components/Lobby/Lobby.d.ts.map +0 -1
  329. package/dist/types/src/components/Lobby/index.d.ts +0 -2
  330. package/dist/types/src/components/Lobby/index.d.ts.map +0 -1
  331. package/dist/types/src/components/Media/AudioStream.d.ts +0 -6
  332. package/dist/types/src/components/Media/AudioStream.d.ts.map +0 -1
  333. package/dist/types/src/components/Media/VideoObject.d.ts +0 -15
  334. package/dist/types/src/components/Media/VideoObject.d.ts.map +0 -1
  335. package/dist/types/src/components/Media/VideoObject.stories.d.ts +0 -22
  336. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +0 -1
  337. package/dist/types/src/components/Media/index.d.ts +0 -3
  338. package/dist/types/src/components/Media/index.d.ts.map +0 -1
  339. package/dist/types/src/components/Participant/Participant.d.ts +0 -6
  340. package/dist/types/src/components/Participant/Participant.d.ts.map +0 -1
  341. package/dist/types/src/components/Participant/ParticipantGrid.d.ts +0 -11
  342. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +0 -1
  343. package/dist/types/src/components/Participant/index.d.ts +0 -3
  344. package/dist/types/src/components/Participant/index.d.ts.map +0 -1
  345. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts +0 -32
  346. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +0 -1
  347. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +0 -178
  348. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +0 -1
  349. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts +0 -21
  350. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +0 -1
  351. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.d.ts +0 -12
  352. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.d.ts.map +0 -1
  353. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts +0 -164
  354. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts.map +0 -1
  355. package/dist/types/src/components/ResponsiveGrid/index.d.ts +0 -4
  356. package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +0 -1
  357. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts +0 -15
  358. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts.map +0 -1
  359. package/dist/types/src/containers/CallDebugPanel/index.d.ts +0 -2
  360. package/dist/types/src/containers/CallSidebar/CallSidebar.d.ts +0 -3
  361. package/dist/types/src/containers/CallSidebar/CallSidebar.d.ts.map +0 -1
  362. package/dist/types/src/containers/CallSidebar/index.d.ts +0 -2
  363. package/dist/types/src/containers/CallSidebar/index.d.ts.map +0 -1
  364. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts +0 -12
  365. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts.map +0 -1
  366. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts.map +0 -1
  367. package/dist/types/src/containers/ChannelContainer/index.d.ts +0 -2
  368. package/dist/types/src/containers/ChannelContainer/index.d.ts.map +0 -1
  369. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +0 -2
  370. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +0 -1
  371. package/dist/types/src/hooks/useDebugMode.d.ts +0 -2
  372. package/dist/types/src/hooks/useDebugMode.d.ts.map +0 -1
  373. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts +0 -2
  374. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts.map +0 -1
  375. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +0 -3
  376. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +0 -1
  377. package/dist/types/src/operations/definitions.d.ts.map +0 -1
  378. package/dist/types/src/types/capabilities.d.ts +0 -25
  379. package/dist/types/src/types/capabilities.d.ts.map +0 -1
  380. package/src/calls/call-manager.ts +0 -270
  381. package/src/calls/call-swarm-synchronizer.ts +0 -350
  382. package/src/calls/index.ts +0 -10
  383. package/src/calls/media-manager.ts +0 -378
  384. package/src/calls/speaking-monitor.ts +0 -85
  385. package/src/calls/types.ts +0 -74
  386. package/src/calls/util/audio.ts +0 -58
  387. package/src/calls/util/calls-service.ts +0 -582
  388. package/src/calls/util/history-cache.ts +0 -27
  389. package/src/calls/util/index.ts +0 -8
  390. package/src/calls/util/media.ts +0 -52
  391. package/src/calls/util/stub-media-streams.ts +0 -129
  392. package/src/calls/util/task-scheduling.ts +0 -92
  393. package/src/calls-service.stories.tsx +0 -230
  394. package/src/capabilities/call-manager.ts +0 -27
  395. package/src/capabilities/react-root.tsx +0 -20
  396. package/src/components/Call/Call.tsx +0 -93
  397. package/src/components/Call/Toolbar.tsx +0 -199
  398. package/src/components/Call/index.ts +0 -6
  399. package/src/components/Lobby/Lobby.tsx +0 -123
  400. package/src/components/Lobby/index.ts +0 -5
  401. package/src/components/Media/AudioStream.tsx +0 -67
  402. package/src/components/Media/VideoObject.stories.tsx +0 -59
  403. package/src/components/Media/VideoObject.tsx +0 -58
  404. package/src/components/Media/index.ts +0 -6
  405. package/src/components/Participant/Participant.tsx +0 -77
  406. package/src/components/Participant/ParticipantGrid.tsx +0 -88
  407. package/src/components/Participant/index.ts +0 -6
  408. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +0 -158
  409. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +0 -341
  410. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +0 -134
  411. package/src/components/ResponsiveGrid/ResponsivePanel.stories.tsx +0 -54
  412. package/src/components/ResponsiveGrid/ResponsivePanel.tsx +0 -31
  413. package/src/components/ResponsiveGrid/index.ts +0 -7
  414. package/src/containers/CallDebugPanel/CallDebugPanel.tsx +0 -173
  415. package/src/containers/CallDebugPanel/index.ts +0 -5
  416. package/src/containers/CallSidebar/CallSidebar.tsx +0 -18
  417. package/src/containers/CallSidebar/index.ts +0 -5
  418. package/src/containers/ChannelContainer/ChannelContainer.tsx +0 -223
  419. package/src/containers/ChannelContainer/index.ts +0 -5
  420. package/src/hooks/useBlackCanvasStreamTrack.tsx +0 -27
  421. package/src/hooks/useDebugMode.ts +0 -25
  422. package/src/hooks/useInaudibleAudioStreamTrack.tsx +0 -27
  423. package/src/hooks/useVideoStreamTrack.tsx +0 -36
  424. package/src/types/capabilities.ts +0 -37
  425. package/src/typings/peermetrics-webrtc-stats.d.ts +0 -46
  426. package/src/typings.d.ts +0 -8
  427. /package/dist/lib/{browser/chunk-J5LGTIGS.mjs.map → neutral/ChannelChat-6YTD5HWL.mjs.map} +0 -0
  428. /package/dist/lib/{browser/types → neutral/blueprints}/index.mjs.map +0 -0
  429. /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs +0 -0
  430. /package/dist/lib/{node-esm/chunk-HSLMI22Q.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
  431. /package/dist/lib/{node-esm/types → neutral/hooks}/index.mjs.map +0 -0
@@ -1,129 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
- //
5
-
6
- import { scheduleTaskInterval, waitForCondition } from '@dxos/async';
7
- import { type Context, cancelWithContext } from '@dxos/context';
8
- import { invariant } from '@dxos/invariant';
9
-
10
- /**
11
- * Creates a black canvas stream track.
12
- * We need this to to have black rectangle video that is live (have frames) when video feed is disabled.
13
- */
14
- export const createBlackCanvasStreamTrack = async ({
15
- ctx,
16
- width,
17
- height,
18
- }: {
19
- ctx: Context;
20
- width: number;
21
- height: number;
22
- }): Promise<MediaStreamTrack> => {
23
- const canvas = document.createElement('canvas');
24
- canvas.width = width;
25
- canvas.height = height;
26
-
27
- const canvasCtx = canvas.getContext('2d');
28
- invariant(canvasCtx);
29
- const drawFrame = () => {
30
- canvasCtx.fillStyle = 'black';
31
- canvasCtx.fillRect(0, 0, canvas.width, canvas.height);
32
- };
33
- scheduleTaskInterval(ctx, async () => drawFrame(), 200);
34
-
35
- const track = canvas.captureStream().getVideoTracks()[0];
36
- drawFrame();
37
-
38
- await cancelWithContext(ctx, waitForCondition({ condition: () => track.readyState === 'live', timeout: 1_000 }));
39
-
40
- return track;
41
- };
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
-
57
- /**
58
- * Creates an inaudible audio stream track.
59
- * We need this to have audio track available when audio is disabled.
60
- */
61
- export const createInaudibleAudioStreamTrack = async ({ ctx }: { ctx: Context }): Promise<MediaStreamTrack> => {
62
- const audioContext = new window.AudioContext();
63
-
64
- const oscillator = audioContext.createOscillator();
65
- oscillator.type = 'triangle';
66
- oscillator.frequency.setValueAtTime(20, audioContext.currentTime);
67
-
68
- const gainNode = audioContext.createGain();
69
- gainNode.gain.setValueAtTime(0, audioContext.currentTime);
70
- oscillator.connect(gainNode);
71
-
72
- const destination = audioContext.createMediaStreamDestination();
73
- gainNode.connect(destination);
74
-
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
- }
120
-
121
- ctx.onDispose(async () => {
122
- cleanUpUserGestureListeners();
123
- oscillator.disconnect();
124
- oscillator.stop();
125
- await audioContext.close();
126
- });
127
-
128
- return destination.stream.getAudioTracks()[0];
129
- };
@@ -1,92 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- const DefaultBatchSizeLimit = 64;
6
-
7
- type Task<Value = unknown> = () => Promise<Value>;
8
-
9
- export class FIFOScheduler {
10
- #schedulerChain: Promise<void>;
11
-
12
- constructor() {
13
- this.#schedulerChain = Promise.resolve();
14
- }
15
-
16
- schedule<T>(task: Task<T>): Promise<T> {
17
- return new Promise((resolve, reject) => {
18
- this.#schedulerChain = this.#schedulerChain.then(async () => {
19
- try {
20
- resolve(await task());
21
- } catch (error: any) {
22
- reject(error);
23
- }
24
- });
25
- });
26
- }
27
- }
28
-
29
- // TODO(mykola): Reconcile with @dxos/async task scheduling.
30
- export class BulkRequestDispatcher<RequestEntryProps, BulkResponse> {
31
- #currentBatch: RequestEntryProps[];
32
- #currentBulkResponse: Promise<BulkResponse> | null;
33
- #batchSizeLimit: number;
34
-
35
- constructor(batchSizeLimit: number = DefaultBatchSizeLimit) {
36
- this.#currentBatch = [];
37
- this.#currentBulkResponse = null;
38
- this.#batchSizeLimit = batchSizeLimit;
39
- }
40
-
41
- /**
42
- * Returns a bulk response promise.
43
- * At the event loop iteration end, the accumulated entries will be dispatched as a bulk request.
44
- */
45
- doBulkRequest(
46
- params: RequestEntryProps,
47
- bulkRequestFunc: (bulkCopy: RequestEntryProps[]) => Promise<BulkResponse>,
48
- ): Promise<BulkResponse> {
49
- if (this.#currentBatch.length >= this.#batchSizeLimit) {
50
- // If it reaches the batch size limit, we make another bulk request.
51
- this.#currentBatch = [];
52
- this.#currentBulkResponse = null;
53
- }
54
- this.#currentBatch.push(params);
55
- if (this.#currentBulkResponse != null) {
56
- return this.#currentBulkResponse;
57
- }
58
-
59
- // Save the current batch list reference in the function scope because this.#currentBatch could be reset
60
- // if the batch limit is reached.
61
- const batch = this.#currentBatch;
62
- this.#currentBulkResponse = new Promise((resolve, reject) => {
63
- // script
64
- // |
65
- // V
66
- // microtasks (Promise)
67
- // |
68
- // V
69
- // macrotasks (setTimeout)
70
- //
71
- // macrotasks are run in the event loop iteration end, so we use that moment to make the bulkRequestFunc call.
72
- setTimeout(() => {
73
- // When the bulk request happens, the batch list and the response is reset to start another batch.
74
- // Coming callers will wait for a new response promise.
75
- this.#currentBulkResponse = null;
76
-
77
- // We cut here to make the bulk request.
78
- const batchCopy = batch.splice(0, batch.length);
79
- bulkRequestFunc(batchCopy)
80
- .then((result) => {
81
- resolve(result);
82
- })
83
- .catch((err) => {
84
- reject(err);
85
- });
86
- }, 0);
87
- });
88
-
89
- // This bulk response needs to be processed to extract the the result for the entry.
90
- return this.#currentBulkResponse;
91
- }
92
- }
@@ -1,230 +0,0 @@
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
- };
@@ -1,27 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import * as Effect from 'effect/Effect';
6
-
7
- import { Capabilities, Capability } from '@dxos/app-framework';
8
- import { ClientCapabilities } from '@dxos/plugin-client/types';
9
-
10
- import { ThreadCapabilities } from '#types';
11
-
12
- import { CallManager } from '../calls';
13
-
14
- export default Capability.makeModule(
15
- Effect.fnUntraced(function* () {
16
- const client = yield* Capability.get(ClientCapabilities.Client);
17
- const registry = yield* Capability.get(Capabilities.AtomRegistry);
18
- const callManager = new CallManager(client, registry);
19
- yield* Effect.tryPromise(() => callManager.open());
20
-
21
- return Capability.contributes(ThreadCapabilities.CallManager, callManager, () =>
22
- Effect.sync(() => {
23
- void callManager.close();
24
- }),
25
- );
26
- }),
27
- );
@@ -1,20 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import * as Effect from 'effect/Effect';
6
- import React from 'react';
7
-
8
- import { Capabilities, Capability } from '@dxos/app-framework';
9
-
10
- import { Call } from '#components';
11
- import { meta } from '#meta';
12
-
13
- export default Capability.makeModule(() =>
14
- Effect.sync(() => {
15
- return Capability.contributes(Capabilities.ReactRoot, {
16
- id: meta.id,
17
- root: () => <Call.Audio />,
18
- });
19
- }),
20
- );
@@ -1,93 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { useAtomValue } from '@effect-atom/atom-react';
6
- import React, { type PropsWithChildren } from 'react';
7
-
8
- import { useCapability } from '@dxos/app-framework/ui';
9
- import { type ThemedClassName } from '@dxos/react-ui';
10
-
11
- import { useDebugMode } from '#hooks';
12
- import { ThreadCapabilities } from '#types';
13
-
14
- import { AudioStream } from '../Media';
15
- import { ParticipantGrid } from '../Participant';
16
- import { Toolbar, type ToolbarProps } from './Toolbar';
17
-
18
- //
19
- // Root
20
- //
21
-
22
- type CallRootProps = PropsWithChildren<ThemedClassName>;
23
-
24
- const CallRoot = ({ children }: CallRootProps) => {
25
- return <div className='relative dx-container flex flex-col'>{children}</div>;
26
- };
27
-
28
- CallRoot.displayName = 'CallRoot';
29
-
30
- //
31
- // Audio
32
- //
33
-
34
- type CallAudioProps = {};
35
-
36
- const CallAudio = (_props: CallAudioProps) => {
37
- const call = useCapability(ThreadCapabilities.CallManager);
38
- const audioTracksToPlay = useAtomValue(call.audioTracksToPlayAtom);
39
-
40
- return <AudioStream tracks={audioTracksToPlay} />;
41
- };
42
-
43
- CallAudio.displayName = 'CallAudio';
44
-
45
- //
46
- // Room
47
- //
48
-
49
- type CallGridProps = {
50
- fullscreen?: boolean;
51
- };
52
-
53
- const CallGrid = ({ fullscreen }: CallGridProps) => {
54
- const debug = useDebugMode();
55
- const call = useCapability(ThreadCapabilities.CallManager);
56
- const self = useAtomValue(call.selfAtom);
57
- const users = useAtomValue(call.usersAtom);
58
-
59
- return (
60
- <div className='grid grow p-4 dark:bg-neutral-900'>
61
- <ParticipantGrid self={self} users={users} debug={debug} fullscreen={fullscreen} />
62
- </div>
63
- );
64
- };
65
-
66
- CallGrid.displayName = 'CallGrid';
67
-
68
- //
69
- // Toolbar
70
- //
71
-
72
- type CallToolbarProps = Pick<ToolbarProps, 'channel' | 'onLeave'>;
73
-
74
- const CallToolbar = (props: CallToolbarProps) => {
75
- return (
76
- <div className='absolute bottom-0 left-0 right-0 flex justify-center'>
77
- <Toolbar isInRoom {...props} />
78
- </div>
79
- );
80
- };
81
-
82
- CallToolbar.displayName = 'CallToolbar';
83
-
84
- //
85
- // Export
86
- //
87
-
88
- export const Call = {
89
- Root: CallRoot,
90
- Grid: CallGrid,
91
- Audio: CallAudio,
92
- Toolbar: CallToolbar,
93
- };