feat: allow kgone-server.json to override the kgone server base url and soundfont base url

This commit is contained in:
Xiaohan-Tian
2026-04-17 16:32:55 -07:00
parent 206fa6fdf9
commit 71dc7d99e7
3 changed files with 48 additions and 10 deletions
+11 -7
View File
@@ -60,15 +60,19 @@ function App() {
// Initialize ConfigManager first to load config.json and user settings
await ConfigManager.instance().initialize();
// Check for kgone-server.txt (managed deployment override)
// Check for kgone-server.json (managed deployment override)
try {
const kgoneServerResponse = await fetch(`${import.meta.env.BASE_URL}kgone-server.txt`);
const kgoneServerResponse = await fetch(`${import.meta.env.BASE_URL}kgone-server.json?ts=${Date.now()}`);
const contentType = kgoneServerResponse.headers.get('Content-Type') ?? '';
if (kgoneServerResponse.ok && contentType.includes('text/plain')) {
const url = (await kgoneServerResponse.text()).trim();
if (url) {
ConfigManager.instance().setKGOneManagedByServer(url);
console.log('K.G.One: server-managed config loaded from kgone-server.txt, base URL:', url);
if (kgoneServerResponse.ok && contentType.includes('application/json')) {
const data = await kgoneServerResponse.json();
if (data.base_url) {
ConfigManager.instance().setKGOneManagedByServer(data.base_url);
console.log('K.G.One: server-managed config loaded from kgone-server.json, base URL:', data.base_url);
}
if (data.soundfont) {
ConfigManager.instance().setSoundfontManagedByServer(data.soundfont);
console.log('Soundfont: server-managed config loaded from kgone-server.json, base URL:', data.soundfont);
}
}
} catch {
@@ -21,6 +21,7 @@ const GeneralSettings: React.FC = () => {
const [kgoneEnabled, setKgoneEnabled] = useState<boolean>(false);
const [kgoneBaseUrl, setKgoneBaseUrl] = useState<string>('');
const [kgoneServerManaged, setKgoneServerManaged] = useState<boolean>(false);
const [soundfontServerManaged, setSoundfontServerManaged] = useState<boolean>(false);
const configManager = ConfigManager.instance();
@@ -64,6 +65,7 @@ const GeneralSettings: React.FC = () => {
setKgoneEnabled((configManager.get('general.kgone.enabled') as boolean) ?? false);
setKgoneBaseUrl((configManager.get('general.kgone.base_url') as string) || '');
setKgoneServerManaged(configManager.isKGOneServerManaged());
setSoundfontServerManaged(configManager.isSoundfontServerManaged());
};
loadConfig();
@@ -472,6 +474,12 @@ const GeneralSettings: React.FC = () => {
<div className="settings-group">
<h4>Soundfont Settings</h4>
{soundfontServerManaged && (
<div className="settings-help" style={{ fontSize: '12px', color: '#888', marginTop: '4px', marginBottom: '8px' }}>
Soundfont configuration is managed by the server (kgone-server.json). Settings are read-only.
</div>
)}
<div className="settings-item">
<label className="settings-label">
Base URL
@@ -482,9 +490,20 @@ const GeneralSettings: React.FC = () => {
placeholder="e.g. https://cdn.jsdelivr.net/npm/soundfont-for-samplers/FluidR3_GM/"
value={soundfontBaseUrl}
onChange={(e) => handleSoundfontBaseUrlChange(e.target.value)}
disabled={soundfontServerManaged}
/>
<div className="settings-help" style={{ fontSize: '12px', color: '#888', marginTop: '4px' }}>
Changing this URL to an incompatible soundfont source may cause some instruments to sound wrong or not play.
Changing this URL to an incompatible soundfont source may cause some instruments to sound wrong or not play.{' '}
<a
href="#"
onClick={(e) => {
e.preventDefault();
handleSoundfontBaseUrlChange('https://cdn.jsdelivr.net/npm/soundfont-for-samplers/FluidR3_GM/');
}}
style={{ color: '#646cff', textDecoration: 'underline', cursor: 'pointer' }}
>
Restore default
</a>
</div>
</div>
</div>
@@ -494,7 +513,7 @@ const GeneralSettings: React.FC = () => {
{kgoneServerManaged && (
<div className="settings-help" style={{ fontSize: '12px', color: '#888', marginTop: '4px', marginBottom: '8px' }}>
K.G.One configuration is managed by the server (kgone-server.txt). Settings are read-only.
K.G.One configuration is managed by the server (kgone-server.json). Settings are read-only.
</div>
)}
+16 -1
View File
@@ -105,6 +105,7 @@ export class ConfigManager {
private storage: KGConfigStorage;
private isInitialized: boolean = false;
private kgoneServerManaged: boolean = false;
private soundfontServerManaged: boolean = false;
private defaultConfig: AppConfig | null = null;
private changeListeners: Set<(changedKeys: string[]) => void> = new Set();
@@ -558,7 +559,7 @@ export class ConfigManager {
}
/**
* Called at startup when kgone-server.txt is found.
* Called at startup when kgone-server.json contains a base_url field.
* Forces enabled=true and overrides base_url in-memory only (not persisted).
*/
public setKGOneManagedByServer(url: string): void {
@@ -572,6 +573,20 @@ export class ConfigManager {
return this.kgoneServerManaged;
}
/**
* Called at startup when kgone-server.json contains a soundfont field.
* Overrides general.soundfont.base_url in-memory only (not persisted).
*/
public setSoundfontManagedByServer(url: string): void {
this.soundfontServerManaged = true;
this.setInObject(this.config as Record<string, unknown>, 'general.soundfont.base_url', url);
this.notifyChangeListeners(['general.soundfont.base_url']);
}
public isSoundfontServerManaged(): boolean {
return this.soundfontServerManaged;
}
/**
* Get the default configuration
*/