node-mac-recorder 2.16.2 โ†’ 2.16.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -46,7 +46,8 @@
46
46
  "Bash(ELECTRON_RUN_AS_NODE=1 node -e \"\nconsole.log(''๐Ÿงช Testing version detection and fallback system'');\nconst MacRecorder = require(''./index'');\nconst recorder = new MacRecorder();\n\nasync function testVersionDetection() {\n try {\n const outputPath = ''./test-output/version-detection-test.mov'';\n console.log(''๐Ÿ“น Starting recording with version detection...'');\n \n const success = await recorder.startRecording(outputPath, {\n captureCursor: true,\n includeMicrophone: false,\n includeSystemAudio: true\n });\n \n if (success) {\n console.log(''โœ… Recording started - waiting 3 seconds'');\n await new Promise(resolve => setTimeout(resolve, 3000));\n \n console.log(''๐Ÿ›‘ Stopping recording...'');\n await recorder.stopRecording();\n console.log(''โœ… Version detection test completed successfully!'');\n } else {\n console.log(''โŒ Recording failed to start'');\n }\n } catch (error) {\n console.log(''โŒ Error:'', error.message);\n }\n}\n\ntestVersionDetection();\n\")",
47
47
  "Bash(ELECTRON_RUN_AS_NODE=1 node -e \"\nconsole.log(''๐Ÿงช Testing Electron safety measures'');\nconst MacRecorder = require(''./index'');\nconst recorder = new MacRecorder();\n\nasync function testElectronSafety() {\n try {\n const outputPath = ''./test-output/electron-safe-test.mov'';\n console.log(''๐Ÿ“น Starting recording in Electron environment...'');\n \n const success = await recorder.startRecording(outputPath, {\n captureCursor: true,\n includeMicrophone: false,\n includeSystemAudio: true\n });\n \n if (success) {\n console.log(''โœ… Recording started safely in Electron - waiting 3 seconds'');\n await new Promise(resolve => setTimeout(resolve, 3000));\n \n console.log(''๐Ÿ›‘ Stopping recording...'');\n await recorder.stopRecording();\n console.log(''โœ… Electron safety test completed successfully!'');\n } else {\n console.log(''โš ๏ธ Recording failed to start (expected in some cases)'');\n }\n } catch (error) {\n console.log(''โŒ Error:'', error.message);\n }\n}\n\ntestElectronSafety();\n\")",
48
48
  "Bash(FORCE_AVFOUNDATION=1 node -e \"\nconsole.log(''๐Ÿงช Testing AVFoundation fallback path'');\nconst MacRecorder = require(''./index'');\nconst recorder = new MacRecorder();\n\nasync function testAVFoundationPath() {\n try {\n const outputPath = ''./test-output/force-avfoundation-test.mov'';\n console.log(''๐Ÿ“น Testing AVFoundation (force mode)...'');\n \n const success = await recorder.startRecording(outputPath, {\n captureCursor: true,\n includeMicrophone: false,\n includeSystemAudio: true\n });\n \n if (success) {\n console.log(''โœ… Recording started'');\n await new Promise(resolve => setTimeout(resolve, 2000));\n \n await recorder.stopRecording();\n console.log(''โœ… AVFoundation test completed!'');\n } else {\n console.log(''โŒ Recording failed'');\n }\n } catch (error) {\n console.log(''โŒ Error:'', error.message);\n }\n}\n\ntestAVFoundationPath();\n\")",
