aktueller stand

This commit is contained in:
2025-12-29 19:51:45 +01:00
parent f4323e20de
commit 41ef5107aa
9 changed files with 438 additions and 98 deletions

View File

@@ -0,0 +1,80 @@
const foodsharingClient = require('./foodsharingClient');
const sessionStore = require('./sessionStore');
function isUnauthorizedError(error) {
const status = error?.response?.status;
return status === 401 || status === 403;
}
async function refreshSession(session, { label } = {}) {
if (!session?.credentials?.email || !session?.credentials?.password) {
console.warn(
`[SESSION] Session ${session?.id || 'unbekannt'} kann nicht erneuert werden keine Zugangsdaten gespeichert.`
);
return false;
}
try {
const refreshed = await foodsharingClient.login(
session.credentials.email,
session.credentials.password
);
sessionStore.update(session.id, {
cookieHeader: refreshed.cookieHeader,
csrfToken: refreshed.csrfToken,
profile: {
...session.profile,
...refreshed.profile
}
});
console.log(
`[SESSION] Session ${session.id} wurde erfolgreich erneuert${label ? ` (${label})` : ''}.`
);
return true;
} catch (error) {
console.error(
`[SESSION] Session ${session?.id || 'unbekannt'} konnte nicht erneuert werden${label ? ` (${label})` : ''}:`,
error.message
);
return false;
}
}
async function ensureSession(session) {
if (!session?.profile?.id) {
return false;
}
if (!session.cookieHeader) {
return refreshSession(session, { label: 'missing-cookie' });
}
return true;
}
async function withSessionRetry(session, action, { label } = {}) {
if (!session) {
throw new Error('Session fehlt');
}
if (!session.cookieHeader && session.credentials) {
const refreshed = await refreshSession(session, { label });
if (!refreshed) {
throw new Error('Session konnte nicht erneuert werden');
}
}
try {
return await action();
} catch (error) {
if (!isUnauthorizedError(error)) {
throw error;
}
const refreshed = await refreshSession(session, { label });
if (!refreshed) {
throw error;
}
return action();
}
}
module.exports = {
ensureSession,
refreshSession,
withSessionRetry
};