@dxos/plugin-thread 0.8.4-main.f9ba587 → 0.8.4-main.fcc0d83b33
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-OC4QB4I2.mjs +89 -0
- package/dist/lib/browser/add-message-OC4QB4I2.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-J67QAUIW.mjs +61 -0
- package/dist/lib/browser/chunk-J67QAUIW.mjs.map +7 -0
- package/dist/lib/browser/chunk-KCMJ7H7F.mjs +259 -0
- package/dist/lib/browser/chunk-KCMJ7H7F.mjs.map +7 -0
- package/dist/lib/browser/create-IUWQEW74.mjs +55 -0
- package/dist/lib/browser/create-IUWQEW74.mjs.map +7 -0
- package/dist/lib/browser/create-channel-CBC5WEFG.mjs +21 -0
- package/dist/lib/browser/create-channel-CBC5WEFG.mjs.map +7 -0
- package/dist/lib/browser/create-channel-thread-JJ5LQ3OZ.mjs +28 -0
- package/dist/lib/browser/create-channel-thread-JJ5LQ3OZ.mjs.map +7 -0
- package/dist/lib/browser/create-proposals-RHLVRJZ4.mjs +57 -0
- package/dist/lib/browser/create-proposals-RHLVRJZ4.mjs.map +7 -0
- package/dist/lib/browser/delete-PVIEGTTY.mjs +59 -0
- package/dist/lib/browser/delete-PVIEGTTY.mjs.map +7 -0
- package/dist/lib/browser/delete-message-TLVRPLJF.mjs +56 -0
- package/dist/lib/browser/delete-message-TLVRPLJF.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +1875 -241
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/on-create-space-KRTKYRFU.mjs +25 -0
- package/dist/lib/browser/on-create-space-KRTKYRFU.mjs.map +7 -0
- package/dist/lib/browser/operations/index.mjs +14 -0
- package/dist/lib/browser/operations/index.mjs.map +7 -0
- package/dist/lib/browser/restore-AVE55SJF.mjs +33 -0
- package/dist/lib/browser/restore-AVE55SJF.mjs.map +7 -0
- package/dist/lib/browser/restore-message-F57RMGDJ.mjs +34 -0
- package/dist/lib/browser/restore-message-F57RMGDJ.mjs.map +7 -0
- package/dist/lib/browser/select-BJDZJI64.mjs +26 -0
- package/dist/lib/browser/select-BJDZJI64.mjs.map +7 -0
- package/dist/lib/browser/toggle-resolved-HQE5P7BV.mjs +37 -0
- package/dist/lib/browser/toggle-resolved-HQE5P7BV.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 +8 -12
- package/dist/lib/node-esm/add-message-HJXNAILW.mjs +90 -0
- package/dist/lib/node-esm/add-message-HJXNAILW.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-2Q6V7NGK.mjs +62 -0
- package/dist/lib/node-esm/chunk-2Q6V7NGK.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-4KRVIOPC.mjs +260 -0
- package/dist/lib/node-esm/chunk-4KRVIOPC.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
- package/dist/lib/node-esm/create-NALJT67D.mjs +56 -0
- package/dist/lib/node-esm/create-NALJT67D.mjs.map +7 -0
- package/dist/lib/node-esm/create-channel-CS2EAYJF.mjs +22 -0
- package/dist/lib/node-esm/create-channel-CS2EAYJF.mjs.map +7 -0
- package/dist/lib/node-esm/create-channel-thread-KZZFZDTU.mjs +29 -0
- package/dist/lib/node-esm/create-channel-thread-KZZFZDTU.mjs.map +7 -0
- package/dist/lib/node-esm/create-proposals-AFAYZQBI.mjs +58 -0
- package/dist/lib/node-esm/create-proposals-AFAYZQBI.mjs.map +7 -0
- package/dist/lib/node-esm/delete-HQJVZY7Q.mjs +60 -0
- package/dist/lib/node-esm/delete-HQJVZY7Q.mjs.map +7 -0
- package/dist/lib/node-esm/delete-message-VVPEYLV4.mjs +57 -0
- package/dist/lib/node-esm/delete-message-VVPEYLV4.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +1875 -241
- 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-2UX7Z5EQ.mjs +26 -0
- package/dist/lib/node-esm/on-create-space-2UX7Z5EQ.mjs.map +7 -0
- package/dist/lib/node-esm/operations/index.mjs +15 -0
- package/dist/lib/node-esm/operations/index.mjs.map +7 -0
- package/dist/lib/node-esm/restore-FMIWJR5T.mjs +34 -0
- package/dist/lib/node-esm/restore-FMIWJR5T.mjs.map +7 -0
- package/dist/lib/node-esm/restore-message-3L7AMQMG.mjs +35 -0
- package/dist/lib/node-esm/restore-message-3L7AMQMG.mjs.map +7 -0
- package/dist/lib/node-esm/select-VCAFISBK.mjs +27 -0
- package/dist/lib/node-esm/select-VCAFISBK.mjs.map +7 -0
- package/dist/lib/node-esm/toggle-resolved-JDZZ257P.mjs +38 -0
- package/dist/lib/node-esm/toggle-resolved-JDZZ257P.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 +8 -12
- package/dist/types/src/ThreadPlugin.d.ts +2 -1
- package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
- 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 +7 -5
- 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 +10 -9
- package/dist/types/src/calls-service.stories.d.ts.map +1 -1
- 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 +5 -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/index.d.ts +13 -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/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 +4 -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/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/ChatContainer/ChatContainer.d.ts +16 -0
- package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts.map +1 -0
- package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts +162 -0
- package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts.map +1 -0
- package/dist/types/src/containers/ChatContainer/index.d.ts +4 -0
- package/dist/types/src/containers/ChatContainer/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/index.d.ts +7 -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 +2 -1
- 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/useStatus.d.ts.map +1 -1
- package/dist/types/src/hooks/useVideoStreamTrack.d.ts +1 -1
- package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -1
- 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/create-channel-thread.d.ts +5 -0
- package/dist/types/src/operations/create-channel-thread.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 +2804 -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 +142 -70
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Channel.d.ts +715 -0
- package/dist/types/src/types/Channel.d.ts.map +1 -0
- 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 +24 -0
- package/dist/types/src/types/capabilities.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +2 -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 +17 -2
- package/dist/types/src/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +113 -74
- package/src/ThreadPlugin.tsx +109 -149
- package/src/blueprints/index.ts +5 -0
- package/src/blueprints/thread-blueprint.ts +36 -0
- package/src/calls/call-manager.ts +78 -54
- package/src/calls/call-swarm-synchronizer.ts +3 -3
- package/src/calls/media-manager.ts +67 -38
- package/src/calls/types.ts +8 -4
- package/src/calls/util/calls-service.ts +67 -15
- package/src/calls/util/stub-media-streams.ts +66 -7
- package/src/calls/util/task-scheduling.ts +4 -4
- package/src/calls-service.stories.tsx +82 -68
- package/src/capabilities/app-graph-builder.ts +175 -162
- package/src/capabilities/blueprint-definition.ts +17 -0
- package/src/capabilities/call-manager.ts +19 -11
- package/src/capabilities/index.ts +15 -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 +80 -77
- 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 +62 -45
- package/src/components/CommentsPanel/CommentsPanel.stories.tsx +95 -0
- package/src/components/CommentsPanel/CommentsPanel.tsx +71 -0
- package/src/components/{CommentsThreadContainer.tsx → CommentsPanel/CommentsThread.tsx} +66 -61
- 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 +222 -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 +14 -11
- 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 +5 -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/ChannelContainer/ChannelContainer.stories.tsx +93 -0
- package/src/{components → containers/ChannelContainer}/ChannelContainer.tsx +97 -74
- package/src/containers/ChannelContainer/index.ts +5 -0
- package/src/containers/ChatContainer/ChatContainer.stories.tsx +87 -0
- package/src/containers/ChatContainer/ChatContainer.tsx +126 -0
- package/src/containers/ChatContainer/index.ts +8 -0
- package/src/containers/ThreadCompanion/ThreadCompanion.tsx +217 -0
- package/src/containers/ThreadCompanion/index.ts +5 -0
- package/src/containers/index.ts +11 -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 +3 -1
- package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
- package/src/hooks/useDebugMode.ts +1 -1
- package/src/hooks/useVideoStreamTrack.tsx +6 -3
- package/src/index.ts +1 -1
- package/src/meta.ts +11 -7
- package/src/operations/add-message.ts +81 -0
- package/src/operations/create-channel-thread.ts +26 -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 +74 -71
- package/src/types/Channel.ts +37 -0
- package/src/types/Settings.ts +10 -0
- package/src/types/capabilities.ts +36 -0
- package/src/types/index.ts +2 -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 +2 -2
- package/dist/lib/browser/ChannelContainer-5YH4FTBL.mjs +0 -16
- package/dist/lib/browser/ChatContainer-2UYQ23KO.mjs +0 -15
- package/dist/lib/browser/app-graph-builder-Q5V3KXE3.mjs +0 -171
- package/dist/lib/browser/app-graph-builder-Q5V3KXE3.mjs.map +0 -7
- package/dist/lib/browser/call-manager-NIPDYUVD.mjs +0 -24
- package/dist/lib/browser/call-manager-NIPDYUVD.mjs.map +0 -7
- package/dist/lib/browser/chunk-5ZVJ4GAS.mjs +0 -21
- package/dist/lib/browser/chunk-5ZVJ4GAS.mjs.map +0 -7
- package/dist/lib/browser/chunk-6NSMBO3B.mjs +0 -56
- package/dist/lib/browser/chunk-6NSMBO3B.mjs.map +0 -7
- package/dist/lib/browser/chunk-ERWASUQK.mjs +0 -149
- package/dist/lib/browser/chunk-ERWASUQK.mjs.map +0 -7
- package/dist/lib/browser/chunk-EV4JWI7L.mjs +0 -17
- package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
- package/dist/lib/browser/chunk-GERVMFQW.mjs +0 -31
- package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
- package/dist/lib/browser/chunk-JVIKVYTI.mjs +0 -128
- package/dist/lib/browser/chunk-JVIKVYTI.mjs.map +0 -7
- package/dist/lib/browser/chunk-LCJD3NOB.mjs +0 -984
- package/dist/lib/browser/chunk-LCJD3NOB.mjs.map +0 -7
- package/dist/lib/browser/chunk-LGSDKXPF.mjs +0 -18
- package/dist/lib/browser/chunk-LGSDKXPF.mjs.map +0 -7
- package/dist/lib/browser/chunk-NCSFNWBZ.mjs +0 -479
- package/dist/lib/browser/chunk-NCSFNWBZ.mjs.map +0 -7
- package/dist/lib/browser/chunk-YD57K2SL.mjs +0 -367
- package/dist/lib/browser/chunk-YD57K2SL.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZE7KWN36.mjs +0 -1669
- package/dist/lib/browser/chunk-ZE7KWN36.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-MWE6XLPY.mjs +0 -353
- package/dist/lib/browser/intent-resolver-MWE6XLPY.mjs.map +0 -7
- package/dist/lib/browser/markdown-ZO34G7RM.mjs +0 -169
- package/dist/lib/browser/markdown-ZO34G7RM.mjs.map +0 -7
- package/dist/lib/browser/react-root-YNDNPODD.mjs +0 -28
- package/dist/lib/browser/react-root-YNDNPODD.mjs.map +0 -7
- package/dist/lib/browser/react-surface-2AXRNTCA.mjs +0 -109
- package/dist/lib/browser/react-surface-2AXRNTCA.mjs.map +0 -7
- package/dist/lib/browser/settings-XZGPZNAU.mjs +0 -22
- package/dist/lib/browser/settings-XZGPZNAU.mjs.map +0 -7
- package/dist/lib/browser/state-H6CYONWE.mjs +0 -34
- package/dist/lib/browser/state-H6CYONWE.mjs.map +0 -7
- package/dist/lib/node-esm/ChannelContainer-O2LZKMRM.mjs +0 -17
- package/dist/lib/node-esm/ChannelContainer-O2LZKMRM.mjs.map +0 -7
- package/dist/lib/node-esm/ChatContainer-6N35MP5J.mjs +0 -16
- package/dist/lib/node-esm/ChatContainer-6N35MP5J.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-GAKBZNU3.mjs +0 -172
- package/dist/lib/node-esm/app-graph-builder-GAKBZNU3.mjs.map +0 -7
- package/dist/lib/node-esm/call-manager-D6O5ZJJ4.mjs +0 -25
- package/dist/lib/node-esm/call-manager-D6O5ZJJ4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-25ABSYP2.mjs +0 -150
- package/dist/lib/node-esm/chunk-25ABSYP2.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-3X3YKRM2.mjs +0 -129
- package/dist/lib/node-esm/chunk-3X3YKRM2.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-57XR3LEF.mjs +0 -33
- package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-5UQ4KKDE.mjs +0 -985
- package/dist/lib/node-esm/chunk-5UQ4KKDE.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-75RJ5DJI.mjs +0 -19
- package/dist/lib/node-esm/chunk-75RJ5DJI.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-A6QLTZCY.mjs +0 -480
- package/dist/lib/node-esm/chunk-A6QLTZCY.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-GRLRWTRU.mjs +0 -19
- package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-IHDNQLLR.mjs +0 -1670
- package/dist/lib/node-esm/chunk-IHDNQLLR.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-OU5BYIDO.mjs +0 -58
- package/dist/lib/node-esm/chunk-OU5BYIDO.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-RGTWAVEE.mjs +0 -368
- package/dist/lib/node-esm/chunk-RGTWAVEE.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-X62X3VOK.mjs +0 -23
- package/dist/lib/node-esm/chunk-X62X3VOK.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-B6PNTMPY.mjs +0 -354
- package/dist/lib/node-esm/intent-resolver-B6PNTMPY.mjs.map +0 -7
- package/dist/lib/node-esm/markdown-ZJUFV2TA.mjs +0 -170
- package/dist/lib/node-esm/markdown-ZJUFV2TA.mjs.map +0 -7
- package/dist/lib/node-esm/react-root-ZUVVTKWG.mjs +0 -29
- package/dist/lib/node-esm/react-root-ZUVVTKWG.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-OMEZTOU6.mjs +0 -110
- package/dist/lib/node-esm/react-surface-OMEZTOU6.mjs.map +0 -7
- package/dist/lib/node-esm/settings-XECBSD6Q.mjs +0 -23
- package/dist/lib/node-esm/settings-XECBSD6Q.mjs.map +0 -7
- package/dist/lib/node-esm/state-D7WNDT3N.mjs +0 -35
- package/dist/lib/node-esm/state-D7WNDT3N.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 -7
- 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/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/CommentsThreadContainer.d.ts +0 -14
- package/dist/types/src/components/CommentsThreadContainer.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/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/Chat.stories.tsx +0 -88
- package/src/components/ChatContainer.tsx +0 -141
- package/src/components/Comments.stories.tsx +0 -92
- package/src/components/CommentsContainer.tsx +0 -71
- package/src/components/MessageContainer.tsx +0 -151
- package/src/components/ThreadComplementary.tsx +0 -151
- package/src/components/ThreadSettings.tsx +0 -17
- package/src/components/testing.ts +0 -29
- package/src/testing/stories.ts +0 -54
- package/src/types/schema.ts +0 -33
- /package/dist/lib/browser/{ChannelContainer-5YH4FTBL.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/lib/{browser/ChatContainer-2UYQ23KO.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;
|
|
@@ -115,7 +117,7 @@ export class CallsServicePeer extends Resource {
|
|
|
115
117
|
});
|
|
116
118
|
peerConnection.addEventListener('connectionstatechange', () => {
|
|
117
119
|
if (peerConnection.connectionState === 'failed' || peerConnection.connectionState === 'closed') {
|
|
118
|
-
log.
|
|
120
|
+
log.info('calls connection failed', { state: peerConnection.connectionState });
|
|
119
121
|
void this._persistentLifecycle.scheduleRestart();
|
|
120
122
|
}
|
|
121
123
|
});
|
|
@@ -124,7 +126,7 @@ export class CallsServicePeer extends Resource {
|
|
|
124
126
|
peerConnection.addEventListener('iceconnectionstatechange', () => {
|
|
125
127
|
clearTimeout(iceTimeout);
|
|
126
128
|
if (peerConnection.iceConnectionState === 'failed' || peerConnection.iceConnectionState === 'closed') {
|
|
127
|
-
log.
|
|
129
|
+
log.info('calls connection to ICEs failed', { state: peerConnection.iceConnectionState });
|
|
128
130
|
void this._persistentLifecycle.scheduleRestart();
|
|
129
131
|
} else if (peerConnection.iceConnectionState === 'disconnected') {
|
|
130
132
|
// TODO(mykola): we should start to inspect the connection stats from here on for
|
|
@@ -137,7 +139,7 @@ export class CallsServicePeer extends Resource {
|
|
|
137
139
|
return;
|
|
138
140
|
}
|
|
139
141
|
|
|
140
|
-
log.
|
|
142
|
+
log.info('calls iceConnectionState timed out', { state: peerConnection.iceConnectionState, timeoutSeconds });
|
|
141
143
|
void this._persistentLifecycle.scheduleRestart();
|
|
142
144
|
}, timeoutSeconds * 1_000);
|
|
143
145
|
}
|
|
@@ -154,6 +156,7 @@ export class CallsServicePeer extends Resource {
|
|
|
154
156
|
|
|
155
157
|
private async _fetch<T extends ErrorResponse>(relativePath: string, requestInit?: RequestInit): Promise<T> {
|
|
156
158
|
this.history.push({
|
|
159
|
+
endpoint: relativePath,
|
|
157
160
|
type: 'request',
|
|
158
161
|
time: new Date().toISOString(),
|
|
159
162
|
method: requestInit?.method ?? 'GET',
|
|
@@ -169,6 +172,7 @@ export class CallsServicePeer extends Resource {
|
|
|
169
172
|
try {
|
|
170
173
|
const data = (await response.clone().json()) as T;
|
|
171
174
|
this.history.push({
|
|
175
|
+
endpoint: relativePath,
|
|
172
176
|
type: 'response',
|
|
173
177
|
time: new Date().toISOString(),
|
|
174
178
|
status: response.status,
|
|
@@ -182,6 +186,7 @@ export class CallsServicePeer extends Resource {
|
|
|
182
186
|
} catch (error) {
|
|
183
187
|
const text = await response.text();
|
|
184
188
|
this.history.push({
|
|
189
|
+
endpoint: relativePath,
|
|
185
190
|
type: 'response',
|
|
186
191
|
time: new Date().toISOString(),
|
|
187
192
|
status: response.status,
|
|
@@ -203,11 +208,11 @@ export class CallsServicePeer extends Resource {
|
|
|
203
208
|
sessionId,
|
|
204
209
|
trackName,
|
|
205
210
|
}: {
|
|
211
|
+
ctx: Context;
|
|
206
212
|
peerConnection: RTCPeerConnection;
|
|
207
213
|
transceiver: RTCRtpTransceiver;
|
|
208
214
|
sessionId: string;
|
|
209
215
|
trackName: string;
|
|
210
|
-
ctx?: Context;
|
|
211
216
|
}): Promise<TrackObject | void> {
|
|
212
217
|
log.verbose('pushing track ', trackName);
|
|
213
218
|
const pushedTrackPromise = this.pushTrackDispatcher
|
|
@@ -245,9 +250,13 @@ export class CallsServicePeer extends Resource {
|
|
|
245
250
|
};
|
|
246
251
|
}),
|
|
247
252
|
)
|
|
248
|
-
.then(({ tracks }) => {
|
|
253
|
+
.then(async ({ tracks }) => {
|
|
249
254
|
const trackData = tracks.find((t) => t.mid === transceiver.mid);
|
|
250
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);
|
|
251
260
|
return {
|
|
252
261
|
...trackData,
|
|
253
262
|
sessionId,
|
|
@@ -256,9 +265,6 @@ export class CallsServicePeer extends Resource {
|
|
|
256
265
|
} else {
|
|
257
266
|
log.error('missing track data');
|
|
258
267
|
}
|
|
259
|
-
})
|
|
260
|
-
.catch((err) => {
|
|
261
|
-
log.catch(err);
|
|
262
268
|
});
|
|
263
269
|
|
|
264
270
|
const onDispose = async () => {
|
|
@@ -280,8 +286,8 @@ export class CallsServicePeer extends Resource {
|
|
|
280
286
|
previousTrack,
|
|
281
287
|
}: {
|
|
282
288
|
track: MediaStreamTrack | null;
|
|
289
|
+
ctx: Context;
|
|
283
290
|
encodings?: RTCRtpEncodingParameters[];
|
|
284
|
-
ctx?: Context;
|
|
285
291
|
previousTrack?: TrackObject;
|
|
286
292
|
}): Promise<TrackObject | undefined> {
|
|
287
293
|
await this.waitUntilOpen();
|
|
@@ -404,7 +410,7 @@ export class CallsServicePeer extends Resource {
|
|
|
404
410
|
})
|
|
405
411
|
.catch((err) => log.catch(err));
|
|
406
412
|
} else {
|
|
407
|
-
log.
|
|
413
|
+
log.info('missing track info', { trackData, availableTracks: Array.from(trackMap.keys()) });
|
|
408
414
|
}
|
|
409
415
|
});
|
|
410
416
|
|
|
@@ -528,3 +534,49 @@ const peerConnectionIsConnected = async (peerConnection: RTCPeerConnection) => {
|
|
|
528
534
|
await connected;
|
|
529
535
|
}
|
|
530
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,27 +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
|
-
// roughly sounds like a box fan
|
|
52
66
|
oscillator.frequency.setValueAtTime(20, audioContext.currentTime);
|
|
53
67
|
|
|
54
68
|
const gainNode = audioContext.createGain();
|
|
55
|
-
|
|
56
|
-
gainNode.gain.setValueAtTime(0.02, audioContext.currentTime);
|
|
69
|
+
gainNode.gain.setValueAtTime(0, audioContext.currentTime);
|
|
57
70
|
oscillator.connect(gainNode);
|
|
58
71
|
|
|
59
72
|
const destination = audioContext.createMediaStreamDestination();
|
|
60
73
|
gainNode.connect(destination);
|
|
61
|
-
|
|
74
|
+
|
|
75
|
+
let oscillatorStarted = false;
|
|
76
|
+
const ensureOscillatorStarted = () => {
|
|
77
|
+
if (oscillatorStarted) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
oscillator.start();
|
|
81
|
+
oscillatorStarted = true;
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
const stateChangeHandler = () => {
|
|
85
|
+
if (audioContext.state === 'running') {
|
|
86
|
+
audioContextStartedPreviously = true;
|
|
87
|
+
ensureOscillatorStarted();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (audioContext.state === 'suspended' || (audioContext.state as string) === 'interrupted') {
|
|
91
|
+
resumeAudioContext();
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
audioContext.addEventListener('statechange', stateChangeHandler);
|
|
96
|
+
|
|
97
|
+
const resumeAudioContext = () => {
|
|
98
|
+
void audioContext.resume().then(() => {
|
|
99
|
+
cleanUpUserGestureListeners();
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const cleanUpUserGestureListeners = () => {
|
|
104
|
+
userGestureEvents.forEach((gesture) => {
|
|
105
|
+
document.removeEventListener(gesture, resumeAudioContext, {
|
|
106
|
+
capture: true,
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
if (audioContextStartedPreviously) {
|
|
112
|
+
resumeAudioContext();
|
|
113
|
+
} else {
|
|
114
|
+
userGestureEvents.forEach((gesture) => {
|
|
115
|
+
document.addEventListener(gesture, resumeAudioContext, {
|
|
116
|
+
capture: true,
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
}
|
|
62
120
|
|
|
63
121
|
ctx.onDispose(async () => {
|
|
122
|
+
cleanUpUserGestureListeners();
|
|
64
123
|
oscillator.disconnect();
|
|
65
124
|
oscillator.stop();
|
|
66
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.
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@
|
|
6
|
-
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
7
6
|
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
8
7
|
|
|
9
8
|
import { scheduleTask, sleep } from '@dxos/async';
|
|
@@ -13,14 +12,16 @@ import { log } from '@dxos/log';
|
|
|
13
12
|
import { Config, useConfig } from '@dxos/react-client';
|
|
14
13
|
import { withClientProvider } from '@dxos/react-client/testing';
|
|
15
14
|
import { Button } from '@dxos/react-ui';
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
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';
|
|
18
21
|
|
|
19
|
-
import {
|
|
20
|
-
import { useInaudibleAudioStreamTrack, useVideoStreamTrack } from './hooks';
|
|
21
|
-
// @ts-ignore
|
|
22
|
-
import video from '../testing/video.mp4';
|
|
22
|
+
import { CALLS_URL, CallsServicePeer, type TrackObject } from './calls';
|
|
23
23
|
|
|
24
|
+
// TODO(burdon): THIS IS TOO COMPLEX FOR A TEST SETUP.
|
|
24
25
|
const pushAndPullTrack = (mediaStreamTrack?: MediaStreamTrack) => {
|
|
25
26
|
const config = useConfig();
|
|
26
27
|
const callsConfig = {
|
|
@@ -35,16 +36,18 @@ const pushAndPullTrack = (mediaStreamTrack?: MediaStreamTrack) => {
|
|
|
35
36
|
const [pulledTrack, setPulledTrack] = useState<MediaStreamTrack | undefined>(undefined);
|
|
36
37
|
const hadRun = useRef(false);
|
|
37
38
|
|
|
39
|
+
const deps: any[] = [];
|
|
38
40
|
// Push/pull video stream track to cloudflare.
|
|
39
41
|
useEffect(() => {
|
|
40
42
|
if (hadRun.current || !mediaStreamTrack || !peerPush || !peerPull) {
|
|
41
|
-
log.info('not running', { hadRun: hadRun.current, mediaStreamTrack, peerPush, peerPull });
|
|
42
43
|
return;
|
|
43
44
|
}
|
|
44
45
|
hadRun.current = true;
|
|
45
46
|
const ctx = Context.default();
|
|
47
|
+
log.info('setting up ctx', { ctx, mediaStreamTrack, peerPush, peerPull });
|
|
48
|
+
deps.push([ctx, mediaStreamTrack, peerPush, peerPull]);
|
|
46
49
|
ctx.onDispose(() => {
|
|
47
|
-
log.info('disposing ctx', {
|
|
50
|
+
log.info('disposing ctx', {});
|
|
48
51
|
});
|
|
49
52
|
scheduleTask(
|
|
50
53
|
ctx,
|
|
@@ -60,15 +63,12 @@ const pushAndPullTrack = (mediaStreamTrack?: MediaStreamTrack) => {
|
|
|
60
63
|
// Push track to cloudflare.
|
|
61
64
|
performance.mark('push:begin');
|
|
62
65
|
log.info('pushing track', { track: mediaStreamTrack });
|
|
63
|
-
trackInfo.current = await peerPush.pushTrack({ track: mediaStreamTrack });
|
|
66
|
+
trackInfo.current = await peerPush.pushTrack({ track: mediaStreamTrack, ctx: Context.default() });
|
|
64
67
|
performance.mark('push:end');
|
|
65
68
|
const pushTime = performance.measure('push', 'push:begin', 'push:end').duration;
|
|
66
69
|
log.info('successfully pushed track', { pushTime, trackInfo: trackInfo.current });
|
|
67
70
|
setMetrics((prev) => ({ ...prev, 'time to push track [ms]': Math.round(pushTime) }));
|
|
68
71
|
|
|
69
|
-
// Wait for cloudflare to process the track.
|
|
70
|
-
await sleep(1000);
|
|
71
|
-
|
|
72
72
|
// Pull track from cloudflare.
|
|
73
73
|
performance.mark('pullTrack:begin');
|
|
74
74
|
pullCtx.current = Context.default();
|
|
@@ -104,7 +104,10 @@ const pushAndPullTrack = (mediaStreamTrack?: MediaStreamTrack) => {
|
|
|
104
104
|
|
|
105
105
|
const rePullTrack = useCallback(async () => {
|
|
106
106
|
performance.mark('rePullVideo:begin');
|
|
107
|
-
|
|
107
|
+
if (!pulledTrack) {
|
|
108
|
+
log.info('no pulled track, skipping re-pull', { pulledTrack });
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
108
111
|
pulledTrack.stop();
|
|
109
112
|
await pullCtx.current!.dispose();
|
|
110
113
|
pullCtx.current = Context.default();
|
|
@@ -123,12 +126,57 @@ const pushAndPullTrack = (mediaStreamTrack?: MediaStreamTrack) => {
|
|
|
123
126
|
pulledTrack,
|
|
124
127
|
rePullTrack,
|
|
125
128
|
metrics,
|
|
129
|
+
pushService: peerPush,
|
|
130
|
+
pullService: peerPull,
|
|
126
131
|
};
|
|
127
132
|
};
|
|
128
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
|
+
|
|
129
175
|
const meta = {
|
|
130
|
-
title: 'plugins/plugin-thread/
|
|
176
|
+
title: 'plugins/plugin-thread/experimental/Calls',
|
|
177
|
+
render: DefaultStory,
|
|
131
178
|
decorators: [
|
|
179
|
+
withTheme(),
|
|
132
180
|
withClientProvider({
|
|
133
181
|
config: new Config({
|
|
134
182
|
runtime: {
|
|
@@ -138,77 +186,43 @@ const meta = {
|
|
|
138
186
|
},
|
|
139
187
|
}),
|
|
140
188
|
}),
|
|
141
|
-
withTheme,
|
|
142
|
-
withLayout(),
|
|
143
189
|
],
|
|
144
190
|
parameters: {
|
|
145
191
|
layout: 'centered',
|
|
146
192
|
},
|
|
147
|
-
}
|
|
193
|
+
} satisfies Meta<typeof DefaultStory>;
|
|
148
194
|
|
|
149
195
|
export default meta;
|
|
150
196
|
|
|
151
|
-
|
|
152
|
-
render: ({ videoSrc }: { videoSrc: string }) => {
|
|
153
|
-
const pushVideoElement = useRef<HTMLVideoElement>(null);
|
|
154
|
-
const pullVideoElement = useRef<HTMLVideoElement>(null);
|
|
155
|
-
// Get video stream track.
|
|
156
|
-
const videoStreamTrack = useVideoStreamTrack(pushVideoElement, videoSrc);
|
|
157
|
-
const { pulledTrack, rePullTrack, metrics } = pushAndPullTrack(videoStreamTrack);
|
|
158
|
-
const hadRun = useRef(false);
|
|
159
|
-
|
|
160
|
-
// Push/pull video stream track to cloudflare.
|
|
161
|
-
useEffect(() => {
|
|
162
|
-
if (!pulledTrack || hadRun.current) {
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
hadRun.current = true;
|
|
166
|
-
const ctx = Context.default();
|
|
167
|
-
scheduleTask(ctx, async () => {
|
|
168
|
-
pullVideoElement.current!.srcObject = new MediaStream([pulledTrack]);
|
|
169
|
-
await pullVideoElement.current!.play();
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
return () => {
|
|
173
|
-
void ctx.dispose();
|
|
174
|
-
};
|
|
175
|
-
}, [pulledTrack]);
|
|
197
|
+
type Story = StoryObj<typeof meta>;
|
|
176
198
|
|
|
177
|
-
|
|
178
|
-
<div className='grid grid-rows-3 gap-4 items-center'>
|
|
179
|
-
<video ref={pushVideoElement} muted autoPlay loop />
|
|
180
|
-
<div className='flex flex-col gap-4'>
|
|
181
|
-
<video ref={pullVideoElement} muted />
|
|
182
|
-
<Button
|
|
183
|
-
disabled={
|
|
184
|
-
!(
|
|
185
|
-
pullVideoElement?.current?.srcObject instanceof MediaStream &&
|
|
186
|
-
pullVideoElement.current.srcObject.getTracks()[0]
|
|
187
|
-
)
|
|
188
|
-
}
|
|
189
|
-
onClick={rePullTrack}
|
|
190
|
-
>
|
|
191
|
-
Re-pull video
|
|
192
|
-
</Button>
|
|
193
|
-
</div>
|
|
194
|
-
<Json data={metrics} />
|
|
195
|
-
</div>
|
|
196
|
-
);
|
|
197
|
-
},
|
|
199
|
+
export const Default: Story = {
|
|
198
200
|
args: {
|
|
199
|
-
|
|
201
|
+
source: testVideo,
|
|
200
202
|
},
|
|
201
203
|
};
|
|
202
204
|
|
|
203
205
|
export const InaudibleAudioStreamTrack = {
|
|
204
206
|
render: () => {
|
|
205
207
|
const audioStreamTrack = useInaudibleAudioStreamTrack();
|
|
206
|
-
|
|
207
208
|
const { rePullTrack, metrics } = pushAndPullTrack(audioStreamTrack);
|
|
208
209
|
|
|
209
210
|
return (
|
|
210
211
|
<div className='flex flex-col gap-4 items-center'>
|
|
211
|
-
<
|
|
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} />
|
|
212
226
|
<Button onClick={rePullTrack}>Re-pull audio</Button>
|
|
213
227
|
</div>
|
|
214
228
|
);
|