49
- "Bash(FORCE_AVFOUNDATION=1 node -e \"\nconsole.log(''๐Ÿงช Testing AVFoundation fallback path (macOS 14 simulation)'');\nconst MacRecorder = require(''./index'');\nconst recorder = new MacRecorder();\n\nasync function testAVFoundationPath() {\n try {\n const outputPath = ''./test-output/force-avfoundation-test.mov'';\n console.log(''๐Ÿ“น Testing AVFoundation (simulating macOS 14)...'');\n \n const success = await recorder.startRecording(outputPath, {\n captureCursor: true,\n includeMicrophone: false,\n includeSystemAudio: true\n });\n \n if (success) {\n console.log(''โœ… Recording started with AVFoundation'');\n await new Promise(resolve => setTimeout(resolve, 3000));\n \n await recorder.stopRecording();\n console.log(''โœ… AVFoundation test completed successfully!'');\n console.log(''This is how it should work on macOS 14'');\n } else {\n console.log(''โŒ Recording failed to start'');\n }\n } catch (error) {\n console.log(''โŒ Error:'', error.message);\n }\n}\n\ntestAVFoundationPath();\n\")"
49
+ "Bash(FORCE_AVFOUNDATION=1 node -e \"\nconsole.log(''๐Ÿงช Testing AVFoundation fallback path (macOS 14 simulation)'');\nconst MacRecorder = require(''./index'');\nconst recorder = new MacRecorder();\n\nasync function testAVFoundationPath() {\n try {\n const outputPath = ''./test-output/force-avfoundation-test.mov'';\n console.log(''๐Ÿ“น Testing AVFoundation (simulating macOS 14)...'');\n \n const success = await recorder.startRecording(outputPath, {\n captureCursor: true,\n includeMicrophone: false,\n includeSystemAudio: true\n });\n \n if (success) {\n console.log(''โœ… Recording started with AVFoundation'');\n await new Promise(resolve => setTimeout(resolve, 3000));\n \n await recorder.stopRecording();\n console.log(''โœ… AVFoundation test completed successfully!'');\n console.log(''This is how it should work on macOS 14'');\n } else {\n console.log(''โŒ Recording failed to start'');\n }\n } catch (error) {\n console.log(''โŒ Error:'', error.message);\n }\n}\n\ntestAVFoundationPath();\n\")",
50
+ "Bash(FORCE_AVFOUNDATION=1 node -e \"\nconsole.log(''๐Ÿงช Testing AVFoundation with detailed debugging'');\nconst MacRecorder = require(''./index'');\nconst recorder = new MacRecorder();\n\nasync function testWithDebugging() {\n try {\n const outputPath = ''./test-output/debug-test.mov'';\n console.log(''๐Ÿ“น Starting AVFoundation test with debugging...'');\n console.log(''Expected to see detailed AVFoundation logs in console'');\n \n const success = await recorder.startRecording(outputPath, {\n captureCursor: true,\n includeMicrophone: false,\n includeSystemAudio: true\n });\n \n if (success) {\n console.log(''โœ… Recording started'');\n await new Promise(resolve => setTimeout(resolve, 2000));\n \n await recorder.stopRecording();\n console.log(''โœ… Test completed'');\n } else {\n console.log(''โŒ Recording failed - check console logs for AVFoundation details'');\n }\n } catch (error) {\n console.log(''โŒ Error:'', error.message);\n }\n}\n\ntestWithDebugging();\n\")"
50
51
  ],
51
52
  "deny": []
52
53
  }
