diff --git a/src/services/service.ts b/src/services/service.ts index d9188a5..d04b5e4 100755 --- a/src/services/service.ts +++ b/src/services/service.ts @@ -1076,7 +1076,7 @@ export default class Services { } } - public async fetchValueFromStorage(hash: string): Promise { + public async fetchValueFromStorage(hash: string): Promise { const storages = [STORAGEURL]; return await retrieveData(storages, hash); diff --git a/src/services/storage.service.ts b/src/services/storage.service.ts index 47ee776..4e71ffa 100644 --- a/src/services/storage.service.ts +++ b/src/services/storage.service.ts @@ -3,15 +3,26 @@ import axios, { AxiosResponse } from 'axios'; export async function storeData(servers: string[], key: string, value: Blob, ttl: number | null): Promise { for (const server of servers) { try { - // Append key and ttl as query parameters - const url = new URL(`${server}/store`); - url.searchParams.append('key', key); - if (ttl !== null) { - url.searchParams.append('ttl', ttl.toString()); + // Handle relative paths (for development proxy) vs absolute URLs (for production) + let url: string; + if (server.startsWith('/')) { + // Relative path - construct manually for proxy + url = `${server}/store?key=${encodeURIComponent(key)}`; + if (ttl !== null) { + url += `&ttl=${ttl}`; + } + } else { + // Absolute URL - use URL constructor + const urlObj = new URL(`${server}/store`); + urlObj.searchParams.append('key', key); + if (ttl !== null) { + urlObj.searchParams.append('ttl', ttl.toString()); + } + url = urlObj.toString(); } // Send the encrypted ArrayBuffer as the raw request body. - const response = await axios.post(url.toString(), value, { + const response = await axios.post(url, value, { headers: { 'Content-Type': 'application/octet-stream' }, @@ -35,21 +46,48 @@ export async function storeData(servers: string[], key: string, value: Blob, ttl export async function retrieveData(servers: string[], key: string): Promise { for (const server of servers) { try { + // Handle relative paths (for development proxy) vs absolute URLs (for production) + const url = server.startsWith('/') + ? `${server}/retrieve/${key}` // Relative path - use as-is for proxy + : new URL(`${server}/retrieve/${key}`).toString(); // Absolute URL - construct properly + + console.log('Retrieving data', key,' from:', url); // When fetching the data from the server: - const response = await axios.get(`${server}/retrieve/${key}`, { + const response = await axios.get(url, { responseType: 'arraybuffer' }); - if (response.status !== 200) { - console.error('Received response status', response.status); + + if (response.status === 200) { + // Validate that we received an ArrayBuffer + if (response.data instanceof ArrayBuffer) { + return response.data; + } else { + console.error('Server returned non-ArrayBuffer data:', typeof response.data); continue; + } + } else { + console.error(`Server ${server} returned status ${response.status}`); + continue; } - // console.log('Retrieved data:', response.data); - return response.data; } catch (error) { - console.error('Error retrieving data:', error); + if (axios.isAxiosError(error)) { + if (error.response?.status === 404) { + console.log(`Data not found on server ${server} for key ${key}`); + continue; // Try next server + } 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; + } } } - return null + return null; } interface TestResponse { @@ -62,7 +100,12 @@ export async function testData(servers: string[], key: string): Promise