node-mac-recorder 2.16.13 โ†’ 2.16.14

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "permissions": {
3
3
  "allow": [
4
- "Bash(FORCE_AVFOUNDATION=1 node -e \"\nconsole.log(''๐Ÿงช Testing Electron crash fix (macOS 14 simulation)...'');\nconst MacRecorder = require(''./index.js'');\nconst recorder = new MacRecorder();\n\nrecorder.on(''recordingStarted'', (details) => {\n console.log(''โœ… Recording started safely'');\n});\n\nrecorder.on(''stopped'', () => {\n console.log(''โœ… Recording stopped without crash'');\n});\n\nlet recordingStarted = false;\nrecorder.startRecording(''/tmp/crash-fix-test.mov'')\n .then(success => {\n console.log(''Start result:'', success ? ''โœ… SUCCESS'' : ''โŒ FAILED'');\n if (success) {\n recordingStarted = true;\n // Test quick start/stop cycles to stress test memory handling\n setTimeout(() => {\n console.log(''โน๏ธ Quick stop test...'');\n recorder.stopRecording().then(() => {\n console.log(''โœ… Quick stop completed'');\n \n // Test immediate restart\n setTimeout(() => {\n console.log(''๐Ÿ”„ Testing immediate restart...'');\n recorder.startRecording(''/tmp/crash-fix-test2.mov'').then(() => {\n setTimeout(() => {\n recorder.stopRecording().then(() => {\n console.log(''๐ŸŽ‰ Crash fix test completed successfully!'');\n const fs = require(''fs'');\n const files = [''/tmp/crash-fix-test.mov'', ''/tmp/crash-fix-test2.mov''];\n files.forEach(file => {\n if (fs.existsSync(file)) {\n const size = Math.round(fs.statSync(file).size/1024);\n console.log(''๐Ÿ“น '' + file + '':'', size + ''KB'');\n }\n });\n });\n }, 1000);\n });\n }, 500);\n });\n }, 2000);\n }\n })\n .catch(err => {\n console.error(''โŒ Error:'', err);\n if (recordingStarted) {\n recorder.stopRecording();\n }\n });\n\")"
4
+ "Bash(FORCE_AVFOUNDATION=1 node -e \"\nconsole.log(''๐Ÿงช Testing AVFoundation area recording...'');\nconst MacRecorder = require(''./index.js'');\nconst recorder = new MacRecorder();\n\n// Test specific area recording (top-left 500x500)\nconst options = {\n captureArea: {\n x: 100,\n y: 100, \n width: 500,\n height: 500\n }\n};\n\nrecorder.startRecording(''/tmp/area-test.mov'', options)\n .then(success => {\n console.log(''Area recording:'', success ? ''โœ… SUCCESS'' : ''โŒ FAILED'');\n if (success) {\n setTimeout(() => {\n recorder.stopRecording().then(() => {\n console.log(''โœ… Area recording complete'');\n const fs = require(''fs'');\n if (fs.existsSync(''/tmp/area-test.mov'')) {\n const size = Math.round(fs.statSync(''/tmp/area-test.mov'').size/1024);\n console.log(''๐Ÿ“น File size:'', size + ''KB'');\n }\n });\n }, 2000);\n }\n })\n .catch(console.error);\n\")"
5
5
  ],
6
6
  "deny": [],
7
7
  "ask": []
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-mac-recorder",
3
- "version": "2.16.13",
3
+ "version": "2.16.14",
4
4
  "description": "Native macOS screen recording package for Node.js applications",
5
5
  "main": "index.js",
6
6
  "keywords": [
@@ -53,9 +53,14 @@ extern "C" bool startAVFoundationRecording(const std::string& outputPath,
53
53
  return false;
54
54
  }
55
55
 
56
- // Get display dimensions
56
+ // Get display dimensions - use width/height directly to avoid coordinate issues
57
57
  CGRect displayBounds = CGDisplayBounds(displayID);
58
- CGSize recordingSize = captureRect.size.width > 0 ? captureRect.size : displayBounds.size;
58
+ CGSize displaySize = CGSizeMake(CGDisplayPixelsWide(displayID), CGDisplayPixelsHigh(displayID));
59
+ CGSize recordingSize = captureRect.size.width > 0 ? captureRect.size : displaySize;
60
+
61
+ NSLog(@"๐Ÿ–ฅ๏ธ Display bounds: %.0f,%.0f %.0fx%.0f", displayBounds.origin.x, displayBounds.origin.y, displayBounds.size.width, displayBounds.size.height);
62
+ NSLog(@"๐Ÿ–ฅ๏ธ Display pixels: %.0fx%.0f", displaySize.width, displaySize.height);
63
+ NSLog(@"๐ŸŽฏ Recording size: %.0fx%.0f", recordingSize.width, recordingSize.height);
59
64
 
60
65
  // Video settings with macOS compatibility
61
66
  NSString *codecKey;
@@ -173,6 +178,16 @@ extern "C" bool startAVFoundationRecording(const std::string& outputPath,
173
178
  CVReturn cvRet = CVPixelBufferPoolCreatePixelBuffer(NULL, localPixelBufferAdaptor.pixelBufferPool, &pixelBuffer);
174
179
 
175
180
  if (cvRet == kCVReturnSuccess && pixelBuffer) {
181
+ // Check pixel buffer dimensions match screen image
182
+ size_t bufferWidth = CVPixelBufferGetWidth(pixelBuffer);
183
+ size_t bufferHeight = CVPixelBufferGetHeight(pixelBuffer);
184
+ size_t imageWidth = CGImageGetWidth(screenImage);
185
+ size_t imageHeight = CGImageGetHeight(screenImage);
186
+
187
+ if (bufferWidth != imageWidth || bufferHeight != imageHeight) {
188
+ NSLog(@"โš ๏ธ Size mismatch! Buffer %zux%zu vs Image %zux%zu", bufferWidth, bufferHeight, imageWidth, imageHeight);
189
+ }
190
+
176
191
  CVPixelBufferLockBaseAddress(pixelBuffer, 0);
177
192
 
178
193
  void *pixelData = CVPixelBufferGetBaseAddress(pixelBuffer);
@@ -875,25 +875,32 @@ void updateOverlay() {
875
875
  }
876
876
 
877
877
  // Determine if this is a primary display window
878
- BOOL isPrimaryDisplayWindow = (x >= 0 && x <= 2048); // Primary display width
878
+ NSArray *allScreens = [NSScreen screens];
879
+ NSScreen *primaryScreen = [allScreens objectAtIndex:0]; // Primary screen
880
+ NSRect primaryFrame = [primaryScreen frame];
881
+ BOOL isPrimaryDisplayWindow = (x >= primaryFrame.origin.x &&
882
+ x <= primaryFrame.origin.x + primaryFrame.size.width &&
883
+ y >= primaryFrame.origin.y &&
884
+ y <= primaryFrame.origin.y + primaryFrame.size.height);
879
885
 
880
886
  CGFloat localX, localY;
881
887
  if (isPrimaryDisplayWindow) {
882
- // Primary display windows: Offset to their position in the combined overlay
883
- // Primary display starts at (3440, 56) within the combined frame
884
- localX = x + 3440; // Primary starts 3440px from overlay origin
885
- localY = ([g_overlayView frame].size.height - (y + 56)) - height; // Y offset for primary
888
+ // Primary display windows: Calculate dynamic offset from combined frame
889
+ NSRect combinedFrame = [g_overlayWindow frame];
890
+
891
+ // Calculate primary screen offset within combined frame
892
+ CGFloat primaryOffsetX = primaryFrame.origin.x - combinedFrame.origin.x;
893
+ CGFloat primaryOffsetY = primaryFrame.origin.y - combinedFrame.origin.y;
894
+
895
+ localX = x + primaryOffsetX;
896
+ localY = ([g_overlayView frame].size.height - (y + primaryOffsetY)) - height;
897
+
886
898
  } else {
887
899
  // Secondary display windows: Apply standard coordinate transformation
888
900
  localX = x - globalOffset.x;
889
901
  localY = ([g_overlayView frame].size.height - (y - globalOffset.y)) - height;
890
902
  }
891
903
 
892
- NSLog(@"๐Ÿ”ง COORDINATE DEBUG: Window (%d, %d) %dx%d [%@]", (int)x, (int)y, (int)width, (int)height, isPrimaryDisplayWindow ? @"PRIMARY" : @"SECONDARY");
893
- NSLog(@" GlobalOffset: (%.0f, %.0f)", globalOffset.x, globalOffset.y);
894
- NSLog(@" LocalCoords: (%.0f, %.0f)", localX, localY);
895
- NSLog(@" ViewFrame: %.0fx%.0f", [g_overlayView frame].size.width, [g_overlayView frame].size.height);
896
-
897
904
  // Update overlay view window info for highlighting
898
905
  [overlayView setWindowInfo:targetWindow];
899
906
  [overlayView setHighlightFrame:NSMakeRect(localX, localY, width, height)];