@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,214 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/core/api-factory.ts
5
+ import { Palette } from "@al8b/palette";
6
+ import { Random, Routine } from "@al8b/vm";
7
+
8
+ // src/assets/constructors.ts
9
+ import { Sound } from "@al8b/audio";
10
+ import { TileMap } from "@al8b/map";
11
+ import { Image } from "@al8b/image";
12
+ import { Sprite } from "@al8b/sprites";
13
+
14
+ // src/utils/object-pool.ts
15
+ var ObjectPool = class {
16
+ static {
17
+ __name(this, "ObjectPool");
18
+ }
19
+ pool = [];
20
+ factory;
21
+ reset;
22
+ maxSize;
23
+ /**
24
+ * Create a new object pool
25
+ *
26
+ * @param factory - Function to create new objects
27
+ * @param reset - Function to reset object state for reuse
28
+ * @param maxSize - Maximum pool size (default: 100)
29
+ */
30
+ constructor(factory, reset, maxSize = 100) {
31
+ this.factory = factory;
32
+ this.reset = reset;
33
+ this.maxSize = maxSize;
34
+ }
35
+ /**
36
+ * Acquire an object from the pool
37
+ *
38
+ * Returns a new object if pool is empty, otherwise reuses a pooled object.
39
+ *
40
+ * @returns Object from pool or newly created
41
+ */
42
+ acquire() {
43
+ if (this.pool.length > 0) {
44
+ return this.pool.pop();
45
+ }
46
+ return this.factory();
47
+ }
48
+ /**
49
+ * Release an object back to the pool
50
+ *
51
+ * Resets the object and adds it back to the pool for reuse.
52
+ * If pool is at max size, the object is discarded.
53
+ *
54
+ * @param obj - Object to release
55
+ */
56
+ release(obj) {
57
+ if (this.pool.length >= this.maxSize) {
58
+ return;
59
+ }
60
+ this.reset(obj);
61
+ this.pool.push(obj);
62
+ }
63
+ /**
64
+ * Clear all objects from the pool
65
+ */
66
+ clear() {
67
+ this.pool = [];
68
+ }
69
+ /**
70
+ * Get current pool size
71
+ *
72
+ * @returns Number of objects in pool
73
+ */
74
+ size() {
75
+ return this.pool.length;
76
+ }
77
+ /**
78
+ * Get maximum pool size
79
+ *
80
+ * @returns Maximum pool size
81
+ */
82
+ getMaxSize() {
83
+ return this.maxSize;
84
+ }
85
+ /**
86
+ * Set maximum pool size
87
+ *
88
+ * @param maxSize - New maximum pool size
89
+ */
90
+ setMaxSize(maxSize) {
91
+ this.maxSize = maxSize;
92
+ if (this.pool.length > maxSize) {
93
+ this.pool = this.pool.slice(0, maxSize);
94
+ }
95
+ }
96
+ };
97
+
98
+ // src/core/api-factory.ts
99
+ function createRuntimeMeta(context) {
100
+ return {
101
+ print: /* @__PURE__ */ __name((text) => {
102
+ const vm = context.getVM();
103
+ if ((typeof text === "object" || typeof text === "function") && vm) {
104
+ text = vm.toString(text);
105
+ }
106
+ if (context.listener.log) {
107
+ context.listener.log(String(text));
108
+ } else {
109
+ console.log(text);
110
+ }
111
+ }, "print")
112
+ };
113
+ }
114
+ __name(createRuntimeMeta, "createRuntimeMeta");
115
+ function createRuntimeGlobalApi(context) {
116
+ const inputStates = context.input.getStates();
117
+ const session = {
118
+ user: /* @__PURE__ */ __name(() => cloneValue(context.getSessionSnapshot()?.user ?? null), "user"),
119
+ player: /* @__PURE__ */ __name(() => cloneValue(context.getSessionSnapshot()?.player ?? null), "player"),
120
+ game: /* @__PURE__ */ __name(() => cloneValue(context.getSessionSnapshot()?.game ?? null), "game"),
121
+ room: /* @__PURE__ */ __name(() => cloneValue(context.getSessionSnapshot()?.room ?? null), "room")
122
+ };
123
+ const host = {
124
+ emit: /* @__PURE__ */ __name((name, payload) => {
125
+ context.sendHostEvent({
126
+ type: name,
127
+ payload,
128
+ source: "host"
129
+ });
130
+ }, "emit"),
131
+ request: /* @__PURE__ */ __name((name, payload, callback) => context.sendHostRequest(name, payload, callback), "request")
132
+ };
133
+ const memory = {
134
+ export: /* @__PURE__ */ __name(() => context.exportSnapshot(), "export"),
135
+ import: /* @__PURE__ */ __name((snapshot) => context.importSnapshot(snapshot), "import"),
136
+ reset: /* @__PURE__ */ __name((options) => context.resetRuntime(options), "reset"),
137
+ save: /* @__PURE__ */ __name((meta, callback) => context.saveSnapshot(meta, callback), "save"),
138
+ load: /* @__PURE__ */ __name((meta, callback) => context.loadSnapshot(meta, callback), "load")
139
+ };
140
+ return {
141
+ screen: context.screen.getInterface(),
142
+ audio: context.audio.getInterface(),
143
+ keyboard: inputStates.keyboard,
144
+ mouse: inputStates.mouse,
145
+ touch: inputStates.touch,
146
+ gamepad: inputStates.gamepad,
147
+ sprites: context.assets.sprites,
148
+ maps: context.assets.maps,
149
+ sounds: context.assets.sounds,
150
+ music: context.assets.music,
151
+ assets: context.assets.assets,
152
+ player: context.playerService.getInterface(),
153
+ host,
154
+ session,
155
+ memory,
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
+ Image,
164
+ Sprite,
165
+ TileMap,
166
+ Sound,
167
+ Palette,
168
+ Random,
169
+ ObjectPool
170
+ };
171
+ }
172
+ __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
+ function cloneValue(value) {
203
+ if (value == null) {
204
+ return value;
205
+ }
206
+ return JSON.parse(JSON.stringify(value));
207
+ }
208
+ __name(cloneValue, "cloneValue");
209
+ export {
210
+ convertSceneDefinition,
211
+ createRuntimeGlobalApi,
212
+ createRuntimeMeta
213
+ };
214
+ //# sourceMappingURL=api-factory.mjs.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":["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"]}
@@ -0,0 +1,14 @@
1
+ import { AssetCollections } from '../types/assets.mjs';
2
+
3
+ declare class RuntimeAssetsRegistry {
4
+ private collections;
5
+ replace(collections: AssetCollections): void;
6
+ getCollections(): AssetCollections;
7
+ get sprites(): AssetCollections["sprites"];
8
+ get maps(): AssetCollections["maps"];
9
+ get sounds(): AssetCollections["sounds"];
10
+ get music(): AssetCollections["music"];
11
+ get assets(): AssetCollections["assets"];
12
+ }
13
+
14
+ export { RuntimeAssetsRegistry };
@@ -0,0 +1,14 @@
1
+ import { AssetCollections } from '../types/assets.js';
2
+
3
+ declare class RuntimeAssetsRegistry {
4
+ private collections;
5
+ replace(collections: AssetCollections): void;
6
+ getCollections(): AssetCollections;
7
+ get sprites(): AssetCollections["sprites"];
8
+ get maps(): AssetCollections["maps"];
9
+ get sounds(): AssetCollections["sounds"];
10
+ get music(): AssetCollections["music"];
11
+ get assets(): AssetCollections["assets"];
12
+ }
13
+
14
+ export { RuntimeAssetsRegistry };
@@ -0,0 +1,64 @@
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/assets-registry.ts
22
+ var assets_registry_exports = {};
23
+ __export(assets_registry_exports, {
24
+ RuntimeAssetsRegistry: () => RuntimeAssetsRegistry
25
+ });
26
+ module.exports = __toCommonJS(assets_registry_exports);
27
+ var RuntimeAssetsRegistry = class {
28
+ static {
29
+ __name(this, "RuntimeAssetsRegistry");
30
+ }
31
+ collections = {
32
+ sprites: {},
33
+ maps: {},
34
+ sounds: {},
35
+ music: {},
36
+ assets: {}
37
+ };
38
+ replace(collections) {
39
+ this.collections = collections;
40
+ }
41
+ getCollections() {
42
+ return this.collections;
43
+ }
44
+ get sprites() {
45
+ return this.collections.sprites;
46
+ }
47
+ get maps() {
48
+ return this.collections.maps;
49
+ }
50
+ get sounds() {
51
+ return this.collections.sounds;
52
+ }
53
+ get music() {
54
+ return this.collections.music;
55
+ }
56
+ get assets() {
57
+ return this.collections.assets;
58
+ }
59
+ };
60
+ // Annotate the CommonJS export names for ESM import in node:
61
+ 0 && (module.exports = {
62
+ RuntimeAssetsRegistry
63
+ });
64
+ //# sourceMappingURL=assets-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/assets-registry.ts"],"sourcesContent":["import type { AssetCollections } from \"../types\";\n\nexport class RuntimeAssetsRegistry {\n\tprivate collections: AssetCollections = {\n\t\tsprites: {},\n\t\tmaps: {},\n\t\tsounds: {},\n\t\tmusic: {},\n\t\tassets: {},\n\t};\n\n\treplace(collections: AssetCollections): void {\n\t\tthis.collections = collections;\n\t}\n\n\tgetCollections(): AssetCollections {\n\t\treturn this.collections;\n\t}\n\n\tget sprites(): AssetCollections[\"sprites\"] {\n\t\treturn this.collections.sprites;\n\t}\n\n\tget maps(): AssetCollections[\"maps\"] {\n\t\treturn this.collections.maps;\n\t}\n\n\tget sounds(): AssetCollections[\"sounds\"] {\n\t\treturn this.collections.sounds;\n\t}\n\n\tget music(): AssetCollections[\"music\"] {\n\t\treturn this.collections.music;\n\t}\n\n\tget assets(): AssetCollections[\"assets\"] {\n\t\treturn this.collections.assets;\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAEA;;;;;AAAO,IAAMA,wBAAN,MAAMA;EAAb,OAAaA;;;EACJC,cAAgC;IACvCC,SAAS,CAAC;IACVC,MAAM,CAAC;IACPC,QAAQ,CAAC;IACTC,OAAO,CAAC;IACRC,QAAQ,CAAC;EACV;EAEAC,QAAQN,aAAqC;AAC5C,SAAKA,cAAcA;EACpB;EAEAO,iBAAmC;AAClC,WAAO,KAAKP;EACb;EAEA,IAAIC,UAAuC;AAC1C,WAAO,KAAKD,YAAYC;EACzB;EAEA,IAAIC,OAAiC;AACpC,WAAO,KAAKF,YAAYE;EACzB;EAEA,IAAIC,SAAqC;AACxC,WAAO,KAAKH,YAAYG;EACzB;EAEA,IAAIC,QAAmC;AACtC,WAAO,KAAKJ,YAAYI;EACzB;EAEA,IAAIC,SAAqC;AACxC,WAAO,KAAKL,YAAYK;EACzB;AACD;","names":["RuntimeAssetsRegistry","collections","sprites","maps","sounds","music","assets","replace","getCollections"]}
@@ -0,0 +1,41 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/core/assets-registry.ts
5
+ var RuntimeAssetsRegistry = class {
6
+ static {
7
+ __name(this, "RuntimeAssetsRegistry");
8
+ }
9
+ collections = {
10
+ sprites: {},
11
+ maps: {},
12
+ sounds: {},
13
+ music: {},
14
+ assets: {}
15
+ };
16
+ replace(collections) {
17
+ this.collections = collections;
18
+ }
19
+ getCollections() {
20
+ return this.collections;
21
+ }
22
+ get sprites() {
23
+ return this.collections.sprites;
24
+ }
25
+ get maps() {
26
+ return this.collections.maps;
27
+ }
28
+ get sounds() {
29
+ return this.collections.sounds;
30
+ }
31
+ get music() {
32
+ return this.collections.music;
33
+ }
34
+ get assets() {
35
+ return this.collections.assets;
36
+ }
37
+ };
38
+ export {
39
+ RuntimeAssetsRegistry
40
+ };
41
+ //# sourceMappingURL=assets-registry.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/assets-registry.ts"],"sourcesContent":["import type { AssetCollections } from \"../types\";\n\nexport class RuntimeAssetsRegistry {\n\tprivate collections: AssetCollections = {\n\t\tsprites: {},\n\t\tmaps: {},\n\t\tsounds: {},\n\t\tmusic: {},\n\t\tassets: {},\n\t};\n\n\treplace(collections: AssetCollections): void {\n\t\tthis.collections = collections;\n\t}\n\n\tgetCollections(): AssetCollections {\n\t\treturn this.collections;\n\t}\n\n\tget sprites(): AssetCollections[\"sprites\"] {\n\t\treturn this.collections.sprites;\n\t}\n\n\tget maps(): AssetCollections[\"maps\"] {\n\t\treturn this.collections.maps;\n\t}\n\n\tget sounds(): AssetCollections[\"sounds\"] {\n\t\treturn this.collections.sounds;\n\t}\n\n\tget music(): AssetCollections[\"music\"] {\n\t\treturn this.collections.music;\n\t}\n\n\tget assets(): AssetCollections[\"assets\"] {\n\t\treturn this.collections.assets;\n\t}\n}\n"],"mappings":";;;;AAEO,IAAMA,wBAAN,MAAMA;EAAb,OAAaA;;;EACJC,cAAgC;IACvCC,SAAS,CAAC;IACVC,MAAM,CAAC;IACPC,QAAQ,CAAC;IACTC,OAAO,CAAC;IACRC,QAAQ,CAAC;EACV;EAEAC,QAAQN,aAAqC;AAC5C,SAAKA,cAAcA;EACpB;EAEAO,iBAAmC;AAClC,WAAO,KAAKP;EACb;EAEA,IAAIC,UAAuC;AAC1C,WAAO,KAAKD,YAAYC;EACzB;EAEA,IAAIC,OAAiC;AACpC,WAAO,KAAKF,YAAYE;EACzB;EAEA,IAAIC,SAAqC;AACxC,WAAO,KAAKH,YAAYG;EACzB;EAEA,IAAIC,QAAmC;AACtC,WAAO,KAAKJ,YAAYI;EACzB;EAEA,IAAIC,SAAqC;AACxC,WAAO,KAAKL,YAAYK;EACzB;AACD;","names":["RuntimeAssetsRegistry","collections","sprites","maps","sounds","music","assets","replace","getCollections"]}
@@ -0,0 +1,109 @@
1
+ import { AudioCore } from '@al8b/audio';
2
+ import { PlayerService } from '@al8b/player';
3
+ import { SceneManager } from '@al8b/scene';
4
+ import { Screen } from '@al8b/screen';
5
+ import { TimeMachine } from '@al8b/time';
6
+ import { L8BVM } from '@al8b/vm';
7
+ import { InputManager } from '../input/manager.mjs';
8
+ import { System } from '../system/api.mjs';
9
+ import { RuntimeOptions } from '../types/runtime.mjs';
10
+ import { RuntimeResetOptions, RuntimeSnapshot, HostEvent, RuntimeSessionSnapshot } from '../types/bridge.mjs';
11
+ import '@al8b/input';
12
+ import '../types/assets.mjs';
13
+ import '@al8b/framework-shared';
14
+
15
+ interface RuntimeController {
16
+ readonly screen: Screen;
17
+ readonly audio: AudioCore;
18
+ readonly input: InputManager;
19
+ readonly system: System;
20
+ readonly playerService: PlayerService;
21
+ readonly sceneManager: SceneManager;
22
+ readonly vm: L8BVM | null;
23
+ readonly timeMachine: TimeMachine | null;
24
+ readonly sprites: Record<string, any>;
25
+ readonly maps: Record<string, any>;
26
+ readonly sounds: Record<string, any>;
27
+ readonly music: Record<string, any>;
28
+ readonly assets: Record<string, any>;
29
+ readonly stopped: boolean;
30
+ start(): Promise<void>;
31
+ stop(): void;
32
+ resume(): void;
33
+ reset(options?: RuntimeResetOptions): Promise<void>;
34
+ exportSnapshot(): RuntimeSnapshot;
35
+ importSnapshot(snapshot: RuntimeSnapshot): Promise<void>;
36
+ updateSource(file: string, src: string, reinit?: boolean): boolean;
37
+ handleMessage(message: any): void;
38
+ sendHostEvent(event: HostEvent): void;
39
+ getCanvas(): HTMLCanvasElement;
40
+ getSession(): RuntimeSessionSnapshot | null;
41
+ }
42
+ declare function createRuntime(options?: RuntimeOptions): RuntimeController;
43
+ declare class RuntimeControllerImpl implements RuntimeController {
44
+ private readonly options;
45
+ private readonly listener;
46
+ private readonly assetRegistry;
47
+ private readonly assetLoader;
48
+ private readonly debugLogger;
49
+ private readonly DEBUG_UPDATE_FREQUENCY;
50
+ private readonly snapshotRestorer;
51
+ private bridgeUnsubscribe;
52
+ private sourceUpdater;
53
+ private gameLoop;
54
+ private frameCount;
55
+ private lastUpdateRate;
56
+ private isStopped;
57
+ private preserveStorageOnNextBoot;
58
+ private sessionSnapshot;
59
+ readonly screen: Screen;
60
+ readonly audio: AudioCore;
61
+ readonly input: InputManager;
62
+ readonly system: System;
63
+ readonly playerService: PlayerService;
64
+ readonly sceneManager: SceneManager;
65
+ vm: L8BVM | null;
66
+ timeMachine: TimeMachine | null;
67
+ constructor(options?: RuntimeOptions);
68
+ get sprites(): Record<string, any>;
69
+ get maps(): Record<string, any>;
70
+ get sounds(): Record<string, any>;
71
+ get music(): Record<string, any>;
72
+ get assets(): Record<string, any>;
73
+ get stopped(): boolean;
74
+ getSession(): RuntimeSessionSnapshot | null;
75
+ start(): Promise<void>;
76
+ stop(): void;
77
+ resume(): void;
78
+ reset(options?: RuntimeResetOptions): Promise<void>;
79
+ exportSnapshot(): RuntimeSnapshot;
80
+ importSnapshot(snapshot: RuntimeSnapshot): Promise<void>;
81
+ updateSource(file: string, src: string, reinit?: boolean): boolean;
82
+ handleMessage(message: any): void;
83
+ sendHostEvent(event: HostEvent): void;
84
+ getCanvas(): HTMLCanvasElement;
85
+ private loadAssets;
86
+ private waitForAssetsReady;
87
+ private initializeVM;
88
+ private loadPrograms;
89
+ private initializeScenesAndRouter;
90
+ private startGameLoop;
91
+ private updateGameLoopUpdateRate;
92
+ private handleUpdate;
93
+ private handleDraw;
94
+ private handleTick;
95
+ private handleWatchStep;
96
+ private ensureBridgeSubscription;
97
+ private handleHostEvent;
98
+ private emitPlayerMessage;
99
+ private emitBridgeEvent;
100
+ private sendBridgeRequest;
101
+ private saveSnapshot;
102
+ private loadSnapshot;
103
+ private hydrateSession;
104
+ private mergeSession;
105
+ private teardownRuntimeState;
106
+ private logStep;
107
+ }
108
+
109
+ export { type RuntimeController, RuntimeControllerImpl, createRuntime };
@@ -0,0 +1,109 @@
1
+ import { AudioCore } from '@al8b/audio';
2
+ import { PlayerService } from '@al8b/player';
3
+ import { SceneManager } from '@al8b/scene';
4
+ import { Screen } from '@al8b/screen';
5
+ import { TimeMachine } from '@al8b/time';
6
+ import { L8BVM } from '@al8b/vm';
7
+ import { InputManager } from '../input/manager.js';
8
+ import { System } from '../system/api.js';
9
+ import { RuntimeOptions } from '../types/runtime.js';
10
+ import { RuntimeResetOptions, RuntimeSnapshot, HostEvent, RuntimeSessionSnapshot } from '../types/bridge.js';
11
+ import '@al8b/input';
12
+ import '../types/assets.js';
13
+ import '@al8b/framework-shared';
14
+
15
+ interface RuntimeController {
16
+ readonly screen: Screen;
17
+ readonly audio: AudioCore;
18
+ readonly input: InputManager;
19
+ readonly system: System;
20
+ readonly playerService: PlayerService;
21
+ readonly sceneManager: SceneManager;
22
+ readonly vm: L8BVM | null;
23
+ readonly timeMachine: TimeMachine | null;
24
+ readonly sprites: Record<string, any>;
25
+ readonly maps: Record<string, any>;
26
+ readonly sounds: Record<string, any>;
27
+ readonly music: Record<string, any>;
28
+ readonly assets: Record<string, any>;
29
+ readonly stopped: boolean;
30
+ start(): Promise<void>;
31
+ stop(): void;
32
+ resume(): void;
33
+ reset(options?: RuntimeResetOptions): Promise<void>;
34
+ exportSnapshot(): RuntimeSnapshot;
35
+ importSnapshot(snapshot: RuntimeSnapshot): Promise<void>;
36
+ updateSource(file: string, src: string, reinit?: boolean): boolean;
37
+ handleMessage(message: any): void;
38
+ sendHostEvent(event: HostEvent): void;
39
+ getCanvas(): HTMLCanvasElement;
40
+ getSession(): RuntimeSessionSnapshot | null;
41
+ }
42
+ declare function createRuntime(options?: RuntimeOptions): RuntimeController;
43
+ declare class RuntimeControllerImpl implements RuntimeController {
44
+ private readonly options;
45
+ private readonly listener;
46
+ private readonly assetRegistry;
47
+ private readonly assetLoader;
48
+ private readonly debugLogger;
49
+ private readonly DEBUG_UPDATE_FREQUENCY;
50
+ private readonly snapshotRestorer;
51
+ private bridgeUnsubscribe;
52
+ private sourceUpdater;
53
+ private gameLoop;
54
+ private frameCount;
55
+ private lastUpdateRate;
56
+ private isStopped;
57
+ private preserveStorageOnNextBoot;
58
+ private sessionSnapshot;
59
+ readonly screen: Screen;
60
+ readonly audio: AudioCore;
61
+ readonly input: InputManager;
62
+ readonly system: System;
63
+ readonly playerService: PlayerService;
64
+ readonly sceneManager: SceneManager;
65
+ vm: L8BVM | null;
66
+ timeMachine: TimeMachine | null;
67
+ constructor(options?: RuntimeOptions);
68
+ get sprites(): Record<string, any>;
69
+ get maps(): Record<string, any>;
70
+ get sounds(): Record<string, any>;
71
+ get music(): Record<string, any>;
72
+ get assets(): Record<string, any>;
73
+ get stopped(): boolean;
74
+ getSession(): RuntimeSessionSnapshot | null;
75
+ start(): Promise<void>;
76
+ stop(): void;
77
+ resume(): void;
78
+ reset(options?: RuntimeResetOptions): Promise<void>;
79
+ exportSnapshot(): RuntimeSnapshot;
80
+ importSnapshot(snapshot: RuntimeSnapshot): Promise<void>;
81
+ updateSource(file: string, src: string, reinit?: boolean): boolean;
82
+ handleMessage(message: any): void;
83
+ sendHostEvent(event: HostEvent): void;
84
+ getCanvas(): HTMLCanvasElement;
85
+ private loadAssets;
86
+ private waitForAssetsReady;
87
+ private initializeVM;
88
+ private loadPrograms;
89
+ private initializeScenesAndRouter;
90
+ private startGameLoop;
91
+ private updateGameLoopUpdateRate;
92
+ private handleUpdate;
93
+ private handleDraw;
94
+ private handleTick;
95
+ private handleWatchStep;
96
+ private ensureBridgeSubscription;
97
+ private handleHostEvent;
98
+ private emitPlayerMessage;
99
+ private emitBridgeEvent;
100
+ private sendBridgeRequest;
101
+ private saveSnapshot;
102
+ private loadSnapshot;
103
+ private hydrateSession;
104
+ private mergeSession;
105
+ private teardownRuntimeState;
106
+ private logStep;
107
+ }
108
+
109
+ export { type RuntimeController, RuntimeControllerImpl, createRuntime };