From 355d5ea18dde9a28df83b7acc2912fa91249669e Mon Sep 17 00:00:00 2001 From: NicolasCantu Date: Tue, 2 Dec 2025 00:53:53 +0100 Subject: [PATCH] refactor(storage.service): replace axios with fetch for data storage and retrieval, improve error handling, and enhance code clarity --- package.json | 1 - src/services/storage.service.ts | 155 ++++++++++++++------------------ 2 files changed, 66 insertions(+), 90 deletions(-) diff --git a/package.json b/package.json index 63836a6..2f5332a 100755 --- a/package.json +++ b/package.json @@ -28,7 +28,6 @@ "vite-plugin-static-copy": "^1.0.6" }, "dependencies": { - "axios": "^1.7.8", "comlink": "^4.4.2", "jose": "^6.0.11", "vite-plugin-wasm": "^3.3.0" diff --git a/src/services/storage.service.ts b/src/services/storage.service.ts index 7ac1774..50b8d58 100644 --- a/src/services/storage.service.ts +++ b/src/services/storage.service.ts @@ -1,135 +1,112 @@ -import axios, { AxiosResponse } from 'axios'; - -export async function storeData(servers: string[], key: string, value: Blob, ttl: number | null): Promise { +export async function storeData( + servers: string[], + key: string, + value: Blob, + ttl: number | null +): Promise { for (const server of servers) { try { - // 1. On vérifie d'abord si la donnée existe en appelant le bon service - // On passe 'server' au lieu de 'url' pour que testData construise la bonne URL + // 1. Vérification d'existence (GET) const dataExists = await testData(server, key); - + if (dataExists) { - console.log('Data already stored:', key); + console.log("Data already stored:", key); continue; } else { - console.log('Data not stored for server, proceeding to POST:', key, server); + console.log( + "Data not stored for server, proceeding to POST:", + key, + server + ); } - - // Construction de l'URL pour le POST (stockage) - // Cette partie était correcte + // 2. Construction URL let url: string; - if (server.startsWith('/')) { - // Relative path + if (server.startsWith("/")) { url = `${server}/store/${encodeURIComponent(key)}`; - if (ttl !== null) { - url += `?ttl=${ttl}`; - } + if (ttl !== null) url += `?ttl=${ttl}`; } else { - // Absolute URL const urlObj = new URL(`${server}/store/${encodeURIComponent(key)}`); - if (ttl !== null) { - urlObj.searchParams.append('ttl', ttl.toString()); - } + if (ttl !== null) urlObj.searchParams.append("ttl", ttl.toString()); url = urlObj.toString(); } - // La ligne ci-dessous a été supprimée car le test est fait au-dessus - // const testResponse = await testData(url, key); // <-- LIGNE BOGUÉE SUPPRIMÉE - - // Send the encrypted data as the raw request body. - const response = await axios.post(url, value, { // Note: c'est bien un POST sur 'url' + // 3. Envoi (POST) avec Fetch + const response = await fetch(url, { + method: "POST", headers: { - 'Content-Type': 'application/octet-stream' + "Content-Type": "application/octet-stream", }, + body: value, }); - console.log('Data stored successfully:', key); - if (response.status !== 200) { - console.error('Received response status', response.status); + + if (response.ok) { + // Status 200-299 + console.log("Data stored successfully:", key); + return response; + } else if (response.status === 409) { + // Conflit (déjà existant), on retourne null comme avant + return null; + } else { + console.error("Received response status", response.status); continue; } - return response; } catch (error) { - if (axios.isAxiosError(error) && error.response?.status === 409) { - return null; // 409 Conflict (Key already exists) - } - console.error('Error storing data:', error); + console.error("Error storing data:", error); } } return null; } -// Fonction retrieveData (inchangée, elle était correcte) -export async function retrieveData(servers: string[], key: string): Promise { +export async function retrieveData( + servers: string[], + key: string +): Promise { for (const server of servers) { try { - const url = server.startsWith('/') + const url = server.startsWith("/") ? `${server}/retrieve/${key}` - : new URL(`${server}/retrieve/${key}`).toString(); - - console.log('Retrieving data', key,' from:', url); - - const response = await axios.get(url, { - responseType: 'arraybuffer' - }); - - if (response.status === 200) { - if (response.data instanceof ArrayBuffer) { - return response.data; - } else { - console.error('Server returned non-ArrayBuffer data:', typeof response.data); - continue; - } + : new URL(`${server}/retrieve/${key}`).toString(); + + console.log("Retrieving data", key, " from:", url); + + const response = await fetch(url, { method: "GET" }); + + if (response.ok) { + // Transformation en ArrayBuffer + return await response.arrayBuffer(); } else { - console.error(`Server ${server} returned status ${response.status}`); + if (response.status === 404) { + console.log(`Data not found on server ${server} for key ${key}`); + } else { + console.error( + `Server ${server} returned status ${response.status}: ${response.statusText}` + ); + } continue; } } catch (error) { - if (axios.isAxiosError(error)) { - if (error.response?.status === 404) { - // C'est normal si la donnée n'existe pas - console.log(`Data not found on server ${server} for key ${key}`); - continue; - } else if (error.response?.status) { - console.error(`Server ${server} error ${error.response.status}:`, error.response.statusText); - continue; - } else { - console.error(`Network error connecting to ${server}:`, error.message); - continue; - } - } else { - console.error(`Unexpected error retrieving data from ${server}:`, error); - continue; - } + console.error(`Unexpected error retrieving data from ${server}:`, error); + continue; } } return null; } -interface TestResponse { - key: string; - value: boolean; -} - -// Elle prend 'server' au lieu de 'url' et construit sa propre URL '/test/...' export async function testData(server: string, key: string): Promise { try { - // Construit l'URL /test/... - const testUrl = server.startsWith('/') + const testUrl = server.startsWith("/") ? `${server}/test/${encodeURIComponent(key)}` : new URL(`${server}/test/${encodeURIComponent(key)}`).toString(); - const response = await axios.get(testUrl); // Fait un GET sur /test/... - - // 200 OK = la donnée existe - return response.status === 200; + // On utilise fetch ici aussi + const response = await fetch(testUrl, { method: "GET" }); + // 200 OK = existe + return response.status === 200; } catch (error) { - if (axios.isAxiosError(error) && error.response?.status === 404) { - // 404 Not Found = la donnée n'existe pas. C'est une réponse valide. - return false; - } - // Toute autre erreur (serveur offline, 500, etc.) - console.error('Error testing data:', error); - return false; // On considère que le test a échoué + // Erreur réseau + console.error("Error testing data:", error); + return false; } -} \ No newline at end of file +}