@dxos/plugin-thread 0.8.4-main.422d1c7879 → 0.8.4-main.4668b7de9b

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 (532) hide show
  1. package/LICENSE +102 -5
  2. package/PLUGIN.mdl +271 -0
  3. package/README.md +1 -1
  4. package/dist/lib/neutral/ChannelArticle-UJHPOUWA.mjs +28 -0
  5. package/dist/lib/neutral/ChannelArticle-UJHPOUWA.mjs.map +7 -0
  6. package/dist/lib/neutral/ChannelChat-LZEDFJVD.mjs +10 -0
  7. package/dist/lib/neutral/CommentsCompanion-FOUIGCEK.mjs +208 -0
  8. package/dist/lib/neutral/CommentsCompanion-FOUIGCEK.mjs.map +7 -0
  9. package/dist/lib/neutral/ThreadContainer-QWB6WRMI.mjs +61 -0
  10. package/dist/lib/neutral/ThreadContainer-QWB6WRMI.mjs.map +7 -0
  11. package/dist/lib/neutral/ThreadPlugin.mjs +109 -0
  12. package/dist/lib/neutral/ThreadPlugin.mjs.map +7 -0
  13. package/dist/lib/neutral/ThreadPlugin.node.mjs +40 -0
  14. package/dist/lib/neutral/ThreadPlugin.node.mjs.map +7 -0
  15. package/dist/lib/neutral/ThreadPlugin.workerd.mjs +24 -0
  16. package/dist/lib/neutral/ThreadPlugin.workerd.mjs.map +7 -0
  17. package/dist/lib/neutral/ThreadSettings-5MKTDK3A.mjs +15 -0
  18. package/dist/lib/neutral/ThreadSettings-5MKTDK3A.mjs.map +7 -0
  19. package/dist/lib/{browser/add-message-VPPFFLFL.mjs → neutral/add-message-RDIABSIX.mjs} +48 -23
  20. package/dist/lib/neutral/add-message-RDIABSIX.mjs.map +7 -0
  21. package/dist/lib/neutral/agent-runner-RB7N5HLD.mjs +244 -0
  22. package/dist/lib/neutral/agent-runner-RB7N5HLD.mjs.map +7 -0
  23. package/dist/lib/neutral/app-graph-builder-PDLRFYSI.mjs +120 -0
  24. package/dist/lib/neutral/app-graph-builder-PDLRFYSI.mjs.map +7 -0
  25. package/dist/lib/neutral/append-channel-message-TBBQUVMH.mjs +40 -0
  26. package/dist/lib/neutral/append-channel-message-TBBQUVMH.mjs.map +7 -0
  27. package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs +15 -0
  28. package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs.map +7 -0
  29. package/dist/lib/neutral/blueprints/index.mjs +8 -0
  30. package/dist/lib/neutral/capabilities/index.mjs +27 -0
  31. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  32. package/dist/lib/neutral/chunk-35GUWXBB.mjs +48 -0
  33. package/dist/lib/neutral/chunk-35GUWXBB.mjs.map +7 -0
  34. package/dist/lib/{browser/blueprints/index.mjs → neutral/chunk-5T5LPLBN.mjs} +5 -6
  35. package/dist/lib/neutral/chunk-5T5LPLBN.mjs.map +7 -0
  36. package/dist/lib/neutral/chunk-BHEZLLXG.mjs +55 -0
  37. package/dist/lib/neutral/chunk-BHEZLLXG.mjs.map +7 -0
  38. package/dist/lib/neutral/chunk-HQZWTDJC.mjs +164 -0
  39. package/dist/lib/neutral/chunk-HQZWTDJC.mjs.map +7 -0
  40. package/dist/lib/neutral/chunk-IQBZZAMX.mjs +335 -0
  41. package/dist/lib/neutral/chunk-IQBZZAMX.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-JJETHBAZ.mjs +8 -0
  43. package/dist/lib/neutral/chunk-JJETHBAZ.mjs.map +7 -0
  44. package/dist/lib/neutral/chunk-JLY4NVTA.mjs +38 -0
  45. package/dist/lib/neutral/chunk-JLY4NVTA.mjs.map +7 -0
  46. package/dist/lib/neutral/chunk-QFDT33VT.mjs +69 -0
  47. package/dist/lib/neutral/chunk-QFDT33VT.mjs.map +7 -0
  48. package/dist/lib/neutral/components/index.mjs +541 -0
  49. package/dist/lib/neutral/components/index.mjs.map +7 -0
  50. package/dist/lib/neutral/containers/index.mjs +15 -0
  51. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  52. package/dist/lib/{browser/create-UGT7V733.mjs → neutral/create-VXM6HJMN.mjs} +20 -14
  53. package/dist/lib/neutral/create-VXM6HJMN.mjs.map +7 -0
  54. package/dist/lib/neutral/create-channel-FSJOMRHF.mjs +19 -0
  55. package/dist/lib/neutral/create-channel-FSJOMRHF.mjs.map +7 -0
  56. package/dist/lib/neutral/create-object-D5XEG7MQ.mjs +28 -0
  57. package/dist/lib/neutral/create-object-D5XEG7MQ.mjs.map +7 -0
  58. package/dist/lib/{browser/create-proposals-CMK7S7VS.mjs → neutral/create-proposals-ILYIYJEN.mjs} +5 -6
  59. package/dist/lib/neutral/create-proposals-ILYIYJEN.mjs.map +7 -0
  60. package/dist/lib/{browser/delete-FSFVU6ZA.mjs → neutral/delete-6KZERY6K.mjs} +9 -11
  61. package/dist/lib/neutral/delete-6KZERY6K.mjs.map +7 -0
  62. package/dist/lib/{browser/delete-message-XL5M5J33.mjs → neutral/delete-message-PATSHW36.mjs} +9 -19
  63. package/dist/lib/neutral/delete-message-PATSHW36.mjs.map +7 -0
  64. package/dist/lib/neutral/hooks/index.mjs +10 -0
  65. package/dist/lib/neutral/index.mjs +32 -0
  66. package/dist/lib/neutral/index.mjs.map +7 -0
  67. package/dist/lib/neutral/markdown-5UHAAC5Z.mjs +83 -0
  68. package/dist/lib/neutral/markdown-5UHAAC5Z.mjs.map +7 -0
  69. package/dist/lib/neutral/meta.json +1 -0
  70. package/dist/lib/neutral/meta.mjs +10 -0
  71. package/dist/lib/neutral/meta.mjs.map +7 -0
  72. package/dist/lib/neutral/on-create-space-6NLTBGGD.mjs +23 -0
  73. package/dist/lib/neutral/on-create-space-6NLTBGGD.mjs.map +7 -0
  74. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs +13 -0
  75. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs.map +7 -0
  76. package/dist/lib/neutral/operations/index.mjs +8 -0
  77. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  78. package/dist/lib/neutral/plugin.mjs +16 -0
  79. package/dist/lib/neutral/plugin.mjs.map +7 -0
  80. package/dist/lib/neutral/react-surface-TUMXARMI.mjs +76 -0
  81. package/dist/lib/neutral/react-surface-TUMXARMI.mjs.map +7 -0
  82. package/dist/lib/neutral/respond-to-thread-ROQA3B6U.mjs +32 -0
  83. package/dist/lib/neutral/respond-to-thread-ROQA3B6U.mjs.map +7 -0
  84. package/dist/lib/{browser/restore-2ZGMKUSD.mjs → neutral/restore-SP4HADCE.mjs} +6 -7
  85. package/dist/lib/neutral/restore-SP4HADCE.mjs.map +7 -0
  86. package/dist/lib/{browser/restore-message-OYEGWPII.mjs → neutral/restore-message-TVIC66VL.mjs} +8 -17
  87. package/dist/lib/neutral/restore-message-TVIC66VL.mjs.map +7 -0
  88. package/dist/lib/{browser/select-VG2XLULE.mjs → neutral/select-DLHPEKEA.mjs} +7 -9
  89. package/dist/lib/neutral/select-DLHPEKEA.mjs.map +7 -0
  90. package/dist/lib/neutral/set-agent-config-7GEYCG7Y.mjs +20 -0
  91. package/dist/lib/neutral/set-agent-config-7GEYCG7Y.mjs.map +7 -0
  92. package/dist/lib/neutral/settings-HK4EB6TF.mjs +30 -0
  93. package/dist/lib/neutral/settings-HK4EB6TF.mjs.map +7 -0
  94. package/dist/lib/neutral/state-UU7VEAKV.mjs +22 -0
  95. package/dist/lib/neutral/state-UU7VEAKV.mjs.map +7 -0
  96. package/dist/lib/neutral/testing/index.mjs +58 -0
  97. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  98. package/dist/lib/{browser/toggle-resolved-MM6YC5BU.mjs → neutral/toggle-resolved-GMAD3SZ2.mjs} +8 -17
  99. package/dist/lib/neutral/toggle-resolved-GMAD3SZ2.mjs.map +7 -0
  100. package/dist/lib/neutral/translations.mjs +91 -0
  101. package/dist/lib/neutral/translations.mjs.map +7 -0
  102. package/dist/lib/neutral/types/index.mjs +16 -0
  103. package/dist/lib/neutral/types/index.mjs.map +7 -0
  104. package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs +54 -0
  105. package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs.map +7 -0
  106. package/dist/types/src/ThreadPlugin.d.ts +1 -0
  107. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  108. package/dist/types/src/ThreadPlugin.node.d.ts +4 -0
  109. package/dist/types/src/ThreadPlugin.node.d.ts.map +1 -0
  110. package/dist/types/src/ThreadPlugin.test.d.ts +2 -0
  111. package/dist/types/src/ThreadPlugin.test.d.ts.map +1 -0
  112. package/dist/types/src/ThreadPlugin.workerd.d.ts +4 -0
  113. package/dist/types/src/ThreadPlugin.workerd.d.ts.map +1 -0
  114. package/dist/types/src/blueprints/thread-blueprint.d.ts +2 -2
  115. package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -1
  116. package/dist/types/src/capabilities/agent-runner.d.ts +22 -0
  117. package/dist/types/src/capabilities/agent-runner.d.ts.map +1 -0
  118. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  119. package/dist/types/src/capabilities/blueprint-definition.d.ts +2 -2
  120. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
  121. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  122. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  123. package/dist/types/src/capabilities/index.d.ts +10 -8
  124. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  125. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  126. package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
  127. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -1
  128. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  129. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  130. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  131. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -1
  132. package/dist/types/src/components/Chat/Chat.d.ts +51 -0
  133. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -0
  134. package/dist/types/src/components/Chat/index.d.ts +2 -0
  135. package/dist/types/src/components/Chat/index.d.ts.map +1 -0
  136. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts.map +1 -1
  137. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts +70 -70
  138. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts.map +1 -1
  139. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts.map +1 -1
  140. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts.map +1 -1
  141. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts.map +1 -1
  142. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts +70 -70
  143. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts.map +1 -1
  144. package/dist/types/src/components/index.d.ts +1 -1
  145. package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts +13 -0
  146. package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts.map +1 -0
  147. package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts +162 -0
  148. package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts.map +1 -0
  149. package/dist/types/src/containers/ChannelArticle/index.d.ts +2 -0
  150. package/dist/types/src/containers/{CallDebugPanel → ChannelArticle}/index.d.ts.map +1 -1
  151. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts +20 -0
  152. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts.map +1 -0
  153. package/dist/types/src/containers/ChannelChat/index.d.ts +4 -0
  154. package/dist/types/src/containers/ChannelChat/index.d.ts.map +1 -0
  155. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.d.ts +11 -0
  156. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.d.ts.map +1 -0
  157. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.stories.d.ts +198 -0
  158. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.stories.d.ts.map +1 -0
  159. package/dist/types/src/containers/CommentsCompanion/index.d.ts +2 -0
  160. package/dist/types/src/containers/CommentsCompanion/index.d.ts.map +1 -0
  161. package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts +20 -0
  162. package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts.map +1 -0
  163. package/dist/types/src/containers/{ChatContainer/ChatContainer.stories.d.ts → ThreadContainer/ThreadContainer.stories.d.ts} +71 -71
  164. package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts.map +1 -0
  165. package/dist/types/src/containers/ThreadContainer/index.d.ts +4 -0
  166. package/dist/types/src/containers/ThreadContainer/index.d.ts.map +1 -0
  167. package/dist/types/src/containers/index.d.ts +4 -5
  168. package/dist/types/src/containers/index.d.ts.map +1 -1
  169. package/dist/types/src/extensions/threads.d.ts +3 -3
  170. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  171. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  172. package/dist/types/src/hooks/index.d.ts +0 -4
  173. package/dist/types/src/hooks/index.d.ts.map +1 -1
  174. package/dist/types/src/hooks/useStatus.d.ts.map +1 -1
  175. package/dist/types/src/index.d.ts +2 -3
  176. package/dist/types/src/index.d.ts.map +1 -1
  177. package/dist/types/src/meta.d.ts +1 -1
  178. package/dist/types/src/meta.d.ts.map +1 -1
  179. package/dist/types/src/operations/add-message.d.ts +3 -3
  180. package/dist/types/src/operations/add-message.d.ts.map +1 -1
  181. package/dist/types/src/operations/append-channel-message.d.ts +5 -0
  182. package/dist/types/src/operations/append-channel-message.d.ts.map +1 -0
  183. package/dist/types/src/operations/create-channel.d.ts +3 -3
  184. package/dist/types/src/operations/create-channel.d.ts.map +1 -1
  185. package/dist/types/src/operations/create-proposals.d.ts +3 -3
  186. package/dist/types/src/operations/create-proposals.d.ts.map +1 -1
  187. package/dist/types/src/operations/create.d.ts +3 -3
  188. package/dist/types/src/operations/create.d.ts.map +1 -1
  189. package/dist/types/src/operations/delete-message.d.ts +3 -3
  190. package/dist/types/src/operations/delete-message.d.ts.map +1 -1
  191. package/dist/types/src/operations/delete.d.ts +3 -3
  192. package/dist/types/src/operations/delete.d.ts.map +1 -1
  193. package/dist/types/src/operations/index.d.ts +1 -2
  194. package/dist/types/src/operations/index.d.ts.map +1 -1
  195. package/dist/types/src/operations/on-create-space.d.ts +3 -3
  196. package/dist/types/src/operations/on-create-space.d.ts.map +1 -1
  197. package/dist/types/src/operations/respond-to-thread.d.ts +5 -0
  198. package/dist/types/src/operations/respond-to-thread.d.ts.map +1 -0
  199. package/dist/types/src/operations/restore-message.d.ts +3 -3
  200. package/dist/types/src/operations/restore-message.d.ts.map +1 -1
  201. package/dist/types/src/operations/restore.d.ts +3 -3
  202. package/dist/types/src/operations/restore.d.ts.map +1 -1
  203. package/dist/types/src/operations/select.d.ts +3 -3
  204. package/dist/types/src/operations/select.d.ts.map +1 -1
  205. package/dist/types/src/operations/set-agent-config.d.ts +5 -0
  206. package/dist/types/src/operations/set-agent-config.d.ts.map +1 -0
  207. package/dist/types/src/operations/toggle-resolved.d.ts +3 -3
  208. package/dist/types/src/operations/toggle-resolved.d.ts.map +1 -1
  209. package/dist/types/src/plugin.d.ts +4 -0
  210. package/dist/types/src/plugin.d.ts.map +1 -0
  211. package/dist/types/src/should-trigger-agent.d.ts +22 -0
  212. package/dist/types/src/should-trigger-agent.d.ts.map +1 -0
  213. package/dist/types/src/should-trigger-agent.test.d.ts +2 -0
  214. package/dist/types/src/should-trigger-agent.test.d.ts.map +1 -0
  215. package/dist/types/src/testing/data.d.ts.map +1 -1
  216. package/dist/types/src/testing/index.d.ts +1 -1
  217. package/dist/types/src/testing/index.d.ts.map +1 -1
  218. package/dist/types/src/translations.d.ts +70 -70
  219. package/dist/types/src/translations.d.ts.map +1 -1
  220. package/dist/types/src/types/AgentIdentity.d.ts +27 -0
  221. package/dist/types/src/types/AgentIdentity.d.ts.map +1 -0
  222. package/dist/types/src/types/ThreadCapabilities.d.ts +34 -0
  223. package/dist/types/src/types/ThreadCapabilities.d.ts.map +1 -0
  224. package/dist/types/src/{operations/definitions.d.ts → types/ThreadOperation.d.ts} +1882 -1941
  225. package/dist/types/src/types/ThreadOperation.d.ts.map +1 -0
  226. package/dist/types/src/types/index.d.ts +4 -2
  227. package/dist/types/src/types/index.d.ts.map +1 -1
  228. package/dist/types/src/types/types.d.ts +1 -1
  229. package/dist/types/src/types/types.d.ts.map +1 -1
  230. package/dist/types/src/util.d.ts +6 -3
  231. package/dist/types/src/util.d.ts.map +1 -1
  232. package/dist/types/tsconfig.tsbuildinfo +1 -1
  233. package/package.json +127 -90
  234. package/src/ThreadPlugin.node.ts +39 -0
  235. package/src/ThreadPlugin.test.ts +37 -0
  236. package/src/ThreadPlugin.tsx +35 -65
  237. package/src/ThreadPlugin.workerd.ts +20 -0
  238. package/src/blueprints/thread-blueprint.ts +3 -4
  239. package/src/capabilities/agent-runner.ts +291 -0
  240. package/src/capabilities/app-graph-builder.ts +24 -74
  241. package/src/capabilities/blueprint-definition.ts +2 -0
  242. package/src/capabilities/create-object.ts +30 -0
  243. package/src/capabilities/index.ts +4 -3
  244. package/src/capabilities/markdown.ts +6 -2
  245. package/src/capabilities/operation-handler.ts +1 -1
  246. package/src/capabilities/react-surface.tsx +11 -27
  247. package/src/capabilities/settings.ts +1 -3
  248. package/src/capabilities/undo-mappings.ts +1 -1
  249. package/src/components/Chat/Chat.tsx +259 -0
  250. package/src/components/Chat/index.ts +5 -0
  251. package/src/components/CommentsPanel/CommentsPanel.stories.tsx +8 -7
  252. package/src/components/CommentsPanel/CommentsPanel.tsx +5 -5
  253. package/src/components/CommentsPanel/CommentsThread.tsx +16 -12
  254. package/src/components/MessagePanel/MessagePanel.tsx +8 -9
  255. package/src/components/ThreadSettings/ThreadSettings.stories.tsx +2 -1
  256. package/src/components/ThreadSettings/ThreadSettings.tsx +0 -1
  257. package/src/components/index.ts +1 -1
  258. package/src/containers/ChannelArticle/ChannelArticle.stories.tsx +105 -0
  259. package/src/containers/ChannelArticle/ChannelArticle.tsx +42 -0
  260. package/src/containers/ChannelArticle/index.ts +5 -0
  261. package/src/containers/ChannelChat/ChannelChat.tsx +75 -0
  262. package/src/containers/ChannelChat/index.ts +8 -0
  263. package/src/containers/CommentsCompanion/CommentsCompanion.stories.tsx +355 -0
  264. package/src/containers/{ThreadCompanion/ThreadCompanion.tsx → CommentsCompanion/CommentsCompanion.tsx} +33 -34
  265. package/src/containers/CommentsCompanion/index.ts +5 -0
  266. package/src/containers/{ChatContainer/ChatContainer.stories.tsx → ThreadContainer/ThreadContainer.stories.tsx} +10 -11
  267. package/src/containers/ThreadContainer/ThreadContainer.tsx +75 -0
  268. package/src/containers/ThreadContainer/index.ts +8 -0
  269. package/src/containers/index.ts +4 -5
  270. package/src/extensions/command.ts +1 -1
  271. package/src/extensions/threads.ts +13 -13
  272. package/src/hooks/analytics.ts +1 -1
  273. package/src/hooks/index.ts +0 -5
  274. package/src/index.ts +4 -4
  275. package/src/meta.ts +34 -8
  276. package/src/operations/add-message.ts +22 -9
  277. package/src/operations/append-channel-message.ts +37 -0
  278. package/src/operations/create-channel.ts +4 -4
  279. package/src/operations/create-proposals.ts +3 -3
  280. package/src/operations/create.ts +21 -6
  281. package/src/operations/delete-message.ts +6 -6
  282. package/src/operations/delete.ts +5 -5
  283. package/src/operations/index.ts +4 -4
  284. package/src/operations/on-create-space.ts +4 -4
  285. package/src/operations/respond-to-thread.ts +32 -0
  286. package/src/operations/restore-message.ts +5 -5
  287. package/src/operations/restore.ts +4 -4
  288. package/src/operations/select.ts +3 -3
  289. package/src/operations/set-agent-config.ts +24 -0
  290. package/src/operations/toggle-resolved.ts +5 -5
  291. package/src/plugin.ts +11 -0
  292. package/src/should-trigger-agent.test.ts +72 -0
  293. package/src/should-trigger-agent.ts +50 -0
  294. package/src/testing/index.ts +1 -1
  295. package/src/translations.ts +2 -1
  296. package/src/types/AgentIdentity.ts +35 -0
  297. package/src/types/ThreadCapabilities.ts +46 -0
  298. package/src/types/ThreadOperation.ts +225 -0
  299. package/src/types/index.ts +5 -2
  300. package/src/types/types.ts +0 -2
  301. package/src/util.ts +36 -4
  302. package/src/vite-env.d.ts +10 -0
  303. package/dist/lib/browser/add-message-VPPFFLFL.mjs.map +0 -7
  304. package/dist/lib/browser/blueprints/index.mjs.map +0 -7
  305. package/dist/lib/browser/chunk-MESW3R4Q.mjs +0 -61
  306. package/dist/lib/browser/chunk-MESW3R4Q.mjs.map +0 -7
  307. package/dist/lib/browser/chunk-VPM44Z35.mjs +0 -259
  308. package/dist/lib/browser/chunk-VPM44Z35.mjs.map +0 -7
  309. package/dist/lib/browser/create-UGT7V733.mjs.map +0 -7
  310. package/dist/lib/browser/create-channel-EF67LCS6.mjs +0 -21
  311. package/dist/lib/browser/create-channel-EF67LCS6.mjs.map +0 -7
  312. package/dist/lib/browser/create-channel-thread-CCZTSWQ6.mjs +0 -28
  313. package/dist/lib/browser/create-channel-thread-CCZTSWQ6.mjs.map +0 -7
  314. package/dist/lib/browser/create-proposals-CMK7S7VS.mjs.map +0 -7
  315. package/dist/lib/browser/delete-FSFVU6ZA.mjs.map +0 -7
  316. package/dist/lib/browser/delete-message-XL5M5J33.mjs.map +0 -7
  317. package/dist/lib/browser/index.mjs +0 -2334
  318. package/dist/lib/browser/index.mjs.map +0 -7
  319. package/dist/lib/browser/meta.json +0 -1
  320. package/dist/lib/browser/on-create-space-VYS2JGVT.mjs +0 -25
  321. package/dist/lib/browser/on-create-space-VYS2JGVT.mjs.map +0 -7
  322. package/dist/lib/browser/operations/index.mjs +0 -14
  323. package/dist/lib/browser/operations/index.mjs.map +0 -7
  324. package/dist/lib/browser/restore-2ZGMKUSD.mjs.map +0 -7
  325. package/dist/lib/browser/restore-message-OYEGWPII.mjs.map +0 -7
  326. package/dist/lib/browser/select-VG2XLULE.mjs.map +0 -7
  327. package/dist/lib/browser/toggle-resolved-MM6YC5BU.mjs.map +0 -7
  328. package/dist/lib/browser/types/index.mjs +0 -12
  329. package/dist/lib/node-esm/add-message-XWKHLNS6.mjs +0 -98
  330. package/dist/lib/node-esm/add-message-XWKHLNS6.mjs.map +0 -7
  331. package/dist/lib/node-esm/blueprints/index.mjs +0 -38
  332. package/dist/lib/node-esm/blueprints/index.mjs.map +0 -7
  333. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
  334. package/dist/lib/node-esm/chunk-JTHXNWKJ.mjs +0 -260
  335. package/dist/lib/node-esm/chunk-JTHXNWKJ.mjs.map +0 -7
  336. package/dist/lib/node-esm/chunk-SDRAQNSQ.mjs +0 -62
  337. package/dist/lib/node-esm/chunk-SDRAQNSQ.mjs.map +0 -7
  338. package/dist/lib/node-esm/create-XAYNDVU2.mjs +0 -56
  339. package/dist/lib/node-esm/create-XAYNDVU2.mjs.map +0 -7
  340. package/dist/lib/node-esm/create-channel-UYWUNB3L.mjs +0 -22
  341. package/dist/lib/node-esm/create-channel-UYWUNB3L.mjs.map +0 -7
  342. package/dist/lib/node-esm/create-channel-thread-UQF2SBHS.mjs +0 -29
  343. package/dist/lib/node-esm/create-channel-thread-UQF2SBHS.mjs.map +0 -7
  344. package/dist/lib/node-esm/create-proposals-5FJNURKH.mjs +0 -58
  345. package/dist/lib/node-esm/create-proposals-5FJNURKH.mjs.map +0 -7
  346. package/dist/lib/node-esm/delete-WRODXR3E.mjs +0 -60
  347. package/dist/lib/node-esm/delete-WRODXR3E.mjs.map +0 -7
  348. package/dist/lib/node-esm/delete-message-TAHCYTW2.mjs +0 -65
  349. package/dist/lib/node-esm/delete-message-TAHCYTW2.mjs.map +0 -7
  350. package/dist/lib/node-esm/index.mjs +0 -2335
  351. package/dist/lib/node-esm/index.mjs.map +0 -7
  352. package/dist/lib/node-esm/meta.json +0 -1
  353. package/dist/lib/node-esm/on-create-space-XDY2YXPV.mjs +0 -26
  354. package/dist/lib/node-esm/on-create-space-XDY2YXPV.mjs.map +0 -7
  355. package/dist/lib/node-esm/operations/index.mjs +0 -15
  356. package/dist/lib/node-esm/operations/index.mjs.map +0 -7
  357. package/dist/lib/node-esm/restore-T3QA7TSL.mjs +0 -34
  358. package/dist/lib/node-esm/restore-T3QA7TSL.mjs.map +0 -7
  359. package/dist/lib/node-esm/restore-message-WFTEVBEV.mjs +0 -43
  360. package/dist/lib/node-esm/restore-message-WFTEVBEV.mjs.map +0 -7
  361. package/dist/lib/node-esm/select-Q4UDWJJF.mjs +0 -27
  362. package/dist/lib/node-esm/select-Q4UDWJJF.mjs.map +0 -7
  363. package/dist/lib/node-esm/toggle-resolved-33XTAK2H.mjs +0 -46
  364. package/dist/lib/node-esm/toggle-resolved-33XTAK2H.mjs.map +0 -7
  365. package/dist/lib/node-esm/types/index.mjs +0 -13
  366. package/dist/types/src/calls/call-manager.d.ts +0 -87
  367. package/dist/types/src/calls/call-manager.d.ts.map +0 -1
  368. package/dist/types/src/calls/call-swarm-synchronizer.d.ts +0 -66
  369. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +0 -1
  370. package/dist/types/src/calls/index.d.ts +0 -7
  371. package/dist/types/src/calls/index.d.ts.map +0 -1
  372. package/dist/types/src/calls/media-manager.d.ts +0 -60
  373. package/dist/types/src/calls/media-manager.d.ts.map +0 -1
  374. package/dist/types/src/calls/speaking-monitor.d.ts +0 -24
  375. package/dist/types/src/calls/speaking-monitor.d.ts.map +0 -1
  376. package/dist/types/src/calls/types.d.ts +0 -45
  377. package/dist/types/src/calls/types.d.ts.map +0 -1
  378. package/dist/types/src/calls/util/audio.d.ts +0 -6
  379. package/dist/types/src/calls/util/audio.d.ts.map +0 -1
  380. package/dist/types/src/calls/util/calls-service.d.ts +0 -77
  381. package/dist/types/src/calls/util/calls-service.d.ts.map +0 -1
  382. package/dist/types/src/calls/util/history-cache.d.ts +0 -11
  383. package/dist/types/src/calls/util/history-cache.d.ts.map +0 -1
  384. package/dist/types/src/calls/util/index.d.ts +0 -5
  385. package/dist/types/src/calls/util/index.d.ts.map +0 -1
  386. package/dist/types/src/calls/util/media.d.ts +0 -6
  387. package/dist/types/src/calls/util/media.d.ts.map +0 -1
  388. package/dist/types/src/calls/util/stub-media-streams.d.ts +0 -18
  389. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +0 -1
  390. package/dist/types/src/calls/util/task-scheduling.d.ts +0 -17
  391. package/dist/types/src/calls/util/task-scheduling.d.ts.map +0 -1
  392. package/dist/types/src/calls-service.stories.d.ts +0 -23
  393. package/dist/types/src/calls-service.stories.d.ts.map +0 -1
  394. package/dist/types/src/capabilities/call-manager.d.ts +0 -6
  395. package/dist/types/src/capabilities/call-manager.d.ts.map +0 -1
  396. package/dist/types/src/capabilities/react-root.d.ts +0 -9
  397. package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
  398. package/dist/types/src/components/Call/Call.d.ts +0 -17
  399. package/dist/types/src/components/Call/Call.d.ts.map +0 -1
  400. package/dist/types/src/components/Call/Toolbar.d.ts +0 -16
  401. package/dist/types/src/components/Call/Toolbar.d.ts.map +0 -1
  402. package/dist/types/src/components/Call/index.d.ts +0 -3
  403. package/dist/types/src/components/Call/index.d.ts.map +0 -1
  404. package/dist/types/src/components/Lobby/Lobby.d.ts +0 -15
  405. package/dist/types/src/components/Lobby/Lobby.d.ts.map +0 -1
  406. package/dist/types/src/components/Lobby/index.d.ts +0 -2
  407. package/dist/types/src/components/Lobby/index.d.ts.map +0 -1
  408. package/dist/types/src/components/Media/AudioStream.d.ts +0 -6
  409. package/dist/types/src/components/Media/AudioStream.d.ts.map +0 -1
  410. package/dist/types/src/components/Media/VideoObject.d.ts +0 -15
  411. package/dist/types/src/components/Media/VideoObject.d.ts.map +0 -1
  412. package/dist/types/src/components/Media/VideoObject.stories.d.ts +0 -22
  413. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +0 -1
  414. package/dist/types/src/components/Media/index.d.ts +0 -3
  415. package/dist/types/src/components/Media/index.d.ts.map +0 -1
  416. package/dist/types/src/components/Participant/Participant.d.ts +0 -6
  417. package/dist/types/src/components/Participant/Participant.d.ts.map +0 -1
  418. package/dist/types/src/components/Participant/ParticipantGrid.d.ts +0 -11
  419. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +0 -1
  420. package/dist/types/src/components/Participant/index.d.ts +0 -3
  421. package/dist/types/src/components/Participant/index.d.ts.map +0 -1
  422. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts +0 -32
  423. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +0 -1
  424. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +0 -178
  425. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +0 -1
  426. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts +0 -21
  427. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +0 -1
  428. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.d.ts +0 -12
  429. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.d.ts.map +0 -1
  430. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts +0 -164
  431. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts.map +0 -1
  432. package/dist/types/src/components/ResponsiveGrid/index.d.ts +0 -4
  433. package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +0 -1
  434. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts +0 -15
  435. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts.map +0 -1
  436. package/dist/types/src/containers/CallDebugPanel/index.d.ts +0 -2
  437. package/dist/types/src/containers/CallSidebar/CallSidebar.d.ts +0 -3
  438. package/dist/types/src/containers/CallSidebar/CallSidebar.d.ts.map +0 -1
  439. package/dist/types/src/containers/CallSidebar/index.d.ts +0 -2
  440. package/dist/types/src/containers/CallSidebar/index.d.ts.map +0 -1
  441. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts +0 -12
  442. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts.map +0 -1
  443. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts +0 -162
  444. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts.map +0 -1
  445. package/dist/types/src/containers/ChannelContainer/index.d.ts +0 -2
  446. package/dist/types/src/containers/ChannelContainer/index.d.ts.map +0 -1
  447. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts +0 -16
  448. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts.map +0 -1
  449. package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts.map +0 -1
  450. package/dist/types/src/containers/ChatContainer/index.d.ts +0 -4
  451. package/dist/types/src/containers/ChatContainer/index.d.ts.map +0 -1
  452. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts +0 -8
  453. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts.map +0 -1
  454. package/dist/types/src/containers/ThreadCompanion/index.d.ts +0 -2
  455. package/dist/types/src/containers/ThreadCompanion/index.d.ts.map +0 -1
  456. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +0 -2
  457. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +0 -1
  458. package/dist/types/src/hooks/useDebugMode.d.ts +0 -2
  459. package/dist/types/src/hooks/useDebugMode.d.ts.map +0 -1
  460. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts +0 -2
  461. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts.map +0 -1
  462. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +0 -3
  463. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +0 -1
  464. package/dist/types/src/operations/create-channel-thread.d.ts +0 -5
  465. package/dist/types/src/operations/create-channel-thread.d.ts.map +0 -1
  466. package/dist/types/src/operations/definitions.d.ts.map +0 -1
  467. package/dist/types/src/testing/stories.d.ts +0 -3
  468. package/dist/types/src/testing/stories.d.ts.map +0 -1
  469. package/dist/types/src/types/Channel.d.ts +0 -715
  470. package/dist/types/src/types/Channel.d.ts.map +0 -1
  471. package/dist/types/src/types/capabilities.d.ts +0 -24
  472. package/dist/types/src/types/capabilities.d.ts.map +0 -1
  473. package/src/calls/call-manager.ts +0 -270
  474. package/src/calls/call-swarm-synchronizer.ts +0 -350
  475. package/src/calls/index.ts +0 -10
  476. package/src/calls/media-manager.ts +0 -378
  477. package/src/calls/speaking-monitor.ts +0 -85
  478. package/src/calls/types.ts +0 -74
  479. package/src/calls/util/audio.ts +0 -58
  480. package/src/calls/util/calls-service.ts +0 -580
  481. package/src/calls/util/history-cache.ts +0 -27
  482. package/src/calls/util/index.ts +0 -8
  483. package/src/calls/util/media.ts +0 -52
  484. package/src/calls/util/stub-media-streams.ts +0 -127
  485. package/src/calls/util/task-scheduling.ts +0 -92
  486. package/src/calls-service.stories.tsx +0 -230
  487. package/src/capabilities/call-manager.ts +0 -27
  488. package/src/capabilities/react-root.tsx +0 -20
  489. package/src/components/Call/Call.tsx +0 -93
  490. package/src/components/Call/Toolbar.tsx +0 -199
  491. package/src/components/Call/index.ts +0 -6
  492. package/src/components/Lobby/Lobby.tsx +0 -122
  493. package/src/components/Lobby/index.ts +0 -5
  494. package/src/components/Media/AudioStream.tsx +0 -67
  495. package/src/components/Media/VideoObject.stories.tsx +0 -59
  496. package/src/components/Media/VideoObject.tsx +0 -58
  497. package/src/components/Media/index.ts +0 -6
  498. package/src/components/Participant/Participant.tsx +0 -77
  499. package/src/components/Participant/ParticipantGrid.tsx +0 -88
  500. package/src/components/Participant/index.ts +0 -6
  501. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +0 -157
  502. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +0 -341
  503. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +0 -134
  504. package/src/components/ResponsiveGrid/ResponsivePanel.stories.tsx +0 -53
  505. package/src/components/ResponsiveGrid/ResponsivePanel.tsx +0 -31
  506. package/src/components/ResponsiveGrid/index.ts +0 -7
  507. package/src/containers/CallDebugPanel/CallDebugPanel.tsx +0 -173
  508. package/src/containers/CallDebugPanel/index.ts +0 -5
  509. package/src/containers/CallSidebar/CallSidebar.tsx +0 -18
  510. package/src/containers/CallSidebar/index.ts +0 -5
  511. package/src/containers/ChannelContainer/ChannelContainer.stories.tsx +0 -61
  512. package/src/containers/ChannelContainer/ChannelContainer.tsx +0 -223
  513. package/src/containers/ChannelContainer/index.ts +0 -5
  514. package/src/containers/ChatContainer/ChatContainer.tsx +0 -131
  515. package/src/containers/ChatContainer/index.ts +0 -8
  516. package/src/containers/ThreadCompanion/index.ts +0 -5
  517. package/src/hooks/useBlackCanvasStreamTrack.tsx +0 -27
  518. package/src/hooks/useDebugMode.ts +0 -25
  519. package/src/hooks/useInaudibleAudioStreamTrack.tsx +0 -27
  520. package/src/hooks/useVideoStreamTrack.tsx +0 -36
  521. package/src/operations/create-channel-thread.ts +0 -26
  522. package/src/operations/definitions.ts +0 -177
  523. package/src/testing/stories.ts +0 -51
  524. package/src/types/Channel.ts +0 -37
  525. package/src/types/capabilities.ts +0 -36
  526. package/src/typings/peermetrics-webrtc-stats.d.ts +0 -46
  527. package/src/typings.d.ts +0 -8
  528. /package/dist/lib/{browser/chunk-J5LGTIGS.mjs.map → neutral/ChannelChat-LZEDFJVD.mjs.map} +0 -0
  529. /package/dist/lib/{browser/types → neutral/blueprints}/index.mjs.map +0 -0
  530. /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs +0 -0
  531. /package/dist/lib/{node-esm/chunk-HSLMI22Q.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
  532. /package/dist/lib/{node-esm/types → neutral/hooks}/index.mjs.map +0 -0
@@ -1,580 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import { PersistentLifecycle, Trigger, scheduleTask } 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
- import { HistoryCache } from './history-cache';
18
- import { BulkRequestDispatcher, FIFOScheduler } from './task-scheduling';
19
-
20
- const NETWORK_TIMEOUT = 5_000;
21
-
22
- export type Session = {
23
- sessionId: string;
24
- peerConnection: RTCPeerConnection;
25
- };
26
-
27
- export type CallsServiceConfig = {
28
- apiBase: string;
29
- apiExtraProps?: string;
30
- iceServers?: RTCIceServer[];
31
- };
32
-
33
- export type HistoryRecord =
34
- | {
35
- endpoint: string;
36
- type: 'request';
37
- time: string;
38
- method: string;
39
- body: any;
40
- }
41
- | {
42
- endpoint: string;
43
- type: 'response';
44
- time: string;
45
- status: number;
46
- text?: string;
47
- json?: any;
48
- };
49
-
50
- /**
51
- * Client for Cloudflare Calls service.
52
- * API: https://developers.cloudflare.com/calls/https-api/
53
- * Inspired by client from https://github.com/threepointone/partyserver/tree/main/packages/partytracks
54
- */
55
- // TODO(mykola): Expose session errors.
56
- export class CallsServicePeer extends Resource {
57
- public readonly history = new HistoryCache<HistoryRecord>(100);
58
-
59
- private readonly _persistentLifecycle = new PersistentLifecycle<Session>({
60
- start: () => this._startSession(),
61
- stop: (session) => this._stopSession(session),
62
- });
63
-
64
- private readonly _config: CallsServiceConfig;
65
-
66
- taskScheduler = new FIFOScheduler();
67
- pushTrackDispatcher = new BulkRequestDispatcher<
68
- {
69
- trackName: string;
70
- transceiver: RTCRtpTransceiver;
71
- },
72
- { tracks: TrackObject[] }
73
- >(32);
74
-
75
- pullTrackDispatcher = new BulkRequestDispatcher<
76
- TrackObject,
77
- {
78
- /**
79
- * trackName -> { resolvedTrack, mid }
80
- */
81
- trackMap: Map<string, { resolvedTrack: Promise<MediaStreamTrack>; mid: string }>;
82
- }
83
- >(32);
84
-
85
- closeTrackDispatcher = new BulkRequestDispatcher(32);
86
- constructor(config: CallsServiceConfig) {
87
- super();
88
- this._config = config;
89
- }
90
-
91
- protected override async _open(ctx: Context): Promise<void> {
92
- await this._persistentLifecycle.open(ctx);
93
- }
94
-
95
- protected override async _close(): Promise<void> {
96
- await this._persistentLifecycle.close();
97
- }
98
-
99
- get session() {
100
- return this._persistentLifecycle.state;
101
- }
102
-
103
- private async _startSession() {
104
- const peerConnection = await this._createRtcConnection();
105
- const sessionId = await this._initiateCallSession();
106
- return { sessionId, peerConnection };
107
- }
108
-
109
- private async _stopSession(session: Session): Promise<void> {
110
- session.peerConnection.close();
111
- }
112
-
113
- private async _createRtcConnection(): Promise<RTCPeerConnection> {
114
- const peerConnection = new RTCPeerConnection({
115
- iceServers: this._config.iceServers,
116
- bundlePolicy: 'max-bundle',
117
- });
118
- peerConnection.addEventListener('connectionstatechange', () => {
119
- if (peerConnection.connectionState === 'failed' || peerConnection.connectionState === 'closed') {
120
- log.info('calls connection failed', { state: peerConnection.connectionState });
121
- void this._persistentLifecycle.scheduleRestart();
122
- }
123
- });
124
-
125
- let iceTimeout = -1;
126
- peerConnection.addEventListener('iceconnectionstatechange', () => {
127
- clearTimeout(iceTimeout);
128
- if (peerConnection.iceConnectionState === 'failed' || peerConnection.iceConnectionState === 'closed') {
129
- log.info('calls connection to ICEs failed', { state: peerConnection.iceConnectionState });
130
- void this._persistentLifecycle.scheduleRestart();
131
- } else if (peerConnection.iceConnectionState === 'disconnected') {
132
- // TODO(mykola): we should start to inspect the connection stats from here on for
133
- // any other signs of trouble to guide what to do next (instead of just hoping
134
- // for the best like we do here for now)
135
- const timeoutSeconds = 7;
136
- iceTimeout = window.setTimeout(() => {
137
- if (peerConnection.iceConnectionState === 'connected') {
138
- log.info('calls iceConnectionState is connected');
139
- return;
140
- }
141
-
142
- log.info('calls iceConnectionState timed out', { state: peerConnection.iceConnectionState, timeoutSeconds });
143
- void this._persistentLifecycle.scheduleRestart();
144
- }, timeoutSeconds * 1_000);
145
- }
146
- });
147
-
148
- return peerConnection;
149
- }
150
-
151
- private async _initiateCallSession(): Promise<string> {
152
- log('creating new session');
153
- const { sessionId } = await this._fetch<SessionResponse>('/sessions/new?SESSION', { method: 'POST' });
154
- return sessionId;
155
- }
156
-
157
- private async _fetch<T extends ErrorResponse>(relativePath: string, requestInit?: RequestInit): Promise<T> {
158
- this.history.push({
159
- endpoint: relativePath,
160
- type: 'request',
161
- time: new Date().toISOString(),
162
- method: requestInit?.method ?? 'GET',
163
- body: requestInit?.body,
164
- });
165
- // TODO(mykola): Handle access control. Use EdgeClient.
166
- const response = await fetch(`${this._config.apiBase}${relativePath}`, { ...requestInit, redirect: 'manual' });
167
- if (response.status >= 400) {
168
- log.error('error while fetching from Calls service', { status: response.status, text: await response.text() });
169
- throw new Error('Error while fetching from Calls service');
170
- }
171
-
172
- try {
173
- const data = (await response.clone().json()) as T;
174
- this.history.push({
175
- endpoint: relativePath,
176
- type: 'response',
177
- time: new Date().toISOString(),
178
- status: response.status,
179
- json: data,
180
- });
181
- if (data.errorCode) {
182
- throw new Error(data.errorDescription);
183
- }
184
-
185
- return data;
186
- } catch (error) {
187
- const text = await response.text();
188
- this.history.push({
189
- endpoint: relativePath,
190
- type: 'response',
191
- time: new Date().toISOString(),
192
- status: response.status,
193
- text,
194
- });
195
- log.error('Error parsing response from Calls service', {
196
- error,
197
- text,
198
- status: response.status,
199
- });
200
- throw error;
201
- }
202
- }
203
-
204
- private async _pushTrackInBulk({
205
- ctx,
206
- peerConnection,
207
- transceiver,
208
- sessionId,
209
- trackName,
210
- }: {
211
- ctx: Context;
212
- peerConnection: RTCPeerConnection;
213
- transceiver: RTCRtpTransceiver;
214
- sessionId: string;
215
- trackName: string;
216
- }): Promise<TrackObject | void> {
217
- log.verbose('pushing track ', trackName);
218
- const pushedTrackPromise = this.pushTrackDispatcher
219
- .doBulkRequest({ trackName, transceiver }, (tracks) =>
220
- this.taskScheduler.schedule(async () => {
221
- // Create offer.
222
- // Turn on Opus DTX to save bandwidth and set the offer as the local description.
223
- const offer = await peerConnection.createOffer();
224
- offer.sdp = offer.sdp?.replace('useinbandfec=1', 'usedtx=1;useinbandfec=1');
225
- await peerConnection.setLocalDescription(offer);
226
-
227
- const response = await this._fetch<TracksResponse>(`/sessions/${sessionId}/tracks/new?PUSHING`, {
228
- method: 'POST',
229
- body: JSON.stringify({
230
- sessionDescription: {
231
- sdp: offer.sdp,
232
- type: 'offer',
233
- },
234
- tracks: tracks.map(({ trackName, transceiver }) => ({
235
- trackName,
236
- mid: transceiver.mid,
237
- location: 'local',
238
- })),
239
- }),
240
- });
241
-
242
- invariant(response.tracks !== undefined);
243
- if (!response.errorCode) {
244
- await peerConnection.setRemoteDescription(new RTCSessionDescription(response.sessionDescription));
245
- await peerConnectionIsConnected(peerConnection);
246
- }
247
-
248
- return {
249
- tracks: response.tracks,
250
- };
251
- }),
252
- )
253
- .then(async ({ tracks }) => {
254
- const trackData = tracks.find((t) => t.mid === transceiver.mid);
255
- if (trackData) {
256
- // we wait for the transceiver to start sending data before we emit
257
- // the track metadata to ensure that the track will be able to be
258
- // pulled before making the metadata available to anyone else.
259
- // await waitForTransceiverToSendData(ctx, transceiver);
260
- return {
261
- ...trackData,
262
- sessionId,
263
- location: 'remote',
264
- } satisfies TrackObject;
265
- } else {
266
- log.error('missing track data');
267
- }
268
- });
269
-
270
- const onDispose = async () => {
271
- if (transceiver.mid) {
272
- await this._closeTrackInBulk(peerConnection, transceiver.mid, sessionId);
273
- }
274
- };
275
-
276
- ctx?.onDispose(async () => await onDispose());
277
- this._ctx.onDispose(() => onDispose());
278
-
279
- return pushedTrackPromise;
280
- }
281
-
282
- async pushTrack({
283
- track,
284
- encodings = [],
285
- ctx,
286
- previousTrack,
287
- }: {
288
- track: MediaStreamTrack | null;
289
- ctx: Context;
290
- encodings?: RTCRtpEncodingParameters[];
291
- previousTrack?: TrackObject;
292
- }): Promise<TrackObject | undefined> {
293
- await this.waitUntilOpen();
294
- invariant(this.session);
295
- log('trying to push track', { track, previousTrack, encodings });
296
- if (previousTrack) {
297
- const transceiver = this.session.peerConnection.getTransceivers().find((t) => t.mid === previousTrack.mid);
298
- if (transceiver?.sender.track === track) {
299
- log.verbose('track already pushed', { track, previousTrack, transceiver });
300
- return previousTrack;
301
- } else if (transceiver) {
302
- log.verbose('replacing track', { track, previousTrack, transceiver });
303
- transceiver.sender.replaceTrack(track).catch((err) => log.catch(err));
304
- return previousTrack;
305
- }
306
- }
307
- invariant(track);
308
-
309
- // We want a single id for this connection.
310
- const stableId = crypto.randomUUID();
311
- const transceiver = this.session.peerConnection!.addTransceiver(track, { direction: 'sendonly' });
312
- log.verbose('creating transceiver');
313
-
314
- const pushedTrackData = await this._pushTrackInBulk({
315
- ctx,
316
- peerConnection: this.session.peerConnection!,
317
- transceiver,
318
- sessionId: this.session.sessionId!,
319
- trackName: stableId,
320
- });
321
- invariant(pushedTrackData);
322
-
323
- const parameters = transceiver.sender.getParameters();
324
- encodings.forEach((encoding, i) => {
325
- const existing = parameters.encodings[i];
326
- parameters.encodings[i] = { ...existing, ...encoding };
327
- });
328
- transceiver.sender.setParameters(parameters).catch((err) => log.catch(err));
329
-
330
- return pushedTrackData;
331
- }
332
-
333
- // TODO(mykola): Add retry logic if the tracks fails to pull.
334
- private async _pullTrackInBulk({
335
- peerConnection,
336
- sessionId,
337
- trackData,
338
- ctx,
339
- }: {
340
- peerConnection: RTCPeerConnection;
341
- sessionId: string;
342
- trackData: TrackObject;
343
- ctx?: Context;
344
- }): Promise<MediaStreamTrack | undefined> {
345
- let mid = '';
346
- log('pulling track', { trackName: trackData.trackName });
347
- const pulledTrackPromise = this.pullTrackDispatcher
348
- .doBulkRequest(trackData, (tracks) =>
349
- this.taskScheduler.schedule(async () => {
350
- const newTrackResponse = await this._fetch<TracksResponse>(`/sessions/${sessionId}/tracks/new?PULLING`, {
351
- method: 'POST',
352
- body: JSON.stringify({ tracks }),
353
- });
354
-
355
- if (newTrackResponse.errorCode) {
356
- throw new Error(newTrackResponse.errorDescription);
357
- }
358
-
359
- invariant(newTrackResponse.tracks);
360
- const trackMap = tracks.reduce((acc, track) => {
361
- const pulledTrackData = newTrackResponse.tracks?.find(
362
- (t) => t.trackName === track.trackName && t.sessionId === track.sessionId,
363
- );
364
-
365
- if (pulledTrackData && pulledTrackData.mid) {
366
- acc.set(track.trackName!, {
367
- mid: pulledTrackData.mid,
368
- resolvedTrack: resolveTrack(peerConnection, (t) => t.mid === pulledTrackData.mid),
369
- });
370
- }
371
-
372
- return acc;
373
- }, new Map<string, { resolvedTrack: Promise<MediaStreamTrack>; mid: string }>());
374
-
375
- if (newTrackResponse.requiresImmediateRenegotiation) {
376
- await peerConnection.setRemoteDescription(new RTCSessionDescription(newTrackResponse.sessionDescription));
377
- const answer = await peerConnection.createAnswer();
378
- await peerConnection.setLocalDescription(answer);
379
-
380
- const renegotiationResponse = await this._fetch<RenegotiationResponse>(
381
- `/sessions/${sessionId}/renegotiate`,
382
- {
383
- method: 'PUT',
384
- body: JSON.stringify({
385
- sessionDescription: {
386
- type: 'answer',
387
- sdp: peerConnection.currentLocalDescription?.sdp,
388
- },
389
- }),
390
- },
391
- );
392
-
393
- if (renegotiationResponse.errorCode) {
394
- throw new Error(renegotiationResponse.errorDescription);
395
- } else {
396
- await peerConnectionIsConnected(peerConnection);
397
- }
398
- }
399
-
400
- return { trackMap };
401
- }),
402
- )
403
- .then(({ trackMap }) => {
404
- const trackInfo = trackMap.get(trackData.trackName!);
405
- if (trackInfo) {
406
- return trackInfo.resolvedTrack
407
- .then((track) => {
408
- mid = trackInfo.mid;
409
- return track;
410
- })
411
- .catch((err) => log.catch(err));
412
- } else {
413
- log.info('missing track info', { trackData, availableTracks: Array.from(trackMap.keys()) });
414
- }
415
- });
416
-
417
- const onDispose = async () => {
418
- if (mid) {
419
- log('closing pulled track ', trackData.trackName);
420
- await this._closeTrackInBulk(peerConnection, mid, sessionId);
421
- mid = '';
422
- }
423
- };
424
-
425
- this._ctx.onDispose(() => onDispose());
426
- ctx?.onDispose(() => onDispose());
427
-
428
- return pulledTrackPromise as Promise<MediaStreamTrack | undefined>;
429
- }
430
-
431
- async pullTrack({
432
- ctx,
433
- trackData,
434
- }: {
435
- trackData: TrackObject;
436
- ctx?: Context;
437
- }): Promise<MediaStreamTrack | undefined> {
438
- await this.waitUntilOpen();
439
-
440
- invariant(this.session);
441
- const session = this.session;
442
- return this._pullTrackInBulk({
443
- peerConnection: session.peerConnection,
444
- sessionId: session.sessionId,
445
- trackData,
446
- ctx,
447
- });
448
- }
449
-
450
- async _closeTrackInBulk(peerConnection: RTCPeerConnection, mid: string, sessionId: string): Promise<void> {
451
- const transceiver = peerConnection.getTransceivers().find((t) => t.mid === mid);
452
-
453
- if (peerConnection.connectionState !== 'connected' || transceiver === undefined) {
454
- return;
455
- }
456
- await this.closeTrackDispatcher.doBulkRequest({ mid }, (mids) =>
457
- this.taskScheduler.schedule(async () => {
458
- transceiver.stop();
459
- const activeTransceivers = peerConnection
460
- .getTransceivers()
461
- .filter((t) => t.mid !== mid && t.direction !== 'stopped');
462
-
463
- let requestBody;
464
- if (activeTransceivers.length > 0) {
465
- // create an offer
466
- const offer = await peerConnection.createOffer();
467
- // And set the offer as the local description
468
- await peerConnection.setLocalDescription(offer);
469
- requestBody = {
470
- tracks: mids,
471
- sessionDescription: {
472
- sdp: peerConnection.localDescription?.sdp,
473
- type: 'offer',
474
- },
475
- force: false,
476
- };
477
- } else {
478
- requestBody = {
479
- tracks: mids,
480
- force: true,
481
- };
482
- }
483
-
484
- const response = await this._fetch<TracksResponse>(`/sessions/${sessionId}/tracks/close`, {
485
- method: 'PUT',
486
- body: JSON.stringify(requestBody),
487
- });
488
-
489
- if (requestBody.sessionDescription) {
490
- await peerConnection.setRemoteDescription(new RTCSessionDescription(response.sessionDescription));
491
- }
492
- }),
493
- );
494
- }
495
- }
496
-
497
- const resolveTrack = async (
498
- peerConnection: RTCPeerConnection,
499
- compare: (t: RTCRtpTransceiver) => boolean,
500
- timeout = NETWORK_TIMEOUT,
501
- ) =>
502
- new Promise<MediaStreamTrack>((resolve, reject) => {
503
- setTimeout(reject, timeout);
504
- const handler = () => {
505
- const transceiver = peerConnection.getTransceivers().find(compare);
506
- if (transceiver) {
507
- resolve(transceiver.receiver.track);
508
- peerConnection.removeEventListener('track', handler);
509
- }
510
- };
511
-
512
- peerConnection.addEventListener('track', handler);
513
- });
514
-
515
- const peerConnectionIsConnected = async (peerConnection: RTCPeerConnection) => {
516
- if (peerConnection.connectionState !== 'connected') {
517
- const connected = new Promise((resolve, reject) => {
518
- // Timeout after 5s.
519
- const timeout = setTimeout(() => {
520
- peerConnection.removeEventListener('connectionstatechange', connectionStateChangeHandler);
521
- reject(new Error('Connection timeout'));
522
- }, NETWORK_TIMEOUT);
523
-
524
- const connectionStateChangeHandler = () => {
525
- if (peerConnection.connectionState === 'connected') {
526
- peerConnection.removeEventListener('connectionstatechange', connectionStateChangeHandler);
527
- clearTimeout(timeout);
528
- resolve(undefined);
529
- }
530
- };
531
- peerConnection.addEventListener('connectionstatechange', connectionStateChangeHandler);
532
- });
533
-
534
- await connected;
535
- }
536
- };
537
-
538
- const INITIAL_DELAY = 50;
539
- const MAX_DELAY = 500;
540
- const MAX_RETRIES = 20;
541
- const WAIT_FOR_DATA_TIMEOUT = 10_000;
542
-
543
- const waitForTransceiverToSendData = async (ctx: Context, transceiver: RTCRtpTransceiver): Promise<void> => {
544
- let delay = INITIAL_DELAY;
545
- let checks = 0;
546
- const waitForData = new Trigger();
547
- ctx.onDispose(() => waitForData.throw(new Error('Transceiver was closed')));
548
-
549
- const checkStats = async () => {
550
- if (ctx.disposed) return;
551
-
552
- try {
553
- const stats = await transceiver.sender.getStats();
554
- let dataFound = false;
555
- stats.forEach((stat) => {
556
- if (stat.type === 'outbound-rtp' && stat.bytesSent > 0) {
557
- dataFound = true;
558
- }
559
- });
560
-
561
- if (dataFound) {
562
- waitForData.wake();
563
- return;
564
- }
565
- } catch {
566
- // Stats might not be available yet, continue checking
567
- }
568
- checks++;
569
- if (checks > MAX_RETRIES) {
570
- waitForData.throw(new Error('Transceiver did not send data'));
571
- return;
572
- }
573
-
574
- delay = Math.min(delay * 2, MAX_DELAY); // Exponential backoff with max cap
575
- scheduleTask(ctx, checkStats, delay);
576
- };
577
-
578
- void checkStats();
579
- return waitForData.wait({ timeout: WAIT_FOR_DATA_TIMEOUT });
580
- };
@@ -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
- };