Spaces:
Running
Running
| 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"); | |