diff --git a/desktop/src/ui/index.ts b/desktop/src/ui/index.ts index abe70b8b99..25befc08ea 100644 --- a/desktop/src/ui/index.ts +++ b/desktop/src/ui/index.ts @@ -19,11 +19,11 @@ import { workbenchId, logOut } from '@hcengineering/workbench' import { isOwnerOrMaintainer } from '@hcengineering/core' import { configurePlatform } from './platform' -import { defineScreenShare, defineScreenRecorder } from './screenShare' +import { defineScreenShare, defineGetDisplayMedia } from './screenShare' import { IPCMainExposed } from './types' defineScreenShare() -defineScreenRecorder() +defineGetDisplayMedia() void configurePlatform().then(() => { createApp(document.body) diff --git a/desktop/src/ui/screenShare.ts b/desktop/src/ui/screenShare.ts index 7a2c3a705d..6048ce96c8 100644 --- a/desktop/src/ui/screenShare.ts +++ b/desktop/src/ui/screenShare.ts @@ -5,53 +5,56 @@ import { showPopup } from '@hcengineering/ui' import { Track, LocalTrack, LocalAudioTrack, LocalVideoTrack, ParticipantEvent, TrackInvalidError, ScreenShareCaptureOptions, DeviceUnsupportedError, ScreenSharePresets } from 'livekit-client' import { IPCMainExposed } from './types' -import { setMetadata } from '@hcengineering/platform' -import recordPlugin from '@hcengineering/recorder' -export async function getMediaStream (opts?: DisplayMediaStreamOptions): Promise { - if (opts === undefined) { - throw new Error('opts must be provided') - } - const ipcMain = (window as any).electron as IPCMainExposed - const sources = await ipcMain.getScreenSources() - - const hasAccess = await ipcMain.getScreenAccess() - if (!hasAccess) { - log.error('No screen access granted') - throw new Error('No screen access granted') +export function defineGetDisplayMedia (): void { + if (navigator?.mediaDevices === undefined) { + console.warn('mediaDevices API not available') + return } if (navigator.mediaDevices.getDisplayMedia === undefined) { throw new DeviceUnsupportedError('getDisplayMedia not supported') } - return await new Promise((resolve, reject) => { - showPopup( - love.component.SelectScreenSourcePopup, - { - sources - }, - 'top', - () => { - reject(new Error('No source selected')) - }, - (val) => { - if (val != null) { - opts.video = { - mandatory: { - ...(typeof opts.video === 'boolean' ? {} : opts.video), - chromeMediaSource: 'desktop', - chromeMediaSourceId: val - } - } as any - resolve(window.navigator.mediaDevices.getUserMedia(opts)) - } - } - ) - }) -} -export function defineScreenRecorder (): void { - setMetadata(recordPlugin.metadata.GetCustomMediaStream, getMediaStream) + navigator.mediaDevices.getDisplayMedia = async (opts?: DisplayMediaStreamOptions): Promise => { + if (opts === undefined) { + throw new Error('opts must be provided') + } + + const ipcMain = (window as any).electron as IPCMainExposed + const sources = await ipcMain.getScreenSources() + + const hasAccess = await ipcMain.getScreenAccess() + if (!hasAccess) { + log.error('No screen access granted') + throw new Error('No screen access granted') + } + + return await new Promise((resolve, reject) => { + showPopup( + love.component.SelectScreenSourcePopup, + { + sources + }, + 'top', + () => { + reject(new Error('No source selected')) + }, + (val) => { + if (val != null) { + opts.video = { + mandatory: { + ...(typeof opts.video === 'boolean' ? {} : opts.video), + chromeMediaSource: 'desktop', + chromeMediaSourceId: val + } + } as any + resolve(window.navigator.mediaDevices.getUserMedia(opts)) + } + } + ) + }) + } } export function defineScreenShare (): void { diff --git a/dev/docker-compose.yaml b/dev/docker-compose.yaml index 9742f34ab9..19e138e4bd 100644 --- a/dev/docker-compose.yaml +++ b/dev/docker-compose.yaml @@ -5,7 +5,7 @@ services: - 'huly.local:host-gateway' container_name: stream environment: - - STREAM_ENDPOINT_URL=s3://huly.local:9000 + - STREAM_ENDPOINT_URL=datalake://huly.local:4030 - STREAM_INSECURE=true - STREAM_SERVER_SECRET=secret - AWS_ACCESS_KEY_ID=minioadmin diff --git a/plugins/love-resources/src/utils.ts b/plugins/love-resources/src/utils.ts index 93fb9dfdb6..a8c5a3c6c0 100644 --- a/plugins/love-resources/src/utils.ts +++ b/plugins/love-resources/src/utils.ts @@ -436,8 +436,8 @@ lk.on(RoomEvent.Connected, () => { const session = useMedia({ state: { - camera: { enabled: false }, - microphone: current?.type === RoomType.Video ? { enabled: false } : undefined + camera: current?.type === RoomType.Video ? { enabled: false } : undefined, + microphone: { enabled: false } }, autoDestroy: false }) diff --git a/plugins/media-resources/src/components/MediaPopupCamPreview.svelte b/plugins/media-resources/src/components/MediaPopupCamPreview.svelte index 61d45249b7..a04a3ebc8f 100644 --- a/plugins/media-resources/src/components/MediaPopupCamPreview.svelte +++ b/plugins/media-resources/src/components/MediaPopupCamPreview.svelte @@ -64,12 +64,24 @@ } -{#if stream !== null} - -