From fb190878b21e9e298a1185b9b42f9cbc99fd2277 Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Thu, 6 Mar 2025 03:45:30 +0000 Subject: [PATCH] merge from 0.20 --- .gitignore | 3 +- package.json | 54 +- src/classes/CoresManager/index.js | 112 +++ src/classes/EventBus/EventEmitter.ts | 490 ++++++------ src/classes/EventBus/index.js | 36 +- src/classes/ExtensionsManager/index.js | 66 +- src/classes/SplashScreenManager/index.js | 19 + src/managers/ContextManager.js | 33 + src/managers/CoreManager.js | 30 + src/managers/StateManager.js | 27 + src/runtime.jsx | 736 ++++++------------- src/utils/bindObjects/index.js | 13 + src/utils/observeArrayInsertEmitter/index.js | 11 + src/utils/sortCoresByDependencies/index.js | 22 + 14 files changed, 835 insertions(+), 817 deletions(-) create mode 100644 src/classes/CoresManager/index.js create mode 100644 src/classes/SplashScreenManager/index.js create mode 100644 src/managers/ContextManager.js create mode 100644 src/managers/CoreManager.js create mode 100644 src/managers/StateManager.js create mode 100644 src/utils/bindObjects/index.js create mode 100644 src/utils/observeArrayInsertEmitter/index.js create mode 100644 src/utils/sortCoresByDependencies/index.js diff --git a/.gitignore b/.gitignore index 53fd38b..c646dba 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,5 @@ /**/**/corenode.log # Temporal configurations -/**/**/.aliaser \ No newline at end of file +/**/**/.aliaser +.experimental diff --git a/package.json b/package.json index 2dfe94e..e60df89 100644 --- a/package.json +++ b/package.json @@ -1,31 +1,27 @@ { - "name": "@ragestudio/vessel", - "version": "0.18.1", - "main": "./src/index.js", - "repository": "https://github.com/ragestudio/vessel.git", - "author": "RageStudio", - "license": "MIT", - "files": [ - "src" - ], - "publishConfig": { - "access": "public" - }, - "peerDependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "dependencies": { - "@loadable/component": "^5.16.4", - "@vitejs/plugin-react": "^4.3.3", - "comlink": "^4.4.1", - "history": "^5.3.0", - "less": "^4.2.0", - "million": "^3.1.11", - "object-observer": "^6.0.0", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-helmet": "^6.1.0", - "sucrase": "^3.35.0" - } + "name": "@ragestudio/vessel", + "version": "0.20.0", + "main": "./src/index.js", + "repository": "https://github.com/ragestudio/vessel.git", + "author": "RageStudio", + "license": "MIT", + "files": [ + "src" + ], + "publishConfig": { + "access": "public" + }, + "dependencies": { + "@loadable/component": "^5.16.4", + "@vitejs/plugin-react": "^4.3.3", + "comlink": "^4.4.1", + "history": "^5.3.0", + "less": "^4.2.0", + "million": "^3.1.11", + "object-observer": "^6.0.0", + "react": "18.3.1", + "react-dom": "18.3.1", + "react-helmet": "^6.1.0", + "sucrase": "^3.35.0" + } } diff --git a/src/classes/CoresManager/index.js b/src/classes/CoresManager/index.js new file mode 100644 index 0000000..e80eba7 --- /dev/null +++ b/src/classes/CoresManager/index.js @@ -0,0 +1,112 @@ +import sortCoresByDependencies from "../../utils/sortCoresByDependencies" + +export default class CoresManager { + constructor(runtime) { + this.runtime = runtime + } + + cores = new Map() + + context = Object() + + async initialize() { + try { + const coresPaths = { + ...import.meta.glob("/src/cores/*/*.core.jsx"), + ...import.meta.glob("/src/cores/*/*.core.js"), + ...import.meta.glob("/src/cores/*/*.core.ts"), + ...import.meta.glob("/src/cores/*/*.core.tsx"), + } + + const coresKeys = Object.keys(coresPaths) + + if (coresKeys.length === 0) { + this.runtime.console.warn( + "Cannot find any cores to initialize.", + ) + return true + } + + let cores = await Promise.all( + coresKeys.map(async (key) => { + const coreModule = await coresPaths[key]().catch((err) => { + this.runtime.console.warn( + `Cannot load core [${key}]`, + err, + ) + return false + }) + return coreModule?.default ?? coreModule + }), + ) + + cores = cores.filter((core) => core && core.constructor) + + if (!cores.length) { + this.console.warn(`Cannot find any valid cores to initialize.`) + return true + } + + this.runtime.eventBus.emit("runtime.initialize.cores.start") + + cores = sortCoresByDependencies(cores) + + for (const coreClass of cores) { + await this.initializeCore(coreClass) + } + + this.runtime.eventBus.emit("runtime.initialize.cores.finish") + } catch (error) { + this.runtime.eventBus.emit("runtime.initialize.cores.failed", error) + throw error + } + } + + async initializeCore(coreClass) { + if (!coreClass.constructor) { + this.runtime.console.error( + `Core [${coreClass.name}] is not a valid class`, + ) + return false + } + + const namespace = coreClass.namespace ?? coreClass.name + this.runtime.eventBus.emit(`runtime.initialize.core.${namespace}.start`) + + const coreInstance = new coreClass(this.runtime) + + this.cores.set(namespace, coreInstance) + + const result = await coreInstance._init() + + if (!result) { + this.runtime.console.warn( + `[${namespace}] core initialized without a result`, + ) + } + + if (result.public_context) { + this.context[result.namespace] = result.public_context + } + + this.runtime.eventBus.emit( + `runtime.initialize.core.${namespace}.finish`, + ) + //this.states.LOADED_CORES.push(namespace) + + return true + } + + getCoreContext = () => { + return new Proxy(this.context, { + get: (target, key) => target[key], + set: () => { + throw new Error("Cannot modify the runtime property") + }, + }) + } + + get = (key) => { + return this.cores.get(key) + } +} diff --git a/src/classes/EventBus/EventEmitter.ts b/src/classes/EventBus/EventEmitter.ts index 7155b43..4d6b007 100644 --- a/src/classes/EventBus/EventEmitter.ts +++ b/src/classes/EventBus/EventEmitter.ts @@ -1,285 +1,323 @@ -import Listener from "./Listener"; +import Listener from "./Listener" import type { - EventTemplateT, - TemplateEventT, - TemplateListenerArgsT, - TemplateListenerContextT, - TemplateListenerT, -} from "./Listener"; + EventTemplateT, + TemplateEventT, + TemplateListenerArgsT, + TemplateListenerContextT, + TemplateListenerT, +} from "./Listener" -export default class EventEmitter