import { DataLayerManager } from '../data/manager.js'; /** Register the application layer catalog before allowing state restoration. */ export function createApplicationData({ scene: { viewer }, controls: { styleManager }, catalog, allowQaRegistration, onData, defer, }) { // Initialize data layer manager const dataManager = new DataLayerManager(viewer, { allowQaRegistration, }); defer(async () => { await dataManager.destroyAll(); if (dataManager.layers.size) throw new Error( `Data layers could not be destroyed: ${[...dataManager.layers.keys()].join(', ')}`, ); }); onData?.(dataManager); if (!catalog?.layers || !catalog?.metadata) throw new TypeError('An application layer catalog is required'); for (const layer of catalog.layers) dataManager.register(layer); for (const layer of catalog.layers) layer.attachDataManager?.(dataManager); // Restoration starts only after the caller's complete registry is sealed. dataManager.finalizeRegistrations(catalog.metadata); if (allowQaRegistration) { window.__gevQaRegisterLayer = (targetManager, layerModule) => { if (targetManager !== dataManager) throw new Error('QA layer manager mismatch'); return dataManager.registerForQa(layerModule); }; window.__gevQaUnregisterLayer = (targetManager, layerId) => { if (targetManager !== dataManager) throw new Error('QA layer manager mismatch'); return dataManager.unregisterForQa(layerId); }; const register = window.__gevQaRegisterLayer; const unregister = window.__gevQaUnregisterLayer; defer(() => { if (window.__gevQaRegisterLayer === register) delete window.__gevQaRegisterLayer; if (window.__gevQaUnregisterLayer === unregister) delete window.__gevQaUnregisterLayer; }); } dataManager.buildTogglePanel(document.getElementById('data-toggles')); styleManager.attachDataManager(dataManager); return { dataManager, catalog }; }