rn-gamekit 0.1.0 → 0.2.1

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 (601) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/README.md +97 -16
  3. package/lib/module/assets/defineAssets.js +28 -3
  4. package/lib/module/assets/defineAssets.js.map +1 -1
  5. package/lib/module/assets.js +11 -0
  6. package/lib/module/assets.js.map +1 -0
  7. package/lib/module/audio/createGameAudio.js +784 -0
  8. package/lib/module/audio/createGameAudio.js.map +1 -0
  9. package/lib/module/audio/errors.js +12 -0
  10. package/lib/module/audio/errors.js.map +1 -0
  11. package/lib/module/audio/index.js +5 -0
  12. package/lib/module/audio/index.js.map +1 -0
  13. package/lib/module/audio/resolver.js +37 -0
  14. package/lib/module/audio/resolver.js.map +1 -0
  15. package/lib/module/audio/types.js +4 -0
  16. package/lib/module/audio/types.js.map +1 -0
  17. package/lib/module/audio.js +9 -0
  18. package/lib/module/audio.js.map +1 -0
  19. package/lib/module/camera2d/bounds.js +59 -0
  20. package/lib/module/camera2d/bounds.js.map +1 -0
  21. package/lib/module/camera2d/extents.js +25 -0
  22. package/lib/module/camera2d/extents.js.map +1 -0
  23. package/lib/module/camera2d/follow.js +138 -0
  24. package/lib/module/camera2d/follow.js.map +1 -0
  25. package/lib/module/camera2d/index.js +20 -0
  26. package/lib/module/camera2d/index.js.map +1 -0
  27. package/lib/module/camera2d/interpolation.js +98 -0
  28. package/lib/module/camera2d/interpolation.js.map +1 -0
  29. package/lib/module/camera2d/shake.js +85 -0
  30. package/lib/module/camera2d/shake.js.map +1 -0
  31. package/lib/module/camera2d/transform.js +151 -0
  32. package/lib/module/camera2d/transform.js.map +1 -0
  33. package/lib/module/camera2d/types.js +4 -0
  34. package/lib/module/camera2d/types.js.map +1 -0
  35. package/lib/module/camera2d/validation.js +98 -0
  36. package/lib/module/camera2d/validation.js.map +1 -0
  37. package/lib/module/camera2d/visibility.js +138 -0
  38. package/lib/module/camera2d/visibility.js.map +1 -0
  39. package/lib/module/camera2d.js +9 -0
  40. package/lib/module/camera2d.js.map +1 -0
  41. package/lib/module/collision2d/colliders.js +266 -0
  42. package/lib/module/collision2d/colliders.js.map +1 -0
  43. package/lib/module/collision2d/debug.js +105 -0
  44. package/lib/module/collision2d/debug.js.map +1 -0
  45. package/lib/module/collision2d/filters.js +40 -0
  46. package/lib/module/collision2d/filters.js.map +1 -0
  47. package/lib/module/collision2d/index.js +12 -0
  48. package/lib/module/collision2d/index.js.map +1 -0
  49. package/lib/module/collision2d/intersections.js +67 -0
  50. package/lib/module/collision2d/intersections.js.map +1 -0
  51. package/lib/module/collision2d/manifolds.js +218 -0
  52. package/lib/module/collision2d/manifolds.js.map +1 -0
  53. package/lib/module/collision2d/segments.js +187 -0
  54. package/lib/module/collision2d/segments.js.map +1 -0
  55. package/lib/module/collision2d/spatialHash.js +167 -0
  56. package/lib/module/collision2d/spatialHash.js.map +1 -0
  57. package/lib/module/collision2d/sweeps.js +255 -0
  58. package/lib/module/collision2d/sweeps.js.map +1 -0
  59. package/lib/module/collision2d.js +9 -0
  60. package/lib/module/collision2d.js.map +1 -0
  61. package/lib/module/core/input/buttonPad.js +214 -0
  62. package/lib/module/core/input/buttonPad.js.map +1 -0
  63. package/lib/module/core/input/createInputBuffer.js +66 -14
  64. package/lib/module/core/input/createInputBuffer.js.map +1 -1
  65. package/lib/module/core/session/createGameSession.js +454 -50
  66. package/lib/module/core/session/createGameSession.js.map +1 -1
  67. package/lib/module/core/session/deepFreeze.js +92 -2
  68. package/lib/module/core/session/deepFreeze.js.map +1 -1
  69. package/lib/module/core/session/types.js +12 -0
  70. package/lib/module/core/session/types.js.map +1 -1
  71. package/lib/module/definition/defineGame.js +23 -0
  72. package/lib/module/definition/defineGame.js.map +1 -1
  73. package/lib/module/events/defineGameEvents.js +46 -0
  74. package/lib/module/events/defineGameEvents.js.map +1 -0
  75. package/lib/module/events/errors.js +16 -0
  76. package/lib/module/events/errors.js.map +1 -0
  77. package/lib/module/events/index.js +7 -0
  78. package/lib/module/events/index.js.map +1 -0
  79. package/lib/module/events/payload.js +219 -0
  80. package/lib/module/events/payload.js.map +1 -0
  81. package/lib/module/events/seed.js +33 -0
  82. package/lib/module/events/seed.js.map +1 -0
  83. package/lib/module/events/types.js +4 -0
  84. package/lib/module/events/types.js.map +1 -0
  85. package/lib/module/events.js +13 -0
  86. package/lib/module/events.js.map +1 -0
  87. package/lib/module/geometry/helpers.js +140 -0
  88. package/lib/module/geometry/helpers.js.map +1 -0
  89. package/lib/module/geometry/index.js +5 -0
  90. package/lib/module/geometry/index.js.map +1 -0
  91. package/lib/module/geometry/validation.js +104 -0
  92. package/lib/module/geometry/validation.js.map +1 -0
  93. package/lib/module/geometry.js +9 -0
  94. package/lib/module/geometry.js.map +1 -0
  95. package/lib/module/haptics/createGameHaptics.js +214 -0
  96. package/lib/module/haptics/createGameHaptics.js.map +1 -0
  97. package/lib/module/haptics/errors.js +12 -0
  98. package/lib/module/haptics/errors.js.map +1 -0
  99. package/lib/module/haptics/index.js +5 -0
  100. package/lib/module/haptics/index.js.map +1 -0
  101. package/lib/module/haptics/resolver.js +37 -0
  102. package/lib/module/haptics/resolver.js.map +1 -0
  103. package/lib/module/haptics/types.js +4 -0
  104. package/lib/module/haptics/types.js.map +1 -0
  105. package/lib/module/haptics.js +9 -0
  106. package/lib/module/haptics.js.map +1 -0
  107. package/lib/module/index.js +8 -1
  108. package/lib/module/index.js.map +1 -1
  109. package/lib/module/particles/createParticleSystem.js +481 -0
  110. package/lib/module/particles/createParticleSystem.js.map +1 -0
  111. package/lib/module/particles/defineParticleEffect.js +178 -0
  112. package/lib/module/particles/defineParticleEffect.js.map +1 -0
  113. package/lib/module/particles/errors.js +9 -0
  114. package/lib/module/particles/errors.js.map +1 -0
  115. package/lib/module/particles/index.js +8 -0
  116. package/lib/module/particles/index.js.map +1 -0
  117. package/lib/module/particles/sampling.js +121 -0
  118. package/lib/module/particles/sampling.js.map +1 -0
  119. package/lib/module/particles/types.js +4 -0
  120. package/lib/module/particles/types.js.map +1 -0
  121. package/lib/module/particles.js +4 -0
  122. package/lib/module/particles.js.map +1 -0
  123. package/lib/module/react/GameButtonPad.js +344 -0
  124. package/lib/module/react/GameButtonPad.js.map +1 -0
  125. package/lib/module/react/GamePointerInput.js +74 -16
  126. package/lib/module/react/GamePointerInput.js.map +1 -1
  127. package/lib/module/react/GameView.js +139 -60
  128. package/lib/module/react/GameView.js.map +1 -1
  129. package/lib/module/react/assets/createGameAssetStore.js +145 -95
  130. package/lib/module/react/assets/createGameAssetStore.js.map +1 -1
  131. package/lib/module/react/assets/useGameAssets.js +60 -35
  132. package/lib/module/react/assets/useGameAssets.js.map +1 -1
  133. package/lib/module/react/bindAppLifecycle.js +46 -17
  134. package/lib/module/react/bindAppLifecycle.js.map +1 -1
  135. package/lib/module/react/bindGameSession.js +13 -2
  136. package/lib/module/react/bindGameSession.js.map +1 -1
  137. package/lib/module/react/camera2d/GameLayer2D.js +50 -0
  138. package/lib/module/react/camera2d/GameLayer2D.js.map +1 -0
  139. package/lib/module/react/camera2d/defineGameCamera2D.js +30 -0
  140. package/lib/module/react/camera2d/defineGameCamera2D.js.map +1 -0
  141. package/lib/module/react/camera2d/usePresentedCameraBinding.js +177 -0
  142. package/lib/module/react/camera2d/usePresentedCameraBinding.js.map +1 -0
  143. package/lib/module/react/cleanupList.js +38 -0
  144. package/lib/module/react/cleanupList.js.map +1 -0
  145. package/lib/module/react/lifecycleSource.js +49 -0
  146. package/lib/module/react/lifecycleSource.js.map +1 -0
  147. package/lib/module/react/particles/ParticleView.js +308 -0
  148. package/lib/module/react/particles/ParticleView.js.map +1 -0
  149. package/lib/module/react/particles/culling.js +115 -0
  150. package/lib/module/react/particles/culling.js.map +1 -0
  151. package/lib/module/react/particles/index.js +7 -0
  152. package/lib/module/react/particles/index.js.map +1 -0
  153. package/lib/module/react/particles/spriteXForm.js +45 -0
  154. package/lib/module/react/particles/spriteXForm.js.map +1 -0
  155. package/lib/module/react/particles/useParticlePresentation.js +204 -0
  156. package/lib/module/react/particles/useParticlePresentation.js.map +1 -0
  157. package/lib/module/react/pointerBinding.js +55 -17
  158. package/lib/module/react/pointerBinding.js.map +1 -1
  159. package/lib/module/react/pointerCamera.js +28 -0
  160. package/lib/module/react/pointerCamera.js.map +1 -0
  161. package/lib/module/react/pointerCoalescer.js +16 -9
  162. package/lib/module/react/pointerCoalescer.js.map +1 -1
  163. package/lib/module/react/sprites/GameSprite.js +5 -17
  164. package/lib/module/react/sprites/GameSprite.js.map +1 -1
  165. package/lib/module/react/sprites/GameWorld2D.js +112 -9
  166. package/lib/module/react/sprites/GameWorld2D.js.map +1 -1
  167. package/lib/module/react/sprites/Sprite.js +48 -63
  168. package/lib/module/react/sprites/Sprite.js.map +1 -1
  169. package/lib/module/react/sprites/SpriteBatch.js +53 -28
  170. package/lib/module/react/sprites/SpriteBatch.js.map +1 -1
  171. package/lib/module/react/sprites/batchVisibility.js +58 -0
  172. package/lib/module/react/sprites/batchVisibility.js.map +1 -0
  173. package/lib/module/react/sprites/spriteSelection.js +103 -0
  174. package/lib/module/react/sprites/spriteSelection.js.map +1 -0
  175. package/lib/module/react/sprites/spriteTransform.js +46 -25
  176. package/lib/module/react/sprites/spriteTransform.js.map +1 -1
  177. package/lib/module/react/tilemap/TileMapLayer2D.js +217 -0
  178. package/lib/module/react/tilemap/TileMapLayer2D.js.map +1 -0
  179. package/lib/module/react/tilemap/tilePresentation.js +374 -0
  180. package/lib/module/react/tilemap/tilePresentation.js.map +1 -0
  181. package/lib/module/react/useGameSession.js +70 -0
  182. package/lib/module/react/useGameSession.js.map +1 -0
  183. package/lib/module/react/useGameSessionStatus.js +46 -0
  184. package/lib/module/react/useGameSessionStatus.js.map +1 -0
  185. package/lib/module/react/viewportBinding.js +5 -1
  186. package/lib/module/react/viewportBinding.js.map +1 -1
  187. package/lib/module/react.js +12 -1
  188. package/lib/module/react.js.map +1 -1
  189. package/lib/module/scene/defineScene.js +17 -0
  190. package/lib/module/scene/defineScene.js.map +1 -1
  191. package/lib/module/sprites/sampleSpriteClip.js +66 -6
  192. package/lib/module/sprites/sampleSpriteClip.js.map +1 -1
  193. package/lib/module/sprites/spriteAnimationState.js +10 -20
  194. package/lib/module/sprites/spriteAnimationState.js.map +1 -1
  195. package/lib/module/sprites.js +11 -0
  196. package/lib/module/sprites.js.map +1 -0
  197. package/lib/module/storage/adapters/asyncStorage.js +57 -0
  198. package/lib/module/storage/adapters/asyncStorage.js.map +1 -0
  199. package/lib/module/storage/adapters/memory.js +50 -0
  200. package/lib/module/storage/adapters/memory.js.map +1 -0
  201. package/lib/module/storage/errors.js +34 -0
  202. package/lib/module/storage/errors.js.map +1 -0
  203. package/lib/module/storage/index.js +11 -0
  204. package/lib/module/storage/index.js.map +1 -0
  205. package/lib/module/storage/schema.js +151 -0
  206. package/lib/module/storage/schema.js.map +1 -0
  207. package/lib/module/storage/serialization.js +249 -0
  208. package/lib/module/storage/serialization.js.map +1 -0
  209. package/lib/module/storage/store.js +387 -0
  210. package/lib/module/storage/store.js.map +1 -0
  211. package/lib/module/storage/types.js +16 -0
  212. package/lib/module/storage/types.js.map +1 -0
  213. package/lib/module/storage/validation.js +111 -0
  214. package/lib/module/storage/validation.js.map +1 -0
  215. package/lib/module/storage.js +4 -0
  216. package/lib/module/storage.js.map +1 -0
  217. package/lib/module/testing.js +4 -0
  218. package/lib/module/testing.js.map +1 -1
  219. package/lib/module/tilemap/chunkStats.js +27 -0
  220. package/lib/module/tilemap/chunkStats.js.map +1 -0
  221. package/lib/module/tilemap/definitions.js +308 -0
  222. package/lib/module/tilemap/definitions.js.map +1 -0
  223. package/lib/module/tilemap/errors.js +13 -0
  224. package/lib/module/tilemap/errors.js.map +1 -0
  225. package/lib/module/tilemap/index.js +10 -0
  226. package/lib/module/tilemap/index.js.map +1 -0
  227. package/lib/module/tilemap/movement.js +379 -0
  228. package/lib/module/tilemap/movement.js.map +1 -0
  229. package/lib/module/tilemap/queries.js +114 -0
  230. package/lib/module/tilemap/queries.js.map +1 -0
  231. package/lib/module/tilemap/tiledAdapter.js +141 -0
  232. package/lib/module/tilemap/tiledAdapter.js.map +1 -0
  233. package/lib/module/tilemap/types.js +4 -0
  234. package/lib/module/tilemap/types.js.map +1 -0
  235. package/lib/module/tilemap.js +4 -0
  236. package/lib/module/tilemap.js.map +1 -0
  237. package/lib/typescript/src/assets/defineAssets.d.ts +1 -1
  238. package/lib/typescript/src/assets/defineAssets.d.ts.map +1 -1
  239. package/lib/typescript/src/assets.d.ts +11 -0
  240. package/lib/typescript/src/assets.d.ts.map +1 -0
  241. package/lib/typescript/src/audio/createGameAudio.d.ts +5 -0
  242. package/lib/typescript/src/audio/createGameAudio.d.ts.map +1 -0
  243. package/lib/typescript/src/audio/errors.d.ts +6 -0
  244. package/lib/typescript/src/audio/errors.d.ts.map +1 -0
  245. package/lib/typescript/src/audio/index.d.ts +4 -0
  246. package/lib/typescript/src/audio/index.d.ts.map +1 -0
  247. package/lib/typescript/src/audio/resolver.d.ts +44 -0
  248. package/lib/typescript/src/audio/resolver.d.ts.map +1 -0
  249. package/lib/typescript/src/audio/types.d.ts +42 -0
  250. package/lib/typescript/src/audio/types.d.ts.map +1 -0
  251. package/lib/typescript/src/audio.d.ts +8 -0
  252. package/lib/typescript/src/audio.d.ts.map +1 -0
  253. package/lib/typescript/src/camera2d/bounds.d.ts +25 -0
  254. package/lib/typescript/src/camera2d/bounds.d.ts.map +1 -0
  255. package/lib/typescript/src/camera2d/extents.d.ts +17 -0
  256. package/lib/typescript/src/camera2d/extents.d.ts.map +1 -0
  257. package/lib/typescript/src/camera2d/follow.d.ts +24 -0
  258. package/lib/typescript/src/camera2d/follow.d.ts.map +1 -0
  259. package/lib/typescript/src/camera2d/index.d.ts +19 -0
  260. package/lib/typescript/src/camera2d/index.d.ts.map +1 -0
  261. package/lib/typescript/src/camera2d/interpolation.d.ts +17 -0
  262. package/lib/typescript/src/camera2d/interpolation.d.ts.map +1 -0
  263. package/lib/typescript/src/camera2d/shake.d.ts +20 -0
  264. package/lib/typescript/src/camera2d/shake.d.ts.map +1 -0
  265. package/lib/typescript/src/camera2d/transform.d.ts +44 -0
  266. package/lib/typescript/src/camera2d/transform.d.ts.map +1 -0
  267. package/lib/typescript/src/camera2d/types.d.ts +74 -0
  268. package/lib/typescript/src/camera2d/types.d.ts.map +1 -0
  269. package/lib/typescript/src/camera2d/validation.d.ts +30 -0
  270. package/lib/typescript/src/camera2d/validation.d.ts.map +1 -0
  271. package/lib/typescript/src/camera2d/visibility.d.ts +47 -0
  272. package/lib/typescript/src/camera2d/visibility.d.ts.map +1 -0
  273. package/lib/typescript/src/camera2d.d.ts +7 -0
  274. package/lib/typescript/src/camera2d.d.ts.map +1 -0
  275. package/lib/typescript/src/collision2d/colliders.d.ts +120 -0
  276. package/lib/typescript/src/collision2d/colliders.d.ts.map +1 -0
  277. package/lib/typescript/src/collision2d/debug.d.ts +67 -0
  278. package/lib/typescript/src/collision2d/debug.d.ts.map +1 -0
  279. package/lib/typescript/src/collision2d/filters.d.ts +28 -0
  280. package/lib/typescript/src/collision2d/filters.d.ts.map +1 -0
  281. package/lib/typescript/src/collision2d/index.d.ts +17 -0
  282. package/lib/typescript/src/collision2d/index.d.ts.map +1 -0
  283. package/lib/typescript/src/collision2d/intersections.d.ts +24 -0
  284. package/lib/typescript/src/collision2d/intersections.d.ts.map +1 -0
  285. package/lib/typescript/src/collision2d/manifolds.d.ts +39 -0
  286. package/lib/typescript/src/collision2d/manifolds.d.ts.map +1 -0
  287. package/lib/typescript/src/collision2d/segments.d.ts +24 -0
  288. package/lib/typescript/src/collision2d/segments.d.ts.map +1 -0
  289. package/lib/typescript/src/collision2d/spatialHash.d.ts +50 -0
  290. package/lib/typescript/src/collision2d/spatialHash.d.ts.map +1 -0
  291. package/lib/typescript/src/collision2d/sweeps.d.ts +60 -0
  292. package/lib/typescript/src/collision2d/sweeps.d.ts.map +1 -0
  293. package/lib/typescript/src/collision2d.d.ts +7 -0
  294. package/lib/typescript/src/collision2d.d.ts.map +1 -0
  295. package/lib/typescript/src/core/input/buttonPad.d.ts +59 -0
  296. package/lib/typescript/src/core/input/buttonPad.d.ts.map +1 -0
  297. package/lib/typescript/src/core/input/createInputBuffer.d.ts +1 -1
  298. package/lib/typescript/src/core/input/createInputBuffer.d.ts.map +1 -1
  299. package/lib/typescript/src/core/input/types.d.ts +7 -0
  300. package/lib/typescript/src/core/input/types.d.ts.map +1 -1
  301. package/lib/typescript/src/core/session/createGameSession.d.ts +4 -2
  302. package/lib/typescript/src/core/session/createGameSession.d.ts.map +1 -1
  303. package/lib/typescript/src/core/session/deepFreeze.d.ts +21 -1
  304. package/lib/typescript/src/core/session/deepFreeze.d.ts.map +1 -1
  305. package/lib/typescript/src/core/session/diagnostics.d.ts +2 -0
  306. package/lib/typescript/src/core/session/diagnostics.d.ts.map +1 -1
  307. package/lib/typescript/src/core/session/types.d.ts +69 -4
  308. package/lib/typescript/src/core/session/types.d.ts.map +1 -1
  309. package/lib/typescript/src/definition/defineGame.d.ts +12 -1
  310. package/lib/typescript/src/definition/defineGame.d.ts.map +1 -1
  311. package/lib/typescript/src/definition/types.d.ts +10 -1
  312. package/lib/typescript/src/definition/types.d.ts.map +1 -1
  313. package/lib/typescript/src/events/defineGameEvents.d.ts +26 -0
  314. package/lib/typescript/src/events/defineGameEvents.d.ts.map +1 -0
  315. package/lib/typescript/src/events/errors.d.ts +12 -0
  316. package/lib/typescript/src/events/errors.d.ts.map +1 -0
  317. package/lib/typescript/src/events/index.d.ts +6 -0
  318. package/lib/typescript/src/events/index.d.ts.map +1 -0
  319. package/lib/typescript/src/events/payload.d.ts +21 -0
  320. package/lib/typescript/src/events/payload.d.ts.map +1 -0
  321. package/lib/typescript/src/events/seed.d.ts +3 -0
  322. package/lib/typescript/src/events/seed.d.ts.map +1 -0
  323. package/lib/typescript/src/events/types.d.ts +42 -0
  324. package/lib/typescript/src/events/types.d.ts.map +1 -0
  325. package/lib/typescript/src/events.d.ts +12 -0
  326. package/lib/typescript/src/events.d.ts.map +1 -0
  327. package/lib/typescript/src/geometry/helpers.d.ts +35 -0
  328. package/lib/typescript/src/geometry/helpers.d.ts.map +1 -0
  329. package/lib/typescript/src/geometry/index.d.ts +4 -0
  330. package/lib/typescript/src/geometry/index.d.ts.map +1 -0
  331. package/lib/typescript/src/geometry/types.d.ts +49 -0
  332. package/lib/typescript/src/geometry/types.d.ts.map +1 -1
  333. package/lib/typescript/src/geometry/validation.d.ts +44 -0
  334. package/lib/typescript/src/geometry/validation.d.ts.map +1 -0
  335. package/lib/typescript/src/geometry.d.ts +7 -0
  336. package/lib/typescript/src/geometry.d.ts.map +1 -0
  337. package/lib/typescript/src/haptics/createGameHaptics.d.ts +3 -0
  338. package/lib/typescript/src/haptics/createGameHaptics.d.ts.map +1 -0
  339. package/lib/typescript/src/haptics/errors.d.ts +6 -0
  340. package/lib/typescript/src/haptics/errors.d.ts.map +1 -0
  341. package/lib/typescript/src/haptics/index.d.ts +4 -0
  342. package/lib/typescript/src/haptics/index.d.ts.map +1 -0
  343. package/lib/typescript/src/haptics/resolver.d.ts +22 -0
  344. package/lib/typescript/src/haptics/resolver.d.ts.map +1 -0
  345. package/lib/typescript/src/haptics/types.d.ts +37 -0
  346. package/lib/typescript/src/haptics/types.d.ts.map +1 -0
  347. package/lib/typescript/src/haptics.d.ts +8 -0
  348. package/lib/typescript/src/haptics.d.ts.map +1 -0
  349. package/lib/typescript/src/index.d.ts +10 -2
  350. package/lib/typescript/src/index.d.ts.map +1 -1
  351. package/lib/typescript/src/particles/createParticleSystem.d.ts +5 -0
  352. package/lib/typescript/src/particles/createParticleSystem.d.ts.map +1 -0
  353. package/lib/typescript/src/particles/defineParticleEffect.d.ts +3 -0
  354. package/lib/typescript/src/particles/defineParticleEffect.d.ts.map +1 -0
  355. package/lib/typescript/src/particles/errors.d.ts +5 -0
  356. package/lib/typescript/src/particles/errors.d.ts.map +1 -0
  357. package/lib/typescript/src/particles/index.d.ts +6 -0
  358. package/lib/typescript/src/particles/index.d.ts.map +1 -0
  359. package/lib/typescript/src/particles/sampling.d.ts +54 -0
  360. package/lib/typescript/src/particles/sampling.d.ts.map +1 -0
  361. package/lib/typescript/src/particles/types.d.ts +292 -0
  362. package/lib/typescript/src/particles/types.d.ts.map +1 -0
  363. package/lib/typescript/src/particles.d.ts +2 -0
  364. package/lib/typescript/src/particles.d.ts.map +1 -0
  365. package/lib/typescript/src/react/GameButtonPad.d.ts +84 -0
  366. package/lib/typescript/src/react/GameButtonPad.d.ts.map +1 -0
  367. package/lib/typescript/src/react/GamePointerInput.d.ts.map +1 -1
  368. package/lib/typescript/src/react/GameView.d.ts +27 -1
  369. package/lib/typescript/src/react/GameView.d.ts.map +1 -1
  370. package/lib/typescript/src/react/assets/createGameAssetStore.d.ts.map +1 -1
  371. package/lib/typescript/src/react/assets/useGameAssets.d.ts.map +1 -1
  372. package/lib/typescript/src/react/bindAppLifecycle.d.ts +7 -1
  373. package/lib/typescript/src/react/bindAppLifecycle.d.ts.map +1 -1
  374. package/lib/typescript/src/react/bindGameSession.d.ts.map +1 -1
  375. package/lib/typescript/src/react/camera2d/GameLayer2D.d.ts +24 -0
  376. package/lib/typescript/src/react/camera2d/GameLayer2D.d.ts.map +1 -0
  377. package/lib/typescript/src/react/camera2d/defineGameCamera2D.d.ts +44 -0
  378. package/lib/typescript/src/react/camera2d/defineGameCamera2D.d.ts.map +1 -0
  379. package/lib/typescript/src/react/camera2d/usePresentedCameraBinding.d.ts +22 -0
  380. package/lib/typescript/src/react/camera2d/usePresentedCameraBinding.d.ts.map +1 -0
  381. package/lib/typescript/src/react/cleanupList.d.ts +21 -0
  382. package/lib/typescript/src/react/cleanupList.d.ts.map +1 -0
  383. package/lib/typescript/src/react/instrumentation.d.ts +33 -3
  384. package/lib/typescript/src/react/instrumentation.d.ts.map +1 -1
  385. package/lib/typescript/src/react/lifecycleSource.d.ts +21 -0
  386. package/lib/typescript/src/react/lifecycleSource.d.ts.map +1 -0
  387. package/lib/typescript/src/react/particles/ParticleView.d.ts +65 -0
  388. package/lib/typescript/src/react/particles/ParticleView.d.ts.map +1 -0
  389. package/lib/typescript/src/react/particles/culling.d.ts +70 -0
  390. package/lib/typescript/src/react/particles/culling.d.ts.map +1 -0
  391. package/lib/typescript/src/react/particles/index.d.ts +7 -0
  392. package/lib/typescript/src/react/particles/index.d.ts.map +1 -0
  393. package/lib/typescript/src/react/particles/spriteXForm.d.ts +28 -0
  394. package/lib/typescript/src/react/particles/spriteXForm.d.ts.map +1 -0
  395. package/lib/typescript/src/react/particles/useParticlePresentation.d.ts +48 -0
  396. package/lib/typescript/src/react/particles/useParticlePresentation.d.ts.map +1 -0
  397. package/lib/typescript/src/react/pointerBinding.d.ts +38 -8
  398. package/lib/typescript/src/react/pointerBinding.d.ts.map +1 -1
  399. package/lib/typescript/src/react/pointerCamera.d.ts +20 -0
  400. package/lib/typescript/src/react/pointerCamera.d.ts.map +1 -0
  401. package/lib/typescript/src/react/pointerCoalescer.d.ts +17 -1
  402. package/lib/typescript/src/react/pointerCoalescer.d.ts.map +1 -1
  403. package/lib/typescript/src/react/sprites/GameSprite.d.ts +3 -10
  404. package/lib/typescript/src/react/sprites/GameSprite.d.ts.map +1 -1
  405. package/lib/typescript/src/react/sprites/GameWorld2D.d.ts +51 -6
  406. package/lib/typescript/src/react/sprites/GameWorld2D.d.ts.map +1 -1
  407. package/lib/typescript/src/react/sprites/Sprite.d.ts.map +1 -1
  408. package/lib/typescript/src/react/sprites/SpriteBatch.d.ts +22 -1
  409. package/lib/typescript/src/react/sprites/SpriteBatch.d.ts.map +1 -1
  410. package/lib/typescript/src/react/sprites/batchVisibility.d.ts +28 -0
  411. package/lib/typescript/src/react/sprites/batchVisibility.d.ts.map +1 -0
  412. package/lib/typescript/src/react/sprites/spriteSelection.d.ts +58 -0
  413. package/lib/typescript/src/react/sprites/spriteSelection.d.ts.map +1 -0
  414. package/lib/typescript/src/react/sprites/spriteTransform.d.ts +27 -12
  415. package/lib/typescript/src/react/sprites/spriteTransform.d.ts.map +1 -1
  416. package/lib/typescript/src/react/tilemap/TileMapLayer2D.d.ts +69 -0
  417. package/lib/typescript/src/react/tilemap/TileMapLayer2D.d.ts.map +1 -0
  418. package/lib/typescript/src/react/tilemap/tilePresentation.d.ts +217 -0
  419. package/lib/typescript/src/react/tilemap/tilePresentation.d.ts.map +1 -0
  420. package/lib/typescript/src/react/useGameSession.d.ts +48 -0
  421. package/lib/typescript/src/react/useGameSession.d.ts.map +1 -0
  422. package/lib/typescript/src/react/useGameSessionStatus.d.ts +23 -0
  423. package/lib/typescript/src/react/useGameSessionStatus.d.ts.map +1 -0
  424. package/lib/typescript/src/react/viewportBinding.d.ts +5 -1
  425. package/lib/typescript/src/react/viewportBinding.d.ts.map +1 -1
  426. package/lib/typescript/src/react.d.ts +18 -1
  427. package/lib/typescript/src/react.d.ts.map +1 -1
  428. package/lib/typescript/src/scene/defineScene.d.ts +22 -2
  429. package/lib/typescript/src/scene/defineScene.d.ts.map +1 -1
  430. package/lib/typescript/src/scene/types.d.ts +24 -4
  431. package/lib/typescript/src/scene/types.d.ts.map +1 -1
  432. package/lib/typescript/src/sprites/sampleSpriteClip.d.ts +26 -2
  433. package/lib/typescript/src/sprites/sampleSpriteClip.d.ts.map +1 -1
  434. package/lib/typescript/src/sprites/spriteAnimationState.d.ts +6 -7
  435. package/lib/typescript/src/sprites/spriteAnimationState.d.ts.map +1 -1
  436. package/lib/typescript/src/sprites.d.ts +10 -0
  437. package/lib/typescript/src/sprites.d.ts.map +1 -0
  438. package/lib/typescript/src/storage/adapters/asyncStorage.d.ts +18 -0
  439. package/lib/typescript/src/storage/adapters/asyncStorage.d.ts.map +1 -0
  440. package/lib/typescript/src/storage/adapters/memory.d.ts +16 -0
  441. package/lib/typescript/src/storage/adapters/memory.d.ts.map +1 -0
  442. package/lib/typescript/src/storage/errors.d.ts +37 -0
  443. package/lib/typescript/src/storage/errors.d.ts.map +1 -0
  444. package/lib/typescript/src/storage/index.d.ts +11 -0
  445. package/lib/typescript/src/storage/index.d.ts.map +1 -0
  446. package/lib/typescript/src/storage/schema.d.ts +22 -0
  447. package/lib/typescript/src/storage/schema.d.ts.map +1 -0
  448. package/lib/typescript/src/storage/serialization.d.ts +23 -0
  449. package/lib/typescript/src/storage/serialization.d.ts.map +1 -0
  450. package/lib/typescript/src/storage/store.d.ts +3 -0
  451. package/lib/typescript/src/storage/store.d.ts.map +1 -0
  452. package/lib/typescript/src/storage/types.d.ts +69 -0
  453. package/lib/typescript/src/storage/types.d.ts.map +1 -0
  454. package/lib/typescript/src/storage/validation.d.ts +24 -0
  455. package/lib/typescript/src/storage/validation.d.ts.map +1 -0
  456. package/lib/typescript/src/storage.d.ts +2 -0
  457. package/lib/typescript/src/storage.d.ts.map +1 -0
  458. package/lib/typescript/src/testing.d.ts +1 -0
  459. package/lib/typescript/src/testing.d.ts.map +1 -1
  460. package/lib/typescript/src/tilemap/chunkStats.d.ts +14 -0
  461. package/lib/typescript/src/tilemap/chunkStats.d.ts.map +1 -0
  462. package/lib/typescript/src/tilemap/definitions.d.ts +38 -0
  463. package/lib/typescript/src/tilemap/definitions.d.ts.map +1 -0
  464. package/lib/typescript/src/tilemap/errors.d.ts +7 -0
  465. package/lib/typescript/src/tilemap/errors.d.ts.map +1 -0
  466. package/lib/typescript/src/tilemap/index.d.ts +8 -0
  467. package/lib/typescript/src/tilemap/index.d.ts.map +1 -0
  468. package/lib/typescript/src/tilemap/movement.d.ts +52 -0
  469. package/lib/typescript/src/tilemap/movement.d.ts.map +1 -0
  470. package/lib/typescript/src/tilemap/queries.d.ts +21 -0
  471. package/lib/typescript/src/tilemap/queries.d.ts.map +1 -0
  472. package/lib/typescript/src/tilemap/tiledAdapter.d.ts +32 -0
  473. package/lib/typescript/src/tilemap/tiledAdapter.d.ts.map +1 -0
  474. package/lib/typescript/src/tilemap/types.d.ts +127 -0
  475. package/lib/typescript/src/tilemap/types.d.ts.map +1 -0
  476. package/lib/typescript/src/tilemap.d.ts +2 -0
  477. package/lib/typescript/src/tilemap.d.ts.map +1 -0
  478. package/package.json +100 -10
  479. package/src/assets/defineAssets.ts +31 -5
  480. package/src/assets.ts +27 -0
  481. package/src/audio/createGameAudio.ts +749 -0
  482. package/src/audio/errors.ts +12 -0
  483. package/src/audio/index.ts +9 -0
  484. package/src/audio/resolver.ts +74 -0
  485. package/src/audio/types.ts +47 -0
  486. package/src/audio.ts +13 -0
  487. package/src/camera2d/bounds.ts +69 -0
  488. package/src/camera2d/extents.ts +25 -0
  489. package/src/camera2d/follow.ts +165 -0
  490. package/src/camera2d/index.ts +29 -0
  491. package/src/camera2d/interpolation.ts +113 -0
  492. package/src/camera2d/shake.ts +90 -0
  493. package/src/camera2d/transform.ts +148 -0
  494. package/src/camera2d/types.ts +73 -0
  495. package/src/camera2d/validation.ts +126 -0
  496. package/src/camera2d/visibility.ts +181 -0
  497. package/src/camera2d.ts +6 -0
  498. package/src/collision2d/colliders.ts +292 -0
  499. package/src/collision2d/debug.ts +133 -0
  500. package/src/collision2d/filters.ts +48 -0
  501. package/src/collision2d/index.ts +74 -0
  502. package/src/collision2d/intersections.ts +82 -0
  503. package/src/collision2d/manifolds.ts +191 -0
  504. package/src/collision2d/segments.ts +176 -0
  505. package/src/collision2d/spatialHash.ts +211 -0
  506. package/src/collision2d/sweeps.ts +269 -0
  507. package/src/collision2d.ts +6 -0
  508. package/src/core/input/buttonPad.ts +235 -0
  509. package/src/core/input/createInputBuffer.ts +95 -14
  510. package/src/core/input/types.ts +7 -0
  511. package/src/core/session/createGameSession.ts +480 -53
  512. package/src/core/session/deepFreeze.ts +104 -3
  513. package/src/core/session/diagnostics.ts +2 -0
  514. package/src/core/session/types.ts +77 -4
  515. package/src/definition/defineGame.ts +61 -3
  516. package/src/definition/types.ts +10 -0
  517. package/src/events/defineGameEvents.ts +46 -0
  518. package/src/events/errors.ts +14 -0
  519. package/src/events/index.ts +14 -0
  520. package/src/events/payload.ts +234 -0
  521. package/src/events/seed.ts +33 -0
  522. package/src/events/types.ts +53 -0
  523. package/src/events.ts +20 -0
  524. package/src/geometry/helpers.ts +136 -0
  525. package/src/geometry/index.ts +14 -0
  526. package/src/geometry/types.ts +54 -0
  527. package/src/geometry/validation.ts +131 -0
  528. package/src/geometry.ts +6 -0
  529. package/src/haptics/createGameHaptics.ts +214 -0
  530. package/src/haptics/errors.ts +12 -0
  531. package/src/haptics/index.ts +3 -0
  532. package/src/haptics/resolver.ts +58 -0
  533. package/src/haptics/types.ts +48 -0
  534. package/src/haptics.ts +7 -0
  535. package/src/index.ts +37 -1
  536. package/src/particles/createParticleSystem.ts +505 -0
  537. package/src/particles/defineParticleEffect.ts +164 -0
  538. package/src/particles/errors.ts +6 -0
  539. package/src/particles/index.ts +5 -0
  540. package/src/particles/sampling.ts +141 -0
  541. package/src/particles/types.ts +327 -0
  542. package/src/particles.ts +1 -0
  543. package/src/react/GameButtonPad.tsx +436 -0
  544. package/src/react/GamePointerInput.tsx +73 -8
  545. package/src/react/GameView.tsx +160 -61
  546. package/src/react/assets/createGameAssetStore.ts +140 -107
  547. package/src/react/assets/useGameAssets.ts +63 -31
  548. package/src/react/bindAppLifecycle.ts +55 -19
  549. package/src/react/bindGameSession.ts +12 -2
  550. package/src/react/camera2d/GameLayer2D.tsx +43 -0
  551. package/src/react/camera2d/defineGameCamera2D.ts +59 -0
  552. package/src/react/camera2d/usePresentedCameraBinding.ts +185 -0
  553. package/src/react/cleanupList.ts +48 -0
  554. package/src/react/instrumentation.ts +31 -3
  555. package/src/react/lifecycleSource.ts +58 -0
  556. package/src/react/particles/ParticleView.tsx +358 -0
  557. package/src/react/particles/culling.ts +145 -0
  558. package/src/react/particles/index.ts +6 -0
  559. package/src/react/particles/spriteXForm.ts +72 -0
  560. package/src/react/particles/useParticlePresentation.ts +261 -0
  561. package/src/react/pointerBinding.ts +74 -16
  562. package/src/react/pointerCamera.ts +33 -0
  563. package/src/react/pointerCoalescer.ts +36 -10
  564. package/src/react/sprites/GameSprite.tsx +4 -33
  565. package/src/react/sprites/GameWorld2D.tsx +113 -7
  566. package/src/react/sprites/Sprite.tsx +51 -72
  567. package/src/react/sprites/SpriteBatch.tsx +74 -22
  568. package/src/react/sprites/batchVisibility.ts +76 -0
  569. package/src/react/sprites/spriteSelection.ts +133 -0
  570. package/src/react/sprites/spriteTransform.ts +46 -26
  571. package/src/react/tilemap/TileMapLayer2D.tsx +274 -0
  572. package/src/react/tilemap/tilePresentation.ts +491 -0
  573. package/src/react/useGameSession.ts +90 -0
  574. package/src/react/useGameSessionStatus.ts +53 -0
  575. package/src/react/viewportBinding.ts +5 -1
  576. package/src/react.ts +18 -1
  577. package/src/scene/defineScene.ts +47 -5
  578. package/src/scene/types.ts +37 -3
  579. package/src/sprites/sampleSpriteClip.ts +82 -14
  580. package/src/sprites/spriteAnimationState.ts +29 -25
  581. package/src/sprites.ts +22 -0
  582. package/src/storage/adapters/asyncStorage.ts +77 -0
  583. package/src/storage/adapters/memory.ts +58 -0
  584. package/src/storage/errors.ts +88 -0
  585. package/src/storage/index.ts +18 -0
  586. package/src/storage/schema.ts +147 -0
  587. package/src/storage/serialization.ts +248 -0
  588. package/src/storage/store.ts +380 -0
  589. package/src/storage/types.ts +76 -0
  590. package/src/storage/validation.ts +102 -0
  591. package/src/storage.ts +1 -0
  592. package/src/testing.ts +4 -0
  593. package/src/tilemap/chunkStats.ts +24 -0
  594. package/src/tilemap/definitions.ts +327 -0
  595. package/src/tilemap/errors.ts +11 -0
  596. package/src/tilemap/index.ts +10 -0
  597. package/src/tilemap/movement.ts +368 -0
  598. package/src/tilemap/queries.ts +136 -0
  599. package/src/tilemap/tiledAdapter.ts +165 -0
  600. package/src/tilemap/types.ts +119 -0
  601. package/src/tilemap.ts +1 -0
