@open-core/framework 0.2.9 → 0.3.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 (309) hide show
  1. package/dist/adapters/contracts/IPlatformCapabilities.d.ts +79 -0
  2. package/dist/adapters/contracts/IPlatformCapabilities.js +31 -0
  3. package/dist/adapters/contracts/IPlayerInfo.d.ts +1 -1
  4. package/dist/adapters/contracts/{IPedAppearanceClient.d.ts → client/IPedAppearanceClient.d.ts} +1 -1
  5. package/dist/adapters/contracts/server/IEntityServer.d.ts +188 -0
  6. package/dist/adapters/contracts/server/IEntityServer.js +39 -0
  7. package/dist/adapters/contracts/{IPlayerServer.d.ts → server/IPlayerServer.d.ts} +52 -9
  8. package/dist/adapters/contracts/server/IPlayerServer.js +39 -0
  9. package/dist/adapters/contracts/types/identifier.d.ts +67 -0
  10. package/dist/adapters/contracts/types/identifier.js +64 -0
  11. package/dist/adapters/contracts/types/index.d.ts +1 -0
  12. package/dist/{kernel/shared/appearance → adapters/contracts/types}/index.js +1 -1
  13. package/dist/adapters/fivem/fivem-capabilities.d.ts +18 -0
  14. package/dist/adapters/fivem/fivem-capabilities.js +67 -0
  15. package/dist/adapters/fivem/fivem-engine-events.js +17 -4
  16. package/dist/adapters/fivem/fivem-entity-server.d.ts +6 -2
  17. package/dist/adapters/fivem/fivem-entity-server.js +14 -1
  18. package/dist/adapters/fivem/fivem-ped-appearance-client.d.ts +1 -1
  19. package/dist/adapters/fivem/fivem-ped-appearance-client.js +1 -1
  20. package/dist/adapters/fivem/fivem-ped-appearance-server.d.ts +1 -1
  21. package/dist/adapters/fivem/fivem-ped-appearance-server.js +1 -1
  22. package/dist/adapters/fivem/fivem-platform.d.ts +5 -0
  23. package/dist/adapters/fivem/fivem-platform.js +100 -0
  24. package/dist/adapters/fivem/fivem-player-server.d.ts +7 -1
  25. package/dist/adapters/fivem/fivem-player-server.js +19 -1
  26. package/dist/adapters/fivem/fivem-playerinfo.d.ts +1 -1
  27. package/dist/adapters/fivem/fivem-vehicle-server.d.ts +1 -1
  28. package/dist/adapters/fivem/fivem-vehicle-server.js +1 -1
  29. package/dist/adapters/fivem/index.d.ts +13 -0
  30. package/dist/adapters/fivem/index.js +31 -0
  31. package/dist/adapters/index.d.ts +8 -7
  32. package/dist/adapters/index.js +13 -12
  33. package/dist/adapters/node/index.d.ts +5 -0
  34. package/dist/adapters/node/index.js +13 -1
  35. package/dist/adapters/node/node-capabilities.d.ts +19 -0
  36. package/dist/adapters/node/node-capabilities.js +54 -0
  37. package/dist/adapters/node/node-entity-server.d.ts +17 -6
  38. package/dist/adapters/node/node-entity-server.js +41 -15
  39. package/dist/adapters/node/node-net-transport.js +2 -2
  40. package/dist/adapters/node/node-ped-appearance-client.d.ts +1 -1
  41. package/dist/adapters/node/node-ped-appearance-client.js +1 -1
  42. package/dist/adapters/node/node-ped-appearance-server.d.ts +1 -1
  43. package/dist/adapters/node/node-ped-appearance-server.js +1 -1
  44. package/dist/adapters/node/node-platform.d.ts +5 -0
  45. package/dist/adapters/node/node-platform.js +103 -0
  46. package/dist/adapters/node/node-player-server.d.ts +19 -3
  47. package/dist/adapters/node/node-player-server.js +43 -9
  48. package/dist/adapters/node/node-playerinfo.d.ts +2 -2
  49. package/dist/adapters/node/node-playerinfo.js +14 -3
  50. package/dist/adapters/node/node-vehicle-server.d.ts +1 -1
  51. package/dist/adapters/node/node-vehicle-server.js +1 -1
  52. package/dist/adapters/platform/index.d.ts +1 -0
  53. package/dist/{runtime/server/database.js → adapters/platform/index.js} +1 -7
  54. package/dist/adapters/platform/platform-registry.d.ts +101 -0
  55. package/dist/adapters/platform/platform-registry.js +122 -0
  56. package/dist/adapters/register-capabilities.d.ts +52 -2
  57. package/dist/adapters/register-capabilities.js +69 -130
  58. package/dist/adapters/register-client-capabilities.js +1 -1
  59. package/dist/index.d.ts +2 -5
  60. package/dist/index.js +5 -31
  61. package/dist/kernel/di/container.d.ts +4 -2
  62. package/dist/kernel/di/container.js +5 -3
  63. package/dist/kernel/di/metadata.scanner.d.ts +2 -1
  64. package/dist/kernel/di/metadata.scanner.js +3 -2
  65. package/dist/kernel/{utils/error → error}/app.error.d.ts +2 -2
  66. package/dist/kernel/error/common.error-codes.d.ts +1 -0
  67. package/dist/kernel/error/framework.error-codes.d.ts +12 -0
  68. package/dist/kernel/error/index.d.ts +4 -0
  69. package/dist/kernel/error/index.js +18 -0
  70. package/dist/kernel/{utils/error → error}/security.error.d.ts +1 -1
  71. package/dist/kernel/error/security.types.js +2 -0
  72. package/dist/kernel/index.d.ts +4 -5
  73. package/dist/kernel/index.js +6 -11
  74. package/dist/kernel/{shared/logger → logger}/core-logger.d.ts +0 -19
  75. package/dist/kernel/{shared/logger → logger}/core-logger.js +10 -24
  76. package/dist/kernel/{shared/logger → logger}/logger.env.d.ts +12 -5
  77. package/dist/kernel/{shared/logger → logger}/logger.env.js +29 -13
  78. package/dist/kernel/{shared/logger → logger}/logger.service.d.ts +14 -0
  79. package/dist/kernel/{shared/logger → logger}/logger.service.js +20 -2
  80. package/dist/kernel/logger/transports/transport.interface.js +2 -0
  81. package/dist/kernel/shared/index.d.ts +1 -2
  82. package/dist/kernel/shared/index.js +1 -2
  83. package/dist/kernel/utils/index.d.ts +0 -2
  84. package/dist/kernel/utils/index.js +0 -2
  85. package/dist/kernel/utils/result.d.ts +1 -1
  86. package/dist/runtime/client/api.d.ts +7 -0
  87. package/dist/runtime/client/api.js +23 -0
  88. package/dist/runtime/client/client-bootstrap.js +1 -1
  89. package/dist/runtime/client/controllers/spawner.controller.d.ts +1 -1
  90. package/dist/runtime/client/decorators/index.d.ts +2 -2
  91. package/dist/runtime/client/decorators/index.js +2 -2
  92. package/dist/runtime/client/decorators/key.d.ts +2 -2
  93. package/dist/runtime/client/decorators/key.js +3 -3
  94. package/dist/runtime/client/decorators/localEvent.d.ts +1 -1
  95. package/dist/runtime/client/decorators/localEvent.js +1 -1
  96. package/dist/runtime/client/decorators/{tick.d.ts → onTick.d.ts} +1 -1
  97. package/dist/runtime/client/decorators/{tick.js → onTick.js} +2 -2
  98. package/dist/runtime/client/decorators/{nui.d.ts → onView.d.ts} +4 -4
  99. package/dist/runtime/client/decorators/{nui.js → onView.js} +5 -5
  100. package/dist/runtime/client/index.d.ts +1 -7
  101. package/dist/runtime/client/index.js +26 -12
  102. package/dist/runtime/client/player/player.d.ts +1 -1
  103. package/dist/runtime/client/player/player.loader.js +3 -3
  104. package/dist/runtime/client/services/appearance.service.d.ts +1 -1
  105. package/dist/runtime/client/services/appearance.service.js +1 -1
  106. package/dist/runtime/client/services/blip.service.d.ts +1 -1
  107. package/dist/runtime/client/services/marker.service.d.ts +1 -1
  108. package/dist/runtime/client/services/ped.service.d.ts +1 -1
  109. package/dist/runtime/client/services/spawn.service.d.ts +2 -2
  110. package/dist/runtime/client/services/spawn.service.js +12 -12
  111. package/dist/runtime/client/services/textui.service.d.ts +1 -1
  112. package/dist/runtime/client/services/vehicle-client.service.d.ts +1 -1
  113. package/dist/runtime/client/services/vehicle.service.d.ts +1 -1
  114. package/dist/runtime/client/system/processors/export.processor.js +1 -1
  115. package/dist/runtime/client/system/processors/gameEvent.processor.js +1 -1
  116. package/dist/runtime/client/system/processors/interval.processor.js +1 -1
  117. package/dist/runtime/client/system/processors/localEvent.processor.js +1 -1
  118. package/dist/runtime/client/system/processors/netEvent.processor.js +1 -1
  119. package/dist/runtime/client/system/processors/nui.processor.js +1 -1
  120. package/dist/runtime/client/system/processors/resourceLifecycle.processor.js +1 -1
  121. package/dist/runtime/client/system/processors/tick.processor.js +1 -1
  122. package/dist/runtime/client/ui-bridge.js +1 -1
  123. package/dist/runtime/core/entity.d.ts +168 -0
  124. package/dist/runtime/core/entity.js +226 -0
  125. package/dist/runtime/core/index.d.ts +3 -0
  126. package/dist/runtime/core/index.js +19 -0
  127. package/dist/runtime/core/spatial.d.ts +5 -0
  128. package/dist/runtime/core/spatial.js +2 -0
  129. package/dist/runtime/core/world.d.ts +13 -0
  130. package/dist/runtime/core/world.js +64 -0
  131. package/dist/runtime/server/api.d.ts +12 -0
  132. package/dist/runtime/server/api.js +34 -0
  133. package/dist/runtime/server/bootstrap.js +58 -103
  134. package/dist/runtime/server/bus/internal-event.bus.js +1 -1
  135. package/dist/runtime/server/contracts/index.d.ts +1 -2
  136. package/dist/runtime/server/contracts/index.js +2 -3
  137. package/dist/runtime/server/contracts/player-persistence.contract.d.ts +16 -18
  138. package/dist/runtime/server/contracts/player-persistence.contract.js +16 -18
  139. package/dist/runtime/server/contracts/security/command-error-observer.contract.d.ts +73 -0
  140. package/dist/runtime/server/contracts/security/command-error-observer.contract.js +9 -0
  141. package/dist/runtime/server/contracts/security/permission.types.d.ts +2 -2
  142. package/dist/runtime/server/contracts/security/principal-provider.contract.d.ts +3 -3
  143. package/dist/runtime/server/contracts/security/principal-provider.contract.js +2 -2
  144. package/dist/runtime/server/contracts/security/security-handler.contract.d.ts +2 -2
  145. package/dist/runtime/server/controllers/chat.controller.d.ts +1 -1
  146. package/dist/runtime/server/controllers/chat.controller.js +5 -0
  147. package/dist/runtime/server/controllers/command-export.controller.d.ts +12 -3
  148. package/dist/runtime/server/controllers/command-export.controller.js +81 -25
  149. package/dist/runtime/server/controllers/player-export.controller.d.ts +2 -2
  150. package/dist/runtime/server/controllers/player-export.controller.js +5 -0
  151. package/dist/runtime/server/controllers/principal-export.controller.js +8 -7
  152. package/dist/runtime/server/controllers/ready.controller.d.ts +5 -0
  153. package/dist/runtime/server/controllers/ready.controller.js +37 -0
  154. package/dist/runtime/server/controllers/remote-command-execution.controller.d.ts +10 -1
  155. package/dist/runtime/server/controllers/remote-command-execution.controller.js +65 -13
  156. package/dist/runtime/server/controllers/session.controller.d.ts +2 -2
  157. package/dist/runtime/server/controllers/session.controller.js +25 -17
  158. package/dist/runtime/server/controllers/vehicle.controller.d.ts +3 -38
  159. package/dist/runtime/server/controllers/vehicle.controller.js +6 -152
  160. package/dist/runtime/server/decorators/guard.js +2 -2
  161. package/dist/runtime/server/decorators/index.d.ts +1 -1
  162. package/dist/runtime/server/decorators/index.js +1 -1
  163. package/dist/runtime/server/decorators/{onFiveMEvent.d.ts → onRuntimeEvent.d.ts} +5 -4
  164. package/dist/runtime/server/decorators/{onFiveMEvent.js → onRuntimeEvent.js} +7 -6
  165. package/dist/runtime/server/decorators/requiresState.js +3 -3
  166. package/dist/runtime/server/decorators/throttle.d.ts +1 -1
  167. package/dist/runtime/server/decorators/throttle.js +1 -1
  168. package/dist/runtime/server/decorators/utils.d.ts +1 -1
  169. package/dist/runtime/server/decorators/utils.js +1 -1
  170. package/dist/runtime/server/devmode/dev-mode.service.d.ts +7 -8
  171. package/dist/runtime/server/devmode/dev-mode.service.js +18 -46
  172. package/dist/runtime/server/devmode/index.d.ts +1 -3
  173. package/dist/runtime/server/devmode/index.js +1 -18
  174. package/dist/runtime/server/devmode/player-simulator.service.js +3 -3
  175. package/dist/runtime/server/devmode/state-inspector.service.js +2 -2
  176. package/dist/runtime/server/devmode/types.d.ts +67 -31
  177. package/dist/runtime/server/devmode/types.js +1 -4
  178. package/dist/runtime/server/entities/player.d.ts +80 -66
  179. package/dist/runtime/server/entities/player.js +137 -98
  180. package/dist/runtime/server/entities/vehicle.d.ts +3 -3
  181. package/dist/runtime/server/error-handler.js +5 -5
  182. package/dist/runtime/server/helpers/normalize-app-error.d.ts +9 -0
  183. package/dist/runtime/server/helpers/normalize-app-error.js +20 -0
  184. package/dist/runtime/server/helpers/resolve-method.js +3 -3
  185. package/dist/runtime/server/index.d.ts +1 -13
  186. package/dist/runtime/server/index.js +25 -23
  187. package/dist/runtime/server/runtime.d.ts +32 -281
  188. package/dist/runtime/server/runtime.js +46 -60
  189. package/dist/runtime/server/services/appearance.service.d.ts +5 -5
  190. package/dist/runtime/server/services/appearance.service.js +5 -5
  191. package/dist/runtime/server/services/chat.service.d.ts +5 -3
  192. package/dist/runtime/server/services/chat.service.js +17 -12
  193. package/dist/runtime/server/services/core/command.service.d.ts +9 -1
  194. package/dist/runtime/server/services/core/command.service.js +16 -7
  195. package/dist/runtime/server/services/core/player.service.d.ts +12 -16
  196. package/dist/runtime/server/services/core/player.service.js +42 -47
  197. package/dist/runtime/server/services/core/principal.service.js +5 -5
  198. package/dist/runtime/server/services/core/session-recovery.service.d.ts +1 -1
  199. package/dist/runtime/server/services/core/session-recovery.service.js +2 -2
  200. package/dist/runtime/server/services/default/default-command-error-observer.d.ts +14 -0
  201. package/dist/runtime/server/services/default/default-command-error-observer.js +43 -0
  202. package/dist/runtime/server/services/default/default-principal.provider.d.ts +13 -0
  203. package/dist/runtime/server/services/default/default-principal.provider.js +38 -0
  204. package/dist/runtime/server/services/default/default-security.handler.d.ts +1 -1
  205. package/dist/runtime/server/services/default/default-security.handler.js +1 -1
  206. package/dist/runtime/server/services/index.d.ts +0 -3
  207. package/dist/runtime/server/services/index.js +1 -6
  208. package/dist/runtime/server/services/persistence.service.js +3 -3
  209. package/dist/runtime/server/services/ports/command-execution.port.d.ts +7 -0
  210. package/dist/runtime/server/services/ports/principal.port.d.ts +1 -1
  211. package/dist/runtime/server/services/remote/remote-command.service.d.ts +1 -0
  212. package/dist/runtime/server/services/remote/remote-command.service.js +7 -3
  213. package/dist/runtime/server/services/remote/remote-player.service.d.ts +2 -2
  214. package/dist/runtime/server/services/remote/remote-player.service.js +3 -3
  215. package/dist/runtime/server/services/remote/server-bridge.js +2 -2
  216. package/dist/runtime/server/services/services.register.d.ts +2 -5
  217. package/dist/runtime/server/services/services.register.js +29 -41
  218. package/dist/runtime/server/services/vehicle-modification.service.js +1 -1
  219. package/dist/runtime/server/services/vehicle.service.d.ts +3 -3
  220. package/dist/runtime/server/services/vehicle.service.js +5 -5
  221. package/dist/runtime/server/setup.d.ts +2 -3
  222. package/dist/runtime/server/setup.js +10 -11
  223. package/dist/runtime/server/system/metadata-server.keys.d.ts +1 -1
  224. package/dist/runtime/server/system/metadata-server.keys.js +1 -1
  225. package/dist/runtime/server/system/processors/command.processor.js +4 -0
  226. package/dist/runtime/server/system/processors/export.processor.js +1 -1
  227. package/dist/runtime/server/system/processors/internalEvent.processor.js +1 -1
  228. package/dist/runtime/server/system/processors/netEvent.processor.js +8 -9
  229. package/dist/runtime/server/system/processors/{fivemEvent.processor.d.ts → runtimeEvent.processor.d.ts} +1 -1
  230. package/dist/runtime/server/system/processors/{fivemEvent.processor.js → runtimeEvent.processor.js} +8 -8
  231. package/dist/runtime/server/system/processors/tick.processor.js +1 -1
  232. package/dist/runtime/server/system/processors.register.js +16 -11
  233. package/dist/runtime/server/system/schema-generator.js +2 -2
  234. package/dist/runtime/server/types/core-exports.d.ts +6 -6
  235. package/dist/runtime/server/types/index.d.ts +1 -1
  236. package/dist/runtime/server/types/index.js +1 -1
  237. package/dist/runtime/server/types/internal-events.d.ts +1 -1
  238. package/dist/runtime/server/types/vehicle.types.d.ts +1 -1
  239. package/package.json +7 -15
  240. package/dist/adapters/contracts/IEntityServer.d.ts +0 -88
  241. package/dist/adapters/contracts/IEntityServer.js +0 -13
  242. package/dist/adapters/contracts/IPlayerServer.js +0 -13
  243. package/dist/adapters/database/oxmysql.adapter.d.ts +0 -89
  244. package/dist/adapters/database/oxmysql.adapter.js +0 -149
  245. package/dist/adapters/database/resource.adapter.d.ts +0 -12
  246. package/dist/adapters/database/resource.adapter.js +0 -68
  247. package/dist/kernel/shared/appearance/index.d.ts +0 -1
  248. package/dist/runtime/index.d.ts +0 -2
  249. package/dist/runtime/index.js +0 -39
  250. package/dist/runtime/server/bootstrap.validation.d.ts +0 -12
  251. package/dist/runtime/server/bootstrap.validation.js +0 -104
  252. package/dist/runtime/server/contracts/auth-provider.contract.d.ts +0 -58
  253. package/dist/runtime/server/contracts/auth-provider.contract.js +0 -23
  254. package/dist/runtime/server/contracts/repository/index.d.ts +0 -57
  255. package/dist/runtime/server/contracts/repository/index.js +0 -61
  256. package/dist/runtime/server/contracts/repository/repository.contract.d.ts +0 -224
  257. package/dist/runtime/server/contracts/repository/repository.contract.js +0 -341
  258. package/dist/runtime/server/contracts/repository/repository.types.d.ts +0 -51
  259. package/dist/runtime/server/contracts/repository/repository.types.js +0 -7
  260. package/dist/runtime/server/database/adapter.registry.d.ts +0 -4
  261. package/dist/runtime/server/database/adapter.registry.js +0 -14
  262. package/dist/runtime/server/database/database.contract.d.ts +0 -128
  263. package/dist/runtime/server/database/database.contract.js +0 -29
  264. package/dist/runtime/server/database/database.service.d.ts +0 -188
  265. package/dist/runtime/server/database/database.service.js +0 -287
  266. package/dist/runtime/server/database/index.d.ts +0 -5
  267. package/dist/runtime/server/database/index.js +0 -25
  268. package/dist/runtime/server/database/types.d.ts +0 -67
  269. package/dist/runtime/server/database/types.js +0 -7
  270. package/dist/runtime/server/database.d.ts +0 -7
  271. package/dist/runtime/server/devmode/hot-reload.server.d.ts +0 -74
  272. package/dist/runtime/server/devmode/hot-reload.server.js +0 -261
  273. package/dist/runtime/server/services/config.service.d.ts +0 -75
  274. package/dist/runtime/server/services/config.service.js +0 -116
  275. package/dist/runtime/server/services/http/http.service.d.ts +0 -50
  276. package/dist/runtime/server/services/http/http.service.js +0 -126
  277. /package/dist/adapters/contracts/{IPedAppearanceClient.js → client/IPedAppearanceClient.js} +0 -0
  278. /package/dist/adapters/contracts/{IPedAppearanceServer.d.ts → server/IPedAppearanceServer.d.ts} +0 -0
  279. /package/dist/adapters/contracts/{IPedAppearanceServer.js → server/IPedAppearanceServer.js} +0 -0
  280. /package/dist/adapters/contracts/{IVehicleServer.d.ts → server/IVehicleServer.d.ts} +0 -0
  281. /package/dist/adapters/contracts/{IVehicleServer.js → server/IVehicleServer.js} +0 -0
  282. /package/dist/kernel/{utils/error → error}/app.error.js +0 -0
  283. /package/dist/kernel/{shared/logger/transports/transport.interface.js → error/common.error-codes.js} +0 -0
  284. /package/dist/{runtime/server/types/security.types.js → kernel/error/framework.error-codes.js} +0 -0
  285. /package/dist/kernel/{utils/error → error}/security.error.js +0 -0
  286. /package/dist/{runtime/server/types → kernel/error}/security.types.d.ts +0 -0
  287. /package/dist/kernel/{shared/logger → logger}/index.d.ts +0 -0
  288. /package/dist/kernel/{shared/logger → logger}/index.js +0 -0
  289. /package/dist/kernel/{shared/logger → logger}/logger.config.d.ts +0 -0
  290. /package/dist/kernel/{shared/logger → logger}/logger.config.js +0 -0
  291. /package/dist/kernel/{shared/logger → logger}/logger.types.d.ts +0 -0
  292. /package/dist/kernel/{shared/logger → logger}/logger.types.js +0 -0
  293. /package/dist/kernel/{shared/logger → logger}/transports/buffered.transport.d.ts +0 -0
  294. /package/dist/kernel/{shared/logger → logger}/transports/buffered.transport.js +0 -0
  295. /package/dist/kernel/{shared/logger → logger}/transports/console.transport.d.ts +0 -0
  296. /package/dist/kernel/{shared/logger → logger}/transports/console.transport.js +0 -0
  297. /package/dist/kernel/{shared/logger → logger}/transports/dev-transport.factory.d.ts +0 -0
  298. /package/dist/kernel/{shared/logger → logger}/transports/dev-transport.factory.js +0 -0
  299. /package/dist/kernel/{shared/logger → logger}/transports/http.transport.d.ts +0 -0
  300. /package/dist/kernel/{shared/logger → logger}/transports/http.transport.js +0 -0
  301. /package/dist/kernel/{shared/logger → logger}/transports/index.d.ts +0 -0
  302. /package/dist/kernel/{shared/logger → logger}/transports/index.js +0 -0
  303. /package/dist/kernel/{shared/logger → logger}/transports/simple-console.transport.d.ts +0 -0
  304. /package/dist/kernel/{shared/logger → logger}/transports/simple-console.transport.js +0 -0
  305. /package/dist/kernel/{shared/logger → logger}/transports/transport.interface.d.ts +0 -0
  306. /package/dist/kernel/{shared/logger → logger}/transports/websocket.transport.d.ts +0 -0
  307. /package/dist/kernel/{shared/logger → logger}/transports/websocket.transport.js +0 -0
  308. /package/dist/kernel/shared/{appearance/appearance.interface.d.ts → player-appearance.types.d.ts} +0 -0
  309. /package/dist/kernel/shared/{appearance/appearance.interface.js → player-appearance.types.js} +0 -0
