import {useConfigStore} from '@/stores/config' const API_DEFAULT_PORT = '3456' export const ERROR_NO_API_URL = 'noApiUrlProvided' export const checkAndSetApiUrl = (url: string): Promise => { if(url.startsWith('/')) { url = window.location.host + url } // Check if the url has an http prefix if ( !url.startsWith('http://') && !url.startsWith('https://') ) { url = `http://${url}` } const urlToCheck: URL = new URL(url) const origUrlToCheck = urlToCheck const oldUrl = window.API_URL window.API_URL = urlToCheck.toString() const configStore = useConfigStore() const updateConfig = () => configStore.update() // Check if the api is reachable at the provided url return updateConfig() .catch(e => { // Check if it is reachable at /api/v1 and http if ( !urlToCheck.pathname.endsWith('/api/v1') && !urlToCheck.pathname.endsWith('/api/v1/') ) { urlToCheck.pathname = `${urlToCheck.pathname}api/v1` window.API_URL = urlToCheck.toString() return updateConfig() } throw e }) .catch(e => { // Check if it has a port and if not check if it is reachable at https if (urlToCheck.protocol === 'http:') { urlToCheck.protocol = 'https:' window.API_URL = urlToCheck.toString() return updateConfig() } throw e }) .catch(e => { // Check if it is reachable at /api/v1 and https urlToCheck.pathname = origUrlToCheck.pathname if ( !urlToCheck.pathname.endsWith('/api/v1') && !urlToCheck.pathname.endsWith('/api/v1/') ) { urlToCheck.pathname = `${urlToCheck.pathname}api/v1` window.API_URL = urlToCheck.toString() return updateConfig() } throw e }) .catch(e => { // Check if it is reachable at port API_DEFAULT_PORT and https if (urlToCheck.port !== API_DEFAULT_PORT) { urlToCheck.protocol = 'https:' urlToCheck.port = API_DEFAULT_PORT window.API_URL = urlToCheck.toString() return updateConfig() } throw e }) .catch(e => { // Check if it is reachable at :API_DEFAULT_PORT and /api/v1 and https urlToCheck.pathname = origUrlToCheck.pathname if ( !urlToCheck.pathname.endsWith('/api/v1') && !urlToCheck.pathname.endsWith('/api/v1/') ) { urlToCheck.pathname = `${urlToCheck.pathname}api/v1` window.API_URL = urlToCheck.toString() return updateConfig() } throw e }) .catch(e => { // Check if it is reachable at port API_DEFAULT_PORT and http if (urlToCheck.port !== API_DEFAULT_PORT) { urlToCheck.protocol = 'http:' urlToCheck.port = API_DEFAULT_PORT window.API_URL = urlToCheck.toString() return updateConfig() } throw e }) .catch(e => { // Check if it is reachable at :API_DEFAULT_PORT and /api/v1 and http urlToCheck.pathname = origUrlToCheck.pathname if ( !urlToCheck.pathname.endsWith('/api/v1') && !urlToCheck.pathname.endsWith('/api/v1/') ) { urlToCheck.pathname = `${urlToCheck.pathname}api/v1` window.API_URL = urlToCheck.toString() return updateConfig() } throw e }) .catch(e => { window.API_URL = oldUrl throw e }) .then(success => { if (success) { localStorage.setItem('API_URL', window.API_URL) return window.API_URL } throw new Error(ERROR_NO_API_URL) }) }