import { ipcRendererInternal } from '@electron/internal/renderer/ipc-renderer-internal'; import { deserialize } from '@electron/internal/common/type-utils'; 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 deserialize(sources); }