@@ -0,0 +1,249 @@
1
+ "use strict";
2
+
3
+ import { storageError } from "./errors.js";
4
+ import { STORAGE_LIMITS } from "./types.js";
5
+ const ENVELOPE_FORMAT = 'rn-gamekit.save';
6
+
7
+ /**
8
+ * Bounded plain-data clone + validation for storage payloads.
9
+ *
10
+ * Mirrors the strictness of event payloads but with storage-sized limits.
11
+ * Rejects: functions, symbols, bigint, non-finite numbers, cycles,
12
+ * sparse holes, accessors, non-enumerable, unsafe prototype keys,
13
+ * array subclasses, class instances, React elements, thenables.
14
+ */
15
+ export function cloneAndValidatePlainData(value, basePath = 'payload') {
16
+ let nodeCount = 0;
17
+ const ancestry = new WeakSet();
18
+ const fail = (path, reason, code = 'UNSUPPORTED_VALUE') => {
19
+ // Depth/size specific codes where useful
20
+ if (reason.includes('maximum depth')) {
21
+ throw storageError(`storage payload invalid at ${path}: ${reason}`, 'DEPTH_EXCEEDED', {
22
+ path
23
+ });
24
+ }
25
+ if (reason.includes('maximum payload size') || reason.includes('maximum serialized bytes') || reason.includes('exceeds maximum')) {
26
+ // Let caller turn size failures into SIZE_EXCEEDED where appropriate
27
+ if (reason.includes('nodes') || reason.includes('array') || reason.includes('object fields') || reason.includes('string')) {
28
+ throw storageError(`storage payload invalid at ${path}: ${reason}`, 'SIZE_EXCEEDED', {
29
+ path
30
+ });
31
+ }
32
+ }
33
+ throw storageError(`storage payload invalid at ${path}: ${reason}`, code, {
34
+ path
35
+ });
36
+ };
37
+ const isPlainRecord = v => {
38
+ const proto = Object.getPrototypeOf(v);
39
+ return proto === Object.prototype || proto === null;
40
+ };
41
+ const isReactElement = v => {
42
+ const desc = Object.getOwnPropertyDescriptor(v, '$$typeof');
43
+ if (desc !== undefined) return true;
44
+ return '$$typeof' in v;
45
+ };
46
+ const clone = (val, path, depth) => {
47
+ if (depth > STORAGE_LIMITS.MAX_DEPTH) {
48
+ fail(path, `exceeds maximum depth of ${STORAGE_LIMITS.MAX_DEPTH}`);
49
+ }
50
+ nodeCount += 1;
51
+ if (nodeCount > STORAGE_LIMITS.MAX_NODES) {
52
+ fail(path, `exceeds maximum payload size of ${STORAGE_LIMITS.MAX_NODES} nodes`);
53
+ }
54
+ if (val === null) return null;
55
+ const t = typeof val;
56
+ if (t === 'string') {
57
+ const s = val;
58
+ if (s.length > STORAGE_LIMITS.MAX_STRING_LENGTH) {
59
+ fail(path, `string exceeds maximum length of ${STORAGE_LIMITS.MAX_STRING_LENGTH}`);
60
+ }
61
+ return s;
62
+ }
63
+ if (t === 'boolean') return val;
64
+ if (t === 'number') {
65
+ const n = val;
66
+ if (!Number.isFinite(n)) fail(path, 'number must be finite');
67
+ return n;
68
+ }
69
+ if (t === 'bigint') fail(path, 'bigint is not a supported storage type');
70
+ if (t === 'symbol') fail(path, 'symbol is not a supported storage type');
71
+ if (t === 'function') fail(path, 'function is not a supported storage type');
72
+ if (t === 'undefined') fail(path, 'undefined is not a supported storage type (use null)');
73
+ if (t !== 'object') fail(path, `unsupported storage type "${t}"`);
74
+ const obj = val;
75
+ if (ancestry.has(obj)) fail(path, 'cycle detected in payload');
76
+ ancestry.add(obj);
77
+ try {
78
+ // GS-STORAGE-03 (coordinates GS-EVENT-03): thenables are rejected
79
+ // without invoking any user code. Only instanceof runs here; every
80
+ // other non-plain object fails at the array/record branches below.
81
+ // Own `then` functions are rejected later as function values.
82
+ if (obj instanceof Promise) {
83
+ fail(path, 'promise/thenable is not a supported storage type');
84
+ }
85
+ if (isReactElement(obj)) fail(path, 'React element is not a supported storage type');
86
+ if (Array.isArray(obj)) {
87
+ const arr = obj;
88
+ if (Object.getPrototypeOf(arr) !== Array.prototype) fail(path, 'array subclass is not a supported storage type');
89
+ if (arr.length > STORAGE_LIMITS.MAX_ARRAY_LENGTH) fail(path, `array exceeds maximum length of ${STORAGE_LIMITS.MAX_ARRAY_LENGTH}`);
90
+ const descs = Object.getOwnPropertyDescriptors(arr);
91
+ for (let i = 0; i < arr.length; i += 1) {
92
+ const key = String(i);
93
+ if (!(key in descs)) fail(`${path}[${i}]`, 'sparse array holes are not supported');
94
+ const d = descs[key];
95
+ if (d.get !== undefined || d.set !== undefined) fail(`${path}[${i}]`, 'accessor property is not supported');
96
+ if (d.enumerable === false) fail(`${path}[${i}]`, 'non-enumerable property is not supported');
97
+ }
98
+ const cloned = new Array(arr.length);
99
+ for (let i = 0; i < arr.length; i += 1) {
100
+ const key = String(i);
101
+ const d = descs[key];
102
+ cloned[i] = clone(d.value, `${path}[${i}]`, depth + 1);
103
+ }
104
+ for (const key of Reflect.ownKeys(descs)) {
105
+ if (typeof key === 'symbol') fail(`${path}[Symbol(${String(key).slice(7, -1)})]`, 'symbol-keyed property is not supported');
106
+ const k = key;
107
+ if (k === 'length') continue;
108
+ if (/^(0|[1-9]\d*)$/.test(k)) {
109
+ const idx = Number(k);
110
+ if (idx < arr.length && String(idx) === k) continue;
111
+ }
112
+ if (k === '__proto__' || k === 'constructor' || k === 'prototype') fail(`${path}.${k}`, 'unsafe prototype key is not supported');
113
+ const d = descs[k];
114
+ if (d.get !== undefined || d.set !== undefined) fail(`${path}.${k}`, 'accessor property is not supported');
115
+ if (d.enumerable === false) fail(`${path}.${k}`, 'non-enumerable property is not supported');
116
+ fail(`${path}.${k}`, 'array extra property is not a supported storage member');
117
+ }
118
+ Object.freeze(cloned);
119
+ return cloned;
120
+ }
121
+ if (!isPlainRecord(obj)) fail(path, 'only plain records and arrays are supported (class instance, Map, Set, Date, etc. are rejected)');
122
+ const proto = Object.getPrototypeOf(obj);
123
+ const descs = Object.getOwnPropertyDescriptors(obj);
124
+ const keys = Object.keys(descs);
125
+ if (keys.length > STORAGE_LIMITS.MAX_OBJECT_FIELDS) {
126
+ fail(path, `object exceeds maximum field count of ${STORAGE_LIMITS.MAX_OBJECT_FIELDS}`);
127
+ }
128
+ for (const key of Reflect.ownKeys(descs)) {
129
+ if (typeof key === 'symbol') fail(`${path}[Symbol(${String(key).slice(7, -1)})]`, 'symbol-keyed property is not supported');
130
+ const k = key;
131
+ if (k === '__proto__' || k === 'constructor' || k === 'prototype') fail(`${path}.${k}`, 'unsafe prototype key is not supported');
132
+ const d = descs[k];
133
+ if (d.get !== undefined || d.set !== undefined) fail(`${path}.${k}`, 'accessor property is not supported');
134
+ if (d.enumerable === false) fail(`${path}.${k}`, 'non-enumerable property is not supported');
135
+ }
136
+ const cloned = proto === null ? Object.create(null) : {};
137
+ for (const key of keys) {
138
+ const d = descs[key];
139
+ cloned[key] = clone(d.value, `${path}.${key}`, depth + 1);
140
+ }
141
+ Object.freeze(cloned);
142
+ return cloned;
143
+ } finally {
144
+ ancestry.delete(obj);
145
+ }
146
+ };
147
+ const result = clone(value, basePath, 0);
148
+ return result;
149
+ }
150
+
151
+ /**
152
+ * Exact UTF-8 byte length (GS-STORAGE-03): the single routine for every
153
+ * storage size check. TextEncoder is exact everywhere it exists (Node,
154
+ * browsers, modern Hermes); the scalar fallback below is bit-exact too,
155
+ * including unpaired surrogates (which encode as U+FFFD, 3 bytes).
156
+ */
157
+ export function utf8ByteLength(str) {
158
+ if (typeof TextEncoder !== 'undefined') {
159
+ return new TextEncoder().encode(str).length;
160
+ }
161
+ return utf8ByteLengthScalar(str);
162
+ }
163
+
164
+ /** Bit-exact scalar UTF-8 length for runtimes without TextEncoder. */
165
+ export function utf8ByteLengthScalar(str) {
166
+ let bytes = 0;
167
+ for (let i = 0; i < str.length; i++) {
168
+ const code = str.charCodeAt(i);
169
+ if (code < 0x80) {
170
+ bytes += 1;
171
+ } else if (code < 0x800) {
172
+ bytes += 2;
173
+ } else if (code >= 0xd800 && code <= 0xdbff && i + 1 < str.length) {
174
+ const next = str.charCodeAt(i + 1);
175
+ if (next >= 0xdc00 && next <= 0xdfff) {
176
+ bytes += 4;
177
+ i++;
178
+ } else {
179
+ bytes += 3;
180
+ }
181
+ } else {
182
+ bytes += 3;
183
+ }
184
+ }
185
+ return bytes;
186
+ }
187
+ function serializedByteLength(str) {
188
+ return utf8ByteLength(str);
189
+ }
190
+ export function serializeEnvelope(envelope) {
191
+ // Validate payload plain-data first
192
+ cloneAndValidatePlainData(envelope.payload, 'payload');
193
+ // Envelope itself is plain, but we validate its shape before stringify
194
+ if (envelope.format !== ENVELOPE_FORMAT) {
195
+ throw storageError(`envelope format must be "${ENVELOPE_FORMAT}"`, 'CORRUPT_ENVELOPE', {
196
+ path: 'format'
197
+ });
198
+ }
199
+ const json = JSON.stringify(envelope);
200
+ const bytes = serializedByteLength(json);
201
+ if (bytes > STORAGE_LIMITS.MAX_SERIALIZED_BYTES) {
202
+ throw storageError(`serialized envelope exceeds ${STORAGE_LIMITS.MAX_SERIALIZED_BYTES} bytes (got ${bytes})`, 'SIZE_EXCEEDED', {
203
+ path: 'envelope'
204
+ });
205
+ }
206
+ return json;
207
+ }
208
+ export function parseEnvelope(raw) {
209
+ let parsed;
210
+ try {
211
+ parsed = JSON.parse(raw);
212
+ } catch (cause) {
213
+ throw storageError(`corrupt envelope: JSON parse failed`, 'CORRUPT_ENVELOPE', {
214
+ cause
215
+ });
216
+ }
217
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
218
+ throw storageError(`corrupt envelope: expected object`, 'CORRUPT_ENVELOPE');
219
+ }
220
+ const obj = parsed;
221
+ if (obj.format !== ENVELOPE_FORMAT) {
222
+ throw storageError(`corrupt envelope: expected format "${ENVELOPE_FORMAT}"`, 'CORRUPT_ENVELOPE', {
223
+ path: 'format'
224
+ });
225
+ }
226
+ if (typeof obj.schemaId !== 'string') {
227
+ throw storageError(`corrupt envelope: schemaId must be string`, 'CORRUPT_ENVELOPE', {
228
+ path: 'schemaId'
229
+ });
230
+ }
231
+ if (!Number.isSafeInteger(obj.schemaVersion)) {
232
+ throw storageError(`corrupt envelope: schemaVersion must be integer`, 'CORRUPT_ENVELOPE', {
233
+ path: 'schemaVersion'
234
+ });
235
+ }
236
+ if (typeof obj.savedAtMs !== 'number' || !Number.isFinite(obj.savedAtMs)) {
237
+ throw storageError(`corrupt envelope: savedAtMs must be finite number`, 'CORRUPT_ENVELOPE', {
238
+ path: 'savedAtMs'
239
+ });
240
+ }
241
+ if (!('payload' in obj)) {
242
+ throw storageError(`corrupt envelope: missing payload`, 'CORRUPT_ENVELOPE', {
243
+ path: 'payload'
244
+ });
245
+ }
246
+ return obj;
247
+ }
248
+ export const STORAGE_ENVELOPE_FORMAT = ENVELOPE_FORMAT;
249
+ //# sourceMappingURL=serialization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["storageError","STORAGE_LIMITS","ENVELOPE_FORMAT","cloneAndValidatePlainData","value","basePath","nodeCount","ancestry","WeakSet","fail","path","reason","code","includes","isPlainRecord","v","proto","Object","getPrototypeOf","prototype","isReactElement","desc","getOwnPropertyDescriptor","undefined","clone","val","depth","MAX_DEPTH","MAX_NODES","t","s","length","MAX_STRING_LENGTH","n","Number","isFinite","obj","has","add","Promise","Array","isArray","arr","MAX_ARRAY_LENGTH","descs","getOwnPropertyDescriptors","i","key","String","d","get","set","enumerable","cloned","Reflect","ownKeys","slice","k","test","idx","freeze","keys","MAX_OBJECT_FIELDS","create","delete","result","utf8ByteLength","str","TextEncoder","encode","utf8ByteLengthScalar","bytes","charCodeAt","next","serializedByteLength","serializeEnvelope","envelope","payload","format","json","JSON","stringify","MAX_SERIALIZED_BYTES","parseEnvelope","raw","parsed","parse","cause","schemaId","isSafeInteger","schemaVersion","savedAtMs","STORAGE_ENVELOPE_FORMAT"],"sourceRoot":"../../../src","sources":["storage/serialization.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,387 @@
1
+ "use strict";
2
+
3
+ import { GameStorageError, storageError } from "./errors.js";
4
+ import { STORAGE_LIMITS } from "./types.js";
5
+ import { storageKey, legacyStorageKey, validateNamespace, validateSlot } from "./validation.js";
6
+ import { createDefaultData, migratePayload, validateCurrentData } from "./schema.js";
7
+ import { cloneAndValidatePlainData, parseEnvelope, serializeEnvelope, utf8ByteLength, STORAGE_ENVELOPE_FORMAT } from "./serialization.js";
8
+ export function createGameSaveStore(options) {
9
+ const schema = options.schema;
10
+ const adapter = options.adapter;
11
+ const namespace = options.namespace;
12
+ validateNamespace(namespace);
13
+
14
+ // Per-slot serialized queue: slot -> tail promise. Retained until every accepted operation settles.
15
+ const slotQueues = new Map();
16
+ // Active operation promises for flush() snapshotting. Each flush gets its own immutable snapshot.
17
+ const active = new Set();
18
+ let disposed = false;
19
+ function track(p) {
20
+ const wrapped = p.finally(() => {
21
+ active.delete(wrapped);
22
+ });
23
+ active.add(wrapped);
24
+ return wrapped;
25
+ }
26
+ function enqueue(slot, op) {
27
+ // Acceptance boundary is the successful public method call; already-accepted ops are never cancelled by later dispose.
28
+ const tail = slotQueues.get(slot) ?? Promise.resolve();
29
+ let resolveTail = () => {};
30
+ const nextTail = new Promise(res => {
31
+ resolveTail = res;
32
+ });
33
+ slotQueues.set(slot, nextTail);
34
+ const run = tail.catch(() => {
35
+ // Previous failure does not block next; continue
36
+ }).then(() => op()).finally(() => {
37
+ // Clean only when this tail is still the current tail; otherwise a newer operation has already replaced it.
38
+ if (slotQueues.get(slot) === nextTail) {
39
+ slotQueues.delete(slot);
40
+ }
41
+ resolveTail();
42
+ });
43
+
44
+ // Ensure nextTail mirrors run settlement without creating an unhandled rejection.
45
+ run.then(() => {}, () => {});
46
+ return track(run);
47
+ }
48
+ async function loadInternal(slot) {
49
+ validateSlot(slot);
50
+ const key = storageKey(namespace, slot);
51
+ let raw;
52
+ try {
53
+ raw = await adapter.read(key);
54
+ } catch (cause) {
55
+ throw storageError(`backend read failed for slot "${slot}"`, 'BACKEND_READ_FAILED', {
56
+ operation: 'load',
57
+ namespace,
58
+ slot,
59
+ cause
60
+ });
61
+ }
62
+ // GS-STORAGE-01: read-only legacy fallback — pre-upgrade records load
63
+ // without any rewrite. A v2 miss costs one extra read for heritage.
64
+ if (raw === undefined) {
65
+ try {
66
+ raw = await adapter.read(legacyStorageKey(namespace, slot));
67
+ } catch (cause) {
68
+ throw storageError(`backend read failed for slot "${slot}"`, 'BACKEND_READ_FAILED', {
69
+ operation: 'load',
70
+ namespace,
71
+ slot,
72
+ cause
73
+ });
74
+ }
75
+ }
76
+ if (raw === undefined) {
77
+ const data = createDefaultData(schema);
78
+ return {
79
+ status: 'default',
80
+ data
81
+ };
82
+ }
83
+
84
+ // F3: measure raw UTF-8 byte length before JSON.parse and reject oversized records.
85
+ const rawBytes = utf8ByteLength(raw);
86
+ if (rawBytes > STORAGE_LIMITS.MAX_SERIALIZED_BYTES) {
87
+ throw storageError(`stored record for slot "${slot}" exceeds ${STORAGE_LIMITS.MAX_SERIALIZED_BYTES} bytes (got ${rawBytes})`, 'SIZE_EXCEEDED', {
88
+ operation: 'load',
89
+ namespace,
90
+ slot,
91
+ schemaId: schema.id,
92
+ schemaVersion: schema.version,
93
+ path: 'envelope'
94
+ });
95
+ }
96
+
97
+ // Validate loaded bytes as untrusted before migration
98
+ let envelope;
99
+ try {
100
+ envelope = parseEnvelope(raw);
101
+ } catch (cause) {
102
+ if (cause instanceof GameStorageError) {
103
+ throw new GameStorageError(cause.message, {
104
+ code: cause.code,
105
+ operation: 'load',
106
+ namespace,
107
+ slot,
108
+ schemaId: schema.id,
109
+ schemaVersion: schema.version,
110
+ path: cause.path,
111
+ cause: cause.cause ?? cause
112
+ });
113
+ }
114
+ throw storageError(`corrupt envelope for slot "${slot}"`, 'CORRUPT_ENVELOPE', {
115
+ operation: 'load',
116
+ namespace,
117
+ slot,
118
+ cause
119
+ });
120
+ }
121
+ if (envelope.schemaId !== schema.id) {
122
+ throw storageError(`schema id mismatch: expected "${schema.id}" got "${envelope.schemaId}"`, 'SCHEMA_ID_MISMATCH', {
123
+ operation: 'load',
124
+ namespace,
125
+ slot,
126
+ schemaId: schema.id,
127
+ schemaVersion: schema.version
128
+ });
129
+ }
130
+ if (!Number.isSafeInteger(envelope.schemaVersion) || envelope.schemaVersion < 1) {
131
+ throw storageError(`corrupt envelope: invalid schemaVersion`, 'CORRUPT_ENVELOPE', {
132
+ operation: 'load',
133
+ namespace,
134
+ slot,
135
+ schemaId: schema.id
136
+ });
137
+ }
138
+ if (envelope.schemaVersion > schema.version) {
139
+ throw storageError(`stored version ${envelope.schemaVersion} is newer than current ${schema.version}`, 'FUTURE_VERSION', {
140
+ operation: 'load',
141
+ namespace,
142
+ slot,
143
+ schemaId: schema.id,
144
+ schemaVersion: schema.version
145
+ });
146
+ }
147
+
148
+ // F3: bounded plain-data validation of the loaded payload BEFORE any migration sees it.
149
+ try {
150
+ cloneAndValidatePlainData(envelope.payload, 'payload');
151
+ } catch (cause) {
152
+ if (cause instanceof GameStorageError) {
153
+ throw new GameStorageError(cause.message, {
154
+ code: cause.code,
155
+ operation: 'load',
156
+ namespace,
157
+ slot,
158
+ schemaId: schema.id,
159
+ schemaVersion: schema.version,
160
+ path: cause.path,
161
+ cause: cause.cause ?? cause
162
+ });
163
+ }
164
+ throw storageError(`payload validation failed`, 'VALIDATION_FAILED', {
165
+ operation: 'load',
166
+ namespace,
167
+ slot,
168
+ cause
169
+ });
170
+ }
171
+
172
+ // Migrate if needed — each migration receives a deeply frozen engine-owned input and its output is bounded-cloned/frozen.
173
+ let payload = envelope.payload;
174
+ let fromVersion = envelope.schemaVersion;
175
+ let toVersion = schema.version;
176
+ let migrated = false;
177
+ if (fromVersion !== toVersion) {
178
+ try {
179
+ const result = migratePayload(schema, fromVersion, payload);
180
+ payload = result.data;
181
+ fromVersion = result.fromVersion;
182
+ toVersion = result.toVersion;
183
+ migrated = true;
184
+ } catch (cause) {
185
+ if (cause instanceof GameStorageError) {
186
+ throw new GameStorageError(cause.message, {
187
+ code: cause.code,
188
+ operation: 'load',
189
+ namespace,
190
+ slot,
191
+ schemaId: schema.id,
192
+ schemaVersion: schema.version,
193
+ path: cause.path,
194
+ cause: cause.cause ?? cause
195
+ });
196
+ }
197
+ throw storageError(`migration failed`, 'MIGRATION_FAILED', {
198
+ operation: 'load',
199
+ namespace,
200
+ slot,
201
+ cause
202
+ });
203
+ }
204
+ }
205
+
206
+ // Final validation — never overwrites stored record on failure
207
+ let data;
208
+ try {
209
+ data = validateCurrentData(schema, payload, 'payload');
210
+ } catch (cause) {
211
+ if (cause instanceof GameStorageError) {
212
+ throw new GameStorageError(cause.message, {
213
+ code: 'VALIDATION_FAILED',
214
+ operation: 'load',
215
+ namespace,
216
+ slot,
217
+ schemaId: schema.id,
218
+ schemaVersion: schema.version,
219
+ path: cause.path,
220
+ cause: cause.cause ?? cause
221
+ });
222
+ }
223
+ throw storageError(`final validation failed`, 'VALIDATION_FAILED', {
224
+ operation: 'load',
225
+ namespace,
226
+ slot,
227
+ cause
228
+ });
229
+ }
230
+ if (migrated) {
231
+ return {
232
+ status: 'migrated',
233
+ data,
234
+ fromVersion: envelope.schemaVersion,
235
+ toVersion
236
+ };
237
+ }
238
+ return {
239
+ status: 'stored',
240
+ data
241
+ };
242
+ }
243
+ async function saveInternal(slot, data) {
244
+ validateSlot(slot);
245
+ // GS-STORAGE-02: save() already validated, normalized, cloned, and
246
+ // froze this snapshot at acceptance — re-running domain validation
247
+ // here would double-apply normalizing validators. Serialization still
248
+ // bounds-checks the bytes at its own boundary.
249
+ const envelope = {
250
+ format: STORAGE_ENVELOPE_FORMAT,
251
+ schemaId: schema.id,
252
+ schemaVersion: schema.version,
253
+ savedAtMs: Date.now(),
254
+ payload: data
255
+ };
256
+ let serialized;
257
+ try {
258
+ serialized = serializeEnvelope(envelope);
259
+ } catch (cause) {
260
+ if (cause instanceof GameStorageError) {
261
+ throw new GameStorageError(cause.message, {
262
+ code: cause.code === 'SIZE_EXCEEDED' || cause.code === 'DEPTH_EXCEEDED' ? cause.code : 'SERIALIZATION_FAILED',
263
+ operation: 'save',
264
+ namespace,
265
+ slot,
266
+ schemaId: schema.id,
267
+ schemaVersion: schema.version,
268
+ path: cause.path,
269
+ cause: cause.cause ?? cause
270
+ });
271
+ }
272
+ throw storageError(`serialization failed for slot "${slot}"`, 'SERIALIZATION_FAILED', {
273
+ operation: 'save',
274
+ namespace,
275
+ slot,
276
+ cause
277
+ });
278
+ }
279
+ const key = storageKey(namespace, slot);
280
+ try {
281
+ await adapter.write(key, serialized);
282
+ } catch (cause) {
283
+ throw storageError(`backend write failed for slot "${slot}"`, 'BACKEND_WRITE_FAILED', {
284
+ operation: 'save',
285
+ namespace,
286
+ slot,
287
+ cause
288
+ });
289
+ }
290
+ }
291
+ async function removeInternal(slot) {
292
+ validateSlot(slot);
293
+ // GS-STORAGE-01: delete the versioned record and its legacy heritage.
294
+ // Heritage deletion matches v1 shared-fate semantics for colliding
295
+ // pairs and converges to independence as pairs save under v2.
296
+ const key = storageKey(namespace, slot);
297
+ const legacyKey = legacyStorageKey(namespace, slot);
298
+ try {
299
+ await adapter.remove(key);
300
+ if (legacyKey !== key) {
301
+ await adapter.remove(legacyKey);
302
+ }
303
+ } catch (cause) {
304
+ throw storageError(`backend remove failed for slot "${slot}"`, 'BACKEND_REMOVE_FAILED', {
305
+ operation: 'remove',
306
+ namespace,
307
+ slot,
308
+ cause
309
+ });
310
+ }
311
+ }
312
+ const store = {
313
+ get disposed() {
314
+ return disposed;
315
+ },
316
+ load(slot) {
317
+ if (disposed) {
318
+ return Promise.reject(storageError(`store is disposed`, 'DISPOSED', {
319
+ operation: 'load',
320
+ namespace,
321
+ slot
322
+ }));
323
+ }
324
+ try {
325
+ validateSlot(slot);
326
+ } catch (e) {
327
+ return Promise.reject(e);
328
+ }
329
+ return enqueue(slot, () => loadInternal(slot));
330
+ },
331
+ save(slot, data) {
332
+ if (disposed) {
333
+ return Promise.reject(storageError(`store is disposed`, 'DISPOSED', {
334
+ operation: 'save',
335
+ namespace,
336
+ slot
337
+ }));
338
+ }
339
+ try {
340
+ validateSlot(slot);
341
+ } catch (e) {
342
+ return Promise.reject(e);
343
+ }
344
+ // Snapshot synchronously so caller mutation after save() does not affect stored bytes
345
+ let snapshot;
346
+ try {
347
+ snapshot = validateCurrentData(schema, data, 'data');
348
+ } catch (e) {
349
+ return Promise.reject(e);
350
+ }
351
+ return enqueue(slot, () => saveInternal(slot, snapshot));
352
+ },
353
+ remove(slot) {
354
+ if (disposed) {
355
+ return Promise.reject(storageError(`store is disposed`, 'DISPOSED', {
356
+ operation: 'remove',
357
+ namespace,
358
+ slot
359
+ }));
360
+ }
361
+ try {
362
+ validateSlot(slot);
363
+ } catch (e) {
364
+ return Promise.reject(e);
365
+ }
366
+ return enqueue(slot, () => removeInternal(slot));
367
+ },
368
+ delete(slot) {
369
+ return store.remove(slot);
370
+ },
371
+ async flush() {
372
+ // Snapshot the currently tracked operation promises; do not let operations accepted after the call delay this flush.
373
+ const snapshot = Array.from(active);
374
+ if (snapshot.length === 0) return;
375
+ await Promise.allSettled(snapshot);
376
+ },
377
+ dispose() {
378
+ if (disposed) return;
379
+ disposed = true;
380
+ // Do not use generation to suppress already-accepted Promise results.
381
+ // Retain queue/tail ownership until every accepted operation settles; tails clean themselves when still current.
382
+ // New work is rejected at the public boundary above.
383
+ }
384
+ };
385
+ return store;
386
+ }
387
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["GameStorageError","storageError","STORAGE_LIMITS","storageKey","legacyStorageKey","validateNamespace","validateSlot","createDefaultData","migratePayload","validateCurrentData","cloneAndValidatePlainData","parseEnvelope","serializeEnvelope","utf8ByteLength","STORAGE_ENVELOPE_FORMAT","createGameSaveStore","options","schema","adapter","namespace","slotQueues","Map","active","Set","disposed","track","p","wrapped","finally","delete","add","enqueue","slot","op","tail","get","Promise","resolve","resolveTail","nextTail","res","set","run","catch","then","loadInternal","key","raw","read","cause","operation","undefined","data","status","rawBytes","MAX_SERIALIZED_BYTES","schemaId","id","schemaVersion","version","path","envelope","message","code","Number","isSafeInteger","payload","fromVersion","toVersion","migrated","result","saveInternal","format","savedAtMs","Date","now","serialized","write","removeInternal","legacyKey","remove","store","load","reject","e","save","snapshot","flush","Array","from","length","allSettled","dispose"],"sourceRoot":"../../../src","sources":["storage/store.ts"],"mappings":"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","ignoreList":[]}