export class Api {
constructor(baseUrl, token) {
this.baseUrl = baseUrl.replace(/\/+$/, "");
this.token = token || "";
}
headers() {
const h = { "Content-Type": "application/json" };
if (this.token) h["Authorization"] = "Bearer " + this.token;
return h;
}
async rpc(cmd) {
let res;
try {
res = await fetch(this.baseUrl + "/api/rpc", {
method: "POST",
headers: this.headers(),
body: JSON.stringify(cmd),
});
} catch (e) {
return { ok: false, error: e && e.message ? e.message : "falha de rede" };
}
if (!res.ok) {
return { ok: false, error: "HTTP " + res.status };
}
let decoded;
try {
decoded = await res.json();
} catch {
return { ok: false, error: "resposta inválida do daemon" };
}
return { ok: true, value: decoded };
}
async rpcChecked(cmd) {
const r = await this.rpc(cmd);
if (!r.ok) return r;
const v = r.value;
if (v && typeof v === "object" && v.Err) {
return { ok: false, error: v.Err.message || v.Err.code || "erro" };
}
return r;
}
async uploadArchive(serviceId, file) {
let res;
try {
const h = { "Content-Type": "application/zip" };
if (this.token) h["Authorization"] = "Bearer " + this.token;
h["X-Rustploy-Filename"] = file.name || "archive.zip";
res = await fetch(`${this.baseUrl}/api/services/${serviceId}/archive`, {
method: "POST",
headers: h,
body: file,
});
} catch (e) {
return { ok: false, error: e && e.message ? e.message : "falha de rede" };
}
if (!res.ok) {
return { ok: false, error: "HTTP " + res.status };
}
let decoded;
try {
decoded = await res.json();
} catch {
return { ok: false, error: "resposta inválida do daemon" };
}
if (decoded && typeof decoded === "object" && decoded.Err) {
return { ok: false, error: decoded.Err.message || decoded.Err.code || "erro" };
}
return { ok: true, value: decoded };
}
}