@open-core/framework 0.2.9 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) 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 +84 -108
  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 +94 -28
  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 +4 -0
  153. package/dist/runtime/server/controllers/ready.controller.js +32 -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 +79 -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/command-validation.helper.d.ts +0 -3
  183. package/dist/runtime/server/helpers/command-validation.helper.js +3 -7
  184. package/dist/runtime/server/helpers/normalize-app-error.d.ts +9 -0
  185. package/dist/runtime/server/helpers/normalize-app-error.js +20 -0
  186. package/dist/runtime/server/helpers/process-tuple-schema.d.ts +20 -0
  187. package/dist/runtime/server/helpers/process-tuple-schema.js +51 -0
  188. package/dist/runtime/server/helpers/resolve-method.js +3 -3
  189. package/dist/runtime/server/index.d.ts +1 -13
  190. package/dist/runtime/server/index.js +25 -23
  191. package/dist/runtime/server/runtime.d.ts +32 -281
  192. package/dist/runtime/server/runtime.js +46 -60
  193. package/dist/runtime/server/services/appearance.service.d.ts +5 -5
  194. package/dist/runtime/server/services/appearance.service.js +5 -5
  195. package/dist/runtime/server/services/chat.service.d.ts +5 -3
  196. package/dist/runtime/server/services/chat.service.js +17 -12
  197. package/dist/runtime/server/services/core/command.service.d.ts +9 -1
  198. package/dist/runtime/server/services/core/command.service.js +16 -7
  199. package/dist/runtime/server/services/core/player.service.d.ts +12 -16
  200. package/dist/runtime/server/services/core/player.service.js +42 -47
  201. package/dist/runtime/server/services/core/principal.service.js +5 -5
  202. package/dist/runtime/server/services/core/session-recovery.service.d.ts +1 -1
  203. package/dist/runtime/server/services/core/session-recovery.service.js +2 -2
  204. package/dist/runtime/server/services/default/default-command-error-observer.d.ts +14 -0
  205. package/dist/runtime/server/services/default/default-command-error-observer.js +43 -0
  206. package/dist/runtime/server/services/default/default-principal.provider.d.ts +13 -0
  207. package/dist/runtime/server/services/default/default-principal.provider.js +38 -0
  208. package/dist/runtime/server/services/default/default-security.handler.d.ts +1 -1
  209. package/dist/runtime/server/services/default/default-security.handler.js +1 -1
  210. package/dist/runtime/server/services/index.d.ts +0 -3
  211. package/dist/runtime/server/services/index.js +1 -6
  212. package/dist/runtime/server/services/persistence.service.js +3 -3
  213. package/dist/runtime/server/services/ports/command-execution.port.d.ts +7 -0
  214. package/dist/runtime/server/services/ports/principal.port.d.ts +1 -1
  215. package/dist/runtime/server/services/remote/remote-command.service.d.ts +1 -0
  216. package/dist/runtime/server/services/remote/remote-command.service.js +30 -11
  217. package/dist/runtime/server/services/remote/remote-player.service.d.ts +2 -2
  218. package/dist/runtime/server/services/remote/remote-player.service.js +3 -3
  219. package/dist/runtime/server/services/remote/server-bridge.js +2 -2
  220. package/dist/runtime/server/services/services.register.d.ts +2 -5
  221. package/dist/runtime/server/services/services.register.js +29 -41
  222. package/dist/runtime/server/services/vehicle-modification.service.js +1 -1
  223. package/dist/runtime/server/services/vehicle.service.d.ts +3 -3
  224. package/dist/runtime/server/services/vehicle.service.js +5 -5
  225. package/dist/runtime/server/setup.d.ts +2 -3
  226. package/dist/runtime/server/setup.js +10 -11
  227. package/dist/runtime/server/system/metadata-server.keys.d.ts +1 -1
  228. package/dist/runtime/server/system/metadata-server.keys.js +1 -1
  229. package/dist/runtime/server/system/processors/command.processor.js +4 -0
  230. package/dist/runtime/server/system/processors/export.processor.js +1 -1
  231. package/dist/runtime/server/system/processors/internalEvent.processor.js +1 -1
  232. package/dist/runtime/server/system/processors/netEvent.processor.js +11 -10
  233. package/dist/runtime/server/system/processors/{fivemEvent.processor.d.ts → runtimeEvent.processor.d.ts} +1 -1
  234. package/dist/runtime/server/system/processors/{fivemEvent.processor.js → runtimeEvent.processor.js} +8 -8
  235. package/dist/runtime/server/system/processors/tick.processor.js +1 -1
  236. package/dist/runtime/server/system/processors.register.js +16 -11
  237. package/dist/runtime/server/system/schema-generator.js +5 -3
  238. package/dist/runtime/server/types/core-exports.d.ts +6 -6
  239. package/dist/runtime/server/types/index.d.ts +1 -1
  240. package/dist/runtime/server/types/index.js +1 -1
  241. package/dist/runtime/server/types/internal-events.d.ts +1 -1
  242. package/dist/runtime/server/types/vehicle.types.d.ts +1 -1
  243. package/package.json +7 -15
  244. package/dist/adapters/contracts/IEntityServer.d.ts +0 -88
  245. package/dist/adapters/contracts/IEntityServer.js +0 -13
  246. package/dist/adapters/contracts/IPlayerServer.js +0 -13
  247. package/dist/adapters/database/oxmysql.adapter.d.ts +0 -89
  248. package/dist/adapters/database/oxmysql.adapter.js +0 -149
  249. package/dist/adapters/database/resource.adapter.d.ts +0 -12
  250. package/dist/adapters/database/resource.adapter.js +0 -68
  251. package/dist/kernel/shared/appearance/index.d.ts +0 -1
  252. package/dist/runtime/index.d.ts +0 -2
  253. package/dist/runtime/index.js +0 -39
  254. package/dist/runtime/server/bootstrap.validation.d.ts +0 -12
  255. package/dist/runtime/server/bootstrap.validation.js +0 -104
  256. package/dist/runtime/server/contracts/auth-provider.contract.d.ts +0 -58
  257. package/dist/runtime/server/contracts/auth-provider.contract.js +0 -23
  258. package/dist/runtime/server/contracts/repository/index.d.ts +0 -57
  259. package/dist/runtime/server/contracts/repository/index.js +0 -61
  260. package/dist/runtime/server/contracts/repository/repository.contract.d.ts +0 -224
  261. package/dist/runtime/server/contracts/repository/repository.contract.js +0 -341
  262. package/dist/runtime/server/contracts/repository/repository.types.d.ts +0 -51
  263. package/dist/runtime/server/contracts/repository/repository.types.js +0 -7
  264. package/dist/runtime/server/database/adapter.registry.d.ts +0 -4
  265. package/dist/runtime/server/database/adapter.registry.js +0 -14
  266. package/dist/runtime/server/database/database.contract.d.ts +0 -128
  267. package/dist/runtime/server/database/database.contract.js +0 -29
  268. package/dist/runtime/server/database/database.service.d.ts +0 -188
  269. package/dist/runtime/server/database/database.service.js +0 -287
  270. package/dist/runtime/server/database/index.d.ts +0 -5
  271. package/dist/runtime/server/database/index.js +0 -25
  272. package/dist/runtime/server/database/types.d.ts +0 -67
  273. package/dist/runtime/server/database/types.js +0 -7
  274. package/dist/runtime/server/database.d.ts +0 -7
  275. package/dist/runtime/server/devmode/hot-reload.server.d.ts +0 -74
  276. package/dist/runtime/server/devmode/hot-reload.server.js +0 -261
  277. package/dist/runtime/server/services/config.service.d.ts +0 -75
  278. package/dist/runtime/server/services/config.service.js +0 -116
  279. package/dist/runtime/server/services/http/http.service.d.ts +0 -50
  280. package/dist/runtime/server/services/http/http.service.js +0 -126
  281. /package/dist/adapters/contracts/{IPedAppearanceClient.js → client/IPedAppearanceClient.js} +0 -0
  282. /package/dist/adapters/contracts/{IPedAppearanceServer.d.ts → server/IPedAppearanceServer.d.ts} +0 -0
  283. /package/dist/adapters/contracts/{IPedAppearanceServer.js → server/IPedAppearanceServer.js} +0 -0
  284. /package/dist/adapters/contracts/{IVehicleServer.d.ts → server/IVehicleServer.d.ts} +0 -0
  285. /package/dist/adapters/contracts/{IVehicleServer.js → server/IVehicleServer.js} +0 -0
  286. /package/dist/kernel/{utils/error → error}/app.error.js +0 -0
  287. /package/dist/kernel/{shared/logger/transports/transport.interface.js → error/common.error-codes.js} +0 -0
  288. /package/dist/{runtime/server/types/security.types.js → kernel/error/framework.error-codes.js} +0 -0
  289. /package/dist/kernel/{utils/error → error}/security.error.js +0 -0
  290. /package/dist/{runtime/server/types → kernel/error}/security.types.d.ts +0 -0
  291. /package/dist/kernel/{shared/logger → logger}/index.d.ts +0 -0
  292. /package/dist/kernel/{shared/logger → logger}/index.js +0 -0
  293. /package/dist/kernel/{shared/logger → logger}/logger.config.d.ts +0 -0
  294. /package/dist/kernel/{shared/logger → logger}/logger.config.js +0 -0
  295. /package/dist/kernel/{shared/logger → logger}/logger.types.d.ts +0 -0
  296. /package/dist/kernel/{shared/logger → logger}/logger.types.js +0 -0
  297. /package/dist/kernel/{shared/logger → logger}/transports/buffered.transport.d.ts +0 -0
  298. /package/dist/kernel/{shared/logger → logger}/transports/buffered.transport.js +0 -0
  299. /package/dist/kernel/{shared/logger → logger}/transports/console.transport.d.ts +0 -0
  300. /package/dist/kernel/{shared/logger → logger}/transports/console.transport.js +0 -0
  301. /package/dist/kernel/{shared/logger → logger}/transports/dev-transport.factory.d.ts +0 -0
  302. /package/dist/kernel/{shared/logger → logger}/transports/dev-transport.factory.js +0 -0
  303. /package/dist/kernel/{shared/logger → logger}/transports/http.transport.d.ts +0 -0
  304. /package/dist/kernel/{shared/logger → logger}/transports/http.transport.js +0 -0
  305. /package/dist/kernel/{shared/logger → logger}/transports/index.d.ts +0 -0
  306. /package/dist/kernel/{shared/logger → logger}/transports/index.js +0 -0
  307. /package/dist/kernel/{shared/logger → logger}/transports/simple-console.transport.d.ts +0 -0
  308. /package/dist/kernel/{shared/logger → logger}/transports/simple-console.transport.js +0 -0
  309. /package/dist/kernel/{shared/logger → logger}/transports/transport.interface.d.ts +0 -0
  310. /package/dist/kernel/{shared/logger → logger}/transports/websocket.transport.d.ts +0 -0
  311. /package/dist/kernel/{shared/logger → logger}/transports/websocket.transport.js +0 -0
  312. /package/dist/kernel/shared/{appearance/appearance.interface.d.ts → player-appearance.types.d.ts} +0 -0
  313. /package/dist/kernel/shared/{appearance/appearance.interface.js → player-appearance.types.js} +0 -0
