omegga 1.2.9 → 1.4.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 (328) hide show
  1. package/README.md +50 -11
  2. package/dist/brickadia/config.js +26 -90
  3. package/dist/brickadia/config.js.map +1 -1
  4. package/dist/brickadia/server.js +290 -293
  5. package/dist/brickadia/server.js.map +1 -1
  6. package/dist/cli/auth.js +149 -177
  7. package/dist/cli/auth.js.map +1 -1
  8. package/dist/cli/config.js +64 -66
  9. package/dist/cli/config.js.map +1 -1
  10. package/dist/cli/index.js +14 -14
  11. package/dist/cli/index.js.map +1 -1
  12. package/dist/cli/installer.js +37 -43
  13. package/dist/cli/installer.js.map +1 -1
  14. package/dist/cli/plugin.js +651 -682
  15. package/dist/cli/plugin.js.map +1 -1
  16. package/dist/cli/terminal.js +811 -733
  17. package/dist/cli/terminal.js.map +1 -1
  18. package/dist/config/formats/format_js.js +6 -6
  19. package/dist/config/formats/format_js.js.map +1 -1
  20. package/dist/config/formats/format_yml.js +7 -10
  21. package/dist/config/formats/format_yml.js.map +1 -1
  22. package/dist/config/index.js +46 -68
  23. package/dist/config/index.js.map +1 -1
  24. package/dist/config/reader.js +16 -27
  25. package/dist/config/reader.js.map +1 -1
  26. package/dist/config/validator.js +23 -25
  27. package/dist/config/validator.js.map +1 -1
  28. package/dist/config/writer.js +11 -21
  29. package/dist/config/writer.js.map +1 -1
  30. package/dist/index.js +18 -64
  31. package/dist/index.js.map +1 -1
  32. package/dist/info/default_commands.json.js +39 -0
  33. package/dist/info/default_commands.json.js.map +1 -0
  34. package/dist/logger.js +61 -60
  35. package/dist/logger.js.map +1 -1
  36. package/dist/main.js +425 -471
  37. package/dist/main.js.map +1 -1
  38. package/dist/omegga/auth.js +101 -148
  39. package/dist/omegga/auth.js.map +1 -1
  40. package/dist/omegga/commandInjector.js +261 -251
  41. package/dist/omegga/commandInjector.js.map +1 -1
  42. package/dist/omegga/index.js +14 -52
  43. package/dist/omegga/index.js.map +1 -1
  44. package/dist/omegga/logWrangler.js +224 -275
  45. package/dist/omegga/logWrangler.js.map +1 -1
  46. package/dist/omegga/matchers/auth.js +36 -50
  47. package/dist/omegga/matchers/auth.js.map +1 -1
  48. package/dist/omegga/matchers/chat.js +49 -71
  49. package/dist/omegga/matchers/chat.js.map +1 -1
  50. package/dist/omegga/matchers/command.js +25 -36
  51. package/dist/omegga/matchers/command.js.map +1 -1
  52. package/dist/omegga/matchers/exit.js +15 -18
  53. package/dist/omegga/matchers/exit.js.map +1 -1
  54. package/dist/omegga/matchers/index.js +26 -40
  55. package/dist/omegga/matchers/index.js.map +1 -1
  56. package/dist/omegga/matchers/init.js +20 -23
  57. package/dist/omegga/matchers/init.js.map +1 -1
  58. package/dist/omegga/matchers/interact.js +58 -64
  59. package/dist/omegga/matchers/interact.js.map +1 -1
  60. package/dist/omegga/matchers/join.js +74 -95
  61. package/dist/omegga/matchers/join.js.map +1 -1
  62. package/dist/omegga/matchers/leave.js +43 -56
  63. package/dist/omegga/matchers/leave.js.map +1 -1
  64. package/dist/omegga/matchers/mapChange.js +26 -35
  65. package/dist/omegga/matchers/mapChange.js.map +1 -1
  66. package/dist/omegga/matchers/minigameJoin.js +24 -31
  67. package/dist/omegga/matchers/minigameJoin.js.map +1 -1
  68. package/dist/omegga/matchers/version.js +42 -49
  69. package/dist/omegga/matchers/version.js.map +1 -1
  70. package/dist/omegga/player.js +562 -528
  71. package/dist/omegga/player.js.map +1 -1
  72. package/dist/omegga/plugin/interface.js +91 -98
  73. package/dist/omegga/plugin/interface.js.map +1 -1
  74. package/dist/omegga/plugin/plugin_jsonrpc_stdio.js +578 -429
  75. package/dist/omegga/plugin/plugin_jsonrpc_stdio.js.map +1 -1
  76. package/dist/omegga/plugin/plugin_node_safe/proxyOmegga.js +282 -294
  77. package/dist/omegga/plugin/plugin_node_safe/proxyOmegga.js.map +1 -1
  78. package/dist/omegga/plugin/plugin_node_safe.js +365 -393
  79. package/dist/omegga/plugin/plugin_node_safe.js.map +1 -1
  80. package/dist/omegga/plugin/plugin_node_unsafe.js +119 -179
  81. package/dist/omegga/plugin/plugin_node_unsafe.js.map +1 -1
  82. package/dist/omegga/plugin.js +402 -347
  83. package/dist/omegga/plugin.js.map +1 -1
  84. package/dist/omegga/server.js +742 -774
  85. package/dist/omegga/server.js.map +1 -1
  86. package/dist/omegga/wrapper.js +64 -91
  87. package/dist/omegga/wrapper.js.map +1 -1
  88. package/dist/plugin.js +11 -31
  89. package/dist/plugin.js.map +1 -1
  90. package/dist/softconfig.js +139 -100
  91. package/dist/softconfig.js.map +1 -1
  92. package/dist/updater/steam.js +104 -114
  93. package/dist/updater/steam.js.map +1 -1
  94. package/dist/util/brdb.js +496 -528
  95. package/dist/util/brdb.js.map +1 -1
  96. package/dist/util/brick/checkBounds.js +11 -15
  97. package/dist/util/brick/checkBounds.js.map +1 -1
  98. package/dist/util/brick/constants.js +723 -174
  99. package/dist/util/brick/constants.js.map +1 -1
  100. package/dist/util/brick/displayName.js +204 -211
  101. package/dist/util/brick/displayName.js.map +1 -1
  102. package/dist/util/brick/getBounds.js +29 -41
  103. package/dist/util/brick/getBounds.js.map +1 -1
  104. package/dist/util/brick/getBrickSize.js +6 -7
  105. package/dist/util/brick/getBrickSize.js.map +1 -1
  106. package/dist/util/brick/getScaleAxis.js +24 -30
  107. package/dist/util/brick/getScaleAxis.js.map +1 -1
  108. package/dist/util/brick/index.js +8 -29
  109. package/dist/util/brick/index.js.map +1 -1
  110. package/dist/util/brick/rotate.js +29 -34
  111. package/dist/util/brick/rotate.js.map +1 -1
  112. package/dist/util/brick/setOwnership.js +13 -19
  113. package/dist/util/brick/setOwnership.js.map +1 -1
  114. package/dist/util/chat.js +53 -44
  115. package/dist/util/chat.js.map +1 -1
  116. package/dist/util/color.js +112 -124
  117. package/dist/util/color.js.map +1 -1
  118. package/dist/util/file.js +54 -98
  119. package/dist/util/file.js.map +1 -1
  120. package/dist/util/index.js +84 -106
  121. package/dist/util/index.js.map +1 -1
  122. package/dist/util/map.js +18 -20
  123. package/dist/util/map.js.map +1 -1
  124. package/dist/util/pattern.js +6 -9
  125. package/dist/util/pattern.js.map +1 -1
  126. package/dist/util/time.js +31 -34
  127. package/dist/util/time.js.map +1 -1
  128. package/dist/util/uuid.js +10 -8
  129. package/dist/util/uuid.js.map +1 -1
  130. package/dist/util/wsl.js +19 -25
  131. package/dist/util/wsl.js.map +1 -1
  132. package/dist/version.js +7 -9
  133. package/dist/version.js.map +1 -1
  134. package/dist/webserver/backend/api.js +784 -874
  135. package/dist/webserver/backend/api.js.map +1 -1
  136. package/dist/webserver/backend/calendar.js +14 -17
  137. package/dist/webserver/backend/calendar.js.map +1 -1
  138. package/dist/webserver/backend/database.js +563 -613
  139. package/dist/webserver/backend/database.js.map +1 -1
  140. package/dist/webserver/backend/index.js +153 -191
  141. package/dist/webserver/backend/index.js.map +1 -1
  142. package/dist/webserver/backend/metrics.js +219 -248
  143. package/dist/webserver/backend/metrics.js.map +1 -1
  144. package/dist/webserver/backend/util.js +47 -68
  145. package/dist/webserver/backend/util.js.map +1 -1
  146. package/dist/worker.js +322 -0
  147. package/dist/worker.js.map +1 -0
  148. package/package.json +16 -11
  149. package/public/app.html +18 -18
  150. package/public/assets/IconArrowRight-BuVxhqKX.js +2 -0
  151. package/public/assets/{IconArrowRight-CA5_cccJ.js.map → IconArrowRight-BuVxhqKX.js.map} +1 -1
  152. package/public/assets/IconCheck-DOe3u7iH.js +2 -0
  153. package/public/assets/{IconCheck-Dyq5qyY1.js.map → IconCheck-DOe3u7iH.js.map} +1 -1
  154. package/public/assets/IconLockOpen-Bs7Tsf6u.js +2 -0
  155. package/public/assets/{IconLockOpen-D95XLORK.js.map → IconLockOpen-Bs7Tsf6u.js.map} +1 -1
  156. package/public/assets/IconWorld-B6GK5qpx.js +2 -0
  157. package/public/assets/{IconWorld-DtARpBKX.js.map → IconWorld-B6GK5qpx.js.map} +1 -1
  158. package/public/assets/IconWorldPlus-DpfueG8_.js +2 -0
  159. package/public/assets/{IconWorldPlus-CGBAsLNj.js.map → IconWorldPlus-DpfueG8_.js.map} +1 -1
  160. package/public/assets/IconX-CvmO0bbE.js +2 -0
  161. package/public/assets/{IconX-SYtbnYKI.js.map → IconX-CvmO0bbE.js.map} +1 -1
  162. package/public/assets/app-nJIpyOiP.js +6 -0
  163. package/public/assets/{app-BtOlgo__.js.map → app-nJIpyOiP.js.map} +1 -1
  164. package/public/assets/{auth-CvxEWAMc.js → auth-6N37o421.js} +2 -2
  165. package/public/assets/{auth-CvxEWAMc.js.map → auth-6N37o421.js.map} +1 -1
  166. package/public/assets/client-BT1QYH0O.js +10 -0
  167. package/public/assets/{client-C5T7_OK9.js.map → client-BT1QYH0O.js.map} +1 -1
  168. package/public/assets/index-2cgXLhrt.js +2 -0
  169. package/public/assets/{index-CRRRLlCc.js.map → index-2cgXLhrt.js.map} +1 -1
  170. package/public/assets/index-3dNmNZ9B.js +10 -0
  171. package/public/assets/{index-Bq9C9SqB.js.map → index-3dNmNZ9B.js.map} +1 -1
  172. package/public/assets/{index-i4mjW0og.js → index-CrN8I5Az.js} +2 -2
  173. package/public/assets/index-CrN8I5Az.js.map +1 -0
  174. package/public/assets/index-CtCtK5BX.js +2 -0
  175. package/public/assets/{index-DqHVrEeL.js.map → index-CtCtK5BX.js.map} +1 -1
  176. package/public/assets/index-D0OPOe3j.js +2 -0
  177. package/public/assets/{index-c0qeY2gs.js.map → index-D0OPOe3j.js.map} +1 -1
  178. package/public/assets/{index-DYcAgWjJ.js → index-DY750sgZ.js} +2 -2
  179. package/public/assets/{index-DYcAgWjJ.js.map → index-DY750sgZ.js.map} +1 -1
  180. package/public/assets/jsx-runtime-BX5r4UiA.js +2 -0
  181. package/public/assets/jsx-runtime-BX5r4UiA.js.map +1 -0
  182. package/public/assets/jsx-runtime-DldvXD6N.js +2 -0
  183. package/public/assets/{jsx-runtime-Bw5QeaCk.js.map → jsx-runtime-DldvXD6N.js.map} +1 -1
  184. package/public/assets/shared/@components-DdtLZOaA.js +2 -0
  185. package/public/assets/shared/@components-DdtLZOaA.js.map +1 -0
  186. package/public/assets/shared/{@hooks-DfTzYBIL.js → @hooks-Ch_hJYh0.js} +2 -2
  187. package/public/assets/shared/{@hooks-DfTzYBIL.js.map → @hooks-Ch_hJYh0.js.map} +1 -1
  188. package/public/assets/shared/{@nanostores_react-HTG3s0lp.js → @nanostores_react-DJPF1Eqx.js} +2 -2
  189. package/public/assets/shared/{@nanostores_react-HTG3s0lp.js.map → @nanostores_react-DJPF1Eqx.js.map} +1 -1
  190. package/public/assets/shared/@tabler_icons-react-B4bN8gHc.js +3 -0
  191. package/public/assets/shared/{@tabler_icons-react--FJWdUou.js.map → @tabler_icons-react-B4bN8gHc.js.map} +1 -1
  192. package/public/assets/shared/nanostores-BFqqIY_c.js.map +1 -1
  193. package/public/assets/shared/react-dom-8Rcmh_FG.js +2 -0
  194. package/public/assets/shared/{react-dom-BznoGTRX.js.map → react-dom-8Rcmh_FG.js.map} +1 -1
  195. package/public/assets/shared/react-iXLZ_Bod.js +2 -0
  196. package/public/assets/shared/{react-CR6vSpIu.js.map → react-iXLZ_Bod.js.map} +1 -1
  197. package/public/assets/shared/react_jsx-runtime-BwhiLcBy.js +2 -0
  198. package/public/assets/shared/{react_jsx-runtime-C15Zu6_p.js.map → react_jsx-runtime-BwhiLcBy.js.map} +1 -1
  199. package/public/assets/shared/{wouter-DbmGxXTo.js → wouter-CUC1caxu.js} +2 -2
  200. package/public/assets/shared/wouter-CUC1caxu.js.map +1 -0
  201. package/public/auth.html +14 -14
  202. package/templates/safe-ts/omegga.d.ts +31 -1
  203. package/dist/brickadia/config.d.ts +0 -3
  204. package/dist/brickadia/presets.d.ts +0 -65
  205. package/dist/brickadia/presets.js +0 -3
  206. package/dist/brickadia/presets.js.map +0 -1
  207. package/dist/brickadia/server.d.ts +0 -36
  208. package/dist/brickadia/types.d.ts +0 -45
  209. package/dist/brickadia/types.js +0 -3
  210. package/dist/brickadia/types.js.map +0 -1
  211. package/dist/cli/auth.d.ts +0 -26
  212. package/dist/cli/config.d.ts +0 -10
  213. package/dist/cli/index.d.ts +0 -30
  214. package/dist/cli/installer.d.ts +0 -1
  215. package/dist/cli/plugin.d.ts +0 -22
  216. package/dist/cli/terminal.d.ts +0 -25
  217. package/dist/config/authorizer.d.ts +0 -2
  218. package/dist/config/authorizer.js +0 -38
  219. package/dist/config/authorizer.js.map +0 -1
  220. package/dist/config/formats/format_js.d.ts +0 -3
  221. package/dist/config/formats/format_yml.d.ts +0 -3
  222. package/dist/config/index.d.ts +0 -18
  223. package/dist/config/reader.d.ts +0 -3
  224. package/dist/config/types.d.ts +0 -50
  225. package/dist/config/types.js +0 -3
  226. package/dist/config/types.js.map +0 -1
  227. package/dist/config/validator.d.ts +0 -6
  228. package/dist/config/writer.d.ts +0 -3
  229. package/dist/index.d.ts +0 -22
  230. package/dist/info/default_commands.json +0 -29
  231. package/dist/logger.d.ts +0 -41
  232. package/dist/main.d.ts +0 -1
  233. package/dist/omegga/auth.d.ts +0 -9
  234. package/dist/omegga/commandInjector.d.ts +0 -35
  235. package/dist/omegga/index.d.ts +0 -7
  236. package/dist/omegga/logWrangler.d.ts +0 -32
  237. package/dist/omegga/matchers/auth.d.ts +0 -10
  238. package/dist/omegga/matchers/chat.d.ts +0 -10
  239. package/dist/omegga/matchers/command.d.ts +0 -7
  240. package/dist/omegga/matchers/exit.d.ts +0 -3
  241. package/dist/omegga/matchers/index.d.ts +0 -3
  242. package/dist/omegga/matchers/init.d.ts +0 -3
  243. package/dist/omegga/matchers/interact.d.ts +0 -4
  244. package/dist/omegga/matchers/join.d.ts +0 -4
  245. package/dist/omegga/matchers/leave.d.ts +0 -4
  246. package/dist/omegga/matchers/mapChange.d.ts +0 -3
  247. package/dist/omegga/matchers/minigameJoin.d.ts +0 -9
  248. package/dist/omegga/matchers/types.d.ts +0 -5
  249. package/dist/omegga/matchers/types.js +0 -3
  250. package/dist/omegga/matchers/types.js.map +0 -1
  251. package/dist/omegga/matchers/version.d.ts +0 -3
  252. package/dist/omegga/player.d.ts +0 -81
  253. package/dist/omegga/plugin/interface.d.ts +0 -30
  254. package/dist/omegga/plugin/plugin_jsonrpc_stdio.d.ts +0 -23
  255. package/dist/omegga/plugin/plugin_node_safe/proxyOmegga.d.ts +0 -145
  256. package/dist/omegga/plugin/plugin_node_safe/worker.d.ts +0 -1
  257. package/dist/omegga/plugin/plugin_node_safe/worker.js +0 -367
  258. package/dist/omegga/plugin/plugin_node_safe/worker.js.map +0 -1
  259. package/dist/omegga/plugin/plugin_node_safe.d.ts +0 -23
  260. package/dist/omegga/plugin/plugin_node_unsafe.d.ts +0 -13
  261. package/dist/omegga/plugin.d.ts +0 -63
  262. package/dist/omegga/server.d.ts +0 -166
  263. package/dist/omegga/types.d.ts +0 -49
  264. package/dist/omegga/types.js +0 -3
  265. package/dist/omegga/types.js.map +0 -1
  266. package/dist/omegga/wrapper.d.ts +0 -32
  267. package/dist/plugin.d.ts +0 -916
  268. package/dist/softconfig.d.ts +0 -67
  269. package/dist/tsconfig.tsbuildinfo +0 -1
  270. package/dist/updater/index.d.ts +0 -1
  271. package/dist/updater/index.js +0 -10
  272. package/dist/updater/index.js.map +0 -1
  273. package/dist/updater/steam.d.ts +0 -52
  274. package/dist/util/brdb.d.ts +0 -31
  275. package/dist/util/brick/checkBounds.d.ts +0 -8
  276. package/dist/util/brick/constants.d.ts +0 -18
  277. package/dist/util/brick/displayName.d.ts +0 -7
  278. package/dist/util/brick/getBounds.d.ts +0 -5
  279. package/dist/util/brick/getBrickSize.d.ts +0 -3
  280. package/dist/util/brick/getScaleAxis.d.ts +0 -3
  281. package/dist/util/brick/index.d.ts +0 -14
  282. package/dist/util/brick/rotate.d.ts +0 -16
  283. package/dist/util/brick/setOwnership.d.ts +0 -12
  284. package/dist/util/chat.d.ts +0 -23
  285. package/dist/util/color.d.ts +0 -13
  286. package/dist/util/file.d.ts +0 -5
  287. package/dist/util/index.d.ts +0 -183
  288. package/dist/util/map.d.ts +0 -6
  289. package/dist/util/pattern.d.ts +0 -1
  290. package/dist/util/time.d.ts +0 -39
  291. package/dist/util/uuid.d.ts +0 -3
  292. package/dist/util/wsl.d.ts +0 -2
  293. package/dist/version.d.ts +0 -2
  294. package/dist/webserver/backend/api.d.ts +0 -115
  295. package/dist/webserver/backend/calendar.d.ts +0 -5
  296. package/dist/webserver/backend/database.d.ts +0 -150
  297. package/dist/webserver/backend/index.d.ts +0 -30
  298. package/dist/webserver/backend/metrics.d.ts +0 -3
  299. package/dist/webserver/backend/types.d.ts +0 -114
  300. package/dist/webserver/backend/types.js +0 -3
  301. package/dist/webserver/backend/types.js.map +0 -1
  302. package/dist/webserver/backend/util.d.ts +0 -2
  303. package/dist/webserver/index.d.ts +0 -2
  304. package/dist/webserver/index.js +0 -9
  305. package/dist/webserver/index.js.map +0 -1
  306. package/public/assets/IconArrowRight-CA5_cccJ.js +0 -7
  307. package/public/assets/IconCheck-Dyq5qyY1.js +0 -17
  308. package/public/assets/IconLockOpen-D95XLORK.js +0 -7
  309. package/public/assets/IconWorld-DtARpBKX.js +0 -72
  310. package/public/assets/IconWorldPlus-CGBAsLNj.js +0 -182
  311. package/public/assets/IconX-SYtbnYKI.js +0 -12
  312. package/public/assets/app-BtOlgo__.js +0 -6
  313. package/public/assets/client-C5T7_OK9.js +0 -26
  314. package/public/assets/index-Bq9C9SqB.js +0 -10
  315. package/public/assets/index-CRRRLlCc.js +0 -10
  316. package/public/assets/index-DqHVrEeL.js +0 -10
  317. package/public/assets/index-c0qeY2gs.js +0 -10
  318. package/public/assets/index-i4mjW0og.js.map +0 -1
  319. package/public/assets/jsx-runtime-Bw5QeaCk.js +0 -10
  320. package/public/assets/jsx-runtime-DoEZbXM1.js +0 -2
  321. package/public/assets/jsx-runtime-DoEZbXM1.js.map +0 -1
  322. package/public/assets/shared/@components-DVehBp7v.js +0 -2
  323. package/public/assets/shared/@components-DVehBp7v.js.map +0 -1
  324. package/public/assets/shared/@tabler_icons-react--FJWdUou.js +0 -29458
  325. package/public/assets/shared/react-CR6vSpIu.js +0 -2
  326. package/public/assets/shared/react-dom-BznoGTRX.js +0 -2
  327. package/public/assets/shared/react_jsx-runtime-C15Zu6_p.js +0 -2
  328. package/public/assets/shared/wouter-DbmGxXTo.js.map +0 -1
