export async function collectGeolocation(session) {
if (!session.consent.analytics || !session.consent.personalization) {
session.geo = {
status: 'Not collected: analytics and personalization consent required',
city: 'Not collected',
country: 'Not collected',
vpnLikely: null,
};
return session.geo;
}
try {
const controller = new AbortController();
const timeout = window.setTimeout(() => controller.abort(), 2500);
const response = await fetch('https://ipwho.is/', {
signal: controller.signal,
referrerPolicy: 'no-referrer',
});
window.clearTimeout(timeout);
if (!response.ok) throw new Error(`Geolocation failed: ${response.status}`);
const data = await response.json();
const timezone = session.device.timezone || '';
const geoTz = data.timezone || '';
const vpnLikely = Boolean(timezone && geoTz && timezone !== geoTz);
session.geo = {
status: 'Collected with consent',
city: data.city || 'Unknown',
region: data.region || 'Unknown',
country: data.country || data.country_code || 'Unknown',
timezone: geoTz || 'Unknown',
org: data.connection?.org || data.connection?.isp || 'Unknown network',
vpnLikely,
};
} catch (error) {
session.geo = {
status: 'Unavailable or blocked',
city: 'Unknown',
country: 'Unknown',
vpnLikely: null,
};
}
return session.geo;
}