@@ -5,13 +5,13 @@ exports.PrincipalProviderContract = void 0;
5
5
  * **Authorization**
6
6
  *
7
7
  * This abstract class defines how the Security Layer retrieves user permissions.
8
- * The Framework does not know about your database (SQL, Mongo, JSON or API); it relies on
8
+ * The Framework does not know about your persistence layer (SQL, Mongo, JSON or API); it relies on
9
9
  * your implementation of this provider to resolve a `Principal`.
10
10
  *
11
11
  * @example
12
12
  * ```ts
13
13
  * // In your game resource:
14
- * class MyAuthProvider implements PrincipalProviderContract { ... }
14
+ * class MyPrincipal implements PrincipalProviderContract { ... }
15
15
  * ```
16
16
  */
17
17
  class PrincipalProviderContract {
@@ -1,5 +1,5 @@
1
- import { Server } from '../../../..';
2
- import { SecurityError } from '../../../../kernel/utils/error/security.error';
1
+ import { SecurityError } from '../../../../kernel/error/security.error';
2
+ import { Server } from '../../';
3
3
  export declare abstract class SecurityHandlerContract {
4
4
  abstract handleViolation(player: Server.Player, error: SecurityError): Promise<void>;
5
5
  }
@@ -1,4 +1,4 @@
1
- import { RGB } from '../../../kernel/utils';
1
+ import { RGB } from '../../../kernel/utils/rgb';
2
2
  import { ChatService } from '../services/chat.service';
3
3
  import { PlayerDirectoryPort } from '../services/ports/player-directory.port';
4
4
  export declare class ChatController {
@@ -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');
79
- }
80
- else {
81
- player.send('An error occurred while executing the command', '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,
82
108
  }
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
  // ═══════════════════════════════════════════════════════════════
@@ -104,12 +159,22 @@ let CommandExportController = class CommandExportController {
104
159
  * Exported as: `exports[coreResourceName].registerCommand`
105
160
  */
106
161
  registerCommand(metadata) {
107
- var _a;
108
162
  const commandKey = metadata.command.toLowerCase();
109
- if (this.remoteCommands.has(commandKey)) {
163
+ const existing = this.remoteCommands.get(commandKey);
164
+ if (existing) {
165
+ // Allow re-registration from the same resource (hot-reload scenario)
166
+ if (existing.resourceName === metadata.resourceName) {
167
+ logger_1.loggers.command.debug(`Re-registering command '${metadata.command}' from same resource (hot-reload)`, { command: metadata.command, resource: metadata.resourceName });
168
+ // Update the entry with new metadata
169
+ this.remoteCommands.set(commandKey, {
170
+ metadata,
171
+ resourceName: metadata.resourceName,
172
+ });
173
+ return;
174
+ }
110
175
  logger_1.loggers.command.warn(`Remote command '${metadata.command}' already registered`, {
111
176
  command: metadata.command,
112
- existingResource: (_a = this.remoteCommands.get(commandKey)) === null || _a === void 0 ? void 0 : _a.resourceName,
177
+ existingResource: existing.resourceName,
113
178
  newResource: metadata.resourceName,
114
179
  });
115
180
  return;
@@ -133,7 +198,7 @@ let CommandExportController = class CommandExportController {
133
198
  async executeCommand(clientID, commandName, args) {
134
199
  const player = this.playerDirectory.getByClient(clientID);
135
200
  if (!player) {
136
- throw new utils_1.AppError('GAME:PLAYER_NOT_FOUND', `Player not found: ${clientID}`, 'core');
201
+ throw new error_1.AppError('GAME:PLAYER_NOT_FOUND', `Player not found: ${clientID}`, 'core');
137
202
  }
138
203
  const commandKey = commandName.toLowerCase();
139
204
  const remoteEntry = this.remoteCommands.get(commandKey);
@@ -199,7 +264,7 @@ let CommandExportController = class CommandExportController {
199
264
  if (onExceed === 'KICK') {
200
265
  DropPlayer(player.clientID.toString(), errorMessage);
201
266
  }
202
- throw new security_error_1.SecurityError(onExceed || 'LOG', errorMessage, { clientID: player.clientID });
267
+ throw new error_1.SecurityError(onExceed || 'LOG', errorMessage, { clientID: player.clientID });
203
268
  }
204
269
  }
205
270
  // 3. Validate @RequiresState (player state)
@@ -208,14 +273,14 @@ let CommandExportController = class CommandExportController {
208
273
  if (has) {
209
274
  for (const state of has) {
210
275
  if (!player.hasState(state)) {
211
- throw new utils_1.AppError('GAME:INVALID_STATE', errorMessage || `Command requires state: ${state}`, 'core');
276
+ throw new error_1.AppError('GAME:INVALID_STATE', errorMessage || `Command requires state: ${state}`, 'core');
212
277
  }
213
278
  }
214
279
  }
215
280
  if (missing) {
216
281
  for (const state of missing) {
217
282
  if (player.hasState(state)) {
218
- throw new utils_1.AppError('GAME:INVALID_STATE', errorMessage || `Command cannot be used in state: ${state}`, 'core');
283
+ throw new error_1.AppError('GAME:INVALID_STATE', errorMessage || `Command cannot be used in state: ${state}`, 'core');
219
284
  }
220
285
  }
221
286
  }
@@ -249,12 +314,13 @@ __decorate([
249
314
  __metadata("design:returntype", Array)
250
315
  ], CommandExportController.prototype, "getAllCommands", null);
251
316
  exports.CommandExportController = CommandExportController = __decorate([
252
- (0, tsyringe_1.injectable)(),
253
317
  (0, decorators_1.Controller)(),
254
- __param(4, (0, tsyringe_1.inject)(IEngineEvents_1.IEngineEvents)),
318
+ __param(4, (0, tsyringe_1.inject)(command_error_observer_contract_1.CommandErrorObserverContract)),
319
+ __param(5, (0, tsyringe_1.inject)(IEngineEvents_1.IEngineEvents)),
255
320
  __metadata("design:paramtypes", [command_execution_port_1.CommandExecutionPort,
256
321
  player_directory_port_1.PlayerDirectoryPort,
257
322
  principal_port_1.PrincipalPort,
258
323
  rate_limiter_service_1.RateLimiterService,
324
+ command_error_observer_contract_1.CommandErrorObserverContract,
259
325
  IEngineEvents_1.IEngineEvents])
260
326
  ], 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,4 @@
1
+ export declare class ReadyController {
2
+ private isReady;
3
+ isCoreReady(): boolean;
4
+ }
@@ -0,0 +1,32 @@
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 = true;
18
+ }
19
+ isCoreReady() {
20
+ return this.isReady;
21
+ }
22
+ };
23
+ exports.ReadyController = ReadyController;
24
+ __decorate([
25
+ (0, export_1.Export)(),
26
+ __metadata("design:type", Function),
27
+ __metadata("design:paramtypes", []),
28
+ __metadata("design:returntype", Boolean)
29
+ ], ReadyController.prototype, "isCoreReady", null);
30
+ exports.ReadyController = ReadyController = __decorate([
31
+ (0, controller_1.Controller)()
32
+ ], 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
  *
@@ -68,6 +85,11 @@ let RemoteCommandExecutionController = class RemoteCommandExecutionController {
68
85
  * @param args - Command arguments
69
86
  */
70
87
  async handleCommandExecution(clientID, commandName, args) {
88
+ logger_1.loggers.command.debug(`Received command execution request`, {
89
+ command: commandName,
90
+ clientID,
91
+ args,
92
+ });
71
93
  const player = this.playerDirectory.getByClient(clientID);
72
94
  if (!player) {
73
95
  logger_1.loggers.command.warn(`Command execution failed: player not found`, {
@@ -76,29 +98,73 @@ let RemoteCommandExecutionController = class RemoteCommandExecutionController {
76
98
  });
77
99
  return;
78
100
  }
101
+ logger_1.loggers.command.debug(`Executing command for player`, {
102
+ command: commandName,
103
+ playerName: player.name,
104
+ clientID,
105
+ });
79
106
  try {
80
107
  await this.commandService.execute(player, commandName, args);
108
+ logger_1.loggers.command.debug(`Command executed successfully`, {
109
+ command: commandName,
110
+ clientID,
111
+ });
81
112
  }
82
113
  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),
114
+ // Do not notify the player here. Report through the global observer.
115
+ const runtime = (0, runtime_1.getRuntimeContext)();
116
+ const appError = (0, normalize_app_error_1.normalizeToAppError)(error, 'server');
117
+ const meta = this.commandService.getCommandMeta(commandName);
118
+ const stage = appError.code === 'GAME:BAD_REQUEST' || appError.code.startsWith('SCHEMA:')
119
+ ? 'validation'
120
+ : appError.code === 'COMMAND:NOT_FOUND'
121
+ ? 'dispatch'
122
+ : 'handler';
123
+ await this.safeObserve({
124
+ mode: runtime.mode,
125
+ scope: runtime.mode === 'CORE'
126
+ ? 'core'
127
+ : runtime.mode === 'RESOURCE'
128
+ ? 'resource'
129
+ : 'standalone',
130
+ stage,
131
+ error: appError,
132
+ commandName,
133
+ args,
134
+ player: {
135
+ clientId: player.clientID,
136
+ accountId: player.accountID,
137
+ name: player.name,
138
+ },
139
+ playerRef: player,
140
+ command: meta
141
+ ? {
142
+ command: meta.command,
143
+ description: meta.description,
144
+ usage: meta.usage,
145
+ isPublic: meta.isPublic,
146
+ methodName: meta.methodName,
147
+ expectsPlayer: meta.expectsPlayer,
148
+ paramNames: meta.paramNames,
149
+ }
150
+ : undefined,
151
+ commandMeta: meta,
152
+ ownerResourceName: this.resourceInfo.getCurrentResourceName(),
90
153
  });
91
154
  }
92
155
  }
93
156
  };
94
157
  exports.RemoteCommandExecutionController = RemoteCommandExecutionController;
95
158
  exports.RemoteCommandExecutionController = RemoteCommandExecutionController = __decorate([
96
- (0, tsyringe_1.injectable)(),
97
159
  (0, decorators_1.Controller)(),
98
- __param(2, (0, tsyringe_1.inject)(IEngineEvents_1.IEngineEvents)),
99
- __param(3, (0, tsyringe_1.inject)(IResourceInfo_1.IResourceInfo)),
160
+ __param(0, (0, tsyringe_1.inject)(command_execution_port_1.CommandExecutionPort)),
161
+ __param(1, (0, tsyringe_1.inject)(player_directory_port_1.PlayerDirectoryPort)),
162
+ __param(2, (0, tsyringe_1.inject)(command_error_observer_contract_1.CommandErrorObserverContract)),
163
+ __param(3, (0, tsyringe_1.inject)(IEngineEvents_1.IEngineEvents)),
164
+ __param(4, (0, tsyringe_1.inject)(IResourceInfo_1.IResourceInfo)),
100
165
  __metadata("design:paramtypes", [command_execution_port_1.CommandExecutionPort,
101
166
  player_directory_port_1.PlayerDirectoryPort,
167
+ command_error_observer_contract_1.CommandErrorObserverContract,
102
168
  IEngineEvents_1.IEngineEvents,
103
169
  IResourceInfo_1.IResourceInfo])
104
170
  ], 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
  }