import { nativeImage } from 'electron'; import { ipcRendererInternal } from '@electron/internal/renderer/ipc-renderer-internal'; const { hasSwitch } = process.electronBinding('command_line'); // |options.types| can't be empty and must be an array function isValid (options: Electron.SourcesOptions) { const types = options ? options.types : undefined; return Array.isArray(types); } const enableStacks = hasSwitch('enable-api-filtering-logging'); function getCurrentStack () { const target = {}; if (enableStacks) { Error.captureStackTrace(target, getCurrentStack); } return (target as any).stack; } export async function getSources (options: Electron.SourcesOptions) { if (!isValid(options)) throw new Error('Invalid options'); const captureWindow = options.types.includes('window'); const captureScreen = options.types.includes('screen'); const { thumbnailSize = { width: 150, height: 150 } } = options; const { fetchWindowIcons = false } = options; const sources = await ipcRendererInternal.invoke('ELECTRON_BROWSER_DESKTOP_CAPTURER_GET_SOURCES', { captureWindow, captureScreen, thumbnailSize, fetchWindowIcons } as ElectronInternal.GetSourcesOptions, getCurrentStack()); return sources.map(source => ({ id: source.id, name: source.name, thumbnail: nativeImage.createFromDataURL(source.thumbnail), display_id: source.display_id, appIcon: source.appIcon ? nativeImage.createFromDataURL(source.appIcon) : null })); }