Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
// place files you want to import through the `$lib` alias in this folder. | |
import { majorAirportIATAs } from '$lib/icao'; | |
interface ClientInfo { | |
clientIp: string; | |
clientLocation: string; | |
} | |
export async function getClientInfo(): Promise<ClientInfo> { | |
let clientIp = 'Detecting...'; | |
let clientLocation = 'Detecting...'; | |
const res = await fetch('https://ipapi.co/json/'); | |
clientIp = 'Not available'; | |
clientLocation = 'Not available'; | |
if (res.ok) { | |
const data = await res.json(); | |
clientIp = data.ip || 'Unknown'; | |
let location = ''; | |
if (data.city) location += data.city + ', '; | |
if (data.region) location += data.region + ', '; | |
if (data.country_name) location += data.country_name; | |
clientLocation = location || 'Unknown'; | |
} | |
return new Promise((resolve) => | |
resolve({ | |
clientIp, | |
clientLocation | |
}) | |
); | |
} | |
export async function sendAnalyticsData(bytesPerSecond: number, latency: number, location: string, progress: number) { | |
// send measurements to analytics API | |
const measurements = { | |
bandwidth: bytesPerSecond, | |
latency, | |
location, | |
progress | |
}; | |
console.log('Sending analytics data'); | |
return new Promise((resolve) => { | |
fetch('/analytics', { | |
method: 'POST', | |
headers: { | |
'Content-Type': 'application/json' | |
}, | |
body: JSON.stringify(measurements) | |
}) | |
.then((response) => { | |
if (!response.ok) { | |
throw new Error(`Network response was not ok: ${response.status}`); | |
} | |
resolve(response); | |
}) | |
.catch((error) => { | |
console.error('Error sending bandwidth data:', error); | |
resolve(null); | |
}); | |
}); | |
} | |
export async function getServerLocation(url: string): Promise<string> { | |
// Get server location | |
const response = await fetch(url, { method: 'HEAD' }); | |
let cdnPop = response.headers.get('x-amz-cf-pop'); | |
if (cdnPop !== null) { | |
cdnPop = cdnPop.toUpperCase().slice(0, 3); | |
// try to map to IATA | |
if (cdnPop in majorAirportIATAs) { | |
cdnPop = majorAirportIATAs[cdnPop].city + ', ' + majorAirportIATAs[cdnPop].country; | |
} else { | |
cdnPop = 'Unknown'; | |
} | |
} else { | |
cdnPop = 'Unknown'; | |
} | |
return cdnPop; | |
} |