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

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 (246) hide show
  1. package/dist/lib/browser/ChannelContainer-GHDNEZT2.mjs +16 -0
  2. package/dist/lib/browser/{ChatContainer-AIGIWAUG.mjs → ChatContainer-42ALOWUA.mjs} +4 -4
  3. package/dist/lib/browser/{app-graph-builder-N7BE5TYW.mjs → app-graph-builder-FHAOPO57.mjs} +5 -5
  4. package/dist/lib/browser/app-graph-builder-FHAOPO57.mjs.map +7 -0
  5. package/dist/lib/browser/{call-manager-NIPDYUVD.mjs → call-manager-EW2QC6Q4.mjs} +4 -4
  6. package/dist/lib/browser/call-manager-EW2QC6Q4.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-2I277V52.mjs +23 -0
  8. package/dist/lib/browser/{chunk-FR7KJPNY.mjs.map → chunk-2I277V52.mjs.map} +3 -3
  9. package/dist/lib/browser/{chunk-ERWASUQK.mjs → chunk-2P3GVRHP.mjs} +38 -6
  10. package/dist/lib/{node-esm/chunk-25ABSYP2.mjs.map → browser/chunk-2P3GVRHP.mjs.map} +4 -4
  11. package/dist/lib/browser/{chunk-LGSDKXPF.mjs → chunk-4APCDRSH.mjs} +1 -1
  12. package/dist/lib/browser/{chunk-LGSDKXPF.mjs.map → chunk-4APCDRSH.mjs.map} +1 -1
  13. package/dist/lib/browser/chunk-H63NDV62.mjs +376 -0
  14. package/dist/lib/browser/chunk-H63NDV62.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-J26C57ZY.mjs +548 -0
  16. package/dist/lib/browser/chunk-J26C57ZY.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-6NSMBO3B.mjs → chunk-KEXJGF2R.mjs} +4 -4
  18. package/dist/lib/browser/chunk-KEXJGF2R.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-GCLD5ESP.mjs → chunk-KTWYVC5X.mjs} +22 -12
  20. package/dist/lib/browser/chunk-KTWYVC5X.mjs.map +7 -0
  21. package/dist/lib/browser/{chunk-KWPRNHTK.mjs → chunk-TQJYDFBU.mjs} +232 -230
  22. package/dist/lib/browser/chunk-TQJYDFBU.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-ZE7KWN36.mjs → chunk-TUSBPMNU.mjs} +398 -174
  24. package/dist/lib/browser/chunk-TUSBPMNU.mjs.map +7 -0
  25. package/dist/lib/browser/index.mjs +18 -8
  26. package/dist/lib/browser/index.mjs.map +3 -3
  27. package/dist/lib/browser/{intent-resolver-JFGLZ6VI.mjs → intent-resolver-IB5GYU2D.mjs} +68 -9
  28. package/dist/lib/browser/intent-resolver-IB5GYU2D.mjs.map +7 -0
  29. package/dist/lib/browser/{markdown-M3FMR7OD.mjs → markdown-Z677YORA.mjs} +4 -4
  30. package/dist/lib/browser/markdown-Z677YORA.mjs.map +7 -0
  31. package/dist/lib/browser/meta.json +1 -1
  32. package/dist/lib/browser/{react-root-JEUSQXI6.mjs → react-root-PTTTW2MO.mjs} +9 -9
  33. package/dist/lib/browser/{react-surface-XWS6GIZY.mjs → react-surface-X2VB6P37.mjs} +9 -9
  34. package/dist/lib/browser/react-surface-X2VB6P37.mjs.map +7 -0
  35. package/dist/lib/browser/{settings-E32MTL7A.mjs → settings-GRKEID73.mjs} +2 -2
  36. package/dist/lib/browser/{state-H6CYONWE.mjs → state-2T4KDWBX.mjs} +2 -2
  37. package/dist/lib/browser/{state-H6CYONWE.mjs.map → state-2T4KDWBX.mjs.map} +2 -2
  38. package/dist/lib/browser/toolkit-KUPIIFC6.mjs +80 -0
  39. package/dist/lib/browser/toolkit-KUPIIFC6.mjs.map +7 -0
  40. package/dist/lib/browser/types/index.mjs +1 -1
  41. package/dist/lib/node-esm/{ChannelContainer-7FXCKO7X.mjs → ChannelContainer-D5E2S6AI.mjs} +7 -7
  42. package/dist/lib/node-esm/{ChatContainer-IQUWU426.mjs → ChatContainer-4EGHKHIU.mjs} +4 -4
  43. package/dist/lib/node-esm/{app-graph-builder-VCW76Z6V.mjs → app-graph-builder-XEYWX5FC.mjs} +5 -5
  44. package/dist/lib/node-esm/app-graph-builder-XEYWX5FC.mjs.map +7 -0
  45. package/dist/lib/node-esm/{call-manager-D6O5ZJJ4.mjs → call-manager-N3KASRDQ.mjs} +4 -4
  46. package/dist/lib/node-esm/call-manager-N3KASRDQ.mjs.map +7 -0
  47. package/dist/lib/node-esm/{chunk-C3XFMUAY.mjs → chunk-CCE5LHBE.mjs} +232 -230
  48. package/dist/lib/node-esm/chunk-CCE5LHBE.mjs.map +7 -0
  49. package/dist/lib/node-esm/{chunk-25ABSYP2.mjs → chunk-CTZ75IFK.mjs} +38 -6
  50. package/dist/lib/node-esm/chunk-CTZ75IFK.mjs.map +7 -0
  51. package/dist/lib/node-esm/{chunk-IHDNQLLR.mjs → chunk-JR7KESLL.mjs} +398 -174
  52. package/dist/lib/node-esm/chunk-JR7KESLL.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-NNKKNW57.mjs +549 -0
  54. package/dist/lib/node-esm/chunk-NNKKNW57.mjs.map +7 -0
  55. package/dist/lib/node-esm/{chunk-TDFHTCZZ.mjs → chunk-P6E247RF.mjs} +22 -12
  56. package/dist/lib/node-esm/chunk-P6E247RF.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-75RJ5DJI.mjs → chunk-PYTVBN5J.mjs} +1 -1
  58. package/dist/lib/node-esm/{chunk-75RJ5DJI.mjs.map → chunk-PYTVBN5J.mjs.map} +1 -1
  59. package/dist/lib/node-esm/{chunk-OU5BYIDO.mjs → chunk-S3D7DTBF.mjs} +4 -4
  60. package/dist/lib/node-esm/chunk-S3D7DTBF.mjs.map +7 -0
  61. package/dist/lib/node-esm/chunk-UHZQTPXU.mjs +377 -0
  62. package/dist/lib/node-esm/chunk-UHZQTPXU.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-UJ2QNRLS.mjs +25 -0
  64. package/dist/lib/node-esm/{chunk-2CXOK2TD.mjs.map → chunk-UJ2QNRLS.mjs.map} +3 -3
  65. package/dist/lib/node-esm/index.mjs +18 -8
  66. package/dist/lib/node-esm/index.mjs.map +3 -3
  67. package/dist/lib/node-esm/{intent-resolver-OXGNQ44Y.mjs → intent-resolver-VIMI5VLH.mjs} +68 -9
  68. package/dist/lib/node-esm/intent-resolver-VIMI5VLH.mjs.map +7 -0
  69. package/dist/lib/node-esm/{markdown-INKTE4MH.mjs → markdown-FL4IXLRP.mjs} +4 -4
  70. package/dist/lib/node-esm/markdown-FL4IXLRP.mjs.map +7 -0
  71. package/dist/lib/node-esm/meta.json +1 -1
  72. package/dist/lib/node-esm/{react-root-XYYY2JXZ.mjs → react-root-2HHRRUME.mjs} +9 -9
  73. package/dist/lib/node-esm/{react-surface-MJ33KPYE.mjs → react-surface-OLN3XNND.mjs} +9 -9
  74. package/dist/lib/node-esm/react-surface-OLN3XNND.mjs.map +7 -0
  75. package/dist/lib/node-esm/{settings-SJ24YG7M.mjs → settings-F2ODVNNW.mjs} +2 -2
  76. package/dist/lib/node-esm/{state-D7WNDT3N.mjs → state-62TQKQVB.mjs} +2 -2
  77. package/dist/lib/node-esm/{state-D7WNDT3N.mjs.map → state-62TQKQVB.mjs.map} +2 -2
  78. package/dist/lib/node-esm/toolkit-KZIS7G36.mjs +81 -0
  79. package/dist/lib/node-esm/toolkit-KZIS7G36.mjs.map +7 -0
  80. package/dist/lib/node-esm/types/index.mjs +1 -1
  81. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  82. package/dist/types/src/calls/call-manager.d.ts.map +1 -1
  83. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
  84. package/dist/types/src/calls/media-manager.d.ts +1 -1
  85. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  86. package/dist/types/src/calls/types.d.ts +1 -1
  87. package/dist/types/src/calls/types.d.ts.map +1 -1
  88. package/dist/types/src/calls/util/calls-service.d.ts +2 -2
  89. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  90. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  91. package/dist/types/src/calls-service.stories.d.ts +10 -8
  92. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  94. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/call-manager.d.ts +1 -1
  96. package/dist/types/src/capabilities/call-manager.d.ts.map +1 -1
  97. package/dist/types/src/capabilities/capabilities.d.ts +2 -2
  98. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/index.d.ts +11 -10
  100. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  101. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  102. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  103. package/dist/types/src/capabilities/markdown.d.ts +1 -1
  104. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  105. package/dist/types/src/capabilities/react-root.d.ts +2 -2
  106. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  107. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  108. package/dist/types/src/capabilities/settings.d.ts +1 -1
  109. package/dist/types/src/capabilities/state.d.ts +2 -2
  110. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  111. package/dist/types/src/capabilities/toolkit.d.ts +5 -0
  112. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -0
  113. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  114. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  115. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
  116. package/dist/types/src/components/CallSidebar.d.ts.map +1 -1
  117. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
  118. package/dist/types/src/components/ChannelContainer.stories.d.ts +87 -3
  119. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  120. package/dist/types/src/components/Chat.stories.d.ts +89 -4
  121. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  122. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  123. package/dist/types/src/components/Comments.stories.d.ts +154 -3
  124. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  125. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  126. package/dist/types/src/components/CommentsThreadContainer.d.ts +2 -2
  127. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
  128. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  129. package/dist/types/src/components/Media/VideoObject.d.ts +1 -1
  130. package/dist/types/src/components/Media/VideoObject.stories.d.ts +15 -3
  131. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  132. package/dist/types/src/components/MessageContainer.d.ts +4 -1
  133. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  134. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  135. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
  136. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +152 -2
  137. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  138. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +154 -3
  139. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  140. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  141. package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
  142. package/dist/types/src/components/command-extension.d.ts.map +1 -1
  143. package/dist/types/src/components/testing.d.ts +1 -0
  144. package/dist/types/src/components/testing.d.ts.map +1 -1
  145. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  146. package/dist/types/src/hooks/index.d.ts +1 -0
  147. package/dist/types/src/hooks/index.d.ts.map +1 -1
  148. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
  149. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
  150. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  151. package/dist/types/src/translations.d.ts +1 -0
  152. package/dist/types/src/translations.d.ts.map +1 -1
  153. package/dist/types/src/types/schema.d.ts +122 -107
  154. package/dist/types/src/types/schema.d.ts.map +1 -1
  155. package/dist/types/src/types/types.d.ts +253 -168
  156. package/dist/types/src/types/types.d.ts.map +1 -1
  157. package/dist/types/tsconfig.tsbuildinfo +1 -1
  158. package/package.json +53 -51
  159. package/src/ThreadPlugin.tsx +9 -2
  160. package/src/calls/call-manager.ts +1 -1
  161. package/src/calls/call-swarm-synchronizer.ts +1 -1
  162. package/src/calls/media-manager.ts +58 -33
  163. package/src/calls/types.ts +1 -1
  164. package/src/calls/util/calls-service.ts +56 -10
  165. package/src/calls/util/stub-media-streams.ts +4 -5
  166. package/src/calls-service.stories.tsx +76 -60
  167. package/src/capabilities/app-graph-builder.ts +8 -5
  168. package/src/capabilities/call-manager.ts +3 -2
  169. package/src/capabilities/capabilities.ts +2 -2
  170. package/src/capabilities/index.ts +1 -0
  171. package/src/capabilities/intent-resolver.ts +39 -4
  172. package/src/capabilities/markdown.ts +4 -3
  173. package/src/capabilities/react-surface.tsx +5 -4
  174. package/src/capabilities/state.ts +2 -1
  175. package/src/capabilities/toolkit.ts +78 -0
  176. package/src/components/Call/Call.tsx +3 -2
  177. package/src/components/Call/Toolbar.tsx +2 -2
  178. package/src/components/CallDebugPanel.tsx +1 -1
  179. package/src/components/CallSidebar.tsx +2 -1
  180. package/src/components/ChannelContainer.stories.tsx +6 -5
  181. package/src/components/ChannelContainer.tsx +7 -6
  182. package/src/components/Chat.stories.tsx +28 -26
  183. package/src/components/ChatContainer.tsx +8 -4
  184. package/src/components/Comments.stories.tsx +33 -29
  185. package/src/components/CommentsContainer.tsx +2 -1
  186. package/src/components/CommentsThreadContainer.tsx +9 -7
  187. package/src/components/Lobby/Lobby.tsx +1 -1
  188. package/src/components/Media/VideoObject.stories.tsx +30 -27
  189. package/src/components/MessageContainer.tsx +43 -9
  190. package/src/components/Participant/Participant.tsx +13 -7
  191. package/src/components/Participant/ParticipantGrid.tsx +2 -1
  192. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +6 -5
  193. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +42 -39
  194. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +1 -1
  195. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +2 -2
  196. package/src/components/ThreadComplementary.tsx +38 -8
  197. package/src/components/ThreadSettings.tsx +2 -2
  198. package/src/components/command-extension.ts +5 -2
  199. package/src/components/testing.ts +22 -0
  200. package/src/extensions/threads.ts +3 -3
  201. package/src/hooks/index.ts +1 -0
  202. package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
  203. package/src/hooks/useDebugMode.ts +1 -1
  204. package/src/hooks/useVideoStreamTrack.tsx +5 -2
  205. package/src/testing/stories.ts +2 -2
  206. package/src/translations.ts +1 -0
  207. package/src/types/types.ts +21 -12
  208. package/src/typings.d.ts +8 -0
  209. package/dist/lib/browser/ChannelContainer-3GIE7ASU.mjs +0 -16
  210. package/dist/lib/browser/app-graph-builder-N7BE5TYW.mjs.map +0 -7
  211. package/dist/lib/browser/call-manager-NIPDYUVD.mjs.map +0 -7
  212. package/dist/lib/browser/chunk-3SGRT4NM.mjs +0 -367
  213. package/dist/lib/browser/chunk-3SGRT4NM.mjs.map +0 -7
  214. package/dist/lib/browser/chunk-6NSMBO3B.mjs.map +0 -7
  215. package/dist/lib/browser/chunk-ERWASUQK.mjs.map +0 -7
  216. package/dist/lib/browser/chunk-FR7KJPNY.mjs +0 -21
  217. package/dist/lib/browser/chunk-GCLD5ESP.mjs.map +0 -7
  218. package/dist/lib/browser/chunk-KWPRNHTK.mjs.map +0 -7
  219. package/dist/lib/browser/chunk-VUWC4IJM.mjs +0 -479
  220. package/dist/lib/browser/chunk-VUWC4IJM.mjs.map +0 -7
  221. package/dist/lib/browser/chunk-ZE7KWN36.mjs.map +0 -7
  222. package/dist/lib/browser/intent-resolver-JFGLZ6VI.mjs.map +0 -7
  223. package/dist/lib/browser/markdown-M3FMR7OD.mjs.map +0 -7
  224. package/dist/lib/browser/react-surface-XWS6GIZY.mjs.map +0 -7
  225. package/dist/lib/node-esm/app-graph-builder-VCW76Z6V.mjs.map +0 -7
  226. package/dist/lib/node-esm/call-manager-D6O5ZJJ4.mjs.map +0 -7
  227. package/dist/lib/node-esm/chunk-2CXOK2TD.mjs +0 -23
  228. package/dist/lib/node-esm/chunk-2MFNK53T.mjs +0 -480
  229. package/dist/lib/node-esm/chunk-2MFNK53T.mjs.map +0 -7
  230. package/dist/lib/node-esm/chunk-C3XFMUAY.mjs.map +0 -7
  231. package/dist/lib/node-esm/chunk-FLBFYGBK.mjs +0 -368
  232. package/dist/lib/node-esm/chunk-FLBFYGBK.mjs.map +0 -7
  233. package/dist/lib/node-esm/chunk-IHDNQLLR.mjs.map +0 -7
  234. package/dist/lib/node-esm/chunk-OU5BYIDO.mjs.map +0 -7
  235. package/dist/lib/node-esm/chunk-TDFHTCZZ.mjs.map +0 -7
  236. package/dist/lib/node-esm/intent-resolver-OXGNQ44Y.mjs.map +0 -7
  237. package/dist/lib/node-esm/markdown-INKTE4MH.mjs.map +0 -7
  238. package/dist/lib/node-esm/react-surface-MJ33KPYE.mjs.map +0 -7
  239. /package/dist/lib/browser/{ChannelContainer-3GIE7ASU.mjs.map → ChannelContainer-GHDNEZT2.mjs.map} +0 -0
  240. /package/dist/lib/browser/{ChatContainer-AIGIWAUG.mjs.map → ChatContainer-42ALOWUA.mjs.map} +0 -0
  241. /package/dist/lib/browser/{react-root-JEUSQXI6.mjs.map → react-root-PTTTW2MO.mjs.map} +0 -0
  242. /package/dist/lib/browser/{settings-E32MTL7A.mjs.map → settings-GRKEID73.mjs.map} +0 -0
  243. /package/dist/lib/node-esm/{ChannelContainer-7FXCKO7X.mjs.map → ChannelContainer-D5E2S6AI.mjs.map} +0 -0
  244. /package/dist/lib/node-esm/{ChatContainer-IQUWU426.mjs.map → ChatContainer-4EGHKHIU.mjs.map} +0 -0
  245. /package/dist/lib/node-esm/{react-root-XYYY2JXZ.mjs.map → react-root-2HHRRUME.mjs.map} +0 -0
  246. /package/dist/lib/node-esm/{settings-SJ24YG7M.mjs.map → settings-F2ODVNNW.mjs.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createBlackCanvasStreamTrack,
3
3
  createInaudibleAudioStreamTrack
4
- } from "./chunk-6NSMBO3B.mjs";
4
+ } from "./chunk-KEXJGF2R.mjs";
5
5
 
