@dxos/plugin-thread 0.8.4-main.fd6878d → 0.8.4-staging.60fe92afc8

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 (464) hide show
  1. package/LICENSE +102 -5
  2. package/PLUGIN.mdl +75 -0
  3. package/README.md +1 -1
  4. package/dist/lib/neutral/ChannelArticle-H633OM3U.mjs +57 -0
  5. package/dist/lib/neutral/ChannelArticle-H633OM3U.mjs.map +7 -0
  6. package/dist/lib/neutral/ChannelCreatePanel-NUXXKHZQ.mjs +38 -0
  7. package/dist/lib/neutral/ChannelCreatePanel-NUXXKHZQ.mjs.map +7 -0
  8. package/dist/lib/neutral/ThreadArticle-ROQXQLEZ.mjs +57 -0
  9. package/dist/lib/neutral/ThreadArticle-ROQXQLEZ.mjs.map +7 -0
  10. package/dist/lib/neutral/ThreadPlugin.mjs +67 -0
  11. package/dist/lib/neutral/ThreadPlugin.mjs.map +7 -0
  12. package/dist/lib/neutral/ThreadPlugin.node.mjs +29 -0
  13. package/dist/lib/neutral/ThreadPlugin.node.mjs.map +7 -0
  14. package/dist/lib/neutral/ThreadPlugin.workerd.mjs +27 -0
  15. package/dist/lib/neutral/ThreadPlugin.workerd.mjs.map +7 -0
  16. package/dist/lib/neutral/app-graph-builder-OLKN3VTB.mjs +50 -0
  17. package/dist/lib/neutral/app-graph-builder-OLKN3VTB.mjs.map +7 -0
  18. package/dist/lib/neutral/append-channel-message-J6DXDPBH.mjs +34 -0
  19. package/dist/lib/neutral/append-channel-message-J6DXDPBH.mjs.map +7 -0
  20. package/dist/lib/neutral/capabilities/index.mjs +19 -0
  21. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  22. package/dist/lib/neutral/channel-backend-feed-FCXGAIEC.mjs +58 -0
  23. package/dist/lib/neutral/channel-backend-feed-FCXGAIEC.mjs.map +7 -0
  24. package/dist/lib/neutral/chunk-AWAQTEU6.mjs +10 -0
  25. package/dist/lib/neutral/chunk-AWAQTEU6.mjs.map +7 -0
  26. package/dist/lib/neutral/chunk-HJHK5O6F.mjs +109 -0
  27. package/dist/lib/neutral/chunk-HJHK5O6F.mjs.map +7 -0
  28. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  29. package/dist/lib/neutral/chunk-OOC6EQ7X.mjs +36 -0
  30. package/dist/lib/neutral/chunk-OOC6EQ7X.mjs.map +7 -0
  31. package/dist/lib/neutral/chunk-P4RSGFS4.mjs +69 -0
  32. package/dist/lib/neutral/chunk-P4RSGFS4.mjs.map +7 -0
  33. package/dist/lib/neutral/chunk-SZXFLBZL.mjs +8 -0
  34. package/dist/lib/neutral/chunk-SZXFLBZL.mjs.map +7 -0
  35. package/dist/lib/neutral/components/index.mjs +93 -0
  36. package/dist/lib/neutral/components/index.mjs.map +7 -0
  37. package/dist/lib/neutral/containers/index.mjs +13 -0
  38. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  39. package/dist/lib/neutral/create-channel-UW2LSL4G.mjs +41 -0
  40. package/dist/lib/neutral/create-channel-UW2LSL4G.mjs.map +7 -0
  41. package/dist/lib/neutral/create-object-RLCOUVAW.mjs +46 -0
  42. package/dist/lib/neutral/create-object-RLCOUVAW.mjs.map +7 -0
  43. package/dist/lib/neutral/hooks/index.mjs +11 -0
  44. package/dist/lib/neutral/index.mjs +34 -0
  45. package/dist/lib/neutral/meta.json +1 -0
  46. package/dist/lib/neutral/meta.mjs +10 -0
  47. package/dist/lib/neutral/navigation-resolver-4X4HCQYX.mjs +14 -0
  48. package/dist/lib/neutral/navigation-resolver-4X4HCQYX.mjs.map +7 -0
  49. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs +13 -0
  50. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs.map +7 -0
  51. package/dist/lib/neutral/operations/index.mjs +8 -0
  52. package/dist/lib/neutral/plugin.mjs +16 -0
  53. package/dist/lib/neutral/plugin.mjs.map +7 -0
  54. package/dist/lib/neutral/react-surface-G6KT7TSU.mjs +48 -0
  55. package/dist/lib/neutral/react-surface-G6KT7TSU.mjs.map +7 -0
  56. package/dist/lib/neutral/translations.mjs +91 -0
  57. package/dist/lib/neutral/translations.mjs.map +7 -0
  58. package/dist/lib/neutral/types/index.mjs +16 -0
  59. package/dist/types/src/ThreadPlugin.d.ts +3 -1
  60. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  61. package/dist/types/src/ThreadPlugin.node.d.ts +4 -0
  62. package/dist/types/src/ThreadPlugin.node.d.ts.map +1 -0
  63. package/dist/types/src/ThreadPlugin.test.d.ts +2 -0
  64. package/dist/types/src/ThreadPlugin.test.d.ts.map +1 -0
  65. package/dist/types/src/ThreadPlugin.workerd.d.ts +4 -0
  66. package/dist/types/src/ThreadPlugin.workerd.d.ts.map +1 -0
  67. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  68. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  69. package/dist/types/src/capabilities/channel-backend-feed.d.ts +13 -0
  70. package/dist/types/src/capabilities/channel-backend-feed.d.ts.map +1 -0
  71. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  72. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  73. package/dist/types/src/capabilities/index.d.ts +12 -14
  74. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  75. package/dist/types/src/capabilities/navigation-resolver.d.ts +6 -0
  76. package/dist/types/src/capabilities/navigation-resolver.d.ts.map +1 -0
  77. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  78. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  79. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  80. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  81. package/dist/types/src/components/Chat/Chat.d.ts +43 -0
  82. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -0
  83. package/dist/types/src/components/Chat/index.d.ts +2 -0
  84. package/dist/types/src/components/Chat/index.d.ts.map +1 -0
  85. package/dist/types/src/components/index.d.ts +1 -10
  86. package/dist/types/src/components/index.d.ts.map +1 -1
  87. package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts +19 -0
  88. package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts.map +1 -0
  89. package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts +162 -0
  90. package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts.map +1 -0
  91. package/dist/types/src/containers/ChannelArticle/index.d.ts +2 -0
  92. package/dist/types/src/containers/ChannelArticle/index.d.ts.map +1 -0
  93. package/dist/types/src/containers/ChannelCreatePanel/ChannelCreatePanel.d.ts +11 -0
  94. package/dist/types/src/containers/ChannelCreatePanel/ChannelCreatePanel.d.ts.map +1 -0
  95. package/dist/types/src/containers/ChannelCreatePanel/index.d.ts +2 -0
  96. package/dist/types/src/containers/ChannelCreatePanel/index.d.ts.map +1 -0
  97. package/dist/types/src/containers/ThreadArticle/ThreadArticle.d.ts +20 -0
  98. package/dist/types/src/containers/ThreadArticle/ThreadArticle.d.ts.map +1 -0
  99. package/dist/types/src/containers/ThreadArticle/ThreadArticle.stories.d.ts +162 -0
  100. package/dist/types/src/containers/ThreadArticle/ThreadArticle.stories.d.ts.map +1 -0
  101. package/dist/types/src/containers/ThreadArticle/index.d.ts +2 -0
  102. package/dist/types/src/containers/ThreadArticle/index.d.ts.map +1 -0
  103. package/dist/types/src/containers/index.d.ts +5 -0
  104. package/dist/types/src/containers/index.d.ts.map +1 -0
  105. package/dist/types/src/hooks/index.d.ts +1 -4
  106. package/dist/types/src/hooks/index.d.ts.map +1 -1
  107. package/dist/types/src/hooks/useMessages.d.ts +4 -0
  108. package/dist/types/src/hooks/useMessages.d.ts.map +1 -0
  109. package/dist/types/src/hooks/useStatus.d.ts.map +1 -1
  110. package/dist/types/src/index.d.ts +2 -3
  111. package/dist/types/src/index.d.ts.map +1 -1
  112. package/dist/types/src/meta.d.ts +3 -4
  113. package/dist/types/src/meta.d.ts.map +1 -1
  114. package/dist/types/src/operations/append-channel-message.d.ts +5 -0
  115. package/dist/types/src/operations/append-channel-message.d.ts.map +1 -0
  116. package/dist/types/src/operations/create-channel.d.ts +5 -0
  117. package/dist/types/src/operations/create-channel.d.ts.map +1 -0
  118. package/dist/types/src/operations/index.d.ts +3 -0
  119. package/dist/types/src/operations/index.d.ts.map +1 -0
  120. package/dist/types/src/paths.d.ts +3 -0
  121. package/dist/types/src/paths.d.ts.map +1 -0
  122. package/dist/types/src/plugin.d.ts +4 -0
  123. package/dist/types/src/plugin.d.ts.map +1 -0
  124. package/dist/types/src/translations.d.ts +142 -72
  125. package/dist/types/src/translations.d.ts.map +1 -1
  126. package/dist/types/src/types/ThreadCapabilities.d.ts +37 -0
  127. package/dist/types/src/types/ThreadCapabilities.d.ts.map +1 -0
  128. package/dist/types/src/types/ThreadOperation.d.ts +91 -0
  129. package/dist/types/src/types/ThreadOperation.d.ts.map +1 -0
  130. package/dist/types/src/types/channel-backend.d.ts +16 -0
  131. package/dist/types/src/types/channel-backend.d.ts.map +1 -0
  132. package/dist/types/src/types/channel-backend.test.d.ts +2 -0
  133. package/dist/types/src/types/channel-backend.test.d.ts.map +1 -0
  134. package/dist/types/src/types/index.d.ts +3 -2
  135. package/dist/types/src/types/index.d.ts.map +1 -1
  136. package/dist/types/src/util.d.ts +4 -20
  137. package/dist/types/src/util.d.ts.map +1 -1
  138. package/dist/types/tsconfig.tsbuildinfo +1 -1
  139. package/package.json +108 -81
  140. package/src/ThreadPlugin.node.ts +26 -0
  141. package/src/ThreadPlugin.test.ts +27 -0
  142. package/src/ThreadPlugin.tsx +38 -144
  143. package/src/ThreadPlugin.workerd.ts +25 -0
  144. package/src/capabilities/app-graph-builder.ts +44 -174
  145. package/src/capabilities/channel-backend-feed.ts +60 -0
  146. package/src/capabilities/create-object.ts +46 -0
  147. package/src/capabilities/index.ts +11 -11
  148. package/src/capabilities/navigation-resolver.ts +18 -0
  149. package/src/capabilities/operation-handler.ts +16 -0
  150. package/src/capabilities/react-surface.tsx +39 -79
  151. package/src/components/Chat/Chat.tsx +119 -0
  152. package/src/components/Chat/index.ts +5 -0
  153. package/src/components/index.ts +1 -14
  154. package/src/containers/ChannelArticle/ChannelArticle.stories.tsx +108 -0
  155. package/src/containers/ChannelArticle/ChannelArticle.tsx +83 -0
  156. package/src/containers/ChannelArticle/index.ts +5 -0
  157. package/src/containers/ChannelCreatePanel/ChannelCreatePanel.tsx +52 -0
  158. package/src/containers/ChannelCreatePanel/index.ts +5 -0
  159. package/src/containers/ThreadArticle/ThreadArticle.stories.tsx +86 -0
  160. package/src/containers/ThreadArticle/ThreadArticle.tsx +75 -0
  161. package/src/containers/ThreadArticle/index.ts +5 -0
  162. package/src/containers/index.ts +9 -0
  163. package/src/hooks/index.ts +1 -4
  164. package/src/hooks/useMessages.ts +37 -0
  165. package/src/index.ts +4 -4
  166. package/src/meta.ts +27 -9
  167. package/src/operations/append-channel-message.ts +31 -0
  168. package/src/operations/create-channel.ts +30 -0
  169. package/src/operations/index.ts +10 -0
  170. package/src/paths.ts +10 -0
  171. package/src/plugin.ts +11 -0
  172. package/src/translations.ts +75 -73
  173. package/src/types/ThreadCapabilities.ts +47 -0
  174. package/src/types/ThreadOperation.ts +49 -0
  175. package/src/types/channel-backend.test.ts +48 -0
  176. package/src/types/channel-backend.ts +54 -0
  177. package/src/types/index.ts +3 -2
  178. package/src/util.ts +35 -18
  179. package/src/vite-env.d.ts +10 -0
  180. package/dist/lib/browser/ChannelContainer-O2SFQJU7.mjs +0 -16
  181. package/dist/lib/browser/ChatContainer-PVT3DUZJ.mjs +0 -15
  182. package/dist/lib/browser/app-graph-builder-AF3M7UWN.mjs +0 -171
  183. package/dist/lib/browser/app-graph-builder-AF3M7UWN.mjs.map +0 -7
  184. package/dist/lib/browser/call-manager-XRRCAVLI.mjs +0 -24
  185. package/dist/lib/browser/call-manager-XRRCAVLI.mjs.map +0 -7
  186. package/dist/lib/browser/chunk-2CWJBXBH.mjs +0 -21
  187. package/dist/lib/browser/chunk-2CWJBXBH.mjs.map +0 -7
  188. package/dist/lib/browser/chunk-4APCDRSH.mjs +0 -18
  189. package/dist/lib/browser/chunk-4APCDRSH.mjs.map +0 -7
  190. package/dist/lib/browser/chunk-DW7JD64V.mjs +0 -137
  191. package/dist/lib/browser/chunk-DW7JD64V.mjs.map +0 -7
  192. package/dist/lib/browser/chunk-EV4JWI7L.mjs +0 -17
  193. package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
  194. package/dist/lib/browser/chunk-FY4ZRD5X.mjs +0 -367
  195. package/dist/lib/browser/chunk-FY4ZRD5X.mjs.map +0 -7
  196. package/dist/lib/browser/chunk-GERVMFQW.mjs +0 -31
  197. package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
  198. package/dist/lib/browser/chunk-J3JO5NWO.mjs +0 -477
  199. package/dist/lib/browser/chunk-J3JO5NWO.mjs.map +0 -7
  200. package/dist/lib/browser/chunk-JGKMMI65.mjs +0 -56
  201. package/dist/lib/browser/chunk-JGKMMI65.mjs.map +0 -7
  202. package/dist/lib/browser/chunk-TUFWPOVS.mjs +0 -1698
  203. package/dist/lib/browser/chunk-TUFWPOVS.mjs.map +0 -7
  204. package/dist/lib/browser/chunk-X5PIP5YR.mjs +0 -149
  205. package/dist/lib/browser/chunk-X5PIP5YR.mjs.map +0 -7
  206. package/dist/lib/browser/chunk-ZJ7QBXK6.mjs +0 -984
  207. package/dist/lib/browser/chunk-ZJ7QBXK6.mjs.map +0 -7
  208. package/dist/lib/browser/index.mjs +0 -302
  209. package/dist/lib/browser/index.mjs.map +0 -7
  210. package/dist/lib/browser/intent-resolver-DCY4P4OX.mjs +0 -369
  211. package/dist/lib/browser/intent-resolver-DCY4P4OX.mjs.map +0 -7
  212. package/dist/lib/browser/markdown-WZSXCEZJ.mjs +0 -169
  213. package/dist/lib/browser/markdown-WZSXCEZJ.mjs.map +0 -7
  214. package/dist/lib/browser/meta.json +0 -1
  215. package/dist/lib/browser/react-root-QXPALOUQ.mjs +0 -28
  216. package/dist/lib/browser/react-root-QXPALOUQ.mjs.map +0 -7
  217. package/dist/lib/browser/react-surface-PYAMIADB.mjs +0 -109
  218. package/dist/lib/browser/react-surface-PYAMIADB.mjs.map +0 -7
  219. package/dist/lib/browser/settings-AC6YSASL.mjs +0 -22
  220. package/dist/lib/browser/settings-AC6YSASL.mjs.map +0 -7
  221. package/dist/lib/browser/state-2T4KDWBX.mjs +0 -34
  222. package/dist/lib/browser/state-2T4KDWBX.mjs.map +0 -7
  223. package/dist/lib/browser/types/index.mjs +0 -16
  224. package/dist/lib/node-esm/ChannelContainer-B2ZGAE4P.mjs +0 -17
  225. package/dist/lib/node-esm/ChatContainer-2CT4PJ7I.mjs +0 -16
  226. package/dist/lib/node-esm/app-graph-builder-OLSJVCWY.mjs +0 -172
  227. package/dist/lib/node-esm/app-graph-builder-OLSJVCWY.mjs.map +0 -7
  228. package/dist/lib/node-esm/call-manager-EI7FXRAU.mjs +0 -25
  229. package/dist/lib/node-esm/call-manager-EI7FXRAU.mjs.map +0 -7
  230. package/dist/lib/node-esm/chunk-4TME3BR4.mjs +0 -1699
  231. package/dist/lib/node-esm/chunk-4TME3BR4.mjs.map +0 -7
  232. package/dist/lib/node-esm/chunk-57XR3LEF.mjs +0 -33
  233. package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
  234. package/dist/lib/node-esm/chunk-6CRHHOST.mjs +0 -23
  235. package/dist/lib/node-esm/chunk-6CRHHOST.mjs.map +0 -7
  236. package/dist/lib/node-esm/chunk-BF4UKS55.mjs +0 -368
  237. package/dist/lib/node-esm/chunk-BF4UKS55.mjs.map +0 -7
  238. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs +0 -19
  239. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
  240. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs +0 -19
  241. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs.map +0 -7
  242. package/dist/lib/node-esm/chunk-QBHKLWGR.mjs +0 -58
  243. package/dist/lib/node-esm/chunk-QBHKLWGR.mjs.map +0 -7
  244. package/dist/lib/node-esm/chunk-SED3O2XO.mjs +0 -150
  245. package/dist/lib/node-esm/chunk-SED3O2XO.mjs.map +0 -7
  246. package/dist/lib/node-esm/chunk-VNG6M2IY.mjs +0 -478
  247. package/dist/lib/node-esm/chunk-VNG6M2IY.mjs.map +0 -7
  248. package/dist/lib/node-esm/chunk-XVKWHTH4.mjs +0 -138
  249. package/dist/lib/node-esm/chunk-XVKWHTH4.mjs.map +0 -7
  250. package/dist/lib/node-esm/chunk-YIDU3DXK.mjs +0 -985
  251. package/dist/lib/node-esm/chunk-YIDU3DXK.mjs.map +0 -7
  252. package/dist/lib/node-esm/index.mjs +0 -303
  253. package/dist/lib/node-esm/index.mjs.map +0 -7
  254. package/dist/lib/node-esm/intent-resolver-QGTPU6QB.mjs +0 -370
  255. package/dist/lib/node-esm/intent-resolver-QGTPU6QB.mjs.map +0 -7
  256. package/dist/lib/node-esm/markdown-3MZXUGUA.mjs +0 -170
  257. package/dist/lib/node-esm/markdown-3MZXUGUA.mjs.map +0 -7
  258. package/dist/lib/node-esm/meta.json +0 -1
  259. package/dist/lib/node-esm/react-root-7ZFJYVUZ.mjs +0 -29
  260. package/dist/lib/node-esm/react-root-7ZFJYVUZ.mjs.map +0 -7
  261. package/dist/lib/node-esm/react-surface-UJFCSFNO.mjs +0 -110
  262. package/dist/lib/node-esm/react-surface-UJFCSFNO.mjs.map +0 -7
  263. package/dist/lib/node-esm/settings-N52O7MLS.mjs +0 -23
  264. package/dist/lib/node-esm/settings-N52O7MLS.mjs.map +0 -7
  265. package/dist/lib/node-esm/state-62TQKQVB.mjs +0 -35
  266. package/dist/lib/node-esm/state-62TQKQVB.mjs.map +0 -7
  267. package/dist/lib/node-esm/types/index.mjs +0 -17
  268. package/dist/types/src/calls/call-manager.d.ts +0 -77
  269. package/dist/types/src/calls/call-manager.d.ts.map +0 -1
  270. package/dist/types/src/calls/call-swarm-synchronizer.d.ts +0 -66
  271. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +0 -1
  272. package/dist/types/src/calls/index.d.ts +0 -7
  273. package/dist/types/src/calls/index.d.ts.map +0 -1
  274. package/dist/types/src/calls/media-manager.d.ts +0 -60
  275. package/dist/types/src/calls/media-manager.d.ts.map +0 -1
  276. package/dist/types/src/calls/speaking-monitor.d.ts +0 -24
  277. package/dist/types/src/calls/speaking-monitor.d.ts.map +0 -1
  278. package/dist/types/src/calls/types.d.ts +0 -45
  279. package/dist/types/src/calls/types.d.ts.map +0 -1
  280. package/dist/types/src/calls/util/audio.d.ts +0 -6
  281. package/dist/types/src/calls/util/audio.d.ts.map +0 -1
  282. package/dist/types/src/calls/util/calls-service.d.ts +0 -75
  283. package/dist/types/src/calls/util/calls-service.d.ts.map +0 -1
  284. package/dist/types/src/calls/util/history-cache.d.ts +0 -11
  285. package/dist/types/src/calls/util/history-cache.d.ts.map +0 -1
  286. package/dist/types/src/calls/util/index.d.ts +0 -5
  287. package/dist/types/src/calls/util/index.d.ts.map +0 -1
  288. package/dist/types/src/calls/util/media.d.ts +0 -6
  289. package/dist/types/src/calls/util/media.d.ts.map +0 -1
  290. package/dist/types/src/calls/util/stub-media-streams.d.ts +0 -18
  291. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +0 -1
  292. package/dist/types/src/calls/util/task-scheduling.d.ts +0 -17
  293. package/dist/types/src/calls/util/task-scheduling.d.ts.map +0 -1
  294. package/dist/types/src/calls-service.stories.d.ts +0 -22
  295. package/dist/types/src/calls-service.stories.d.ts.map +0 -1
  296. package/dist/types/src/capabilities/call-manager.d.ts +0 -5
  297. package/dist/types/src/capabilities/call-manager.d.ts.map +0 -1
  298. package/dist/types/src/capabilities/capabilities.d.ts +0 -27
  299. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  300. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  301. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  302. package/dist/types/src/capabilities/markdown.d.ts +0 -4
  303. package/dist/types/src/capabilities/markdown.d.ts.map +0 -1
  304. package/dist/types/src/capabilities/react-root.d.ts +0 -7
  305. package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
  306. package/dist/types/src/capabilities/settings.d.ts +0 -4
  307. package/dist/types/src/capabilities/settings.d.ts.map +0 -1
  308. package/dist/types/src/capabilities/state.d.ts +0 -7
  309. package/dist/types/src/capabilities/state.d.ts.map +0 -1
  310. package/dist/types/src/components/Call/Call.d.ts +0 -17
  311. package/dist/types/src/components/Call/Call.d.ts.map +0 -1
  312. package/dist/types/src/components/Call/Toolbar.d.ts +0 -16
  313. package/dist/types/src/components/Call/Toolbar.d.ts.map +0 -1
  314. package/dist/types/src/components/Call/index.d.ts +0 -3
  315. package/dist/types/src/components/Call/index.d.ts.map +0 -1
  316. package/dist/types/src/components/CallDebugPanel.d.ts +0 -8
  317. package/dist/types/src/components/CallDebugPanel.d.ts.map +0 -1
  318. package/dist/types/src/components/CallSidebar.d.ts +0 -4
  319. package/dist/types/src/components/CallSidebar.d.ts.map +0 -1
  320. package/dist/types/src/components/ChannelContainer.d.ts +0 -14
  321. package/dist/types/src/components/ChannelContainer.d.ts.map +0 -1
  322. package/dist/types/src/components/ChannelContainer.stories.d.ts +0 -10
  323. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +0 -1
  324. package/dist/types/src/components/Chat.stories.d.ts +0 -7
  325. package/dist/types/src/components/Chat.stories.d.ts.map +0 -1
  326. package/dist/types/src/components/ChatContainer.d.ts +0 -17
  327. package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
  328. package/dist/types/src/components/Comments.stories.d.ts +0 -6
  329. package/dist/types/src/components/Comments.stories.d.ts.map +0 -1
  330. package/dist/types/src/components/CommentsContainer.d.ts +0 -13
  331. package/dist/types/src/components/CommentsContainer.d.ts.map +0 -1
  332. package/dist/types/src/components/CommentsThreadContainer.d.ts +0 -14
  333. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +0 -1
  334. package/dist/types/src/components/Lobby/Lobby.d.ts +0 -15
  335. package/dist/types/src/components/Lobby/Lobby.d.ts.map +0 -1
  336. package/dist/types/src/components/Lobby/index.d.ts +0 -2
  337. package/dist/types/src/components/Lobby/index.d.ts.map +0 -1
  338. package/dist/types/src/components/Media/AudioStream.d.ts +0 -6
  339. package/dist/types/src/components/Media/AudioStream.d.ts.map +0 -1
  340. package/dist/types/src/components/Media/VideoObject.d.ts +0 -15
  341. package/dist/types/src/components/Media/VideoObject.d.ts.map +0 -1
  342. package/dist/types/src/components/Media/VideoObject.stories.d.ts +0 -8
  343. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +0 -1
  344. package/dist/types/src/components/Media/index.d.ts +0 -3
  345. package/dist/types/src/components/Media/index.d.ts.map +0 -1
  346. package/dist/types/src/components/MessageContainer.d.ts +0 -11
  347. package/dist/types/src/components/MessageContainer.d.ts.map +0 -1
  348. package/dist/types/src/components/Participant/Participant.d.ts +0 -6
  349. package/dist/types/src/components/Participant/Participant.d.ts.map +0 -1
  350. package/dist/types/src/components/Participant/ParticipantGrid.d.ts +0 -11
  351. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +0 -1
  352. package/dist/types/src/components/Participant/index.d.ts +0 -3
  353. package/dist/types/src/components/Participant/index.d.ts.map +0 -1
  354. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts +0 -12
  355. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts.map +0 -1
  356. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +0 -10
  357. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +0 -1
  358. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts +0 -32
  359. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +0 -1
  360. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +0 -23
  361. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +0 -1
  362. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts +0 -21
  363. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +0 -1
  364. package/dist/types/src/components/ResponsiveGrid/index.d.ts +0 -4
  365. package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +0 -1
  366. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  367. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  368. package/dist/types/src/components/ThreadSettings.d.ts +0 -6
  369. package/dist/types/src/components/ThreadSettings.d.ts.map +0 -1
  370. package/dist/types/src/components/command-extension.d.ts +0 -3
  371. package/dist/types/src/components/command-extension.d.ts.map +0 -1
  372. package/dist/types/src/components/testing.d.ts +0 -4
  373. package/dist/types/src/components/testing.d.ts.map +0 -1
  374. package/dist/types/src/extensions/index.d.ts +0 -2
  375. package/dist/types/src/extensions/index.d.ts.map +0 -1
  376. package/dist/types/src/extensions/threads.d.ts +0 -9
  377. package/dist/types/src/extensions/threads.d.ts.map +0 -1
  378. package/dist/types/src/hooks/analytics.d.ts +0 -4
  379. package/dist/types/src/hooks/analytics.d.ts.map +0 -1
  380. package/dist/types/src/hooks/useDebugMode.d.ts +0 -2
  381. package/dist/types/src/hooks/useDebugMode.d.ts.map +0 -1
  382. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts +0 -2
  383. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts.map +0 -1
  384. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +0 -3
  385. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +0 -1
  386. package/dist/types/src/testing/index.d.ts +0 -2
  387. package/dist/types/src/testing/index.d.ts.map +0 -1
  388. package/dist/types/src/testing/stories.d.ts +0 -2
  389. package/dist/types/src/testing/stories.d.ts.map +0 -1
  390. package/dist/types/src/types/schema.d.ts +0 -164
  391. package/dist/types/src/types/schema.d.ts.map +0 -1
  392. package/dist/types/src/types/types.d.ts +0 -388
  393. package/dist/types/src/types/types.d.ts.map +0 -1
  394. package/src/calls/call-manager.ts +0 -246
  395. package/src/calls/call-swarm-synchronizer.ts +0 -350
  396. package/src/calls/index.ts +0 -10
  397. package/src/calls/media-manager.ts +0 -349
  398. package/src/calls/speaking-monitor.ts +0 -85
  399. package/src/calls/types.ts +0 -70
  400. package/src/calls/util/audio.ts +0 -58
  401. package/src/calls/util/calls-service.ts +0 -531
  402. package/src/calls/util/history-cache.ts +0 -27
  403. package/src/calls/util/index.ts +0 -8
  404. package/src/calls/util/media.ts +0 -52
  405. package/src/calls/util/stub-media-streams.ts +0 -70
  406. package/src/calls/util/task-scheduling.ts +0 -92
  407. package/src/calls-service.stories.tsx +0 -216
  408. package/src/capabilities/call-manager.ts +0 -20
  409. package/src/capabilities/capabilities.ts +0 -33
  410. package/src/capabilities/intent-resolver.ts +0 -315
  411. package/src/capabilities/markdown.ts +0 -69
  412. package/src/capabilities/react-root.tsx +0 -17
  413. package/src/capabilities/settings.ts +0 -19
  414. package/src/capabilities/state.ts +0 -26
  415. package/src/components/Call/Call.tsx +0 -89
  416. package/src/components/Call/Toolbar.tsx +0 -182
  417. package/src/components/Call/index.ts +0 -6
  418. package/src/components/CallDebugPanel.tsx +0 -115
  419. package/src/components/CallSidebar.tsx +0 -18
  420. package/src/components/ChannelContainer.stories.tsx +0 -59
  421. package/src/components/ChannelContainer.tsx +0 -201
  422. package/src/components/Chat.stories.tsx +0 -89
  423. package/src/components/ChatContainer.tsx +0 -142
  424. package/src/components/Comments.stories.tsx +0 -93
  425. package/src/components/CommentsContainer.tsx +0 -72
  426. package/src/components/CommentsThreadContainer.tsx +0 -168
  427. package/src/components/Lobby/Lobby.tsx +0 -119
  428. package/src/components/Lobby/index.ts +0 -5
  429. package/src/components/Media/AudioStream.tsx +0 -67
  430. package/src/components/Media/VideoObject.stories.tsx +0 -53
  431. package/src/components/Media/VideoObject.tsx +0 -58
  432. package/src/components/Media/index.ts +0 -6
  433. package/src/components/MessageContainer.tsx +0 -152
  434. package/src/components/Participant/Participant.tsx +0 -57
  435. package/src/components/Participant/ParticipantGrid.tsx +0 -89
  436. package/src/components/Participant/index.ts +0 -6
  437. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +0 -55
  438. package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +0 -31
  439. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +0 -157
  440. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +0 -341
  441. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +0 -131
  442. package/src/components/ResponsiveGrid/index.ts +0 -7
  443. package/src/components/ThreadComplementary.tsx +0 -151
  444. package/src/components/ThreadSettings.tsx +0 -17
  445. package/src/components/command-extension.ts +0 -33
  446. package/src/components/testing.ts +0 -29
  447. package/src/extensions/index.ts +0 -5
  448. package/src/extensions/threads.ts +0 -126
  449. package/src/hooks/analytics.ts +0 -40
  450. package/src/hooks/useDebugMode.ts +0 -25
  451. package/src/hooks/useInaudibleAudioStreamTrack.tsx +0 -27
  452. package/src/hooks/useVideoStreamTrack.tsx +0 -33
  453. package/src/testing/index.ts +0 -5
  454. package/src/testing/stories.ts +0 -54
  455. package/src/types/schema.ts +0 -33
  456. package/src/types/types.ts +0 -119
  457. package/src/typings/peermetrics-webrtc-stats.d.ts +0 -30
  458. package/src/typings.d.ts +0 -8
  459. /package/dist/lib/{browser/ChannelContainer-O2SFQJU7.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
  460. /package/dist/lib/{browser/types → neutral/hooks}/index.mjs.map +0 -0
  461. /package/dist/lib/{node-esm/types → neutral}/index.mjs.map +0 -0
  462. /package/dist/lib/{browser/ChatContainer-PVT3DUZJ.mjs.map → neutral/meta.mjs.map} +0 -0
  463. /package/dist/lib/{node-esm/ChannelContainer-B2ZGAE4P.mjs.map → neutral/operations/index.mjs.map} +0 -0
  464. /package/dist/lib/{node-esm/ChatContainer-2CT4PJ7I.mjs.map → neutral/types/index.mjs.map} +0 -0
@@ -1,531 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import { PersistentLifecycle } from '@dxos/async';
6
- import { type Context, Resource } from '@dxos/context';
7
- import { invariant } from '@dxos/invariant';
8
- import { log } from '@dxos/log';
9
-
10
- import {
11
- type ErrorResponse,
12
- type RenegotiationResponse,
13
- type SessionResponse,
14
- type TrackObject,
15
- type TracksResponse,
16
- } from '../types';
17
-
18
- import { HistoryCache } from './history-cache';
19
- import { BulkRequestDispatcher, FIFOScheduler } from './task-scheduling';
20
-
21
- const NETWORK_TIMEOUT = 5_000;
22
-
23
- export type Session = {
24
- sessionId: string;
25
- peerConnection: RTCPeerConnection;
26
- };
27
-
28
- export type CallsServiceConfig = {
29
- apiBase: string;
30
- apiExtraParams?: string;
31
- iceServers?: RTCIceServer[];
32
- };
33
-
34
- export type HistoryRecord =
35
- | {
36
- type: 'request';
37
- time: string;
38
- method: string;
39
- body: any;
40
- }
41
- | {
42
- type: 'response';
43
- time: string;
44
- status: number;
45
- text?: string;
46
- json?: any;
47
- };
48
-
49
- /**
50
- * Client for Cloudflare Calls service.
51
- * API: https://developers.cloudflare.com/calls/https-api/
52
- * Inspired by client from https://github.com/threepointone/partyserver/tree/main/packages/partytracks
53
- */
54
- // TODO(mykola): Expose session errors.
55
- export class CallsServicePeer extends Resource {
56
- public readonly history = new HistoryCache<HistoryRecord>(100);
57
-
58
- private readonly _persistentLifecycle = new PersistentLifecycle<Session>({
59
- start: () => this._startSession(),
60
- stop: (session) => this._stopSession(session),
61
- });
62
-
63
- private readonly _config: CallsServiceConfig;
64
-
65
- taskScheduler = new FIFOScheduler();
66
- pushTrackDispatcher = new BulkRequestDispatcher<
67
- {
68
- trackName: string;
69
- transceiver: RTCRtpTransceiver;
70
- },
71
- { tracks: TrackObject[] }
72
- >(32);
73
-
74
- pullTrackDispatcher = new BulkRequestDispatcher<
75
- TrackObject,
76
- {
77
- /**
78
- * trackName -> { resolvedTrack, mid }
79
- */
80
- trackMap: Map<string, { resolvedTrack: Promise<MediaStreamTrack>; mid: string }>;
81
- }
82
- >(32);
83
-
84
- closeTrackDispatcher = new BulkRequestDispatcher(32);
85
- constructor(config: CallsServiceConfig) {
86
- super();
87
- this._config = config;
88
- }
89
-
90
- protected override async _open(ctx: Context): Promise<void> {
91
- await this._persistentLifecycle.open(ctx);
92
- }
93
-
94
- protected override async _close(): Promise<void> {
95
- await this._persistentLifecycle.close();
96
- }
97
-
98
- get session() {
99
- return this._persistentLifecycle.state;
100
- }
101
-
102
- private async _startSession() {
103
- const peerConnection = await this._createRtcConnection();
104
- const sessionId = await this._initiateCallSession();
105
- return { sessionId, peerConnection };
106
- }
107
-
108
- private async _stopSession(session: Session): Promise<void> {
109
- session.peerConnection.close();
110
- }
111
-
112
- private async _createRtcConnection(): Promise<RTCPeerConnection> {
113
- const peerConnection = new RTCPeerConnection({
114
- iceServers: this._config.iceServers,
115
- bundlePolicy: 'max-bundle',
116
- });
117
- peerConnection.addEventListener('connectionstatechange', () => {
118
- if (peerConnection.connectionState === 'failed' || peerConnection.connectionState === 'closed') {
119
- log.warn('calls connection failed', { state: peerConnection.connectionState });
120
- void this._persistentLifecycle.scheduleRestart();
121
- }
122
- });
123
-
124
- let iceTimeout = -1;
125
- peerConnection.addEventListener('iceconnectionstatechange', () => {
126
- clearTimeout(iceTimeout);
127
- if (peerConnection.iceConnectionState === 'failed' || peerConnection.iceConnectionState === 'closed') {
128
- log.warn('calls connection to ICEs failed', { state: peerConnection.iceConnectionState });
129
- void this._persistentLifecycle.scheduleRestart();
130
- } else if (peerConnection.iceConnectionState === 'disconnected') {
131
- // TODO(mykola): we should start to inspect the connection stats from here on for
132
- // any other signs of trouble to guide what to do next (instead of just hoping
133
- // for the best like we do here for now)
134
- const timeoutSeconds = 7;
135
- iceTimeout = window.setTimeout(() => {
136
- if (peerConnection.iceConnectionState === 'connected') {
137
- log.info('calls iceConnectionState is connected');
138
- return;
139
- }
140
-
141
- log.warn('calls iceConnectionState timed out', { state: peerConnection.iceConnectionState, timeoutSeconds });
142
- void this._persistentLifecycle.scheduleRestart();
143
- }, timeoutSeconds * 1_000);
144
- }
145
- });
146
-
147
- return peerConnection;
148
- }
149
-
150
- private async _initiateCallSession(): Promise<string> {
151
- log('creating new session');
152
- const { sessionId } = await this._fetch<SessionResponse>('/sessions/new?SESSION', { method: 'POST' });
153
- return sessionId;
154
- }
155
-
156
- private async _fetch<T extends ErrorResponse>(relativePath: string, requestInit?: RequestInit): Promise<T> {
157
- this.history.push({
158
- type: 'request',
159
- time: new Date().toISOString(),
160
- method: requestInit?.method ?? 'GET',
161
- body: requestInit?.body,
162
- });
163
- // TODO(mykola): Handle access control. Use EdgeClient.
164
- const response = await fetch(`${this._config.apiBase}${relativePath}`, { ...requestInit, redirect: 'manual' });
165
- if (response.status >= 400) {
166
- log.error('error while fetching from Calls service', { status: response.status, text: await response.text() });
167
- throw new Error('Error while fetching from Calls service');
168
- }
169
-
170
- try {
171
- const data = (await response.clone().json()) as T;
172
- this.history.push({
173
- type: 'response',
174
- time: new Date().toISOString(),
175
- status: response.status,
176
- json: data,
177
- });
178
- if (data.errorCode) {
179
- throw new Error(data.errorDescription);
180
- }
181
-
182
- return data;
183
- } catch (error) {
184
- const text = await response.text();
185
- this.history.push({
186
- type: 'response',
187
- time: new Date().toISOString(),
188
- status: response.status,
189
- text,
190
- });
191
- log.error('Error parsing response from Calls service', {
192
- error,
193
- text,
194
- status: response.status,
195
- });
196
- throw error;
197
- }
198
- }
199
-
200
- private async _pushTrackInBulk({
201
- ctx,
202
- peerConnection,
203
- transceiver,
204
- sessionId,
205
- trackName,
206
- }: {
207
- peerConnection: RTCPeerConnection;
208
- transceiver: RTCRtpTransceiver;
209
- sessionId: string;
210
- trackName: string;
211
- ctx?: Context;
212
- }): Promise<TrackObject | void> {
213
- log.verbose('pushing track ', trackName);
214
- const pushedTrackPromise = this.pushTrackDispatcher
215
- .doBulkRequest({ trackName, transceiver }, (tracks) =>
216
- this.taskScheduler.schedule(async () => {
217
- // Create offer.
218
- // Turn on Opus DTX to save bandwidth and set the offer as the local description.
219
- const offer = await peerConnection.createOffer();
220
- offer.sdp = offer.sdp?.replace('useinbandfec=1', 'usedtx=1;useinbandfec=1');
221
- await peerConnection.setLocalDescription(offer);
222
-
223
- const response = await this._fetch<TracksResponse>(`/sessions/${sessionId}/tracks/new?PUSHING`, {
224
- method: 'POST',
225
- body: JSON.stringify({
226
- sessionDescription: {
227
- sdp: offer.sdp,
228
- type: 'offer',
229
- },
230
- tracks: tracks.map(({ trackName, transceiver }) => ({
231
- trackName,
232
- mid: transceiver.mid,
233
- location: 'local',
234
- })),
235
- }),
236
- });
237
-
238
- invariant(response.tracks !== undefined);
239
- if (!response.errorCode) {
240
- await peerConnection.setRemoteDescription(new RTCSessionDescription(response.sessionDescription));
241
- await peerConnectionIsConnected(peerConnection);
242
- }
243
-
244
- return {
245
- tracks: response.tracks,
246
- };
247
- }),
248
- )
249
- .then(({ tracks }) => {
250
- const trackData = tracks.find((t) => t.mid === transceiver.mid);
251
- if (trackData) {
252
- return {
253
- ...trackData,
254
- sessionId,
255
- location: 'remote',
256
- } satisfies TrackObject;
257
- } else {
258
- log.error('missing track data');
259
- }
260
- })
261
- .catch((err) => {
262
- log.catch(err);
263
- });
264
-
265
- const onDispose = async () => {
266
- if (transceiver.mid) {
267
- await this._closeTrackInBulk(peerConnection, transceiver.mid, sessionId);
268
- }
269
- };
270
-
271
- ctx?.onDispose(async () => await onDispose());
272
- this._ctx.onDispose(() => onDispose());
273
-
274
- return pushedTrackPromise;
275
- }
276
-
277
- async pushTrack({
278
- track,
279
- encodings = [],
280
- ctx,
281
- previousTrack,
282
- }: {
283
- track: MediaStreamTrack | null;
284
- encodings?: RTCRtpEncodingParameters[];
285
- ctx?: Context;
286
- previousTrack?: TrackObject;
287
- }): Promise<TrackObject | undefined> {
288
- await this.waitUntilOpen();
289
- invariant(this.session);
290
- log('trying to push track', { track, previousTrack, encodings });
291
- if (previousTrack) {
292
- const transceiver = this.session.peerConnection.getTransceivers().find((t) => t.mid === previousTrack.mid);
293
- if (transceiver?.sender.track === track) {
294
- log.verbose('track already pushed', { track, previousTrack, transceiver });
295
- return previousTrack;
296
- } else if (transceiver) {
297
- log.verbose('replacing track', { track, previousTrack, transceiver });
298
- transceiver.sender.replaceTrack(track).catch((err) => log.catch(err));
299
- return previousTrack;
300
- }
301
- }
302
- invariant(track);
303
-
304
- // We want a single id for this connection.
305
- const stableId = crypto.randomUUID();
306
- const transceiver = this.session.peerConnection!.addTransceiver(track, { direction: 'sendonly' });
307
- log.verbose('creating transceiver');
308
-
309
- const pushedTrackData = await this._pushTrackInBulk({
310
- ctx,
311
- peerConnection: this.session.peerConnection!,
312
- transceiver,
313
- sessionId: this.session.sessionId!,
314
- trackName: stableId,
315
- });
316
- invariant(pushedTrackData);
317
-
318
- const parameters = transceiver.sender.getParameters();
319
- encodings.forEach((encoding, i) => {
320
- const existing = parameters.encodings[i];
321
- parameters.encodings[i] = { ...existing, ...encoding };
322
- });
323
- transceiver.sender.setParameters(parameters).catch((err) => log.catch(err));
324
-
325
- return pushedTrackData;
326
- }
327
-
328
- // TODO(mykola): Add retry logic if the tracks fails to pull.
329
- private async _pullTrackInBulk({
330
- peerConnection,
331
- sessionId,
332
- trackData,
333
- ctx,
334
- }: {
335
- peerConnection: RTCPeerConnection;
336
- sessionId: string;
337
- trackData: TrackObject;
338
- ctx?: Context;
339
- }): Promise<MediaStreamTrack | undefined> {
340
- let mid = '';
341
- log('pulling track', { trackName: trackData.trackName });
342
- const pulledTrackPromise = this.pullTrackDispatcher
343
- .doBulkRequest(trackData, (tracks) =>
344
- this.taskScheduler.schedule(async () => {
345
- const newTrackResponse = await this._fetch<TracksResponse>(`/sessions/${sessionId}/tracks/new?PULLING`, {
346
- method: 'POST',
347
- body: JSON.stringify({ tracks }),
348
- });
349
-
350
- if (newTrackResponse.errorCode) {
351
- throw new Error(newTrackResponse.errorDescription);
352
- }
353
-
354
- invariant(newTrackResponse.tracks);
355
- const trackMap = tracks.reduce((acc, track) => {
356
- const pulledTrackData = newTrackResponse.tracks?.find(
357
- (t) => t.trackName === track.trackName && t.sessionId === track.sessionId,
358
- );
359
-
360
- if (pulledTrackData && pulledTrackData.mid) {
361
- acc.set(track.trackName!, {
362
- mid: pulledTrackData.mid,
363
- resolvedTrack: resolveTrack(peerConnection, (t) => t.mid === pulledTrackData.mid),
364
- });
365
- }
366
-
367
- return acc;
368
- }, new Map<string, { resolvedTrack: Promise<MediaStreamTrack>; mid: string }>());
369
-
370
- if (newTrackResponse.requiresImmediateRenegotiation) {
371
- await peerConnection.setRemoteDescription(new RTCSessionDescription(newTrackResponse.sessionDescription));
372
- const answer = await peerConnection.createAnswer();
373
- await peerConnection.setLocalDescription(answer);
374
-
375
- const renegotiationResponse = await this._fetch<RenegotiationResponse>(
376
- `/sessions/${sessionId}/renegotiate`,
377
- {
378
- method: 'PUT',
379
- body: JSON.stringify({
380
- sessionDescription: {
381
- type: 'answer',
382
- sdp: peerConnection.currentLocalDescription?.sdp,
383
- },
384
- }),
385
- },
386
- );
387
-
388
- if (renegotiationResponse.errorCode) {
389
- throw new Error(renegotiationResponse.errorDescription);
390
- } else {
391
- await peerConnectionIsConnected(peerConnection);
392
- }
393
- }
394
-
395
- return { trackMap };
396
- }),
397
- )
398
- .then(({ trackMap }) => {
399
- const trackInfo = trackMap.get(trackData.trackName!);
400
- if (trackInfo) {
401
- return trackInfo.resolvedTrack
402
- .then((track) => {
403
- mid = trackInfo.mid;
404
- return track;
405
- })
406
- .catch((err) => log.catch(err));
407
- } else {
408
- log.warn('missing track info', { trackData, availableTracks: Array.from(trackMap.keys()) });
409
- }
410
- });
411
-
412
- const onDispose = async () => {
413
- if (mid) {
414
- log('closing pulled track ', trackData.trackName);
415
- await this._closeTrackInBulk(peerConnection, mid, sessionId);
416
- mid = '';
417
- }
418
- };
419
-
420
- this._ctx.onDispose(() => onDispose());
421
- ctx?.onDispose(() => onDispose());
422
-
423
- return pulledTrackPromise as Promise<MediaStreamTrack | undefined>;
424
- }
425
-
426
- async pullTrack({
427
- ctx,
428
- trackData,
429
- }: {
430
- trackData: TrackObject;
431
- ctx?: Context;
432
- }): Promise<MediaStreamTrack | undefined> {
433
- await this.waitUntilOpen();
434
-
435
- invariant(this.session);
436
- const session = this.session;
437
- return this._pullTrackInBulk({
438
- peerConnection: session.peerConnection,
439
- sessionId: session.sessionId,
440
- trackData,
441
- ctx,
442
- });
443
- }
444
-
445
- async _closeTrackInBulk(peerConnection: RTCPeerConnection, mid: string, sessionId: string): Promise<void> {
446
- const transceiver = peerConnection.getTransceivers().find((t) => t.mid === mid);
447
-
448
- if (peerConnection.connectionState !== 'connected' || transceiver === undefined) {
449
- return;
450
- }
451
- await this.closeTrackDispatcher.doBulkRequest({ mid }, (mids) =>
452
- this.taskScheduler.schedule(async () => {
453
- transceiver.stop();
454
- const activeTransceivers = peerConnection
455
- .getTransceivers()
456
- .filter((t) => t.mid !== mid && t.direction !== 'stopped');
457
-
458
- let requestBody;
459
- if (activeTransceivers.length > 0) {
460
- // create an offer
461
- const offer = await peerConnection.createOffer();
462
- // And set the offer as the local description
463
- await peerConnection.setLocalDescription(offer);
464
- requestBody = {
465
- tracks: mids,
466
- sessionDescription: {
467
- sdp: peerConnection.localDescription?.sdp,
468
- type: 'offer',
469
- },
470
- force: false,
471
- };
472
- } else {
473
- requestBody = {
474
- tracks: mids,
475
- force: true,
476
- };
477
- }
478
-
479
- const response = await this._fetch<TracksResponse>(`/sessions/${sessionId}/tracks/close`, {
480
- method: 'PUT',
481
- body: JSON.stringify(requestBody),
482
- });
483
-
484
- if (requestBody.sessionDescription) {
485
- await peerConnection.setRemoteDescription(new RTCSessionDescription(response.sessionDescription));
486
- }
487
- }),
488
- );
489
- }
490
- }
491
-
492
- const resolveTrack = async (
493
- peerConnection: RTCPeerConnection,
494
- compare: (t: RTCRtpTransceiver) => boolean,
495
- timeout = NETWORK_TIMEOUT,
496
- ) =>
497
- new Promise<MediaStreamTrack>((resolve, reject) => {
498
- setTimeout(reject, timeout);
499
- const handler = () => {
500
- const transceiver = peerConnection.getTransceivers().find(compare);
501
- if (transceiver) {
502
- resolve(transceiver.receiver.track);
503
- peerConnection.removeEventListener('track', handler);
504
- }
505
- };
506
-
507
- peerConnection.addEventListener('track', handler);
508
- });
509
-
510
- const peerConnectionIsConnected = async (peerConnection: RTCPeerConnection) => {
511
- if (peerConnection.connectionState !== 'connected') {
512
- const connected = new Promise((resolve, reject) => {
513
- // Timeout after 5s.
514
- const timeout = setTimeout(() => {
515
- peerConnection.removeEventListener('connectionstatechange', connectionStateChangeHandler);
516
- reject(new Error('Connection timeout'));
517
- }, NETWORK_TIMEOUT);
518
-
519
- const connectionStateChangeHandler = () => {
520
- if (peerConnection.connectionState === 'connected') {
521
- peerConnection.removeEventListener('connectionstatechange', connectionStateChangeHandler);
522
- clearTimeout(timeout);
523
- resolve(undefined);
524
- }
525
- };
526
- peerConnection.addEventListener('connectionstatechange', connectionStateChangeHandler);
527
- });
528
-
529
- await connected;
530
- }
531
- };
@@ -1,27 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- /**
6
- * Array that holds the last N items.
7
- */
8
- export class HistoryCache<T> {
9
- private readonly _limit: number;
10
- private readonly _messages: T[];
11
-
12
- constructor(limit = 100) {
13
- this._limit = limit;
14
- this._messages = [];
15
- }
16
-
17
- push(...messages: T[]): void {
18
- if (this._messages.length >= this._limit) {
19
- this._messages.shift(); // Remove the oldest message
20
- }
21
- this._messages.push(...messages); // Add new message
22
- }
23
-
24
- get(): T[] {
25
- return this._messages;
26
- }
27
- }
@@ -1,8 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- export * from './audio';
6
- export * from './calls-service';
7
- export * from './media';
8
- export * from './stub-media-streams';
@@ -1,52 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { log } from '@dxos/log';
6
-
7
- export const getUserMediaTrack = async (
8
- kind: MediaDeviceKind,
9
- constraints: MediaTrackConstraints = {},
10
- deviceList?: MediaDeviceInfo[],
11
- ): Promise<MediaStreamTrack> => {
12
- deviceList ??= (await getDeviceList()).filter((device) => device.kind === kind);
13
- const firstDevice = deviceList[0];
14
- if (!firstDevice) {
15
- throw new Error('No devices found');
16
- }
17
-
18
- return acquireTrack(firstDevice, constraints);
19
- };
20
-
21
- const acquireTrack = async (device: MediaDeviceInfo, constraints: MediaTrackConstraints): Promise<MediaStreamTrack> => {
22
- const { deviceId, label } = device;
23
- log.info(`requesting ${label}`);
24
-
25
- const mediaStream = await navigator.mediaDevices.getUserMedia(
26
- device.kind === 'videoinput' ? { video: { ...constraints, deviceId } } : { audio: { ...constraints, deviceId } },
27
- );
28
- return device.kind === 'videoinput' ? mediaStream.getVideoTracks()[0] : mediaStream.getAudioTracks()[0];
29
- };
30
-
31
- // TODO(mykola): Handle devicechange event.
32
- export const getDeviceList = () => navigator.mediaDevices.enumerateDevices();
33
-
34
- const SCREENSHARE_CONSTRAINTS = {
35
- video: {
36
- width: { max: 1920 },
37
- height: { max: 1080 },
38
- frameRate: { max: 10 },
39
- },
40
- };
41
-
42
- export const getScreenshare = async ({ contentHint }: { contentHint: string }) => {
43
- // Get 1080p equivalent screenshare with 10fps, but save natural sharing content aspect ratio.
44
- const ms = await navigator.mediaDevices.getDisplayMedia(SCREENSHARE_CONSTRAINTS);
45
- ms.getVideoTracks().forEach((track) => {
46
- if (contentHint && 'contentHint' in track) {
47
- track.contentHint = contentHint;
48
- }
49
- });
50
-
51
- return ms;
52
- };
@@ -1,70 +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(), 1_000);
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
- /**
44
- * Creates an inaudible audio stream track.
45
- * We need this to have audio track available when audio is disabled.
46
- */
47
- export const createInaudibleAudioStreamTrack = async ({ ctx }: { ctx: Context }): Promise<MediaStreamTrack> => {
48
- const audioContext = new window.AudioContext();
49
- const oscillator = audioContext.createOscillator();
50
- oscillator.type = 'triangle';
51
- // roughly sounds like a box fan
52
- oscillator.frequency.setValueAtTime(20, audioContext.currentTime);
53
-
54
- const gainNode = audioContext.createGain();
55
- // even w/ gain at 0 some packets are sent
56
- gainNode.gain.setValueAtTime(0.02, audioContext.currentTime);
57
- oscillator.connect(gainNode);
58
-
59
- const destination = audioContext.createMediaStreamDestination();
60
- gainNode.connect(destination);
61
- oscillator.start();
62
-
63
- ctx.onDispose(async () => {
64
- oscillator.disconnect();
65
- oscillator.stop();
66
- await audioContext.close();
67
- });
68
-
69
- return destination.stream.getAudioTracks()[0];
70
- };