Files
vendoo/public/core/api-client.js
T
Masterluke77andGitHub 6f48827f4d Vendoo 1.41.2 – Git Ignore Boundary & Module Tracking Hotfix (#18)
* docs: prepare Vendoo 1.41.2 git-ignore boundary hotfix

* fix: track native source modules with root-anchored runtime ignores
2026-07-09 17:09:00 +02:00

41 lines
1.6 KiB
JavaScript

export class VendooApiError extends Error {
constructor(message, { status = 0, code = 'API_ERROR', requestId = null, details = null } = {}) {
super(message);
this.name = 'VendooApiError';
this.status = status;
this.code = code;
this.requestId = requestId;
this.details = details;
}
}
function readCookie(name) {
const prefix = `${encodeURIComponent(name)}=`;
return document.cookie.split(';').map(value => value.trim()).find(value => value.startsWith(prefix))?.slice(prefix.length) || '';
}
export async function apiRequest(path, { method = 'GET', body, headers = {}, signal } = {}) {
const verb = String(method).toUpperCase();
const requestHeaders = new Headers(headers);
requestHeaders.set('Accept', 'application/json');
if (body !== undefined) requestHeaders.set('Content-Type', 'application/json');
if (!['GET', 'HEAD', 'OPTIONS'].includes(verb)) requestHeaders.set('X-CSRF-Token', decodeURIComponent(readCookie('csrf_token')));
const response = await fetch(path, {
method: verb,
credentials: 'same-origin',
headers: requestHeaders,
body: body === undefined ? undefined : JSON.stringify(body),
signal,
redirect: 'error',
});
const requestId = response.headers.get('x-vendoo-request-id');
const payload = await response.json().catch(() => ({}));
if (!response.ok) throw new VendooApiError(payload.error || `HTTP ${response.status}`, {
status: response.status,
code: payload.code || 'API_ERROR',
requestId: payload.request_id || requestId,
details: payload.details || null,
});
return payload;
}