UNPKG

@hurdlegroup/mac-screen-capture-permissions

Version:
94 lines (74 loc) 2.03 kB
'use strict'; const path = require('path'); const fs = require('fs'); const execa = require('execa'); const macosVersion = require('macos-version'); let electron; try { // eslint-disable-next-line global-require electron = require('electron'); } catch (e) { electron = null; } const permissionExists = macosVersion.isGreaterThanOrEqualTo('10.15'); let filePath; if ('electron' in process.versions) { const app = getElectronModule('app'); const shell = getElectronModule('shell'); exports.openSystemPreferences = async () => { if (process.platform === 'darwin') { await shell.openExternal(`x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture`); } else if (process.platform === 'win32') { await shell.openExternal(`ms-settings:security`); } } filePath = app && path.join(app.getPath('userData'), '.has-app-requested-screen-capture-permissions'); } exports.hasScreenCapturePermission = () => { if (!permissionExists) { return true; } const screenCapturePermission = require('./build/Release/screencapturepermissions.node'); const hasPermission = screenCapturePermission.hasPermissions(); if (!hasPermission && filePath) { try { fs.writeFileSync(filePath, ''); } catch (error) { if (error.code === 'ENOENT') { fs.mkdirSync(path.dirname(filePath)); fs.writeFileSync(filePath, ''); } throw error; } } return hasPermission; }; exports.hasPromptedForPermission = () => { if (!permissionExists) { return false; } return !!(filePath && fs.existsSync(filePath)); }; exports.resetPermissions = ({bundleId = ''} = {}) => { try { execa.sync('tccutil', ['reset', 'ScreenCapture', bundleId].filter(Boolean)); if (filePath && fs.existsSync(filePath)) { fs.unlinkSync(filePath); } return true; } catch (error) { return false; } }; function getElectronModule(name) { if (!electron) { return null; } if (electron[name]) { return electron[name]; } if (electron.remote) { return electron.remote[name]; } return null; }