Skip to content

Commit da4d741

Browse files
authored
attempt to fix uploads + move some more stuff to hono (#358)
* attempt to fix uploads + move some more stuff to hono * move all /api/desktop to hono * bruh * allow preview urls as main domains * specify md5Sum beforehand * all working :)
1 parent e1a4391 commit da4d741

File tree

36 files changed

+815
-1524
lines changed

36 files changed

+815
-1524
lines changed

.env.example

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,14 @@
88
### @cap/desktop
99
VITE_ENVIRONMENT=${NODE_ENV}
1010

11-
# @cap/web + @cap/desktop
12-
VITE_SERVER_URL=${NEXT_PUBLIC_WEB_URL}
1311
# only @cap/desktop
1412
# VITE_SERVER_URL=https://cap.so
13+
# @cap/web + @cap/desktop
14+
VITE_SERVER_URL=${NEXT_PUBLIC_WEB_URL}
15+
16+
# Ignore if you're not a Cap team member
17+
# Needed if VITE_SERVER_URL is a protected Vercel deployment
18+
# VITE_VERCEL_AUTOMATION_BYPASS_SECRET=
1519

1620
CAP_DESKTOP_SENTRY_URL=
1721
RUST_BACKTRACE=full

apps/desktop/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "@cap/desktop",
33
"type": "module",
44
"scripts": {
5-
"dev": "pnpm -w cap-setup && dotenv -e ../../.env -- pnpm run preparescript && pnpm tauri dev",
5+
"dev": "pnpm -w cap-setup && dotenv -e ../../.env -- pnpm run preparescript && dotenv -e ../../.env -- pnpm tauri dev",
66
"build:tauri": "dotenv -e ../../.env -- pnpm run preparescript && dotenv -e ../../.env -- pnpm tauri build",
77
"preparescript": "node scripts/prepare.js",
88
"localdev": "dotenv -e ../../.env -- vinxi dev --port 3001",

apps/desktop/src-tauri/capabilities/default.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@
5555
{
5656
"identifier": "http:default",
5757
"allow": [
58-
{ "url": "https://cap.so" },
59-
{ "url": "https://l.cap.so" },
60-
{ "url": "http://localhost:3000/*" }
58+
{ "url": "http://*" },
59+
{ "url": "https://*" },
60+
{ "url": "http://localhost:*" }
6161
]
6262
},
6363
"clipboard-manager:allow-write-text"

apps/desktop/src-tauri/src/lib.rs

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -2006,7 +2006,6 @@ pub async fn run(recording_logging_handle: LoggingHandle) {
20062006
reset_microphone_permissions,
20072007
is_camera_window_open,
20082008
seek_to,
2009-
send_feedback_request,
20102009
windows::position_traffic_lights,
20112010
windows::set_theme,
20122011
global_message_dialog,
@@ -2383,53 +2382,6 @@ fn screenshot_path(app: &AppHandle, screenshot_id: &str) -> PathBuf {
23832382
screenshots_path(app).join(format!("{}.cap", screenshot_id))
23842383
}
23852384

2386-
#[tauri::command]
2387-
#[specta::specta]
2388-
async fn send_feedback_request(app: AppHandle, feedback: String) -> Result<(), String> {
2389-
let auth = AuthStore::get(&app)
2390-
.map_err(|e| e.to_string())?
2391-
.ok_or("Not authenticated")?;
2392-
2393-
let feedback_url = web_api::make_url("/api/desktop/feedback");
2394-
2395-
// Create a proper multipart form
2396-
let form = reqwest::multipart::Form::new().text("feedback", feedback);
2397-
2398-
let client = reqwest::Client::new();
2399-
let response = client
2400-
.post(feedback_url)
2401-
.header("Authorization", format!("Bearer {}", auth.token))
2402-
.multipart(form)
2403-
.send()
2404-
.await
2405-
.map_err(|e| format!("Failed to send feedback: {}", e))?;
2406-
2407-
if !response.status().is_success() {
2408-
println!("Feedback request failed with status: {}", response.status());
2409-
2410-
let error_text = response
2411-
.text()
2412-
.await
2413-
.map_err(|_| "Failed to read error response")?;
2414-
2415-
println!("Error response: {}", error_text);
2416-
2417-
// Parse the error response and convert to owned String immediately
2418-
let error = match serde_json::from_str::<serde_json::Value>(&error_text) {
2419-
Ok(v) => v
2420-
.get("error")
2421-
.and_then(|e| e.as_str())
2422-
.map(ToString::to_string)
2423-
.unwrap_or_else(|| "Failed to submit feedback".to_string()),
2424-
Err(_) => "Failed to submit feedback".to_string(),
2425-
};
2426-
2427-
return Err(error);
2428-
}
2429-
2430-
Ok(())
2431-
}
2432-
24332385
#[tauri::command]
24342386
#[specta::specta]
24352387
fn global_message_dialog(app: AppHandle, message: String) {

apps/desktop/src-tauri/src/upload.rs

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -454,26 +454,14 @@ pub async fn get_s3_config(
454454
is_screenshot: bool,
455455
video_id: Option<String>,
456456
) -> Result<S3UploadMeta, String> {
457-
let origin = "http://tauri.localhost";
458457
let config_url = web_api::make_url(if let Some(id) = video_id {
459-
format!(
460-
"/api/desktop/video/create?origin={}&recordingMode=desktopMP4&videoId={}",
461-
origin, id
462-
)
458+
format!("/api/desktop/video/create?recordingMode=desktopMP4&videoId={id}")
463459
} else if is_screenshot {
464-
format!(
465-
"/api/desktop/video/create?origin={}&recordingMode=desktopMP4&isScreenshot=true",
466-
origin
467-
)
460+
"/api/desktop/video/create?recordingMode=desktopMP4&isScreenshot=true".to_string()
468461
} else {
469-
format!(
470-
"/api/desktop/video/create?origin={}&recordingMode=desktopMP4",
471-
origin
472-
)
462+
"/api/desktop/video/create?recordingMode=desktopMP4".to_string()
473463
});
474464

475-
dbg!(&config_url);
476-
477465
let response = app
478466
.authed_api_request(|client| client.get(config_url))
479467
.await
@@ -1311,7 +1299,8 @@ impl ProgressiveUploadTask {
13111299
.json(&serde_json::json!({
13121300
"fileKey": file_key,
13131301
"uploadId": upload_id,
1314-
"partNumber": *part_number
1302+
"partNumber": *part_number,
1303+
"md5Sum": &md5_sum
13151304
}))
13161305
})
13171306
.await
@@ -1368,8 +1357,6 @@ impl ProgressiveUploadTask {
13681357

13691358
match client
13701359
.put(&presigned_url)
1371-
.header("Content-Length", total_read.to_string())
1372-
.header("Connection", "keep-alive")
13731360
.header("Content-MD5", &md5_sum)
13741361
.timeout(Duration::from_secs(120))
13751362
.body(chunk.clone())

apps/desktop/src-tauri/src/web_api.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,13 @@ async fn do_authed_request(
1515
) -> Result<reqwest::Response, reqwest::Error> {
1616
let client = reqwest::Client::new();
1717

18-
build(client)
19-
.header("Authorization", format!("Bearer {}", auth.token))
20-
.send()
21-
.await
18+
let mut req = build(client).header("Authorization", format!("Bearer {}", auth.token));
19+
20+
if let Some(s) = std::option_env!("VITE_VERCEL_AUTOMATION_BYPASS_SECRET") {
21+
req = req.header("x-vercel-protection-bypass", s);
22+
}
23+
24+
req.send().await
2225
}
2326

2427
pub trait ManagerExt<R: Runtime>: Manager<R> {

apps/desktop/src/routes/(window-chrome)/signin.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ function createSessionRequestUrl(
7575
platform: "web" | "desktop"
7676
) {
7777
const callbackUrl = new URL(
78-
`${clientEnv.VITE_SERVER_URL}/api/desktop/session/request`
78+
`/api/desktop/session/request`,
79+
clientEnv.VITE_SERVER_URL
7980
);
8081

8182
if (port !== null) callbackUrl.searchParams.set("port", port);

apps/desktop/src/routes/(window-chrome)/upgrade.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ const signInAction = action(async (planType: "yearly" | "monthly") => {
7575
console.log("Platform:", platform);
7676

7777
const callbackUrl = new URL(
78-
`${clientEnv.VITE_SERVER_URL}/api/desktop/session/request`
78+
`/api/desktop/session/request`,
79+
clientEnv.VITE_SERVER_URL
7980
);
8081
callbackUrl.searchParams.set("port", port);
8182
callbackUrl.searchParams.set("platform", platform);

apps/desktop/src/utils/tauri.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,6 @@ async isCameraWindowOpen() : Promise<boolean> {
140140
async seekTo(frameNumber: number) : Promise<null> {
141141
return await TAURI_INVOKE("seek_to", { frameNumber });
142142
},
143-
async sendFeedbackRequest(feedback: string) : Promise<null> {
144-
return await TAURI_INVOKE("send_feedback_request", { feedback });
145-
},
146143
async positionTrafficLights(controlsInset: [number, number] | null) : Promise<void> {
147144
await TAURI_INVOKE("position_traffic_lights", { controlsInset });
148145
},

apps/desktop/src/utils/web-api.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ import { clientEnv } from "./env";
66
import { authStore } from "~/store";
77

88
const api: ApiFetcher = async (args) => {
9+
const bypassSecret = import.meta.env.VITE_VERCEL_AUTOMATION_BYPASS_SECRET;
10+
if (bypassSecret) args.headers["x-vercel-protection-bypass"] = bypassSecret;
11+
912
const resp = await fetch(args.path, args);
1013

1114
let body;
@@ -17,6 +20,8 @@ const api: ApiFetcher = async (args) => {
1720
body = await resp.text();
1821
}
1922

23+
console.log({ body });
24+
2025
return {
2126
body,
2227
status: resp.status,

0 commit comments

Comments
 (0)