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