From 1e61c492f97a145338af7c563d4217e50be4c7fb Mon Sep 17 00:00:00 2001 From: Andrejs Date: Thu, 11 Jul 2024 08:41:57 +0300 Subject: [PATCH] feat(tarui-app): detect platform when downloading ipfs --- src-tauri/src/ipfs.rs | 50 +++++++++++++++++-- src-tauri/tauri.conf.json | 2 +- src/contexts/backend/backend.tsx | 3 +- src/features/ipfs/ipfsSettings/index.tsx | 11 ++-- src/services/ipfs/config.ts | 4 ++ .../ipfs/node/mixins/withCybFeatures.ts | 2 - src/services/ipfs/types.ts | 1 - 7 files changed, 56 insertions(+), 17 deletions(-) diff --git a/src-tauri/src/ipfs.rs b/src-tauri/src/ipfs.rs index f05079765..51c868a46 100644 --- a/src-tauri/src/ipfs.rs +++ b/src-tauri/src/ipfs.rs @@ -2,6 +2,24 @@ use std::fs::{self, File}; use std::io::copy; use std::process::Command; +fn get_ipfs_download_url() -> Result<&'static str, String> { + if cfg!(target_os = "windows") { + Ok("https://dist.ipfs.io/kubo/v0.29.0/kubo_v0.29.0_windows-amd64.zip") + } else if cfg!(target_os = "macos") { + if cfg!(target_arch = "x86_64") { + Ok("https://dist.ipfs.io/kubo/v0.29.0/kubo_v0.29.0_darwin-amd64.tar.gz") + } else if cfg!(target_arch = "aarch64") { + Ok("https://dist.ipfs.io/kubo/v0.29.0/kubo_v0.29.0_darwin-arm64.tar.gz") + } else { + Err("Unsupported macOS architecture".into()) + } + } else if cfg!(target_os = "linux") { + Ok("https://dist.ipfs.io/kubo/v0.29.0/kubo_v0.29.0_linux-amd64.tar.gz") + } else { + Err("Unsupported operating system".into()) + } +} + #[tauri::command] pub async fn download_and_extract_ipfs() -> Result<(), String> { let home_dir = dirs::home_dir().ok_or("Cannot find home directory")?; @@ -12,7 +30,7 @@ pub async fn download_and_extract_ipfs() -> Result<(), String> { fs::create_dir_all(&cyb_dir).map_err(|e| e.to_string())?; } - let url = "https://dist.ipfs.io/kubo/v0.29.0/kubo_v0.29.0_darwin-arm64.tar.gz"; // Adjust based on OS + let url = get_ipfs_download_url()?; let response = reqwest::get(url).await.map_err(|e| e.to_string())?; let tar_path = cyb_dir.join("kubo-ipfs-binary.tar.gz"); @@ -45,12 +63,38 @@ pub fn start_ipfs() -> Result<(), String> { let cyb_dir = home_dir.join(".cyb"); let ipfs_binary = cyb_dir.join("kubo/ipfs"); // Adjust based on the extracted path - Command::new(ipfs_binary) + Command::new(&ipfs_binary) .arg("daemon") .spawn() .map_err(|e| e.to_string())?; - Ok(()) + // Configure IPFS to allow all origins + let config_output1 = Command::new(&ipfs_binary) + .arg("config") + .arg("--json") + .arg("API.HTTPHeaders.Access-Control-Allow-Origin") + .arg(r#"["*"]"#) + .output() + .map_err(|e| e.to_string())?; + + if !config_output1.status.success() { + return Err(String::from_utf8_lossy(&config_output1.stderr).into()); + } + + // Configure IPFS to allow specific HTTP methods + let config_output2 = Command::new(&ipfs_binary) + .arg("config") + .arg("--json") + .arg("API.HTTPHeaders.Access-Control-Allow-Methods") + .arg(r#"["PUT", "POST", "GET"]"#) + .output() + .map_err(|e| e.to_string())?; + + if config_output2.status.success() { + Ok(()) + } else { + Err(String::from_utf8_lossy(&config_output2.stderr).into()) + } } #[tauri::command] diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 25685dca5..e60cb61ab 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -8,7 +8,7 @@ }, "package": { "productName": "cyb", - "version": "0.1.2" + "version": "0.1.3" }, "tauri": { "allowlist": { diff --git a/src/contexts/backend/backend.tsx b/src/contexts/backend/backend.tsx index b46af3f88..35d6c6bb0 100644 --- a/src/contexts/backend/backend.tsx +++ b/src/contexts/backend/backend.tsx @@ -5,6 +5,7 @@ import React, { useMemo, useState, } from 'react'; +import { invoke } from '@tauri-apps/api/tauri'; import { useAppDispatch, useAppSelector } from 'src/redux/hooks'; import { proxy, Remote } from 'comlink'; import { backgroundWorkerInstance } from 'src/services/backend/workers/background/service'; @@ -23,9 +24,7 @@ import { DB_NAME } from 'src/services/CozoDb/cozoDb'; import { RESET_SYNC_STATE_ACTION_NAME } from 'src/redux/reducers/backend'; import BroadcastChannelSender from 'src/services/backend/channels/BroadcastChannelSender'; // import BroadcastChannelListener from 'src/services/backend/channels/BroadcastChannelListener'; - import { SenseApi, createSenseApi } from './services/senseApi'; -import { invoke } from '@tauri-apps/api/tauri'; const setupStoragePersistence = async () => { let isPersistedStorage = await navigator.storage.persisted(); diff --git a/src/features/ipfs/ipfsSettings/index.tsx b/src/features/ipfs/ipfsSettings/index.tsx index 4afcc1341..fab460c22 100644 --- a/src/features/ipfs/ipfsSettings/index.tsx +++ b/src/features/ipfs/ipfsSettings/index.tsx @@ -1,15 +1,12 @@ import { useCallback, useEffect, useState } from 'react'; -import { - Input, - Button, - Display, - DisplayTitle, -} from 'src/components'; +import { Input, Button, Display, DisplayTitle } from 'src/components'; import { Pane } from '@cybercongress/gravity'; import { useAdviser } from 'src/features/adviser/context'; import Select from 'src/containers/warp/components/Select'; +import { useBackend } from 'src/contexts/backend/backend'; import { AdviserColors } from 'src/features/adviser/Adviser/Adviser'; +import { IPFSNodes } from 'src/services/ipfs/types'; import BtnPassport from '../../../containers/portal/pasport/btnPasport'; import { updateIpfsStateUrl, @@ -22,8 +19,6 @@ import InfoIpfsNode from './ipfsComponents/infoIpfsNode'; import ErrorIpfsSettings from './ErrorIpfsSettings'; import ComponentLoader from './ipfsComponents/ipfsLoader'; import Drive from '../Drive'; -import { useBackend } from 'src/contexts/backend/backend'; -import { IPFSNodes } from 'src/services/ipfs/types'; const dataOpts = [IPFSNodes.EXTERNAL, IPFSNodes.EMBEDDED, IPFSNodes.HELIA]; diff --git a/src/services/ipfs/config.ts b/src/services/ipfs/config.ts index 86aa605f7..1e2f15ef4 100644 --- a/src/services/ipfs/config.ts +++ b/src/services/ipfs/config.ts @@ -26,6 +26,10 @@ export const getIpfsOpts = () => { ipfsOpts = { ...ipfsOpts, ...lsTypeIpfsData }; } + if (window?.__TAURI__) { + ipfsOpts.ipfsNodeType = IPFSNodes.EXTERNAL; + } + localStorage.setItem('ipfsState', JSON.stringify(ipfsOpts)); return ipfsOpts as IpfsOptsType; diff --git a/src/services/ipfs/node/mixins/withCybFeatures.ts b/src/services/ipfs/node/mixins/withCybFeatures.ts index bec4bbbc9..1045c1d61 100644 --- a/src/services/ipfs/node/mixins/withCybFeatures.ts +++ b/src/services/ipfs/node/mixins/withCybFeatures.ts @@ -28,8 +28,6 @@ function withCybFeatures IpfsNode>( } async isConnectedToSwarm() { - console.log('--------isConnectedToSwarm--------', Base); - return !!(await super.getPeers()).find( (peerId) => peerId === options.swarmPeerId ); diff --git a/src/services/ipfs/types.ts b/src/services/ipfs/types.ts index 220df2be1..bdb179e14 100644 --- a/src/services/ipfs/types.ts +++ b/src/services/ipfs/types.ts @@ -7,7 +7,6 @@ export enum IPFSNodes { EXTERNAL = 'external', EMBEDDED = 'embedded', HELIA = 'helia', - TAURI = 'tauri', } export type IpfsNodeType = 'embedded' | 'external' | 'helia';