@open-core/framework 1.0.1-beta.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/LICENSE +373 -0
- package/README.md +350 -0
- package/dist/client/client-bootstrap.d.ts +1 -0
- package/dist/client/client-bootstrap.js +53 -0
- package/dist/client/client-container.d.ts +2 -0
- package/dist/client/client-container.js +6 -0
- package/dist/client/client-core.d.ts +18 -0
- package/dist/client/client-core.js +52 -0
- package/dist/client/decorators/controller.d.ts +3 -0
- package/dist/client/decorators/controller.js +14 -0
- package/dist/client/decorators/export.d.ts +7 -0
- package/dist/client/decorators/export.js +15 -0
- package/dist/client/decorators/gameEvent.d.ts +47 -0
- package/dist/client/decorators/gameEvent.js +54 -0
- package/dist/client/decorators/index.d.ts +10 -0
- package/dist/client/decorators/index.js +26 -0
- package/dist/client/decorators/interval.d.ts +7 -0
- package/dist/client/decorators/interval.js +15 -0
- package/dist/client/decorators/key.d.ts +2 -0
- package/dist/client/decorators/key.js +10 -0
- package/dist/client/decorators/localEvent.d.ts +7 -0
- package/dist/client/decorators/localEvent.js +15 -0
- package/dist/client/decorators/nui.d.ts +1 -0
- package/dist/client/decorators/nui.js +9 -0
- package/dist/client/decorators/onNet.d.ts +1 -0
- package/dist/client/decorators/onNet.js +9 -0
- package/dist/client/decorators/resourceLifecycle.d.ts +11 -0
- package/dist/client/decorators/resourceLifecycle.js +24 -0
- package/dist/client/decorators/tick.d.ts +1 -0
- package/dist/client/decorators/tick.js +9 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.js +22 -0
- package/dist/client/loaders/exports.loader.d.ts +1 -0
- package/dist/client/loaders/exports.loader.js +13 -0
- package/dist/client/player/player.d.ts +262 -0
- package/dist/client/player/player.js +480 -0
- package/dist/client/player/player.loader.d.ts +1 -0
- package/dist/client/player/player.loader.js +22 -0
- package/dist/client/services/core/index.d.ts +1 -0
- package/dist/client/services/core/index.js +17 -0
- package/dist/client/services/core/spawn.service.d.ts +20 -0
- package/dist/client/services/core/spawn.service.js +143 -0
- package/dist/client/services/index.d.ts +4 -0
- package/dist/client/services/index.js +24 -0
- package/dist/client/services/streaming/index.d.ts +1 -0
- package/dist/client/services/streaming/index.js +17 -0
- package/dist/client/services/streaming/streaming.service.d.ts +165 -0
- package/dist/client/services/streaming/streaming.service.js +341 -0
- package/dist/client/services/ui/index.d.ts +3 -0
- package/dist/client/services/ui/index.js +19 -0
- package/dist/client/services/ui/notification.service.d.ts +76 -0
- package/dist/client/services/ui/notification.service.js +111 -0
- package/dist/client/services/ui/progress.service.d.ts +82 -0
- package/dist/client/services/ui/progress.service.js +210 -0
- package/dist/client/services/ui/textui.service.d.ts +82 -0
- package/dist/client/services/ui/textui.service.js +156 -0
- package/dist/client/services/world/blip.service.d.ts +112 -0
- package/dist/client/services/world/blip.service.js +215 -0
- package/dist/client/services/world/index.d.ts +4 -0
- package/dist/client/services/world/index.js +20 -0
- package/dist/client/services/world/marker.service.d.ts +94 -0
- package/dist/client/services/world/marker.service.js +153 -0
- package/dist/client/services/world/ped.service.d.ts +182 -0
- package/dist/client/services/world/ped.service.js +302 -0
- package/dist/client/services/world/vehicle.service.d.ts +168 -0
- package/dist/client/services/world/vehicle.service.js +296 -0
- package/dist/client/system/metadata-client.keys.d.ts +13 -0
- package/dist/client/system/metadata-client.keys.js +16 -0
- package/dist/client/system/processors/export.processor.d.ts +7 -0
- package/dist/client/system/processors/export.processor.js +39 -0
- package/dist/client/system/processors/gameEvent.processor.d.ts +10 -0
- package/dist/client/system/processors/gameEvent.processor.js +58 -0
- package/dist/client/system/processors/interval.processor.d.ts +7 -0
- package/dist/client/system/processors/interval.processor.js +43 -0
- package/dist/client/system/processors/key.processor.d.ts +8 -0
- package/dist/client/system/processors/key.processor.js +27 -0
- package/dist/client/system/processors/localEvent.processor.d.ts +7 -0
- package/dist/client/system/processors/localEvent.processor.js +38 -0
- package/dist/client/system/processors/netEvent.processor.d.ts +7 -0
- package/dist/client/system/processors/netEvent.processor.js +38 -0
- package/dist/client/system/processors/nui.processor.d.ts +7 -0
- package/dist/client/system/processors/nui.processor.js +40 -0
- package/dist/client/system/processors/resourceLifecycle.processor.d.ts +9 -0
- package/dist/client/system/processors/resourceLifecycle.processor.js +69 -0
- package/dist/client/system/processors/tick.processor.d.ts +5 -0
- package/dist/client/system/processors/tick.processor.js +37 -0
- package/dist/client/system/processors.register.d.ts +1 -0
- package/dist/client/system/processors.register.js +27 -0
- package/dist/client/types/game-events.d.ts +126 -0
- package/dist/client/types/game-events.js +83 -0
- package/dist/client/types/index.d.ts +1 -0
- package/dist/client/types/index.js +17 -0
- package/dist/client/ui-bridge.d.ts +116 -0
- package/dist/client/ui-bridge.js +201 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +46 -0
- package/dist/server/bootstrap.d.ts +16 -0
- package/dist/server/bootstrap.js +57 -0
- package/dist/server/bus/core-event-bus.d.ts +6 -0
- package/dist/server/bus/core-event-bus.js +31 -0
- package/dist/server/configs/api.config.d.ts +71 -0
- package/dist/server/configs/api.config.js +81 -0
- package/dist/server/configs/config.base.d.ts +63 -0
- package/dist/server/configs/config.base.js +64 -0
- package/dist/server/configs/index.d.ts +2 -0
- package/dist/server/configs/index.js +18 -0
- package/dist/server/container.d.ts +2 -0
- package/dist/server/container.js +6 -0
- package/dist/server/controllers/chat.controller.d.ts +10 -0
- package/dist/server/controllers/chat.controller.js +50 -0
- package/dist/server/controllers/command.controller.d.ts +7 -0
- package/dist/server/controllers/command.controller.js +47 -0
- package/dist/server/core.d.ts +1 -0
- package/dist/server/core.js +7 -0
- package/dist/server/database/adapters/oxmysql.adapter.d.ts +89 -0
- package/dist/server/database/adapters/oxmysql.adapter.js +149 -0
- package/dist/server/database/database.contract.d.ts +128 -0
- package/dist/server/database/database.contract.js +29 -0
- package/dist/server/database/database.service.d.ts +216 -0
- package/dist/server/database/database.service.js +301 -0
- package/dist/server/database/index.d.ts +53 -0
- package/dist/server/database/index.js +70 -0
- package/dist/server/database/types.d.ts +67 -0
- package/dist/server/database/types.js +7 -0
- package/dist/server/database.d.ts +7 -0
- package/dist/server/database.js +23 -0
- package/dist/server/decorators/bind.d.ts +2 -0
- package/dist/server/decorators/bind.js +15 -0
- package/dist/server/decorators/command.d.ts +19 -0
- package/dist/server/decorators/command.js +18 -0
- package/dist/server/decorators/controller.d.ts +3 -0
- package/dist/server/decorators/controller.js +14 -0
- package/dist/server/decorators/coreEvent.d.ts +2 -0
- package/dist/server/decorators/coreEvent.js +9 -0
- package/dist/server/decorators/export.d.ts +1 -0
- package/dist/server/decorators/export.js +9 -0
- package/dist/server/decorators/guard.d.ts +5 -0
- package/dist/server/decorators/guard.js +39 -0
- package/dist/server/decorators/index.d.ts +10 -0
- package/dist/server/decorators/index.js +26 -0
- package/dist/server/decorators/netEvent.d.ts +36 -0
- package/dist/server/decorators/netEvent.js +40 -0
- package/dist/server/decorators/onTick.d.ts +1 -0
- package/dist/server/decorators/onTick.js +9 -0
- package/dist/server/decorators/public.d.ts +16 -0
- package/dist/server/decorators/public.js +25 -0
- package/dist/server/decorators/requiresState.d.ts +55 -0
- package/dist/server/decorators/requiresState.js +62 -0
- package/dist/server/decorators/throttle.d.ts +9 -0
- package/dist/server/decorators/throttle.js +36 -0
- package/dist/server/decorators/utils.d.ts +7 -0
- package/dist/server/decorators/utils.js +13 -0
- package/dist/server/entities/index.d.ts +1 -0
- package/dist/server/entities/index.js +17 -0
- package/dist/server/entities/player.d.ts +157 -0
- package/dist/server/entities/player.js +217 -0
- package/dist/server/error-handler.d.ts +2 -0
- package/dist/server/error-handler.js +43 -0
- package/dist/server/index.d.ts +10 -0
- package/dist/server/index.js +29 -0
- package/dist/server/loaders/exports.loader.d.ts +0 -0
- package/dist/server/loaders/exports.loader.js +23 -0
- package/dist/server/loaders/playerSession.loader.d.ts +1 -0
- package/dist/server/loaders/playerSession.loader.js +42 -0
- package/dist/server/services/access-control.service.d.ts +56 -0
- package/dist/server/services/access-control.service.js +99 -0
- package/dist/server/services/chat.service.d.ts +7 -0
- package/dist/server/services/chat.service.js +31 -0
- package/dist/server/services/command.service.d.ts +15 -0
- package/dist/server/services/command.service.js +74 -0
- package/dist/server/services/config.service.d.ts +75 -0
- package/dist/server/services/config.service.js +116 -0
- package/dist/server/services/default/default-security.handler.d.ts +6 -0
- package/dist/server/services/default/default-security.handler.js +26 -0
- package/dist/server/services/http/http.service.d.ts +50 -0
- package/dist/server/services/http/http.service.js +126 -0
- package/dist/server/services/index.d.ts +10 -0
- package/dist/server/services/index.js +26 -0
- package/dist/server/services/parallel/index.d.ts +49 -0
- package/dist/server/services/parallel/index.js +67 -0
- package/dist/server/services/parallel/parallel-compute.service.d.ts +132 -0
- package/dist/server/services/parallel/parallel-compute.service.js +449 -0
- package/dist/server/services/parallel/types.d.ts +188 -0
- package/dist/server/services/parallel/types.js +7 -0
- package/dist/server/services/parallel/worker-pool.d.ts +83 -0
- package/dist/server/services/parallel/worker-pool.js +350 -0
- package/dist/server/services/parallel/worker.d.ts +19 -0
- package/dist/server/services/parallel/worker.js +49 -0
- package/dist/server/services/persistence.service.d.ts +59 -0
- package/dist/server/services/persistence.service.js +166 -0
- package/dist/server/services/player.service.d.ts +96 -0
- package/dist/server/services/player.service.js +132 -0
- package/dist/server/services/rate-limiter.service.d.ts +5 -0
- package/dist/server/services/rate-limiter.service.js +39 -0
- package/dist/server/services/registers.d.ts +1 -0
- package/dist/server/services/registers.js +18 -0
- package/dist/server/setup.d.ts +9 -0
- package/dist/server/setup.js +28 -0
- package/dist/server/system/metadata-server.keys.d.ts +9 -0
- package/dist/server/system/metadata-server.keys.js +12 -0
- package/dist/server/system/processors/command.processor.d.ts +9 -0
- package/dist/server/system/processors/command.processor.js +31 -0
- package/dist/server/system/processors/coreEvent.processor.d.ts +7 -0
- package/dist/server/system/processors/coreEvent.processor.js +38 -0
- package/dist/server/system/processors/export.processor.d.ts +7 -0
- package/dist/server/system/processors/export.processor.js +26 -0
- package/dist/server/system/processors/netEvent.processor.d.ts +11 -0
- package/dist/server/system/processors/netEvent.processor.js +100 -0
- package/dist/server/system/processors/tick.processor.d.ts +5 -0
- package/dist/server/system/processors/tick.processor.js +36 -0
- package/dist/server/system/processors.register.d.ts +1 -0
- package/dist/server/system/processors.register.js +21 -0
- package/dist/server/templates/admin/admin.controller-template.d.ts +10 -0
- package/dist/server/templates/admin/admin.controller-template.js +2 -0
- package/dist/server/templates/auth/auth-provider.contract.d.ts +58 -0
- package/dist/server/templates/auth/auth-provider.contract.js +23 -0
- package/dist/server/templates/index.d.ts +8 -0
- package/dist/server/templates/index.js +21 -0
- package/dist/server/templates/persistence/index.d.ts +30 -0
- package/dist/server/templates/persistence/index.js +34 -0
- package/dist/server/templates/persistence/player-persistence.contract.d.ts +86 -0
- package/dist/server/templates/persistence/player-persistence.contract.js +52 -0
- package/dist/server/templates/repository/index.d.ts +57 -0
- package/dist/server/templates/repository/index.js +61 -0
- package/dist/server/templates/repository/repository.contract.d.ts +224 -0
- package/dist/server/templates/repository/repository.contract.js +342 -0
- package/dist/server/templates/repository/repository.types.d.ts +51 -0
- package/dist/server/templates/repository/repository.types.js +7 -0
- package/dist/server/templates/security/permission.types.d.ts +32 -0
- package/dist/server/templates/security/permission.types.js +2 -0
- package/dist/server/templates/security/principal-provider.contract.d.ts +43 -0
- package/dist/server/templates/security/principal-provider.contract.js +19 -0
- package/dist/server/templates/security/security-handler.contract.d.ts +5 -0
- package/dist/server/templates/security/security-handler.contract.js +6 -0
- package/dist/server/types/core-events.d.ts +17 -0
- package/dist/server/types/core-events.js +2 -0
- package/dist/server/types/security.types.d.ts +7 -0
- package/dist/server/types/security.types.js +2 -0
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.js +17 -0
- package/dist/shared/logger/core-logger.d.ts +35 -0
- package/dist/shared/logger/core-logger.js +52 -0
- package/dist/shared/logger/index.d.ts +11 -0
- package/dist/shared/logger/index.js +26 -0
- package/dist/shared/logger/logger.config.d.ts +47 -0
- package/dist/shared/logger/logger.config.js +33 -0
- package/dist/shared/logger/logger.service.d.ts +161 -0
- package/dist/shared/logger/logger.service.js +279 -0
- package/dist/shared/logger/logger.types.d.ts +85 -0
- package/dist/shared/logger/logger.types.js +74 -0
- package/dist/shared/logger/transports/buffered.transport.d.ts +88 -0
- package/dist/shared/logger/transports/buffered.transport.js +174 -0
- package/dist/shared/logger/transports/console.transport.d.ts +37 -0
- package/dist/shared/logger/transports/console.transport.js +134 -0
- package/dist/shared/logger/transports/index.d.ts +3 -0
- package/dist/shared/logger/transports/index.js +19 -0
- package/dist/shared/logger/transports/transport.interface.d.ts +40 -0
- package/dist/shared/logger/transports/transport.interface.js +2 -0
- package/dist/system/class-constructor.d.ts +1 -0
- package/dist/system/class-constructor.js +2 -0
- package/dist/system/decorator-processor.d.ts +4 -0
- package/dist/system/decorator-processor.js +2 -0
- package/dist/system/metadata.scanner.d.ts +7 -0
- package/dist/system/metadata.scanner.js +45 -0
- package/dist/utils/errors.d.ts +14 -0
- package/dist/utils/errors.js +25 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +20 -0
- package/dist/utils/result.d.ts +12 -0
- package/dist/utils/result.js +10 -0
- package/dist/utils/rgb.d.ts +5 -0
- package/dist/utils/rgb.js +2 -0
- package/dist/utils/vector3.d.ts +13 -0
- package/dist/utils/vector3.js +27 -0
- package/package.json +70 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
/**
|
|
18
|
+
* Database Module Re-export
|
|
19
|
+
*
|
|
20
|
+
* This file re-exports the database module for backwards compatibility.
|
|
21
|
+
* Prefer importing directly from '@open-core/framework/server' or './database/index'
|
|
22
|
+
*/
|
|
23
|
+
__exportStar(require("./database/index"), exports);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Bind = Bind;
|
|
4
|
+
const tsyringe_1 = require("tsyringe");
|
|
5
|
+
function Bind(scope = 'singleton') {
|
|
6
|
+
return function (target) {
|
|
7
|
+
(0, tsyringe_1.injectable)()(target);
|
|
8
|
+
if (scope === 'singleton') {
|
|
9
|
+
(0, tsyringe_1.singleton)()(target);
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
(0, tsyringe_1.scoped)(tsyringe_1.Lifecycle.ResolutionScoped)(target);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ClassConstructor } from '../../system/class-constructor';
|
|
2
|
+
import type z from 'zod';
|
|
3
|
+
export interface CommandConfig {
|
|
4
|
+
name: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
usage?: string;
|
|
7
|
+
schema?: z.ZodType;
|
|
8
|
+
}
|
|
9
|
+
export interface CommandMetadata extends CommandConfig {
|
|
10
|
+
methodName: string;
|
|
11
|
+
target: ClassConstructor;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Decorator used to mark a controller method as a command.
|
|
15
|
+
* The metadata is collected and later bound to FiveM via RegisterCommand().
|
|
16
|
+
*
|
|
17
|
+
* @param name - The command name (e.g. "revive", "deposit")
|
|
18
|
+
*/
|
|
19
|
+
export declare function Command(configOrName: string | CommandConfig): (target: any, propertyKey: string) => void;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Command = Command;
|
|
4
|
+
const metadata_server_keys_1 = require("../system/metadata-server.keys");
|
|
5
|
+
/**
|
|
6
|
+
* Decorator used to mark a controller method as a command.
|
|
7
|
+
* The metadata is collected and later bound to FiveM via RegisterCommand().
|
|
8
|
+
*
|
|
9
|
+
* @param name - The command name (e.g. "revive", "deposit")
|
|
10
|
+
*/
|
|
11
|
+
function Command(configOrName) {
|
|
12
|
+
return (target, propertyKey) => {
|
|
13
|
+
// Normalizamos: si pasa solo un string, creamos el objeto config
|
|
14
|
+
const config = typeof configOrName === 'string' ? { name: configOrName } : configOrName;
|
|
15
|
+
const metadata = Object.assign(Object.assign({}, config), { methodName: propertyKey, target: target.constructor });
|
|
16
|
+
Reflect.defineMetadata(metadata_server_keys_1.METADATA_KEYS.COMMAND, metadata, target, propertyKey);
|
|
17
|
+
};
|
|
18
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.serverControllerRegistry = void 0;
|
|
4
|
+
exports.Controller = Controller;
|
|
5
|
+
const tsyringe_1 = require("tsyringe");
|
|
6
|
+
const metadata_server_keys_1 = require("../system/metadata-server.keys");
|
|
7
|
+
exports.serverControllerRegistry = [];
|
|
8
|
+
function Controller() {
|
|
9
|
+
return function (target) {
|
|
10
|
+
(0, tsyringe_1.injectable)()(target);
|
|
11
|
+
Reflect.defineMetadata(metadata_server_keys_1.METADATA_KEYS.CONTROLLER, { type: 'server' }, target);
|
|
12
|
+
exports.serverControllerRegistry.push(target);
|
|
13
|
+
};
|
|
14
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OnCoreEvent = OnCoreEvent;
|
|
4
|
+
const metadata_server_keys_1 = require("../system/metadata-server.keys");
|
|
5
|
+
function OnCoreEvent(event) {
|
|
6
|
+
return (target, propertyKey) => {
|
|
7
|
+
Reflect.defineMetadata(metadata_server_keys_1.METADATA_KEYS.CORE_EVENT, { event }, target, propertyKey);
|
|
8
|
+
};
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function Export(name?: string): (target: any, propertyKey: string) => void;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Export = Export;
|
|
4
|
+
const metadata_server_keys_1 = require("../system/metadata-server.keys");
|
|
5
|
+
function Export(name) {
|
|
6
|
+
return (target, propertyKey) => {
|
|
7
|
+
Reflect.defineMetadata(metadata_server_keys_1.METADATA_KEYS.EXPORT, { exportName: name || propertyKey }, target, propertyKey);
|
|
8
|
+
};
|
|
9
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Guard = Guard;
|
|
4
|
+
const container_1 = require("../container");
|
|
5
|
+
const services_1 = require("../services");
|
|
6
|
+
const logger_1 = require("../../shared/logger");
|
|
7
|
+
function Guard(options) {
|
|
8
|
+
return function (target, propertyKey, descriptor) {
|
|
9
|
+
var _a;
|
|
10
|
+
if (!descriptor) {
|
|
11
|
+
// In benchmarks or edge cases, only register metadata without method wrapping
|
|
12
|
+
// This should NOT happen in production code with proper TypeScript compilation
|
|
13
|
+
logger_1.loggers.security.warn(`@Guard decorator: PropertyDescriptor not available. Only metadata will be registered. This should not happen in production code. Target: ${(_a = target.constructor) === null || _a === void 0 ? void 0 : _a.name}, Method: ${propertyKey}`);
|
|
14
|
+
Reflect.defineMetadata('core:guard', options, target, propertyKey);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const originalMethod = descriptor.value;
|
|
18
|
+
descriptor.value = async function (...args) {
|
|
19
|
+
var _a;
|
|
20
|
+
const player = args[0];
|
|
21
|
+
if (!player || !player.clientID) {
|
|
22
|
+
logger_1.loggers.security.warn(`@Guard misuse: First argument is not a Player`, {
|
|
23
|
+
method: propertyKey,
|
|
24
|
+
targetClass: (_a = target.constructor) === null || _a === void 0 ? void 0 : _a.name,
|
|
25
|
+
});
|
|
26
|
+
throw new Error('Guard Security Error: Context is not a player');
|
|
27
|
+
}
|
|
28
|
+
const accessControl = container_1.di.resolve(services_1.AccessControlService);
|
|
29
|
+
await accessControl.enforce(player, {
|
|
30
|
+
minRank: options.rank,
|
|
31
|
+
permission: options.permission,
|
|
32
|
+
});
|
|
33
|
+
return originalMethod.apply(this, args);
|
|
34
|
+
};
|
|
35
|
+
// no need a defined metadata key, as we won't read it later
|
|
36
|
+
Reflect.defineMetadata('core:guard', options, target, propertyKey);
|
|
37
|
+
return descriptor;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './bind';
|
|
2
|
+
export * from './utils';
|
|
3
|
+
export * from './command';
|
|
4
|
+
export * from './coreEvent';
|
|
5
|
+
export * from './netEvent';
|
|
6
|
+
export * from './onTick';
|
|
7
|
+
export * from './controller';
|
|
8
|
+
export * from './throttle';
|
|
9
|
+
export * from './guard';
|
|
10
|
+
export * from './requiresState';
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./bind"), exports);
|
|
18
|
+
__exportStar(require("./utils"), exports);
|
|
19
|
+
__exportStar(require("./command"), exports);
|
|
20
|
+
__exportStar(require("./coreEvent"), exports);
|
|
21
|
+
__exportStar(require("./netEvent"), exports);
|
|
22
|
+
__exportStar(require("./onTick"), exports);
|
|
23
|
+
__exportStar(require("./controller"), exports);
|
|
24
|
+
__exportStar(require("./throttle"), exports);
|
|
25
|
+
__exportStar(require("./guard"), exports);
|
|
26
|
+
__exportStar(require("./requiresState"), exports);
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { z } from 'zod';
|
|
2
|
+
export interface NetEventOptions {
|
|
3
|
+
eventName: string;
|
|
4
|
+
schema?: z.ZodType;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Decorator used to register a server-side NetEvent handler.
|
|
8
|
+
*
|
|
9
|
+
* ## Player Injection
|
|
10
|
+
* The handler method will **always receive a `ServerPlayer` instance as its
|
|
11
|
+
* first argument**, automatically resolved by the Core based on the client
|
|
12
|
+
* that triggered the event.
|
|
13
|
+
*
|
|
14
|
+
* This means you do NOT need to read `source`, `global.source` or call
|
|
15
|
+
* `GetPlayerIdentifier()`: the Core resolves the player for you.
|
|
16
|
+
*
|
|
17
|
+
* ## Example
|
|
18
|
+
* ```ts
|
|
19
|
+
* export class AuthServerController {
|
|
20
|
+
* @OnNet('auth:loginAttempt')
|
|
21
|
+
* handleLogin(player: ServerPlayer, username: string, password: string) {
|
|
22
|
+
* console.log(player.name, 'is trying to log in');
|
|
23
|
+
* }
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* ## Event Arguments
|
|
28
|
+
* Any arguments sent from the client will be passed **after** the `ServerPlayer`
|
|
29
|
+
* instance:
|
|
30
|
+
*
|
|
31
|
+
* client → emitNet("auth:loginAttempt", username, password)
|
|
32
|
+
* server → handler(player, username, password)
|
|
33
|
+
*
|
|
34
|
+
* @param eventName - The name of the network event to listen for.
|
|
35
|
+
*/
|
|
36
|
+
export declare function OnNet(eventName: string, schema?: z.ZodType): (target: any, propertyKey: string) => void;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OnNet = OnNet;
|
|
4
|
+
const metadata_server_keys_1 = require("../system/metadata-server.keys");
|
|
5
|
+
/**
|
|
6
|
+
* Decorator used to register a server-side NetEvent handler.
|
|
7
|
+
*
|
|
8
|
+
* ## Player Injection
|
|
9
|
+
* The handler method will **always receive a `ServerPlayer` instance as its
|
|
10
|
+
* first argument**, automatically resolved by the Core based on the client
|
|
11
|
+
* that triggered the event.
|
|
12
|
+
*
|
|
13
|
+
* This means you do NOT need to read `source`, `global.source` or call
|
|
14
|
+
* `GetPlayerIdentifier()`: the Core resolves the player for you.
|
|
15
|
+
*
|
|
16
|
+
* ## Example
|
|
17
|
+
* ```ts
|
|
18
|
+
* export class AuthServerController {
|
|
19
|
+
* @OnNet('auth:loginAttempt')
|
|
20
|
+
* handleLogin(player: ServerPlayer, username: string, password: string) {
|
|
21
|
+
* console.log(player.name, 'is trying to log in');
|
|
22
|
+
* }
|
|
23
|
+
* }
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* ## Event Arguments
|
|
27
|
+
* Any arguments sent from the client will be passed **after** the `ServerPlayer`
|
|
28
|
+
* instance:
|
|
29
|
+
*
|
|
30
|
+
* client → emitNet("auth:loginAttempt", username, password)
|
|
31
|
+
* server → handler(player, username, password)
|
|
32
|
+
*
|
|
33
|
+
* @param eventName - The name of the network event to listen for.
|
|
34
|
+
*/
|
|
35
|
+
function OnNet(eventName, schema) {
|
|
36
|
+
return (target, propertyKey) => {
|
|
37
|
+
const metadata = { eventName, schema };
|
|
38
|
+
Reflect.defineMetadata(metadata_server_keys_1.METADATA_KEYS.NET_EVENT, metadata, target, propertyKey);
|
|
39
|
+
};
|
|
40
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function OnTick(): (target: any, propertyKey: string) => void;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OnTick = OnTick;
|
|
4
|
+
const metadata_server_keys_1 = require("../system/metadata-server.keys");
|
|
5
|
+
function OnTick() {
|
|
6
|
+
return (target, propertyKey) => {
|
|
7
|
+
Reflect.defineMetadata(metadata_server_keys_1.METADATA_KEYS.TICK, {}, target, propertyKey);
|
|
8
|
+
};
|
|
9
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **Only works on NetEvents in Server-side**
|
|
3
|
+
*
|
|
4
|
+
* Marks an endpoint as publicly accessible (no authentication required).
|
|
5
|
+
* Use only for login, register, or public info endpoints.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* class AuthServerController {
|
|
10
|
+
* @ Server.Public()
|
|
11
|
+
* @ Server.OnNet('auth:login')
|
|
12
|
+
* async login(player: Server.Player, credentials: AuthCredentials) { ... }
|
|
13
|
+
* }
|
|
14
|
+
* ```
|
|
15
|
+
* */
|
|
16
|
+
export declare function Public(): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Public = Public;
|
|
4
|
+
const metadata_server_keys_1 = require("../system/metadata-server.keys");
|
|
5
|
+
/**
|
|
6
|
+
* **Only works on NetEvents in Server-side**
|
|
7
|
+
*
|
|
8
|
+
* Marks an endpoint as publicly accessible (no authentication required).
|
|
9
|
+
* Use only for login, register, or public info endpoints.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* class AuthServerController {
|
|
14
|
+
* @ Server.Public()
|
|
15
|
+
* @ Server.OnNet('auth:login')
|
|
16
|
+
* async login(player: Server.Player, credentials: AuthCredentials) { ... }
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
* */
|
|
20
|
+
function Public() {
|
|
21
|
+
return function (target, propertyKey, descriptor) {
|
|
22
|
+
Reflect.defineMetadata(metadata_server_keys_1.METADATA_KEYS.PUBLIC, true, target, propertyKey);
|
|
23
|
+
return descriptor;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration options for state validation requirements.
|
|
3
|
+
* Defines the logical constraints (whitelist/blacklist) applied to the player's current state flags.
|
|
4
|
+
*/
|
|
5
|
+
export interface StateRequirement {
|
|
6
|
+
/**
|
|
7
|
+
* **Whitelist:** The player **MUST** possess ALL of these states to proceed.
|
|
8
|
+
* If the player is missing any one of these, the execution is blocked.
|
|
9
|
+
* @example ['on_duty_police', 'in_vehicle']
|
|
10
|
+
*/
|
|
11
|
+
has?: string[];
|
|
12
|
+
/**
|
|
13
|
+
* **Blacklist:** The player **MUST NOT** possess ANY of these states to proceed.
|
|
14
|
+
* If the player has any one of these, the execution is blocked.
|
|
15
|
+
* @example ['dead', 'cuffed', 'unconscious']
|
|
16
|
+
*/
|
|
17
|
+
missing?: string[];
|
|
18
|
+
/**
|
|
19
|
+
* A custom message to display to the client if validation fails.
|
|
20
|
+
* If omitted, a default generic message will be generated based on the missing/conflicting state.
|
|
21
|
+
*/
|
|
22
|
+
errorMessage?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* **Game State Guard Decorator**
|
|
26
|
+
*
|
|
27
|
+
* A method decorator that enforces game logic constraints based on the player's dynamic states.
|
|
28
|
+
* It intercepts the method call and validates the player's flags (e.g., 'dead', 'cuffed', 'driving')
|
|
29
|
+
* before allowing the controller logic to execute.
|
|
30
|
+
*
|
|
31
|
+
* @remarks
|
|
32
|
+
* - This decorator assumes the **first argument** of the decorated method is a `Server.Player` instance.
|
|
33
|
+
* - It throws a `GAME_STATE_ERROR` (AppError) if requirements are not met, which should be caught by the global error handler.
|
|
34
|
+
*
|
|
35
|
+
* @param req - The state requirements configuration (whitelist and/or blacklist).
|
|
36
|
+
*
|
|
37
|
+
* @throws {Error} If the decorated method is called without a valid Player context (Server-side logic error).
|
|
38
|
+
* @throws {AppError} If the player fails the state validation (Client-facing logic error).
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```ts
|
|
42
|
+
* // Example 1: Action requires being alive (not dead) and not handcuffed
|
|
43
|
+
* @RequiresState({ missing: ['dead', 'cuffed'] })
|
|
44
|
+
* openInventory(player: Server.Player) { ... }
|
|
45
|
+
*
|
|
46
|
+
* // Example 2: Action requires being a police officer on duty
|
|
47
|
+
* @RequiresState({
|
|
48
|
+
* has: ['police_duty'],
|
|
49
|
+
* missing: ['dead'],
|
|
50
|
+
* errorMessage: 'You must be on duty to access the armory.'
|
|
51
|
+
* })
|
|
52
|
+
* openArmory(player: Server.Player) { ... }
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare function RequiresState(req: StateRequirement): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RequiresState = RequiresState;
|
|
4
|
+
const utils_1 = require("../../utils");
|
|
5
|
+
/**
|
|
6
|
+
* **Game State Guard Decorator**
|
|
7
|
+
*
|
|
8
|
+
* A method decorator that enforces game logic constraints based on the player's dynamic states.
|
|
9
|
+
* It intercepts the method call and validates the player's flags (e.g., 'dead', 'cuffed', 'driving')
|
|
10
|
+
* before allowing the controller logic to execute.
|
|
11
|
+
*
|
|
12
|
+
* @remarks
|
|
13
|
+
* - This decorator assumes the **first argument** of the decorated method is a `Server.Player` instance.
|
|
14
|
+
* - It throws a `GAME_STATE_ERROR` (AppError) if requirements are not met, which should be caught by the global error handler.
|
|
15
|
+
*
|
|
16
|
+
* @param req - The state requirements configuration (whitelist and/or blacklist).
|
|
17
|
+
*
|
|
18
|
+
* @throws {Error} If the decorated method is called without a valid Player context (Server-side logic error).
|
|
19
|
+
* @throws {AppError} If the player fails the state validation (Client-facing logic error).
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* // Example 1: Action requires being alive (not dead) and not handcuffed
|
|
24
|
+
* @RequiresState({ missing: ['dead', 'cuffed'] })
|
|
25
|
+
* openInventory(player: Server.Player) { ... }
|
|
26
|
+
*
|
|
27
|
+
* // Example 2: Action requires being a police officer on duty
|
|
28
|
+
* @RequiresState({
|
|
29
|
+
* has: ['police_duty'],
|
|
30
|
+
* missing: ['dead'],
|
|
31
|
+
* errorMessage: 'You must be on duty to access the armory.'
|
|
32
|
+
* })
|
|
33
|
+
* openArmory(player: Server.Player) { ... }
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
function RequiresState(req) {
|
|
37
|
+
return function (target, propertyKey, descriptor) {
|
|
38
|
+
const originalMethod = descriptor.value;
|
|
39
|
+
descriptor.value = async function (...args) {
|
|
40
|
+
const player = args[0];
|
|
41
|
+
if (!player) {
|
|
42
|
+
throw new Error(`@RequiresState used on ${propertyKey} without Player context`);
|
|
43
|
+
}
|
|
44
|
+
if (req.has) {
|
|
45
|
+
for (const state of req.has) {
|
|
46
|
+
if (!player.hasState(state)) {
|
|
47
|
+
throw new utils_1.AppError('GAME_STATE_ERROR', req.errorMessage || `You must be [${state}] to do this.`, 'client');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (req.missing) {
|
|
52
|
+
for (const state of req.missing) {
|
|
53
|
+
if (player.hasState(state)) {
|
|
54
|
+
throw new utils_1.AppError('GAME_STATE_ERROR', req.errorMessage || `You can't do this while you're [${state}].`, 'client');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return originalMethod.apply(this, args);
|
|
59
|
+
};
|
|
60
|
+
return descriptor;
|
|
61
|
+
};
|
|
62
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SecurityAction } from '../types/security.types';
|
|
2
|
+
interface ThrottleOptions {
|
|
3
|
+
limit: number;
|
|
4
|
+
windowMs: number;
|
|
5
|
+
onExceed?: SecurityAction;
|
|
6
|
+
message?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function Throttle(optionsOrLimit: number | ThrottleOptions, windowMs?: number): (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => PropertyDescriptor | undefined;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Throttle = Throttle;
|
|
4
|
+
const tsyringe_1 = require("tsyringe");
|
|
5
|
+
const rate_limiter_service_1 = require("../services/rate-limiter.service");
|
|
6
|
+
const utils_1 = require("../../utils");
|
|
7
|
+
function Throttle(optionsOrLimit, windowMs) {
|
|
8
|
+
return function (target, propertyKey, descriptor) {
|
|
9
|
+
if (!descriptor) {
|
|
10
|
+
// In benchmarks or edge cases, skip method wrapping
|
|
11
|
+
// This should NOT happen in production code with proper TypeScript compilation
|
|
12
|
+
// Note: Throttle cannot work without descriptor, so we just skip it
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const originalMethod = descriptor.value;
|
|
16
|
+
let opts;
|
|
17
|
+
if (typeof optionsOrLimit === 'number') {
|
|
18
|
+
opts = { limit: optionsOrLimit, windowMs: windowMs || 1000, onExceed: 'LOG' };
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
opts = Object.assign({ onExceed: 'LOG' }, optionsOrLimit);
|
|
22
|
+
}
|
|
23
|
+
descriptor.value = async function (...args) {
|
|
24
|
+
const player = args[0];
|
|
25
|
+
if (player === null || player === void 0 ? void 0 : player.clientID) {
|
|
26
|
+
const service = tsyringe_1.container.resolve(rate_limiter_service_1.RateLimiterService);
|
|
27
|
+
const key = `${player.clientID}:${target.constructor.name}:${propertyKey}`;
|
|
28
|
+
if (!service.checkLimit(key, opts.limit, opts.windowMs)) {
|
|
29
|
+
throw new utils_1.SecurityError(opts.onExceed, opts.message || `Rate limit exceeded on ${propertyKey}`, { limit: opts.limit, key });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return originalMethod.apply(this, args);
|
|
33
|
+
};
|
|
34
|
+
return descriptor;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Service = Service;
|
|
4
|
+
exports.Repo = Repo;
|
|
5
|
+
const bind_1 = require("./bind");
|
|
6
|
+
function Service(options) {
|
|
7
|
+
var _a;
|
|
8
|
+
return (0, bind_1.Bind)((_a = options === null || options === void 0 ? void 0 : options.scope) !== null && _a !== void 0 ? _a : 'singleton');
|
|
9
|
+
}
|
|
10
|
+
function Repo(options) {
|
|
11
|
+
var _a;
|
|
12
|
+
return (0, bind_1.Bind)((_a = options === null || options === void 0 ? void 0 : options.scope) !== null && _a !== void 0 ? _a : 'singleton');
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './player';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./player"), exports);
|