6
6
  // src/calls/types.ts
7
7
  import { buf } from "@dxos/protocols/buf";
@@ -41,6 +41,19 @@ import { buf as buf2 } from "@dxos/protocols/buf";
41
41
  import { ActivitySchema } from "@dxos/protocols/buf/dxos/edge/calls_pb";
42
42
  import { ConnectionState } from "@dxos/protocols/proto/dxos/edge/messenger";
43
43
  import { isNonNullable } from "@dxos/util";
44
+ function _define_property(obj, key, value) {
45
+ if (key in obj) {
46
+ Object.defineProperty(obj, key, {
47
+ value,
48
+ enumerable: true,
49
+ configurable: true,
50
+ writable: true
51
+ });
52
+ } else {
53
+ obj[key] = value;
54
+ }
55
+ return obj;
56
+ }
44
57
  function _ts_decorate(decorators, target, key, desc) {
45
58
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
46
59
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -50,21 +63,6 @@ function _ts_decorate(decorators, target, key, desc) {
50
63
  var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/calls/call-swarm-synchronizer.ts";
51
64
  var DISCONNECTED_ABRUPT_TIMEOUT = 1e4;
52
65
  var CallSwarmSynchronizer = class extends Resource {
53
- constructor({ networkService }) {
54
- super();
55
- this.stateUpdated = new Event();
56
- this._state = {
57
- activities: {}
58
- };
59
- this._lastSwarmEvent = void 0;
60
- this._reconcileSwarmStateTask = void 0;
61
- this._identityKey = void 0;
62
- this._deviceKey = void 0;
63
- this._displayName = void 0;
64
- this._swarmCtx = void 0;
65
- this._sendStateTask = void 0;
66
- this._networkService = networkService;
67
- }
68
66
  /**
69
67
  * @internal
70
68
  */
@@ -338,6 +336,12 @@ var CallSwarmSynchronizer = class extends Resource {
338
336
  scheduleTaskInterval(this._ctx, async () => this._reconcileSwarmStateTask.schedule(), Math.min(DISCONNECTED_ABRUPT_TIMEOUT / 2, 1e3));
339
337
  }
340
338
  }
339
+ constructor({ networkService }) {
340
+ super(), _define_property(this, "stateUpdated", new Event()), _define_property(this, "_state", {
341
+ activities: {}
342
+ }), _define_property(this, "_networkService", void 0), _define_property(this, "_lastSwarmEvent", void 0), _define_property(this, "_reconcileSwarmStateTask", void 0), _define_property(this, "_identityKey", void 0), _define_property(this, "_deviceKey", void 0), _define_property(this, "_displayName", void 0), _define_property(this, "_swarmCtx", void 0), _define_property(this, "_sendStateTask", void 0);
343
+ this._networkService = networkService;
344
+ }
341
345
  };
342
346
  _ts_decorate([
343
347
  synchronized
@@ -403,17 +407,26 @@ var monitorAudioLevel = ({ mediaStreamTrack, intervalMs = 1e3 / 10, onMeasure })
403
407
  };
404
408
 
405
409
  // src/calls/util/calls-service.ts
406
- import { PersistentLifecycle } from "@dxos/async";
410
+ import { PersistentLifecycle, Trigger, scheduleTask } from "@dxos/async";
407
411
  import { Resource as Resource2 } from "@dxos/context";
408
412
  import { invariant as invariant2 } from "@dxos/invariant";
409
413
  import { log as log2 } from "@dxos/log";
410
414
 
411
415
  // src/calls/util/history-cache.ts
412
- var HistoryCache = class {
413
- constructor(limit = 100) {
414
- this._limit = limit;
415
- this._messages = [];
416
+ function _define_property2(obj, key, value) {
417
+ if (key in obj) {
418
+ Object.defineProperty(obj, key, {
419
+ value,
420
+ enumerable: true,
421
+ configurable: true,
422
+ writable: true
423
+ });
424
+ } else {
425
+ obj[key] = value;
416
426
  }
427
+ return obj;
428
+ }
429
+ var HistoryCache = class {
417
430
  push(...messages) {
418
431
  if (this._messages.length >= this._limit) {
419
432
  this._messages.shift();
@@ -423,53 +436,98 @@ var HistoryCache = class {
423
436
  get() {
424
437
  return this._messages;
425
438
  }
439
+ constructor(limit = 100) {
440
+ _define_property2(this, "_limit", void 0);
441
+ _define_property2(this, "_messages", void 0);
442
+ this._limit = limit;
443
+ this._messages = [];
444
+ }
426
445
  };
427
446
 
428
447
  // src/calls/util/task-scheduling.ts
448
+ function _check_private_redeclaration(obj, privateCollection) {
449
+ if (privateCollection.has(obj)) {
450
+ throw new TypeError("Cannot initialize the same private elements twice on an object");
451
+ }
452
+ }
453
+ function _class_apply_descriptor_get(receiver, descriptor) {
454
+ if (descriptor.get) {
455
+ return descriptor.get.call(receiver);
456
+ }
457
+ return descriptor.value;
458
+ }
459
+ function _class_apply_descriptor_set(receiver, descriptor, value) {
460
+ if (descriptor.set) {
461
+ descriptor.set.call(receiver, value);
462
+ } else {
463
+ if (!descriptor.writable) {
464
+ throw new TypeError("attempted to set read only private field");
465
+ }
466
+ descriptor.value = value;
467
+ }
468
+ }
469
+ function _class_extract_field_descriptor(receiver, privateMap, action) {
470
+ if (!privateMap.has(receiver)) {
471
+ throw new TypeError("attempted to " + action + " private field on non-instance");
472
+ }
473
+ return privateMap.get(receiver);
474
+ }
475
+ function _class_private_field_get(receiver, privateMap) {
476
+ var descriptor = _class_extract_field_descriptor(receiver, privateMap, "get");
477
+ return _class_apply_descriptor_get(receiver, descriptor);
478
+ }
479
+ function _class_private_field_init(obj, privateMap, value) {
480
+ _check_private_redeclaration(obj, privateMap);
481
+ privateMap.set(obj, value);
482
+ }
483
+ function _class_private_field_set(receiver, privateMap, value) {
484
+ var descriptor = _class_extract_field_descriptor(receiver, privateMap, "set");
485
+ _class_apply_descriptor_set(receiver, descriptor, value);
486
+ return value;
487
+ }
429
488
  var DefaultBatchSizeLimit = 64;
489
+ var _schedulerChain = /* @__PURE__ */ new WeakMap();
430
490
  var FIFOScheduler = class {
431
- #schedulerChain;
432
- constructor() {
433
- this.#schedulerChain = Promise.resolve();
434
- }
435
491
  schedule(task) {
436
492
  return new Promise((resolve, reject) => {
437
- this.#schedulerChain = this.#schedulerChain.then(async () => {
493
+ _class_private_field_set(this, _schedulerChain, _class_private_field_get(this, _schedulerChain).then(async () => {
438
494
  try {
439
495
  resolve(await task());
440
496
  } catch (error) {
441
497
  reject(error);
442
498
  }
443
- });
499
+ }));
500
+ });
501
+ }
502
+ constructor() {
503
+ _class_private_field_init(this, _schedulerChain, {
504
+ writable: true,
505
+ value: void 0
444
506
  });
507
+ _class_private_field_set(this, _schedulerChain, Promise.resolve());
445
508
  }
446
509
  };
510
+ var _currentBatch = /* @__PURE__ */ new WeakMap();
511
+ var _currentBulkResponse = /* @__PURE__ */ new WeakMap();
512
+ var _batchSizeLimit = /* @__PURE__ */ new WeakMap();
447
513
  var BulkRequestDispatcher = class {
448
- #currentBatch;
449
- #currentBulkResponse;
450
- #batchSizeLimit;
451
- constructor(batchSizeLimit = DefaultBatchSizeLimit) {
452
- this.#currentBatch = [];
453
- this.#currentBulkResponse = null;
454
- this.#batchSizeLimit = batchSizeLimit;
455
- }
456
514
  /**
457
515
  * Returns a bulk response promise.
458
516
  * At the event loop iteration end, the accumulated entries will be dispatched as a bulk request.
459
517
  */
460
518
  doBulkRequest(params, bulkRequestFunc) {
461
- if (this.#currentBatch.length >= this.#batchSizeLimit) {
462
- this.#currentBatch = [];
463
- this.#currentBulkResponse = null;
519
+ if (_class_private_field_get(this, _currentBatch).length >= _class_private_field_get(this, _batchSizeLimit)) {
520
+ _class_private_field_set(this, _currentBatch, []);
521
+ _class_private_field_set(this, _currentBulkResponse, null);
464
522
  }
465
- this.#currentBatch.push(params);
466
- if (this.#currentBulkResponse != null) {
467
- return this.#currentBulkResponse;
523
+ _class_private_field_get(this, _currentBatch).push(params);
524
+ if (_class_private_field_get(this, _currentBulkResponse) != null) {
525
+ return _class_private_field_get(this, _currentBulkResponse);
468
526
  }
469
- const batch = this.#currentBatch;
470
- this.#currentBulkResponse = new Promise((resolve, reject) => {
527
+ const batch = _class_private_field_get(this, _currentBatch);
528
+ _class_private_field_set(this, _currentBulkResponse, new Promise((resolve, reject) => {
471
529
  setTimeout(() => {
472
- this.#currentBulkResponse = null;
530
+ _class_private_field_set(this, _currentBulkResponse, null);
473
531
  const batchCopy = batch.splice(0, batch.length);
474
532
  bulkRequestFunc(batchCopy).then((result) => {
475
533
  resolve(result);
@@ -477,28 +535,45 @@ var BulkRequestDispatcher = class {
477
535
  reject(err);
478
536
  });
479
537
  }, 0);
538
+ }));
539
+ return _class_private_field_get(this, _currentBulkResponse);
540
+ }
541
+ constructor(batchSizeLimit = DefaultBatchSizeLimit) {
542
+ _class_private_field_init(this, _currentBatch, {
543
+ writable: true,
544
+ value: void 0
545
+ });
546
+ _class_private_field_init(this, _currentBulkResponse, {
547
+ writable: true,
548
+ value: void 0
480
549
  });
481
- return this.#currentBulkResponse;
550
+ _class_private_field_init(this, _batchSizeLimit, {
551
+ writable: true,
552
+ value: void 0
553
+ });
554
+ _class_private_field_set(this, _currentBatch, []);
555
+ _class_private_field_set(this, _currentBulkResponse, null);
556
+ _class_private_field_set(this, _batchSizeLimit, batchSizeLimit);
482
557
  }
483
558
  };
484
559
 
485
560
  // src/calls/util/calls-service.ts
561
+ function _define_property3(obj, key, value) {
562
+ if (key in obj) {
563
+ Object.defineProperty(obj, key, {
564
+ value,
565
+ enumerable: true,
566
+ configurable: true,
567
+ writable: true
568
+ });
569
+ } else {
570
+ obj[key] = value;
571
+ }
572
+ return obj;
573
+ }
486
574
  var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/calls/util/calls-service.ts";
487
575
  var NETWORK_TIMEOUT = 5e3;
488
576
  var CallsServicePeer = class extends Resource2 {
489
- constructor(config) {
490
- super();
491
- this.history = new HistoryCache(100);
492
- this._persistentLifecycle = new PersistentLifecycle({
493
- start: () => this._startSession(),
494
- stop: (session) => this._stopSession(session)
495
- });
496
- this.taskScheduler = new FIFOScheduler();
497
- this.pushTrackDispatcher = new BulkRequestDispatcher(32);
498
- this.pullTrackDispatcher = new BulkRequestDispatcher(32);
499
- this.closeTrackDispatcher = new BulkRequestDispatcher(32);
500
- this._config = config;
501
- }
502
577
  async _open(ctx) {
503
578
  await this._persistentLifecycle.open(ctx);
504
579
  }
@@ -530,7 +605,7 @@ var CallsServicePeer = class extends Resource2 {
530
605
  state: peerConnection.connectionState
531
606
  }, {
532
607
  F: __dxlog_file2,
533
- L: 118,
608
+ L: 119,
534
609
  S: this,
535
610
  C: (f, a) => f(...a)
536
611
  });
@@ -545,7 +620,7 @@ var CallsServicePeer = class extends Resource2 {
545
620
  state: peerConnection.iceConnectionState
546
621
  }, {
547
622
  F: __dxlog_file2,
548
- L: 127,
623
+ L: 128,
549
624
  S: this,
550
625
  C: (f, a) => f(...a)
551
626
  });
@@ -556,7 +631,7 @@ var CallsServicePeer = class extends Resource2 {
556
631
  if (peerConnection.iceConnectionState === "connected") {
557
632
  log2.info("calls iceConnectionState is connected", void 0, {
558
633
  F: __dxlog_file2,
559
- L: 136,
634
+ L: 137,
560
635
  S: this,
561
636
  C: (f, a) => f(...a)
562
637
  });
@@ -567,7 +642,7 @@ var CallsServicePeer = class extends Resource2 {
567
642
  timeoutSeconds
568
643
  }, {
569
644
  F: __dxlog_file2,
570
- L: 140,
645
+ L: 141,
571
646
  S: this,
572
647
  C: (f, a) => f(...a)
573
648
  });
@@ -580,7 +655,7 @@ var CallsServicePeer = class extends Resource2 {
580
655
  async _initiateCallSession() {
581
656
  log2("creating new session", void 0, {
582
657
  F: __dxlog_file2,
583
- L: 150,
658
+ L: 151,
584
659
  S: this,
585
660
  C: (f, a) => f(...a)
586
661
  });
@@ -606,7 +681,7 @@ var CallsServicePeer = class extends Resource2 {
606
681
  text: await response.text()
607
682
  }, {
608
683
  F: __dxlog_file2,
609
- L: 165,
684
+ L: 166,
610
685
  S: this,
611
686
  C: (f, a) => f(...a)
612
687
  });
@@ -638,7 +713,7 @@ var CallsServicePeer = class extends Resource2 {
638
713
  status: response.status
639
714
  }, {
640
715
  F: __dxlog_file2,
641
- L: 190,
716
+ L: 191,
642
717
  S: this,
643
718
  C: (f, a) => f(...a)
644
719
  });
@@ -648,7 +723,7 @@ var CallsServicePeer = class extends Resource2 {
648
723
  async _pushTrackInBulk({ ctx, peerConnection, transceiver, sessionId, trackName }) {
649
724
  log2.verbose("pushing track ", trackName, {
650
725
  F: __dxlog_file2,
651
- L: 212,
726
+ L: 213,
652
727
  S: this,
653
728
  C: (f, a) => f(...a)
654
729
  });
@@ -675,7 +750,7 @@ var CallsServicePeer = class extends Resource2 {
675
750
  });
676
751
  invariant2(response.tracks !== void 0, void 0, {
677
752
  F: __dxlog_file2,
678
- L: 237,
753
+ L: 238,
679
754
  S: this,
680
755
  A: [
681
756
  "response.tracks !== undefined",
@@ -689,9 +764,10 @@ var CallsServicePeer = class extends Resource2 {
689
764
  return {
690
765
  tracks: response.tracks
691
766
  };
692
- })).then(({ tracks }) => {
767
+ })).then(async ({ tracks }) => {
693
768
  const trackData = tracks.find((t) => t.mid === transceiver.mid);
694
769
  if (trackData) {
770
+ await waitForTransceiverToSendData(ctx, transceiver);
695
771
  return {
696
772
  ...trackData,
697
773
  sessionId,
@@ -700,18 +776,11 @@ var CallsServicePeer = class extends Resource2 {
700
776
  } else {
701
777
  log2.error("missing track data", void 0, {
702
778
  F: __dxlog_file2,
703
- L: 257,
779
+ L: 262,
704
780
  S: this,
705
781
  C: (f, a) => f(...a)
706
782
  });
707
783
  }
708
- }).catch((err) => {
709
- log2.catch(err, void 0, {
710
- F: __dxlog_file2,
711
- L: 261,
712
- S: this,
713
- C: (f, a) => f(...a)
714
- });
715
784
  });
716
785
  const onDispose = async () => {
717
786
  if (transceiver.mid) {
@@ -726,7 +795,7 @@ var CallsServicePeer = class extends Resource2 {
726
795
  await this.waitUntilOpen();
727
796
  invariant2(this.session, void 0, {
728
797
  F: __dxlog_file2,
729
- L: 288,
798
+ L: 290,
730
799
  S: this,
731
800
  A: [
732
801
  "this.session",
@@ -739,7 +808,7 @@ var CallsServicePeer = class extends Resource2 {
739
808
  encodings
740
809
  }, {
741
810
  F: __dxlog_file2,
742
- L: 289,
811
+ L: 291,
743
812
  S: this,
744
813
  C: (f, a) => f(...a)
745
814
  });
@@ -752,7 +821,7 @@ var CallsServicePeer = class extends Resource2 {
752
821
  transceiver: transceiver2
753
822
  }, {
754
823
  F: __dxlog_file2,
755
- L: 293,
824
+ L: 295,
756
825
  S: this,
757
826
  C: (f, a) => f(...a)
758
827
  });
@@ -764,13 +833,13 @@ var CallsServicePeer = class extends Resource2 {
764
833
  transceiver: transceiver2
765
834
  }, {
766
835
  F: __dxlog_file2,
767
- L: 296,
836
+ L: 298,
768
837
  S: this,
769
838
  C: (f, a) => f(...a)
770
839
  });
771
840
  transceiver2.sender.replaceTrack(track).catch((err) => log2.catch(err, void 0, {
772
841
  F: __dxlog_file2,
773
- L: 297,
842
+ L: 299,
774
843
  S: this,
775
844
  C: (f, a) => f(...a)
776
845
  }));
@@ -779,7 +848,7 @@ var CallsServicePeer = class extends Resource2 {
779
848
  }
780
849
  invariant2(track, void 0, {
781
850
  F: __dxlog_file2,
782
- L: 301,
851
+ L: 303,
783
852
  S: this,
784
853
  A: [
785
854
  "track",
@@ -792,7 +861,7 @@ var CallsServicePeer = class extends Resource2 {
792
861
  });
793
862
  log2.verbose("creating transceiver", void 0, {
794
863
  F: __dxlog_file2,
795
- L: 306,
864
+ L: 308,
796
865
  S: this,
797
866
  C: (f, a) => f(...a)
798
867
  });
@@ -805,7 +874,7 @@ var CallsServicePeer = class extends Resource2 {
805
874
  });
806
875
  invariant2(pushedTrackData, void 0, {
807
876
  F: __dxlog_file2,
808
- L: 315,
877
+ L: 317,
809
878
  S: this,
810
879
  A: [
811
880
  "pushedTrackData",
@@ -822,7 +891,7 @@ var CallsServicePeer = class extends Resource2 {
822
891
  });
823
892
  transceiver.sender.setParameters(parameters).catch((err) => log2.catch(err, void 0, {
824
893
  F: __dxlog_file2,
825
- L: 322,
894
+ L: 324,
826
895
  S: this,
827
896
  C: (f, a) => f(...a)
828
897
  }));
@@ -835,7 +904,7 @@ var CallsServicePeer = class extends Resource2 {
835
904
  trackName: trackData.trackName
836
905
  }, {
837
906
  F: __dxlog_file2,
838
- L: 340,
907
+ L: 342,
839
908
  S: this,
840
909
  C: (f, a) => f(...a)
841
910
  });
@@ -851,7 +920,7 @@ var CallsServicePeer = class extends Resource2 {
851
920
  }
852
921
  invariant2(newTrackResponse.tracks, void 0, {
853
922
  F: __dxlog_file2,
854
- L: 353,
923
+ L: 355,
855
924
  S: this,
856
925
  A: [
857
926
  "newTrackResponse.tracks",
@@ -898,7 +967,7 @@ var CallsServicePeer = class extends Resource2 {
898
967
  return track;
899
968
  }).catch((err) => log2.catch(err, void 0, {
900
969
  F: __dxlog_file2,
901
- L: 405,
970
+ L: 407,
902
971
  S: this,
903
972
  C: (f, a) => f(...a)
904
973
  }));
@@ -908,7 +977,7 @@ var CallsServicePeer = class extends Resource2 {
908
977
  availableTracks: Array.from(trackMap.keys())
909
978
  }, {
910
979
  F: __dxlog_file2,
911
- L: 407,
980
+ L: 409,
912
981
  S: this,
913
982
  C: (f, a) => f(...a)
914
983
  });
@@ -918,7 +987,7 @@ var CallsServicePeer = class extends Resource2 {
918
987
  if (mid) {
919
988
  log2("closing pulled track ", trackData.trackName, {
920
989
  F: __dxlog_file2,
921
- L: 413,
990
+ L: 415,
922
991
  S: this,
923
992
  C: (f, a) => f(...a)
924
993
  });
@@ -934,7 +1003,7 @@ var CallsServicePeer = class extends Resource2 {
934
1003
  await this.waitUntilOpen();
935
1004
  invariant2(this.session, void 0, {
936
1005
  F: __dxlog_file2,
937
- L: 434,
1006
+ L: 436,
938
1007
  S: this,
939
1008
  A: [
940
1009
  "this.session",
@@ -986,6 +1055,13 @@ var CallsServicePeer = class extends Resource2 {
986
1055
  }
987
1056
  }));
988
1057
  }
1058
+ constructor(config) {
1059
+ super(), _define_property3(this, "history", new HistoryCache(100)), _define_property3(this, "_persistentLifecycle", new PersistentLifecycle({
1060
+ start: () => this._startSession(),
1061
+ stop: (session) => this._stopSession(session)
1062
+ })), _define_property3(this, "_config", void 0), _define_property3(this, "taskScheduler", new FIFOScheduler()), _define_property3(this, "pushTrackDispatcher", new BulkRequestDispatcher(32)), _define_property3(this, "pullTrackDispatcher", new BulkRequestDispatcher(32)), _define_property3(this, "closeTrackDispatcher", new BulkRequestDispatcher(32));
1063
+ this._config = config;
1064
+ }
989
1065
  };
990
1066
  var resolveTrack = async (peerConnection, compare, timeout = NETWORK_TIMEOUT) => new Promise((resolve, reject) => {
991
1067
  setTimeout(reject, timeout);
@@ -1017,12 +1093,50 @@ var peerConnectionIsConnected = async (peerConnection) => {
1017
1093
  await connected;
1018
1094
  }
1019
1095
  };
1096
+ var INITIAL_DELAY = 50;
1097
+ var MAX_DELAY = 500;
1098
+ var MAX_RETRIES = 50;
1099
+ var WAIT_FOR_DATA_TIMEOUT = 2e4;
1100
+ var waitForTransceiverToSendData = async (ctx, transceiver) => {
1101
+ let delay = INITIAL_DELAY;
1102
+ let checks = 0;
1103
+ const waitForData = new Trigger();
1104
+ ctx.onDispose(() => waitForData.throw(new Error("Transceiver was closed")));
1105
+ const checkStats = async () => {
1106
+ if (ctx.disposed) return;
1107
+ try {
1108
+ const stats = await transceiver.sender.getStats();
1109
+ let dataFound = false;
1110
+ stats.forEach((stat) => {
1111
+ if (stat.type === "outbound-rtp" && stat.bytesSent > 0) {
1112
+ dataFound = true;
1113
+ }
1114
+ });
1115
+ if (dataFound) {
1116
+ waitForData.wake();
1117
+ return;
1118
+ }
1119
+ } catch {
1120
+ }
1121
+ checks++;
1122
+ if (checks > MAX_RETRIES) {
1123
+ waitForData.throw(new Error("Transceiver did not send data"));
1124
+ return;
1125
+ }
1126
+ delay = Math.min(delay * 2, MAX_DELAY);
1127
+ scheduleTask(ctx, checkStats, delay);
1128
+ };
1129
+ void checkStats();
1130
+ return waitForData.wait({
1131
+ timeout: WAIT_FOR_DATA_TIMEOUT
1132
+ });
1133
+ };
1020
1134
 
1021
1135
  // src/calls/util/media.ts
1022
1136
  import { log as log3 } from "@dxos/log";
1023
1137
  var __dxlog_file3 = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/calls/util/media.ts";
1024
1138
  var getUserMediaTrack = async (kind, constraints = {}, deviceList) => {
1025
- deviceList ??= (await getDeviceList()).filter((device) => device.kind === kind);
1139
+ deviceList ?? (deviceList = (await getDeviceList()).filter((device) => device.kind === kind));
1026
1140
  const firstDevice = deviceList[0];
1027
1141
  if (!firstDevice) {
1028
1142
  throw new Error("No devices found");
@@ -1077,14 +1191,24 @@ var getScreenshare = async ({ contentHint }) => {
1077
1191
  // src/calls/speaking-monitor.ts
1078
1192
  import { DeferredTask as DeferredTask2, Event as Event2, sleep } from "@dxos/async";
1079
1193
  import { Resource as Resource3 } from "@dxos/context";
1194
+ function _define_property4(obj, key, value) {
1195
+ if (key in obj) {
1196
+ Object.defineProperty(obj, key, {
1197
+ value,
1198
+ enumerable: true,
1199
+ configurable: true,
1200
+ writable: true
1201
+ });
1202
+ } else {
1203
+ obj[key] = value;
1204
+ }
1205
+ return obj;
1206
+ }
1080
1207
  var NOT_SPEAKING_AFTER = 500;
1081
1208
  var START_SPEAKING_THRESHOLD = 0.05;
1082
1209
  var CONTINUE_SPEAKING_THRESHOLD = 0.02;
1083
1210
  var MIN_EVENT_INTERVAL = 100;
1084
1211
  var SpeakingMonitor = class extends Resource3 {
1085
- constructor(_mediaStreamTrack) {
1086
- super(), this._mediaStreamTrack = _mediaStreamTrack, this.speakingChanged = new Event2(), this._isSpeaking = false, this._lastEventTime = 0;
1087
- }
1088
1212
  get isSpeaking() {
1089
1213
  return this._isSpeaking;
1090
1214
  }
@@ -1128,12 +1252,36 @@ var SpeakingMonitor = class extends Resource3 {
1128
1252
  this._lastEventTime = Date.now();
1129
1253
  this.speakingChanged.emit(this._isSpeaking);
1130
1254
  }
1255
+ constructor(_mediaStreamTrack) {
1256
+ super(), _define_property4(this, "_mediaStreamTrack", void 0), /**
1257
+ * Event that is emitted when the user starts or stops speaking.
1258
+ * It is debounced to prevent rapid state changes.
1259
+ */
1260
+ _define_property4(this, "speakingChanged", void 0), /**
1261
+ * Real state of the user speaking.
1262
+ */
1263
+ _define_property4(this, "_isSpeaking", void 0), _define_property4(this, "_lastEventTime", void 0), _define_property4(this, "_deferredUpdate", void 0), this._mediaStreamTrack = _mediaStreamTrack, this.speakingChanged = new Event2(), this._isSpeaking = false, this._lastEventTime = 0;
1264
+ }
1131
1265
  };
1132
1266
 
1133
1267
  // src/calls/media-manager.ts
1134
1268
  import { DeferredTask as DeferredTask3, Event as Event3, sleep as sleep2, synchronized as synchronized2 } from "@dxos/async";
1135
- import { cancelWithContext, Resource as Resource4 } from "@dxos/context";
1269
+ import { Resource as Resource4, cancelWithContext } from "@dxos/context";
1270
+ import { invariant as invariant3 } from "@dxos/invariant";
1136
1271
  import { log as log4 } from "@dxos/log";
1272
+ function _define_property5(obj, key, value) {
1273
+ if (key in obj) {
1274
+ Object.defineProperty(obj, key, {
1275
+ value,
1276
+ enumerable: true,
1277
+ configurable: true,
1278
+ writable: true
1279
+ });
1280
+ } else {
1281
+ obj[key] = value;
1282
+ }
1283
+ return obj;
1284
+ }
1137
1285
  function _ts_decorate2(decorators, target, key, desc) {
1138
1286
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1139
1287
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -1145,23 +1293,9 @@ var VIDEO_WIDTH = 1280;
1145
1293
  var VIDEO_HEIGHT = 720;
1146
1294
  var MAX_WEB_CAM_FRAMERATE = 24;
1147
1295
  var MAX_WEB_CAM_BITRATE = 12e5;
1148
- var RETRY_INTERVAL = 500;
1149
- var USE_INAUDIBLE_AUDIO = false;
1296
+ var RETRY_INTERVAL = 100;
1297
+ var USE_INAUDIBLE_AUDIO = true;
1150
1298
  var MediaManager = class extends Resource4 {
1151
- constructor() {
1152
- super(...arguments);
1153
- this.stateUpdated = new Event3();
1154
- this._state = {
1155
- pulledVideoStreams: {},
1156
- pulledAudioTracks: {}
1157
- };
1158
- this._speakingMonitor = void 0;
1159
- this._trackToReconcile = [];
1160
- this._blackCanvasStreamTrack = void 0;
1161
- this._inaudibleAudioStreamTrack = void 0;
1162
- this._pushTracksTask = void 0;
1163
- this._pullTracksTask = void 0;
1164
- }
1165
1299
  get isSpeaking() {
1166
1300
  return this._speakingMonitor?.isSpeaking;
1167
1301
  }
@@ -1301,7 +1435,7 @@ var MediaManager = class extends Resource4 {
1301
1435
  async _reconcilePulledMedia() {
1302
1436
  log4("reconciling tracks", void 0, {
1303
1437
  F: __dxlog_file4,
1304
- L: 222,
1438
+ L: 223,
1305
1439
  S: this,
1306
1440
  C: (f, a) => f(...a)
1307
1441
  });
@@ -1319,11 +1453,11 @@ var MediaManager = class extends Resource4 {
1319
1453
  currentVideoStreams: Object.keys(this._state.pulledVideoStreams)
1320
1454
  }, {
1321
1455
  F: __dxlog_file4,
1322
- L: 241,
1456
+ L: 242,
1323
1457
  S: this,
1324
1458
  C: (f, a) => f(...a)
1325
1459
  });
1326
- await Promise.all(tracksToPull.map((name) => this._pullTrack(name)));
1460
+ const pullResults = await Promise.all(tracksToPull.map((name) => this._pullTrack(name)));
1327
1461
  await Promise.all([
1328
1462
  ...audioTracksToClose,
1329
1463
  ...videoStreamsToClose
@@ -1333,47 +1467,91 @@ var MediaManager = class extends Resource4 {
1333
1467
  currentVideoStreams: Object.keys(this._state.pulledVideoStreams)
1334
1468
  }, {
1335
1469
  F: __dxlog_file4,
1336
- L: 256,
1470
+ L: 257,
1337
1471
  S: this,
1338
1472
  C: (f, a) => f(...a)
1339
1473
  });
1340
1474
  this.stateUpdated.emit(this._state);
1475
+ if (pullResults.some(({ shouldRetry }) => shouldRetry)) {
1476
+ await cancelWithContext(this._ctx, sleep2(RETRY_INTERVAL));
1477
+ log4.info("retrying pull tracks", {
1478
+ tracksToPull
1479
+ }, {
1480
+ F: __dxlog_file4,
1481
+ L: 265,
1482
+ S: this,
1483
+ C: (f, a) => f(...a)
1484
+ });
1485
+ invariant3(this._pullTracksTask, void 0, {
1486
+ F: __dxlog_file4,
1487
+ L: 266,
1488
+ S: this,
1489
+ A: [
1490
+ "this._pullTracksTask",
1491
+ ""
1492
+ ]
1493
+ });
1494
+ this._pullTracksTask.schedule();
1495
+ }
1341
1496
  }
1342
1497
  async _pushTracks() {
1343
1498
  if (!this._state.peer?.isOpen) {
1344
1499
  return;
1345
1500
  }
1346
1501
  let updated = false;
1347
- const [pushedVideoTrack, pushedAudioTrack, pushedScreenshareTrack] = await Promise.all([
1348
- this._pushTrack(this._state.videoTrack, this._state.pushedVideoTrack, [
1502
+ const [pushVideoResult, pushAudioResult, pushScreenshareResult] = await Promise.all([
1503
+ this._maybePushTrack(this._state.videoTrack, this._state.pushedVideoTrack, [
1349
1504
  {
1350
1505
  maxFramerate: MAX_WEB_CAM_FRAMERATE,
1351
1506
  maxBitrate: MAX_WEB_CAM_BITRATE
1352
1507
  }
1353
1508
  ]),
1354
- this._pushTrack(this._state.audioTrack, this._state.pushedAudioTrack, [
1509
+ this._maybePushTrack(this._state.audioTrack, this._state.pushedAudioTrack, [
1355
1510
  {
1356
1511
  networkPriority: "high"
1357
1512
  }
1358
1513
  ]),
1359
- this._pushTrack(this._state.screenshareTrack, this._state.pushedScreenshareTrack)
1514
+ this._maybePushTrack(this._state.screenshareTrack, this._state.pushedScreenshareTrack)
1360
1515
  ]);
1361
- if (pushedVideoTrack !== this._state.pushedVideoTrack) {
1362
- this._state.pushedVideoTrack = pushedVideoTrack;
1516
+ if (pushVideoResult.track !== this._state.pushedVideoTrack) {
1517
+ this._state.pushedVideoTrack = pushVideoResult.track;
1363
1518
  updated = true;
1364
1519
  }
1365
- if (pushedAudioTrack !== this._state.pushedAudioTrack) {
1366
- this._state.pushedAudioTrack = pushedAudioTrack;
1520
+ if (pushAudioResult.track !== this._state.pushedAudioTrack) {
1521
+ this._state.pushedAudioTrack = pushAudioResult.track;
1367
1522
  updated = true;
1368
1523
  }
1369
- if (pushedScreenshareTrack !== this._state.pushedScreenshareTrack) {
1370
- this._state.pushedScreenshareTrack = pushedScreenshareTrack;
1524
+ if (pushScreenshareResult.track !== this._state.pushedScreenshareTrack) {
1525
+ this._state.pushedScreenshareTrack = pushScreenshareResult.track;
1371
1526
  updated = true;
1372
1527
  }
1373
- if (!updated) {
1374
- return;
1528
+ const shouldRetry = pushVideoResult.shouldRetry || pushAudioResult.shouldRetry || pushScreenshareResult.shouldRetry;
1529
+ if (updated) {
1530
+ this.stateUpdated.emit(this._state);
1531
+ }
1532
+ if (shouldRetry) {
1533
+ await cancelWithContext(this._ctx, sleep2(RETRY_INTERVAL));
1534
+ log4.info("retrying push tracks", {
1535
+ pushVideoResult,
1536
+ pushAudioResult,
1537
+ pushScreenshareResult
1538
+ }, {
1539
+ F: __dxlog_file4,
1540
+ L: 306,
1541
+ S: this,
1542
+ C: (f, a) => f(...a)
1543
+ });
1544
+ invariant3(this._pushTracksTask, void 0, {
1545
+ F: __dxlog_file4,
1546
+ L: 307,
1547
+ S: this,
1548
+ A: [
1549
+ "this._pushTracksTask",
1550
+ ""
1551
+ ]
1552
+ });
1553
+ this._pushTracksTask.schedule();
1375
1554
  }
1376
- this.stateUpdated.emit(this._state);
1377
1555
  }
1378
1556
  async _pullTrack(name) {
1379
1557
  const ctx = this._ctx.derive();
@@ -1393,7 +1571,9 @@ var MediaManager = class extends Resource4 {
1393
1571
  ctx
1394
1572
  };
1395
1573
  ctx.onDispose(() => delete this._state.pulledAudioTracks[name]);
1396
- break;
1574
+ return {
1575
+ shouldRetry: false
1576
+ };
1397
1577
  }
1398
1578
  case "video": {
1399
1579
  const mediaStream = new MediaStream();
@@ -1407,43 +1587,68 @@ var MediaManager = class extends Resource4 {
1407
1587
  track.stop();
1408
1588
  delete this._state.pulledVideoStreams[name];
1409
1589
  });
1410
- break;
1590
+ return {
1591
+ shouldRetry: false
1592
+ };
1411
1593
  }
1412
1594
  default:
1413
1595
  throw new Error(`Invalid track kind: ${track?.kind}`);
1414
1596
  }
1415
1597
  } catch (err) {
1416
- log4.verbose("failed to pull track", {
1598
+ log4.info("failed to pull track", {
1417
1599
  err,
1418
1600
  name
1419
1601
  }, {
1420
1602
  F: __dxlog_file4,
1421
- L: 326,
1603
+ L: 342,
1422
1604
  S: this,
1423
1605
  C: (f, a) => f(...a)
1424
1606
  });
1425
1607
  void ctx.dispose();
1426
- await cancelWithContext(this._ctx, sleep2(RETRY_INTERVAL));
1427
- log4.verbose("retrying pull track", {
1428
- name
1608
+ return {
1609
+ shouldRetry: true
1610
+ };
1611
+ }
1612
+ }
1613
+ async _maybePushTrack(track, previousTrack, encodings) {
1614
+ if (!track && !previousTrack) {
1615
+ return {
1616
+ track: void 0
1617
+ };
1618
+ }
1619
+ const ctx = this._ctx.derive();
1620
+ try {
1621
+ return {
1622
+ track: await this._state.peer.pushTrack({
1623
+ ctx,
1624
+ track: track ?? null,
1625
+ previousTrack,
1626
+ encodings
1627
+ })
1628
+ };
1629
+ } catch (err) {
1630
+ log4.info("failed to push track", {
1631
+ err,
1632
+ track,
1633
+ previousTrack,
1634
+ encodings
1429
1635
  }, {
1430
1636
  F: __dxlog_file4,
1431
- L: 329,
1637
+ L: 369,
1432
1638
  S: this,
1433
1639
  C: (f, a) => f(...a)
1434
1640
  });
1435
- this._pullTracksTask.schedule();
1641
+ void ctx.dispose();
1642
+ return {
1643
+ shouldRetry: true
1644
+ };
1436
1645
  }
1437
1646
  }
1438
- async _pushTrack(track, previousTrack, encodings) {
1439
- if (!track && !previousTrack) {
1440
- return;
1441
- }
1442
- return this._state.peer.pushTrack({
1443
- track: track ?? null,
1444
- previousTrack,
1445
- encodings
1446
- });
1647
+ constructor(...args) {
1648
+ super(...args), _define_property5(this, "stateUpdated", new Event3()), _define_property5(this, "_state", {
1649
+ pulledVideoStreams: {},
1650
+ pulledAudioTracks: {}
1651
+ }), _define_property5(this, "_speakingMonitor", void 0), _define_property5(this, "_trackToReconcile", []), _define_property5(this, "_blackCanvasStreamTrack", void 0), _define_property5(this, "_inaudibleAudioStreamTrack", void 0), _define_property5(this, "_pushTracksTask", void 0), _define_property5(this, "_pullTracksTask", void 0);
1447
1652
  }
1448
1653
  };
1449
1654
  _ts_decorate2([
@@ -1457,9 +1662,22 @@ _ts_decorate2([
1457
1662
  import { computed } from "@preact/signals-core";
1458
1663
  import { Event as Event4, synchronized as synchronized3 } from "@dxos/async";
1459
1664
  import { Resource as Resource5 } from "@dxos/context";
1460
- import { invariant as invariant3 } from "@dxos/invariant";
1665
+ import { invariant as invariant4 } from "@dxos/invariant";
1461
1666
  import { live } from "@dxos/live-object";
1462
1667
  import { isNonNullable as isNonNullable2 } from "@dxos/util";
1668
+ function _define_property6(obj, key, value) {
1669
+ if (key in obj) {
1670
+ Object.defineProperty(obj, key, {
1671
+ value,
1672
+ enumerable: true,
1673
+ configurable: true,
1674
+ writable: true
1675
+ });
1676
+ } else {
1677
+ obj[key] = value;
1678
+ }
1679
+ return obj;
1680
+ }
1463
1681
  function _ts_decorate3(decorators, target, key, desc) {
1464
1682
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1465
1683
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -1546,31 +1764,6 @@ var CallManager = class extends Resource5 {
1546
1764
  turnScreenshareOff() {
1547
1765
  return this._mediaManager.turnScreenshareOff();
1548
1766
  }
1549
- // TODO(burdon): Can this be mocked?
1550
- constructor(_client) {
1551
- super(), this._client = _client, this.callStateUpdated = new Event4(), this.mediaStateUpdated = new Event4(), this.left = new Event4(), this._state = live({
1552
- call: {},
1553
- media: {
1554
- pulledAudioTracks: {},
1555
- pulledVideoStreams: {}
1556
- }
1557
- }), this._raisedHandSignal = computed(() => this._state.call.raisedHand ?? false), this._speakingSignal = computed(() => this._state.call.speaking ?? false), this._joinedSignal = computed(() => this._state.call.joined ?? false);
1558
- this._client.config.getOrThrow("runtime.services.edge.url");
1559
- const networkService = this._client.services.services.NetworkService;
1560
- invariant3(networkService, "network service not found", {
1561
- F: __dxlog_file5,
1562
- L: 159,
1563
- S: this,
1564
- A: [
1565
- "networkService",
1566
- "'network service not found'"
1567
- ]
1568
- });
1569
- this._swarmSynchronizer = new CallSwarmSynchronizer({
1570
- networkService
1571
- });
1572
- this._mediaManager = new MediaManager();
1573
- }
1574
1767
  async _open() {
1575
1768
  await this._mediaManager.open();
1576
1769
  await this._swarmSynchronizer.open();
@@ -1644,6 +1837,37 @@ var CallManager = class extends Resource5 {
1644
1837
  this._state.call = this._swarmSynchronizer._getState();
1645
1838
  this._state.media = this._mediaManager._getState();
1646
1839
  }
1840
+ // TODO(burdon): Can this be mocked?
1841
+ constructor(_client) {
1842
+ super(), _define_property6(this, "_client", void 0), _define_property6(this, "callStateUpdated", void 0), // TODO(wittjosiah): Consolidate isSpeaking into the MediaState type.
1843
+ _define_property6(this, "mediaStateUpdated", void 0), _define_property6(this, "left", void 0), /**
1844
+ * Live object state. Is changed on internal events.
1845
+ * CAUTION: Do not change directly.
1846
+ */
1847
+ _define_property6(this, "_state", void 0), // TODO(wittjosiah): This shouldn't be necessary, live-object's signals should be granular.
1848
+ _define_property6(this, "_raisedHandSignal", void 0), _define_property6(this, "_speakingSignal", void 0), _define_property6(this, "_joinedSignal", void 0), _define_property6(this, "_swarmSynchronizer", void 0), _define_property6(this, "_mediaManager", void 0), this._client = _client, this.callStateUpdated = new Event4(), this.mediaStateUpdated = new Event4(), this.left = new Event4(), this._state = live({
1849
+ call: {},
1850
+ media: {
1851
+ pulledAudioTracks: {},
1852
+ pulledVideoStreams: {}
1853
+ }
1854
+ }), this._raisedHandSignal = computed(() => this._state.call.raisedHand ?? false), this._speakingSignal = computed(() => this._state.call.speaking ?? false), this._joinedSignal = computed(() => this._state.call.joined ?? false);
1855
+ this._client.config.getOrThrow("runtime.services.edge.url");
1856
+ const networkService = this._client.services.services.NetworkService;
1857
+ invariant4(networkService, "network service not found", {
1858
+ F: __dxlog_file5,
1859
+ L: 159,
1860
+ S: this,
1861
+ A: [
1862
+ "networkService",
1863
+ "'network service not found'"
1864
+ ]
1865
+ });
1866
+ this._swarmSynchronizer = new CallSwarmSynchronizer({
1867
+ networkService
1868
+ });
1869
+ this._mediaManager = new MediaManager();
1870
+ }
1647
1871
  };
1648
1872
  _ts_decorate3([
1649
1873
  synchronized3
@@ -1666,4 +1890,4 @@ export {
1666
1890
  MediaManager,
1667
1891
  CallManager
1668
1892
  };
1669
- //# sourceMappingURL=chunk-ZE7KWN36.mjs.map
1893
+ //# sourceMappingURL=chunk-TUSBPMNU.mjs.map