1
0
mirror of https://github.com/checktheroads/hyperglass synced 2024-05-11 05:55:08 +00:00
Files
checktheroads-hyperglass/hyperglass/ui/util/config.ts
2024-02-27 17:44:19 -05:00

66 lines
1.8 KiB
TypeScript

import type { QueryFunctionContext } from '@tanstack/react-query';
import { isObject } from '~/types';
import type { Config } from '~/types';
export class ConfigLoadError extends Error {
public url: string = '/ui/props/';
public detail?: string;
public baseMessage: string;
constructor(detail?: string) {
super();
this.detail = detail;
this.baseMessage = 'Unable to connect to hyperglass at';
this.message = `${this.baseMessage} '${this.url}'`;
console.error(this);
}
public toString(): string {
if (typeof this.detail !== 'undefined') {
return `${this.message} (${this.detail})`;
}
return this.message;
}
}
export async function getHyperglassConfig(url?: QueryFunctionContext | string): Promise<Config> {
let mode: RequestInit['mode'];
let fetchUrl = '/ui/props/';
if (typeof url === 'string') {
fetchUrl = `${url.replace(/(^\/)|(\/$)/g, '')}/ui/props`;
}
if (process.env.NODE_ENV === 'production') {
mode = 'same-origin';
} else if (process.env.NODE_ENV === 'development') {
mode = 'cors';
}
const options: RequestInit = { method: 'GET', mode, headers: { 'user-agent': 'hyperglass-ui' } };
try {
const response = await fetch(fetchUrl, options);
const data = await response.json();
if (!response.ok) {
throw response;
}
if (isObject(data)) {
return data as Config;
}
} catch (error) {
if (error instanceof TypeError) {
throw new ConfigLoadError('Network Connection Error');
}
if (error instanceof Response) {
throw new ConfigLoadError(`${error.status}: ${error.statusText}`);
}
if (error instanceof Error) {
throw new ConfigLoadError();
}
throw new ConfigLoadError(String(error));
}
throw new ConfigLoadError('Unknown Error');
}