703 lines
12 KiB
JavaScript
703 lines
12 KiB
JavaScript
|
|
/*
|
||
|
|
|
||
|
|
Copyright (c) 2020, 2023, The Unified Company.
|
||
|
|
|
||
|
|
This code is part of Unify.
|
||
|
|
|
||
|
|
This program is free software; you can redistribute it and/or modify
|
||
|
|
it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE,
|
||
|
|
as published by the Free Software Foundation.
|
||
|
|
See the GNU AFFERO GENERAL PUBLIC LICENSE, for more details.
|
||
|
|
|
||
|
|
https://unifyjs.org
|
||
|
|
|
||
|
|
*/
|
||
|
|
|
||
|
|
import core from './core.js';
|
||
|
|
|
||
|
|
import dom from './dom.js';
|
||
|
|
|
||
|
|
import css from './css.js';
|
||
|
|
|
||
|
|
import eventManager from './eventManager.js';
|
||
|
|
|
||
|
|
import socketManager from './socketManager.js';
|
||
|
|
|
||
|
|
import animationManager from './animation/animationManager.js';
|
||
|
|
|
||
|
|
import collection from './collection.js';
|
||
|
|
|
||
|
|
import codePreview from './codePreview.js';
|
||
|
|
|
||
|
|
import themeLoader from './themeLoader.js';
|
||
|
|
|
||
|
|
import tools from '../unify/tools.js';
|
||
|
|
|
||
|
|
import defaultObject from '../unify/defaultObject.js';
|
||
|
|
|
||
|
|
//import cookieManager from '../unify/cookieManager.js';
|
||
|
|
|
||
|
|
import cacheManager from "../unify/cacheManager.js";
|
||
|
|
|
||
|
|
import config from "../configs/config.js";
|
||
|
|
|
||
|
|
import applicationImport from './import.js';
|
||
|
|
|
||
|
|
import progressBar from './progressBar.js';
|
||
|
|
|
||
|
|
import applications from '../configs/applications.js';
|
||
|
|
|
||
|
|
import simplePath from "../unify/simplePath.js";
|
||
|
|
|
||
|
|
|
||
|
|
// For Benchmarking
|
||
|
|
//document.timer.lap("before");
|
||
|
|
//document.timer.lap("after");
|
||
|
|
|
||
|
|
|
||
|
|
document.promises = new Array();
|
||
|
|
|
||
|
|
document.cacheManager = new cacheManager();
|
||
|
|
|
||
|
|
document.cacheManager.useDB = false;
|
||
|
|
|
||
|
|
document.debugALL = false;
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
export default class applicationManager{
|
||
|
|
|
||
|
|
socketPort = 5002;
|
||
|
|
|
||
|
|
defaultSocketPort = 5002;
|
||
|
|
|
||
|
|
loadEditor = true;
|
||
|
|
|
||
|
|
defaultObject = new defaultObject();
|
||
|
|
|
||
|
|
themeLoader = new themeLoader();
|
||
|
|
|
||
|
|
mode = "development";
|
||
|
|
|
||
|
|
serverAddress = "localhost";
|
||
|
|
|
||
|
|
serverPort = 8090;
|
||
|
|
|
||
|
|
application;
|
||
|
|
|
||
|
|
applications;
|
||
|
|
|
||
|
|
applicationInstances = new Array();
|
||
|
|
|
||
|
|
ssl = false;
|
||
|
|
|
||
|
|
themeObjects = new Array();
|
||
|
|
|
||
|
|
connectPromise;
|
||
|
|
|
||
|
|
signinPromise;
|
||
|
|
|
||
|
|
constructor() {
|
||
|
|
|
||
|
|
this.themeLoader.applicationManager = this;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
setParameters( config ) {
|
||
|
|
|
||
|
|
this.mode = config.mode;
|
||
|
|
|
||
|
|
this.ssl = config.ssl;
|
||
|
|
|
||
|
|
this.socketPort = config.socketPort;
|
||
|
|
|
||
|
|
this.loadThemes = config.loadThemes;
|
||
|
|
|
||
|
|
this.os = tools.CamelCase( config.os );
|
||
|
|
|
||
|
|
this.tint = tools.CamelCase( config.tint );
|
||
|
|
|
||
|
|
this.device = tools.CamelCase( config.device );
|
||
|
|
|
||
|
|
if( config.serverAddress ) {
|
||
|
|
|
||
|
|
this.serverAddress = config.serverAddress;
|
||
|
|
|
||
|
|
} else {
|
||
|
|
|
||
|
|
this.serverAddress = "localhost";
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
if( config.port ) {
|
||
|
|
|
||
|
|
this.port = config.port;
|
||
|
|
|
||
|
|
} else {
|
||
|
|
|
||
|
|
this.port = 3000;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
setGlobal() {
|
||
|
|
|
||
|
|
document.mode = this.mode;
|
||
|
|
|
||
|
|
document.config = new Object();
|
||
|
|
|
||
|
|
document.config.os = this.os;
|
||
|
|
|
||
|
|
document.config.tint = this.tint;
|
||
|
|
|
||
|
|
document.config.device = this.device;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
logConfig( config ) {
|
||
|
|
|
||
|
|
console.log( config );
|
||
|
|
|
||
|
|
console.log("set socket port", this.socketPort );
|
||
|
|
|
||
|
|
console.log( "running in ", config.mode, " mode.", "address : " + this.serverAddress );
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
parseConfig() {
|
||
|
|
|
||
|
|
this.setParameters( config );
|
||
|
|
|
||
|
|
this.setGlobal();
|
||
|
|
|
||
|
|
this.logConfig( config );
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
createApplicationPath( path ) {
|
||
|
|
|
||
|
|
var device = tools.CamelCase( this.device );
|
||
|
|
|
||
|
|
var os = tools.CamelCase( this.os );
|
||
|
|
|
||
|
|
var tint = tools.CamelCase( this.tint );
|
||
|
|
|
||
|
|
var applicationPath = '/framework/cache/platforms/' + os + '/' + device + '/' + tint + '/' + path + '/application.js';
|
||
|
|
|
||
|
|
return applicationPath;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
async getApplicationInstance( path, applicationID ) {
|
||
|
|
|
||
|
|
if( this.mode == "development" ) {
|
||
|
|
|
||
|
|
var applicationPath = this.createApplicationPath( path );
|
||
|
|
|
||
|
|
var importObject = await import( applicationPath );
|
||
|
|
|
||
|
|
this.application = new importObject.default();
|
||
|
|
|
||
|
|
} else {
|
||
|
|
|
||
|
|
var currentBundle = applicationImport[ applicationID ];
|
||
|
|
|
||
|
|
//console.log("loading application with id", applicationID);
|
||
|
|
|
||
|
|
if( currentBundle ) {
|
||
|
|
|
||
|
|
this.application = new currentBundle();
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
return this.application;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
getUserObject( core, application, username, sessionKey ) {
|
||
|
|
|
||
|
|
if( !username ) {
|
||
|
|
|
||
|
|
var userObject = core.getFirstByClassName( "signin", application );
|
||
|
|
|
||
|
|
} else {
|
||
|
|
|
||
|
|
var userObject = core.getFirstByClassName( "signin", application );
|
||
|
|
|
||
|
|
|
||
|
|
if( !userObject ){
|
||
|
|
|
||
|
|
return false;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
if( sessionKey ) {
|
||
|
|
|
||
|
|
userObject.sessionKey.value = sessionKey;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
return userObject;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
async singinUser( core, socketManager, userObject ) {
|
||
|
|
|
||
|
|
//var user = await socketManager.get( "settings", "signIn", userObject );
|
||
|
|
|
||
|
|
var user = await userObject.process();
|
||
|
|
//await userObject.socketManager.get( "table", "process", userObject );
|
||
|
|
|
||
|
|
//var user = await userObject.process();
|
||
|
|
|
||
|
|
core.user = user;
|
||
|
|
|
||
|
|
await core.setUser( user, application );
|
||
|
|
|
||
|
|
console.log( "update user permissions", user );
|
||
|
|
|
||
|
|
if( !user.permissionObjects ) {
|
||
|
|
|
||
|
|
return false;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
core.updatePermissions( user.permissionObjects );
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
configurePath() {
|
||
|
|
|
||
|
|
this.url = window.location;
|
||
|
|
|
||
|
|
this.pathName = this.url.pathname;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
parseUrlByID( core, tableName, id ) {
|
||
|
|
|
||
|
|
var objects = core.getObjectsByPropertyName( tableName );
|
||
|
|
|
||
|
|
if( objects.length > 0 ) {
|
||
|
|
|
||
|
|
var object = objects[0];
|
||
|
|
|
||
|
|
if( object.parent.create ) {
|
||
|
|
|
||
|
|
object.parent.create();
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
object.id = parseFloat( id );
|
||
|
|
|
||
|
|
if( object.loadPage ) {
|
||
|
|
|
||
|
|
object.loadPage();
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
object.showParents();
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
async parseUrl( core, application ) {
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
this.configurePath();
|
||
|
|
|
||
|
|
var pathName = this.pathName;
|
||
|
|
|
||
|
|
var pathParts = pathName.split("/");
|
||
|
|
|
||
|
|
pathParts.shift();
|
||
|
|
|
||
|
|
var tableName = pathParts[0];
|
||
|
|
|
||
|
|
var id = pathParts[1];
|
||
|
|
|
||
|
|
if( id ) {
|
||
|
|
|
||
|
|
this.parseUrlByID( core, tableName, id );
|
||
|
|
|
||
|
|
} else {
|
||
|
|
|
||
|
|
document.stateMachine.composeState()
|
||
|
|
|
||
|
|
core.runDefault( application );
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
createBaseUrl() {
|
||
|
|
|
||
|
|
var base = document.createElement("base");
|
||
|
|
|
||
|
|
if( this.ssl ) {
|
||
|
|
|
||
|
|
base.href = "https://" + this.serverAddress;
|
||
|
|
|
||
|
|
} else {
|
||
|
|
|
||
|
|
base.href = "http://" + this.serverAddress + ":" + this.port;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
document.head.appendChild( base );
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
createMetaDescription() {
|
||
|
|
|
||
|
|
if( this.application.description ) {
|
||
|
|
|
||
|
|
document.querySelector(".metaDescription").setAttribute("content", this.application.description );
|
||
|
|
|
||
|
|
} else {
|
||
|
|
|
||
|
|
document.querySelector(".metaDescription").setAttribute("content", "A unifyJS application." );
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
async initializeSocketManager( core, application ) {
|
||
|
|
|
||
|
|
var socket = new socketManager( this.socketPort );
|
||
|
|
|
||
|
|
socket.ssl = this.ssl;
|
||
|
|
|
||
|
|
socket.serverAddress = this.serverAddress;
|
||
|
|
|
||
|
|
this.connectPromise = socket.connect();
|
||
|
|
|
||
|
|
|
||
|
|
document.connectPromise = this.connectPromise;
|
||
|
|
|
||
|
|
await this.connectPromise;
|
||
|
|
|
||
|
|
socket.addClient();
|
||
|
|
|
||
|
|
|
||
|
|
return socket;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
async createApplicationInstances() {
|
||
|
|
|
||
|
|
for( var applicationID = 0; applicationID < this.applications.length; applicationID++ ) {
|
||
|
|
|
||
|
|
var applicationFile = this.applications[ applicationID ];
|
||
|
|
|
||
|
|
this.applicationInstances[ applicationID ] = await this.getApplicationInstance( applicationFile.path, applicationID );
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
bindApplications() {
|
||
|
|
|
||
|
|
this.applications = applications;
|
||
|
|
|
||
|
|
document.applications = applications;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
getApplication() {
|
||
|
|
|
||
|
|
var applicationFile = this.applications[ 0 ];
|
||
|
|
|
||
|
|
applicationFile.socket = socket;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
async start() {
|
||
|
|
|
||
|
|
var unifyCore = new core();
|
||
|
|
|
||
|
|
this.parseConfig();
|
||
|
|
|
||
|
|
this.bindApplications();
|
||
|
|
|
||
|
|
this.createBaseUrl();
|
||
|
|
|
||
|
|
await this.createApplicationInstances();
|
||
|
|
|
||
|
|
var socket = this.initializeSocketManager( unifyCore, this.applicationInstances[0] );
|
||
|
|
|
||
|
|
await this.runApplication( socket, 0, unifyCore );
|
||
|
|
|
||
|
|
this.createMetaDescription();
|
||
|
|
|
||
|
|
document.timer.lap("Everything is loaded");
|
||
|
|
|
||
|
|
console.log( this.applicationInstances[0] );
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
async updateApplications() {
|
||
|
|
|
||
|
|
for( var applicationID = 1; applicationID < this.applications.length; applicationID++) {
|
||
|
|
|
||
|
|
var applicationFile = this.applications[ applicationID ];
|
||
|
|
|
||
|
|
var unifyCore = new core();
|
||
|
|
|
||
|
|
this.runApplication( applicationFile.socket, applicationID, unifyCore );
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
async attachSocket( applicationFile, socket, applicationID ) {
|
||
|
|
|
||
|
|
if( !applicationFile.socket ) {
|
||
|
|
|
||
|
|
applicationFile.socket = await new socketManager( this.defaultSocketPort + applicationID );
|
||
|
|
|
||
|
|
if( this.serverAddress ) {
|
||
|
|
|
||
|
|
applicationFile.socket.serverAddress = this.serverAddress;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
await applicationFile.socket.connect();
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
return applicationFile.socket;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
preventDoubleLoading( element ) {
|
||
|
|
|
||
|
|
if( element && element.childElementCount != 0 ) {
|
||
|
|
|
||
|
|
return true;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
createCodeEditor( app, applicationID ) {
|
||
|
|
|
||
|
|
if( applicationID != 0 ) {
|
||
|
|
|
||
|
|
new codePreview( app );
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
getDomElement( application ) {
|
||
|
|
|
||
|
|
if( this.applications.length == 1) {
|
||
|
|
|
||
|
|
application.selector = "#application";
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
var element = document.querySelector( application.selector );
|
||
|
|
|
||
|
|
if( document.querySelectorAll( application.selector ).length == 0 ) {
|
||
|
|
|
||
|
|
return true;
|
||
|
|
|
||
|
|
} else {
|
||
|
|
|
||
|
|
if( this.preventDoubleLoading( element ) ) {
|
||
|
|
|
||
|
|
return true;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
return false;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
configureCore( core ) {
|
||
|
|
|
||
|
|
core.device = this.device;
|
||
|
|
|
||
|
|
core.os = this.os;
|
||
|
|
|
||
|
|
core.tint = this.tint;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
setGlobalCore( unifyCore, applicationID ) {
|
||
|
|
|
||
|
|
if( !document.cores ) {
|
||
|
|
|
||
|
|
document.cores = new Array();
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
document.cores[ applicationID ] = unifyCore;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
async parseApplication( core, application, applicationID ) {
|
||
|
|
|
||
|
|
this.defaultObject.agregateDefaultObject( application );
|
||
|
|
|
||
|
|
this.setGlobalCore( core, applicationID );
|
||
|
|
|
||
|
|
await core.prepareObjects( application );
|
||
|
|
|
||
|
|
await document.connectPromise;
|
||
|
|
|
||
|
|
this.configureCore( core );
|
||
|
|
|
||
|
|
core.setTheme();
|
||
|
|
|
||
|
|
application.core = core;
|
||
|
|
|
||
|
|
await core.parse( application, true );
|
||
|
|
|
||
|
|
core.createDependencyMap();
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
hidePreloader() {
|
||
|
|
|
||
|
|
if( document.querySelector(".loadingBarPanel, .preloader, #preloader" )) {
|
||
|
|
|
||
|
|
document.querySelector(".loadingBarPanel, .preloader, #preloader").style.opacity = "0%";
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
setTimeout(function(){
|
||
|
|
|
||
|
|
document.querySelector(".loadingBarPanel, .preloader, #preloader").style.display = "none";
|
||
|
|
|
||
|
|
}, 1000)
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
logApplication( application, unifyCore ) {
|
||
|
|
|
||
|
|
if( document.debugALL ) {
|
||
|
|
|
||
|
|
console.log( "" );
|
||
|
|
console.log( "run application", application.selector );
|
||
|
|
|
||
|
|
console.log( "Core", unifyCore );
|
||
|
|
console.log( "Application", application );
|
||
|
|
console.log( "" );
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
setServerPort( port ) {
|
||
|
|
|
||
|
|
if( application.port ) {
|
||
|
|
|
||
|
|
this.serverPort = application.port;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
prepareApplication(applicationID) {
|
||
|
|
|
||
|
|
var application = this.applicationInstances[ applicationID ];
|
||
|
|
|
||
|
|
application.applicationID = applicationID;
|
||
|
|
|
||
|
|
this.setServerPort( application.port );
|
||
|
|
|
||
|
|
return application;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
bindObjectsToSocket( socket, application, unifyCore, applicationID ) {
|
||
|
|
|
||
|
|
if( applicationID == 0 ) {
|
||
|
|
|
||
|
|
socket.application = application;
|
||
|
|
|
||
|
|
socket.core = unifyCore;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
async runApplication( socket = false, applicationID, unifyCore ) {
|
||
|
|
|
||
|
|
if ( this.applicationInstances[ applicationID ] ) {
|
||
|
|
|
||
|
|
var application = this.prepareApplication( applicationID );
|
||
|
|
|
||
|
|
this.bindObjectsToSocket( socket, application, unifyCore, applicationID );
|
||
|
|
|
||
|
|
if( this.getDomElement( application ) ) {
|
||
|
|
|
||
|
|
return true;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
unifyCore.socketManager = await socket;
|
||
|
|
|
||
|
|
this.hidePreloader();
|
||
|
|
|
||
|
|
this.createCodeEditor( application, applicationID );
|
||
|
|
|
||
|
|
await this.parseApplication( unifyCore, application, applicationID );
|
||
|
|
|
||
|
|
//this.signinPromise = this.checkSignIn( socket, unifyCore, application );
|
||
|
|
//console.log("after signin");
|
||
|
|
|
||
|
|
if( applicationID == 0 ) {
|
||
|
|
|
||
|
|
//this.parseUrl( unifyCore, application );
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
//await Promise.all( document.promises );
|
||
|
|
|
||
|
|
await unifyCore.callAfterLoad( application );
|
||
|
|
|
||
|
|
this.logApplication( application, unifyCore );
|
||
|
|
|
||
|
|
if( this.loadThemes ) {
|
||
|
|
|
||
|
|
await this.themeLoader.loadThemes( application, applicationID, unifyCore );
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
this.setGlobals();
|
||
|
|
|
||
|
|
await unifyCore.callAfterThemeLoad( application );
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
return true;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
setGlobals() {
|
||
|
|
|
||
|
|
document.timer.initialising = false;
|
||
|
|
|
||
|
|
document.themeObjects = this.themeObjects;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|