Files
2026-09-05 16:20:23 +08:00

51 lines
1.9 KiB
JavaScript

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
}
}