package/dist/util/brdb.js CHANGED
@@ -1,567 +1,535 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.readBrdbMeta = readBrdbMeta;
7
- exports.readBrdbScreenshot = readBrdbScreenshot;
8
- const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
9
- const fs_1 = require("fs");
10
- const zlib_1 = require("zlib");
11
- /** Open a brdb file if it exists */
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const BetterSqlite3 = require("better-sqlite3");
4
+ const fs = require("node:fs");
5
+ const zlib = require("zlib");
12
6
  function openBrdb(path) {
13
- if (!(0, fs_1.existsSync)(path))
14
- return null;
15
- try {
16
- return new better_sqlite3_1.default(path, { readonly: true, fileMustExist: true });
17
- }
18
- catch (err) {
19
- console.error(`Error reading BRDB metadata from ${path}:`, err);
20
- return null;
21
- }
7
+ if (!fs.existsSync(path)) return null;
8
+ try {
9
+ return new BetterSqlite3(path, { readonly: true, fileMustExist: true });
10
+ } catch (err) {
11
+ console.error(`Error reading BRDB metadata from ${path}:`, err);
12
+ return null;
13
+ }
22
14
  }
23
- /** Unsafely read a file from the BRDB database */
24
15
  function readFile(db, name) {
25
- const row = db
26
- .prepare(`SELECT compression, size_uncompressed, size_compressed, content
16
+ const row = db.prepare(
17
+ `SELECT compression, size_uncompressed, size_compressed, content
27
18
  FROM files
28
19
  LEFT JOIN blobs ON files.content_id = blobs.blob_id
29
- WHERE name = ? AND deleted_at IS NULL;`)
30
- .get(name);
31
- if (!row)
32
- return null;
33
- if (row.content === null)
34
- return null;
35
- if (!row.compression || row.size_compressed >= row.size_uncompressed)
36
- return row.content;
37
- return (0, zlib_1.zstdDecompressSync)(row.content, {
38
- maxOutputLength: row.size_uncompressed,
39
- params: {},
40
- });
20
+ WHERE name = ? AND deleted_at IS NULL;`
21
+ ).get(name);
22
+ if (!row) return null;
23
+ if (row.content === null) return null;
24
+ if (!row.compression || row.size_compressed >= row.size_uncompressed)
25
+ return row.content;
26
+ return zlib.zstdDecompressSync(row.content, {
27
+ maxOutputLength: row.size_uncompressed,
28
+ params: {}
29
+ });
41
30
  }
