UNPKG

@ribajs/core

Version:

Core module of Riba.js

160 lines 12.2 kB
import { EventDispatcher } from "@ribajs/events"; import { CoreService } from "./core.service.js"; export class LifecycleService { events = EventDispatcher.getInstance("lifecycle"); debug = false; routerEvents = EventDispatcher.getInstance(); timeout = null; allBound = false; static instance; components = {}; constructor() { this.addEventListeners(); this.reset(); LifecycleService.instance = this; } static getInstance() { if (LifecycleService.instance) { return LifecycleService.instance; } LifecycleService.instance = new LifecycleService(); return LifecycleService.instance; } getEmpty() { return { components: [], }; } addEventListeners() { this.events.on("Component:connected", (data) => { if (data.options.ignore) { return; } this.resetTimeout(); this.components[data.tagName] = this.components[data.tagName] || this.getEmpty(); this.components[data.tagName].components.push(data.component); }); this.events.on("Component:disconnected", (data) => { if (data.options.ignore) { return; } this.resetTimeout(); this.checkStates(); }); this.events.on("Component:afterBind", (data) => { if (data.options.ignore) { return; } this.resetTimeout(); this.checkStates(); }); this.events.on("Component:error", (error, data) => { this.onError(error, data); }); this.routerEvents.on("newPageReady", (viewId, newStatus, oldStatus, container, containerHtml, dataset, firstPageLoad) => { if (this.debug) console.debug("newPageReady", viewId, newStatus, oldStatus, "firstPageLoad", firstPageLoad); if (!firstPageLoad) { this.reset(); } }); } getState(tagName) { let connected = 0; let bound = 0; for (const component of this.components[tagName].components) { if (component.connected) { connected++; if (component.bound) { bound++; } } } return { connected, bound, }; } getStates() { const states = {}; for (const tagName in this.components) { const state = this.getState(tagName); states[tagName] = { state, components: this.components[tagName].components, }; } return states; } checkStates() { let allBound = true; const states = this.getStates(); for (const tagName in states) { const state = states[tagName].state; if (state.connected !== state.bound) { allBound = false; break; } } if (allBound && !this.allBound) { this.onAllBound(); } this.allBound = allBound; return { states, allBound, }; } onAllBound() { this.clearTimeout(); this.events.trigger("ComponentLifecycle:allBound", this.components); if (this.debug) console.debug("[ComponentLifecycle] All components bound!"); } onError(error, data) { this.clearTimeout(); console.error(`The component "${data.tagName}" has caused an error:`, error); this.events.trigger("ComponentLifecycle:error", error, data); } onTimeout() { this.clearTimeout(); const states = this.getStates(); let errorMessage = "[ComponentLifecycle] Timeout! {count} component(s) takes too long!\nUnfinished components:\n"; let count = 0; for (const tagName in states) { const state = states[tagName].state; if (state.connected !== state.bound) { count++; errorMessage += `${tagName}: connected: ${states[tagName].state.connected}, bound: ${states[tagName].state.bound}\n`; } } if (count <= 0) { console.warn("No component found"); this.events.trigger("ComponentLifecycle:noComponents"); return; } errorMessage = errorMessage.replace("{count}", count.toString()); this.events.trigger("ComponentLifecycle:error", new Error(errorMessage), {}); } clearTimeout() { if (this.timeout) { window.clearTimeout(this.timeout); } } resetTimeout() { if (this.debug) console.debug("[ComponentLifecycle] reset timeout.."); this.clearTimeout(); this.timeout = window.setTimeout(this.onTimeout.bind(this), CoreService.options.lifecycle?.timeout || 5000); return this.timeout; } reset() { if (this.debug) console.debug("[ComponentLifecycle] reset!"); this.allBound = false; this.components = {}; this.resetTimeout(); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmZWN5Y2xlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvbGlmZWN5Y2xlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQVloRCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ3BCLE1BQU0sR0FBRyxlQUFlLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQy9DLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDZCxZQUFZLEdBQUcsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzdDLE9BQU8sR0FBa0IsSUFBSSxDQUFDO0lBQzlCLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDakIsTUFBTSxDQUFDLFFBQVEsQ0FBbUI7SUFFbEMsVUFBVSxHQUVoQixFQUFFLENBQUM7SUFFUDtRQUNFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNiLGdCQUFnQixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDbkMsQ0FBQztJQUVNLE1BQU0sQ0FBQyxXQUFXO1FBQ3ZCLElBQUksZ0JBQWdCLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDOUIsT0FBTyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7UUFDbkMsQ0FBQztRQUNELGdCQUFnQixDQUFDLFFBQVEsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDbkQsT0FBTyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7SUFDbkMsQ0FBQztJQUVTLFFBQVE7UUFDaEIsT0FBTztZQUNMLFVBQVUsRUFBRSxFQUFFO1NBQ2YsQ0FBQztJQUNKLENBQUM7SUFFUyxpQkFBaUI7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQ1oscUJBQXFCLEVB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