@ribajs/core
Version:
Core module of Riba.js
160 lines • 12.2 kB
JavaScript
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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