@myerscarpenter/quest-dev 1.0.4 → 1.0.6
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.
- package/build/commands/open.d.ts.map +1 -1
- package/build/commands/open.js +26 -11
- package/build/commands/open.js.map +1 -1
- package/build/commands/screenshot.d.ts.map +1 -1
- package/build/commands/screenshot.js +42 -10
- package/build/commands/screenshot.js.map +1 -1
- package/build/index.js +2 -2
- package/build/index.js.map +1 -1
- package/build/utils/adb.d.ts +14 -0
- package/build/utils/adb.d.ts.map +1 -1
- package/build/utils/adb.js +69 -7
- package/build/utils/adb.js.map +1 -1
- package/package.json +1 -1
- package/src/commands/open.ts +26 -10
- package/src/commands/screenshot.ts +46 -10
- package/src/index.ts +2 -2
- package/src/utils/adb.ts +74 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyFH;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0D5D"}
|
package/build/commands/open.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Quest open command
|
|
3
3
|
* Opens a URL in Quest browser with proper ADB port forwarding
|
|
4
4
|
*/
|
|
5
|
-
import { checkADBPath, checkADBDevices, ensurePortForwarding, isBrowserRunning, launchBrowser, getCDPPort } from '../utils/adb.js';
|
|
5
|
+
import { checkADBPath, checkADBDevices, ensurePortForwarding, ensureCDPForwarding, isBrowserRunning, launchBrowser, getCDPPort } from '../utils/adb.js';
|
|
6
6
|
import { execCommandFull } from '../utils/exec.js';
|
|
7
7
|
/**
|
|
8
8
|
* Try to navigate or reload existing tab via cdp-cli
|
|
@@ -71,26 +71,41 @@ async function tryNavigateExistingTab(targetUrl) {
|
|
|
71
71
|
* Main open command handler
|
|
72
72
|
*/
|
|
73
73
|
export async function openCommand(url) {
|
|
74
|
-
// Parse port
|
|
75
|
-
let
|
|
74
|
+
// Parse URL to determine if we need reverse port forwarding
|
|
75
|
+
let parsedUrl;
|
|
76
76
|
try {
|
|
77
|
-
|
|
78
|
-
port = parseInt(parsedUrl.port, 10);
|
|
79
|
-
if (!port || isNaN(port)) {
|
|
80
|
-
console.error('Error: Could not parse port from URL:', url);
|
|
81
|
-
process.exit(1);
|
|
82
|
-
}
|
|
77
|
+
parsedUrl = new URL(url);
|
|
83
78
|
}
|
|
84
79
|
catch (error) {
|
|
85
80
|
console.error('Error: Invalid URL:', url);
|
|
86
81
|
process.exit(1);
|
|
87
82
|
}
|
|
83
|
+
// Determine if this is a localhost URL that needs reverse forwarding
|
|
84
|
+
const isLocalhost = parsedUrl.hostname === 'localhost' || parsedUrl.hostname === '127.0.0.1';
|
|
85
|
+
let port = null;
|
|
86
|
+
if (isLocalhost) {
|
|
87
|
+
// For localhost, we need a port for reverse forwarding
|
|
88
|
+
if (parsedUrl.port) {
|
|
89
|
+
port = parseInt(parsedUrl.port, 10);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
// Use default port based on protocol
|
|
93
|
+
port = parsedUrl.protocol === 'https:' ? 443 : 80;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
88
96
|
console.log(`\nOpening ${url} on Quest...\n`);
|
|
89
97
|
// Check prerequisites
|
|
90
98
|
checkADBPath();
|
|
91
99
|
await checkADBDevices();
|
|
92
|
-
// Set up port forwarding
|
|
93
|
-
|
|
100
|
+
// Set up port forwarding
|
|
101
|
+
if (port !== null) {
|
|
102
|
+
// Localhost URL: need reverse forwarding so Quest can reach the dev server
|
|
103
|
+
await ensurePortForwarding(port);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
// External URL: only need CDP forwarding to control the browser
|
|
107
|
+
await ensureCDPForwarding();
|
|
108
|
+
}
|
|
94
109
|
// Check if browser is running
|
|
95
110
|
const browserRunning = await isBrowserRunning();
|
|
96
111
|
if (!browserRunning) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EACb,UAAU,EACX,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAe,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEhE;;GAEG;AACH,KAAK,UAAU,sBAAsB,CAAC,SAAiB;IACrD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,iCAAiC;QACjC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,CAAC,WAAW,EAAE,oBAAoB,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAEtG,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;YACzE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,mCAAmC;QACnC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3E,MAAM,IAAI,GAAsD,EAAE,CAAC;QAEnE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC7B,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;oBACpC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;QAC5D,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,gCAAgC,SAAS,EAAE,CAAC,CAAC;YAEzD,iBAAiB;YACjB,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE;gBACpD,WAAW,EAAE,oBAAoB,OAAO,EAAE;gBAC1C,IAAI,EAAE,WAAW,CAAC,EAAE,EAAE,QAAQ;aAC/B,CAAC,CAAC;YAEH,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;gBACrC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,2CAA2C;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAC/B,GAAG,CAAC,GAAG,KAAK,aAAa;YACzB,GAAG,CAAC,GAAG,KAAK,kBAAkB;YAC9B,GAAG,CAAC,GAAG,KAAK,4BAA4B,IAAK,qBAAqB;YAClE,GAAG,CAAC,GAAG,KAAK,EAAE,CACf,CAAC;QAEF,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;YAEjD,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE;gBACjD,WAAW,EAAE,oBAAoB,OAAO,EAAE;gBAC1C,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS;aAC7B,CAAC,CAAC;YAEH,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;gBAC1C,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QAC/D,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW;IAC3C,
|
|
1
|
+
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,UAAU,EACX,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAe,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEhE;;GAEG;AACH,KAAK,UAAU,sBAAsB,CAAC,SAAiB;IACrD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,iCAAiC;QACjC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,CAAC,WAAW,EAAE,oBAAoB,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAEtG,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;YACzE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,mCAAmC;QACnC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3E,MAAM,IAAI,GAAsD,EAAE,CAAC;QAEnE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC7B,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;oBACpC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;QAC5D,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,gCAAgC,SAAS,EAAE,CAAC,CAAC;YAEzD,iBAAiB;YACjB,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE;gBACpD,WAAW,EAAE,oBAAoB,OAAO,EAAE;gBAC1C,IAAI,EAAE,WAAW,CAAC,EAAE,EAAE,QAAQ;aAC/B,CAAC,CAAC;YAEH,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;gBACrC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,2CAA2C;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAC/B,GAAG,CAAC,GAAG,KAAK,aAAa;YACzB,GAAG,CAAC,GAAG,KAAK,kBAAkB;YAC9B,GAAG,CAAC,GAAG,KAAK,4BAA4B,IAAK,qBAAqB;YAClE,GAAG,CAAC,GAAG,KAAK,EAAE,CACf,CAAC;QAEF,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;YAEjD,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE;gBACjD,WAAW,EAAE,oBAAoB,OAAO,EAAE;gBAC1C,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS;aAC7B,CAAC,CAAC;YAEH,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;gBAC1C,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QAC/D,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW;IAC3C,4DAA4D;IAC5D,IAAI,SAAc,CAAC;IACnB,IAAI,CAAC;QACH,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qEAAqE;IACrE,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,KAAK,WAAW,IAAI,SAAS,CAAC,QAAQ,KAAK,WAAW,CAAC;IAC7F,IAAI,IAAI,GAAkB,IAAI,CAAC;IAE/B,IAAI,WAAW,EAAE,CAAC;QAChB,uDAAuD;QACvD,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;YACnB,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,qCAAqC;YACrC,IAAI,GAAG,SAAS,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,gBAAgB,CAAC,CAAC;IAE9C,sBAAsB;IACtB,YAAY,EAAE,CAAC;IACf,MAAM,eAAe,EAAE,CAAC;IAExB,yBAAyB;IACzB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,2EAA2E;QAC3E,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,gEAAgE;QAChE,MAAM,mBAAmB,EAAE,CAAC;IAC9B,CAAC;IAED,8BAA8B;IAC9B,MAAM,cAAc,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAEhD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAEhD,0DAA0D;QAC1D,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,GAAG,CAAC,CAAC;QAEpD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;YAC9D,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../src/commands/screenshot.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../src/commands/screenshot.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA2EH;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDzE"}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* Triggers Quest's native screenshot service and pulls the file
|
|
4
4
|
*/
|
|
5
5
|
import { resolve } from 'path';
|
|
6
|
-
import { checkADBPath, checkADBDevices } from '../utils/adb.js';
|
|
7
|
-
import { execCommand } from '../utils/exec.js';
|
|
6
|
+
import { checkADBPath, checkADBDevices, checkUSBFileTransfer, checkQuestAwake } from '../utils/adb.js';
|
|
7
|
+
import { execCommand, execCommandFull } from '../utils/exec.js';
|
|
8
8
|
/**
|
|
9
9
|
* Trigger Quest screenshot service
|
|
10
10
|
*/
|
|
@@ -35,12 +35,9 @@ async function getMostRecentScreenshot() {
|
|
|
35
35
|
const output = await execCommand('adb', ['shell', 'ls', '-t', '/sdcard/Oculus/Screenshots/']);
|
|
36
36
|
const files = output.split('\n').filter(line => line.trim() && line.endsWith('.jpg'));
|
|
37
37
|
if (files.length === 0) {
|
|
38
|
-
console.error('No screenshots found in /sdcard/Oculus/Screenshots/');
|
|
39
38
|
return null;
|
|
40
39
|
}
|
|
41
|
-
|
|
42
|
-
console.log(`Found most recent screenshot: ${mostRecent}`);
|
|
43
|
-
return mostRecent;
|
|
40
|
+
return files[0].trim();
|
|
44
41
|
}
|
|
45
42
|
catch (error) {
|
|
46
43
|
console.error('Failed to list screenshots:', error.message);
|
|
@@ -62,6 +59,19 @@ async function pullScreenshot(filename, outputPath) {
|
|
|
62
59
|
return false;
|
|
63
60
|
}
|
|
64
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Delete screenshot from Quest after pulling
|
|
64
|
+
*/
|
|
65
|
+
async function deleteRemoteScreenshot(filename) {
|
|
66
|
+
const remotePath = `/sdcard/Oculus/Screenshots/${filename}`;
|
|
67
|
+
const result = await execCommandFull('adb', ['shell', 'rm', remotePath]);
|
|
68
|
+
if (result.code !== 0) {
|
|
69
|
+
console.warn(`Warning: Failed to delete screenshot from Quest: ${filename}`);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
console.log(`Deleted screenshot from Quest: ${filename}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
65
75
|
/**
|
|
66
76
|
* Main screenshot command handler
|
|
67
77
|
*/
|
|
@@ -71,22 +81,44 @@ export async function screenshotCommand(outputPath) {
|
|
|
71
81
|
// Check prerequisites
|
|
72
82
|
checkADBPath();
|
|
73
83
|
await checkADBDevices();
|
|
84
|
+
await checkUSBFileTransfer();
|
|
85
|
+
await checkQuestAwake();
|
|
86
|
+
// Get existing most recent screenshot (to detect if a new one is created)
|
|
87
|
+
const existingScreenshot = await getMostRecentScreenshot();
|
|
74
88
|
// Trigger screenshot
|
|
75
89
|
if (!await triggerScreenshot()) {
|
|
76
90
|
process.exit(1);
|
|
77
91
|
}
|
|
78
|
-
// Wait for screenshot to save
|
|
92
|
+
// Wait for screenshot to save and verify a new one was created
|
|
79
93
|
console.log('Waiting for screenshot to save...');
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
94
|
+
let filename = null;
|
|
95
|
+
const maxAttempts = 10;
|
|
96
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
97
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
98
|
+
const newScreenshot = await getMostRecentScreenshot();
|
|
99
|
+
if (newScreenshot && newScreenshot !== existingScreenshot) {
|
|
100
|
+
filename = newScreenshot;
|
|
101
|
+
console.log(`New screenshot created: ${filename}`);
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
83
105
|
if (!filename) {
|
|
106
|
+
console.error('Error: Screenshot was not created');
|
|
107
|
+
console.error('');
|
|
108
|
+
console.error('The screenshot service was triggered but no new screenshot appeared.');
|
|
109
|
+
console.error('This can happen if:');
|
|
110
|
+
console.error('- The Quest is asleep or the screen is off');
|
|
111
|
+
console.error('- The Quest is showing a system dialog');
|
|
112
|
+
console.error('- There is insufficient storage space');
|
|
113
|
+
console.error('');
|
|
84
114
|
process.exit(1);
|
|
85
115
|
}
|
|
86
116
|
// Pull screenshot
|
|
87
117
|
if (!await pullScreenshot(filename, resolvedPath)) {
|
|
88
118
|
process.exit(1);
|
|
89
119
|
}
|
|
120
|
+
// Delete from Quest after successful pull
|
|
121
|
+
await deleteRemoteScreenshot(filename);
|
|
90
122
|
console.log('\nDone!\n');
|
|
91
123
|
}
|
|
92
124
|
//# sourceMappingURL=screenshot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../src/commands/screenshot.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../src/commands/screenshot.ts"],"names":[],"mappings":"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"}
|
package/build/index.js
CHANGED
|
@@ -45,9 +45,9 @@ cli.command('screenshot <output>', 'Take a screenshot from Quest and save to loc
|
|
|
45
45
|
await screenshotCommand(argv.output);
|
|
46
46
|
});
|
|
47
47
|
// Open command
|
|
48
|
-
cli.command('open <url>', 'Open URL in Quest browser (sets up
|
|
48
|
+
cli.command('open <url>', 'Open URL in Quest browser (sets up CDP debugging port forwarding)', (yargs) => {
|
|
49
49
|
return yargs.positional('url', {
|
|
50
|
-
describe: 'URL to open (
|
|
50
|
+
describe: 'URL to open (localhost URLs get reverse forwarding for dev server access)',
|
|
51
51
|
type: 'string',
|
|
52
52
|
demandOption: true
|
|
53
53
|
});
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,iCAAiC;AACjC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAC1D,CAAC;AACF,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;AAEpC,aAAa;AACb,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KACrC,UAAU,CAAC,WAAW,CAAC;KACvB,OAAO,CAAC,OAAO,CAAC;KAChB,KAAK,CAAC,+BAA+B,CAAC;KACtC,aAAa,CAAC,CAAC,EAAE,4BAA4B,CAAC;KAC9C,MAAM,EAAE;KACR,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;IACxB,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;KACD,IAAI,EAAE;KACN,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC;KAClB,MAAM,CAAC,iFAAiF,CAAC,CAAC;AAE7F,qBAAqB;AACrB,GAAG,CAAC,OAAO,CACT,qBAAqB,EACrB,qDAAqD,EACrD,CAAC,KAAK,EAAE,EAAE;IACR,OAAO,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE;QAChC,QAAQ,EAAE,iDAAiD;QAC3D,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;AACL,CAAC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,MAAM,iBAAiB,CAAC,IAAI,CAAC,MAAgB,CAAC,CAAC;AACjD,CAAC,CACF,CAAC;AAEF,eAAe;AACf,GAAG,CAAC,OAAO,CACT,YAAY,EACZ,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,iCAAiC;AACjC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAC1D,CAAC;AACF,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;AAEpC,aAAa;AACb,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KACrC,UAAU,CAAC,WAAW,CAAC;KACvB,OAAO,CAAC,OAAO,CAAC;KAChB,KAAK,CAAC,+BAA+B,CAAC;KACtC,aAAa,CAAC,CAAC,EAAE,4BAA4B,CAAC;KAC9C,MAAM,EAAE;KACR,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;IACxB,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;KACD,IAAI,EAAE;KACN,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC;KAClB,MAAM,CAAC,iFAAiF,CAAC,CAAC;AAE7F,qBAAqB;AACrB,GAAG,CAAC,OAAO,CACT,qBAAqB,EACrB,qDAAqD,EACrD,CAAC,KAAK,EAAE,EAAE;IACR,OAAO,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE;QAChC,QAAQ,EAAE,iDAAiD;QAC3D,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;AACL,CAAC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,MAAM,iBAAiB,CAAC,IAAI,CAAC,MAAgB,CAAC,CAAC;AACjD,CAAC,CACF,CAAC;AAEF,eAAe;AACf,GAAG,CAAC,OAAO,CACT,YAAY,EACZ,mEAAmE,EACnE,CAAC,KAAK,EAAE,EAAE;IACR,OAAO,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE;QAC7B,QAAQ,EAAE,2EAA2E;QACrF,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;AACL,CAAC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,MAAM,WAAW,CAAC,IAAI,CAAC,GAAa,CAAC,CAAC;AACxC,CAAC,CACF,CAAC;AAEF,oBAAoB;AACpB,GAAG,CAAC,KAAK,EAAE,CAAC"}
|
package/build/utils/adb.d.ts
CHANGED
|
@@ -29,4 +29,18 @@ export declare function launchBrowser(url: string): Promise<boolean>;
|
|
|
29
29
|
* Get CDP port
|
|
30
30
|
*/
|
|
31
31
|
export declare function getCDPPort(): number;
|
|
32
|
+
/**
|
|
33
|
+
* Set up only CDP forwarding (for external URLs that don't need reverse forwarding)
|
|
34
|
+
*/
|
|
35
|
+
export declare function ensureCDPForwarding(): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Check if USB file transfer is authorized on Quest
|
|
38
|
+
* After reboot, user must click notification to allow file access
|
|
39
|
+
*/
|
|
40
|
+
export declare function checkUSBFileTransfer(): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Check if Quest display is awake
|
|
43
|
+
* Screenshots cannot be taken when the display is off
|
|
44
|
+
*/
|
|
45
|
+
export declare function checkQuestAwake(): Promise<void>;
|
|
32
46
|
//# sourceMappingURL=adb.d.ts.map
|
package/build/utils/adb.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adb.d.ts","sourceRoot":"","sources":["../../src/utils/adb.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAkBrC;AAoBD;;GAEG;AACH,wBAAsB,eAAe,CAAC,UAAU,SAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAqCtE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiB9D;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"adb.d.ts","sourceRoot":"","sources":["../../src/utils/adb.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAkBrC;AAoBD;;GAEG;AACH,wBAAsB,eAAe,CAAC,UAAU,SAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAqCtE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiB9D;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CtE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAOzD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBjE;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CA8BzD;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAe1D;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAUrD"}
|
package/build/utils/adb.js
CHANGED
|
@@ -141,13 +141,8 @@ export async function ensurePortForwarding(port) {
|
|
|
141
141
|
console.error('');
|
|
142
142
|
process.exit(1);
|
|
143
143
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
console.log(`ADB forward port forwarding set up: Host:${CDP_PORT} -> Quest:chrome_devtools_remote (CDP)`);
|
|
147
|
-
}
|
|
148
|
-
catch (forwardError) {
|
|
149
|
-
throw forwardError;
|
|
150
|
-
}
|
|
144
|
+
await execCommand('adb', ['forward', `tcp:${CDP_PORT}`, 'localabstract:chrome_devtools_remote']);
|
|
145
|
+
console.log(`ADB forward port forwarding set up: Host:${CDP_PORT} -> Quest:chrome_devtools_remote (CDP)`);
|
|
151
146
|
}
|
|
152
147
|
}
|
|
153
148
|
catch (error) {
|
|
@@ -197,4 +192,71 @@ export async function launchBrowser(url) {
|
|
|
197
192
|
export function getCDPPort() {
|
|
198
193
|
return CDP_PORT;
|
|
199
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* Set up only CDP forwarding (for external URLs that don't need reverse forwarding)
|
|
197
|
+
*/
|
|
198
|
+
export async function ensureCDPForwarding() {
|
|
199
|
+
try {
|
|
200
|
+
// Check forward forwarding (Host -> Quest for CDP)
|
|
201
|
+
const forwardList = await execCommand('adb', ['forward', '--list']);
|
|
202
|
+
const forwardExists = forwardList.includes(`tcp:${CDP_PORT}`) && forwardList.includes('chrome_devtools_remote');
|
|
203
|
+
if (forwardExists) {
|
|
204
|
+
console.log(`CDP port ${CDP_PORT} forwarding already set up`);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
// Check if something else is using the port
|
|
208
|
+
const cdpPortListening = await isPortListening(CDP_PORT);
|
|
209
|
+
if (cdpPortListening) {
|
|
210
|
+
console.error(`Error: Port ${CDP_PORT} is already in use by another process`);
|
|
211
|
+
console.error('');
|
|
212
|
+
console.error('CDP port forwarding requires port 9223 to be free.');
|
|
213
|
+
console.error('Please stop the process using this port and try again.');
|
|
214
|
+
console.error('');
|
|
215
|
+
console.error('To find what is using the port:');
|
|
216
|
+
console.error(` lsof -i :${CDP_PORT}`);
|
|
217
|
+
console.error('');
|
|
218
|
+
process.exit(1);
|
|
219
|
+
}
|
|
220
|
+
await execCommand('adb', ['forward', `tcp:${CDP_PORT}`, 'localabstract:chrome_devtools_remote']);
|
|
221
|
+
console.log(`ADB forward port forwarding set up: Host:${CDP_PORT} -> Quest:chrome_devtools_remote (CDP)`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
console.error('Failed to set up CDP forwarding:', error.message);
|
|
226
|
+
process.exit(1);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Check if USB file transfer is authorized on Quest
|
|
231
|
+
* After reboot, user must click notification to allow file access
|
|
232
|
+
*/
|
|
233
|
+
export async function checkUSBFileTransfer() {
|
|
234
|
+
const result = await execCommandFull('adb', ['shell', 'ls', '/sdcard/']);
|
|
235
|
+
if (result.code !== 0 ||
|
|
236
|
+
result.stdout.includes('Permission denied') ||
|
|
237
|
+
result.stderr.includes('Permission denied')) {
|
|
238
|
+
console.error('Error: USB file transfer not authorized on Quest');
|
|
239
|
+
console.error('');
|
|
240
|
+
console.error('After rebooting your Quest, you need to authorize USB file transfers:');
|
|
241
|
+
console.error('1. Put on your Quest headset');
|
|
242
|
+
console.error('2. Look for the "Allow access to data" notification');
|
|
243
|
+
console.error('3. Click "Allow" to authorize file transfers');
|
|
244
|
+
console.error('');
|
|
245
|
+
process.exit(1);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Check if Quest display is awake
|
|
250
|
+
* Screenshots cannot be taken when the display is off
|
|
251
|
+
*/
|
|
252
|
+
export async function checkQuestAwake() {
|
|
253
|
+
const result = await execCommandFull('adb', ['shell', 'dumpsys', 'power']);
|
|
254
|
+
if (result.stdout.includes('mWakefulness=Asleep')) {
|
|
255
|
+
console.error('Error: Quest display is off');
|
|
256
|
+
console.error('');
|
|
257
|
+
console.error('Put on the Quest headset or press the power button to wake it.');
|
|
258
|
+
console.error('');
|
|
259
|
+
process.exit(1);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
200
262
|
//# sourceMappingURL=adb.js.map
|
package/build/utils/adb.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adb.js","sourceRoot":"","sources":["../../src/utils/adb.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"adb.js","sourceRoot":"","sources":["../../src/utils/adb.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/commands/open.ts
CHANGED
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
checkADBPath,
|
|
8
8
|
checkADBDevices,
|
|
9
9
|
ensurePortForwarding,
|
|
10
|
+
ensureCDPForwarding,
|
|
10
11
|
isBrowserRunning,
|
|
11
12
|
launchBrowser,
|
|
12
13
|
getCDPPort
|
|
@@ -93,28 +94,43 @@ async function tryNavigateExistingTab(targetUrl: string): Promise<boolean> {
|
|
|
93
94
|
* Main open command handler
|
|
94
95
|
*/
|
|
95
96
|
export async function openCommand(url: string): Promise<void> {
|
|
96
|
-
// Parse port
|
|
97
|
-
let
|
|
97
|
+
// Parse URL to determine if we need reverse port forwarding
|
|
98
|
+
let parsedUrl: URL;
|
|
98
99
|
try {
|
|
99
|
-
|
|
100
|
-
port = parseInt(parsedUrl.port, 10);
|
|
101
|
-
if (!port || isNaN(port)) {
|
|
102
|
-
console.error('Error: Could not parse port from URL:', url);
|
|
103
|
-
process.exit(1);
|
|
104
|
-
}
|
|
100
|
+
parsedUrl = new URL(url);
|
|
105
101
|
} catch (error) {
|
|
106
102
|
console.error('Error: Invalid URL:', url);
|
|
107
103
|
process.exit(1);
|
|
108
104
|
}
|
|
109
105
|
|
|
106
|
+
// Determine if this is a localhost URL that needs reverse forwarding
|
|
107
|
+
const isLocalhost = parsedUrl.hostname === 'localhost' || parsedUrl.hostname === '127.0.0.1';
|
|
108
|
+
let port: number | null = null;
|
|
109
|
+
|
|
110
|
+
if (isLocalhost) {
|
|
111
|
+
// For localhost, we need a port for reverse forwarding
|
|
112
|
+
if (parsedUrl.port) {
|
|
113
|
+
port = parseInt(parsedUrl.port, 10);
|
|
114
|
+
} else {
|
|
115
|
+
// Use default port based on protocol
|
|
116
|
+
port = parsedUrl.protocol === 'https:' ? 443 : 80;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
110
120
|
console.log(`\nOpening ${url} on Quest...\n`);
|
|
111
121
|
|
|
112
122
|
// Check prerequisites
|
|
113
123
|
checkADBPath();
|
|
114
124
|
await checkADBDevices();
|
|
115
125
|
|
|
116
|
-
// Set up port forwarding
|
|
117
|
-
|
|
126
|
+
// Set up port forwarding
|
|
127
|
+
if (port !== null) {
|
|
128
|
+
// Localhost URL: need reverse forwarding so Quest can reach the dev server
|
|
129
|
+
await ensurePortForwarding(port);
|
|
130
|
+
} else {
|
|
131
|
+
// External URL: only need CDP forwarding to control the browser
|
|
132
|
+
await ensureCDPForwarding();
|
|
133
|
+
}
|
|
118
134
|
|
|
119
135
|
// Check if browser is running
|
|
120
136
|
const browserRunning = await isBrowserRunning();
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { resolve } from 'path';
|
|
7
|
-
import { checkADBPath, checkADBDevices } from '../utils/adb.js';
|
|
8
|
-
import { execCommand } from '../utils/exec.js';
|
|
7
|
+
import { checkADBPath, checkADBDevices, checkUSBFileTransfer, checkQuestAwake } from '../utils/adb.js';
|
|
8
|
+
import { execCommand, execCommandFull } from '../utils/exec.js';
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* Trigger Quest screenshot service
|
|
@@ -38,13 +38,10 @@ async function getMostRecentScreenshot(): Promise<string | null> {
|
|
|
38
38
|
const files = output.split('\n').filter(line => line.trim() && line.endsWith('.jpg'));
|
|
39
39
|
|
|
40
40
|
if (files.length === 0) {
|
|
41
|
-
console.error('No screenshots found in /sdcard/Oculus/Screenshots/');
|
|
42
41
|
return null;
|
|
43
42
|
}
|
|
44
43
|
|
|
45
|
-
|
|
46
|
-
console.log(`Found most recent screenshot: ${mostRecent}`);
|
|
47
|
-
return mostRecent;
|
|
44
|
+
return files[0].trim();
|
|
48
45
|
} catch (error) {
|
|
49
46
|
console.error('Failed to list screenshots:', (error as Error).message);
|
|
50
47
|
return null;
|
|
@@ -66,6 +63,19 @@ async function pullScreenshot(filename: string, outputPath: string): Promise<boo
|
|
|
66
63
|
}
|
|
67
64
|
}
|
|
68
65
|
|
|
66
|
+
/**
|
|
67
|
+
* Delete screenshot from Quest after pulling
|
|
68
|
+
*/
|
|
69
|
+
async function deleteRemoteScreenshot(filename: string): Promise<void> {
|
|
70
|
+
const remotePath = `/sdcard/Oculus/Screenshots/${filename}`;
|
|
71
|
+
const result = await execCommandFull('adb', ['shell', 'rm', remotePath]);
|
|
72
|
+
if (result.code !== 0) {
|
|
73
|
+
console.warn(`Warning: Failed to delete screenshot from Quest: ${filename}`);
|
|
74
|
+
} else {
|
|
75
|
+
console.log(`Deleted screenshot from Quest: ${filename}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
69
79
|
/**
|
|
70
80
|
* Main screenshot command handler
|
|
71
81
|
*/
|
|
@@ -77,19 +87,42 @@ export async function screenshotCommand(outputPath: string): Promise<void> {
|
|
|
77
87
|
// Check prerequisites
|
|
78
88
|
checkADBPath();
|
|
79
89
|
await checkADBDevices();
|
|
90
|
+
await checkUSBFileTransfer();
|
|
91
|
+
await checkQuestAwake();
|
|
92
|
+
|
|
93
|
+
// Get existing most recent screenshot (to detect if a new one is created)
|
|
94
|
+
const existingScreenshot = await getMostRecentScreenshot();
|
|
80
95
|
|
|
81
96
|
// Trigger screenshot
|
|
82
97
|
if (!await triggerScreenshot()) {
|
|
83
98
|
process.exit(1);
|
|
84
99
|
}
|
|
85
100
|
|
|
86
|
-
// Wait for screenshot to save
|
|
101
|
+
// Wait for screenshot to save and verify a new one was created
|
|
87
102
|
console.log('Waiting for screenshot to save...');
|
|
88
|
-
|
|
103
|
+
let filename: string | null = null;
|
|
104
|
+
const maxAttempts = 10;
|
|
105
|
+
|
|
106
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
107
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
108
|
+
const newScreenshot = await getMostRecentScreenshot();
|
|
109
|
+
|
|
110
|
+
if (newScreenshot && newScreenshot !== existingScreenshot) {
|
|
111
|
+
filename = newScreenshot;
|
|
112
|
+
console.log(`New screenshot created: ${filename}`);
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
89
116
|
|
|
90
|
-
// Get most recent screenshot
|
|
91
|
-
const filename = await getMostRecentScreenshot();
|
|
92
117
|
if (!filename) {
|
|
118
|
+
console.error('Error: Screenshot was not created');
|
|
119
|
+
console.error('');
|
|
120
|
+
console.error('The screenshot service was triggered but no new screenshot appeared.');
|
|
121
|
+
console.error('This can happen if:');
|
|
122
|
+
console.error('- The Quest is asleep or the screen is off');
|
|
123
|
+
console.error('- The Quest is showing a system dialog');
|
|
124
|
+
console.error('- There is insufficient storage space');
|
|
125
|
+
console.error('');
|
|
93
126
|
process.exit(1);
|
|
94
127
|
}
|
|
95
128
|
|
|
@@ -98,5 +131,8 @@ export async function screenshotCommand(outputPath: string): Promise<void> {
|
|
|
98
131
|
process.exit(1);
|
|
99
132
|
}
|
|
100
133
|
|
|
134
|
+
// Delete from Quest after successful pull
|
|
135
|
+
await deleteRemoteScreenshot(filename);
|
|
136
|
+
|
|
101
137
|
console.log('\nDone!\n');
|
|
102
138
|
}
|
package/src/index.ts
CHANGED
|
@@ -60,10 +60,10 @@ cli.command(
|
|
|
60
60
|
// Open command
|
|
61
61
|
cli.command(
|
|
62
62
|
'open <url>',
|
|
63
|
-
'Open URL in Quest browser (sets up
|
|
63
|
+
'Open URL in Quest browser (sets up CDP debugging port forwarding)',
|
|
64
64
|
(yargs) => {
|
|
65
65
|
return yargs.positional('url', {
|
|
66
|
-
describe: 'URL to open (
|
|
66
|
+
describe: 'URL to open (localhost URLs get reverse forwarding for dev server access)',
|
|
67
67
|
type: 'string',
|
|
68
68
|
demandOption: true
|
|
69
69
|
});
|
package/src/utils/adb.ts
CHANGED
|
@@ -151,12 +151,8 @@ export async function ensurePortForwarding(port: number): Promise<void> {
|
|
|
151
151
|
process.exit(1);
|
|
152
152
|
}
|
|
153
153
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
console.log(`ADB forward port forwarding set up: Host:${CDP_PORT} -> Quest:chrome_devtools_remote (CDP)`);
|
|
157
|
-
} catch (forwardError) {
|
|
158
|
-
throw forwardError;
|
|
159
|
-
}
|
|
154
|
+
await execCommand('adb', ['forward', `tcp:${CDP_PORT}`, 'localabstract:chrome_devtools_remote']);
|
|
155
|
+
console.log(`ADB forward port forwarding set up: Host:${CDP_PORT} -> Quest:chrome_devtools_remote (CDP)`);
|
|
160
156
|
}
|
|
161
157
|
} catch (error) {
|
|
162
158
|
console.error('Failed to set up port forwarding:', (error as Error).message);
|
|
@@ -206,3 +202,75 @@ export async function launchBrowser(url: string): Promise<boolean> {
|
|
|
206
202
|
export function getCDPPort(): number {
|
|
207
203
|
return CDP_PORT;
|
|
208
204
|
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Set up only CDP forwarding (for external URLs that don't need reverse forwarding)
|
|
208
|
+
*/
|
|
209
|
+
export async function ensureCDPForwarding(): Promise<void> {
|
|
210
|
+
try {
|
|
211
|
+
// Check forward forwarding (Host -> Quest for CDP)
|
|
212
|
+
const forwardList = await execCommand('adb', ['forward', '--list']);
|
|
213
|
+
const forwardExists = forwardList.includes(`tcp:${CDP_PORT}`) && forwardList.includes('chrome_devtools_remote');
|
|
214
|
+
|
|
215
|
+
if (forwardExists) {
|
|
216
|
+
console.log(`CDP port ${CDP_PORT} forwarding already set up`);
|
|
217
|
+
} else {
|
|
218
|
+
// Check if something else is using the port
|
|
219
|
+
const cdpPortListening = await isPortListening(CDP_PORT);
|
|
220
|
+
if (cdpPortListening) {
|
|
221
|
+
console.error(`Error: Port ${CDP_PORT} is already in use by another process`);
|
|
222
|
+
console.error('');
|
|
223
|
+
console.error('CDP port forwarding requires port 9223 to be free.');
|
|
224
|
+
console.error('Please stop the process using this port and try again.');
|
|
225
|
+
console.error('');
|
|
226
|
+
console.error('To find what is using the port:');
|
|
227
|
+
console.error(` lsof -i :${CDP_PORT}`);
|
|
228
|
+
console.error('');
|
|
229
|
+
process.exit(1);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
await execCommand('adb', ['forward', `tcp:${CDP_PORT}`, 'localabstract:chrome_devtools_remote']);
|
|
233
|
+
console.log(`ADB forward port forwarding set up: Host:${CDP_PORT} -> Quest:chrome_devtools_remote (CDP)`);
|
|
234
|
+
}
|
|
235
|
+
} catch (error) {
|
|
236
|
+
console.error('Failed to set up CDP forwarding:', (error as Error).message);
|
|
237
|
+
process.exit(1);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Check if USB file transfer is authorized on Quest
|
|
243
|
+
* After reboot, user must click notification to allow file access
|
|
244
|
+
*/
|
|
245
|
+
export async function checkUSBFileTransfer(): Promise<void> {
|
|
246
|
+
const result = await execCommandFull('adb', ['shell', 'ls', '/sdcard/']);
|
|
247
|
+
|
|
248
|
+
if (result.code !== 0 ||
|
|
249
|
+
result.stdout.includes('Permission denied') ||
|
|
250
|
+
result.stderr.includes('Permission denied')) {
|
|
251
|
+
console.error('Error: USB file transfer not authorized on Quest');
|
|
252
|
+
console.error('');
|
|
253
|
+
console.error('After rebooting your Quest, you need to authorize USB file transfers:');
|
|
254
|
+
console.error('1. Put on your Quest headset');
|
|
255
|
+
console.error('2. Look for the "Allow access to data" notification');
|
|
256
|
+
console.error('3. Click "Allow" to authorize file transfers');
|
|
257
|
+
console.error('');
|
|
258
|
+
process.exit(1);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Check if Quest display is awake
|
|
264
|
+
* Screenshots cannot be taken when the display is off
|
|
265
|
+
*/
|
|
266
|
+
export async function checkQuestAwake(): Promise<void> {
|
|
267
|
+
const result = await execCommandFull('adb', ['shell', 'dumpsys', 'power']);
|
|
268
|
+
|
|
269
|
+
if (result.stdout.includes('mWakefulness=Asleep')) {
|
|
270
|
+
console.error('Error: Quest display is off');
|
|
271
|
+
console.error('');
|
|
272
|
+
console.error('Put on the Quest headset or press the power button to wake it.');
|
|
273
|
+
console.error('');
|
|
274
|
+
process.exit(1);
|
|
275
|
+
}
|
|
276
|
+
}
|