From c2d2e5f8182f4b1c5a15a96e5e76082519021ea1 Mon Sep 17 00:00:00 2001 From: Exelo Date: Sat, 27 Sep 2025 05:12:13 +0200 Subject: [PATCH] feat(core): enhance type safety and execution context handling --- .../contexts/executions/execution.context.ts | 8 +++++++- .../component-system.library.abstract.ts | 2 +- .../abstracts/graphics.library.abstract.ts | 2 +- .../interfaces/bases/runner.library.type.ts | 2 +- .../executions/execution.editable-context.ts | 8 ++++++-- packages/core/src/core/core.ts | 12 ++++++++---- packages/ecs/lib/libecs.d.ts | 17 +++-------------- packages/ecs/src/ecs-context.type.ts | 5 +++++ packages/ecs/src/ecs-library.ts | 2 +- packages/ecs/src/index.ts | 1 + packages/sound/src/sound.library.ts | 3 +-- 11 files changed, 35 insertions(+), 27 deletions(-) create mode 100644 packages/ecs/src/ecs-context.type.ts diff --git a/packages/common/src/context/contexts/executions/execution.context.ts b/packages/common/src/context/contexts/executions/execution.context.ts index 00e2a345..cfb920b8 100644 --- a/packages/common/src/context/contexts/executions/execution.context.ts +++ b/packages/common/src/context/contexts/executions/execution.context.ts @@ -1,9 +1,15 @@ +import { type IRunnerLibrary } from "../../../library"; import { BaseContext } from "./base.context"; -export class ExecutionContext extends BaseContext { +export class ExecutionContext extends BaseContext { protected _isRunning: boolean = true; + protected _currentLibrary: T; get isRunning() { return this._isRunning; } + + get lib(): T { + return this._currentLibrary; + } } diff --git a/packages/common/src/library/libraries/abstracts/component-system.library.abstract.ts b/packages/common/src/library/libraries/abstracts/component-system.library.abstract.ts index 68a59d79..ce93ed76 100644 --- a/packages/common/src/library/libraries/abstracts/component-system.library.abstract.ts +++ b/packages/common/src/library/libraries/abstracts/component-system.library.abstract.ts @@ -6,5 +6,5 @@ export abstract class BaseComponentSystemLibrary extends Library implements IComponentSystemLibrary { - abstract run(context: ExecutionContext): Promise; + abstract run(context: ExecutionContext): Promise; } diff --git a/packages/common/src/library/libraries/abstracts/graphics.library.abstract.ts b/packages/common/src/library/libraries/abstracts/graphics.library.abstract.ts index bf959120..facb9dbb 100644 --- a/packages/common/src/library/libraries/abstracts/graphics.library.abstract.ts +++ b/packages/common/src/library/libraries/abstracts/graphics.library.abstract.ts @@ -3,5 +3,5 @@ import { type IGraphicsLibrary } from "../interfaces"; import { Library } from "../library"; export abstract class BaseGraphicsLibrary extends Library implements IGraphicsLibrary { - abstract run(context: ExecutionContext): Promise; + abstract run(context: ExecutionContext): Promise; } diff --git a/packages/common/src/library/libraries/interfaces/bases/runner.library.type.ts b/packages/common/src/library/libraries/interfaces/bases/runner.library.type.ts index 8c048313..28be7524 100644 --- a/packages/common/src/library/libraries/interfaces/bases/runner.library.type.ts +++ b/packages/common/src/library/libraries/interfaces/bases/runner.library.type.ts @@ -2,5 +2,5 @@ import { type ExecutionContext } from "../../../../context"; import { type ILibrary } from "../../library.type"; export interface IRunnerLibrary extends ILibrary { - run(context: ExecutionContext): Promise; + run(context: ExecutionContext): Promise; } diff --git a/packages/core/src/common/context/contexts/executions/execution.editable-context.ts b/packages/core/src/common/context/contexts/executions/execution.editable-context.ts index d6b2d966..a425fc27 100644 --- a/packages/core/src/common/context/contexts/executions/execution.editable-context.ts +++ b/packages/core/src/common/context/contexts/executions/execution.editable-context.ts @@ -1,7 +1,11 @@ -import { ExecutionContext } from "@nanoforge/common"; +import { ExecutionContext, type IRunnerLibrary } from "@nanoforge/common"; -export class EditableExecutionContext extends ExecutionContext { +export class EditableExecutionContext extends ExecutionContext { setIsRunning(isRunning: boolean) { this._isRunning = isRunning; } + + setCurrentLibrary(library: T) { + this._currentLibrary = library; + } } diff --git a/packages/core/src/core/core.ts b/packages/core/src/core/core.ts index 73f7d352..7d1d78d6 100644 --- a/packages/core/src/core/core.ts +++ b/packages/core/src/core/core.ts @@ -1,7 +1,6 @@ import { type ApplicationContext, ClearContext, - ExecutionContext, type IRunOptions, type IRunnerLibrary, InitContext, @@ -11,6 +10,7 @@ import { import { type ApplicationConfig } from "../application/application-config"; import type { IApplicationOptions } from "../application/application-options.type"; +import { EditableExecutionContext } from "../common/context/contexts/executions/execution.editable-context"; import { type EditableLibraryContext } from "../common/context/contexts/library.editable-context"; export class Core { @@ -63,8 +63,8 @@ export class Core { return new InitContext(this.context, this.config.libraryManager, options); } - private getExecutionContext(): ExecutionContext { - return new ExecutionContext(this.context, this.config.libraryManager); + private getExecutionContext(): EditableExecutionContext { + return new EditableExecutionContext(this.context, this.config.libraryManager); } private getClearContext(): ClearContext { @@ -78,8 +78,12 @@ export class Core { } } - private async runExecute(context: ExecutionContext, libraries: LibraryHandle[]) { + private async runExecute( + context: EditableExecutionContext, + libraries: LibraryHandle[], + ) { for (const handle of libraries) { + context.setCurrentLibrary(handle.library); await handle.library.run(context); } } diff --git a/packages/ecs/lib/libecs.d.ts b/packages/ecs/lib/libecs.d.ts index 6839d53d..3186f04f 100644 --- a/packages/ecs/lib/libecs.d.ts +++ b/packages/ecs/lib/libecs.d.ts @@ -1,17 +1,4 @@ // TypeScript bindings for emscripten-generated code. Automatically generated at compile time. -declare namespace RuntimeExports { - let HEAPF32: any; - let HEAPF64: any; - let HEAP_DATA_VIEW: any; - let HEAP8: any; - let HEAPU8: any; - let HEAP16: any; - let HEAPU16: any; - let HEAP32: any; - let HEAPU32: any; - let HEAP64: any; - let HEAPU64: any; -} interface WasmModule { } @@ -20,6 +7,8 @@ export interface ClassHandle { delete(): void; deleteLater(): this; isDeleted(): boolean; + // @ts-ignore - If targeting lower than ESNext, this symbol might not exist. + [Symbol.dispose](): void; clone(): this; } export interface container extends ClassHandle { @@ -85,5 +74,5 @@ interface EmbindModule { }; } -export type MainModule = WasmModule & typeof RuntimeExports & EmbindModule; +export type MainModule = WasmModule & EmbindModule; export default function MainModuleFactory (options?: unknown): Promise; diff --git a/packages/ecs/src/ecs-context.type.ts b/packages/ecs/src/ecs-context.type.ts new file mode 100644 index 00000000..a20c24b3 --- /dev/null +++ b/packages/ecs/src/ecs-context.type.ts @@ -0,0 +1,5 @@ +import { type ExecutionContext } from "@nanoforge/common"; + +import { type ECSLibrary } from "./ecs-library"; + +export type ECSContext = ExecutionContext; diff --git a/packages/ecs/src/ecs-library.ts b/packages/ecs/src/ecs-library.ts index cee73844..793a3e22 100644 --- a/packages/ecs/src/ecs-library.ts +++ b/packages/ecs/src/ecs-library.ts @@ -100,7 +100,7 @@ export class ECSLibrary extends BaseComponentSystemLibrary { this.registry.addSystem(system); } - getZipper(types: [Component]): [any] { + getZipper(types: [Component, ...Component[]]): [any, ...any[]] { return this.registry.getZipper(types); } } diff --git a/packages/ecs/src/index.ts b/packages/ecs/src/index.ts index bdc631fe..739ae3b3 100644 --- a/packages/ecs/src/index.ts +++ b/packages/ecs/src/index.ts @@ -1,3 +1,4 @@ import "../lib/libecs.wasm"; export * from "./ecs-library"; +export type { ECSContext } from "./ecs-context.type"; diff --git a/packages/sound/src/sound.library.ts b/packages/sound/src/sound.library.ts index 1a6b1a3b..25ce81a5 100644 --- a/packages/sound/src/sound.library.ts +++ b/packages/sound/src/sound.library.ts @@ -1,5 +1,4 @@ -import { BaseSoundLibrary } from "@nanoforge/common"; -import { NfNotFound } from "@nanoforge/common/src/exceptions"; +import { BaseSoundLibrary, NfNotFound } from "@nanoforge/common"; export class SoundLibrary extends BaseSoundLibrary { private muted: boolean;