42
- /** read the meta and owner data from a brdb file */
43
- // TODO: specify a create/delete time range for the reading the owner data to allow "browsing" of revisions
44
31
  function readBrdbMeta(path) {
45
- const db = openBrdb(path);
46
- if (!db)
47
- return null;
48
- try {
49
- const worldJson = JSON.parse(readFile(db, 'World.json').toString('utf8'));
50
- const bundleJson = JSON.parse(readFile(db, 'Bundle.json').toString('utf8'));
51
- // parse the owner schema and its data
52
- const ownersSchemaBuf = readFile(db, 'Owners.schema');
53
- const ownersBuf = readFile(db, 'Owners.mps');
54
- // Convert the struct of arrays into an array of structs
55
- const owners = [];
56
- if (ownersBuf && ownersSchemaBuf) {
57
- const ownersSchema = readBrdbSchema(ownersSchemaBuf);
58
- const { value: ownersMps } = readBrdbType(ownersBuf, 0, ownersSchema, 'BRSavedOwnerTableSoA');
59
- for (let i = 0; i < ownersMps['UserIds'].length; i++) {
60
- const id = guidToUuid(ownersMps['UserIds'][i]);
61
- const name = ownersMps['UserNames'][i];
62
- const display_name = ownersMps['DisplayNames'][i];
63
- const entity_count = ownersMps['EntityCounts'][i];
64
- const brick_count = ownersMps['BrickCounts'][i];
65
- const component_count = ownersMps['ComponentCounts'][i];
66
- const wire_count = ownersMps['WireCounts'][i];
67
- owners.push({
68
- id,
69
- name,
70
- display_name,
71
- entity_count,
72
- brick_count,
73
- component_count,
74
- wire_count,
75
- });
76
- }
77
- }
78
- db.close();
79
- return {
80
- meta: { world: worldJson, bundle: bundleJson },
81
- owners,
82
- };
83
- }
84
- catch (err) {
85
- console.error(`Error reading BRDB metadata from ${path}:`, err);
86
- db.close();
87
- return null;
88
- }
89
- }
90
- /** read the screenshot from a brdb file */
91
- function readBrdbScreenshot(path) {
92
- const db = openBrdb(path);
93
- if (!db)
94
- return null;
95
- try {
96
- const file = readFile(db, 'Screenshot.jpg');
97
- db.close();
98
- return file;
99
- }
100
- catch (err) {
101
- console.error(`Error reading BRDB screenshot from ${path}:`, err);
102
- db.close();
32
+ const db = openBrdb(path);
33
+ if (!db) return null;
34
+ try {
35
+ const worldJson = JSON.parse(
36
+ readFile(db, "World.json").toString("utf8")
37
+ );
38
+ const bundleJson = JSON.parse(readFile(db, "Bundle.json").toString("utf8"));
39
+ const ownersSchemaBuf = readFile(db, "Owners.schema");
40
+ const ownersBuf = readFile(db, "Owners.mps");
41
+ const owners = [];
42
+ if (ownersBuf && ownersSchemaBuf) {
43
+ const ownersSchema = readBrdbSchema(ownersSchemaBuf);
44
+ const { value: ownersMps } = readBrdbType(
45
+ ownersBuf,
46
+ 0,
47
+ ownersSchema,
48
+ "BRSavedOwnerTableSoA"
49
+ );
50
+ for (let i = 0; i < ownersMps["UserIds"].length; i++) {
51
+ const id = guidToUuid(ownersMps["UserIds"][i]);
52
+ const name = ownersMps["UserNames"][i];
53
+ const display_name = ownersMps["DisplayNames"][i];
54
+ const entity_count = ownersMps["EntityCounts"][i];
55
+ const brick_count = ownersMps["BrickCounts"][i];
56
+ const component_count = ownersMps["ComponentCounts"][i];
57
+ const wire_count = ownersMps["WireCounts"][i];
58
+ owners.push({
59
+ id,
60
+ name,
61
+ display_name,
62
+ entity_count,
63
+ brick_count,
64
+ component_count,
65
+ wire_count
66
+ });
67
+ }
103
68
  }
69
+ db.close();
70
+ return {
71
+ meta: { world: worldJson, bundle: bundleJson },
72
+ owners
73
+ };
74
+ } catch (err) {
75
+ console.error(`Error reading BRDB metadata from ${path}:`, err);
76
+ db.close();
77
+ return null;
78
+ }
104
79
  }
105
- /** get the msgpack format from a byte */
106
80
  function mpMarker(byte) {
107
- if ((byte & 128) === 0)
108
- return ['fixpos', byte & 63];
109
- if ((byte & 240) === 128)
110
- return ['fixmap', byte & 15];
111
- if ((byte & 240) === 144)
112
- return ['fixarray', byte & 15];
113
- if ((byte & 224) === 160)
114
- return ['fixstr', byte & 31];
115
- if ((byte & 224) === 224)
116
- return ['fixneg', -(byte & 31)];
117
- switch (byte) {
118
- case 192:
119
- return ['nil', null];
120
- case 194:
121
- return ['false', null];
122
- case 195:
123
- return ['true', null];
124
- case 196:
125
- return ['bin8', null];
126
- case 197:
127
- return ['bin16', null];
128
- case 198:
129
- return ['bin32', null];
130
- case 199:
131
- return ['ext8', null];
132
- case 200:
133
- return ['ext16', null];
134
- case 201:
135
- return ['ext32', null];
136
- case 202:
137
- return ['float32', null];
138
- case 203:
139
- return ['float64', null];
140
- case 204:
141
- return ['uint8', null];
142
- case 205:
143
- return ['uint16', null];
144
- case 206:
145
- return ['uint32', null];
146
- case 207:
147
- return ['uint64', null];
148
- case 208:
149
- return ['int8', null];
150
- case 209:
151
- return ['int16', null];
152
- case 210:
153
- return ['int32', null];
154
- case 211:
155
- return ['int64', null];
156
- case 212:
157
- return ['fixext1', null];
158
- case 213:
159
- return ['fixext2', null];
160
- case 214:
161
- return ['fixext4', null];
162
- case 215:
163
- return ['fixext8', null];
164
- case 216:
165
- return ['fixext16', null];
166
- case 217:
167
- return ['str8', null];
168
- case 218:
169
- return ['str16', null];
170
- case 219:
171
- return ['str32', null];
172
- case 220:
173
- return ['array16', null];
174
- case 221:
175
- return ['array32', null];
176
- case 222:
177
- return ['map16', null];
178
- case 223:
179
- return ['map32', null];
180
- default:
181
- return null;
182
- }
81
+ if ((byte & 128) === 0) return ["fixpos", byte & 63];
82
+ if ((byte & 240) === 128)
83
+ return ["fixmap", byte & 15];
84
+ if ((byte & 240) === 144)
85
+ return ["fixarray", byte & 15];
86
+ if ((byte & 224) === 160)
87
+ return ["fixstr", byte & 31];
88
+ if ((byte & 224) === 224)
89
+ return ["fixneg", -(byte & 31)];
90
+ switch (byte) {
91
+ case 192:
92
+ return ["nil", null];
93
+ case 194:
94
+ return ["false", null];
95
+ case 195:
96
+ return ["true", null];
97
+ case 196:
98
+ return ["bin8", null];
99
+ case 197:
100
+ return ["bin16", null];
101
+ case 198:
102
+ return ["bin32", null];
103
+ case 199:
104
+ return ["ext8", null];
105
+ case 200:
106
+ return ["ext16", null];
107
+ case 201:
108
+ return ["ext32", null];
109
+ case 202:
110
+ return ["float32", null];
111
+ case 203:
112
+ return ["float64", null];
113
+ case 204:
114
+ return ["uint8", null];
115
+ case 205:
116
+ return ["uint16", null];
117
+ case 206:
118
+ return ["uint32", null];
119
+ case 207:
120
+ return ["uint64", null];
121
+ case 208:
122
+ return ["int8", null];
123
+ case 209:
124
+ return ["int16", null];
125
+ case 210:
126
+ return ["int32", null];
127
+ case 211:
128
+ return ["int64", null];
129
+ case 212:
130
+ return ["fixext1", null];
131
+ case 213:
132
+ return ["fixext2", null];
133
+ case 214:
134
+ return ["fixext4", null];
135
+ case 215:
136
+ return ["fixext8", null];
137
+ case 216:
138
+ return ["fixext16", null];
139
+ case 217:
140
+ return ["str8", null];
141
+ case 218:
142
+ return ["str16", null];
143
+ case 219:
144
+ return ["str32", null];
145
+ case 220:
146
+ return ["array16", null];
147
+ case 221:
148
+ return ["array32", null];
149
+ case 222:
150
+ return ["map16", null];
151
+ case 223:
152
+ return ["map32", null];
153
+ default:
154
+ return null;
155
+ }
183
156
  }
184
157
  function mpString(buf, offset) {
185
- const byte = buf[offset];
186
- const marker = mpMarker(byte);
187
- if (!marker) {
188
- throw new Error(`Invalid msgpack format byte: ${byte.toString(16)}`);
189
- }
190
- return mpStringContent(buf, marker, offset + 1);
158
+ const byte = buf[offset];
159
+ const marker = mpMarker(byte);
160
+ if (!marker) {
161
+ throw new Error(`Invalid msgpack format byte: ${byte.toString(16)}`);
162
+ }
163
+ return mpStringContent(buf, marker, offset + 1);
191
164
  }
192
165
  function mpStringContent(buf, marker, offset) {
193
- const [m, size] = marker;
194
- if (m !== 'fixstr' && m !== 'str8' && m !== 'str16' && m !== 'str32') {
195
- throw new Error(`Expected string format, got ${m}`);
196
- }
197
- let strSize = 0;
198
- if (m === 'fixstr') {
199
- strSize = size;
200
- }
201
- else if (m === 'str8') {
202
- strSize = buf[offset];
203
- offset++;
204
- }
205
- else if (m === 'str16') {
206
- strSize = buf.readUInt16BE(offset);
207
- offset += 2;
208
- }
209
- else if (m === 'str32') {
210
- strSize = buf.readUInt32BE(offset);
211
- offset += 4;
212
- }
213
- if (!strSize)
214
- return { str: '', offset };
215
- const str = buf.toString('utf8', offset, offset + strSize);
216
- offset += strSize;
217
- return { str, offset };
166
+ const [m, size] = marker;
167
+ if (m !== "fixstr" && m !== "str8" && m !== "str16" && m !== "str32") {
168
+ throw new Error(`Expected string format, got ${m}`);
169
+ }
170
+ let strSize = 0;
171
+ if (m === "fixstr") {
172
+ strSize = size;
173
+ } else if (m === "str8") {
174
+ strSize = buf[offset];
175
+ offset++;
176
+ } else if (m === "str16") {
177
+ strSize = buf.readUInt16BE(offset);
178
+ offset += 2;
179
+ } else if (m === "str32") {
180
+ strSize = buf.readUInt32BE(offset);
181
+ offset += 4;
182
+ }
183
+ if (!strSize) return { str: "", offset };
184
+ const str = buf.toString("utf8", offset, offset + strSize);
185
+ offset += strSize;
186
+ return { str, offset };
218
187
  }
219
188
  function mpInt(buf, offset) {
220
- const [marker, num] = mpMarker(buf[offset]);
189
+ const [marker, num] = mpMarker(buf[offset]);
190
+ offset++;
191
+ if (!marker)
192
+ throw new Error(
193
+ `Invalid msgpack format byte: ${buf[offset - 1].toString(16)}`
194
+ );
195
+ if (marker === "fixpos") return { num, offset };
196
+ if (marker === "fixneg") return { num, offset };
197
+ if (marker === "uint8")
198
+ return {
199
+ num: buf.readUInt8(offset++),
200
+ offset
201
+ };
202
+ if (marker === "uint16") {
203
+ const num2 = buf.readUInt16BE(offset);
204
+ offset += 2;
205
+ return { num: num2, offset };
206
+ }
207
+ if (marker === "uint32") {
208
+ const num2 = buf.readUInt32BE(offset);
209
+ offset += 4;
210
+ return { num: num2, offset };
211
+ }
212
+ if (marker === "uint64") {
213
+ const num2 = BigInt.asUintN(64, BigInt(buf.readBigUInt64BE(offset)));
214
+ offset += 8;
215
+ return { num: Number(num2), offset };
216
+ }
217
+ if (marker === "int8") {
218
+ const num2 = buf.readInt8(offset);
221
219
  offset++;
222
- if (!marker)
223
- throw new Error(`Invalid msgpack format byte: ${buf[offset - 1].toString(16)}`);
224
- if (marker === 'fixpos')
225
- return { num, offset };
226
- if (marker === 'fixneg')
227
- return { num, offset };
228
- if (marker === 'uint8')
229
- return {
230
- num: buf.readUInt8(offset++),
231
- offset,
232
- };
233
- if (marker === 'uint16') {
234
- const num = buf.readUInt16BE(offset);
235
- offset += 2;
236
- return { num, offset };
237
- }
238
- if (marker === 'uint32') {
239
- const num = buf.readUInt32BE(offset);
240
- offset += 4;
241
- return { num, offset };
242
- }
243
- if (marker === 'uint64') {
244
- const num = BigInt.asUintN(64, BigInt(buf.readBigUInt64BE(offset)));
245
- offset += 8;
246
- return { num: Number(num), offset };
247
- }
248
- if (marker === 'int8') {
249
- const num = buf.readInt8(offset);
250
- offset++;
251
- return { num, offset };
220
+ return { num: num2, offset };
221
+ }
222
+ if (marker === "int16") {
223
+ const num2 = buf.readInt16BE(offset);
224
+ offset += 2;
225
+ return { num: num2, offset };
226
+ }
227
+ if (marker === "int32") {
228
+ const num2 = buf.readInt32BE(offset);
229
+ offset += 4;
230
+ return { num: num2, offset };
231
+ }
232
+ if (marker === "int64") {
233
+ const num2 = BigInt.asIntN(64, BigInt(buf.readBigInt64BE(offset)));
234
+ offset += 8;
235
+ return { num: Number(num2), offset };
236
+ }
237
+ throw new Error(`Expected integer format, got ${marker}`);
238
+ }
239
+ function readBrdbSchema(buf) {
240
+ const enums = {};
241
+ const structs = {};
242
+ let offset = 0;
243
+ const next = () => {
244
+ const byte = buf[offset];
245
+ offset++;
246
+ return byte;
247
+ };
248
+ const nextMarker = () => {
249
+ const byte = next();
250
+ const kind = mpMarker(byte);
251
+ if (!kind) {
252
+ throw new Error(`Invalid msgpack format byte: ${byte.toString(16)}`);
252
253
  }
253
- if (marker === 'int16') {
254
- const num = buf.readInt16BE(offset);
254
+ return kind;
255
+ };
256
+ const mapLen = (name) => {
257
+ const [kind, val] = nextMarker();
258
+ let len = 0;
259
+ switch (kind) {
260
+ case "fixmap":
261
+ len = val;
262
+ break;
263
+ case "map16":
264
+ len = buf.readUInt16BE(offset);
255
265
  offset += 2;
256
- return { num, offset };
257
- }
258
- if (marker === 'int32') {
259
- const num = buf.readInt32BE(offset);
266
+ break;
267
+ case "map32":
268
+ len = buf.readUInt32BE(offset);
260
269
  offset += 4;
261
- return { num, offset };
270
+ break;
271
+ default:
272
+ throw new Error(`Expected ${name ?? "unknown"} map len, got ${kind}`);
262
273
  }
263
- if (marker === 'int64') {
264
- const num = BigInt.asIntN(64, BigInt(buf.readBigInt64BE(offset)));
265
- offset += 8;
266
- return { num: Number(num), offset };
274
+ return len;
275
+ };
276
+ const header = nextMarker();
277
+ if (header[0] !== "fixarray" && header[1] !== 2) {
278
+ throw new Error(
279
+ `Expected schema header to be fixarray of length 2, got ${header[0]} ${header[1]}`
280
+ );
281
+ }
282
+ const numEnums = mapLen("enums");
283
+ for (let i = 0; i < numEnums; i++) {
284
+ let name;
285
+ ({ str: name, offset } = mpString(buf, offset));
286
+ enums[name] = {};
287
+ const values = mapLen(`enum ${name} values`);
288
+ for (let j = 0; j < values; j++) {
289
+ let key;
290
+ ({ str: key, offset } = mpString(buf, offset));
291
+ let value;
292
+ ({ num: value, offset } = mpInt(buf, offset));
293
+ enums[name][key] = value;
294
+ enums[name][value] = key;
267
295
  }
268
- throw new Error(`Expected integer format, got ${marker}`);
269
- }
270
- function readBrdbSchema(buf) {
271
- const enums = {};
272
- const structs = {};
273
- let offset = 0;
274
- const next = () => {
275
- const byte = buf[offset];
276
- offset++;
277
- return byte;
278
- };
279
- const nextMarker = () => {
280
- const byte = next();
281
- const kind = mpMarker(byte);
282
- if (!kind) {
283
- throw new Error(`Invalid msgpack format byte: ${byte.toString(16)}`);
284
- }
285
- return kind;
286
- };
287
- const mapLen = (name) => {
288
- const [kind, val] = nextMarker();
289
- let len = 0;
290
- switch (kind) {
291
- case 'fixmap':
292
- len = val;
293
- break;
294
- case 'map16':
295
- len = buf.readUInt16BE(offset);
296
- offset += 2;
297
- break;
298
- case 'map32':
299
- len = buf.readUInt32BE(offset);
300
- offset += 4;
301
- break;
302
- default:
303
- throw new Error(`Expected ${name !== null && name !== void 0 ? name : 'unknown'} map len, got ${kind}`);
304
- }
305
- return len;
306
- };
307
- const header = nextMarker();
308
- if (header[0] !== 'fixarray' && header[1] !== 2) {
309
- throw new Error(`Expected schema header to be fixarray of length 2, got ${header[0]} ${header[1]}`);
296
+ }
297
+ const numStructs = mapLen("structs");
298
+ for (let i = 0; i < numStructs; i++) {
299
+ let name;
300
+ ({ str: name, offset } = mpString(buf, offset));
301
+ const props = {};
302
+ const numProps = mapLen(`struct ${name} properties`);
303
+ for (let j = 0; j < numProps; j++) {
304
+ let propName;
305
+ ({ str: propName, offset } = mpString(buf, offset));
306
+ const [kind, val] = nextMarker();
307
+ if (kind === "fixstr" || kind === "str8" || kind === "str16") {
308
+ let ty;
309
+ ({ str: ty, offset } = mpStringContent(buf, [kind, val], offset));
310
+ props[propName] = { kind: "literal", ty };
311
+ } else if (kind === "fixarray" && val == 1) {
312
+ let ty;
313
+ ({ str: ty, offset } = mpString(buf, offset));
314
+ props[propName] = { kind: "array", ty };
315
+ } else if (kind === "fixarray" && val == 2) {
316
+ let ty;
317
+ ({ str: ty, offset } = mpString(buf, offset));
318
+ if (nextMarker()[0] !== "nil")
319
+ throw new Error(`Expected nil after flatarray type`);
320
+ props[propName] = { kind: "flatarray", ty };
321
+ } else if (kind === "fixmap" && val == 1) {
322
+ let key_ty;
323
+ let val_ty;
324
+ ({ str: key_ty, offset } = mpString(buf, offset));
325
+ ({ str: val_ty, offset } = mpString(buf, offset));
326
+ props[propName] = { kind: "map", key: key_ty, value: val_ty };
327
+ } else {
328
+ throw new Error(
329
+ `Expected property type for ${name}.${propName}, got ${kind}`
330
+ );
331
+ }
310
332
  }
311
- const numEnums = mapLen('enums');
312
- for (let i = 0; i < numEnums; i++) {
313
- let name;
314
- ({ str: name, offset } = mpString(buf, offset));
315
- enums[name] = {};
316
- const values = mapLen(`enum ${name} values`);
317
- for (let j = 0; j < values; j++) {
318
- let key;
319
- ({ str: key, offset } = mpString(buf, offset));
320
- let value;
321
- ({ num: value, offset } = mpInt(buf, offset));
322
- enums[name][key] = value;
323
- enums[name][value] = key;
324
- }
325
- }
326
- const numStructs = mapLen('structs');
327
- for (let i = 0; i < numStructs; i++) {
328
- let name;
329
- ({ str: name, offset } = mpString(buf, offset));
330
- const props = {};
331
- const numProps = mapLen(`struct ${name} properties`);
332
- for (let j = 0; j < numProps; j++) {
333
- let propName;
334
- ({ str: propName, offset } = mpString(buf, offset));
335
- const [kind, val] = nextMarker();
336
- // Basic types
337
- if (kind === 'fixstr' || kind === 'str8' || kind === 'str16') {
338
- let ty;
339
- ({ str: ty, offset } = mpStringContent(buf, [kind, val], offset));
340
- props[propName] = { kind: 'literal', ty };
341
- }
342
- else if (kind === 'fixarray' && val == 1) {
343
- let ty;
344
- ({ str: ty, offset } = mpString(buf, offset));
345
- props[propName] = { kind: 'array', ty };
346
- }
347
- else if (kind === 'fixarray' && val == 2) {
348
- let ty;
349
- ({ str: ty, offset } = mpString(buf, offset));
350
- if (nextMarker()[0] !== 'nil')
351
- throw new Error(`Expected nil after flatarray type`);
352
- props[propName] = { kind: 'flatarray', ty };
353
- }
354
- else if (kind === 'fixmap' && val == 1) {
355
- let key_ty;
356
- let val_ty;
357
- ({ str: key_ty, offset } = mpString(buf, offset));
358
- ({ str: val_ty, offset } = mpString(buf, offset));
359
- props[propName] = { kind: 'map', key: key_ty, value: val_ty };
360
- }
361
- else {
362
- throw new Error(`Expected property type for ${name}.${propName}, got ${kind}`);
363
- }
364
- }
365
- structs[name] = { name, props };
366
- }
367
- return { enums, structs };
333
+ structs[name] = { name, props };
334
+ }
335
+ return { enums, structs };
368
336
  }
369
337
  function mpArrayLen(buf, offset) {
370
- const [kind, val] = mpMarker(buf[offset]);
371
- offset++;
372
- let len = 0;
373
- switch (kind) {
374
- case 'fixarray':
375
- len = val;
376
- break;
377
- case 'array16':
378
- len = buf.readUInt16BE(offset);
379
- offset += 2;
380
- break;
381
- case 'array32':
382
- len = buf.readUInt32BE(offset);
383
- offset += 4;
384
- break;
385
- default:
386
- throw new Error(`Expected array length, got ${kind}`);
387
- }
388
- return { len, offset };
338
+ const [kind, val] = mpMarker(buf[offset]);
339
+ offset++;
340
+ let len = 0;
341
+ switch (kind) {
342
+ case "fixarray":
343
+ len = val;
344
+ break;
345
+ case "array16":
346
+ len = buf.readUInt16BE(offset);
347
+ offset += 2;
348
+ break;
349
+ case "array32":
350
+ len = buf.readUInt32BE(offset);
351
+ offset += 4;
352
+ break;
353
+ default:
354
+ throw new Error(`Expected array length, got ${kind}`);
355
+ }
356
+ return { len, offset };
389
357
  }
390
358
  function mpBinLen(buf, offset) {
391
- const [kind, _] = mpMarker(buf[offset]);
392
- offset++;
393
- let len = 0;
394
- switch (kind) {
395
- case 'bin8':
396
- len = buf.readUInt8(offset);
397
- offset++;
398
- break;
399
- case 'bin16':
400
- len = buf.readUInt16BE(offset);
401
- offset += 2;
402
- break;
403
- case 'bin32':
404
- len = buf.readUInt32BE(offset);
405
- offset += 4;
406
- break;
407
- default:
408
- throw new Error(`Expected binary length, got ${kind}`);
409
- }
410
- return { len, offset };
359
+ const [kind, _] = mpMarker(buf[offset]);
360
+ offset++;
361
+ let len = 0;
362
+ switch (kind) {
363
+ case "bin8":
364
+ len = buf.readUInt8(offset);
365
+ offset++;
366
+ break;
367
+ case "bin16":
368
+ len = buf.readUInt16BE(offset);
369
+ offset += 2;
370
+ break;
371
+ case "bin32":
372
+ len = buf.readUInt32BE(offset);
373
+ offset += 4;
374
+ break;
375
+ default:
376
+ throw new Error(`Expected binary length, got ${kind}`);
377
+ }
378
+ return { len, offset };
411
379
  }
412
- // this is not a full brdb impl so I'm only implementing what is required
413
- // to read the owner data
414
380
  function readBrdbType(buf, offset, schema, ty) {
415
- switch (ty) {
416
- case 'u32':
417
- let num;
418
- ({ num, offset } = mpInt(buf, offset));
419
- return { value: num, offset };
420
- case 'str':
421
- let str;
422
- ({ str, offset } = mpString(buf, offset));
423
- return { value: str, offset };
424
- default:
425
- if (!(ty in schema.structs)) {
426
- throw new Error(`Unknown type ${ty} in schema`);
381
+ switch (ty) {
382
+ case "u32":
383
+ let num;
384
+ ({ num, offset } = mpInt(buf, offset));
385
+ return { value: num, offset };
386
+ case "str":
387
+ let str;
388
+ ({ str, offset } = mpString(buf, offset));
389
+ return { value: str, offset };
390
+ default:
391
+ if (!(ty in schema.structs)) {
392
+ throw new Error(`Unknown type ${ty} in schema`);
393
+ }
394
+ const struct = schema.structs[ty];
395
+ const value = {};
396
+ for (const [propName, propType] of Object.entries(struct.props)) {
397
+ switch (propType.kind) {
398
+ // other soa fields
399
+ case "array":
400
+ let arrLen;
401
+ ({ len: arrLen, offset } = mpArrayLen(buf, offset));
402
+ const arr = [];
403
+ for (let i = 0; i < arrLen; i++) {
404
+ const item = readBrdbType(buf, offset, schema, propType.ty);
405
+ arr.push(item.value);
406
+ offset = item.offset;
427
407
  }
428
- const struct = schema.structs[ty];
429
- const value = {};
430
- for (const [propName, propType] of Object.entries(struct.props)) {
431
- switch (propType.kind) {
432
- // other soa fields
433
- case 'array':
434
- let arrLen;
435
- ({ len: arrLen, offset } = mpArrayLen(buf, offset));
436
- const arr = [];
437
- for (let i = 0; i < arrLen; i++) {
438
- const item = readBrdbType(buf, offset, schema, propType.ty);
439
- arr.push(item.value);
440
- offset = item.offset;
441
- }
442
- value[propName] = arr;
443
- break;
444
- // userids
445
- case 'flatarray':
446
- let flatBinSize;
447
- ({ len: flatBinSize, offset } = mpBinLen(buf, offset));
448
- const flatTySize = flatTypeSize(schema, propType.ty);
449
- const numItems = flatBinSize / flatTySize;
450
- const flatArr = [];
451
- for (let i = 0; i < numItems; i++) {
452
- const item = readFlatBrdbType(buf, offset, schema, propType.ty);
453
- flatArr.push(item.value);
454
- offset = item.offset;
455
- }
456
- value[propName] = flatArr;
457
- break;
458
- }
408
+ value[propName] = arr;
409
+ break;
410
+ // userids
411
+ case "flatarray":
412
+ let flatBinSize;
413
+ ({ len: flatBinSize, offset } = mpBinLen(buf, offset));
414
+ const flatTySize = flatTypeSize(schema, propType.ty);
415
+ const numItems = flatBinSize / flatTySize;
416
+ const flatArr = [];
417
+ for (let i = 0; i < numItems; i++) {
418
+ const item = readFlatBrdbType(buf, offset, schema, propType.ty);
419
+ flatArr.push(item.value);
420
+ offset = item.offset;
459
421
  }
460
- return { value, offset };
461
- }
422
+ value[propName] = flatArr;
423
+ break;
424
+ }
425
+ }
426
+ return { value, offset };
427
+ }
462
428
  }
463
429
  function readFlatBrdbType(buf, offset, schema, ty) {
464
- switch (ty) {
465
- case 'u8':
466
- const u8 = buf.readUInt8(offset);
467
- offset++;
468
- return { value: u8, offset };
469
- case 'u16':
470
- const u16 = buf.readUInt16LE(offset);
471
- offset += 2;
472
- return { value: u16, offset };
473
- case 'u32':
474
- const u32 = buf.readUInt32LE(offset);
475
- offset += 4;
476
- return { value: u32, offset };
477
- case 'u64':
478
- const u64 = BigInt.asUintN(64, BigInt(buf.readBigUInt64LE(offset)));
479
- offset += 8;
480
- return { value: Number(u64), offset };
481
- case 'i8':
482
- const i8 = buf.readInt8(offset);
483
- offset++;
484
- return { value: i8, offset };
485
- case 'i16':
486
- const i16 = buf.readInt16LE(offset);
487
- offset += 2;
488
- return { value: i16, offset };
489
- case 'i32':
490
- const i32 = buf.readInt32LE(offset);
491
- offset += 4;
492
- return { value: i32, offset };
493
- case 'i64':
494
- const i64 = BigInt.asIntN(64, BigInt(buf.readBigInt64LE(offset)));
495
- offset += 8;
496
- return { value: Number(i64), offset };
497
- case 'f32':
498
- const f32 = buf.readFloatLE(offset);
499
- offset += 4;
500
- return { value: f32, offset };
501
- case 'f64':
502
- const f64 = buf.readDoubleLE(offset);
503
- offset += 8;
504
- return { value: f64, offset };
505
- default:
506
- if (!(ty in schema.structs)) {
507
- throw new Error(`Unknown type ${ty} in schema`);
508
- }
509
- const struct = schema.structs[ty];
510
- const value = {};
511
- for (const [propName, propType] of Object.entries(struct.props)) {
512
- if (propType.kind !== 'literal') {
513
- throw new Error(`Expected literal type for ${ty} property, got ${propType.kind}`);
514
- }
515
- const item = readFlatBrdbType(buf, offset, schema, propType.ty);
516
- value[propName] = item.value;
517
- offset = item.offset;
518
- }
519
- return { value, offset };
520
- }
430
+ switch (ty) {
431
+ case "u8":
432
+ const u8 = buf.readUInt8(offset);
433
+ offset++;
434
+ return { value: u8, offset };
435
+ case "u16":
436
+ const u16 = buf.readUInt16LE(offset);
437
+ offset += 2;
438
+ return { value: u16, offset };
439
+ case "u32":
440
+ const u32 = buf.readUInt32LE(offset);
441
+ offset += 4;
442
+ return { value: u32, offset };
443
+ case "u64":
444
+ const u64 = BigInt.asUintN(64, BigInt(buf.readBigUInt64LE(offset)));
445
+ offset += 8;
446
+ return { value: Number(u64), offset };
447
+ case "i8":
448
+ const i8 = buf.readInt8(offset);
449
+ offset++;
450
+ return { value: i8, offset };
451
+ case "i16":
452
+ const i16 = buf.readInt16LE(offset);
453
+ offset += 2;
454
+ return { value: i16, offset };
455
+ case "i32":
456
+ const i32 = buf.readInt32LE(offset);
457
+ offset += 4;
458
+ return { value: i32, offset };
459
+ case "i64":
460
+ const i64 = BigInt.asIntN(64, BigInt(buf.readBigInt64LE(offset)));
461
+ offset += 8;
462
+ return { value: Number(i64), offset };
463
+ case "f32":
464
+ const f32 = buf.readFloatLE(offset);
465
+ offset += 4;
466
+ return { value: f32, offset };
467
+ case "f64":
468
+ const f64 = buf.readDoubleLE(offset);
469
+ offset += 8;
470
+ return { value: f64, offset };
471
+ default:
472
+ if (!(ty in schema.structs)) {
473
+ throw new Error(`Unknown type ${ty} in schema`);
474
+ }
475
+ const struct = schema.structs[ty];
476
+ const value = {};
477
+ for (const [propName, propType] of Object.entries(struct.props)) {
478
+ if (propType.kind !== "literal") {
479
+ throw new Error(
480
+ `Expected literal type for ${ty} property, got ${propType.kind}`
481
+ );
482
+ }
483
+ const item = readFlatBrdbType(buf, offset, schema, propType.ty);
484
+ value[propName] = item.value;
485
+ offset = item.offset;
486
+ }
487
+ return { value, offset };
488
+ }
521
489
  }
522
490
  function flatTypeSize(schema, ty) {
523
- switch (ty) {
524
- case 'u8':
525
- return 1;
526
- case 'u16':
527
- return 2;
528
- case 'u32':
529
- return 4;
530
- case 'u64':
531
- return 8;
532
- case 'i8':
533
- return 1;
534
- case 'i16':
535
- return 2;
536
- case 'i32':
537
- return 4;
538
- case 'i64':
539
- return 8;
540
- case 'f32':
541
- return 4;
542
- case 'f64':
543
- return 8;
544
- default:
545
- if (!(ty in schema.structs)) {
546
- throw new Error(`Unknown type ${ty} in schema`);
547
- }
548
- const struct = schema.structs[ty];
549
- let size = 0;
550
- for (const propType of Object.values(struct.props)) {
551
- if (propType.kind !== 'literal') {
552
- throw new Error(`Expected literal type for ${ty} property, got ${propType.kind}`);
553
- }
554
- size += flatTypeSize(schema, propType.ty);
555
- }
556
- return size;
557
- }
491
+ switch (ty) {
492
+ case "u8":
493
+ return 1;
494
+ case "u16":
495
+ return 2;
496
+ case "u32":
497
+ return 4;
498
+ case "u64":
499
+ return 8;
500
+ case "i8":
501
+ return 1;
502
+ case "i16":
503
+ return 2;
504
+ case "i32":
505
+ return 4;
506
+ case "i64":
507
+ return 8;
508
+ case "f32":
509
+ return 4;
510
+ case "f64":
511
+ return 8;
512
+ default:
513
+ if (!(ty in schema.structs)) {
514
+ throw new Error(`Unknown type ${ty} in schema`);
515
+ }
516
+ const struct = schema.structs[ty];
517
+ let size = 0;
518
+ for (const propType of Object.values(struct.props)) {
519
+ if (propType.kind !== "literal") {
520
+ throw new Error(
521
+ `Expected literal type for ${ty} property, got ${propType.kind}`
522
+ );
523
+ }
524
+ size += flatTypeSize(schema, propType.ty);
525
+ }
526
+ return size;
527
+ }
558
528
  }
559
- /** convert a set of 4 u32s into a uuidv4 */
560
529
  function guidToUuid(guid) {
561
- const hex = (num) => num.toString(16).padStart(8, '0');
562
- // concatenate them all together
563
- const joined = `${hex(guid.A)}${hex(guid.B)}${hex(guid.C)}${hex(guid.D)}`;
564
- // format as uuidv4
565
- return `${joined.slice(0, 8)}-${joined.slice(8, 12)}-${joined.slice(12, 16)}-${joined.slice(16, 20)}-${joined.slice(20)}`;
530
+ const hex = (num) => num.toString(16).padStart(8, "0");
531
+ const joined = `${hex(guid.A)}${hex(guid.B)}${hex(guid.C)}${hex(guid.D)}`;
532
+ return `${joined.slice(0, 8)}-${joined.slice(8, 12)}-${joined.slice(12, 16)}-${joined.slice(16, 20)}-${joined.slice(20)}`;
566
533
  }
567
- //# sourceMappingURL=brdb.js.map
534
+ exports.readBrdbMeta = readBrdbMeta;
535
+ //# sourceMappingURL=brdb.js.map