Files
element-call/src/config/Config.ts

89 lines
2.7 KiB
TypeScript
Raw Normal View History

/*
Copyright 2021-2024 New Vector Ltd.
SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE in the repository root for full details.
*/
2024-11-14 12:18:43 +01:00
import { merge } from "lodash-es";
import { getUrlParams } from "../UrlParams";
2022-12-21 15:25:08 +00:00
import {
DEFAULT_CONFIG,
type ConfigOptions,
type ResolvedConfigOptions,
2022-12-21 15:25:08 +00:00
} from "./ConfigOptions";
import { isFailure } from "../utils/fetch";
export class Config {
private static internalInstance: Config | undefined;
public static get(): ResolvedConfigOptions {
if (!this.internalInstance?.config)
throw new Error("Config instance read before config got initialized");
return this.internalInstance.config;
}
public static async init(): Promise<void> {
if (!Config.internalInstance?.initPromise) {
const internalInstance = new Config();
Config.internalInstance = internalInstance;
Config.internalInstance.initPromise = downloadConfig("/config.json").then(
(config) => {
internalInstance.config = merge({}, DEFAULT_CONFIG, config);
},
);
}
return Config.internalInstance.initPromise;
}
/**
* This is a alternative initializer that does not load anything
* from a hosted config file but instead just initializes the config using the
* default config.
*
* It is supposed to only be used in tests. (It is executed in `vite.setup.js`)
*/
public static initDefault(): void {
Config.internalInstance = new Config();
Config.internalInstance.config = { ...DEFAULT_CONFIG };
}
2022-12-20 17:26:45 +00:00
// Convenience accessors
public static defaultHomeserverUrl(): string | undefined {
return (
getUrlParams().homeserver ??
Config.get().default_server_config?.["m.homeserver"].base_url
);
2022-12-20 17:26:45 +00:00
}
public static defaultServerName(): string | undefined {
const homeserver = getUrlParams().homeserver;
if (homeserver) {
const url = new URL(homeserver);
return url.hostname;
}
return Config.get().default_server_config?.["m.homeserver"].server_name;
2022-12-20 17:26:45 +00:00
}
2022-12-21 15:25:08 +00:00
public config?: ResolvedConfigOptions;
private initPromise?: Promise<void>;
}
async function downloadConfig(
2023-10-11 10:42:04 -04:00
configJsonFilename: string,
): Promise<ConfigOptions> {
const url = new URL(configJsonFilename, window.location.href);
const response = await fetch(url);
if (isFailure(response)) {
// Lack of a config isn't an error, we should just use the defaults.
// Also treat a blank config as no config, assuming the status code is 0, because we don't get 404s from file:
// URIs so this is the only way we can not fail if the file doesn't exist when loading from a file:// URI.
2022-12-20 17:26:45 +00:00
return DEFAULT_CONFIG;
}
return response.json();
}