Files

37 lines
1.1 KiB
JavaScript

// The live value of every setting, keyed exactly as the declaration keys them.
//
// This is the only thing in the app that reads the UI. A module never does: it
// declares what it needs and is handed values, so the same module works with a
// panel on screen and with no browser at all.
const store = new Map(); // moduleId -> { key: value }
const listeners = new Set();
export function seed(moduleId, defaults) {
store.set(moduleId, { ...defaults });
}
export function set(moduleId, key, value) {
const current = store.get(moduleId) || {};
current[key] = value;
store.set(moduleId, current);
for (const fn of listeners) {
try { fn(moduleId, key, value); } catch { /* a listener must not break the edit */ }
}
}
export const valuesOf = (moduleId) => ({ ...(store.get(moduleId) || {}) });
/** Everything, as it would be sent with a generation request. */
export const all = () => Object.fromEntries([...store].map(([id, v]) => [id, { ...v }]));
export function onChange(fn) {
listeners.add(fn);
return () => listeners.delete(fn);
}
export function _reset() {
store.clear();
listeners.clear();
}