@@ -8,8 +8,12 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
8
8
  var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
11
14
  Object.defineProperty(exports, "__esModule", { value: true });
12
15
  exports.ChatController = void 0;
16
+ const tsyringe_1 = require("tsyringe");
13
17
  const controller_1 = require("../decorators/controller");
14
18
  const export_1 = require("../decorators/export");
15
19
  const chat_service_1 = require("../services/chat.service");
@@ -57,6 +61,7 @@ __decorate([
57
61
  ], ChatController.prototype, "coreSendToGroupOfPlayers", null);
58
62
  exports.ChatController = ChatController = __decorate([
59
63
  (0, controller_1.Controller)(),
64
+ __param(1, (0, tsyringe_1.inject)(player_directory_port_1.PlayerDirectoryPort)),
60
65
  __metadata("design:paramtypes", [chat_service_1.ChatService,
61
66
  player_directory_port_1.PlayerDirectoryPort])
62
67
  ], ChatController);
@@ -1,10 +1,11 @@
1
1
  import { IEngineEvents } from '../../../adapters/contracts/IEngineEvents';
2
+ import { CommandErrorObserverContract } from '../contracts/security/command-error-observer.contract';
2
3
  import { Player } from '../entities';
3
4
  import { CommandExecutionPort, type CommandInfo } from '../services/ports/command-execution.port';