@@ -0,0 +1,110 @@
1
+ const MacRecorder = require('./index');
2
+
3
+ console.log('๐Ÿงช macOS 14/13 Debug Test');
4
+ console.log('=========================================');
5
+ console.log('');
6
+ console.log('This script helps debug recording issues on macOS 14 and earlier.');
7
+ console.log('Please run this and share the complete console output.');
8
+ console.log('');
9
+
10
+ async function debugMacOS14() {
11
+ const recorder = new MacRecorder();
12
+
13
+ try {
14
+ // Create test output directory
15
+ const fs = require('fs');
16
+ if (!fs.existsSync('./test-output')) {
17
+ fs.mkdirSync('./test-output');
18
+ }
19
+
20
+ console.log('๐Ÿ“‹ System Information:');
21
+ const os = require('os');
22
+ console.log(' OS:', os.type(), os.release());
23
+ console.log(' Architecture:', os.arch());
24
+ console.log(' Platform:', os.platform());
25
+
26
+ // Check permissions first
27
+ console.log('');
28
+ console.log('๐Ÿ” Checking Permissions...');
29
+ try {
30
+ const permissions = await recorder.checkPermissions();
31
+ console.log(' Screen Recording Permission:', permissions.screenRecording ? 'โœ… GRANTED' : 'โŒ DENIED');
32
+ console.log(' Accessibility Permission:', permissions.accessibility ? 'โœ… GRANTED' : 'โŒ DENIED');
33
+
34
+ if (!permissions.screenRecording) {
35
+ console.log('');
36
+ console.log('โŒ CRITICAL: Screen Recording permission is DENIED');
37
+ console.log(' Please grant permission in System Preferences > Security & Privacy > Privacy > Screen Recording');
38
+ console.log(' Then restart this test.');
39
+ return;
40
+ }
41
+ } catch (permError) {
42
+ console.log(' Permission check failed:', permError.message);
43
+ }
44
+
45
+ console.log('');
46
+ console.log('๐ŸŽฏ Starting Recording Test...');
47
+ console.log('Expected behavior:');
48
+ console.log(' โ€ข System should detect macOS version');
49
+ console.log(' โ€ข macOS 15+ uses ScreenCaptureKit');
50
+ console.log(' โ€ข macOS 14/13 uses AVFoundation fallback');
51
+ console.log(' โ€ข You should see detailed logs below');
52
+ console.log('');
53
+
54
+ const outputPath = './test-output/debug-test.mov';
55
+
56
+ const success = await recorder.startRecording(outputPath, {
57
+ captureCursor: true,
58
+ includeMicrophone: false,
59
+ includeSystemAudio: true,
60
+ displayId: null // Use primary display
61
+ });
62
+
63
+ if (success) {
64
+ console.log('โœ… Recording started successfully');
65
+ console.log('โฑ๏ธ Recording for 3 seconds...');
66
+
67
+ await new Promise(resolve => setTimeout(resolve, 3000));
68
+
69
+ console.log('๐Ÿ›‘ Stopping recording...');
70
+ await recorder.stopRecording();
71
+
72
+ // Check if file was created
73
+ const fs = require('fs');
74
+ if (fs.existsSync(outputPath)) {
75
+ const stats = fs.statSync(outputPath);
76
+ console.log('โœ… Recording file created:', outputPath);
77
+ console.log(' File size:', Math.round(stats.size / 1024), 'KB');
78
+ console.log('');
79
+ console.log('๐ŸŽ‰ SUCCESS: Recording works on your system!');
80
+ } else {
81
+ console.log('โŒ Recording file was not created');
82
+ console.log(' Expected:', outputPath);
83
+ }
84
+ } else {
85
+ console.log('โŒ Recording failed to start');
86
+ console.log('');
87
+ console.log('๐Ÿ” Troubleshooting Steps:');
88
+ console.log('1. Check console logs above for specific error messages');
89
+ console.log('2. Verify Screen Recording permission is granted');
90
+ console.log('3. Try restarting your application');
91
+ console.log('4. Check if output directory exists and is writable');
92
+ }
93
+
94
+ } catch (error) {
95
+ console.log('โŒ Error during test:', error.message);
96
+ if (error.stack) {
97
+ console.log('Stack trace:', error.stack);
98
+ }
99
+ }
100
+
101
+ console.log('');
102
+ console.log('๐Ÿ“ž Support Information:');
103
+ console.log('If recording still fails, please share:');
104
+ console.log('1. Complete console output from this test');
105
+ console.log('2. Your macOS version (System Settings > About)');
106
+ console.log('3. Permission screenshots from System Settings');
107
+ }
108
+
109
+ // Run the debug test
110
+ debugMacOS14();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-mac-recorder",
3
- "version": "2.16.2",
3
+ "version": "2.16.3",
4
4
  "description": "Native macOS screen recording package for Node.js applications",
5
5
  "main": "index.js",
