import { mkdir, readFile, writeFile } from 'node:fs/promises' import { homedir, platform } from 'node:os' import { dirname, join } from 'node:path' function configPath() { if (process.env.SPINE_CONNECTOR_CONFIG) return process.env.SPINE_CONNECTOR_CONFIG if (platform() === 'darwin') return join(homedir(), 'Library/Application Support/SpineParticleConnector/config.json') if (platform() === 'win32') return join(process.env.APPDATA || homedir(), 'SpineParticleConnector/config.json') return join(process.env.XDG_CONFIG_HOME || join(homedir(), '.config'), 'spine-particle-connector/config.json') } const localOrigins = new Set([ 'http://127.0.0.1:5173', 'http://localhost:5173', 'http://127.0.0.1:4173', 'http://localhost:4173', ]) export async function loadConfig() { try { const parsed = JSON.parse(await readFile(configPath(), 'utf8')) return { allowedOrigins: Array.isArray(parsed.allowedOrigins) ? parsed.allowedOrigins.filter((item) => typeof item === 'string') : [] } } catch { return { allowedOrigins: [] } } } export async function allowOrigin(origin) { const config = await loadConfig() if (!config.allowedOrigins.includes(origin)) config.allowedOrigins.push(origin) const path = configPath() await mkdir(dirname(path), { recursive: true }) await writeFile(path, `${JSON.stringify(config, null, 2)}\n`, 'utf8') } export async function originAllowed(origin) { if (!origin) return true if (localOrigins.has(origin)) return true if (String(process.env.SPINE_CONNECTOR_ORIGINS || '').split(',').map((item) => item.trim()).includes(origin)) return true return (await loadConfig()).allowedOrigins.includes(origin) } export function validWebOrigin(value) { try { const url = new URL(value) return (url.protocol === 'http:' || url.protocol === 'https:') && url.origin === value ? url.origin : null } catch { return null } }