@al8b/runtime 0.1.0

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.
Files changed (185) hide show
  1. package/README.md +87 -0
  2. package/dist/assets/constructors.d.mts +6 -0
  3. package/dist/assets/constructors.d.ts +6 -0
  4. package/dist/assets/constructors.js +40 -0
  5. package/dist/assets/constructors.js.map +1 -0
  6. package/dist/assets/constructors.mjs +12 -0
  7. package/dist/assets/constructors.mjs.map +1 -0
  8. package/dist/assets/index.d.mts +11 -0
  9. package/dist/assets/index.d.ts +11 -0
  10. package/dist/assets/index.js +276 -0
  11. package/dist/assets/index.js.map +1 -0
  12. package/dist/assets/index.mjs +247 -0
  13. package/dist/assets/index.mjs.map +1 -0
  14. package/dist/assets/loader.d.mts +83 -0
  15. package/dist/assets/loader.d.ts +83 -0
  16. package/dist/assets/loader.js +260 -0
  17. package/dist/assets/loader.js.map +1 -0
  18. package/dist/assets/loader.mjs +237 -0
  19. package/dist/assets/loader.mjs.map +1 -0
  20. package/dist/browser/index.js +16599 -0
  21. package/dist/browser/index.js.map +1 -0
  22. package/dist/browser/index.min.js +171 -0
  23. package/dist/constants.d.mts +16 -0
  24. package/dist/constants.d.ts +16 -0
  25. package/dist/constants.js +49 -0
  26. package/dist/constants.js.map +1 -0
  27. package/dist/constants.mjs +18 -0
  28. package/dist/constants.mjs.map +1 -0
  29. package/dist/core/api-factory.d.mts +63 -0
  30. package/dist/core/api-factory.d.ts +63 -0
  31. package/dist/core/api-factory.js +239 -0
  32. package/dist/core/api-factory.js.map +1 -0
  33. package/dist/core/api-factory.mjs +214 -0
  34. package/dist/core/api-factory.mjs.map +1 -0
  35. package/dist/core/assets-registry.d.mts +14 -0
  36. package/dist/core/assets-registry.d.ts +14 -0
  37. package/dist/core/assets-registry.js +64 -0
  38. package/dist/core/assets-registry.js.map +1 -0
  39. package/dist/core/assets-registry.mjs +41 -0
  40. package/dist/core/assets-registry.mjs.map +1 -0
  41. package/dist/core/controller.d.mts +109 -0
  42. package/dist/core/controller.d.ts +109 -0
  43. package/dist/core/controller.js +1782 -0
  44. package/dist/core/controller.js.map +1 -0
  45. package/dist/core/controller.mjs +1758 -0
  46. package/dist/core/controller.mjs.map +1 -0
  47. package/dist/core/debug-logger.d.mts +35 -0
  48. package/dist/core/debug-logger.d.ts +35 -0
  49. package/dist/core/debug-logger.js +177 -0
  50. package/dist/core/debug-logger.js.map +1 -0
  51. package/dist/core/debug-logger.mjs +154 -0
  52. package/dist/core/debug-logger.mjs.map +1 -0
  53. package/dist/core/error-handler.d.mts +25 -0
  54. package/dist/core/error-handler.d.ts +25 -0
  55. package/dist/core/error-handler.js +106 -0
  56. package/dist/core/error-handler.js.map +1 -0
  57. package/dist/core/error-handler.mjs +81 -0
  58. package/dist/core/error-handler.mjs.map +1 -0
  59. package/dist/core/index.d.mts +14 -0
  60. package/dist/core/index.d.ts +14 -0
  61. package/dist/core/index.js +1782 -0
  62. package/dist/core/index.js.map +1 -0
  63. package/dist/core/index.mjs +1757 -0
  64. package/dist/core/index.mjs.map +1 -0
  65. package/dist/hot-reload/index.d.mts +7 -0
  66. package/dist/hot-reload/index.d.ts +7 -0
  67. package/dist/hot-reload/index.js +103 -0
  68. package/dist/hot-reload/index.js.map +1 -0
  69. package/dist/hot-reload/index.mjs +78 -0
  70. package/dist/hot-reload/index.mjs.map +1 -0
  71. package/dist/hot-reload/updater.d.mts +33 -0
  72. package/dist/hot-reload/updater.d.ts +33 -0
  73. package/dist/hot-reload/updater.js +101 -0
  74. package/dist/hot-reload/updater.js.map +1 -0
  75. package/dist/hot-reload/updater.mjs +78 -0
  76. package/dist/hot-reload/updater.mjs.map +1 -0
  77. package/dist/index.d.mts +24 -0
  78. package/dist/index.d.ts +24 -0
  79. package/dist/index.js +1859 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/index.mjs +1817 -0
  82. package/dist/index.mjs.map +1 -0
  83. package/dist/input/index.d.mts +2 -0
  84. package/dist/input/index.d.ts +2 -0
  85. package/dist/input/index.js +79 -0
  86. package/dist/input/index.js.map +1 -0
  87. package/dist/input/index.mjs +54 -0
  88. package/dist/input/index.mjs.map +1 -0
  89. package/dist/input/manager.d.mts +37 -0
  90. package/dist/input/manager.d.ts +37 -0
  91. package/dist/input/manager.js +77 -0
  92. package/dist/input/manager.js.map +1 -0
  93. package/dist/input/manager.mjs +54 -0
  94. package/dist/input/manager.mjs.map +1 -0
  95. package/dist/loop/game-loop.d.mts +63 -0
  96. package/dist/loop/game-loop.d.ts +63 -0
  97. package/dist/loop/game-loop.js +156 -0
  98. package/dist/loop/game-loop.js.map +1 -0
  99. package/dist/loop/game-loop.mjs +131 -0
  100. package/dist/loop/game-loop.mjs.map +1 -0
  101. package/dist/loop/index.d.mts +1 -0
  102. package/dist/loop/index.d.ts +1 -0
  103. package/dist/loop/index.js +156 -0
  104. package/dist/loop/index.js.map +1 -0
  105. package/dist/loop/index.mjs +131 -0
  106. package/dist/loop/index.mjs.map +1 -0
  107. package/dist/storage/index.d.mts +1 -0
  108. package/dist/storage/index.d.ts +1 -0
  109. package/dist/storage/index.js +31 -0
  110. package/dist/storage/index.js.map +1 -0
  111. package/dist/storage/index.mjs +6 -0
  112. package/dist/storage/index.mjs.map +1 -0
  113. package/dist/system/api.d.mts +28 -0
  114. package/dist/system/api.d.ts +28 -0
  115. package/dist/system/api.js +126 -0
  116. package/dist/system/api.js.map +1 -0
  117. package/dist/system/api.mjs +101 -0
  118. package/dist/system/api.mjs.map +1 -0
  119. package/dist/system/index.d.mts +2 -0
  120. package/dist/system/index.d.ts +2 -0
  121. package/dist/system/index.js +126 -0
  122. package/dist/system/index.js.map +1 -0
  123. package/dist/system/index.mjs +101 -0
  124. package/dist/system/index.mjs.map +1 -0
  125. package/dist/types/assets.d.mts +43 -0
  126. package/dist/types/assets.d.ts +43 -0
  127. package/dist/types/assets.js +19 -0
  128. package/dist/types/assets.js.map +1 -0
  129. package/dist/types/assets.mjs +1 -0
  130. package/dist/types/assets.mjs.map +1 -0
  131. package/dist/types/bridge.d.mts +66 -0
  132. package/dist/types/bridge.d.ts +66 -0
  133. package/dist/types/bridge.js +19 -0
  134. package/dist/types/bridge.js.map +1 -0
  135. package/dist/types/bridge.mjs +1 -0
  136. package/dist/types/bridge.mjs.map +1 -0
  137. package/dist/types/index.d.mts +6 -0
  138. package/dist/types/index.d.ts +6 -0
  139. package/dist/types/index.js +19 -0
  140. package/dist/types/index.js.map +1 -0
  141. package/dist/types/index.mjs +1 -0
  142. package/dist/types/index.mjs.map +1 -0
  143. package/dist/types/runtime.d.mts +71 -0
  144. package/dist/types/runtime.d.ts +71 -0
  145. package/dist/types/runtime.js +19 -0
  146. package/dist/types/runtime.js.map +1 -0
  147. package/dist/types/runtime.mjs +1 -0
  148. package/dist/types/runtime.mjs.map +1 -0
  149. package/dist/types/vm.d.mts +1 -0
  150. package/dist/types/vm.d.ts +1 -0
  151. package/dist/types/vm.js +19 -0
  152. package/dist/types/vm.js.map +1 -0
  153. package/dist/types/vm.mjs +1 -0
  154. package/dist/types/vm.mjs.map +1 -0
  155. package/dist/utils/deep-clone.d.mts +14 -0
  156. package/dist/utils/deep-clone.d.ts +14 -0
  157. package/dist/utils/deep-clone.js +42 -0
  158. package/dist/utils/deep-clone.js.map +1 -0
  159. package/dist/utils/deep-clone.mjs +19 -0
  160. package/dist/utils/deep-clone.mjs.map +1 -0
  161. package/dist/utils/index.d.mts +3 -0
  162. package/dist/utils/index.d.ts +3 -0
  163. package/dist/utils/index.js +156 -0
  164. package/dist/utils/index.js.map +1 -0
  165. package/dist/utils/index.mjs +129 -0
  166. package/dist/utils/index.mjs.map +1 -0
  167. package/dist/utils/object-pool.d.mts +66 -0
  168. package/dist/utils/object-pool.d.ts +66 -0
  169. package/dist/utils/object-pool.js +113 -0
  170. package/dist/utils/object-pool.js.map +1 -0
  171. package/dist/utils/object-pool.mjs +90 -0
  172. package/dist/utils/object-pool.mjs.map +1 -0
  173. package/dist/utils/shallow-equal.d.mts +15 -0
  174. package/dist/utils/shallow-equal.d.ts +15 -0
  175. package/dist/utils/shallow-equal.js +53 -0
  176. package/dist/utils/shallow-equal.js.map +1 -0
  177. package/dist/utils/shallow-equal.mjs +30 -0
  178. package/dist/utils/shallow-equal.mjs.map +1 -0
  179. package/dist/vm/index.d.mts +1 -0
  180. package/dist/vm/index.d.ts +1 -0
  181. package/dist/vm/index.js +37 -0
  182. package/dist/vm/index.js.map +1 -0
  183. package/dist/vm/index.mjs +9 -0
  184. package/dist/vm/index.mjs.map +1 -0
  185. package/package.json +52 -0
