diff --git a/permissionCheck.js b/permissionCheck.js index dde1706..e0e9fa5 100644 --- a/permissionCheck.js +++ b/permissionCheck.js @@ -1,4 +1,7 @@ -const libnut = require("bindings")("libnut"); +let libnut = require("bindings")("libnut"); + +let hasScreenRecordingPermission = false; +let hasAccessibilityPermission = false; try { const permissions = require("@nut-tree/node-mac-permissions"); @@ -9,12 +12,13 @@ try { }; const askForAccessibility = (nativeFunction, functionName) => { - if (process.platform !== 'darwin') { + if (process.platform !== 'darwin' || hasAccessibilityPermission) { return nativeFunction; } const accessibilityStatus = permissions.getAuthStatus("accessibility"); if (accessibilityStatus === 'authorized') { + hasAccessibilityPermission = true; return nativeFunction; } else if (accessibilityStatus === 'not determined' || accessibilityStatus === 'denied') { permissions.askForAccessibilityAccess(); @@ -22,12 +26,13 @@ try { } } const askForScreenRecording = (nativeFunction, functionName) => { - if (process.platform !== 'darwin') { + if (process.platform !== 'darwin' || hasScreenRecordingPermission) { return nativeFunction; } const screenCaptureStatus = permissions.getAuthStatus("screen"); if (screenCaptureStatus === 'authorized') { + hasScreenRecordingPermission = true; return nativeFunction; } else if (screenCaptureStatus === 'not determined' || screenCaptureStatus === 'denied') { permissions.askForScreenCaptureAccess(); @@ -42,11 +47,9 @@ try { "mouseClick", "mouseToggle", "scrollMouse", - "setMouseDelay", "keyTap", "keyToggle", "typeString", - "setKeyboardDelay", "getScreenSize", "highlight", "captureScreen", @@ -61,14 +64,17 @@ try { ]; for (const functionName of accessibilityAccess) { - libnut[functionName] = askForAccessibility(libnut[functionName], functionName); + const originalFunction = libnut[functionName]; + libnut[functionName] = (...args) => askForAccessibility(originalFunction, functionName)(...args); } for (const functionName of screenCaptureAccess) { - libnut[functionName] = askForScreenRecording(libnut[functionName], functionName); + const originalFunction = libnut[functionName]; + libnut[functionName] = (...args) => askForScreenRecording(originalFunction, functionName)(...args); } } catch (e) { console.warn(`Encountered error establishing macOS permission checks:`, e.message); console.warn(`Returning original module.`); + libnut = require("bindings")("libnut"); } finally { module.exports = libnut; }