113 lines
3.0 KiB
TypeScript
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;
|
|
}
|
|
}
|