@geogirafe/lib-geoportal
Version:
GeoGirafe is a flexible application to build online geoportals.
99 lines (98 loc) • 4.17 kB
JavaScript
import proj4 from 'proj4';
import { register } from 'ol/proj/proj4';
import ConfigManager from './tools/configuration/configmanager';
import OfflineManager from './tools/offline/offlinemanager';
import ShareManager from './tools/share/sharemanager';
import StateManager from './tools/state/statemanager';
import ThemesManager from './tools/themes/themesmanager';
import LogManager from './tools/logging/logmanager';
import AuthManager from './tools/auth/authmanager';
import ErrorManager from './tools/error/errormanager';
import CsvManager from './tools/export/csvmanager';
import I18nManager from './tools/i18n/i18nmanager';
import WfsManager from './tools/wfs/wfsmanager';
import OrderingManager from './tools/ordering/orderingmanager';
import PluginManager from './tools/auth/pluginmanager';
async function waitForServiceWorkerActivation() {
const registration = await navigator.serviceWorker.register('service-worker.js');
if (registration.active) {
return registration.active;
}
const sw = registration.installing || registration.waiting;
if (!sw) {
throw new Error('No service worker is installing or waiting.');
}
return new Promise((resolve) => {
sw.addEventListener('statechange', function onStateChange() {
if (sw.state === 'activated') {
sw.removeEventListener('statechange', onStateChange);
resolve(sw);
}
});
});
}
async function initializeServiceWorker() {
const storeVersion = 6;
const dbCacheName = 'geogirafe-cache';
if (!navigator?.serviceWorker) {
console.warn("Service worker could not be initialized. Authentication and offline maps won't work");
return;
}
let sw;
try {
sw = await waitForServiceWorkerActivation();
}
catch {
console.warn("Service worker could not be initialized. Authentication and offline maps won't work");
return;
}
// Communicate logging configuration to service-worker
const config = ConfigManager.getInstance().Config;
sw.postMessage({ logLevel: config.general.logLevel });
// Communicate oauth configuration to service-worker
const issuerConfig = config.oauth?.issuer ?? config.gmfauth;
const gmfConfig = config.oauth?.geomapfish ?? config.gmfauth;
if (issuerConfig && gmfConfig) {
const issuerHostname = new URL(issuerConfig.url).hostname;
const audience = [...issuerConfig.audience, issuerHostname];
sw.postMessage({
audience: audience,
audienceExcludedPaths: issuerConfig.audienceExcludedPaths,
authMode: gmfConfig.authMode,
refererPolicy: gmfConfig.refererPolicy
});
}
await OfflineManager.getInstance().setServiceWorker(sw, storeVersion, dbCacheName);
await AuthManager.getInstance().initialize(sw);
}
export async function initialize() {
// First of all : Load the configuration
await ConfigManager.getInstance().loadConfig();
await LogManager.getInstance().initLogging();
// Default configuration for Cesium (see https://cesium.com/learn/cesiumjs-learn/cesiumjs-quickstart/)
window.CESIUM_BASE_URL = 'lib/cesium/';
// Register Coordinate Reference Systems (CRS) definitions in PROJ4
ConfigManager.getInstance().Config.crs.forEach((x) => {
proj4.defs(x.code, x.definition);
});
register(proj4);
// Register Service Worker
await initializeServiceWorker();
// Initialize the managers
ErrorManager.getInstance();
CsvManager.getInstance();
I18nManager.getInstance();
WfsManager.getInstance();
OrderingManager.getInstance();
PluginManager.getInstance();
await ThemesManager.getInstance().initialize();
// Add the state to document, so that it will be accessible everywhere
document.geogirafe = {
state: StateManager.getInstance().state,
stateManager: StateManager.getInstance(),
shareManager: ShareManager.getInstance(),
offlineManager: OfflineManager.getInstance(),
themesManager: ThemesManager.getInstance(),
configManager: ConfigManager.getInstance()
};
}