| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 | diff --git a/cli/src/commands/serve_web.rs b/cli/src/commands/serve_web.rsindex 2ddefe1..ab9c658 100644--- a/cli/src/commands/serve_web.rs+++ b/cli/src/commands/serve_web.rs@@ -730,3 +730,3 @@ impl ConnectionManager { 		let dir_fut = cache.create(&args.release.commit, |target_dir| async move {-			info!(log_for_fut, "Downloading server {}", release_for_fut.commit);+			info!(log_for_fut, "Downloading server {}/{}", release_for_fut.commit, release_for_fut.name); 			let tmpdir = tempfile::tempdir().unwrap();@@ -758,3 +758,3 @@ impl ConnectionManager { 			.join("bin")-			.join(args.release.quality.server_entrypoint());+			.join(args.release.quality.server_entrypoint().unwrap()); diff --git a/cli/src/constants.rs b/cli/src/constants.rsindex 1e277a8..353aee7 100644--- a/cli/src/constants.rs+++ b/cli/src/constants.rs@@ -36,2 +36,5 @@ pub const VSCODE_CLI_COMMIT: Option<&'static str> = option_env!("VSCODE_CLI_COMM pub const VSCODE_CLI_UPDATE_ENDPOINT: Option<&'static str> = option_env!("VSCODE_CLI_UPDATE_URL");+pub const VSCODE_CLI_DOWNLOAD_ENDPOINT: Option<&'static str> = option_env!("VSCODE_CLI_DOWNLOAD_URL");+pub const VSCODE_CLI_APP_NAME: Option<&'static str> = option_env!("VSCODE_CLI_APP_NAME");+pub const VSCODE_CLI_BINARY_NAME: Option<&'static str> = option_env!("VSCODE_CLI_BINARY_NAME"); diff --git a/cli/src/options.rs b/cli/src/options.rsindex 7d152c0..c0f2fb2 100644--- a/cli/src/options.rs+++ b/cli/src/options.rs@@ -9,3 +9,3 @@ use serde::{Deserialize, Serialize}; -use crate::constants::SERVER_NAME_MAP;+use crate::{constants::VSCODE_CLI_BINARY_NAME, util::errors::CodeError}; @@ -21,2 +21,6 @@ pub enum Quality { +fn get_binary_name() -> Result<&'static str, CodeError> {+	VSCODE_CLI_BINARY_NAME.ok_or_else(|| CodeError::UpdatesNotConfigured("no binary name"))+}+ impl Quality {@@ -41,9 +45,4 @@ impl Quality { 	/// Server application name-	pub fn server_entrypoint(&self) -> String {-		let mut server_name = SERVER_NAME_MAP-			.as_ref()-			.and_then(|m| m.get(self))-			.map(|s| s.server_application_name.as_str())-			.unwrap_or("code-server-oss")-			.to_string();+	pub fn server_entrypoint(&self) -> Result<String, CodeError> {+		let mut server_name = get_binary_name()?.to_string(); @@ -53,3 +52,3 @@ impl Quality { -		server_name+		Ok(server_name) 	}diff --git a/cli/src/tunnels/code_server.rs b/cli/src/tunnels/code_server.rsindex cf00bc4..b564330 100644--- a/cli/src/tunnels/code_server.rs+++ b/cli/src/tunnels/code_server.rs@@ -457,3 +457,3 @@ impl<'a> ServerBuilder<'a> { 							.join("bin")-							.join(self.server_params.release.quality.server_entrypoint()),+							.join(self.server_params.release.quality.server_entrypoint().unwrap()), 						&["--version"],diff --git a/cli/src/tunnels/paths.rs b/cli/src/tunnels/paths.rsindex 3d7d718..98529bc 100644--- a/cli/src/tunnels/paths.rs+++ b/cli/src/tunnels/paths.rs@@ -100,3 +100,3 @@ impl InstalledServer { 					.join("bin")-					.join(self.quality.server_entrypoint())+					.join(self.quality.server_entrypoint().unwrap()) 			},diff --git a/cli/src/update_service.rs b/cli/src/update_service.rsindex 9033914..a39bbf7 100644--- a/cli/src/update_service.rs+++ b/cli/src/update_service.rs@@ -10,3 +10,3 @@ use serde::{Deserialize, Serialize}; use crate::{-	constants::VSCODE_CLI_UPDATE_ENDPOINT,+	constants::{VSCODE_CLI_APP_NAME, VSCODE_CLI_DOWNLOAD_ENDPOINT, VSCODE_CLI_UPDATE_ENDPOINT}, 	debug, log, options, spanf,@@ -18,3 +18,3 @@ use crate::{ 		zipper,-	},+	} };@@ -58,4 +58,12 @@ fn quality_download_segment(quality: options::Quality) -> &'static str { +fn get_app_name() -> Result<&'static str, CodeError> {+	VSCODE_CLI_APP_NAME.ok_or_else(|| CodeError::UpdatesNotConfigured("no app name"))+}++fn get_download_endpoint() -> Result<&'static str, CodeError> {+	VSCODE_CLI_DOWNLOAD_ENDPOINT.ok_or_else(|| CodeError::UpdatesNotConfigured("no download url"))+}+ fn get_update_endpoint() -> Result<&'static str, CodeError> {-	VSCODE_CLI_UPDATE_ENDPOINT.ok_or_else(|| CodeError::UpdatesNotConfigured("no service url"))+	VSCODE_CLI_UPDATE_ENDPOINT.ok_or_else(|| CodeError::UpdatesNotConfigured("no update url")) }@@ -67,3 +75,4 @@ impl UpdateService { -	pub async fn get_release_by_semver_version(+	/// Gets the latest commit for the target of the given quality.+	pub async fn get_latest_commit( 		&self,@@ -72,14 +81,10 @@ impl UpdateService { 		quality: options::Quality,-		version: &str, 	) -> Result<Release, AnyError> { 		let update_endpoint = get_update_endpoint()?;-		let download_segment = target-			.download_segment(platform)-			.ok_or_else(|| CodeError::UnsupportedPlatform(platform.to_string()))?; 		let download_url = format!(-			"{}/api/versions/{}/{}/{}",+			"{}/{}/{}/{}/latest.json", 			update_endpoint,-			version,-			download_segment, 			quality_download_segment(quality),+			platform.os(),+			platform.arch(), 		);@@ -97,3 +102,3 @@ impl UpdateService { 		let res = response.json::<UpdateServerVersion>().await?;-		debug!(self.log, "Resolved version {} to {}", version, res.version);+		debug!(self.log, "Resolved quality {} to {}", quality, res.version); @@ -108,40 +113,17 @@ impl UpdateService { -	/// Gets the latest commit for the target of the given quality.-	pub async fn get_latest_commit(-		&self,-		platform: Platform,-		target: TargetKind,-		quality: options::Quality,-	) -> Result<Release, AnyError> {-		let update_endpoint = get_update_endpoint()?;-		let download_segment = target-			.download_segment(platform)-			.ok_or_else(|| CodeError::UnsupportedPlatform(platform.to_string()))?;+	pub fn get_download_url(&self, release: &Release) -> Result<String, AnyError> {+		let app_name = get_app_name()?;+		let download_endpoint = get_download_endpoint()?;+ 		let download_url = format!(-			"{}/api/latest/{}/{}",-			update_endpoint,-			download_segment,-			quality_download_segment(quality),+			"{}/download/{}/{}-reh-web-{}-{}-{}.tar.gz",+			download_endpoint,+			release.name,+			app_name,+			release.platform.os(),+			release.platform.arch(),+			release.name, 		); -		let mut response = spanf!(-			self.log,-			self.log.span("server.version.resolve"),-			self.client.make_request("GET", download_url)-		)?;--		if !response.status_code.is_success() {-			return Err(response.into_err().await.into());-		}--		let res = response.json::<UpdateServerVersion>().await?;-		debug!(self.log, "Resolved quality {} to {}", quality, res.version);--		Ok(Release {-			target,-			platform,-			quality,-			name: res.name,-			commit: res.version,-		})+		Ok(download_url) 	}@@ -150,15 +132,3 @@ impl UpdateService { 	pub async fn get_download_stream(&self, release: &Release) -> Result<SimpleResponse, AnyError> {-		let update_endpoint = get_update_endpoint()?;-		let download_segment = release-			.target-			.download_segment(release.platform)-			.ok_or_else(|| CodeError::UnsupportedPlatform(release.platform.to_string()))?;--		let download_url = format!(-			"{}/commit:{}/{}/{}",-			update_endpoint,-			release.commit,-			download_segment,-			quality_download_segment(release.quality),-		);+		let download_url = self.get_download_url(release)?; @@ -196,13 +166,2 @@ pub enum TargetKind { -impl TargetKind {-	fn download_segment(&self, platform: Platform) -> Option<String> {-		match *self {-			TargetKind::Server => Some(platform.headless()),-			TargetKind::Archive => platform.archive(),-			TargetKind::Web => Some(platform.web()),-			TargetKind::Cli => Some(platform.cli()),-		}-	}-}- #[derive(Debug, Copy, Clone, Eq, PartialEq, Serialize, Deserialize)]@@ -225,30 +184,17 @@ pub enum Platform { impl Platform {-	pub fn archive(&self) -> Option<String> {-		match self {-			Platform::LinuxX64 => Some("linux-x64".to_owned()),-			Platform::LinuxARM64 => Some("linux-arm64".to_owned()),-			Platform::LinuxARM32 => Some("linux-armhf".to_owned()),-			Platform::DarwinX64 => Some("darwin".to_owned()),-			Platform::DarwinARM64 => Some("darwin-arm64".to_owned()),-			Platform::WindowsX64 => Some("win32-x64-archive".to_owned()),-			Platform::WindowsX86 => Some("win32-archive".to_owned()),-			Platform::WindowsARM64 => Some("win32-arm64-archive".to_owned()),-			_ => None,-		}-	}-	pub fn headless(&self) -> String {+	pub fn arch(&self) -> String { 		match self {-			Platform::LinuxAlpineARM64 => "server-alpine-arm64",-			Platform::LinuxAlpineX64 => "server-linux-alpine",-			Platform::LinuxX64 => "server-linux-x64",-			Platform::LinuxX64Legacy => "server-linux-legacy-x64",-			Platform::LinuxARM64 => "server-linux-arm64",-			Platform::LinuxARM64Legacy => "server-linux-legacy-arm64",-			Platform::LinuxARM32 => "server-linux-armhf",-			Platform::LinuxARM32Legacy => "server-linux-legacy-armhf",-			Platform::DarwinX64 => "server-darwin",-			Platform::DarwinARM64 => "server-darwin-arm64",-			Platform::WindowsX64 => "server-win32-x64",-			Platform::WindowsX86 => "server-win32",-			Platform::WindowsARM64 => "server-win32-arm64",+			Platform::LinuxAlpineARM64 => "arm64",+			Platform::LinuxAlpineX64 => "x64",+			Platform::LinuxX64 => "x64",+			Platform::LinuxX64Legacy => "x64",+			Platform::LinuxARM64 => "arm64",+			Platform::LinuxARM64Legacy => "arm64",+			Platform::LinuxARM32 => "armhf",+			Platform::LinuxARM32Legacy => "armhf",+			Platform::DarwinX64 => "x64",+			Platform::DarwinARM64 => "arm64",+			Platform::WindowsX64 => "x64",+			Platform::WindowsX86 => "ia42",+			Platform::WindowsARM64 => "arm64", 		}@@ -257,17 +203,17 @@ impl Platform { -	pub fn cli(&self) -> String {+	pub fn os(&self) -> String { 		match self {-			Platform::LinuxAlpineARM64 => "cli-alpine-arm64",-			Platform::LinuxAlpineX64 => "cli-alpine-x64",-			Platform::LinuxX64 => "cli-linux-x64",-			Platform::LinuxX64Legacy => "cli-linux-x64",-			Platform::LinuxARM64 => "cli-linux-arm64",-			Platform::LinuxARM64Legacy => "cli-linux-arm64",-			Platform::LinuxARM32 => "cli-linux-armhf",-			Platform::LinuxARM32Legacy => "cli-linux-armhf",-			Platform::DarwinX64 => "cli-darwin-x64",-			Platform::DarwinARM64 => "cli-darwin-arm64",-			Platform::WindowsARM64 => "cli-win32-arm64",-			Platform::WindowsX64 => "cli-win32-x64",-			Platform::WindowsX86 => "cli-win32",+			Platform::LinuxAlpineARM64 => "alpine",+			Platform::LinuxAlpineX64 => "alpine",+			Platform::LinuxX64 => "linux",+			Platform::LinuxX64Legacy => "linux",+			Platform::LinuxARM64 => "linux",+			Platform::LinuxARM64Legacy => "linux",+			Platform::LinuxARM32 => "linux",+			Platform::LinuxARM32Legacy => "linux",+			Platform::DarwinX64 => "darwin",+			Platform::DarwinARM64 => "darwin",+			Platform::WindowsX64 => "win32",+			Platform::WindowsX86 => "win32",+			Platform::WindowsARM64 => "win32", 		}@@ -276,6 +222,2 @@ impl Platform { -	pub fn web(&self) -> String {-		format!("{}-web", self.headless())-	}- 	pub fn env_default() -> Option<Platform> {
 |