@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.
- package/dist/adapters/contracts/IPlatformCapabilities.d.ts +79 -0
- package/dist/adapters/contracts/IPlatformCapabilities.js +31 -0
- package/dist/adapters/contracts/IPlayerInfo.d.ts +1 -1
- package/dist/adapters/contracts/{IPedAppearanceClient.d.ts → client/IPedAppearanceClient.d.ts} +1 -1
- package/dist/adapters/contracts/server/IEntityServer.d.ts +188 -0
- package/dist/adapters/contracts/server/IEntityServer.js +39 -0
- package/dist/adapters/contracts/{IPlayerServer.d.ts → server/IPlayerServer.d.ts} +52 -9
- package/dist/adapters/contracts/server/IPlayerServer.js +39 -0
- package/dist/adapters/contracts/types/identifier.d.ts +67 -0
- package/dist/adapters/contracts/types/identifier.js +64 -0
- package/dist/adapters/contracts/types/index.d.ts +1 -0
- package/dist/{kernel/shared/appearance → adapters/contracts/types}/index.js +1 -1
- package/dist/adapters/fivem/fivem-capabilities.d.ts +18 -0
- package/dist/adapters/fivem/fivem-capabilities.js +67 -0
- package/dist/adapters/fivem/fivem-engine-events.js +17 -4
- package/dist/adapters/fivem/fivem-entity-server.d.ts +6 -2
- package/dist/adapters/fivem/fivem-entity-server.js +14 -1
- package/dist/adapters/fivem/fivem-ped-appearance-client.d.ts +1 -1
- package/dist/adapters/fivem/fivem-ped-appearance-client.js +1 -1
- package/dist/adapters/fivem/fivem-ped-appearance-server.d.ts +1 -1
- package/dist/adapters/fivem/fivem-ped-appearance-server.js +1 -1
- package/dist/adapters/fivem/fivem-platform.d.ts +5 -0
- package/dist/adapters/fivem/fivem-platform.js +100 -0
- package/dist/adapters/fivem/fivem-player-server.d.ts +7 -1
- package/dist/adapters/fivem/fivem-player-server.js +19 -1
- package/dist/adapters/fivem/fivem-playerinfo.d.ts +1 -1
- package/dist/adapters/fivem/fivem-vehicle-server.d.ts +1 -1
- package/dist/adapters/fivem/fivem-vehicle-server.js +1 -1
- package/dist/adapters/fivem/index.d.ts +13 -0
- package/dist/adapters/fivem/index.js +31 -0
- package/dist/adapters/index.d.ts +8 -7
- package/dist/adapters/index.js +13 -12
- package/dist/adapters/node/index.d.ts +5 -0
- package/dist/adapters/node/index.js +13 -1
- package/dist/adapters/node/node-capabilities.d.ts +19 -0
- package/dist/adapters/node/node-capabilities.js +54 -0
- package/dist/adapters/node/node-entity-server.d.ts +17 -6
- package/dist/adapters/node/node-entity-server.js +41 -15
- package/dist/adapters/node/node-net-transport.js +2 -2
- package/dist/adapters/node/node-ped-appearance-client.d.ts +1 -1
- package/dist/adapters/node/node-ped-appearance-client.js +1 -1
- package/dist/adapters/node/node-ped-appearance-server.d.ts +1 -1
- package/dist/adapters/node/node-ped-appearance-server.js +1 -1
- package/dist/adapters/node/node-platform.d.ts +5 -0
- package/dist/adapters/node/node-platform.js +103 -0
- package/dist/adapters/node/node-player-server.d.ts +19 -3
- package/dist/adapters/node/node-player-server.js +43 -9
- package/dist/adapters/node/node-playerinfo.d.ts +2 -2
- package/dist/adapters/node/node-playerinfo.js +14 -3
- package/dist/adapters/node/node-vehicle-server.d.ts +1 -1
- package/dist/adapters/node/node-vehicle-server.js +1 -1
- package/dist/adapters/platform/index.d.ts +1 -0
- package/dist/{runtime/server/database.js → adapters/platform/index.js} +1 -7
- package/dist/adapters/platform/platform-registry.d.ts +101 -0
- package/dist/adapters/platform/platform-registry.js +122 -0
- package/dist/adapters/register-capabilities.d.ts +52 -2
- package/dist/adapters/register-capabilities.js +69 -130
- package/dist/adapters/register-client-capabilities.js +1 -1
- package/dist/index.d.ts +2 -5
- package/dist/index.js +5 -31
- package/dist/kernel/di/container.d.ts +4 -2
- package/dist/kernel/di/container.js +5 -3
- package/dist/kernel/di/metadata.scanner.d.ts +2 -1
- package/dist/kernel/di/metadata.scanner.js +3 -2
- package/dist/kernel/{utils/error → error}/app.error.d.ts +2 -2
- package/dist/kernel/error/common.error-codes.d.ts +1 -0
- package/dist/kernel/error/framework.error-codes.d.ts +12 -0
- package/dist/kernel/error/index.d.ts +4 -0
- package/dist/kernel/error/index.js +18 -0
- package/dist/kernel/{utils/error → error}/security.error.d.ts +1 -1
- package/dist/kernel/error/security.types.js +2 -0
- package/dist/kernel/index.d.ts +4 -5
- package/dist/kernel/index.js +6 -11
- package/dist/kernel/{shared/logger → logger}/core-logger.d.ts +0 -19
- package/dist/kernel/{shared/logger → logger}/core-logger.js +10 -24
- package/dist/kernel/{shared/logger → logger}/logger.env.d.ts +12 -5
- package/dist/kernel/{shared/logger → logger}/logger.env.js +29 -13
- package/dist/kernel/{shared/logger → logger}/logger.service.d.ts +14 -0
- package/dist/kernel/{shared/logger → logger}/logger.service.js +20 -2
- package/dist/kernel/logger/transports/transport.interface.js +2 -0
- package/dist/kernel/shared/index.d.ts +1 -2
- package/dist/kernel/shared/index.js +1 -2
- package/dist/kernel/utils/index.d.ts +0 -2
- package/dist/kernel/utils/index.js +0 -2
- package/dist/kernel/utils/result.d.ts +1 -1
- package/dist/runtime/client/api.d.ts +7 -0
- package/dist/runtime/client/api.js +23 -0
- package/dist/runtime/client/client-bootstrap.js +1 -1
- package/dist/runtime/client/controllers/spawner.controller.d.ts +1 -1
- package/dist/runtime/client/decorators/index.d.ts +2 -2
- package/dist/runtime/client/decorators/index.js +2 -2
- package/dist/runtime/client/decorators/key.d.ts +2 -2
- package/dist/runtime/client/decorators/key.js +3 -3
- package/dist/runtime/client/decorators/localEvent.d.ts +1 -1
- package/dist/runtime/client/decorators/localEvent.js +1 -1
- package/dist/runtime/client/decorators/{tick.d.ts → onTick.d.ts} +1 -1
- package/dist/runtime/client/decorators/{tick.js → onTick.js} +2 -2
- package/dist/runtime/client/decorators/{nui.d.ts → onView.d.ts} +4 -4
- package/dist/runtime/client/decorators/{nui.js → onView.js} +5 -5
- package/dist/runtime/client/index.d.ts +1 -7
- package/dist/runtime/client/index.js +26 -12
- package/dist/runtime/client/player/player.d.ts +1 -1
- package/dist/runtime/client/player/player.loader.js +3 -3
- package/dist/runtime/client/services/appearance.service.d.ts +1 -1
- package/dist/runtime/client/services/appearance.service.js +1 -1
- package/dist/runtime/client/services/blip.service.d.ts +1 -1
- package/dist/runtime/client/services/marker.service.d.ts +1 -1
- package/dist/runtime/client/services/ped.service.d.ts +1 -1
- package/dist/runtime/client/services/spawn.service.d.ts +2 -2
- package/dist/runtime/client/services/spawn.service.js +12 -12
- package/dist/runtime/client/services/textui.service.d.ts +1 -1
- package/dist/runtime/client/services/vehicle-client.service.d.ts +1 -1
- package/dist/runtime/client/services/vehicle.service.d.ts +1 -1
- package/dist/runtime/client/system/processors/export.processor.js +1 -1
- package/dist/runtime/client/system/processors/gameEvent.processor.js +1 -1
- package/dist/runtime/client/system/processors/interval.processor.js +1 -1
- package/dist/runtime/client/system/processors/localEvent.processor.js +1 -1
- package/dist/runtime/client/system/processors/netEvent.processor.js +1 -1
- package/dist/runtime/client/system/processors/nui.processor.js +1 -1
- package/dist/runtime/client/system/processors/resourceLifecycle.processor.js +1 -1
- package/dist/runtime/client/system/processors/tick.processor.js +1 -1
- package/dist/runtime/client/ui-bridge.js +1 -1
- package/dist/runtime/core/entity.d.ts +168 -0
- package/dist/runtime/core/entity.js +226 -0
- package/dist/runtime/core/index.d.ts +3 -0
- package/dist/runtime/core/index.js +19 -0
- package/dist/runtime/core/spatial.d.ts +5 -0
- package/dist/runtime/core/spatial.js +2 -0
- package/dist/runtime/core/world.d.ts +13 -0
- package/dist/runtime/core/world.js +64 -0
- package/dist/runtime/server/api.d.ts +12 -0
- package/dist/runtime/server/api.js +34 -0
- package/dist/runtime/server/bootstrap.js +84 -108
- package/dist/runtime/server/bus/internal-event.bus.js +1 -1
- package/dist/runtime/server/contracts/index.d.ts +1 -2
- package/dist/runtime/server/contracts/index.js +2 -3
- package/dist/runtime/server/contracts/player-persistence.contract.d.ts +16 -18
- package/dist/runtime/server/contracts/player-persistence.contract.js +16 -18
- package/dist/runtime/server/contracts/security/command-error-observer.contract.d.ts +73 -0
- package/dist/runtime/server/contracts/security/command-error-observer.contract.js +9 -0
- package/dist/runtime/server/contracts/security/permission.types.d.ts +2 -2
- package/dist/runtime/server/contracts/security/principal-provider.contract.d.ts +3 -3
- package/dist/runtime/server/contracts/security/principal-provider.contract.js +2 -2
- package/dist/runtime/server/contracts/security/security-handler.contract.d.ts +2 -2
- package/dist/runtime/server/controllers/chat.controller.d.ts +1 -1
- package/dist/runtime/server/controllers/chat.controller.js +5 -0
- package/dist/runtime/server/controllers/command-export.controller.d.ts +12 -3
- package/dist/runtime/server/controllers/command-export.controller.js +94 -28
- package/dist/runtime/server/controllers/player-export.controller.d.ts +2 -2
- package/dist/runtime/server/controllers/player-export.controller.js +5 -0
- package/dist/runtime/server/controllers/principal-export.controller.js +8 -7
- package/dist/runtime/server/controllers/ready.controller.d.ts +4 -0
- package/dist/runtime/server/controllers/ready.controller.js +32 -0
- package/dist/runtime/server/controllers/remote-command-execution.controller.d.ts +10 -1
- package/dist/runtime/server/controllers/remote-command-execution.controller.js +79 -13
- package/dist/runtime/server/controllers/session.controller.d.ts +2 -2
- package/dist/runtime/server/controllers/session.controller.js +25 -17
- package/dist/runtime/server/controllers/vehicle.controller.d.ts +3 -38
- package/dist/runtime/server/controllers/vehicle.controller.js +6 -152
- package/dist/runtime/server/decorators/guard.js +2 -2
- package/dist/runtime/server/decorators/index.d.ts +1 -1
- package/dist/runtime/server/decorators/index.js +1 -1
- package/dist/runtime/server/decorators/{onFiveMEvent.d.ts → onRuntimeEvent.d.ts} +5 -4
- package/dist/runtime/server/decorators/{onFiveMEvent.js → onRuntimeEvent.js} +7 -6
- package/dist/runtime/server/decorators/requiresState.js +3 -3
- package/dist/runtime/server/decorators/throttle.d.ts +1 -1
- package/dist/runtime/server/decorators/throttle.js +1 -1
- package/dist/runtime/server/decorators/utils.d.ts +1 -1
- package/dist/runtime/server/decorators/utils.js +1 -1
- package/dist/runtime/server/devmode/dev-mode.service.d.ts +7 -8
- package/dist/runtime/server/devmode/dev-mode.service.js +18 -46
- package/dist/runtime/server/devmode/index.d.ts +1 -3
- package/dist/runtime/server/devmode/index.js +1 -18
- package/dist/runtime/server/devmode/player-simulator.service.js +3 -3
- package/dist/runtime/server/devmode/state-inspector.service.js +2 -2
- package/dist/runtime/server/devmode/types.d.ts +67 -31
- package/dist/runtime/server/devmode/types.js +1 -4
- package/dist/runtime/server/entities/player.d.ts +80 -66
- package/dist/runtime/server/entities/player.js +137 -98
- package/dist/runtime/server/entities/vehicle.d.ts +3 -3
- package/dist/runtime/server/error-handler.js +5 -5
- package/dist/runtime/server/helpers/command-validation.helper.d.ts +0 -3
- package/dist/runtime/server/helpers/command-validation.helper.js +3 -7
- package/dist/runtime/server/helpers/normalize-app-error.d.ts +9 -0
- package/dist/runtime/server/helpers/normalize-app-error.js +20 -0
- package/dist/runtime/server/helpers/process-tuple-schema.d.ts +20 -0
- package/dist/runtime/server/helpers/process-tuple-schema.js +51 -0
- package/dist/runtime/server/helpers/resolve-method.js +3 -3
- package/dist/runtime/server/index.d.ts +1 -13
- package/dist/runtime/server/index.js +25 -23
- package/dist/runtime/server/runtime.d.ts +32 -281
- package/dist/runtime/server/runtime.js +46 -60
- package/dist/runtime/server/services/appearance.service.d.ts +5 -5
- package/dist/runtime/server/services/appearance.service.js +5 -5
- package/dist/runtime/server/services/chat.service.d.ts +5 -3
- package/dist/runtime/server/services/chat.service.js +17 -12
- package/dist/runtime/server/services/core/command.service.d.ts +9 -1
- package/dist/runtime/server/services/core/command.service.js +16 -7
- package/dist/runtime/server/services/core/player.service.d.ts +12 -16
- package/dist/runtime/server/services/core/player.service.js +42 -47
- package/dist/runtime/server/services/core/principal.service.js +5 -5
- package/dist/runtime/server/services/core/session-recovery.service.d.ts +1 -1
- package/dist/runtime/server/services/core/session-recovery.service.js +2 -2
- package/dist/runtime/server/services/default/default-command-error-observer.d.ts +14 -0
- package/dist/runtime/server/services/default/default-command-error-observer.js +43 -0
- package/dist/runtime/server/services/default/default-principal.provider.d.ts +13 -0
- package/dist/runtime/server/services/default/default-principal.provider.js +38 -0
- package/dist/runtime/server/services/default/default-security.handler.d.ts +1 -1
- package/dist/runtime/server/services/default/default-security.handler.js +1 -1
- package/dist/runtime/server/services/index.d.ts +0 -3
- package/dist/runtime/server/services/index.js +1 -6
- package/dist/runtime/server/services/persistence.service.js +3 -3
- package/dist/runtime/server/services/ports/command-execution.port.d.ts +7 -0
- package/dist/runtime/server/services/ports/principal.port.d.ts +1 -1
- package/dist/runtime/server/services/remote/remote-command.service.d.ts +1 -0
- package/dist/runtime/server/services/remote/remote-command.service.js +30 -11
- package/dist/runtime/server/services/remote/remote-player.service.d.ts +2 -2
- package/dist/runtime/server/services/remote/remote-player.service.js +3 -3
- package/dist/runtime/server/services/remote/server-bridge.js +2 -2
- package/dist/runtime/server/services/services.register.d.ts +2 -5
- package/dist/runtime/server/services/services.register.js +29 -41
- package/dist/runtime/server/services/vehicle-modification.service.js +1 -1
- package/dist/runtime/server/services/vehicle.service.d.ts +3 -3
- package/dist/runtime/server/services/vehicle.service.js +5 -5
- package/dist/runtime/server/setup.d.ts +2 -3
- package/dist/runtime/server/setup.js +10 -11
- package/dist/runtime/server/system/metadata-server.keys.d.ts +1 -1
- package/dist/runtime/server/system/metadata-server.keys.js +1 -1
- package/dist/runtime/server/system/processors/command.processor.js +4 -0
- package/dist/runtime/server/system/processors/export.processor.js +1 -1
- package/dist/runtime/server/system/processors/internalEvent.processor.js +1 -1
- package/dist/runtime/server/system/processors/netEvent.processor.js +11 -10
- package/dist/runtime/server/system/processors/{fivemEvent.processor.d.ts → runtimeEvent.processor.d.ts} +1 -1
- package/dist/runtime/server/system/processors/{fivemEvent.processor.js → runtimeEvent.processor.js} +8 -8
- package/dist/runtime/server/system/processors/tick.processor.js +1 -1
- package/dist/runtime/server/system/processors.register.js +16 -11
- package/dist/runtime/server/system/schema-generator.js +5 -3
- package/dist/runtime/server/types/core-exports.d.ts +6 -6
- package/dist/runtime/server/types/index.d.ts +1 -1
- package/dist/runtime/server/types/index.js +1 -1
- package/dist/runtime/server/types/internal-events.d.ts +1 -1
- package/dist/runtime/server/types/vehicle.types.d.ts +1 -1
- package/package.json +7 -15
- package/dist/adapters/contracts/IEntityServer.d.ts +0 -88
- package/dist/adapters/contracts/IEntityServer.js +0 -13
- package/dist/adapters/contracts/IPlayerServer.js +0 -13
- package/dist/adapters/database/oxmysql.adapter.d.ts +0 -89
- package/dist/adapters/database/oxmysql.adapter.js +0 -149
- package/dist/adapters/database/resource.adapter.d.ts +0 -12
- package/dist/adapters/database/resource.adapter.js +0 -68
- package/dist/kernel/shared/appearance/index.d.ts +0 -1
- package/dist/runtime/index.d.ts +0 -2
- package/dist/runtime/index.js +0 -39
- package/dist/runtime/server/bootstrap.validation.d.ts +0 -12
- package/dist/runtime/server/bootstrap.validation.js +0 -104
- package/dist/runtime/server/contracts/auth-provider.contract.d.ts +0 -58
- package/dist/runtime/server/contracts/auth-provider.contract.js +0 -23
- package/dist/runtime/server/contracts/repository/index.d.ts +0 -57
- package/dist/runtime/server/contracts/repository/index.js +0 -61
- package/dist/runtime/server/contracts/repository/repository.contract.d.ts +0 -224
- package/dist/runtime/server/contracts/repository/repository.contract.js +0 -341
- package/dist/runtime/server/contracts/repository/repository.types.d.ts +0 -51
- package/dist/runtime/server/contracts/repository/repository.types.js +0 -7
- package/dist/runtime/server/database/adapter.registry.d.ts +0 -4
- package/dist/runtime/server/database/adapter.registry.js +0 -14
- package/dist/runtime/server/database/database.contract.d.ts +0 -128
- package/dist/runtime/server/database/database.contract.js +0 -29
- package/dist/runtime/server/database/database.service.d.ts +0 -188
- package/dist/runtime/server/database/database.service.js +0 -287
- package/dist/runtime/server/database/index.d.ts +0 -5
- package/dist/runtime/server/database/index.js +0 -25
- package/dist/runtime/server/database/types.d.ts +0 -67
- package/dist/runtime/server/database/types.js +0 -7
- package/dist/runtime/server/database.d.ts +0 -7
- package/dist/runtime/server/devmode/hot-reload.server.d.ts +0 -74
- package/dist/runtime/server/devmode/hot-reload.server.js +0 -261
- package/dist/runtime/server/services/config.service.d.ts +0 -75
- package/dist/runtime/server/services/config.service.js +0 -116
- package/dist/runtime/server/services/http/http.service.d.ts +0 -50
- package/dist/runtime/server/services/http/http.service.js +0 -126
- /package/dist/adapters/contracts/{IPedAppearanceClient.js → client/IPedAppearanceClient.js} +0 -0
- /package/dist/adapters/contracts/{IPedAppearanceServer.d.ts → server/IPedAppearanceServer.d.ts} +0 -0
- /package/dist/adapters/contracts/{IPedAppearanceServer.js → server/IPedAppearanceServer.js} +0 -0
- /package/dist/adapters/contracts/{IVehicleServer.d.ts → server/IVehicleServer.d.ts} +0 -0
- /package/dist/adapters/contracts/{IVehicleServer.js → server/IVehicleServer.js} +0 -0
- /package/dist/kernel/{utils/error → error}/app.error.js +0 -0
- /package/dist/kernel/{shared/logger/transports/transport.interface.js → error/common.error-codes.js} +0 -0
- /package/dist/{runtime/server/types/security.types.js → kernel/error/framework.error-codes.js} +0 -0
- /package/dist/kernel/{utils/error → error}/security.error.js +0 -0
- /package/dist/{runtime/server/types → kernel/error}/security.types.d.ts +0 -0
- /package/dist/kernel/{shared/logger → logger}/index.d.ts +0 -0
- /package/dist/kernel/{shared/logger → logger}/index.js +0 -0
- /package/dist/kernel/{shared/logger → logger}/logger.config.d.ts +0 -0
- /package/dist/kernel/{shared/logger → logger}/logger.config.js +0 -0
- /package/dist/kernel/{shared/logger → logger}/logger.types.d.ts +0 -0
- /package/dist/kernel/{shared/logger → logger}/logger.types.js +0 -0
- /package/dist/kernel/{shared/logger → logger}/transports/buffered.transport.d.ts +0 -0
- /package/dist/kernel/{shared/logger → logger}/transports/buffered.transport.js +0 -0
- /package/dist/kernel/{shared/logger → logger}/transports/console.transport.d.ts +0 -0
- /package/dist/kernel/{shared/logger → logger}/transports/console.transport.js +0 -0
- /package/dist/kernel/{shared/logger → logger}/transports/dev-transport.factory.d.ts +0 -0
- /package/dist/kernel/{shared/logger → logger}/transports/dev-transport.factory.js +0 -0
- /package/dist/kernel/{shared/logger → logger}/transports/http.transport.d.ts +0 -0
- /package/dist/kernel/{shared/logger → logger}/transports/http.transport.js +0 -0
- /package/dist/kernel/{shared/logger → logger}/transports/index.d.ts +0 -0
- /package/dist/kernel/{shared/logger → logger}/transports/index.js +0 -0
- /package/dist/kernel/{shared/logger → logger}/transports/simple-console.transport.d.ts +0 -0
- /package/dist/kernel/{shared/logger → logger}/transports/simple-console.transport.js +0 -0
- /package/dist/kernel/{shared/logger → logger}/transports/transport.interface.d.ts +0 -0
- /package/dist/kernel/{shared/logger → logger}/transports/websocket.transport.d.ts +0 -0
- /package/dist/kernel/{shared/logger → logger}/transports/websocket.transport.js +0 -0
- /package/dist/kernel/shared/{appearance/appearance.interface.d.ts → player-appearance.types.d.ts} +0 -0
- /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
|
|
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
|
|
14
|
+
* class MyPrincipal implements PrincipalProviderContract { ... }
|
|
15
15
|
* ```
|
|
16
16
|
*/
|
|
17
17
|
class PrincipalProviderContract {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
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,
|
|
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
|
|
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
|
|
19
|
-
const
|
|
20
|
-
const
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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)(
|
|
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 {
|
|
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
|
|
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
|
|
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
|
|
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
|
|
196
|
+
throw new app_error_1.AppError('AUTH:UNAUTHORIZED', 'No principal found', 'core');
|
|
197
197
|
}
|
|
198
198
|
if (principal.rank === undefined) {
|
|
199
|
-
throw new
|
|
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
|
|
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
|
|
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
|
|
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,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
|
|
20
|
-
const
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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(
|
|
99
|
-
__param(
|
|
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
|
}
|