4
5
  import { PlayerDirectoryPort } from '../services/ports/player-directory.port';
5
6
  import { PrincipalPort } from '../services/ports/principal.port';
6
7
  import { RateLimiterService } from '../services/rate-limiter.service';
7
- import { CommandRegistrationDto, CoreCommandsExports } from '../types/core-exports';
8
+ import { CommandRegistrationDto, InternalCommandsExports } from '../types/core-exports';
8
9
  /**
9
10
  * Export controller for command system (CORE mode only).
10
11
  *
@@ -13,14 +14,22 @@ import { CommandRegistrationDto, CoreCommandsExports } from '../types/core-expor
13
14
  * Maintains a registry of both local and remote commands, delegating
14
15
  * remote command execution back to the owning resource via net events.
15
16
  */
16
- export declare class CommandExportController implements CoreCommandsExports {
17
+ export declare class CommandExportController implements InternalCommandsExports {
17
18
  private commandService;
18
19
  private playerDirectory;
19
20
  private principalPort;
20
21
  private rateLimiter;
22
+ private readonly commandErrorObserver;
21
23
  private engineEvents;
22
24
  private remoteCommands;
23
- constructor(commandService: CommandExecutionPort, playerDirectory: PlayerDirectoryPort, principalPort: PrincipalPort, rateLimiter: RateLimiterService, engineEvents: IEngineEvents);
25
+ constructor(commandService: CommandExecutionPort, playerDirectory: PlayerDirectoryPort, principalPort: PrincipalPort, rateLimiter: RateLimiterService, commandErrorObserver: CommandErrorObserverContract, engineEvents: IEngineEvents);
26
+ /**
27
+ * Invokes the global {@link CommandErrorObserverContract} safely.
28
+ *
29
+ * @remarks
30
+ * Observers are user-land code; failures must never break the command pipeline.
31
+ */
32
+ private safeObserve;
24
33
  /**
25
34
  * Receives command execution requests from clients.
26
35
  *
@@ -15,12 +15,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.CommandExportController = void 0;
16
16
  const tsyringe_1 = require("tsyringe");
17
17
  const IEngineEvents_1 = require("../../../adapters/contracts/IEngineEvents");
18
- const logger_1 = require("../../../kernel/shared/logger");
19
- const utils_1 = require("../../../kernel/utils");
20
- const security_error_1 = require("../../../kernel/utils/error/security.error");
18
+ const error_1 = require("../../../kernel/error");
19
+ const logger_1 = require("../../../kernel/logger");
20
+ const command_error_observer_contract_1 = require("../contracts/security/command-error-observer.contract");
21
21
  const decorators_1 = require("../decorators");
22
22
  const onNet_1 = require("../decorators/onNet");
23
23
  const entities_1 = require("../entities");
24
+ const normalize_app_error_1 = require("../helpers/normalize-app-error");
25
+ const runtime_1 = require("../runtime");
24
26
  const command_execution_port_1 = require("../services/ports/command-execution.port");
25
27
  const player_directory_port_1 = require("../services/ports/player-directory.port");
26
28
  const principal_port_1 = require("../services/ports/principal.port");
@@ -34,14 +36,29 @@ const rate_limiter_service_1 = require("../services/rate-limiter.service");
34
36
  * remote command execution back to the owning resource via net events.
35
37
  */
36
38
  let CommandExportController = class CommandExportController {
37
- constructor(commandService, playerDirectory, principalPort, rateLimiter, engineEvents) {
39
+ constructor(commandService, playerDirectory, principalPort, rateLimiter, commandErrorObserver, engineEvents) {
38
40
  this.commandService = commandService;
39
41
  this.playerDirectory = playerDirectory;
40
42
  this.principalPort = principalPort;
41
43
  this.rateLimiter = rateLimiter;
44
+ this.commandErrorObserver = commandErrorObserver;
42
45
  this.engineEvents = engineEvents;
43
46
  this.remoteCommands = new Map();
44
47
  }
48
+ /**
49
+ * Invokes the global {@link CommandErrorObserverContract} safely.
50
+ *
51
+ * @remarks
52
+ * Observers are user-land code; failures must never break the command pipeline.
53
+ */
54
+ async safeObserve(ctx) {
55
+ try {
56
+ await this.commandErrorObserver.onError(ctx);
57
+ }
58
+ catch (e) {
59
+ logger_1.loggers.command.fatal(`Command error observer failed`, ctx, e);
60
+ }
61
+ }
45
62
  // ═══════════════════════════════════════════════════════════════
46
63
  // Network Event Handler (receives commands from clients)
47
64
  // ═══════════════════════════════════════════════════════════════
@@ -73,22 +90,60 @@ let CommandExportController = class CommandExportController {
73
90
  await this.executeCommand(player.clientID, command, args);
74
91
  }
75
92
  catch (error) {
76
- if (error instanceof utils_1.AppError) {
77
- if (error.code === 'GAME:BAD_REQUEST' || error.code === 'COMMAND:NOT_FOUND') {
78
- player.send(error.message, 'error');
93
+ const runtime = (0, runtime_1.getRuntimeContext)();
94
+ const remoteEntry = this.remoteCommands.get(command.toLowerCase());
95
+ const localMeta = this.commandService.getCommandMeta(command);
96
+ const appError = (0, normalize_app_error_1.normalizeToAppError)(error, 'server');
97
+ // If we have an error and it's not a remote command, try to find local meta
98
+ // to populate the error context properly for the observer.
99
+ const commandInfo = localMeta
100
+ ? {
101
+ command: localMeta.command,
102
+ description: localMeta.description,
103
+ usage: localMeta.usage,
104
+ isPublic: localMeta.isPublic,
105
+ methodName: localMeta.methodName,
106
+ expectsPlayer: localMeta.expectsPlayer,
107
+ paramNames: localMeta.paramNames,
79
108
  }
80
- else {
81
- player.send('An error occurred while executing the command', 'error');
82
- }
83
- logger_1.loggers.command.error(`Execution failed: /${command}`, { playerId: player.clientID }, error);
84
- }
85
- else if (error instanceof security_error_1.SecurityError) {
86
- player.send(error.message, 'error');
87
- logger_1.loggers.command.warn(`Security error: /${command}`, {
88
- playerId: player.clientID,
89
- error: error.message,
90
- });
91
- }
109
+ : remoteEntry
110
+ ? {
111
+ command: remoteEntry.metadata.command,
112
+ description: remoteEntry.metadata.description,
113
+ usage: remoteEntry.metadata.usage,
114
+ isPublic: remoteEntry.metadata.isPublic,
115
+ }
116
+ : undefined;
117
+ const stage = error instanceof error_1.SecurityError
118
+ ? 'security'
119
+ : appError.code === 'AUTH:UNAUTHORIZED'
120
+ ? 'auth'
121
+ : appError.code === 'GAME:BAD_REQUEST' || appError.code.startsWith('SCHEMA:')
122
+ ? 'validation'
123
+ : appError.code === 'COMMAND:NOT_FOUND'
124
+ ? 'dispatch'
125
+ : 'unknown';
126
+ await this.safeObserve({
127
+ mode: runtime.mode,
128
+ scope: runtime.mode === 'CORE'
129
+ ? 'core'
130
+ : runtime.mode === 'RESOURCE'
131
+ ? 'resource'
132
+ : 'standalone',
133
+ stage,
134
+ error: appError,
135
+ commandName: command,
136
+ args,
137
+ player: {
138
+ clientId: player.clientID,
139
+ accountId: player.accountID || player.clientID.toString(),
140
+ name: player.name,
141
+ },
142
+ playerRef: player,
143
+ ownerResourceName: remoteEntry === null || remoteEntry === void 0 ? void 0 : remoteEntry.resourceName,
144
+ command: commandInfo,
145
+ commandMeta: localMeta,
146
+ });
92
147
  }
93
148
  }
94
149
  // ═══════════════════════════════════════════════════════════════
@@ -133,7 +188,7 @@ let CommandExportController = class CommandExportController {
133
188
  async executeCommand(clientID, commandName, args) {
134
189
  const player = this.playerDirectory.getByClient(clientID);
135
190
  if (!player) {
136
- throw new utils_1.AppError('GAME:PLAYER_NOT_FOUND', `Player not found: ${clientID}`, 'core');
191
+ throw new error_1.AppError('GAME:PLAYER_NOT_FOUND', `Player not found: ${clientID}`, 'core');
137
192
  }
138
193
  const commandKey = commandName.toLowerCase();
139
194
  const remoteEntry = this.remoteCommands.get(commandKey);
@@ -199,7 +254,7 @@ let CommandExportController = class CommandExportController {
199
254
  if (onExceed === 'KICK') {
200
255
  DropPlayer(player.clientID.toString(), errorMessage);
201
256
  }
202
- throw new security_error_1.SecurityError(onExceed || 'LOG', errorMessage, { clientID: player.clientID });
257
+ throw new error_1.SecurityError(onExceed || 'LOG', errorMessage, { clientID: player.clientID });
203
258
  }
204
259
  }
205
260
  // 3. Validate @RequiresState (player state)
@@ -208,14 +263,14 @@ let CommandExportController = class CommandExportController {
208
263
  if (has) {
209
264
  for (const state of has) {
210
265
  if (!player.hasState(state)) {
211
- throw new utils_1.AppError('GAME:INVALID_STATE', errorMessage || `Command requires state: ${state}`, 'core');
266
+ throw new error_1.AppError('GAME:INVALID_STATE', errorMessage || `Command requires state: ${state}`, 'core');
212
267
  }
213
268
  }
214
269
  }
215
270
  if (missing) {
216
271
  for (const state of missing) {
217
272
  if (player.hasState(state)) {
218
- throw new utils_1.AppError('GAME:INVALID_STATE', errorMessage || `Command cannot be used in state: ${state}`, 'core');
273
+ throw new error_1.AppError('GAME:INVALID_STATE', errorMessage || `Command cannot be used in state: ${state}`, 'core');
219
274
  }
220
275
  }
221
276
  }
@@ -249,12 +304,13 @@ __decorate([
249
304
  __metadata("design:returntype", Array)
250
305
  ], CommandExportController.prototype, "getAllCommands", null);
251
306
  exports.CommandExportController = CommandExportController = __decorate([
252
- (0, tsyringe_1.injectable)(),
253
307
  (0, decorators_1.Controller)(),
254
- __param(4, (0, tsyringe_1.inject)(IEngineEvents_1.IEngineEvents)),
308
+ __param(4, (0, tsyringe_1.inject)(command_error_observer_contract_1.CommandErrorObserverContract)),
309
+ __param(5, (0, tsyringe_1.inject)(IEngineEvents_1.IEngineEvents)),
255
310
  __metadata("design:paramtypes", [command_execution_port_1.CommandExecutionPort,
256
311
  player_directory_port_1.PlayerDirectoryPort,
257
312
  principal_port_1.PrincipalPort,
258
313
  rate_limiter_service_1.RateLimiterService,
314
+ command_error_observer_contract_1.CommandErrorObserverContract,
259
315
  IEngineEvents_1.IEngineEvents])
260
316
  ], CommandExportController);
@@ -1,5 +1,5 @@
1
1
  import { PlayerDirectoryPort } from '../services/ports/player-directory.port';
2
- import { CorePlayerExports, SerializedPlayerData } from '../types/core-exports';
2
+ import { InternalPlayerExports, SerializedPlayerData } from '../types/core-exports';
3
3
  /**
4
4
  * Exports player directory functionality for RESOURCE mode access.
5
5
  *
@@ -10,7 +10,7 @@ import { CorePlayerExports, SerializedPlayerData } from '../types/core-exports';
10
10
  * - Read/write session metadata
11
11
  * - Manage player state flags
12
12
  */
13
- export declare class PlayerExportController implements CorePlayerExports {
13
+ export declare class PlayerExportController implements InternalPlayerExports {
14
14
  private playerService;
15
15
  constructor(playerService: PlayerDirectoryPort);
16
16
  getPlayerId(clientID: number): string | undefined;
@@ -8,8 +8,12 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
8
8
  var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
11
14
  Object.defineProperty(exports, "__esModule", { value: true });
12
15
  exports.PlayerExportController = void 0;
16
+ const tsyringe_1 = require("tsyringe");
13
17
  const controller_1 = require("../decorators/controller");
14
18
  const export_1 = require("../decorators/export");
15
19
  const player_directory_port_1 = require("../services/ports/player-directory.port");
@@ -169,5 +173,6 @@ __decorate([
169
173
  ], PlayerExportController.prototype, "removePlayerState", null);
170
174
  exports.PlayerExportController = PlayerExportController = __decorate([
171
175
  (0, controller_1.Controller)(),
176
+ __param(0, (0, tsyringe_1.inject)(player_directory_port_1.PlayerDirectoryPort)),
172
177
  __metadata("design:paramtypes", [player_directory_port_1.PlayerDirectoryPort])
173
178
  ], PlayerExportController);
@@ -14,7 +14,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.PrincipalExportController = void 0;
16
16
  const tsyringe_1 = require("tsyringe");
17
- const utils_1 = require("../../../kernel/utils");
17
+ const app_error_1 = require("../../../kernel/error/app.error");
18
18
  const index_1 = require("../contracts/index");
19
19
  const export_1 = require("../decorators/export");
20
20
  const index_2 = require("../decorators/index");
@@ -188,29 +188,29 @@ let PrincipalExportController = class PrincipalExportController {
188
188
  async enforce(source, requirements) {
189
189
  const player = this.playerService.getByClient(source);
190
190
  if (!player) {
191
- throw new utils_1.AppError('GAME:PLAYER_NOT_FOUND', `Player not found: ${source}`, 'core');
191
+ throw new app_error_1.AppError('GAME:PLAYER_NOT_FOUND', `Player not found: ${source}`, 'core');
192
192
  }
193
193
  if (requirements.rank !== undefined) {
194
194
  const principal = await this.principalProvider.getPrincipal(player);
195
195
  if (!principal) {
196
- throw new utils_1.AppError('AUTH:UNAUTHORIZED', 'No principal found', 'core');
196
+ throw new app_error_1.AppError('AUTH:UNAUTHORIZED', 'No principal found', 'core');
197
197
  }
198
198
  if (principal.rank === undefined) {
199
- throw new utils_1.AppError('GAME:NO_RANK_IN_PRINCIPAL', "You're trying to compare a Principal rank, but there's no defined rank!", 'core');
199
+ throw new app_error_1.AppError('GAME:NO_RANK_IN_PRINCIPAL', "You're trying to compare a Principal rank, but there's no defined rank!", 'core');
200
200
  }
201
201
  if (principal.rank < requirements.rank) {
202
- throw new utils_1.AppError('AUTH:PERMISSION_DENIED', `Access Denied: Requires minimum rank level ${requirements.rank}`, 'core');
202
+ throw new app_error_1.AppError('AUTH:PERMISSION_DENIED', `Access Denied: Requires minimum rank level ${requirements.rank}`, 'core');
203
203
  }
204
204
  }
205
205
  if (requirements.permission) {
206
206
  const principal = await this.principalProvider.getPrincipal(player);
207
207
  if (!principal) {
208
- throw new utils_1.AppError('AUTH:PERMISSION_DENIED', `Access Denied: Missing required permission '${requirements.permission}'`, 'core');
208
+ throw new app_error_1.AppError('AUTH:PERMISSION_DENIED', `Access Denied: Missing required permission '${requirements.permission}'`, 'core');
209
209
  }
210
210
  const hasPerm = principal.permissions.includes('*') ||
211
211
  principal.permissions.includes(requirements.permission);
212
212
  if (!hasPerm) {
213
- throw new utils_1.AppError('AUTH:PERMISSION_DENIED', `Access Denied: Missing required permission '${requirements.permission}'`, 'core');
213
+ throw new app_error_1.AppError('AUTH:PERMISSION_DENIED', `Access Denied: Missing required permission '${requirements.permission}'`, 'core');
214
214
  }
215
215
  }
216
216
  }
@@ -290,6 +290,7 @@ __decorate([
290
290
  ], PrincipalExportController.prototype, "enforce", null);
291
291
  exports.PrincipalExportController = PrincipalExportController = __decorate([
292
292
  (0, index_2.Controller)(),
293
+ __param(0, (0, tsyringe_1.inject)(player_directory_port_1.PlayerDirectoryPort)),
293
294
  __param(1, (0, tsyringe_1.inject)(index_1.PrincipalProviderContract)),
294
295
  __metadata("design:paramtypes", [player_directory_port_1.PlayerDirectoryPort,
295
296
  index_1.PrincipalProviderContract])
@@ -0,0 +1,5 @@
1
+ export declare class ReadyController {
2
+ private isReady;
3
+ constructor();
4
+ isCoreReady(): boolean;
5
+ }
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ReadyController = void 0;
13
+ const controller_1 = require("../decorators/controller");
14
+ const export_1 = require("../decorators/export");
15
+ let ReadyController = class ReadyController {
16
+ constructor() {
17
+ this.isReady = false;
18
+ // Set ready after a small tick to ensure bootstrap finishes
19
+ setTimeout(() => {
20
+ this.isReady = true;
21
+ }, 0);
22
+ }
23
+ isCoreReady() {
24
+ return this.isReady;
25
+ }
26
+ };
27
+ exports.ReadyController = ReadyController;
28
+ __decorate([
29
+ (0, export_1.Export)(),
30
+ __metadata("design:type", Function),
31
+ __metadata("design:paramtypes", []),
32
+ __metadata("design:returntype", Boolean)
33
+ ], ReadyController.prototype, "isCoreReady", null);
34
+ exports.ReadyController = ReadyController = __decorate([
35
+ (0, controller_1.Controller)(),
36
+ __metadata("design:paramtypes", [])
37
+ ], ReadyController);
@@ -1,5 +1,6 @@
1
1
  import { IEngineEvents } from '../../../adapters/contracts/IEngineEvents';
2
2
  import { IResourceInfo } from '../../../adapters/contracts/IResourceInfo';
3
+ import { CommandErrorObserverContract } from '../contracts/security/command-error-observer.contract';
3
4
  import { CommandExecutionPort } from '../services/ports/command-execution.port';
4
5
  import { PlayerDirectoryPort } from '../services/ports/player-directory.port';
5
6
  /**
@@ -21,9 +22,17 @@ import { PlayerDirectoryPort } from '../services/ports/player-directory.port';
21
22
  export declare class RemoteCommandExecutionController {
22
23
  private commandService;
23
24
  private playerDirectory;
25
+ private readonly commandErrorObserver;
24
26
  private engineEvents;
25
27
  private resourceInfo;
26
- constructor(commandService: CommandExecutionPort, playerDirectory: PlayerDirectoryPort, engineEvents: IEngineEvents, resourceInfo: IResourceInfo);
28
+ constructor(commandService: CommandExecutionPort, playerDirectory: PlayerDirectoryPort, commandErrorObserver: CommandErrorObserverContract, engineEvents: IEngineEvents, resourceInfo: IResourceInfo);
29
+ /**
30
+ * Invokes the global {@link CommandErrorObserverContract} safely.
31
+ *
32
+ * @remarks
33
+ * Observers are user-land code; failures must never break command execution.
34
+ */
35
+ private safeObserve;
27
36
  /**
28
37
  * Registers the event handler for command execution from CORE.
29
38
  *
@@ -16,9 +16,11 @@ exports.RemoteCommandExecutionController = void 0;
16
16
  const tsyringe_1 = require("tsyringe");
17
17
  const IEngineEvents_1 = require("../../../adapters/contracts/IEngineEvents");
18
18
  const IResourceInfo_1 = require("../../../adapters/contracts/IResourceInfo");
19
- const kernel_1 = require("../../../kernel");
20
- const logger_1 = require("../../../kernel/shared/logger");
19
+ const logger_1 = require("../../../kernel/logger");
20
+ const command_error_observer_contract_1 = require("../contracts/security/command-error-observer.contract");
21
21
  const decorators_1 = require("../decorators");
22
+ const normalize_app_error_1 = require("../helpers/normalize-app-error");
23
+ const runtime_1 = require("../runtime");
22
24
  const command_execution_port_1 = require("../services/ports/command-execution.port");
23
25
  const player_directory_port_1 = require("../services/ports/player-directory.port");
24
26
  /**
@@ -38,13 +40,28 @@ const player_directory_port_1 = require("../services/ports/player-directory.port
38
40
  * Event registration happens in constructor via adapter layer.
39
41
  */
40
42
  let RemoteCommandExecutionController = class RemoteCommandExecutionController {
41
- constructor(commandService, playerDirectory, engineEvents, resourceInfo) {
43
+ constructor(commandService, playerDirectory, commandErrorObserver, engineEvents, resourceInfo) {
42
44
  this.commandService = commandService;
43
45
  this.playerDirectory = playerDirectory;
46
+ this.commandErrorObserver = commandErrorObserver;
44
47
  this.engineEvents = engineEvents;
45
48
  this.resourceInfo = resourceInfo;
46
49
  this.registerEventHandler();
47
50
  }
51
+ /**
52
+ * Invokes the global {@link CommandErrorObserverContract} safely.
53
+ *
54
+ * @remarks
55
+ * Observers are user-land code; failures must never break command execution.
56
+ */
57
+ async safeObserve(ctx) {
58
+ try {
59
+ await this.commandErrorObserver.onError(ctx);
60
+ }
61
+ catch (e) {
62
+ logger_1.loggers.command.fatal(`Command error observer failed`, ctx, e);
63
+ }
64
+ }
48
65
  /**
49
66
  * Registers the event handler for command execution from CORE.
50
67
  *
@@ -80,25 +97,60 @@ let RemoteCommandExecutionController = class RemoteCommandExecutionController {
80
97
  await this.commandService.execute(player, commandName, args);
81
98
  }
82
99
  catch (error) {
83
- if (error instanceof kernel_1.AppError) {
84
- player.send(error.message);
85
- }
86
- logger_1.loggers.command.error(`Remote command execution failed`, {
87
- command: commandName,
88
- clientID: player.clientID,
89
- error: error instanceof Error ? error.message : String(error),
100
+ // Do not notify the player here. Report through the global observer.
101
+ const runtime = (0, runtime_1.getRuntimeContext)();
102
+ const appError = (0, normalize_app_error_1.normalizeToAppError)(error, 'server');
103
+ const meta = this.commandService.getCommandMeta(commandName);
104
+ const stage = appError.code === 'GAME:BAD_REQUEST' || appError.code.startsWith('SCHEMA:')
105
+ ? 'validation'
106
+ : appError.code === 'COMMAND:NOT_FOUND'
107
+ ? 'dispatch'
108
+ : 'handler';
109
+ await this.safeObserve({
110
+ mode: runtime.mode,
111
+ scope: runtime.mode === 'CORE'
112
+ ? 'core'
113
+ : runtime.mode === 'RESOURCE'
114
+ ? 'resource'
115
+ : 'standalone',
116
+ stage,
117
+ error: appError,
118
+ commandName,
119
+ args,
120
+ player: {
121
+ clientId: player.clientID,
122
+ accountId: player.accountID,
123
+ name: player.name,
124
+ },
125
+ playerRef: player,
126
+ command: meta
127
+ ? {
128
+ command: meta.command,
129
+ description: meta.description,
130
+ usage: meta.usage,
131
+ isPublic: meta.isPublic,
132
+ methodName: meta.methodName,
133
+ expectsPlayer: meta.expectsPlayer,
134
+ paramNames: meta.paramNames,
135
+ }
136
+ : undefined,
137
+ commandMeta: meta,
138
+ ownerResourceName: this.resourceInfo.getCurrentResourceName(),
90
139
  });
91
140
  }
92
141
  }
93
142
  };
94
143
  exports.RemoteCommandExecutionController = RemoteCommandExecutionController;
95
144
  exports.RemoteCommandExecutionController = RemoteCommandExecutionController = __decorate([
96
- (0, tsyringe_1.injectable)(),
97
145
  (0, decorators_1.Controller)(),
98
- __param(2, (0, tsyringe_1.inject)(IEngineEvents_1.IEngineEvents)),
99
- __param(3, (0, tsyringe_1.inject)(IResourceInfo_1.IResourceInfo)),
146
+ __param(0, (0, tsyringe_1.inject)(command_execution_port_1.CommandExecutionPort)),
147
+ __param(1, (0, tsyringe_1.inject)(player_directory_port_1.PlayerDirectoryPort)),
148
+ __param(2, (0, tsyringe_1.inject)(command_error_observer_contract_1.CommandErrorObserverContract)),
149
+ __param(3, (0, tsyringe_1.inject)(IEngineEvents_1.IEngineEvents)),
150
+ __param(4, (0, tsyringe_1.inject)(IResourceInfo_1.IResourceInfo)),
100
151
  __metadata("design:paramtypes", [command_execution_port_1.CommandExecutionPort,
101
152
  player_directory_port_1.PlayerDirectoryPort,
153
+ command_error_observer_contract_1.CommandErrorObserverContract,
102
154
  IEngineEvents_1.IEngineEvents,
103
155
  IResourceInfo_1.IResourceInfo])
104
156
  ], RemoteCommandExecutionController);
@@ -6,6 +6,6 @@ export declare class SessionController {
6
6
  private readonly playerDirectory;
7
7
  private readonly persistance;
8
8
  constructor(playerSessionLifecycle: PlayerSessionLifecyclePort, playerDirectory: PlayerDirectoryPort, persistance: PlayerPersistenceService);
9
- onPlayerJoining(): Promise<void>;
10
- onPlayerDropped(): Promise<void>;
9
+ onPlayerJoining(clientId: number, identifiers?: Record<string, string>): Promise<void>;
10
+ onPlayerDropped(clientId: number): Promise<void>;
11
11
  }
@@ -8,12 +8,16 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
8
8
  var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
11
14
  Object.defineProperty(exports, "__esModule", { value: true });
12
15
  exports.SessionController = void 0;
13
- const shared_1 = require("../../../kernel/shared");
16
+ const tsyringe_1 = require("tsyringe");
17
+ const logger_1 = require("../../../kernel/logger");
14
18
  const internal_event_bus_1 = require("../bus/internal-event.bus");
15
19
  const decorators_1 = require("../decorators");
16
- const onFiveMEvent_1 = require("../decorators/onFiveMEvent");
20
+ const onRuntimeEvent_1 = require("../decorators/onRuntimeEvent");
17
21
  const services_1 = require("../services");
18
22
  const persistence_service_1 = require("../services/persistence.service");
19
23
  const player_session_lifecycle_port_1 = require("../services/ports/player-session-lifecycle.port");
@@ -23,50 +27,54 @@ let SessionController = class SessionController {
23
27
  this.playerDirectory = playerDirectory;
24
28
  this.persistance = persistance;
25
29
  }
26
- async onPlayerJoining() {
30
+ async onPlayerJoining(clientId, identifiers) {
27
31
  var _a;
28
- const clientId = Number(source);
29
- const license = (_a = GetPlayerIdentifier(clientId.toString(), 0)) !== null && _a !== void 0 ? _a : undefined;
30
- const player = this.playerSessionLifecycle.bind(clientId, { license });
31
- shared_1.loggers.session.info(`Player session created`, {
32
+ const player = this.playerSessionLifecycle.bind(clientId, Object.assign({ license: identifiers === null || identifiers === void 0 ? void 0 : identifiers.license }, identifiers));
33
+ logger_1.loggers.session.info(`Player session created`, {
32
34
  clientId,
33
- license: license !== null && license !== void 0 ? license : 'none',
35
+ license: (_a = identifiers === null || identifiers === void 0 ? void 0 : identifiers.license) !== null && _a !== void 0 ? _a : 'none',
34
36
  });
35
37
  await this.persistance.handleSessionLoad(player);
36
- (0, internal_event_bus_1.emitFrameworkEvent)('internal:playerSessionCreated', { clientId, license });
38
+ (0, internal_event_bus_1.emitFrameworkEvent)('internal:playerSessionCreated', {
39
+ clientId,
40
+ license: identifiers === null || identifiers === void 0 ? void 0 : identifiers.license,
41
+ });
37
42
  setImmediate(() => {
38
43
  const currentPlayer = this.playerDirectory.getByClient(clientId);
39
44
  if (!currentPlayer)
40
45
  return;
41
- (0, internal_event_bus_1.emitFrameworkEvent)('internal:playerFullyConnected', { player: currentPlayer });
46
+ const payload = { player: currentPlayer };
47
+ (0, internal_event_bus_1.emitFrameworkEvent)('internal:playerFullyConnected', payload);
42
48
  });
43
49
  }
44
- async onPlayerDropped() {
45
- const clientId = Number(source);
50
+ async onPlayerDropped(clientId) {
46
51
  const player = this.playerDirectory.getByClient(clientId);
47
52
  if (player) {
48
53
  await this.persistance.handleSessionSave(player);
49
54
  }
50
55
  this.playerSessionLifecycle.unbind(clientId);
51
56
  (0, internal_event_bus_1.emitFrameworkEvent)('internal:playerSessionDestroyed', { clientId });
52
- shared_1.loggers.session.info(`Player session destroyed`, { clientId });
57
+ logger_1.loggers.session.info(`Player session destroyed`, { clientId });
53
58
  }
54
59
  };
55
60
  exports.SessionController = SessionController;
56
61
  __decorate([
57
- (0, onFiveMEvent_1.OnFiveMEvent)('playerJoining'),
62
+ (0, onRuntimeEvent_1.OnRuntimeEvent)('playerJoining'),
58
63
  __metadata("design:type", Function),
59
- __metadata("design:paramtypes", []),
64
+ __metadata("design:paramtypes", [Number, Object]),
60
65
  __metadata("design:returntype", Promise)
61
66
  ], SessionController.prototype, "onPlayerJoining", null);
62
67
  __decorate([
63
- (0, onFiveMEvent_1.OnFiveMEvent)('playerDropped'),
68
+ (0, onRuntimeEvent_1.OnRuntimeEvent)('playerDropped'),
64
69
  __metadata("design:type", Function),
65
- __metadata("design:paramtypes", []),
70
+ __metadata("design:paramtypes", [Number]),
66
71
  __metadata("design:returntype", Promise)
67
72
  ], SessionController.prototype, "onPlayerDropped", null);
68
73
  exports.SessionController = SessionController = __decorate([
69
74
  (0, decorators_1.Controller)(),
75
+ __param(0, (0, tsyringe_1.inject)(player_session_lifecycle_port_1.PlayerSessionLifecyclePort)),
76
+ __param(1, (0, tsyringe_1.inject)(services_1.PlayerDirectoryPort)),
77
+ __param(2, (0, tsyringe_1.inject)(persistence_service_1.PlayerPersistenceService)),
70
78
  __metadata("design:paramtypes", [player_session_lifecycle_port_1.PlayerSessionLifecyclePort,
71
79
  services_1.PlayerDirectoryPort,
72
80
  persistence_service_1.PlayerPersistenceService])