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
@@ -1,77 +1,56 @@
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.getSSLKeys = getSSLKeys;
7
- exports.getSessionSecret = getSessionSecret;
8
- const crypto_1 = __importDefault(require("crypto"));
9
- const fs_1 = __importDefault(require("fs"));
10
- const path_1 = __importDefault(require("path"));
11
- const pem_1 = __importDefault(require("pem"));
12
- const util_1 = require("util");
13
- const softconfig_1 = __importDefault(require("../../softconfig"));
14
- const createCertificate = (0, util_1.promisify)(pem_1.default.createCertificate);
15
- // generate SSL certs for the https server
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const softconfig = require("../../softconfig.js");
4
+ const crypto = require("node:crypto");
5
+ const fs = require("node:fs");
6
+ const path = require("node:path");
7
+ const node_util = require("node:util");
8
+ const pem = require("pem");
9
+ const createCertificate = node_util.promisify(pem.createCertificate);
16
10
  async function getSSLKeys(dataPath) {
17
- const certsPath = path_1.default.join(dataPath, softconfig_1.default.WEB_CERTS_DATA);
18
- let certData;
19
- const now = Date.now();
20
- // read cert data from json file
21
- if (fs_1.default.existsSync(certsPath)) {
22
- try {
23
- certData = JSON.parse(fs_1.default.readFileSync(certsPath, 'utf8'));
24
- // make sure the cert is not expired
25
- if (certData.expires < now)
26
- certData = undefined;
27
- }
28
- catch (e) {
29
- // nothing to do here - probably bad json
30
- }
11
+ const certsPath = path.join(dataPath, softconfig.default.WEB_CERTS_DATA);
12
+ let certData;
13
+ const now = Date.now();
14
+ if (fs.existsSync(certsPath)) {
15
+ try {
16
+ certData = JSON.parse(fs.readFileSync(certsPath, "utf8"));
17
+ if (certData.expires < now) certData = void 0;
18
+ } catch (e) {
31
19
  }
32
- // otherwise generate it
33
- if (!certData) {
34
- // expires in half the real duration time
35
- const days = 360;
36
- const expires = now + (days / 2) * 24 * 60 * 60 * 1000;
37
- try {
38
- const keys = await createCertificate({ days, selfSigned: true });
39
- certData = { keys, expires, new: false };
40
- fs_1.default.writeFileSync(certsPath, JSON.stringify(certData));
41
- certData.new = true;
42
- }
43
- catch (e) {
44
- // probably missing openssl or something
45
- }
20
+ }
21
+ if (!certData) {
22
+ const days = 360;
23
+ const expires = now + days / 2 * 24 * 60 * 60 * 1e3;
24
+ try {
25
+ const keys = await createCertificate({ days, selfSigned: true });
26
+ certData = { keys, expires, new: false };
27
+ fs.writeFileSync(certsPath, JSON.stringify(certData));
28
+ certData.new = true;
29
+ } catch (e) {
46
30
  }
47
- return certData;
31
+ }
32
+ return certData;
48
33
  }
49
- // generate a session secret for the cookies
50
34
  function getSessionSecret(dataPath) {
51
- const tokenPath = path_1.default.join(dataPath, softconfig_1.default.WEB_SESSION_TOKEN);
52
- const secretSize = 64;
53
- let secret;
54
- // read secret from file
55
- if (fs_1.default.existsSync(tokenPath)) {
56
- try {
57
- secret = fs_1.default.readFileSync(tokenPath, 'utf8');
58
- }
59
- catch (e) {
60
- // nothing to do here - probably file is a folder or something
61
- }
35
+ const tokenPath = path.join(dataPath, softconfig.default.WEB_SESSION_TOKEN);
36
+ const secretSize = 64;
37
+ let secret;
38
+ if (fs.existsSync(tokenPath)) {
39
+ try {
40
+ secret = fs.readFileSync(tokenPath, "utf8");
41
+ } catch (e) {
62
42
  }
63
- if (!secret) {
64
- // generate a new secret
65
- const buf = Buffer.alloc(secretSize);
66
- secret = crypto_1.default.randomFillSync(buf).toString('hex');
67
- try {
68
- // write secret to file
69
- fs_1.default.writeFileSync(tokenPath, secret);
70
- }
71
- catch (e) {
72
- // nothing to do here - maybe missing perms?
73
- }
43
+ }
44
+ if (!secret) {
45
+ const buf = Buffer.alloc(secretSize);
46
+ secret = crypto.randomFillSync(buf).toString("hex");
47
+ try {
48
+ fs.writeFileSync(tokenPath, secret);
49
+ } catch (e) {
74
50
  }
75
- return secret;
51
+ }
52
+ return secret;
76
53
  }
77
- //# sourceMappingURL=util.js.map
54
+ exports.getSSLKeys = getSSLKeys;
55
+ exports.getSessionSecret = getSessionSecret;
56
+ //# sourceMappingURL=util.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/webserver/backend/util.ts"],"names":[],"mappings":";;;;;AAYA,gCAkCC;AAGD,4CA0BC;AA3ED,oDAA4B;AAC5B,4CAAoB;AACpB,gDAAwB;AACxB,8CAAsB;AACtB,+BAAiC;AACjC,kEAAgC;AAEhC,MAAM,iBAAiB,GAEuB,IAAA,gBAAS,EAAC,aAAG,CAAC,iBAAiB,CAAC,CAAC;AAE/E,0CAA0C;AACnC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,oBAAI,CAAC,cAAc,CAAC,CAAC;IAC3D,IAAI,QAAQ,CAAC;IACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,gCAAgC;IAChC,IAAI,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;YAE1D,oCAAoC;YACpC,IAAI,QAAQ,CAAC,OAAO,GAAG,GAAG;gBAAE,QAAQ,GAAG,SAAS,CAAC;QACnD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,yCAAyC;QAC3C,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,yCAAyC;QACzC,MAAM,IAAI,GAAG,GAAG,CAAC;QACjB,MAAM,OAAO,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;YACjE,QAAQ,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;YAEzC,YAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtD,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC;QACtB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,wCAAwC;QAC1C,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,4CAA4C;AAC5C,SAAgB,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,oBAAI,CAAC,iBAAiB,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,EAAE,CAAC;IACtB,IAAI,MAAM,CAAC;IACX,wBAAwB;IACxB,IAAI,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,GAAG,YAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,8DAA8D;QAChE,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,wBAAwB;QACxB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,GAAG,gBAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,uBAAuB;YACvB,YAAE,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,4CAA4C;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"util.js","sources":["../../../src/webserver/backend/util.ts"],"sourcesContent":["import soft from '@/softconfig';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\nimport pem from 'pem';\n\nconst createCertificate: (\n options: pem.CertificateCreationOptions,\n) => Promise<pem.CertificateCreationResult> = promisify(pem.createCertificate);\n\n// generate SSL certs for the https server\nexport async function getSSLKeys(dataPath: string) {\n const certsPath = path.join(dataPath, soft.WEB_CERTS_DATA);\n let certData;\n const now = Date.now();\n\n // read cert data from json file\n if (fs.existsSync(certsPath)) {\n try {\n certData = JSON.parse(fs.readFileSync(certsPath, 'utf8'));\n\n // make sure the cert is not expired\n if (certData.expires < now) certData = undefined;\n } catch (e) {\n // nothing to do here - probably bad json\n }\n }\n\n // otherwise generate it\n if (!certData) {\n // expires in half the real duration time\n const days = 360;\n const expires = now + (days / 2) * 24 * 60 * 60 * 1000;\n try {\n const keys = await createCertificate({ days, selfSigned: true });\n certData = { keys, expires, new: false };\n\n fs.writeFileSync(certsPath, JSON.stringify(certData));\n certData.new = true;\n } catch (e) {\n // probably missing openssl or something\n }\n }\n\n return certData;\n}\n\n// generate a session secret for the cookies\nexport function getSessionSecret(dataPath: string) {\n const tokenPath = path.join(dataPath, soft.WEB_SESSION_TOKEN);\n const secretSize = 64;\n let secret;\n // read secret from file\n if (fs.existsSync(tokenPath)) {\n try {\n secret = fs.readFileSync(tokenPath, 'utf8');\n } catch (e) {\n // nothing to do here - probably file is a folder or something\n }\n }\n\n if (!secret) {\n // generate a new secret\n const buf = Buffer.alloc(secretSize);\n secret = crypto.randomFillSync(buf).toString('hex');\n try {\n // write secret to file\n fs.writeFileSync(tokenPath, secret);\n } catch (e) {\n // nothing to do here - maybe missing perms?\n }\n }\n\n return secret;\n}\n"],"names":["promisify","soft"],"mappings":";;;;;;;;AAOA,MAAM,oBAEwCA,UAAAA,UAAU,IAAI,iBAAiB;AAG7E,eAAsB,WAAW,UAAkB;AACjD,QAAM,YAAY,KAAK,KAAK,UAAUC,WAAAA,QAAK,cAAc;AACzD,MAAI;AACJ,QAAM,MAAM,KAAK,IAAA;AAGjB,MAAI,GAAG,WAAW,SAAS,GAAG;AAC5B,QAAI;AACF,iBAAW,KAAK,MAAM,GAAG,aAAa,WAAW,MAAM,CAAC;AAGxD,UAAI,SAAS,UAAU,IAAK,YAAW;AAAA,IACzC,SAAS,GAAG;AAAA,IAEZ;AAAA,EACF;AAGA,MAAI,CAAC,UAAU;AAEb,UAAM,OAAO;AACb,UAAM,UAAU,MAAO,OAAO,IAAK,KAAK,KAAK,KAAK;AAClD,QAAI;AACF,YAAM,OAAO,MAAM,kBAAkB,EAAE,MAAM,YAAY,MAAM;AAC/D,iBAAW,EAAE,MAAM,SAAS,KAAK,MAAA;AAEjC,SAAG,cAAc,WAAW,KAAK,UAAU,QAAQ,CAAC;AACpD,eAAS,MAAM;AAAA,IACjB,SAAS,GAAG;AAAA,IAEZ;AAAA,EACF;AAEA,SAAO;AACT;AAGO,SAAS,iBAAiB,UAAkB;AACjD,QAAM,YAAY,KAAK,KAAK,UAAUA,WAAAA,QAAK,iBAAiB;AAC5D,QAAM,aAAa;AACnB,MAAI;AAEJ,MAAI,GAAG,WAAW,SAAS,GAAG;AAC5B,QAAI;AACF,eAAS,GAAG,aAAa,WAAW,MAAM;AAAA,IAC5C,SAAS,GAAG;AAAA,IAEZ;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ;AAEX,UAAM,MAAM,OAAO,MAAM,UAAU;AACnC,aAAS,OAAO,eAAe,GAAG,EAAE,SAAS,KAAK;AAClD,QAAI;AAEF,SAAG,cAAc,WAAW,MAAM;AAAA,IACpC,SAAS,GAAG;AAAA,IAEZ;AAAA,EACF;AAEA,SAAO;AACT;;;"}
package/dist/worker.js ADDED
@@ -0,0 +1,322 @@
1
+ "use strict";
2
+ const logger = require("./logger.js");
3
+ const player = require("./omegga/player.js");
4
+ const server = require("./omegga/server.js");
5
+ const index = require("./util/index.js");
6
+ const file = require("./util/file.js");
7
+ require("colors");
8
+ const _ = require("lodash");
9
+ const EventEmitter = require("node:events");
10
+ const fs = require("node:fs");
11
+ const path = require("node:path");
12
+ const node_worker_threads = require("node:worker_threads");
13
+ const vm2 = require("vm2");
14
+ const webpack = require("webpack");
15
+ const proxyOmegga = require("./omegga/plugin/plugin_node_safe/proxyOmegga.js");
16
+ logger.default.VERBOSE = process.env.VERBOSE === "true";
17
+ const MAIN_FILE = "omegga.plugin.js";
18
+ const MAIN_FILE_TS = "omegga.plugin.ts";
19
+ const TS_BUILD_DIR = ".build";
20
+ const TS_BUILD_FILE = "plugin.js";
21
+ let vm, PluginClass, pluginInstance;
22
+ let pluginName = "unnamed plugin";
23
+ let messageCounter = 0;
24
+ const parent = new EventEmitter();
25
+ node_worker_threads.parentPort.on("message", ({ action, args }) => parent.emit(action, ...args));
26
+ const emit = (action, ...args) => {
27
+ const messageId = "message:" + messageCounter++;
28
+ let rejectFn;
29
+ const promise = new Promise((resolve, reject) => {
30
+ parent.once(messageId, resolve);
31
+ rejectFn = reject;
32
+ });
33
+ try {
34
+ node_worker_threads.parentPort.postMessage({ action, args: [messageId, ...args] });
35
+ } catch (err) {
36
+ rejectFn(err);
37
+ }
38
+ return promise;
39
+ };
40
+ const exec = (cmd) => emit("exec", cmd);
41
+ proxyOmegga.injectOmeggaPrototypes(proxyOmegga.ProxyOmegga, server.default);
42
+ const omegga = new proxyOmegga.ProxyOmegga(exec);
43
+ omegga.getPlugin = async (name) => {
44
+ let plugin = await emit("getPlugin", name);
45
+ if (plugin) {
46
+ plugin.emitPlugin = async (ev, ...args) => {
47
+ return await emit("emitPlugin", name, ev, _.cloneDeep(args));
48
+ };
49
+ return plugin;
50
+ } else {
51
+ return null;
52
+ }
53
+ };
54
+ const store = {
55
+ get: (key) => emit("store.get", key),
56
+ set: (key, value) => emit("store.set", key, JSON.stringify(value)),
57
+ delete: (key) => emit("store.delete", key),
58
+ wipe: () => emit("store.wipe"),
59
+ count: () => emit("store.count"),
60
+ keys: () => emit("store.keys")
61
+ };
62
+ parent.on("brickadiaEvent", (type, ...args) => {
63
+ if (!vm) return;
64
+ if (type === "error") {
65
+ logger.default.errorp(pluginName.brightRed, "Received error", ...args);
66
+ return;
67
+ }
68
+ try {
69
+ omegga.emit(type, ...args);
70
+ } catch (e) {
71
+ logger.default.errorp(
72
+ pluginName.brightRed,
73
+ `Error in safe plugin worker's brickadiaEvent (${type}):`,
74
+ e?.stack ?? e.toString()
75
+ );
76
+ }
77
+ });
78
+ async function createVm(pluginPath, { builtin = ["*"], external = true, isTypeScript = false } = {}) {
79
+ let pluginCode;
80
+ if (isTypeScript) {
81
+ const tsBuildPath = path.join(pluginPath, TS_BUILD_DIR);
82
+ const sourceFileName = path.join(pluginPath, MAIN_FILE_TS);
83
+ const outputPath = path.join(tsBuildPath, TS_BUILD_FILE);
84
+ try {
85
+ file.mkdir(tsBuildPath);
86
+ file.mkdir(path.join(tsBuildPath, ".cache"));
87
+ const stats = await new Promise((resolve, reject) => {
88
+ webpack(
89
+ Object.freeze({
90
+ target: "node",
91
+ context: __dirname,
92
+ mode: fs.existsSync(path.resolve(pluginPath, ".development")) ? "development" : "production",
93
+ entry: sourceFileName,
94
+ devtool: "source-map",
95
+ output: {
96
+ iife: false,
97
+ library: {
98
+ type: "commonjs"
99
+ },
100
+ path: tsBuildPath,
101
+ filename: TS_BUILD_FILE
102
+ },
103
+ externals: [
104
+ function({ request }, callback) {
105
+ if (request.match(/\.node$/)) {
106
+ return callback(
107
+ null,
108
+ "commonjs " + path.resolve(pluginPath, request)
109
+ );
110
+ }
111
+ callback();
112
+ }
113
+ ],
114
+ resolve: {
115
+ extensions: [".ts", ".js", ".json", ".node"],
116
+ alias: {
117
+ // src is the only hard coded path
118
+ src: path.resolve(pluginPath, "src")
119
+ }
120
+ },
121
+ cache: {
122
+ type: "filesystem",
123
+ cacheLocation: path.join(tsBuildPath, ".cache"),
124
+ allowCollectingMemory: false,
125
+ idleTimeout: 0,
126
+ idleTimeoutForInitialStore: 0,
127
+ // cache age is one week. plugins probably do not need
128
+ // to be rebuilt every day
129
+ maxAge: 1e3 * 60 * 60 * 24 * 7,
130
+ profile: true
131
+ },
132
+ module: {
133
+ rules: [
134
+ {
135
+ test: /\.[jt]s$/,
136
+ exclude: /(node_modules)/,
137
+ use: {
138
+ loader: "swc-loader",
139
+ options: {
140
+ sourceMaps: true,
141
+ cwd: pluginPath,
142
+ isModule: true,
143
+ jsc: {
144
+ target: "es2020",
145
+ parser: {
146
+ syntax: "typescript"
147
+ },
148
+ transform: {}
149
+ },
150
+ module: {
151
+ type: "commonjs",
152
+ strictMode: false
153
+ }
154
+ }
155
+ }
156
+ }
157
+ ]
158
+ }
159
+ }),
160
+ (err, stats2) => err ? reject(err) : resolve(stats2)
161
+ );
162
+ });
163
+ if (stats.hasErrors()) {
164
+ for (const err of stats.toJson().errors) {
165
+ logger.default.errorp(err.moduleName, err.file);
166
+ logger.default.errorp(err.message);
167
+ }
168
+ }
169
+ if (stats.hasWarnings()) {
170
+ for (const warning of stats.toJson().warnings) {
171
+ logger.default.warnp(warning.moduleName, warning.file);
172
+ logger.default.warnp(warning.message);
173
+ }
174
+ }
175
+ pluginCode = fs.readFileSync(outputPath).toString();
176
+ } catch (err) {
177
+ logger.default.errorp(pluginName.brightRed, err);
178
+ return [false, "failed compiling building typescript"];
179
+ }
180
+ try {
181
+ const gitIgnore = path.join(pluginPath, ".gitignore");
182
+ const omeggaTypesDst = path.join(pluginPath, "omegga.d.ts");
183
+ const omeggaTypesSrc = path.join(
184
+ __dirname,
185
+ "../../../../templates/safe-ts/omegga.d.ts"
186
+ );
187
+ if (fs.existsSync(gitIgnore) && fs.existsSync(omeggaTypesSrc)) {
188
+ const hasOmeggaTypesIgnored = fs.readFileSync(gitIgnore).toString().match(/(\.\/)?omegga\.d\.ts/);
189
+ const srcLastModified = fs.statSync(omeggaTypesSrc).mtime.getTime();
190
+ const dstLastModified = fs.existsSync(omeggaTypesDst) ? fs.statSync(omeggaTypesDst).mtime.getTime() : null;
191
+ if (hasOmeggaTypesIgnored && (!dstLastModified || srcLastModified > dstLastModified)) {
192
+ fs.copyFileSync(omeggaTypesSrc, omeggaTypesDst);
193
+ }
194
+ }
195
+ } catch (err) {
196
+ logger.default.errorp(
197
+ pluginName.brightRed,
198
+ "error copying latest omegga.d.ts to typescript plugin",
199
+ err
200
+ );
201
+ }
202
+ }
203
+ if (vm !== void 0) return [false, "vm is already created"];
204
+ vm = new vm2.NodeVM({
205
+ console: "redirect",
206
+ sandbox: {},
207
+ require: {
208
+ external,
209
+ builtin,
210
+ root: pluginPath
211
+ }
212
+ });
213
+ const ezLog = (logFn, name, symbol) => (...args) => console[logFn](name.underline, symbol, ...args);
214
+ vm.on("console.log", ezLog("log", pluginName, ">>".green));
215
+ vm.on("console.error", ezLog("error", pluginName.brightRed, "!>".red));
216
+ vm.on("console.info", ezLog("info", pluginName, "#>".blue));
217
+ vm.on("console.debug", ezLog("debug", pluginName, "?>".blue));
218
+ vm.on("console.warn", ezLog("warn", pluginName.brightYellow, ":>".yellow));
219
+ vm.on("console.trace", ezLog("trace", pluginName, "T>".grey));
220
+ global.OMEGGA_UTIL = index.default;
221
+ vm.freeze(global.OMEGGA_UTIL, "OMEGGA_UTIL");
222
+ vm.freeze(omegga, "Omegga");
223
+ vm.freeze(player.default, "Player");
224
+ const file$1 = path.join(
225
+ pluginPath,
226
+ isTypeScript ? path.join(TS_BUILD_DIR, TS_BUILD_FILE) : MAIN_FILE
227
+ );
228
+ if (!isTypeScript) {
229
+ try {
230
+ pluginCode = fs.readFileSync(file$1).toString();
231
+ } catch (e) {
232
+ emit(
233
+ "error",
234
+ "failed to read plugin source: " + (e?.stack ?? e.toString())
235
+ );
236
+ throw "failed to read plugin source: " + (e?.stack ?? e.toString());
237
+ }
238
+ }
239
+ try {
240
+ const pluginOutput = vm.run(pluginCode, file$1);
241
+ PluginClass = pluginOutput?.default ?? pluginOutput;
242
+ } catch (e) {
243
+ emit("error", "plugin failed to init");
244
+ logger.default.errorp(pluginName.brightRed, e);
245
+ throw "plugin failed to init: " + (e?.stack ?? e.toString());
246
+ }
247
+ if (!PluginClass || typeof PluginClass !== "function" || typeof PluginClass.prototype !== "object") {
248
+ PluginClass = void 0;
249
+ emit("error", "plugin does not export a class");
250
+ throw "plugin does not export a class";
251
+ }
252
+ if (typeof PluginClass.prototype.init !== "function") {
253
+ PluginClass = void 0;
254
+ emit("error", "plugin is missing init() function");
255
+ throw "plugin is missing init() function";
256
+ }
257
+ if (typeof PluginClass.prototype.stop !== "function") {
258
+ PluginClass = void 0;
259
+ emit("error", "plugin is missing stop() function");
260
+ throw "plugin is missing stop() function";
261
+ }
262
+ }
263
+ parent.on("kill", (resp) => {
264
+ emit(resp);
265
+ process.exit(0);
266
+ });
267
+ parent.on("name", (resp, name) => {
268
+ pluginName = name;
269
+ omegga._tempSavePrefix = "omegga_" + name + "_temp";
270
+ emit(resp);
271
+ });
272
+ parent.on("mem", (resp) => emit(resp, "mem", process.memoryUsage()));
273
+ parent.on("load", async (resp, pluginPath, options) => {
274
+ try {
275
+ await createVm(pluginPath, options);
276
+ emit(resp, true);
277
+ } catch (err) {
278
+ logger.default.errorp(
279
+ pluginName.brightRed,
280
+ "error creating vm",
281
+ err?.stack ?? err.toString()
282
+ );
283
+ emit(resp, false);
284
+ }
285
+ });
286
+ parent.on("start", async (resp, config) => {
287
+ try {
288
+ pluginInstance = new PluginClass(omegga, config, store);
289
+ const result = await pluginInstance.init();
290
+ if (typeof result === "object" && result) {
291
+ const cmds = result.registeredCommands;
292
+ if (cmds && cmds instanceof Array && cmds.every((i) => typeof i === "string")) {
293
+ emit("command.registers", JSON.stringify(cmds));
294
+ }
295
+ }
296
+ emit(resp, true);
297
+ } catch (err) {
298
+ emit("error", "error starting plugin", err?.stack ?? JSON.stringify(err));
299
+ emit(resp, false);
300
+ logger.default.errorp(pluginName.brightRed, "Error starting plugin", err);
301
+ }
302
+ });
303
+ parent.on("stop", async (resp) => {
304
+ try {
305
+ if (pluginInstance) {
306
+ await pluginInstance.stop.bind(pluginInstance)();
307
+ }
308
+ pluginInstance = void 0;
309
+ emit(resp, true);
310
+ } catch (err) {
311
+ emit("error", "error stopping plugin", err?.stack ?? err.toString());
312
+ emit(resp, false);
313
+ }
314
+ });
315
+ parent.on("emitPlugin", async (resp, ev, from, args) => {
316
+ if (pluginInstance?.pluginEvent) {
317
+ emit(resp, await pluginInstance.pluginEvent(ev, from, ...args));
318
+ } else {
319
+ emit(resp, null);
320
+ }
321
+ });
322
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sources":["../src/omegga/plugin/plugin_node_safe/worker.ts"],"sourcesContent":["// The safe node plugin is run inside of a worker\n// so if the plugin inevitably crashes, only the worker dies\n// this also lets plugins get terminated easier by killing the worker\n// rather than unloading and reloading code\n\nimport Logger from '@/logger';\nimport OmeggaPlugin, {\n OmeggaLike,\n PluginConfig,\n PluginInterop,\n PluginStore,\n} from '@/plugin';\nimport Player from '@omegga/player';\nimport Omegga from '@omegga/server';\nimport OmeggaUtil from '@util';\nimport { mkdir } from '@util/file';\nimport 'colors';\nimport { cloneDeep } from 'lodash';\nimport EventEmitter from 'node:events';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { parentPort } from 'node:worker_threads';\nimport { NodeVM } from 'vm2';\nimport webpack, { ExternalItemFunctionData, Stats } from 'webpack';\nimport { injectOmeggaPrototypes, ProxyOmegga } from './proxyOmegga';\nLogger.VERBOSE = process.env.VERBOSE === 'true';\n\nconst MAIN_FILE = 'omegga.plugin.js';\nconst MAIN_FILE_TS = 'omegga.plugin.ts';\nconst TS_BUILD_DIR = '.build';\nconst TS_BUILD_FILE = 'plugin.js';\nlet vm: NodeVM,\n PluginClass: {\n new (\n omegga: OmeggaLike,\n config: PluginConfig,\n store: PluginStore,\n ): OmeggaPlugin;\n },\n pluginInstance: OmeggaPlugin;\nlet pluginName = 'unnamed plugin';\nlet messageCounter = 0;\n// emitter that receives messages from the parent\nconst parent = new EventEmitter();\n\n// handle message passing\nparentPort.on('message', ({ action, args }) => parent.emit(action, ...args));\n\n// emit a message to the parent port - async wait for a reponse\nconst emit = (action: string, ...args: any[]) => {\n const messageId = 'message:' + messageCounter++;\n\n let rejectFn: (reason?: any) => void;\n // promise waits for the message to resolve\n const promise = new Promise((resolve, reject) => {\n parent.once(messageId, resolve);\n rejectFn = reject;\n });\n\n try {\n // post the message\n parentPort.postMessage({ action, args: [messageId, ...args] });\n } catch (err) {\n rejectFn(err);\n }\n\n // return the promise\n return promise;\n};\n\n// tell omegga to exec a command\nconst exec = (cmd: string) => emit('exec', cmd);\n\n// create the proxy omegga\ninjectOmeggaPrototypes(ProxyOmegga, Omegga);\nconst omegga = new ProxyOmegga(exec);\n\n// add plugin fetcher\nomegga.getPlugin = async name => {\n let plugin = (await emit('getPlugin', name)) as PluginInterop & {\n emitPlugin(event: string, ...args: any[]): Promise<any>;\n };\n if (plugin) {\n plugin.emitPlugin = async (ev: string, ...args: any[]) => {\n return await emit('emitPlugin', name, ev, cloneDeep(args));\n };\n return plugin;\n } else {\n return null;\n }\n};\n\n// interface with plugin store\nconst store: PluginStore = {\n get: <T>(key: string) => emit('store.get', key) as Promise<T>,\n set: <T>(key: string, value: T) =>\n emit('store.set', key, JSON.stringify(value)) as Promise<void>,\n delete: (key: string) => emit('store.delete', key) as Promise<void>,\n wipe: () => emit('store.wipe') as Promise<void>,\n count: () => emit('store.count') as Promise<number>,\n keys: () => emit('store.keys') as Promise<string[]>,\n};\n\n// generic brickadia events are forwarded to the proxy omegga\nparent.on('brickadiaEvent', (type, ...args) => {\n if (!vm) return;\n if (type === 'error') {\n Logger.errorp(pluginName.brightRed, 'Received error', ...args);\n return;\n }\n try {\n omegga.emit(type, ...args);\n } catch (e) {\n Logger.errorp(\n pluginName.brightRed,\n `Error in safe plugin worker's brickadiaEvent (${type}):`,\n e?.stack ?? e.toString(),\n );\n }\n});\n\n// create the node vm\nasync function createVm(\n pluginPath: string,\n { builtin = ['*'], external = true, isTypeScript = false } = {},\n): Promise<[boolean, string]> {\n let pluginCode: string;\n\n if (isTypeScript) {\n const tsBuildPath = path.join(pluginPath, TS_BUILD_DIR);\n const sourceFileName = path.join(pluginPath, MAIN_FILE_TS);\n const outputPath = path.join(tsBuildPath, TS_BUILD_FILE);\n try {\n mkdir(tsBuildPath);\n mkdir(path.join(tsBuildPath, '.cache'));\n\n const stats = await new Promise<Stats>((resolve, reject) => {\n webpack(\n Object.freeze({\n target: 'node',\n context: __dirname,\n mode: fs.existsSync(path.resolve(pluginPath, '.development'))\n ? 'development'\n : 'production',\n entry: sourceFileName,\n devtool: 'source-map',\n output: {\n iife: false,\n library: {\n type: 'commonjs',\n },\n path: tsBuildPath,\n filename: TS_BUILD_FILE,\n },\n externals: [\n function (\n { request }: ExternalItemFunctionData,\n callback: (err?: Error, result?: string) => void,\n ) {\n if (request.match(/\\.node$/)) {\n return callback(\n null,\n 'commonjs ' + path.resolve(pluginPath, request),\n );\n }\n callback();\n },\n ],\n resolve: {\n extensions: ['.ts', '.js', '.json', '.node'],\n alias: {\n // src is the only hard coded path\n src: path.resolve(pluginPath, 'src'),\n },\n },\n cache: {\n type: 'filesystem' as 'filesystem',\n cacheLocation: path.join(tsBuildPath, '.cache'),\n allowCollectingMemory: false,\n idleTimeout: 0,\n idleTimeoutForInitialStore: 0,\n // cache age is one week. plugins probably do not need\n // to be rebuilt every day\n maxAge: 1000 * 60 * 60 * 24 * 7,\n profile: true,\n },\n module: {\n rules: [\n {\n test: /\\.[jt]s$/,\n exclude: /(node_modules)/,\n use: {\n loader: 'swc-loader',\n options: {\n sourceMaps: true,\n cwd: pluginPath,\n isModule: true,\n jsc: {\n target: 'es2020',\n parser: {\n syntax: 'typescript',\n },\n transform: {},\n },\n\n module: {\n type: 'commonjs',\n strictMode: false,\n },\n },\n },\n },\n ],\n },\n }),\n (err, stats) => (err ? reject(err) : resolve(stats)),\n );\n });\n\n if (stats.hasErrors()) {\n for (const err of stats.toJson().errors) {\n Logger.errorp(err.moduleName, err.file);\n Logger.errorp(err.message);\n }\n }\n\n if (stats.hasWarnings()) {\n for (const warning of stats.toJson().warnings) {\n Logger.warnp(warning.moduleName, warning.file);\n Logger.warnp(warning.message);\n }\n }\n\n pluginCode = fs.readFileSync(outputPath).toString();\n } catch (err) {\n Logger.errorp(pluginName.brightRed, err);\n return [false, 'failed compiling building typescript'];\n }\n\n // update omegga.d.ts to latest on plugin compile\n try {\n const gitIgnore = path.join(pluginPath, '.gitignore');\n const omeggaTypesDst = path.join(pluginPath, 'omegga.d.ts');\n const omeggaTypesSrc = path.join(\n __dirname,\n '../../../../templates/safe-ts/omegga.d.ts',\n );\n\n // plugin has gitignore with \"omegga.d.ts\" in it and omegga has omegga.d.ts\n if (fs.existsSync(gitIgnore) && fs.existsSync(omeggaTypesSrc)) {\n // and the gitignore covers the omegga.d.ts\n const hasOmeggaTypesIgnored = fs\n .readFileSync(gitIgnore)\n .toString()\n .match(/(\\.\\/)?omegga\\.d\\.ts/);\n\n // compare last modified times to avoid unnecessary copies\n const srcLastModified = fs.statSync(omeggaTypesSrc).mtime.getTime();\n const dstLastModified = fs.existsSync(omeggaTypesDst)\n ? fs.statSync(omeggaTypesDst).mtime.getTime()\n : null;\n if (\n hasOmeggaTypesIgnored &&\n (!dstLastModified || srcLastModified > dstLastModified)\n ) {\n fs.copyFileSync(omeggaTypesSrc, omeggaTypesDst);\n }\n }\n } catch (err) {\n Logger.errorp(\n pluginName.brightRed,\n 'error copying latest omegga.d.ts to typescript plugin',\n err,\n );\n }\n }\n if (vm !== undefined) return [false, 'vm is already created'];\n\n // create the vm\n vm = new NodeVM({\n console: 'redirect',\n sandbox: {},\n require: {\n external,\n builtin,\n root: pluginPath,\n },\n });\n\n // plugin log generator function\n const ezLog =\n (\n logFn: 'log' | 'error' | 'info' | 'debug' | 'warn' | 'trace',\n name: string,\n symbol: string,\n ) =>\n (...args: any[]) =>\n console[logFn](name.underline, symbol, ...args);\n\n // special formatting for stdout\n vm.on('console.log', ezLog('log', pluginName, '>>'.green));\n vm.on('console.error', ezLog('error', pluginName.brightRed, '!>'.red));\n vm.on('console.info', ezLog('info', pluginName, '#>'.blue));\n vm.on('console.debug', ezLog('debug', pluginName, '?>'.blue));\n vm.on('console.warn', ezLog('warn', pluginName.brightYellow, ':>'.yellow));\n vm.on('console.trace', ezLog('trace', pluginName, 'T>'.grey));\n\n global.OMEGGA_UTIL = OmeggaUtil;\n // pass in util functions\n vm.freeze(global.OMEGGA_UTIL, 'OMEGGA_UTIL');\n vm.freeze(omegga, 'Omegga');\n vm.freeze(Player, 'Player');\n\n const file = path.join(\n pluginPath,\n isTypeScript ? path.join(TS_BUILD_DIR, TS_BUILD_FILE) : MAIN_FILE,\n );\n if (!isTypeScript) {\n try {\n pluginCode = fs.readFileSync(file).toString();\n } catch (e) {\n emit(\n 'error',\n 'failed to read plugin source: ' + (e?.stack ?? e.toString()),\n );\n throw 'failed to read plugin source: ' + (e?.stack ?? e.toString());\n }\n }\n\n // proxy the plugin out of the vm\n // potential for performance improvement by using VM.script to precompile plugins\n try {\n const pluginOutput = vm.run(pluginCode, file);\n PluginClass = pluginOutput?.default ?? pluginOutput;\n } catch (e) {\n emit('error', 'plugin failed to init');\n Logger.errorp(pluginName.brightRed, e);\n throw 'plugin failed to init: ' + (e?.stack ?? e.toString());\n }\n\n if (\n !PluginClass ||\n typeof PluginClass !== 'function' ||\n typeof PluginClass.prototype !== 'object'\n ) {\n PluginClass = undefined;\n emit('error', 'plugin does not export a class');\n throw 'plugin does not export a class';\n }\n\n if (typeof PluginClass.prototype.init !== 'function') {\n PluginClass = undefined;\n emit('error', 'plugin is missing init() function');\n throw 'plugin is missing init() function';\n }\n\n if (typeof PluginClass.prototype.stop !== 'function') {\n PluginClass = undefined;\n emit('error', 'plugin is missing stop() function');\n throw 'plugin is missing stop() function';\n }\n}\n\n// kill this plugin\nparent.on('kill', resp => {\n emit(resp);\n process.exit(0);\n});\n\n// set plugin name\nparent.on('name', (resp, name) => {\n pluginName = name;\n // temp save prefix changes to avoid collision\n omegga._tempSavePrefix = 'omegga_' + name + '_temp';\n emit(resp);\n});\n\n// get memory usage for this plugin\nparent.on('mem', resp => emit(resp, 'mem', process.memoryUsage()));\n\n// create the vm\nparent.on('load', async (resp, pluginPath, options) => {\n try {\n await createVm(pluginPath, options);\n\n emit(resp, true);\n } catch (err) {\n Logger.errorp(\n pluginName.brightRed,\n 'error creating vm',\n err?.stack ?? err.toString(),\n );\n emit(resp, false);\n }\n});\n\n// start the plugin with a faux omegga\n// resp is an action sent back to the parent process\n// to coordinate async funcs\nparent.on('start', async (resp, config) => {\n try {\n pluginInstance = new PluginClass(omegga as any as Omegga, config, store);\n const result = await pluginInstance.init();\n // if a plugin init returns a list of strings, treat them as the list of commands\n if (typeof result === 'object' && result) {\n // if registeredCommands is in the results, register the provided strings as commands\n const cmds = result.registeredCommands;\n if (\n cmds &&\n cmds instanceof Array &&\n cmds.every(i => typeof i === 'string')\n ) {\n emit('command.registers', JSON.stringify(cmds));\n }\n }\n emit(resp, true);\n } catch (err) {\n emit('error', 'error starting plugin', err?.stack ?? JSON.stringify(err));\n emit(resp, false);\n Logger.errorp(pluginName.brightRed, 'Error starting plugin', err);\n }\n});\n\n// stop the plugin\nparent.on('stop', async resp => {\n try {\n if (pluginInstance) {\n await pluginInstance.stop.bind(pluginInstance)();\n }\n pluginInstance = undefined;\n emit(resp, true);\n } catch (err) {\n emit('error', 'error stopping plugin', err?.stack ?? err.toString());\n emit(resp, false);\n }\n});\n\n// handle emitPlugins\nparent.on('emitPlugin', async (resp, ev, from, args) => {\n if (pluginInstance?.pluginEvent) {\n emit(resp, await pluginInstance.pluginEvent(ev, from, ...args));\n } else {\n emit(resp, null);\n }\n});\n"],"names":["Logger","parentPort","injectOmeggaPrototypes","ProxyOmegga","Omegga","cloneDeep","mkdir","stats","NodeVM","OmeggaUtil","Player","file"],"mappings":";;;;;;;;;;;;;;;AAyBAA,OAAAA,QAAO,UAAU,QAAQ,IAAI,YAAY;AAEzC,MAAM,YAAY;AAClB,MAAM,eAAe;AACrB,MAAM,eAAe;AACrB,MAAM,gBAAgB;AACtB,IAAI,IACF,aAOA;AACF,IAAI,aAAa;AACjB,IAAI,iBAAiB;AAErB,MAAM,SAAS,IAAI,aAAA;AAGnBC,oBAAAA,WAAW,GAAG,WAAW,CAAC,EAAE,QAAQ,WAAW,OAAO,KAAK,QAAQ,GAAG,IAAI,CAAC;AAG3E,MAAM,OAAO,CAAC,WAAmB,SAAgB;AAC/C,QAAM,YAAY,aAAa;AAE/B,MAAI;AAEJ,QAAM,UAAU,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC/C,WAAO,KAAK,WAAW,OAAO;AAC9B,eAAW;AAAA,EACb,CAAC;AAED,MAAI;AAEFA,mCAAW,YAAY,EAAE,QAAQ,MAAM,CAAC,WAAW,GAAG,IAAI,GAAG;AAAA,EAC/D,SAAS,KAAK;AACZ,aAAS,GAAG;AAAA,EACd;AAGA,SAAO;AACT;AAGA,MAAM,OAAO,CAAC,QAAgB,KAAK,QAAQ,GAAG;AAG9CC,YAAAA,uBAAuBC,YAAAA,aAAaC,OAAAA,OAAM;AAC1C,MAAM,SAAS,IAAID,YAAAA,YAAY,IAAI;AAGnC,OAAO,YAAY,OAAM,SAAQ;AAC/B,MAAI,SAAU,MAAM,KAAK,aAAa,IAAI;AAG1C,MAAI,QAAQ;AACV,WAAO,aAAa,OAAO,OAAe,SAAgB;AACxD,aAAO,MAAM,KAAK,cAAc,MAAM,IAAIE,EAAAA,UAAU,IAAI,CAAC;AAAA,IAC3D;AACA,WAAO;AAAA,EACT,OAAO;AACL,WAAO;AAAA,EACT;AACF;AAGA,MAAM,QAAqB;AAAA,EACzB,KAAK,CAAI,QAAgB,KAAK,aAAa,GAAG;AAAA,EAC9C,KAAK,CAAI,KAAa,UACpB,KAAK,aAAa,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,EAC9C,QAAQ,CAAC,QAAgB,KAAK,gBAAgB,GAAG;AAAA,EACjD,MAAM,MAAM,KAAK,YAAY;AAAA,EAC7B,OAAO,MAAM,KAAK,aAAa;AAAA,EAC/B,MAAM,MAAM,KAAK,YAAY;AAC/B;AAGA,OAAO,GAAG,kBAAkB,CAAC,SAAS,SAAS;AAC7C,MAAI,CAAC,GAAI;AACT,MAAI,SAAS,SAAS;AACpBL,WAAAA,QAAO,OAAO,WAAW,WAAW,kBAAkB,GAAG,IAAI;AAC7D;AAAA,EACF;AACA,MAAI;AACF,WAAO,KAAK,MAAM,GAAG,IAAI;AAAA,EAC3B,SAAS,GAAG;AACVA,WAAAA,QAAO;AAAA,MACL,WAAW;AAAA,MACX,iDAAiD,IAAI;AAAA,MACrD,GAAG,SAAS,EAAE,SAAA;AAAA,IAAS;AAAA,EAE3B;AACF,CAAC;AAGD,eAAe,SACb,YACA,EAAE,UAAU,CAAC,GAAG,GAAG,WAAW,MAAM,eAAe,MAAA,IAAU,CAAA,GACjC;AAC5B,MAAI;AAEJ,MAAI,cAAc;AAChB,UAAM,cAAc,KAAK,KAAK,YAAY,YAAY;AACtD,UAAM,iBAAiB,KAAK,KAAK,YAAY,YAAY;AACzD,UAAM,aAAa,KAAK,KAAK,aAAa,aAAa;AACvD,QAAI;AACFM,WAAAA,MAAM,WAAW;AACjBA,WAAAA,MAAM,KAAK,KAAK,aAAa,QAAQ,CAAC;AAEtC,YAAM,QAAQ,MAAM,IAAI,QAAe,CAAC,SAAS,WAAW;AAC1D;AAAA,UACE,OAAO,OAAO;AAAA,YACZ,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,MAAM,GAAG,WAAW,KAAK,QAAQ,YAAY,cAAc,CAAC,IACxD,gBACA;AAAA,YACJ,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,cACN,MAAM;AAAA,cACN,SAAS;AAAA,gBACP,MAAM;AAAA,cAAA;AAAA,cAER,MAAM;AAAA,cACN,UAAU;AAAA,YAAA;AAAA,YAEZ,WAAW;AAAA,cACT,SACE,EAAE,QAAA,GACF,UACA;AACA,oBAAI,QAAQ,MAAM,SAAS,GAAG;AAC5B,yBAAO;AAAA,oBACL;AAAA,oBACA,cAAc,KAAK,QAAQ,YAAY,OAAO;AAAA,kBAAA;AAAA,gBAElD;AACA,yBAAA;AAAA,cACF;AAAA,YAAA;AAAA,YAEF,SAAS;AAAA,cACP,YAAY,CAAC,OAAO,OAAO,SAAS,OAAO;AAAA,cAC3C,OAAO;AAAA;AAAA,gBAEL,KAAK,KAAK,QAAQ,YAAY,KAAK;AAAA,cAAA;AAAA,YACrC;AAAA,YAEF,OAAO;AAAA,cACL,MAAM;AAAA,cACN,eAAe,KAAK,KAAK,aAAa,QAAQ;AAAA,cAC9C,uBAAuB;AAAA,cACvB,aAAa;AAAA,cACb,4BAA4B;AAAA;AAAA;AAAA,cAG5B,QAAQ,MAAO,KAAK,KAAK,KAAK;AAAA,cAC9B,SAAS;AAAA,YAAA;AAAA,YAEX,QAAQ;AAAA,cACN,OAAO;AAAA,gBACL;AAAA,kBACE,MAAM;AAAA,kBACN,SAAS;AAAA,kBACT,KAAK;AAAA,oBACH,QAAQ;AAAA,oBACR,SAAS;AAAA,sBACP,YAAY;AAAA,sBACZ,KAAK;AAAA,sBACL,UAAU;AAAA,sBACV,KAAK;AAAA,wBACH,QAAQ;AAAA,wBACR,QAAQ;AAAA,0BACN,QAAQ;AAAA,wBAAA;AAAA,wBAEV,WAAW,CAAA;AAAA,sBAAC;AAAA,sBAGd,QAAQ;AAAA,wBACN,MAAM;AAAA,wBACN,YAAY;AAAA,sBAAA;AAAA,oBACd;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF,CACD;AAAA,UACD,CAAC,KAAKC,WAAW,MAAM,OAAO,GAAG,IAAI,QAAQA,MAAK;AAAA,QAAA;AAAA,MAEtD,CAAC;AAED,UAAI,MAAM,aAAa;AACrB,mBAAW,OAAO,MAAM,OAAA,EAAS,QAAQ;AACvCP,iBAAAA,QAAO,OAAO,IAAI,YAAY,IAAI,IAAI;AACtCA,yBAAO,OAAO,IAAI,OAAO;AAAA,QAC3B;AAAA,MACF;AAEA,UAAI,MAAM,eAAe;AACvB,mBAAW,WAAW,MAAM,OAAA,EAAS,UAAU;AAC7CA,iBAAAA,QAAO,MAAM,QAAQ,YAAY,QAAQ,IAAI;AAC7CA,yBAAO,MAAM,QAAQ,OAAO;AAAA,QAC9B;AAAA,MACF;AAEA,mBAAa,GAAG,aAAa,UAAU,EAAE,SAAA;AAAA,IAC3C,SAAS,KAAK;AACZA,aAAAA,QAAO,OAAO,WAAW,WAAW,GAAG;AACvC,aAAO,CAAC,OAAO,sCAAsC;AAAA,IACvD;AAGA,QAAI;AACF,YAAM,YAAY,KAAK,KAAK,YAAY,YAAY;AACpD,YAAM,iBAAiB,KAAK,KAAK,YAAY,aAAa;AAC1D,YAAM,iBAAiB,KAAK;AAAA,QAC1B;AAAA,QACA;AAAA,MAAA;AAIF,UAAI,GAAG,WAAW,SAAS,KAAK,GAAG,WAAW,cAAc,GAAG;AAE7D,cAAM,wBAAwB,GAC3B,aAAa,SAAS,EACtB,SAAA,EACA,MAAM,sBAAsB;AAG/B,cAAM,kBAAkB,GAAG,SAAS,cAAc,EAAE,MAAM,QAAA;AAC1D,cAAM,kBAAkB,GAAG,WAAW,cAAc,IAChD,GAAG,SAAS,cAAc,EAAE,MAAM,QAAA,IAClC;AACJ,YACE,0BACC,CAAC,mBAAmB,kBAAkB,kBACvC;AACA,aAAG,aAAa,gBAAgB,cAAc;AAAA,QAChD;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZA,aAAAA,QAAO;AAAA,QACL,WAAW;AAAA,QACX;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAAA,EACF;AACA,MAAI,OAAO,OAAW,QAAO,CAAC,OAAO,uBAAuB;AAG5D,OAAK,IAAIQ,IAAAA,OAAO;AAAA,IACd,SAAS;AAAA,IACT,SAAS,CAAA;AAAA,IACT,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA,MAAM;AAAA,IAAA;AAAA,EACR,CACD;AAGD,QAAM,QACJ,CACE,OACA,MACA,WAEF,IAAI,SACF,QAAQ,KAAK,EAAE,KAAK,WAAW,QAAQ,GAAG,IAAI;AAGlD,KAAG,GAAG,eAAe,MAAM,OAAO,YAAY,KAAK,KAAK,CAAC;AACzD,KAAG,GAAG,iBAAiB,MAAM,SAAS,WAAW,WAAW,KAAK,GAAG,CAAC;AACrE,KAAG,GAAG,gBAAgB,MAAM,QAAQ,YAAY,KAAK,IAAI,CAAC;AAC1D,KAAG,GAAG,iBAAiB,MAAM,SAAS,YAAY,KAAK,IAAI,CAAC;AAC5D,KAAG,GAAG,gBAAgB,MAAM,QAAQ,WAAW,cAAc,KAAK,MAAM,CAAC;AACzE,KAAG,GAAG,iBAAiB,MAAM,SAAS,YAAY,KAAK,IAAI,CAAC;AAE5D,SAAO,cAAcC,MAAAA;AAErB,KAAG,OAAO,OAAO,aAAa,aAAa;AAC3C,KAAG,OAAO,QAAQ,QAAQ;AAC1B,KAAG,OAAOC,OAAAA,SAAQ,QAAQ;AAE1B,QAAMC,SAAO,KAAK;AAAA,IAChB;AAAA,IACA,eAAe,KAAK,KAAK,cAAc,aAAa,IAAI;AAAA,EAAA;AAE1D,MAAI,CAAC,cAAc;AACjB,QAAI;AACF,mBAAa,GAAG,aAAaA,MAAI,EAAE,SAAA;AAAA,IACrC,SAAS,GAAG;AACV;AAAA,QACE;AAAA,QACA,oCAAoC,GAAG,SAAS,EAAE,SAAA;AAAA,MAAS;AAE7D,YAAM,oCAAoC,GAAG,SAAS,EAAE,SAAA;AAAA,IAC1D;AAAA,EACF;AAIA,MAAI;AACF,UAAM,eAAe,GAAG,IAAI,YAAYA,MAAI;AAC5C,kBAAc,cAAc,WAAW;AAAA,EACzC,SAAS,GAAG;AACV,SAAK,SAAS,uBAAuB;AACrCX,WAAAA,QAAO,OAAO,WAAW,WAAW,CAAC;AACrC,UAAM,6BAA6B,GAAG,SAAS,EAAE,SAAA;AAAA,EACnD;AAEA,MACE,CAAC,eACD,OAAO,gBAAgB,cACvB,OAAO,YAAY,cAAc,UACjC;AACA,kBAAc;AACd,SAAK,SAAS,gCAAgC;AAC9C,UAAM;AAAA,EACR;AAEA,MAAI,OAAO,YAAY,UAAU,SAAS,YAAY;AACpD,kBAAc;AACd,SAAK,SAAS,mCAAmC;AACjD,UAAM;AAAA,EACR;AAEA,MAAI,OAAO,YAAY,UAAU,SAAS,YAAY;AACpD,kBAAc;AACd,SAAK,SAAS,mCAAmC;AACjD,UAAM;AAAA,EACR;AACF;AAGA,OAAO,GAAG,QAAQ,CAAA,SAAQ;AACxB,OAAK,IAAI;AACT,UAAQ,KAAK,CAAC;AAChB,CAAC;AAGD,OAAO,GAAG,QAAQ,CAAC,MAAM,SAAS;AAChC,eAAa;AAEb,SAAO,kBAAkB,YAAY,OAAO;AAC5C,OAAK,IAAI;AACX,CAAC;AAGD,OAAO,GAAG,OAAO,CAAA,SAAQ,KAAK,MAAM,OAAO,QAAQ,YAAA,CAAa,CAAC;AAGjE,OAAO,GAAG,QAAQ,OAAO,MAAM,YAAY,YAAY;AACrD,MAAI;AACF,UAAM,SAAS,YAAY,OAAO;AAElC,SAAK,MAAM,IAAI;AAAA,EACjB,SAAS,KAAK;AACZA,WAAAA,QAAO;AAAA,MACL,WAAW;AAAA,MACX;AAAA,MACA,KAAK,SAAS,IAAI,SAAA;AAAA,IAAS;AAE7B,SAAK,MAAM,KAAK;AAAA,EAClB;AACF,CAAC;AAKD,OAAO,GAAG,SAAS,OAAO,MAAM,WAAW;AACzC,MAAI;AACF,qBAAiB,IAAI,YAAY,QAAyB,QAAQ,KAAK;AACvE,UAAM,SAAS,MAAM,eAAe,KAAA;AAEpC,QAAI,OAAO,WAAW,YAAY,QAAQ;AAExC,YAAM,OAAO,OAAO;AACpB,UACE,QACA,gBAAgB,SAChB,KAAK,MAAM,CAAA,MAAK,OAAO,MAAM,QAAQ,GACrC;AACA,aAAK,qBAAqB,KAAK,UAAU,IAAI,CAAC;AAAA,MAChD;AAAA,IACF;AACA,SAAK,MAAM,IAAI;AAAA,EACjB,SAAS,KAAK;AACZ,SAAK,SAAS,yBAAyB,KAAK,SAAS,KAAK,UAAU,GAAG,CAAC;AACxE,SAAK,MAAM,KAAK;AAChBA,WAAAA,QAAO,OAAO,WAAW,WAAW,yBAAyB,GAAG;AAAA,EAClE;AACF,CAAC;AAGD,OAAO,GAAG,QAAQ,OAAM,SAAQ;AAC9B,MAAI;AACF,QAAI,gBAAgB;AAClB,YAAM,eAAe,KAAK,KAAK,cAAc,EAAA;AAAA,IAC/C;AACA,qBAAiB;AACjB,SAAK,MAAM,IAAI;AAAA,EACjB,SAAS,KAAK;AACZ,SAAK,SAAS,yBAAyB,KAAK,SAAS,IAAI,UAAU;AACnE,SAAK,MAAM,KAAK;AAAA,EAClB;AACF,CAAC;AAGD,OAAO,GAAG,cAAc,OAAO,MAAM,IAAI,MAAM,SAAS;AACtD,MAAI,gBAAgB,aAAa;AAC/B,SAAK,MAAM,MAAM,eAAe,YAAY,IAAI,MAAM,GAAG,IAAI,CAAC;AAAA,EAChE,OAAO;AACL,SAAK,MAAM,IAAI;AAAA,EACjB;AACF,CAAC;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omegga",
3
- "version": "1.2.9",
3
+ "version": "1.4.0",
4
4
  "description": "Brickadia server installer, updater, manager, wrapper, configurator, and automator",
5
5
  "engines": {
6
6
  "node": ">=23.0.0"
@@ -21,6 +21,7 @@
21
21
  "commander": "^5.1.0",
22
22
  "configstore": "^5.0.1",
23
23
  "disrequire": "^1.1.1",
24
+ "dotenv": "^17.2.3",
24
25
  "express": "^4.18.2",
25
26
  "express-session": "^1.17.3",
26
27
  "glob": "^7.1.6",
@@ -42,7 +43,7 @@
42
43
  "strip-ansi": "^6.0.1",
43
44
  "swc-loader": "^0.2.0",
44
45
  "update-notifier-cjs": "^5.1.6",
45
- "vm2": "3.9.2 || >3.9.4",
46
+ "vm2": "^3.10.3",
46
47
  "webpack": "^5.80.0"
47
48
  },
48
49
  "types": "./dist/lib.d.ts",
@@ -95,20 +96,24 @@
95
96
  "vite-plugin-module-alias": "^1.3.5",
96
97
  "vite-plugin-native-import-maps": "^0.0.4",
97
98
  "vite-plugin-sass": "^0.1.0",
99
+ "vitest": "^3.2.4",
98
100
  "webpack-cli": "^5.0.2",
99
101
  "wouter": "^3.7.1"
100
102
  },
101
103
  "scripts": {
102
- "prepare": "ts-patch install",
103
- "start": "node index.js",
104
- "lint": "npx prettier --check \"src/\" \"frontend/src\"",
105
- "lint:fix": "npx prettier --write \"src/\" \"frontend/src/\"",
106
- "watch": "npx vite build --watch",
107
- "dist": "npx vite build && npm run build && npm run dts",
108
- "build:frontend": "npx vite build",
109
- "build": "npx tspc --build \"src/\"",
104
+ "build:frontend": "npx vite build -c vite.frontend.config.mts",
105
+ "build:old": "npx tspc --build \"src/\"",
106
+ "build": "npx vite build -c vite.backend.config.mts",
107
+ "check": "eslint",
108
+ "dist": "npm run build:frontend && npm run build && npm run dts",
110
109
  "dts": "npx dts-bundle-generator --inline-declare-global --no-banner --no-check --external-inlines brs-js -o templates/safe-ts/omegga.d.ts -- ./src/plugin.ts",
111
- "check": "eslint"
110
+ "lint:fix": "npx prettier --write \"src/\" \"frontend/src/\"",
111
+ "lint": "npx prettier --check \"src/\" \"frontend/src\"",
112
+ "prepare": "ts-patch install",
113
+ "start": "node --enable-source-maps index.js",
114
+ "test:backend": "vitest --config vitest.backend.config.mts --dir ./src",
115
+ "test": "npm run test:backend",
116
+ "watch": "npm run build:frontend -- --watch"
112
117
  },
113
118
  "author": "Meshiest",
114
119
  "license": "ISC",
package/public/app.html CHANGED
@@ -1886,28 +1886,28 @@ a,
1886
1886
  flex-direction: column;
1887
1887
  }
1888
1888
  </style>
1889
- <script type="importmap">{"imports":{"react":"./assets/shared/react-CR6vSpIu.js","react-dom":"./assets/shared/react-dom-BznoGTRX.js","react/jsx-runtime":"./assets/shared/react_jsx-runtime-C15Zu6_p.js","@nanostores/react":"./assets/shared/@nanostores_react-HTG3s0lp.js","nanostores":"./assets/shared/nanostores-BFqqIY_c.js","@tabler/icons-react":"./assets/shared/@tabler_icons-react--FJWdUou.js","@hooks":"./assets/shared/@hooks-DfTzYBIL.js","wouter":"./assets/shared/wouter-DbmGxXTo.js","@utils":"./assets/shared/@utils-BA2UvC9c.js","@components":"./assets/shared/@components-DVehBp7v.js"}}</script>
1890
- <script type="module" crossorigin src="/assets/app-BtOlgo__.js"></script>
1891
- <link rel="modulepreload" crossorigin href="/assets/index-c0qeY2gs.js">
1892
- <link rel="modulepreload" crossorigin href="/assets/index-DqHVrEeL.js">
1893
- <link rel="modulepreload" crossorigin href="/assets/client-C5T7_OK9.js">
1894
- <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-Bw5QeaCk.js">
1895
- <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-DoEZbXM1.js">
1889
+ <script type="importmap">{"imports":{"react":"./assets/shared/react-iXLZ_Bod.js","react-dom":"./assets/shared/react-dom-8Rcmh_FG.js","react/jsx-runtime":"./assets/shared/react_jsx-runtime-BwhiLcBy.js","@nanostores/react":"./assets/shared/@nanostores_react-DJPF1Eqx.js","nanostores":"./assets/shared/nanostores-BFqqIY_c.js","@tabler/icons-react":"./assets/shared/@tabler_icons-react-B4bN8gHc.js","@hooks":"./assets/shared/@hooks-Ch_hJYh0.js","wouter":"./assets/shared/wouter-CUC1caxu.js","@utils":"./assets/shared/@utils-BA2UvC9c.js","@components":"./assets/shared/@components-DdtLZOaA.js"}}</script>
1890
+ <script type="module" crossorigin src="/assets/app-nJIpyOiP.js"></script>
1891
+ <link rel="modulepreload" crossorigin href="/assets/index-D0OPOe3j.js">
1892
+ <link rel="modulepreload" crossorigin href="/assets/index-CtCtK5BX.js">
1893
+ <link rel="modulepreload" crossorigin href="/assets/client-BT1QYH0O.js">
1894
+ <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-DldvXD6N.js">
1895
+ <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-BX5r4UiA.js">
1896
1896
  <link rel="modulepreload" crossorigin href="/assets/_commonjsHelpers-CE1G-McA.js">
1897
- <link rel="modulepreload" crossorigin href="/assets/index-i4mjW0og.js">
1897
+ <link rel="modulepreload" crossorigin href="/assets/index-CrN8I5Az.js">
1898
1898
  <link rel="modulepreload" crossorigin href="/assets/index-CJ4e7_2M.js">
1899
- <link rel="modulepreload" crossorigin href="/assets/shared/@nanostores_react-HTG3s0lp.js">
1899
+ <link rel="modulepreload" crossorigin href="/assets/shared/@nanostores_react-DJPF1Eqx.js">
1900
1900
  <link rel="modulepreload" crossorigin href="/assets/index-CSV4ZXsq.js">
1901
- <link rel="modulepreload" crossorigin href="/assets/IconCheck-Dyq5qyY1.js">
1902
- <link rel="modulepreload" crossorigin href="/assets/IconX-SYtbnYKI.js">
1903
- <link rel="modulepreload" crossorigin href="/assets/index-DYcAgWjJ.js">
1904
- <link rel="modulepreload" crossorigin href="/assets/index-CRRRLlCc.js">
1905
- <link rel="modulepreload" crossorigin href="/assets/IconWorld-DtARpBKX.js">
1901
+ <link rel="modulepreload" crossorigin href="/assets/IconCheck-DOe3u7iH.js">
1902
+ <link rel="modulepreload" crossorigin href="/assets/IconX-CvmO0bbE.js">
1903
+ <link rel="modulepreload" crossorigin href="/assets/index-DY750sgZ.js">
1904
+ <link rel="modulepreload" crossorigin href="/assets/index-2cgXLhrt.js">
1905
+ <link rel="modulepreload" crossorigin href="/assets/IconWorld-B6GK5qpx.js">
1906
1906
  <link rel="modulepreload" crossorigin href="/assets/utils-Ds3ldd-U.js">
1907
- <link rel="modulepreload" crossorigin href="/assets/index-Bq9C9SqB.js">
1908
- <link rel="modulepreload" crossorigin href="/assets/IconWorldPlus-CGBAsLNj.js">
1909
- <link rel="modulepreload" crossorigin href="/assets/IconArrowRight-CA5_cccJ.js">
1910
- <link rel="modulepreload" crossorigin href="/assets/shared/@hooks-DfTzYBIL.js">
1907
+ <link rel="modulepreload" crossorigin href="/assets/index-3dNmNZ9B.js">
1908
+ <link rel="modulepreload" crossorigin href="/assets/IconWorldPlus-DpfueG8_.js">
1909
+ <link rel="modulepreload" crossorigin href="/assets/IconArrowRight-BuVxhqKX.js">
1910
+ <link rel="modulepreload" crossorigin href="/assets/shared/@hooks-Ch_hJYh0.js">
1911
1911
  </head>
1912
1912
  <body>
1913
1913
  <div id="root"></div>
@@ -0,0 +1,2 @@
1
+ import{c as t}from"./IconCheck-DOe3u7iH.js";import"./index-CrN8I5Az.js";import"./_commonjsHelpers-CE1G-McA.js";import"./index-D0OPOe3j.js";var p=t("outline","arrow-right","IconArrowRight",[["path",{d:"M5 12l14 0",key:"svg-0"}],["path",{d:"M13 18l6 -6",key:"svg-1"}],["path",{d:"M13 6l6 6",key:"svg-2"}]]);export{p as default};
2
+ //# sourceMappingURL=IconArrowRight-BuVxhqKX.js.map