sls/resources/js/metered.js

55 lines
1.6 KiB
JavaScript

/**
* Metered TURN Server Integration
*/
let globalIceServers = [
{ urls: 'stun:stun.l.google.com:19302' }
];
let meteredIceFetchPromise = null;
/**
* Fetch ICE servers from /ice-servers endpoint and merge with default STUN server.
* Handles network errors gracefully with fallback.
*
* @returns {Promise<Array>} Resolves with the array of ICE server objects.
*/
export function getMeteredIceServers() {
if (meteredIceFetchPromise) return meteredIceFetchPromise;
meteredIceFetchPromise = fetch('/ice-servers', {
headers: {
'Accept': 'application/json',
'X-Requested-With': 'XMLHttpRequest'
}
})
.then(response => {
if (!response.ok) {
throw new Error(`Failed to fetch ICE servers: HTTP status ${response.status}`);
}
return response.json();
})
.then(meteredIce => {
if (Array.isArray(meteredIce) && meteredIce.length > 0) {
globalIceServers = [
{ urls: 'stun:stun.l.google.com:19302' },
...meteredIce.slice(0, 3)
];
}
window.globalIceServers = globalIceServers;
return globalIceServers;
})
.catch(e => {
console.warn('Metered TURN fetch warning:', e);
window.globalIceServers = globalIceServers;
return globalIceServers;
});
return meteredIceFetchPromise;
}
export function initMeteredIceServers() {
return getMeteredIceServers();
}
export { globalIceServers };