aktueller stand
This commit is contained in:
80
services/sessionRefresh.js
Normal file
80
services/sessionRefresh.js
Normal 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
|
||||
};
|
||||
Reference in New Issue
Block a user