@@ -0,0 +1,16 @@
1
+ /** Default frames per second */
2
+ declare const DEFAULT_FPS = 60;
3
+ /** Default update rate (updates per second) */
4
+ declare const DEFAULT_UPDATE_RATE = 60;
5
+ /** Frame time in milliseconds at 60 FPS */
6
+ declare const FRAME_TIME_MS: number;
7
+ /** Threshold in ms to detect long pauses (tab switch, etc.) */
8
+ declare const PAUSE_THRESHOLD_MS = 160;
9
+ /** Default tile/block size in pixels */
10
+ declare const DEFAULT_BLOCK_SIZE = 16;
11
+ /** Minimum interval between loading bar redraws in ms (~60fps) */
12
+ declare const LOADING_BAR_THROTTLE_MS = 16;
13
+ /** Timeout in ms for individual asset loads (sprite/map HTTP requests) */
14
+ declare const ASSET_LOAD_TIMEOUT_MS = 30000;
15
+
16
+ export { ASSET_LOAD_TIMEOUT_MS, DEFAULT_BLOCK_SIZE, DEFAULT_FPS, DEFAULT_UPDATE_RATE, FRAME_TIME_MS, LOADING_BAR_THROTTLE_MS, PAUSE_THRESHOLD_MS };
@@ -0,0 +1,16 @@
1
+ /** Default frames per second */
2
+ declare const DEFAULT_FPS = 60;
3
+ /** Default update rate (updates per second) */
4
+ declare const DEFAULT_UPDATE_RATE = 60;
5
+ /** Frame time in milliseconds at 60 FPS */
6
+ declare const FRAME_TIME_MS: number;
7
+ /** Threshold in ms to detect long pauses (tab switch, etc.) */
8
+ declare const PAUSE_THRESHOLD_MS = 160;
9
+ /** Default tile/block size in pixels */
10
+ declare const DEFAULT_BLOCK_SIZE = 16;
11
+ /** Minimum interval between loading bar redraws in ms (~60fps) */
12
+ declare const LOADING_BAR_THROTTLE_MS = 16;
13
+ /** Timeout in ms for individual asset loads (sprite/map HTTP requests) */
14
+ declare const ASSET_LOAD_TIMEOUT_MS = 30000;
15
+
16
+ export { ASSET_LOAD_TIMEOUT_MS, DEFAULT_BLOCK_SIZE, DEFAULT_FPS, DEFAULT_UPDATE_RATE, FRAME_TIME_MS, LOADING_BAR_THROTTLE_MS, PAUSE_THRESHOLD_MS };
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/constants.ts
21
+ var constants_exports = {};
22
+ __export(constants_exports, {
23
+ ASSET_LOAD_TIMEOUT_MS: () => ASSET_LOAD_TIMEOUT_MS,
24
+ DEFAULT_BLOCK_SIZE: () => DEFAULT_BLOCK_SIZE,
25
+ DEFAULT_FPS: () => DEFAULT_FPS,
26
+ DEFAULT_UPDATE_RATE: () => DEFAULT_UPDATE_RATE,
27
+ FRAME_TIME_MS: () => FRAME_TIME_MS,
28
+ LOADING_BAR_THROTTLE_MS: () => LOADING_BAR_THROTTLE_MS,
29
+ PAUSE_THRESHOLD_MS: () => PAUSE_THRESHOLD_MS
30
+ });
31
+ module.exports = __toCommonJS(constants_exports);
32
+ var DEFAULT_FPS = 60;
33
+ var DEFAULT_UPDATE_RATE = 60;
34
+ var FRAME_TIME_MS = 1e3 / DEFAULT_FPS;
35
+ var PAUSE_THRESHOLD_MS = 160;
36
+ var DEFAULT_BLOCK_SIZE = 16;
37
+ var LOADING_BAR_THROTTLE_MS = 16;
38
+ var ASSET_LOAD_TIMEOUT_MS = 3e4;
39
+ // Annotate the CommonJS export names for ESM import in node:
40
+ 0 && (module.exports = {
41
+ ASSET_LOAD_TIMEOUT_MS,
42
+ DEFAULT_BLOCK_SIZE,
43
+ DEFAULT_FPS,
44
+ DEFAULT_UPDATE_RATE,
45
+ FRAME_TIME_MS,
46
+ LOADING_BAR_THROTTLE_MS,
47
+ PAUSE_THRESHOLD_MS
48
+ });
49
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants.ts"],"sourcesContent":["/** Default frames per second */\nexport const DEFAULT_FPS = 60;\n\n/** Default update rate (updates per second) */\nexport const DEFAULT_UPDATE_RATE = 60;\n\n/** Frame time in milliseconds at 60 FPS */\nexport const FRAME_TIME_MS = 1000 / DEFAULT_FPS;\n\n/** Threshold in ms to detect long pauses (tab switch, etc.) */\nexport const PAUSE_THRESHOLD_MS = 160;\n\n/** Default tile/block size in pixels */\nexport const DEFAULT_BLOCK_SIZE = 16;\n\n/** Minimum interval between loading bar redraws in ms (~60fps) */\nexport const LOADING_BAR_THROTTLE_MS = 16;\n\n/** Timeout in ms for individual asset loads (sprite/map HTTP requests) */\nexport const ASSET_LOAD_TIMEOUT_MS = 30_000;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;AACO,IAAMA,cAAc;AAGpB,IAAMC,sBAAsB;AAG5B,IAAMC,gBAAgB,MAAOF;AAG7B,IAAMG,qBAAqB;AAG3B,IAAMC,qBAAqB;AAG3B,IAAMC,0BAA0B;AAGhC,IAAMC,wBAAwB;","names":["DEFAULT_FPS","DEFAULT_UPDATE_RATE","FRAME_TIME_MS","PAUSE_THRESHOLD_MS","DEFAULT_BLOCK_SIZE","LOADING_BAR_THROTTLE_MS","ASSET_LOAD_TIMEOUT_MS"]}
@@ -0,0 +1,18 @@
1
+ // src/constants.ts
2
+ var DEFAULT_FPS = 60;
3
+ var DEFAULT_UPDATE_RATE = 60;
4
+ var FRAME_TIME_MS = 1e3 / DEFAULT_FPS;
5
+ var PAUSE_THRESHOLD_MS = 160;
6
+ var DEFAULT_BLOCK_SIZE = 16;
7
+ var LOADING_BAR_THROTTLE_MS = 16;
8
+ var ASSET_LOAD_TIMEOUT_MS = 3e4;
9
+ export {
10
+ ASSET_LOAD_TIMEOUT_MS,
11
+ DEFAULT_BLOCK_SIZE,
12
+ DEFAULT_FPS,
13
+ DEFAULT_UPDATE_RATE,
14
+ FRAME_TIME_MS,
15
+ LOADING_BAR_THROTTLE_MS,
16
+ PAUSE_THRESHOLD_MS
17
+ };
18
+ //# sourceMappingURL=constants.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants.ts"],"sourcesContent":["/** Default frames per second */\nexport const DEFAULT_FPS = 60;\n\n/** Default update rate (updates per second) */\nexport const DEFAULT_UPDATE_RATE = 60;\n\n/** Frame time in milliseconds at 60 FPS */\nexport const FRAME_TIME_MS = 1000 / DEFAULT_FPS;\n\n/** Threshold in ms to detect long pauses (tab switch, etc.) */\nexport const PAUSE_THRESHOLD_MS = 160;\n\n/** Default tile/block size in pixels */\nexport const DEFAULT_BLOCK_SIZE = 16;\n\n/** Minimum interval between loading bar redraws in ms (~60fps) */\nexport const LOADING_BAR_THROTTLE_MS = 16;\n\n/** Timeout in ms for individual asset loads (sprite/map HTTP requests) */\nexport const ASSET_LOAD_TIMEOUT_MS = 30_000;\n"],"mappings":";AACO,IAAMA,cAAc;AAGpB,IAAMC,sBAAsB;AAG5B,IAAMC,gBAAgB,MAAOF;AAG7B,IAAMG,qBAAqB;AAG3B,IAAMC,qBAAqB;AAG3B,IAAMC,0BAA0B;AAGhC,IAAMC,wBAAwB;","names":["DEFAULT_FPS","DEFAULT_UPDATE_RATE","FRAME_TIME_MS","PAUSE_THRESHOLD_MS","DEFAULT_BLOCK_SIZE","LOADING_BAR_THROTTLE_MS","ASSET_LOAD_TIMEOUT_MS"]}
@@ -0,0 +1,63 @@
1
+ import { Palette } from '@al8b/palette';
2
+ import { SceneManager, SceneDefinition } from '@al8b/scene';
3
+ import { L8BVM, GlobalAPI, MetaFunctions } from '@al8b/vm';
4
+ import { InputManager } from '../input/manager.mjs';
5
+ import { RuntimeListener, RuntimeOptions } from '../types/runtime.mjs';
6
+ import { RuntimeBridge, RuntimeSessionSnapshot, HostEvent, RuntimeSnapshot, RuntimeResetOptions, RuntimeSnapshotMeta } from '../types/bridge.mjs';
7
+ import { ObjectPool } from '../utils/object-pool.mjs';
8
+ import { PlayerService } from '@al8b/player';
9
+ import { RuntimeAssetsRegistry } from './assets-registry.mjs';
10
+ import { Screen } from '@al8b/screen';
11
+ import { AudioCore } from '@al8b/audio';
12
+ import { System } from '../system/api.mjs';
13
+ import '@al8b/input';
14
+ import '../types/assets.mjs';
15
+ import '@al8b/framework-shared';
16
+ import '@al8b/time';
17
+
18
+ interface RuntimeApiFactoryContext {
19
+ listener: RuntimeListener;
20
+ options: RuntimeOptions;
21
+ screen: Screen;
22
+ audio: AudioCore;
23
+ input: InputManager;
24
+ system: System;
25
+ playerService: PlayerService;
26
+ sceneManager: SceneManager;
27
+ assets: RuntimeAssetsRegistry;
28
+ bridge?: RuntimeBridge;
29
+ getVM: () => L8BVM | null;
30
+ getSessionSnapshot: () => RuntimeSessionSnapshot | null;
31
+ sendHostEvent: (event: HostEvent) => void;
32
+ sendHostRequest: (name: string, payload?: unknown, callback?: (result: unknown) => void) => string | null;
33
+ exportSnapshot: () => RuntimeSnapshot;
34
+ importSnapshot: (snapshot: RuntimeSnapshot) => Promise<void>;
35
+ resetRuntime: (options?: RuntimeResetOptions) => Promise<void>;
36
+ saveSnapshot: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;
37
+ loadSnapshot: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;
38
+ }
39
+ declare function createRuntimeMeta(context: RuntimeApiFactoryContext): Partial<MetaFunctions>;
40
+ declare function createRuntimeGlobalApi(context: RuntimeApiFactoryContext): Partial<GlobalAPI> & {
41
+ ObjectPool: typeof ObjectPool;
42
+ Palette: typeof Palette;
43
+ host: {
44
+ emit: (name: string, payload?: unknown) => void;
45
+ request: (name: string, payload?: unknown, callback?: (result: unknown) => void) => string | null;
46
+ };
47
+ session: {
48
+ user: () => RuntimeSessionSnapshot["user"];
49
+ player: () => RuntimeSessionSnapshot["player"];
50
+ game: () => RuntimeSessionSnapshot["game"];
51
+ room: () => RuntimeSessionSnapshot["room"];
52
+ };
53
+ memory: {
54
+ export: () => RuntimeSnapshot;
55
+ import: (snapshot: RuntimeSnapshot) => Promise<void>;
56
+ reset: (options?: RuntimeResetOptions) => Promise<void>;
57
+ save: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;
58
+ load: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;
59
+ };
60
+ };
61
+ declare function convertSceneDefinition(definition: SceneDefinition, vm: L8BVM | null, listener: RuntimeListener): SceneDefinition;
62
+
63
+ export { type RuntimeApiFactoryContext, convertSceneDefinition, createRuntimeGlobalApi, createRuntimeMeta };
@@ -0,0 +1,63 @@
1
+ import { Palette } from '@al8b/palette';
2
+ import { SceneManager, SceneDefinition } from '@al8b/scene';
3
+ import { L8BVM, GlobalAPI, MetaFunctions } from '@al8b/vm';
4
+ import { InputManager } from '../input/manager.js';
5
+ import { RuntimeListener, RuntimeOptions } from '../types/runtime.js';
6
+ import { RuntimeBridge, RuntimeSessionSnapshot, HostEvent, RuntimeSnapshot, RuntimeResetOptions, RuntimeSnapshotMeta } from '../types/bridge.js';
7
+ import { ObjectPool } from '../utils/object-pool.js';
8
+ import { PlayerService } from '@al8b/player';
9
+ import { RuntimeAssetsRegistry } from './assets-registry.js';
10
+ import { Screen } from '@al8b/screen';
11
+ import { AudioCore } from '@al8b/audio';
12
+ import { System } from '../system/api.js';
13
+ import '@al8b/input';
14
+ import '../types/assets.js';
15
+ import '@al8b/framework-shared';
16
+ import '@al8b/time';
17
+
18
+ interface RuntimeApiFactoryContext {
19
+ listener: RuntimeListener;
20
+ options: RuntimeOptions;
21
+ screen: Screen;
22
+ audio: AudioCore;
23
+ input: InputManager;
24
+ system: System;
25
+ playerService: PlayerService;
26
+ sceneManager: SceneManager;
27
+ assets: RuntimeAssetsRegistry;
28
+ bridge?: RuntimeBridge;
29
+ getVM: () => L8BVM | null;
30
+ getSessionSnapshot: () => RuntimeSessionSnapshot | null;
31
+ sendHostEvent: (event: HostEvent) => void;
32
+ sendHostRequest: (name: string, payload?: unknown, callback?: (result: unknown) => void) => string | null;
33
+ exportSnapshot: () => RuntimeSnapshot;
34
+ importSnapshot: (snapshot: RuntimeSnapshot) => Promise<void>;
35
+ resetRuntime: (options?: RuntimeResetOptions) => Promise<void>;
36
+ saveSnapshot: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;
37
+ loadSnapshot: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;
38
+ }
39
+ declare function createRuntimeMeta(context: RuntimeApiFactoryContext): Partial<MetaFunctions>;
40
+ declare function createRuntimeGlobalApi(context: RuntimeApiFactoryContext): Partial<GlobalAPI> & {
41
+ ObjectPool: typeof ObjectPool;
42
+ Palette: typeof Palette;
43
+ host: {
44
+ emit: (name: string, payload?: unknown) => void;
45
+ request: (name: string, payload?: unknown, callback?: (result: unknown) => void) => string | null;
46
+ };
47
+ session: {
48
+ user: () => RuntimeSessionSnapshot["user"];
49
+ player: () => RuntimeSessionSnapshot["player"];
50
+ game: () => RuntimeSessionSnapshot["game"];
51
+ room: () => RuntimeSessionSnapshot["room"];
52
+ };
53
+ memory: {
54
+ export: () => RuntimeSnapshot;
55
+ import: (snapshot: RuntimeSnapshot) => Promise<void>;
56
+ reset: (options?: RuntimeResetOptions) => Promise<void>;
57
+ save: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;
58
+ load: (meta?: RuntimeSnapshotMeta, callback?: (result: unknown) => void) => unknown;
59
+ };
60
+ };
61
+ declare function convertSceneDefinition(definition: SceneDefinition, vm: L8BVM | null, listener: RuntimeListener): SceneDefinition;
62
+
63
+ export { type RuntimeApiFactoryContext, convertSceneDefinition, createRuntimeGlobalApi, createRuntimeMeta };
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/core/api-factory.ts
22
+ var api_factory_exports = {};
23
+ __export(api_factory_exports, {
24
+ convertSceneDefinition: () => convertSceneDefinition,
25
+ createRuntimeGlobalApi: () => createRuntimeGlobalApi,
26
+ createRuntimeMeta: () => createRuntimeMeta
27
+ });
28
+ module.exports = __toCommonJS(api_factory_exports);
29
+ var import_palette = require("@al8b/palette");
30
+ var import_vm = require("@al8b/vm");
31
+
32
+ // src/assets/constructors.ts
33
+ var import_audio = require("@al8b/audio");
34
+ var import_map = require("@al8b/map");
35
+ var import_image = require("@al8b/image");
36
+ var import_sprites = require("@al8b/sprites");
37
+
38
+ // src/utils/object-pool.ts
39
+ var ObjectPool = class {
40
+ static {
41
+ __name(this, "ObjectPool");
42
+ }
43
+ pool = [];
44
+ factory;
45
+ reset;
46
+ maxSize;
47
+ /**
48
+ * Create a new object pool
49
+ *
50
+ * @param factory - Function to create new objects
51
+ * @param reset - Function to reset object state for reuse
52
+ * @param maxSize - Maximum pool size (default: 100)
53
+ */
54
+ constructor(factory, reset, maxSize = 100) {
55
+ this.factory = factory;
56
+ this.reset = reset;
57
+ this.maxSize = maxSize;
58
+ }
59
+ /**
60
+ * Acquire an object from the pool
61
+ *
62
+ * Returns a new object if pool is empty, otherwise reuses a pooled object.
63
+ *
64
+ * @returns Object from pool or newly created
65
+ */
66
+ acquire() {
67
+ if (this.pool.length > 0) {
68
+ return this.pool.pop();
69
+ }
70
+ return this.factory();
71
+ }
72
+ /**
73
+ * Release an object back to the pool
74
+ *
75
+ * Resets the object and adds it back to the pool for reuse.
76
+ * If pool is at max size, the object is discarded.
77
+ *
78
+ * @param obj - Object to release
79
+ */
80
+ release(obj) {
81
+ if (this.pool.length >= this.maxSize) {
82
+ return;
83
+ }
84
+ this.reset(obj);
85
+ this.pool.push(obj);
86
+ }
87
+ /**
88
+ * Clear all objects from the pool
89
+ */
90
+ clear() {
91
+ this.pool = [];
92
+ }
93
+ /**
94
+ * Get current pool size
95
+ *
96
+ * @returns Number of objects in pool
97
+ */
98
+ size() {
99
+ return this.pool.length;
100
+ }
101
+ /**
102
+ * Get maximum pool size
103
+ *
104
+ * @returns Maximum pool size
105
+ */
106
+ getMaxSize() {
107
+ return this.maxSize;
108
+ }
109
+ /**
110
+ * Set maximum pool size
111
+ *
112
+ * @param maxSize - New maximum pool size
113
+ */
114
+ setMaxSize(maxSize) {
115
+ this.maxSize = maxSize;
116
+ if (this.pool.length > maxSize) {
117
+ this.pool = this.pool.slice(0, maxSize);
118
+ }
119
+ }
120
+ };
121
+
122
+ // src/core/api-factory.ts
123
+ function createRuntimeMeta(context) {
124
+ return {
125
+ print: /* @__PURE__ */ __name((text) => {
126
+ const vm = context.getVM();
127
+ if ((typeof text === "object" || typeof text === "function") && vm) {
128
+ text = vm.toString(text);
129
+ }
130
+ if (context.listener.log) {
131
+ context.listener.log(String(text));
132
+ } else {
133
+ console.log(text);
134
+ }
135
+ }, "print")
136
+ };
137
+ }
138
+ __name(createRuntimeMeta, "createRuntimeMeta");
139
+ function createRuntimeGlobalApi(context) {
140
+ const inputStates = context.input.getStates();
141
+ const session = {
142
+ user: /* @__PURE__ */ __name(() => cloneValue(context.getSessionSnapshot()?.user ?? null), "user"),
143
+ player: /* @__PURE__ */ __name(() => cloneValue(context.getSessionSnapshot()?.player ?? null), "player"),
144
+ game: /* @__PURE__ */ __name(() => cloneValue(context.getSessionSnapshot()?.game ?? null), "game"),
145
+ room: /* @__PURE__ */ __name(() => cloneValue(context.getSessionSnapshot()?.room ?? null), "room")
146
+ };
147
+ const host = {
148
+ emit: /* @__PURE__ */ __name((name, payload) => {
149
+ context.sendHostEvent({
150
+ type: name,
151
+ payload,
152
+ source: "host"
153
+ });
154
+ }, "emit"),
155
+ request: /* @__PURE__ */ __name((name, payload, callback) => context.sendHostRequest(name, payload, callback), "request")
156
+ };
157
+ const memory = {
158
+ export: /* @__PURE__ */ __name(() => context.exportSnapshot(), "export"),
159
+ import: /* @__PURE__ */ __name((snapshot) => context.importSnapshot(snapshot), "import"),
160
+ reset: /* @__PURE__ */ __name((options) => context.resetRuntime(options), "reset"),
161
+ save: /* @__PURE__ */ __name((meta, callback) => context.saveSnapshot(meta, callback), "save"),
162
+ load: /* @__PURE__ */ __name((meta, callback) => context.loadSnapshot(meta, callback), "load")
163
+ };
164
+ return {
165
+ screen: context.screen.getInterface(),
166
+ audio: context.audio.getInterface(),
167
+ keyboard: inputStates.keyboard,
168
+ mouse: inputStates.mouse,
169
+ touch: inputStates.touch,
170
+ gamepad: inputStates.gamepad,
171
+ sprites: context.assets.sprites,
172
+ maps: context.assets.maps,
173
+ sounds: context.assets.sounds,
174
+ music: context.assets.music,
175
+ assets: context.assets.assets,
176
+ player: context.playerService.getInterface(),
177
+ host,
178
+ session,
179
+ memory,
180
+ 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
+ Image: import_image.Image,
188
+ Sprite: import_sprites.Sprite,
189
+ TileMap: import_map.TileMap,
190
+ Sound: import_audio.Sound,
191
+ Palette: import_palette.Palette,
192
+ Random: import_vm.Random,
193
+ ObjectPool
194
+ };
195
+ }
196
+ __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
+ function cloneValue(value) {
227
+ if (value == null) {
228
+ return value;
229
+ }
230
+ return JSON.parse(JSON.stringify(value));
231
+ }
232
+ __name(cloneValue, "cloneValue");
233
+ // Annotate the CommonJS export names for ESM import in node:
234
+ 0 && (module.exports = {
235
+ convertSceneDefinition,
236
+ createRuntimeGlobalApi,
237
+ createRuntimeMeta
238
+ });
239
+ //# sourceMappingURL=api-factory.js.map
@@ -0,0 +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"]}