chat-ui / src /lib /utils /PublicConfig.svelte.ts
coyotte508
A new start
fc69895
import type { env as publicEnv } from "$env/dynamic/public";
import { page } from "$app/state";
import { base } from "$app/paths";
import type { Transporter } from "@sveltejs/kit";
import { getContext } from "svelte";
type PublicConfigKey = keyof typeof publicEnv;
class PublicConfigManager {
#configStore = $state<Record<PublicConfigKey, string>>({});
constructor(initialConfig?: Record<PublicConfigKey, string>) {
this.init = this.init.bind(this);
this.getPublicConfig = this.getPublicConfig.bind(this);
if (initialConfig) {
this.init(initialConfig);
}
}
init(publicConfig: Record<PublicConfigKey, string>) {
this.#configStore = publicConfig;
}
get(key: PublicConfigKey) {
return this.#configStore[key];
}
getPublicConfig() {
return this.#configStore;
}
get isHuggingChat() {
return this.#configStore.PUBLIC_APP_ASSETS === "huggingchat";
}
get assetPath() {
return (
(this.#configStore.PUBLIC_ORIGIN || page.url.origin) +
base +
"/" +
this.#configStore.PUBLIC_APP_ASSETS
);
}
}
type ConfigProxy = PublicConfigManager & { [K in PublicConfigKey]: string };
export function getConfigManager(initialConfig?: Record<PublicConfigKey, string>) {
const publicConfigManager = new PublicConfigManager(initialConfig);
const publicConfig: ConfigProxy = new Proxy(publicConfigManager, {
get(target, prop) {
if (prop in target) {
return Reflect.get(target, prop);
}
if (typeof prop === "string") {
return target.get(prop as PublicConfigKey);
}
return undefined;
},
set(target, prop, value, receiver) {
if (prop in target) {
return Reflect.set(target, prop, value, receiver);
}
return false;
},
}) as ConfigProxy;
return publicConfig;
}
export const publicConfigTransporter: Transporter = {
encode: (value) =>
value instanceof PublicConfigManager ? JSON.stringify(value.getPublicConfig()) : false,
decode: (value) => getConfigManager(JSON.parse(value)),
};
export const usePublicConfig = () => getContext<ConfigProxy>("publicConfig");