@al8b/runtime 0.1.13 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/index.d.mts +0 -1
- package/dist/assets/index.d.ts +0 -1
- package/dist/assets/loader.d.mts +0 -1
- package/dist/assets/loader.d.ts +0 -1
- package/dist/browser/index.js +780 -2681
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/index.min.js +27 -39
- package/dist/core/api-factory.d.mts +1 -5
- package/dist/core/api-factory.d.ts +1 -5
- package/dist/core/api-factory.js +17 -38
- package/dist/core/api-factory.js.map +1 -1
- package/dist/core/api-factory.mjs +18 -38
- package/dist/core/api-factory.mjs.map +1 -1
- package/dist/core/controller.d.mts +0 -5
- package/dist/core/controller.d.ts +0 -5
- package/dist/core/controller.js +23 -98
- package/dist/core/controller.js.map +1 -1
- package/dist/core/controller.mjs +24 -99
- package/dist/core/controller.mjs.map +1 -1
- package/dist/core/debug-logger.d.mts +0 -1
- package/dist/core/debug-logger.d.ts +0 -1
- package/dist/core/error-handler.d.mts +1 -2
- package/dist/core/error-handler.d.ts +1 -2
- package/dist/core/error-handler.js +2 -17
- package/dist/core/error-handler.js.map +1 -1
- package/dist/core/error-handler.mjs +2 -17
- package/dist/core/error-handler.mjs.map +1 -1
- package/dist/core/index.d.mts +0 -2
- package/dist/core/index.d.ts +0 -2
- package/dist/core/index.js +23 -98
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +24 -99
- package/dist/core/index.mjs.map +1 -1
- package/dist/hot-reload/index.d.mts +0 -1
- package/dist/hot-reload/index.d.ts +0 -1
- package/dist/hot-reload/index.js.map +1 -1
- package/dist/hot-reload/index.mjs.map +1 -1
- package/dist/hot-reload/updater.d.mts +0 -1
- package/dist/hot-reload/updater.d.ts +0 -1
- package/dist/hot-reload/updater.js.map +1 -1
- package/dist/hot-reload/updater.mjs.map +1 -1
- package/dist/index.d.mts +0 -2
- package/dist/index.d.ts +0 -2
- package/dist/index.js +23 -98
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +24 -99
- package/dist/index.mjs.map +1 -1
- package/dist/types/bridge.d.mts +0 -4
- package/dist/types/bridge.d.ts +0 -4
- package/dist/types/bridge.js.map +1 -1
- package/dist/types/index.d.mts +0 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/runtime.d.mts +13 -2
- package/dist/types/runtime.d.ts +13 -2
- package/dist/types/runtime.js.map +1 -1
- package/package.json +12 -16
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Palette } from '@al8b/palette';
|
|
2
|
-
import { SceneManager, SceneDefinition } from '@al8b/scene';
|
|
3
2
|
import { L8BVM, GlobalAPI, MetaFunctions } from '@al8b/vm';
|
|
4
3
|
import { InputManager } from '../input/manager.mjs';
|
|
5
4
|
import { RuntimeListener, RuntimeOptions } from '../types/runtime.mjs';
|
|
@@ -12,7 +11,6 @@ import { AudioCore } from '@al8b/audio';
|
|
|
12
11
|
import { System } from '../system/api.mjs';
|
|
13
12
|
import '@al8b/input';
|
|
14
13
|
import '../types/assets.mjs';
|
|
15
|
-
import '@al8b/framework-shared';
|
|
16
14
|
import '@al8b/time';
|
|
17
15
|
|
|
18
16
|
interface RuntimeApiFactoryContext {
|
|
@@ -23,7 +21,6 @@ interface RuntimeApiFactoryContext {
|
|
|
23
21
|
input: InputManager;
|
|
24
22
|
system: System;
|
|
25
23
|
playerService: PlayerService;
|
|
26
|
-
sceneManager: SceneManager;
|
|
27
24
|
assets: RuntimeAssetsRegistry;
|
|
28
25
|
bridge?: RuntimeBridge;
|
|
29
26
|
getVM: () => L8BVM | null;
|
|
@@ -58,6 +55,5 @@ declare function createRuntimeGlobalApi(context: RuntimeApiFactoryContext): Part
|
|
|
58
55
|
load: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;
|
|
59
56
|
};
|
|
60
57
|
};
|
|
61
|
-
declare function convertSceneDefinition(definition: SceneDefinition, vm: L8BVM | null, listener: RuntimeListener): SceneDefinition;
|
|
62
58
|
|
|
63
|
-
export { type RuntimeApiFactoryContext,
|
|
59
|
+
export { type RuntimeApiFactoryContext, createRuntimeGlobalApi, createRuntimeMeta };
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Palette } from '@al8b/palette';
|
|
2
|
-
import { SceneManager, SceneDefinition } from '@al8b/scene';
|
|
3
2
|
import { L8BVM, GlobalAPI, MetaFunctions } from '@al8b/vm';
|
|
4
3
|
import { InputManager } from '../input/manager.js';
|
|
5
4
|
import { RuntimeListener, RuntimeOptions } from '../types/runtime.js';
|
|
@@ -12,7 +11,6 @@ import { AudioCore } from '@al8b/audio';
|
|
|
12
11
|
import { System } from '../system/api.js';
|
|
13
12
|
import '@al8b/input';
|
|
14
13
|
import '../types/assets.js';
|
|
15
|
-
import '@al8b/framework-shared';
|
|
16
14
|
import '@al8b/time';
|
|
17
15
|
|
|
18
16
|
interface RuntimeApiFactoryContext {
|
|
@@ -23,7 +21,6 @@ interface RuntimeApiFactoryContext {
|
|
|
23
21
|
input: InputManager;
|
|
24
22
|
system: System;
|
|
25
23
|
playerService: PlayerService;
|
|
26
|
-
sceneManager: SceneManager;
|
|
27
24
|
assets: RuntimeAssetsRegistry;
|
|
28
25
|
bridge?: RuntimeBridge;
|
|
29
26
|
getVM: () => L8BVM | null;
|
|
@@ -58,6 +55,5 @@ declare function createRuntimeGlobalApi(context: RuntimeApiFactoryContext): Part
|
|
|
58
55
|
load: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;
|
|
59
56
|
};
|
|
60
57
|
};
|
|
61
|
-
declare function convertSceneDefinition(definition: SceneDefinition, vm: L8BVM | null, listener: RuntimeListener): SceneDefinition;
|
|
62
58
|
|
|
63
|
-
export { type RuntimeApiFactoryContext,
|
|
59
|
+
export { type RuntimeApiFactoryContext, createRuntimeGlobalApi, createRuntimeMeta };
|
package/dist/core/api-factory.js
CHANGED
|
@@ -21,7 +21,6 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
21
21
|
// src/core/api-factory.ts
|
|
22
22
|
var api_factory_exports = {};
|
|
23
23
|
__export(api_factory_exports, {
|
|
24
|
-
convertSceneDefinition: () => convertSceneDefinition,
|
|
25
24
|
createRuntimeGlobalApi: () => createRuntimeGlobalApi,
|
|
26
25
|
createRuntimeMeta: () => createRuntimeMeta
|
|
27
26
|
});
|
|
@@ -178,12 +177,6 @@ function createRuntimeGlobalApi(context) {
|
|
|
178
177
|
session,
|
|
179
178
|
memory,
|
|
180
179
|
system: context.system.getAPI(),
|
|
181
|
-
scene: /* @__PURE__ */ __name((name, definition) => {
|
|
182
|
-
const convertedDefinition = convertSceneDefinition(asSceneDefinition(definition), context.getVM(), context.listener);
|
|
183
|
-
context.sceneManager.registerScene(name, convertedDefinition);
|
|
184
|
-
}, "scene"),
|
|
185
|
-
route: /* @__PURE__ */ __name((path, sceneName) => context.sceneManager.registerRoute(path, sceneName), "route"),
|
|
186
|
-
router: context.sceneManager.router.getInterface(),
|
|
187
180
|
Image: import_image.Image,
|
|
188
181
|
Sprite: import_sprites.Sprite,
|
|
189
182
|
TileMap: import_map.TileMap,
|
|
@@ -194,45 +187,31 @@ function createRuntimeGlobalApi(context) {
|
|
|
194
187
|
};
|
|
195
188
|
}
|
|
196
189
|
__name(createRuntimeGlobalApi, "createRuntimeGlobalApi");
|
|
197
|
-
function convertSceneDefinition(definition, vm, listener) {
|
|
198
|
-
if (!vm?.runner?.main_thread?.processor) {
|
|
199
|
-
listener.log?.("[RuntimeController] VM not ready for scene conversion. Scene functions may not work correctly.");
|
|
200
|
-
return definition;
|
|
201
|
-
}
|
|
202
|
-
const processor = vm.runner.main_thread.processor;
|
|
203
|
-
const context = vm.context;
|
|
204
|
-
const converted = {};
|
|
205
|
-
for (const [key, value] of Object.entries(definition)) {
|
|
206
|
-
if (value instanceof import_vm.Routine) {
|
|
207
|
-
converted[key] = processor.routineAsFunction(value, context);
|
|
208
|
-
continue;
|
|
209
|
-
}
|
|
210
|
-
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
211
|
-
converted[key] = convertSceneDefinition(value, vm, listener);
|
|
212
|
-
continue;
|
|
213
|
-
}
|
|
214
|
-
converted[key] = value;
|
|
215
|
-
}
|
|
216
|
-
return converted;
|
|
217
|
-
}
|
|
218
|
-
__name(convertSceneDefinition, "convertSceneDefinition");
|
|
219
|
-
function asSceneDefinition(definition) {
|
|
220
|
-
if (!definition || typeof definition !== "object" || Array.isArray(definition)) {
|
|
221
|
-
throw new Error("Scene definition must be an object.");
|
|
222
|
-
}
|
|
223
|
-
return definition;
|
|
224
|
-
}
|
|
225
|
-
__name(asSceneDefinition, "asSceneDefinition");
|
|
226
190
|
function cloneValue(value) {
|
|
227
191
|
if (value == null) {
|
|
228
192
|
return value;
|
|
229
193
|
}
|
|
230
|
-
|
|
194
|
+
if (value instanceof Date) {
|
|
195
|
+
return new Date(value);
|
|
196
|
+
}
|
|
197
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
198
|
+
return value;
|
|
199
|
+
}
|
|
200
|
+
if (Array.isArray(value)) {
|
|
201
|
+
return value.map((entry) => cloneValue(entry));
|
|
202
|
+
}
|
|
203
|
+
if (typeof value === "object") {
|
|
204
|
+
const clone = {};
|
|
205
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
206
|
+
clone[key] = cloneValue(entry);
|
|
207
|
+
}
|
|
208
|
+
return clone;
|
|
209
|
+
}
|
|
210
|
+
return null;
|
|
231
211
|
}
|
|
232
212
|
__name(cloneValue, "cloneValue");
|
|
233
213
|
// Annotate the CommonJS export names for ESM import in node:
|
|
234
214
|
0 && (module.exports = {
|
|
235
|
-
convertSceneDefinition,
|
|
236
215
|
createRuntimeGlobalApi,
|
|
237
216
|
createRuntimeMeta
|
|
238
217
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/api-factory.ts","../../src/assets/constructors.ts","../../src/utils/object-pool.ts"],"sourcesContent":["import { Palette } from \"@al8b/palette\";\nimport type { SceneDefinition, SceneManager } from \"@al8b/scene\";\nimport { type GlobalAPI, type L8BVM, type MetaFunctions, Random, Routine } from \"@al8b/vm\";\nimport { Image, Sound, Sprite, TileMap } from \"../assets\";\nimport type { InputManager } from \"../input\";\nimport type {\n\tHostEvent,\n\tRuntimeBridge,\n\tRuntimeListener,\n\tRuntimeOptions,\n\tRuntimeResetOptions,\n\tRuntimeSessionSnapshot,\n\tRuntimeSnapshot,\n\tRuntimeSnapshotMeta,\n} from \"../types\";\nimport { ObjectPool } from \"../utils/object-pool\";\nimport type { PlayerService } from \"@al8b/player\";\nimport type { RuntimeAssetsRegistry } from \"./assets-registry\";\nimport type { Screen } from \"@al8b/screen\";\nimport type { AudioCore } from \"@al8b/audio\";\nimport type { System } from \"../system\";\n\nexport interface RuntimeApiFactoryContext {\n\tlistener: RuntimeListener;\n\toptions: RuntimeOptions;\n\tscreen: Screen;\n\taudio: AudioCore;\n\tinput: InputManager;\n\tsystem: System;\n\tplayerService: PlayerService;\n\tsceneManager: SceneManager;\n\tassets: RuntimeAssetsRegistry;\n\tbridge?: RuntimeBridge;\n\tgetVM: () => L8BVM | null;\n\tgetSessionSnapshot: () => RuntimeSessionSnapshot | null;\n\tsendHostEvent: (event: HostEvent) => void;\n\tsendHostRequest: (name: string, payload?: unknown, callback?: (result: unknown) => void) => string | null;\n\texportSnapshot: () => RuntimeSnapshot;\n\timportSnapshot: (snapshot: RuntimeSnapshot) => Promise<void>;\n\tresetRuntime: (options?: RuntimeResetOptions) => Promise<void>;\n\tsaveSnapshot: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;\n\tloadSnapshot: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;\n}\n\nexport function createRuntimeMeta(context: RuntimeApiFactoryContext): Partial<MetaFunctions> {\n\treturn {\n\t\tprint: (text: unknown) => {\n\t\t\tconst vm = context.getVM();\n\t\t\tif ((typeof text === \"object\" || typeof text === \"function\") && vm) {\n\t\t\t\ttext = vm.toString(text);\n\t\t\t}\n\t\t\tif (context.listener.log) {\n\t\t\t\tcontext.listener.log(String(text));\n\t\t\t} else {\n\t\t\t\tconsole.log(text);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport function createRuntimeGlobalApi(context: RuntimeApiFactoryContext): Partial<GlobalAPI> & {\n\tObjectPool: typeof ObjectPool;\n\tPalette: typeof Palette;\n\thost: {\n\t\temit: (name: string, payload?: unknown) => void;\n\t\trequest: (name: string, payload?: unknown, callback?: (result: unknown) => void) => string | null;\n\t};\n\tsession: {\n\t\tuser: () => RuntimeSessionSnapshot[\"user\"];\n\t\tplayer: () => RuntimeSessionSnapshot[\"player\"];\n\t\tgame: () => RuntimeSessionSnapshot[\"game\"];\n\t\troom: () => RuntimeSessionSnapshot[\"room\"];\n\t};\n\tmemory: {\n\t\texport: () => RuntimeSnapshot;\n\t\timport: (snapshot: RuntimeSnapshot) => Promise<void>;\n\t\treset: (options?: RuntimeResetOptions) => Promise<void>;\n\t\tsave: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;\n\t\tload: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;\n\t};\n} {\n\tconst inputStates = context.input.getStates();\n\tconst session = {\n\t\tuser: () => cloneValue(context.getSessionSnapshot()?.user ?? null),\n\t\tplayer: () => cloneValue(context.getSessionSnapshot()?.player ?? null),\n\t\tgame: () => cloneValue(context.getSessionSnapshot()?.game ?? null),\n\t\troom: () => cloneValue(context.getSessionSnapshot()?.room ?? null),\n\t};\n\tconst host = {\n\t\temit: (name: string, payload?: unknown) => {\n\t\t\tcontext.sendHostEvent({\n\t\t\t\ttype: name,\n\t\t\t\tpayload,\n\t\t\t\tsource: \"host\",\n\t\t\t});\n\t\t},\n\t\trequest: (name: string, payload?: unknown, callback?: (result: unknown) => void) =>\n\t\t\tcontext.sendHostRequest(name, payload, callback),\n\t};\n\tconst memory = {\n\t\texport: () => context.exportSnapshot(),\n\t\timport: (snapshot: RuntimeSnapshot) => context.importSnapshot(snapshot),\n\t\treset: (options?: RuntimeResetOptions) => context.resetRuntime(options),\n\t\tsave: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => context.saveSnapshot(meta, callback),\n\t\tload: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => context.loadSnapshot(meta, callback),\n\t};\n\n\treturn {\n\t\tscreen: context.screen.getInterface(),\n\t\taudio: context.audio.getInterface(),\n\t\tkeyboard: inputStates.keyboard,\n\t\tmouse: inputStates.mouse,\n\t\ttouch: inputStates.touch,\n\t\tgamepad: inputStates.gamepad,\n\t\tsprites: context.assets.sprites,\n\t\tmaps: context.assets.maps,\n\t\tsounds: context.assets.sounds,\n\t\tmusic: context.assets.music,\n\t\tassets: context.assets.assets,\n\t\tplayer: context.playerService.getInterface(),\n\t\thost,\n\t\tsession,\n\t\tmemory,\n\t\tsystem: context.system.getAPI(),\n\t\tscene: (name: string, definition: unknown) => {\n\t\t\tconst convertedDefinition = convertSceneDefinition(asSceneDefinition(definition), context.getVM(), context.listener);\n\t\t\tcontext.sceneManager.registerScene(name, convertedDefinition);\n\t\t},\n\t\troute: (path: string, sceneName: string) => context.sceneManager.registerRoute(path, sceneName),\n\t\trouter: context.sceneManager.router.getInterface(),\n\t\tImage,\n\t\tSprite,\n\t\tTileMap,\n\t\tSound,\n\t\tPalette,\n\t\tRandom,\n\t\tObjectPool,\n\t};\n}\n\nexport function convertSceneDefinition(\n\tdefinition: SceneDefinition,\n\tvm: L8BVM | null,\n\tlistener: RuntimeListener,\n): SceneDefinition {\n\tif (!vm?.runner?.main_thread?.processor) {\n\t\tlistener.log?.(\"[RuntimeController] VM not ready for scene conversion. Scene functions may not work correctly.\");\n\t\treturn definition;\n\t}\n\n\tconst processor = vm.runner.main_thread.processor;\n\tconst context = vm.context;\n\tconst converted: Record<string, unknown> = {};\n\n\tfor (const [key, value] of Object.entries(definition)) {\n\t\tif (value instanceof Routine) {\n\t\t\tconverted[key] = processor.routineAsFunction(value, context);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (value && typeof value === \"object\" && !Array.isArray(value)) {\n\t\t\tconverted[key] = convertSceneDefinition(value, vm, listener);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconverted[key] = value;\n\t}\n\n\treturn converted as SceneDefinition;\n}\n\nfunction asSceneDefinition(definition: unknown): SceneDefinition {\n\tif (!definition || typeof definition !== \"object\" || Array.isArray(definition)) {\n\t\tthrow new Error(\"Scene definition must be an object.\");\n\t}\n\n\treturn definition as SceneDefinition;\n}\n\nfunction cloneValue<T>(value: T): T {\n\tif (value == null) {\n\t\treturn value;\n\t}\n\n\treturn JSON.parse(JSON.stringify(value)) as T;\n}\n","/**\n * Dynamic asset constructors\n *\n * Provides constructors for creating assets at runtime\n */\n\nimport { Sound } from \"@al8b/audio\";\nimport { TileMap } from \"@al8b/map\";\nimport { Image } from \"@al8b/image\";\nimport { Sprite } from \"@al8b/sprites\";\n\n/**\n * Export constructors for game code\n */\nexport { Image, Sprite, TileMap, Sound };\n","/**\n * Object Pool utility for game entities\n *\n * Provides object pooling to reduce GC pressure and improve performance\n * for frequently created/destroyed game objects.\n */\n\n/**\n * Object pool for reusing objects\n *\n * @template T - Type of objects in the pool\n */\nexport class ObjectPool<T> {\n\tprivate pool: T[] = [];\n\tprivate factory: () => T;\n\tprivate reset: (obj: T) => void;\n\tprivate maxSize: number;\n\n\t/**\n\t * Create a new object pool\n\t *\n\t * @param factory - Function to create new objects\n\t * @param reset - Function to reset object state for reuse\n\t * @param maxSize - Maximum pool size (default: 100)\n\t */\n\tconstructor(factory: () => T, reset: (obj: T) => void, maxSize: number = 100) {\n\t\tthis.factory = factory;\n\t\tthis.reset = reset;\n\t\tthis.maxSize = maxSize;\n\t}\n\n\t/**\n\t * Acquire an object from the pool\n\t *\n\t * Returns a new object if pool is empty, otherwise reuses a pooled object.\n\t *\n\t * @returns Object from pool or newly created\n\t */\n\tacquire(): T {\n\t\tif (this.pool.length > 0) {\n\t\t\treturn this.pool.pop()!;\n\t\t}\n\t\treturn this.factory();\n\t}\n\n\t/**\n\t * Release an object back to the pool\n\t *\n\t * Resets the object and adds it back to the pool for reuse.\n\t * If pool is at max size, the object is discarded.\n\t *\n\t * @param obj - Object to release\n\t */\n\trelease(obj: T): void {\n\t\tif (this.pool.length >= this.maxSize) {\n\t\t\t// Pool is full, discard object\n\t\t\treturn;\n\t\t}\n\n\t\tthis.reset(obj);\n\t\tthis.pool.push(obj);\n\t}\n\n\t/**\n\t * Clear all objects from the pool\n\t */\n\tclear(): void {\n\t\tthis.pool = [];\n\t}\n\n\t/**\n\t * Get current pool size\n\t *\n\t * @returns Number of objects in pool\n\t */\n\tsize(): number {\n\t\treturn this.pool.length;\n\t}\n\n\t/**\n\t * Get maximum pool size\n\t *\n\t * @returns Maximum pool size\n\t */\n\tgetMaxSize(): number {\n\t\treturn this.maxSize;\n\t}\n\n\t/**\n\t * Set maximum pool size\n\t *\n\t * @param maxSize - New maximum pool size\n\t */\n\tsetMaxSize(maxSize: number): void {\n\t\tthis.maxSize = maxSize;\n\t\t// Trim pool if it exceeds new max size\n\t\tif (this.pool.length > maxSize) {\n\t\t\tthis.pool = this.pool.slice(0, maxSize);\n\t\t}\n\t}\n}\n"],"mappings":"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","names":["ObjectPool","pool","factory","reset","maxSize","acquire","length","pop","release","obj","push","clear","size","getMaxSize","setMaxSize","slice","createRuntimeMeta","context","print","text","vm","getVM","toString","listener","log","String","console","createRuntimeGlobalApi","inputStates","input","getStates","session","user","cloneValue","getSessionSnapshot","player","game","room","host","emit","name","payload","sendHostEvent","type","source","request","callback","sendHostRequest","memory","export","exportSnapshot","import","snapshot","importSnapshot","reset","options","resetRuntime","save","meta","saveSnapshot","load","loadSnapshot","screen","getInterface","audio","keyboard","mouse","touch","gamepad","sprites","assets","maps","sounds","music","playerService","system","getAPI","scene","definition","convertedDefinition","convertSceneDefinition","asSceneDefinition","sceneManager","registerScene","route","path","sceneName","registerRoute","router","Image","Sprite","TileMap","Sound","Palette","Random","ObjectPool","runner","main_thread","processor","converted","key","value","Object","entries","Routine","routineAsFunction","Array","isArray","Error","JSON","parse","stringify"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/api-factory.ts","../../src/assets/constructors.ts","../../src/utils/object-pool.ts"],"sourcesContent":["import { Palette } from \"@al8b/palette\";\nimport { type GlobalAPI, type L8BVM, type MetaFunctions, Random } from \"@al8b/vm\";\nimport { Image, Sound, Sprite, TileMap } from \"../assets\";\nimport type { InputManager } from \"../input\";\nimport type {\n\tHostEvent,\n\tRuntimeBridge,\n\tRuntimeListener,\n\tRuntimeOptions,\n\tRuntimeResetOptions,\n\tRuntimeSessionSnapshot,\n\tRuntimeSnapshot,\n\tRuntimeSnapshotMeta,\n} from \"../types\";\nimport { ObjectPool } from \"../utils/object-pool\";\nimport type { PlayerService } from \"@al8b/player\";\nimport type { RuntimeAssetsRegistry } from \"./assets-registry\";\nimport type { Screen } from \"@al8b/screen\";\nimport type { AudioCore } from \"@al8b/audio\";\nimport type { System } from \"../system\";\n\nexport interface RuntimeApiFactoryContext {\n\tlistener: RuntimeListener;\n\toptions: RuntimeOptions;\n\tscreen: Screen;\n\taudio: AudioCore;\n\tinput: InputManager;\n\tsystem: System;\n\tplayerService: PlayerService;\n\tassets: RuntimeAssetsRegistry;\n\tbridge?: RuntimeBridge;\n\tgetVM: () => L8BVM | null;\n\tgetSessionSnapshot: () => RuntimeSessionSnapshot | null;\n\tsendHostEvent: (event: HostEvent) => void;\n\tsendHostRequest: (name: string, payload?: unknown, callback?: (result: unknown) => void) => string | null;\n\texportSnapshot: () => RuntimeSnapshot;\n\timportSnapshot: (snapshot: RuntimeSnapshot) => Promise<void>;\n\tresetRuntime: (options?: RuntimeResetOptions) => Promise<void>;\n\tsaveSnapshot: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;\n\tloadSnapshot: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;\n}\n\nexport function createRuntimeMeta(context: RuntimeApiFactoryContext): Partial<MetaFunctions> {\n\treturn {\n\t\tprint: (text: unknown) => {\n\t\t\tconst vm = context.getVM();\n\t\t\tif ((typeof text === \"object\" || typeof text === \"function\") && vm) {\n\t\t\t\ttext = vm.toString(text);\n\t\t\t}\n\t\t\tif (context.listener.log) {\n\t\t\t\tcontext.listener.log(String(text));\n\t\t\t} else {\n\t\t\t\tconsole.log(text);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport function createRuntimeGlobalApi(context: RuntimeApiFactoryContext): Partial<GlobalAPI> & {\n\tObjectPool: typeof ObjectPool;\n\tPalette: typeof Palette;\n\thost: {\n\t\temit: (name: string, payload?: unknown) => void;\n\t\trequest: (name: string, payload?: unknown, callback?: (result: unknown) => void) => string | null;\n\t};\n\tsession: {\n\t\tuser: () => RuntimeSessionSnapshot[\"user\"];\n\t\tplayer: () => RuntimeSessionSnapshot[\"player\"];\n\t\tgame: () => RuntimeSessionSnapshot[\"game\"];\n\t\troom: () => RuntimeSessionSnapshot[\"room\"];\n\t};\n\tmemory: {\n\t\texport: () => RuntimeSnapshot;\n\t\timport: (snapshot: RuntimeSnapshot) => Promise<void>;\n\t\treset: (options?: RuntimeResetOptions) => Promise<void>;\n\t\tsave: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;\n\t\tload: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;\n\t};\n} {\n\tconst inputStates = context.input.getStates();\n\tconst session = {\n\t\tuser: () => cloneValue(context.getSessionSnapshot()?.user ?? null),\n\t\tplayer: () => cloneValue(context.getSessionSnapshot()?.player ?? null),\n\t\tgame: () => cloneValue(context.getSessionSnapshot()?.game ?? null),\n\t\troom: () => cloneValue(context.getSessionSnapshot()?.room ?? null),\n\t};\n\tconst host = {\n\t\temit: (name: string, payload?: unknown) => {\n\t\t\tcontext.sendHostEvent({\n\t\t\t\ttype: name,\n\t\t\t\tpayload,\n\t\t\t\tsource: \"host\",\n\t\t\t});\n\t\t},\n\t\trequest: (name: string, payload?: unknown, callback?: (result: unknown) => void) =>\n\t\t\tcontext.sendHostRequest(name, payload, callback),\n\t};\n\tconst memory = {\n\t\texport: () => context.exportSnapshot(),\n\t\timport: (snapshot: RuntimeSnapshot) => context.importSnapshot(snapshot),\n\t\treset: (options?: RuntimeResetOptions) => context.resetRuntime(options),\n\t\tsave: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => context.saveSnapshot(meta, callback),\n\t\tload: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => context.loadSnapshot(meta, callback),\n\t};\n\n\treturn {\n\t\tscreen: context.screen.getInterface(),\n\t\taudio: context.audio.getInterface(),\n\t\tkeyboard: inputStates.keyboard,\n\t\tmouse: inputStates.mouse,\n\t\ttouch: inputStates.touch,\n\t\tgamepad: inputStates.gamepad,\n\t\tsprites: context.assets.sprites,\n\t\tmaps: context.assets.maps,\n\t\tsounds: context.assets.sounds,\n\t\tmusic: context.assets.music,\n\t\tassets: context.assets.assets,\n\t\tplayer: context.playerService.getInterface(),\n\t\thost,\n\t\tsession,\n\t\tmemory,\n\t\tsystem: context.system.getAPI(),\n\t\tImage,\n\t\tSprite,\n\t\tTileMap,\n\t\tSound,\n\t\tPalette,\n\t\tRandom,\n\t\tObjectPool,\n\t};\n}\n\n/**\n * Deep clone a value, handling primitives, arrays, objects, and Date.\n * Unlike JSON.parse(JSON.stringify()), this:\n * - Returns null for functions instead of stripping them silently\n * - Preserves Date objects as Date instances\n * - Handles circular references via excluded set\n */\nfunction cloneValue<T>(value: T): T {\n\tif (value == null) {\n\t\treturn value;\n\t}\n\n\tif (value instanceof Date) {\n\t\treturn new Date(value) as T;\n\t}\n\n\tif (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n\t\treturn value;\n\t}\n\n\tif (Array.isArray(value)) {\n\t\treturn value.map((entry) => cloneValue(entry)) as T;\n\t}\n\n\tif (typeof value === \"object\") {\n\t\tconst clone: Record<string, unknown> = {};\n\t\tfor (const [key, entry] of Object.entries(value as Record<string, unknown>)) {\n\t\t\tclone[key] = cloneValue(entry);\n\t\t}\n\t\treturn clone as T;\n\t}\n\n\treturn null as T;\n}\n","/**\n * Dynamic asset constructors\n *\n * Provides constructors for creating assets at runtime\n */\n\nimport { Sound } from \"@al8b/audio\";\nimport { TileMap } from \"@al8b/map\";\nimport { Image } from \"@al8b/image\";\nimport { Sprite } from \"@al8b/sprites\";\n\n/**\n * Export constructors for game code\n */\nexport { Image, Sprite, TileMap, Sound };\n","/**\n * Object Pool utility for game entities\n *\n * Provides object pooling to reduce GC pressure and improve performance\n * for frequently created/destroyed game objects.\n */\n\n/**\n * Object pool for reusing objects\n *\n * @template T - Type of objects in the pool\n */\nexport class ObjectPool<T> {\n\tprivate pool: T[] = [];\n\tprivate factory: () => T;\n\tprivate reset: (obj: T) => void;\n\tprivate maxSize: number;\n\n\t/**\n\t * Create a new object pool\n\t *\n\t * @param factory - Function to create new objects\n\t * @param reset - Function to reset object state for reuse\n\t * @param maxSize - Maximum pool size (default: 100)\n\t */\n\tconstructor(factory: () => T, reset: (obj: T) => void, maxSize: number = 100) {\n\t\tthis.factory = factory;\n\t\tthis.reset = reset;\n\t\tthis.maxSize = maxSize;\n\t}\n\n\t/**\n\t * Acquire an object from the pool\n\t *\n\t * Returns a new object if pool is empty, otherwise reuses a pooled object.\n\t *\n\t * @returns Object from pool or newly created\n\t */\n\tacquire(): T {\n\t\tif (this.pool.length > 0) {\n\t\t\treturn this.pool.pop()!;\n\t\t}\n\t\treturn this.factory();\n\t}\n\n\t/**\n\t * Release an object back to the pool\n\t *\n\t * Resets the object and adds it back to the pool for reuse.\n\t * If pool is at max size, the object is discarded.\n\t *\n\t * @param obj - Object to release\n\t */\n\trelease(obj: T): void {\n\t\tif (this.pool.length >= this.maxSize) {\n\t\t\t// Pool is full, discard object\n\t\t\treturn;\n\t\t}\n\n\t\tthis.reset(obj);\n\t\tthis.pool.push(obj);\n\t}\n\n\t/**\n\t * Clear all objects from the pool\n\t */\n\tclear(): void {\n\t\tthis.pool = [];\n\t}\n\n\t/**\n\t * Get current pool size\n\t *\n\t * @returns Number of objects in pool\n\t */\n\tsize(): number {\n\t\treturn this.pool.length;\n\t}\n\n\t/**\n\t * Get maximum pool size\n\t *\n\t * @returns Maximum pool size\n\t */\n\tgetMaxSize(): number {\n\t\treturn this.maxSize;\n\t}\n\n\t/**\n\t * Set maximum pool size\n\t *\n\t * @param maxSize - New maximum pool size\n\t */\n\tsetMaxSize(maxSize: number): void {\n\t\tthis.maxSize = maxSize;\n\t\t// Trim pool if it exceeds new max size\n\t\tif (this.pool.length > maxSize) {\n\t\t\tthis.pool = this.pool.slice(0, maxSize);\n\t\t}\n\t}\n}\n"],"mappings":"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","names":["ObjectPool","pool","factory","reset","maxSize","acquire","length","pop","release","obj","push","clear","size","getMaxSize","setMaxSize","slice","createRuntimeMeta","context","print","text","vm","getVM","toString","listener","log","String","console","createRuntimeGlobalApi","inputStates","input","getStates","session","user","cloneValue","getSessionSnapshot","player","game","room","host","emit","name","payload","sendHostEvent","type","source","request","callback","sendHostRequest","memory","export","exportSnapshot","import","snapshot","importSnapshot","reset","options","resetRuntime","save","meta","saveSnapshot","load","loadSnapshot","screen","getInterface","audio","keyboard","mouse","touch","gamepad","sprites","assets","maps","sounds","music","playerService","system","getAPI","Image","Sprite","TileMap","Sound","Palette","Random","ObjectPool","value","Date","Array","isArray","map","entry","clone","key","Object","entries"]}
|
|
@@ -3,7 +3,7 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
|
|
|
3
3
|
|
|
4
4
|
// src/core/api-factory.ts
|
|
5
5
|
import { Palette } from "@al8b/palette";
|
|
6
|
-
import { Random
|
|
6
|
+
import { Random } from "@al8b/vm";
|
|
7
7
|
|
|
8
8
|
// src/assets/constructors.ts
|
|
9
9
|
import { Sound } from "@al8b/audio";
|
|
@@ -154,12 +154,6 @@ function createRuntimeGlobalApi(context) {
|
|
|
154
154
|
session,
|
|
155
155
|
memory,
|
|
156
156
|
system: context.system.getAPI(),
|
|
157
|
-
scene: /* @__PURE__ */ __name((name, definition) => {
|
|
158
|
-
const convertedDefinition = convertSceneDefinition(asSceneDefinition(definition), context.getVM(), context.listener);
|
|
159
|
-
context.sceneManager.registerScene(name, convertedDefinition);
|
|
160
|
-
}, "scene"),
|
|
161
|
-
route: /* @__PURE__ */ __name((path, sceneName) => context.sceneManager.registerRoute(path, sceneName), "route"),
|
|
162
|
-
router: context.sceneManager.router.getInterface(),
|
|
163
157
|
Image,
|
|
164
158
|
Sprite,
|
|
165
159
|
TileMap,
|
|
@@ -170,44 +164,30 @@ function createRuntimeGlobalApi(context) {
|
|
|
170
164
|
};
|
|
171
165
|
}
|
|
172
166
|
__name(createRuntimeGlobalApi, "createRuntimeGlobalApi");
|
|
173
|
-
function convertSceneDefinition(definition, vm, listener) {
|
|
174
|
-
if (!vm?.runner?.main_thread?.processor) {
|
|
175
|
-
listener.log?.("[RuntimeController] VM not ready for scene conversion. Scene functions may not work correctly.");
|
|
176
|
-
return definition;
|
|
177
|
-
}
|
|
178
|
-
const processor = vm.runner.main_thread.processor;
|
|
179
|
-
const context = vm.context;
|
|
180
|
-
const converted = {};
|
|
181
|
-
for (const [key, value] of Object.entries(definition)) {
|
|
182
|
-
if (value instanceof Routine) {
|
|
183
|
-
converted[key] = processor.routineAsFunction(value, context);
|
|
184
|
-
continue;
|
|
185
|
-
}
|
|
186
|
-
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
187
|
-
converted[key] = convertSceneDefinition(value, vm, listener);
|
|
188
|
-
continue;
|
|
189
|
-
}
|
|
190
|
-
converted[key] = value;
|
|
191
|
-
}
|
|
192
|
-
return converted;
|
|
193
|
-
}
|
|
194
|
-
__name(convertSceneDefinition, "convertSceneDefinition");
|
|
195
|
-
function asSceneDefinition(definition) {
|
|
196
|
-
if (!definition || typeof definition !== "object" || Array.isArray(definition)) {
|
|
197
|
-
throw new Error("Scene definition must be an object.");
|
|
198
|
-
}
|
|
199
|
-
return definition;
|
|
200
|
-
}
|
|
201
|
-
__name(asSceneDefinition, "asSceneDefinition");
|
|
202
167
|
function cloneValue(value) {
|
|
203
168
|
if (value == null) {
|
|
204
169
|
return value;
|
|
205
170
|
}
|
|
206
|
-
|
|
171
|
+
if (value instanceof Date) {
|
|
172
|
+
return new Date(value);
|
|
173
|
+
}
|
|
174
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
175
|
+
return value;
|
|
176
|
+
}
|
|
177
|
+
if (Array.isArray(value)) {
|
|
178
|
+
return value.map((entry) => cloneValue(entry));
|
|
179
|
+
}
|
|
180
|
+
if (typeof value === "object") {
|
|
181
|
+
const clone = {};
|
|
182
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
183
|
+
clone[key] = cloneValue(entry);
|
|
184
|
+
}
|
|
185
|
+
return clone;
|
|
186
|
+
}
|
|
187
|
+
return null;
|
|
207
188
|
}
|
|
208
189
|
__name(cloneValue, "cloneValue");
|
|
209
190
|
export {
|
|
210
|
-
convertSceneDefinition,
|
|
211
191
|
createRuntimeGlobalApi,
|
|
212
192
|
createRuntimeMeta
|
|
213
193
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/api-factory.ts","../../src/assets/constructors.ts","../../src/utils/object-pool.ts"],"sourcesContent":["import { Palette } from \"@al8b/palette\";\nimport type { SceneDefinition, SceneManager } from \"@al8b/scene\";\nimport { type GlobalAPI, type L8BVM, type MetaFunctions, Random, Routine } from \"@al8b/vm\";\nimport { Image, Sound, Sprite, TileMap } from \"../assets\";\nimport type { InputManager } from \"../input\";\nimport type {\n\tHostEvent,\n\tRuntimeBridge,\n\tRuntimeListener,\n\tRuntimeOptions,\n\tRuntimeResetOptions,\n\tRuntimeSessionSnapshot,\n\tRuntimeSnapshot,\n\tRuntimeSnapshotMeta,\n} from \"../types\";\nimport { ObjectPool } from \"../utils/object-pool\";\nimport type { PlayerService } from \"@al8b/player\";\nimport type { RuntimeAssetsRegistry } from \"./assets-registry\";\nimport type { Screen } from \"@al8b/screen\";\nimport type { AudioCore } from \"@al8b/audio\";\nimport type { System } from \"../system\";\n\nexport interface RuntimeApiFactoryContext {\n\tlistener: RuntimeListener;\n\toptions: RuntimeOptions;\n\tscreen: Screen;\n\taudio: AudioCore;\n\tinput: InputManager;\n\tsystem: System;\n\tplayerService: PlayerService;\n\tsceneManager: SceneManager;\n\tassets: RuntimeAssetsRegistry;\n\tbridge?: RuntimeBridge;\n\tgetVM: () => L8BVM | null;\n\tgetSessionSnapshot: () => RuntimeSessionSnapshot | null;\n\tsendHostEvent: (event: HostEvent) => void;\n\tsendHostRequest: (name: string, payload?: unknown, callback?: (result: unknown) => void) => string | null;\n\texportSnapshot: () => RuntimeSnapshot;\n\timportSnapshot: (snapshot: RuntimeSnapshot) => Promise<void>;\n\tresetRuntime: (options?: RuntimeResetOptions) => Promise<void>;\n\tsaveSnapshot: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;\n\tloadSnapshot: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;\n}\n\nexport function createRuntimeMeta(context: RuntimeApiFactoryContext): Partial<MetaFunctions> {\n\treturn {\n\t\tprint: (text: unknown) => {\n\t\t\tconst vm = context.getVM();\n\t\t\tif ((typeof text === \"object\" || typeof text === \"function\") && vm) {\n\t\t\t\ttext = vm.toString(text);\n\t\t\t}\n\t\t\tif (context.listener.log) {\n\t\t\t\tcontext.listener.log(String(text));\n\t\t\t} else {\n\t\t\t\tconsole.log(text);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport function createRuntimeGlobalApi(context: RuntimeApiFactoryContext): Partial<GlobalAPI> & {\n\tObjectPool: typeof ObjectPool;\n\tPalette: typeof Palette;\n\thost: {\n\t\temit: (name: string, payload?: unknown) => void;\n\t\trequest: (name: string, payload?: unknown, callback?: (result: unknown) => void) => string | null;\n\t};\n\tsession: {\n\t\tuser: () => RuntimeSessionSnapshot[\"user\"];\n\t\tplayer: () => RuntimeSessionSnapshot[\"player\"];\n\t\tgame: () => RuntimeSessionSnapshot[\"game\"];\n\t\troom: () => RuntimeSessionSnapshot[\"room\"];\n\t};\n\tmemory: {\n\t\texport: () => RuntimeSnapshot;\n\t\timport: (snapshot: RuntimeSnapshot) => Promise<void>;\n\t\treset: (options?: RuntimeResetOptions) => Promise<void>;\n\t\tsave: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;\n\t\tload: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;\n\t};\n} {\n\tconst inputStates = context.input.getStates();\n\tconst session = {\n\t\tuser: () => cloneValue(context.getSessionSnapshot()?.user ?? null),\n\t\tplayer: () => cloneValue(context.getSessionSnapshot()?.player ?? null),\n\t\tgame: () => cloneValue(context.getSessionSnapshot()?.game ?? null),\n\t\troom: () => cloneValue(context.getSessionSnapshot()?.room ?? null),\n\t};\n\tconst host = {\n\t\temit: (name: string, payload?: unknown) => {\n\t\t\tcontext.sendHostEvent({\n\t\t\t\ttype: name,\n\t\t\t\tpayload,\n\t\t\t\tsource: \"host\",\n\t\t\t});\n\t\t},\n\t\trequest: (name: string, payload?: unknown, callback?: (result: unknown) => void) =>\n\t\t\tcontext.sendHostRequest(name, payload, callback),\n\t};\n\tconst memory = {\n\t\texport: () => context.exportSnapshot(),\n\t\timport: (snapshot: RuntimeSnapshot) => context.importSnapshot(snapshot),\n\t\treset: (options?: RuntimeResetOptions) => context.resetRuntime(options),\n\t\tsave: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => context.saveSnapshot(meta, callback),\n\t\tload: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => context.loadSnapshot(meta, callback),\n\t};\n\n\treturn {\n\t\tscreen: context.screen.getInterface(),\n\t\taudio: context.audio.getInterface(),\n\t\tkeyboard: inputStates.keyboard,\n\t\tmouse: inputStates.mouse,\n\t\ttouch: inputStates.touch,\n\t\tgamepad: inputStates.gamepad,\n\t\tsprites: context.assets.sprites,\n\t\tmaps: context.assets.maps,\n\t\tsounds: context.assets.sounds,\n\t\tmusic: context.assets.music,\n\t\tassets: context.assets.assets,\n\t\tplayer: context.playerService.getInterface(),\n\t\thost,\n\t\tsession,\n\t\tmemory,\n\t\tsystem: context.system.getAPI(),\n\t\tscene: (name: string, definition: unknown) => {\n\t\t\tconst convertedDefinition = convertSceneDefinition(asSceneDefinition(definition), context.getVM(), context.listener);\n\t\t\tcontext.sceneManager.registerScene(name, convertedDefinition);\n\t\t},\n\t\troute: (path: string, sceneName: string) => context.sceneManager.registerRoute(path, sceneName),\n\t\trouter: context.sceneManager.router.getInterface(),\n\t\tImage,\n\t\tSprite,\n\t\tTileMap,\n\t\tSound,\n\t\tPalette,\n\t\tRandom,\n\t\tObjectPool,\n\t};\n}\n\nexport function convertSceneDefinition(\n\tdefinition: SceneDefinition,\n\tvm: L8BVM | null,\n\tlistener: RuntimeListener,\n): SceneDefinition {\n\tif (!vm?.runner?.main_thread?.processor) {\n\t\tlistener.log?.(\"[RuntimeController] VM not ready for scene conversion. Scene functions may not work correctly.\");\n\t\treturn definition;\n\t}\n\n\tconst processor = vm.runner.main_thread.processor;\n\tconst context = vm.context;\n\tconst converted: Record<string, unknown> = {};\n\n\tfor (const [key, value] of Object.entries(definition)) {\n\t\tif (value instanceof Routine) {\n\t\t\tconverted[key] = processor.routineAsFunction(value, context);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (value && typeof value === \"object\" && !Array.isArray(value)) {\n\t\t\tconverted[key] = convertSceneDefinition(value, vm, listener);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconverted[key] = value;\n\t}\n\n\treturn converted as SceneDefinition;\n}\n\nfunction asSceneDefinition(definition: unknown): SceneDefinition {\n\tif (!definition || typeof definition !== \"object\" || Array.isArray(definition)) {\n\t\tthrow new Error(\"Scene definition must be an object.\");\n\t}\n\n\treturn definition as SceneDefinition;\n}\n\nfunction cloneValue<T>(value: T): T {\n\tif (value == null) {\n\t\treturn value;\n\t}\n\n\treturn JSON.parse(JSON.stringify(value)) as T;\n}\n","/**\n * Dynamic asset constructors\n *\n * Provides constructors for creating assets at runtime\n */\n\nimport { Sound } from \"@al8b/audio\";\nimport { TileMap } from \"@al8b/map\";\nimport { Image } from \"@al8b/image\";\nimport { Sprite } from \"@al8b/sprites\";\n\n/**\n * Export constructors for game code\n */\nexport { Image, Sprite, TileMap, Sound };\n","/**\n * Object Pool utility for game entities\n *\n * Provides object pooling to reduce GC pressure and improve performance\n * for frequently created/destroyed game objects.\n */\n\n/**\n * Object pool for reusing objects\n *\n * @template T - Type of objects in the pool\n */\nexport class ObjectPool<T> {\n\tprivate pool: T[] = [];\n\tprivate factory: () => T;\n\tprivate reset: (obj: T) => void;\n\tprivate maxSize: number;\n\n\t/**\n\t * Create a new object pool\n\t *\n\t * @param factory - Function to create new objects\n\t * @param reset - Function to reset object state for reuse\n\t * @param maxSize - Maximum pool size (default: 100)\n\t */\n\tconstructor(factory: () => T, reset: (obj: T) => void, maxSize: number = 100) {\n\t\tthis.factory = factory;\n\t\tthis.reset = reset;\n\t\tthis.maxSize = maxSize;\n\t}\n\n\t/**\n\t * Acquire an object from the pool\n\t *\n\t * Returns a new object if pool is empty, otherwise reuses a pooled object.\n\t *\n\t * @returns Object from pool or newly created\n\t */\n\tacquire(): T {\n\t\tif (this.pool.length > 0) {\n\t\t\treturn this.pool.pop()!;\n\t\t}\n\t\treturn this.factory();\n\t}\n\n\t/**\n\t * Release an object back to the pool\n\t *\n\t * Resets the object and adds it back to the pool for reuse.\n\t * If pool is at max size, the object is discarded.\n\t *\n\t * @param obj - Object to release\n\t */\n\trelease(obj: T): void {\n\t\tif (this.pool.length >= this.maxSize) {\n\t\t\t// Pool is full, discard object\n\t\t\treturn;\n\t\t}\n\n\t\tthis.reset(obj);\n\t\tthis.pool.push(obj);\n\t}\n\n\t/**\n\t * Clear all objects from the pool\n\t */\n\tclear(): void {\n\t\tthis.pool = [];\n\t}\n\n\t/**\n\t * Get current pool size\n\t *\n\t * @returns Number of objects in pool\n\t */\n\tsize(): number {\n\t\treturn this.pool.length;\n\t}\n\n\t/**\n\t * Get maximum pool size\n\t *\n\t * @returns Maximum pool size\n\t */\n\tgetMaxSize(): number {\n\t\treturn this.maxSize;\n\t}\n\n\t/**\n\t * Set maximum pool size\n\t *\n\t * @param maxSize - New maximum pool size\n\t */\n\tsetMaxSize(maxSize: number): void {\n\t\tthis.maxSize = maxSize;\n\t\t// Trim pool if it exceeds new max size\n\t\tif (this.pool.length > maxSize) {\n\t\t\tthis.pool = this.pool.slice(0, maxSize);\n\t\t}\n\t}\n}\n"],"mappings":"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","names":["Palette","Random","Routine","Sound","TileMap","Image","Sprite","ObjectPool","pool","factory","reset","maxSize","acquire","length","pop","release","obj","push","clear","size","getMaxSize","setMaxSize","slice","createRuntimeMeta","context","print","text","vm","getVM","toString","listener","log","String","console","createRuntimeGlobalApi","inputStates","input","getStates","session","user","cloneValue","getSessionSnapshot","player","game","room","host","emit","name","payload","sendHostEvent","type","source","request","callback","sendHostRequest","memory","export","exportSnapshot","import","snapshot","importSnapshot","reset","options","resetRuntime","save","meta","saveSnapshot","load","loadSnapshot","screen","getInterface","audio","keyboard","mouse","touch","gamepad","sprites","assets","maps","sounds","music","playerService","system","getAPI","scene","definition","convertedDefinition","convertSceneDefinition","asSceneDefinition","sceneManager","registerScene","route","path","sceneName","registerRoute","router","Image","Sprite","TileMap","Sound","Palette","Random","ObjectPool","runner","main_thread","processor","converted","key","value","Object","entries","Routine","routineAsFunction","Array","isArray","Error","JSON","parse","stringify"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/api-factory.ts","../../src/assets/constructors.ts","../../src/utils/object-pool.ts"],"sourcesContent":["import { Palette } from \"@al8b/palette\";\nimport { type GlobalAPI, type L8BVM, type MetaFunctions, Random } from \"@al8b/vm\";\nimport { Image, Sound, Sprite, TileMap } from \"../assets\";\nimport type { InputManager } from \"../input\";\nimport type {\n\tHostEvent,\n\tRuntimeBridge,\n\tRuntimeListener,\n\tRuntimeOptions,\n\tRuntimeResetOptions,\n\tRuntimeSessionSnapshot,\n\tRuntimeSnapshot,\n\tRuntimeSnapshotMeta,\n} from \"../types\";\nimport { ObjectPool } from \"../utils/object-pool\";\nimport type { PlayerService } from \"@al8b/player\";\nimport type { RuntimeAssetsRegistry } from \"./assets-registry\";\nimport type { Screen } from \"@al8b/screen\";\nimport type { AudioCore } from \"@al8b/audio\";\nimport type { System } from \"../system\";\n\nexport interface RuntimeApiFactoryContext {\n\tlistener: RuntimeListener;\n\toptions: RuntimeOptions;\n\tscreen: Screen;\n\taudio: AudioCore;\n\tinput: InputManager;\n\tsystem: System;\n\tplayerService: PlayerService;\n\tassets: RuntimeAssetsRegistry;\n\tbridge?: RuntimeBridge;\n\tgetVM: () => L8BVM | null;\n\tgetSessionSnapshot: () => RuntimeSessionSnapshot | null;\n\tsendHostEvent: (event: HostEvent) => void;\n\tsendHostRequest: (name: string, payload?: unknown, callback?: (result: unknown) => void) => string | null;\n\texportSnapshot: () => RuntimeSnapshot;\n\timportSnapshot: (snapshot: RuntimeSnapshot) => Promise<void>;\n\tresetRuntime: (options?: RuntimeResetOptions) => Promise<void>;\n\tsaveSnapshot: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;\n\tloadSnapshot: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;\n}\n\nexport function createRuntimeMeta(context: RuntimeApiFactoryContext): Partial<MetaFunctions> {\n\treturn {\n\t\tprint: (text: unknown) => {\n\t\t\tconst vm = context.getVM();\n\t\t\tif ((typeof text === \"object\" || typeof text === \"function\") && vm) {\n\t\t\t\ttext = vm.toString(text);\n\t\t\t}\n\t\t\tif (context.listener.log) {\n\t\t\t\tcontext.listener.log(String(text));\n\t\t\t} else {\n\t\t\t\tconsole.log(text);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport function createRuntimeGlobalApi(context: RuntimeApiFactoryContext): Partial<GlobalAPI> & {\n\tObjectPool: typeof ObjectPool;\n\tPalette: typeof Palette;\n\thost: {\n\t\temit: (name: string, payload?: unknown) => void;\n\t\trequest: (name: string, payload?: unknown, callback?: (result: unknown) => void) => string | null;\n\t};\n\tsession: {\n\t\tuser: () => RuntimeSessionSnapshot[\"user\"];\n\t\tplayer: () => RuntimeSessionSnapshot[\"player\"];\n\t\tgame: () => RuntimeSessionSnapshot[\"game\"];\n\t\troom: () => RuntimeSessionSnapshot[\"room\"];\n\t};\n\tmemory: {\n\t\texport: () => RuntimeSnapshot;\n\t\timport: (snapshot: RuntimeSnapshot) => Promise<void>;\n\t\treset: (options?: RuntimeResetOptions) => Promise<void>;\n\t\tsave: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;\n\t\tload: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;\n\t};\n} {\n\tconst inputStates = context.input.getStates();\n\tconst session = {\n\t\tuser: () => cloneValue(context.getSessionSnapshot()?.user ?? null),\n\t\tplayer: () => cloneValue(context.getSessionSnapshot()?.player ?? null),\n\t\tgame: () => cloneValue(context.getSessionSnapshot()?.game ?? null),\n\t\troom: () => cloneValue(context.getSessionSnapshot()?.room ?? null),\n\t};\n\tconst host = {\n\t\temit: (name: string, payload?: unknown) => {\n\t\t\tcontext.sendHostEvent({\n\t\t\t\ttype: name,\n\t\t\t\tpayload,\n\t\t\t\tsource: \"host\",\n\t\t\t});\n\t\t},\n\t\trequest: (name: string, payload?: unknown, callback?: (result: unknown) => void) =>\n\t\t\tcontext.sendHostRequest(name, payload, callback),\n\t};\n\tconst memory = {\n\t\texport: () => context.exportSnapshot(),\n\t\timport: (snapshot: RuntimeSnapshot) => context.importSnapshot(snapshot),\n\t\treset: (options?: RuntimeResetOptions) => context.resetRuntime(options),\n\t\tsave: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => context.saveSnapshot(meta, callback),\n\t\tload: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => context.loadSnapshot(meta, callback),\n\t};\n\n\treturn {\n\t\tscreen: context.screen.getInterface(),\n\t\taudio: context.audio.getInterface(),\n\t\tkeyboard: inputStates.keyboard,\n\t\tmouse: inputStates.mouse,\n\t\ttouch: inputStates.touch,\n\t\tgamepad: inputStates.gamepad,\n\t\tsprites: context.assets.sprites,\n\t\tmaps: context.assets.maps,\n\t\tsounds: context.assets.sounds,\n\t\tmusic: context.assets.music,\n\t\tassets: context.assets.assets,\n\t\tplayer: context.playerService.getInterface(),\n\t\thost,\n\t\tsession,\n\t\tmemory,\n\t\tsystem: context.system.getAPI(),\n\t\tImage,\n\t\tSprite,\n\t\tTileMap,\n\t\tSound,\n\t\tPalette,\n\t\tRandom,\n\t\tObjectPool,\n\t};\n}\n\n/**\n * Deep clone a value, handling primitives, arrays, objects, and Date.\n * Unlike JSON.parse(JSON.stringify()), this:\n * - Returns null for functions instead of stripping them silently\n * - Preserves Date objects as Date instances\n * - Handles circular references via excluded set\n */\nfunction cloneValue<T>(value: T): T {\n\tif (value == null) {\n\t\treturn value;\n\t}\n\n\tif (value instanceof Date) {\n\t\treturn new Date(value) as T;\n\t}\n\n\tif (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n\t\treturn value;\n\t}\n\n\tif (Array.isArray(value)) {\n\t\treturn value.map((entry) => cloneValue(entry)) as T;\n\t}\n\n\tif (typeof value === \"object\") {\n\t\tconst clone: Record<string, unknown> = {};\n\t\tfor (const [key, entry] of Object.entries(value as Record<string, unknown>)) {\n\t\t\tclone[key] = cloneValue(entry);\n\t\t}\n\t\treturn clone as T;\n\t}\n\n\treturn null as T;\n}\n","/**\n * Dynamic asset constructors\n *\n * Provides constructors for creating assets at runtime\n */\n\nimport { Sound } from \"@al8b/audio\";\nimport { TileMap } from \"@al8b/map\";\nimport { Image } from \"@al8b/image\";\nimport { Sprite } from \"@al8b/sprites\";\n\n/**\n * Export constructors for game code\n */\nexport { Image, Sprite, TileMap, Sound };\n","/**\n * Object Pool utility for game entities\n *\n * Provides object pooling to reduce GC pressure and improve performance\n * for frequently created/destroyed game objects.\n */\n\n/**\n * Object pool for reusing objects\n *\n * @template T - Type of objects in the pool\n */\nexport class ObjectPool<T> {\n\tprivate pool: T[] = [];\n\tprivate factory: () => T;\n\tprivate reset: (obj: T) => void;\n\tprivate maxSize: number;\n\n\t/**\n\t * Create a new object pool\n\t *\n\t * @param factory - Function to create new objects\n\t * @param reset - Function to reset object state for reuse\n\t * @param maxSize - Maximum pool size (default: 100)\n\t */\n\tconstructor(factory: () => T, reset: (obj: T) => void, maxSize: number = 100) {\n\t\tthis.factory = factory;\n\t\tthis.reset = reset;\n\t\tthis.maxSize = maxSize;\n\t}\n\n\t/**\n\t * Acquire an object from the pool\n\t *\n\t * Returns a new object if pool is empty, otherwise reuses a pooled object.\n\t *\n\t * @returns Object from pool or newly created\n\t */\n\tacquire(): T {\n\t\tif (this.pool.length > 0) {\n\t\t\treturn this.pool.pop()!;\n\t\t}\n\t\treturn this.factory();\n\t}\n\n\t/**\n\t * Release an object back to the pool\n\t *\n\t * Resets the object and adds it back to the pool for reuse.\n\t * If pool is at max size, the object is discarded.\n\t *\n\t * @param obj - Object to release\n\t */\n\trelease(obj: T): void {\n\t\tif (this.pool.length >= this.maxSize) {\n\t\t\t// Pool is full, discard object\n\t\t\treturn;\n\t\t}\n\n\t\tthis.reset(obj);\n\t\tthis.pool.push(obj);\n\t}\n\n\t/**\n\t * Clear all objects from the pool\n\t */\n\tclear(): void {\n\t\tthis.pool = [];\n\t}\n\n\t/**\n\t * Get current pool size\n\t *\n\t * @returns Number of objects in pool\n\t */\n\tsize(): number {\n\t\treturn this.pool.length;\n\t}\n\n\t/**\n\t * Get maximum pool size\n\t *\n\t * @returns Maximum pool size\n\t */\n\tgetMaxSize(): number {\n\t\treturn this.maxSize;\n\t}\n\n\t/**\n\t * Set maximum pool size\n\t *\n\t * @param maxSize - New maximum pool size\n\t */\n\tsetMaxSize(maxSize: number): void {\n\t\tthis.maxSize = maxSize;\n\t\t// Trim pool if it exceeds new max size\n\t\tif (this.pool.length > maxSize) {\n\t\t\tthis.pool = this.pool.slice(0, maxSize);\n\t\t}\n\t}\n}\n"],"mappings":"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","names":["Palette","Random","Sound","TileMap","Image","Sprite","ObjectPool","pool","factory","reset","maxSize","acquire","length","pop","release","obj","push","clear","size","getMaxSize","setMaxSize","slice","createRuntimeMeta","context","print","text","vm","getVM","toString","listener","log","String","console","createRuntimeGlobalApi","inputStates","input","getStates","session","user","cloneValue","getSessionSnapshot","player","game","room","host","emit","name","payload","sendHostEvent","type","source","request","callback","sendHostRequest","memory","export","exportSnapshot","import","snapshot","importSnapshot","reset","options","resetRuntime","save","meta","saveSnapshot","load","loadSnapshot","screen","getInterface","audio","keyboard","mouse","touch","gamepad","sprites","assets","maps","sounds","music","playerService","system","getAPI","Image","Sprite","TileMap","Sound","Palette","Random","ObjectPool","value","Date","Array","isArray","map","entry","clone","key","Object","entries"]}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { AudioCore } from '@al8b/audio';
|
|
2
2
|
import { PlayerService } from '@al8b/player';
|
|
3
|
-
import { SceneManager } from '@al8b/scene';
|
|
4
3
|
import { Screen } from '@al8b/screen';
|
|
5
4
|
import { TimeMachine } from '@al8b/time';
|
|
6
5
|
import { L8BVM } from '@al8b/vm';
|
|
@@ -10,7 +9,6 @@ import { RuntimeOptions } from '../types/runtime.mjs';
|
|
|
10
9
|
import { RuntimeResetOptions, RuntimeSnapshot, HostEvent, RuntimeSessionSnapshot } from '../types/bridge.mjs';
|
|
11
10
|
import '@al8b/input';
|
|
12
11
|
import '../types/assets.mjs';
|
|
13
|
-
import '@al8b/framework-shared';
|
|
14
12
|
|
|
15
13
|
interface RuntimeController {
|
|
16
14
|
readonly screen: Screen;
|
|
@@ -18,7 +16,6 @@ interface RuntimeController {
|
|
|
18
16
|
readonly input: InputManager;
|
|
19
17
|
readonly system: System;
|
|
20
18
|
readonly playerService: PlayerService;
|
|
21
|
-
readonly sceneManager: SceneManager;
|
|
22
19
|
readonly vm: L8BVM | null;
|
|
23
20
|
readonly timeMachine: TimeMachine | null;
|
|
24
21
|
readonly sprites: Record<string, any>;
|
|
@@ -61,7 +58,6 @@ declare class RuntimeControllerImpl implements RuntimeController {
|
|
|
61
58
|
readonly input: InputManager;
|
|
62
59
|
readonly system: System;
|
|
63
60
|
readonly playerService: PlayerService;
|
|
64
|
-
readonly sceneManager: SceneManager;
|
|
65
61
|
vm: L8BVM | null;
|
|
66
62
|
timeMachine: TimeMachine | null;
|
|
67
63
|
constructor(options?: RuntimeOptions);
|
|
@@ -86,7 +82,6 @@ declare class RuntimeControllerImpl implements RuntimeController {
|
|
|
86
82
|
private waitForAssetsReady;
|
|
87
83
|
private initializeVM;
|
|
88
84
|
private loadPrograms;
|
|
89
|
-
private initializeScenesAndRouter;
|
|
90
85
|
private startGameLoop;
|
|
91
86
|
private updateGameLoopUpdateRate;
|
|
92
87
|
private handleUpdate;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { AudioCore } from '@al8b/audio';
|
|
2
2
|
import { PlayerService } from '@al8b/player';
|
|
3
|
-
import { SceneManager } from '@al8b/scene';
|
|
4
3
|
import { Screen } from '@al8b/screen';
|
|
5
4
|
import { TimeMachine } from '@al8b/time';
|
|
6
5
|
import { L8BVM } from '@al8b/vm';
|
|
@@ -10,7 +9,6 @@ import { RuntimeOptions } from '../types/runtime.js';
|
|
|
10
9
|
import { RuntimeResetOptions, RuntimeSnapshot, HostEvent, RuntimeSessionSnapshot } from '../types/bridge.js';
|
|
11
10
|
import '@al8b/input';
|
|
12
11
|
import '../types/assets.js';
|
|
13
|
-
import '@al8b/framework-shared';
|
|
14
12
|
|
|
15
13
|
interface RuntimeController {
|
|
16
14
|
readonly screen: Screen;
|
|
@@ -18,7 +16,6 @@ interface RuntimeController {
|
|
|
18
16
|
readonly input: InputManager;
|
|
19
17
|
readonly system: System;
|
|
20
18
|
readonly playerService: PlayerService;
|
|
21
|
-
readonly sceneManager: SceneManager;
|
|
22
19
|
readonly vm: L8BVM | null;
|
|
23
20
|
readonly timeMachine: TimeMachine | null;
|
|
24
21
|
readonly sprites: Record<string, any>;
|
|
@@ -61,7 +58,6 @@ declare class RuntimeControllerImpl implements RuntimeController {
|
|
|
61
58
|
readonly input: InputManager;
|
|
62
59
|
readonly system: System;
|
|
63
60
|
readonly playerService: PlayerService;
|
|
64
|
-
readonly sceneManager: SceneManager;
|
|
65
61
|
vm: L8BVM | null;
|
|
66
62
|
timeMachine: TimeMachine | null;
|
|
67
63
|
constructor(options?: RuntimeOptions);
|
|
@@ -86,7 +82,6 @@ declare class RuntimeControllerImpl implements RuntimeController {
|
|
|
86
82
|
private waitForAssetsReady;
|
|
87
83
|
private initializeVM;
|
|
88
84
|
private loadPrograms;
|
|
89
|
-
private initializeScenesAndRouter;
|
|
90
85
|
private startGameLoop;
|
|
91
86
|
private updateGameLoopUpdateRate;
|
|
92
87
|
private handleUpdate;
|