ihm_client/src/services/storage.service.ts

113 lines
3.0 KiB
TypeScript

export async function storeData(
servers: string[],
key: string,
value: Blob,
ttl: number | null
): Promise<Response | null> {
for (const server of servers) {
try {
// 1. Vérification d'existence (GET)
const dataExists = await testData(server, key);
if (dataExists) {
console.log("Data already stored:", key);
continue;
} else {
console.log(
"Data not stored for server, proceeding to POST:",
key,
server
);
}
// 2. Construction URL
let url: string;
if (server.startsWith("/")) {
url = `${server}/store/${encodeURIComponent(key)}`;
if (ttl !== null) url += `?ttl=${ttl}`;
} else {
const urlObj = new URL(`${server}/store/${encodeURIComponent(key)}`);
if (ttl !== null) urlObj.searchParams.append("ttl", ttl.toString());
url = urlObj.toString();
}
// 3. Envoi (POST) avec Fetch
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/octet-stream",
},
body: value,
});
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;
}
} catch (error) {
console.error("Error storing data:", error);
}
}
return null;
}
export async function retrieveData(
servers: string[],
key: string
): Promise<ArrayBuffer | null> {
for (const server of servers) {
try {
const url = server.startsWith("/")
? `${server}/retrieve/${key}`
: 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 {
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) {
console.error(`Unexpected error retrieving data from ${server}:`, error);
continue;
}
}
return null;
}
export async function testData(server: string, key: string): Promise<boolean> {
try {
const testUrl = server.startsWith("/")
? `${server}/test/${encodeURIComponent(key)}`
: new URL(`${server}/test/${encodeURIComponent(key)}`).toString();
// On utilise fetch ici aussi
const response = await fetch(testUrl, { method: "GET" });
// 200 OK = existe
return response.status === 200;
} catch (error) {
// Erreur réseau
console.error("Error testing data:", error);
return false;
}
}