6
6
  "keywords": [
@@ -32,24 +32,40 @@ bool startAVFoundationRecording(const std::string& outputPath,
32
32
  }
33
33
 
34
34
  @try {
35
+ NSLog(@"๐ŸŽฌ AVFoundation: Starting recording initialization");
36
+
35
37
  // Create output URL
36
38
  NSString *outputPathStr = [NSString stringWithUTF8String:outputPath.c_str()];
39
+ NSLog(@"๐ŸŽฌ AVFoundation: Output path string: %@", outputPathStr);
40
+
37
41
  NSURL *outputURL = [NSURL fileURLWithPath:outputPathStr];
42
+ NSLog(@"๐ŸŽฌ AVFoundation: Output URL: %@", outputURL);
38
43
 
39
44
  // Remove existing file
40
- [[NSFileManager defaultManager] removeItemAtURL:outputURL error:nil];
45
+ NSError *removeError = nil;
46
+ [[NSFileManager defaultManager] removeItemAtURL:outputURL error:&removeError];
47
+ if (removeError && removeError.code != NSFileNoSuchFileError) {
48
+ NSLog(@"โš ๏ธ AVFoundation: Warning removing existing file: %@", removeError);
49
+ }
41
50
 
42
51
  // Create asset writer
52
+ NSLog(@"๐ŸŽฌ AVFoundation: Creating AVAssetWriter...");
43
53
  NSError *error = nil;
44
54
  g_avWriter = [[AVAssetWriter alloc] initWithURL:outputURL fileType:AVFileTypeQuickTimeMovie error:&error];
45
55
  if (!g_avWriter || error) {
46
- NSLog(@"โŒ Failed to create AVAssetWriter: %@", error);
56
+ NSLog(@"โŒ AVFoundation: Failed to create AVAssetWriter: %@", error);
57
+ NSLog(@"โŒ AVFoundation: Output URL was: %@", outputURL);
47
58
  return false;
48
59
  }
60
+ NSLog(@"โœ… AVFoundation: AVAssetWriter created successfully");
49
61
 
50
62
  // Get display dimensions
63
+ NSLog(@"๐ŸŽฌ AVFoundation: Getting display dimensions for display ID %u", displayID);
51
64
  CGRect displayBounds = CGDisplayBounds(displayID);
65
+ NSLog(@"๐ŸŽฌ AVFoundation: Display bounds: %.0f x %.0f", displayBounds.size.width, displayBounds.size.height);
66
+
52
67
  CGSize recordingSize = captureRect.size.width > 0 ? captureRect.size : displayBounds.size;
68
+ NSLog(@"๐ŸŽฌ AVFoundation: Recording size: %.0f x %.0f", recordingSize.width, recordingSize.height);
53
69
 
54
70
  // Video settings
55
71
  NSDictionary *videoSettings = @{
@@ -308,6 +308,14 @@ Napi::Value StartRecording(const Napi::CallbackInfo& info) {
308
308
  }
309
309
 
310
310
  @try {
311
+ NSLog(@"๐Ÿ”ง Attempting AVFoundation recording...");
312
+ NSLog(@"๐Ÿ”ง Output path: %s", outputPath.c_str());
313
+ NSLog(@"๐Ÿ”ง Display ID: %u", displayID);
314
+ NSLog(@"๐Ÿ”ง Cursor: %s, Mic: %s, System Audio: %s",
315
+ captureCursor ? "YES" : "NO",
316
+ includeMicrophone ? "YES" : "NO",
317
+ includeSystemAudio ? "YES" : "NO");
318
+
311
319
  // Import AVFoundation recording functions (if available)
312
320
  extern bool startAVFoundationRecording(const std::string& outputPath,
313
321
  CGDirectDisplayID displayID,
@@ -318,17 +326,23 @@ Napi::Value StartRecording(const Napi::CallbackInfo& info) {
318
326
  bool includeSystemAudio,
319
327
  NSString* audioDeviceId);
320
328
 
321
- if (startAVFoundationRecording(outputPath, displayID, windowID, captureRect,
322
- captureCursor, includeMicrophone, includeSystemAudio, audioDeviceId)) {
329
+ NSLog(@"๐Ÿ”ง Calling startAVFoundationRecording...");
330
+ bool avResult = startAVFoundationRecording(outputPath, displayID, windowID, captureRect,
331
+ captureCursor, includeMicrophone, includeSystemAudio, audioDeviceId);
332
+ NSLog(@"๐Ÿ”ง AVFoundation result: %s", avResult ? "SUCCESS" : "FAILED");
333
+
334
+ if (avResult) {
323
335
  NSLog(@"๐ŸŽฅ RECORDING METHOD: AVFoundation (Fallback)");
324
336
  NSLog(@"โœ… AVFoundation recording started successfully");
325
337
  g_isRecording = true;
326
338
  return Napi::Boolean::New(env, true);
327
339
  } else {
328
- NSLog(@"โŒ AVFoundation recording also failed to start");
340
+ NSLog(@"โŒ AVFoundation recording failed to start");
341
+ NSLog(@"โŒ Check permissions and output path validity");
329
342
  }
330
343
  } @catch (NSException *avException) {
331
344
  NSLog(@"โŒ Exception during AVFoundation startup: %@", avException.reason);
345
+ NSLog(@"โŒ Stack trace: %@", [avException callStackSymbols]);
332
346
  }
333
347
 
334
348
  // Both ScreenCaptureKit and AVFoundation failed