@open-core/framework 0.2.4 → 0.2.5

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 (24) hide show
  1. package/dist/runtime/server/bus/internal-event.bus.d.ts +6 -0
  2. package/dist/runtime/server/controllers/session.controller.js +4 -4
  3. package/dist/runtime/server/decorators/onFrameworkEvent.d.ts +15 -6
  4. package/dist/runtime/server/decorators/onFrameworkEvent.js +9 -6
  5. package/dist/runtime/server/entities/player.d.ts +6 -0
  6. package/dist/runtime/server/entities/player.js +12 -0
  7. package/dist/runtime/server/index.d.ts +2 -1
  8. package/dist/runtime/server/index.js +3 -1
  9. package/dist/runtime/server/services/core/player.service.d.ts +0 -11
  10. package/dist/runtime/server/services/core/player.service.js +0 -15
  11. package/dist/runtime/server/services/ports/player-session-lifecycle.port.d.ts +0 -12
  12. package/dist/runtime/server/system/metadata-server.keys.d.ts +1 -1
  13. package/dist/runtime/server/system/metadata-server.keys.js +10 -10
  14. package/dist/runtime/server/system/processors/{coreEvent.processor.d.ts → internalEvent.processor.d.ts} +1 -1
  15. package/dist/runtime/server/system/processors/{coreEvent.processor.js → internalEvent.processor.js} +10 -10
  16. package/dist/runtime/server/system/processors.register.js +2 -2
  17. package/dist/runtime/server/types/index.d.ts +1 -1
  18. package/dist/runtime/server/types/index.js +1 -1
  19. package/dist/runtime/server/types/internal-events.d.ts +19 -0
  20. package/package.json +1 -1
  21. package/dist/runtime/server/bus/core-event-bus.d.ts +0 -6
  22. package/dist/runtime/server/types/core-events.d.ts +0 -22
  23. /package/dist/runtime/server/bus/{core-event-bus.js → internal-event.bus.js} +0 -0
  24. /package/dist/runtime/server/types/{core-events.js → internal-events.js} +0 -0
@@ -0,0 +1,6 @@
1
+ import { InternalEventMap } from '../types/internal-events';
2
+ type InternalEventName = keyof InternalEventMap;
3
+ type InternalEventHandler<E extends InternalEventName> = (payload: InternalEventMap[E]) => void;
4
+ export declare function onFrameworkEvent<E extends InternalEventName>(event: E, handler: InternalEventHandler<E>): () => void;
5
+ export declare function emitFrameworkEvent<E extends InternalEventName>(event: E, payload: InternalEventMap[E]): void;
6
+ export {};
@@ -11,7 +11,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.SessionController = void 0;
13
13
  const shared_1 = require("../../../kernel/shared");
14
- const core_event_bus_1 = require("../bus/core-event-bus");
14
+ const internal_event_bus_1 = require("../bus/internal-event.bus");
15
15
  const decorators_1 = require("../decorators");
16
16
  const onFiveMEvent_1 = require("../decorators/onFiveMEvent");
17
17
  const services_1 = require("../services");
@@ -33,12 +33,12 @@ let SessionController = class SessionController {
33
33
  license: license !== null && license !== void 0 ? license : 'none',
34
34
  });
35
35
  await this.persistance.handleSessionLoad(player);
36
- (0, core_event_bus_1.emitFrameworkEvent)('core:playerSessionCreated', { clientId, license });
36
+ (0, internal_event_bus_1.emitFrameworkEvent)('internal:playerSessionCreated', { clientId, license });
37
37
  setImmediate(() => {
38
38
  const currentPlayer = this.playerDirectory.getByClient(clientId);
39
39
  if (!currentPlayer)
40
40
  return;
41
- (0, core_event_bus_1.emitFrameworkEvent)('core:playerFullyConnected', { clientId, license });
41
+ (0, internal_event_bus_1.emitFrameworkEvent)('internal:playerFullyConnected', currentPlayer);
42
42
  });
43
43
  }
44
44
  async onPlayerDropped() {
@@ -48,7 +48,7 @@ let SessionController = class SessionController {
48
48
  await this.persistance.handleSessionSave(player);
49
49
  }
50
50
  this.playerSessionLifecycle.unbind(clientId);
51
- (0, core_event_bus_1.emitFrameworkEvent)('core:playerSessionDestroyed', { clientId });
51
+ (0, internal_event_bus_1.emitFrameworkEvent)('internal:playerSessionDestroyed', { clientId });
52
52
  shared_1.loggers.session.info(`Player session destroyed`, { clientId });
53
53
  }
54
54
  };
@@ -1,4 +1,9 @@
1
- import { CoreEventMap } from '../types/core-events';
1
+ import { InternalEventMap } from '../types/internal-events';
2
+ /**
3
+ * Handler function type for framework events.
4
+ * Accepts the event payload and returns void or Promise<void>.
5
+ */
6
+ type FrameworkEventHandler<K extends keyof InternalEventMap> = (payload: InternalEventMap[K]) => void | Promise<void>;
2
7
  /**
3
8
  * Registers a method as a listener for an internal OpenCore framework event.
4
9
  *
@@ -6,17 +11,21 @@ import { CoreEventMap } from '../types/core-events';
6
11
  * This decorator only stores metadata. The framework binds listeners during bootstrap by scanning
7
12
  * controller methods.
8
13
  *
9
- * @param event - Core event name, strongly typed to {@link CoreEventMap}.
14
+ * The method signature is type-checked against the event payload. TypeScript will error if
15
+ * the handler parameter type doesn't match the expected payload for the specified event.
16
+ *
17
+ * @param event - Core event name, strongly typed to {@link InternalEventMap}.
10
18
  *
11
19
  * @example
12
20
  * ```ts
13
21
  * @Server.Controller()
14
22
  * export class SystemController {
15
- * @Server.OnFrameworkEvent('server:ready')
16
- * onServerReady() {
17
- * console.log('OpenCore framework is ready')
23
+ * @Server.OnFrameworkEvent('core:playerSessionCreated')
24
+ * onPlayerSession(payload: PlayerSessionCreatedPayload) {
25
+ * console.log(`Player ${payload.clientId} connected`)
18
26
  * }
19
27
  * }
20
28
  * ```
21
29
  */
22
- export declare function OnFrameworkEvent<K extends keyof CoreEventMap>(event: K): (target: any, propertyKey: string) => void;
30
+ export declare function OnFrameworkEvent<K extends keyof InternalEventMap>(event: K): (target: object, propertyKey: string | symbol, _descriptor: TypedPropertyDescriptor<FrameworkEventHandler<K>>) => void;
31
+ export {};
@@ -9,21 +9,24 @@ const metadata_server_keys_1 = require("../system/metadata-server.keys");
9
9
  * This decorator only stores metadata. The framework binds listeners during bootstrap by scanning
10
10
  * controller methods.
11
11
  *
12
- * @param event - Core event name, strongly typed to {@link CoreEventMap}.
12
+ * The method signature is type-checked against the event payload. TypeScript will error if
13
+ * the handler parameter type doesn't match the expected payload for the specified event.
14
+ *
15
+ * @param event - Core event name, strongly typed to {@link InternalEventMap}.
13
16
  *
14
17
  * @example
15
18
  * ```ts
16
19
  * @Server.Controller()
17
20
  * export class SystemController {
18
- * @Server.OnFrameworkEvent('server:ready')
19
- * onServerReady() {
20
- * console.log('OpenCore framework is ready')
21
+ * @Server.OnFrameworkEvent('core:playerSessionCreated')
22
+ * onPlayerSession(payload: PlayerSessionCreatedPayload) {
23
+ * console.log(`Player ${payload.clientId} connected`)
21
24
  * }
22
25
  * }
23
26
  * ```
24
27
  */
25
28
  function OnFrameworkEvent(event) {
26
- return (target, propertyKey) => {
27
- Reflect.defineMetadata(metadata_server_keys_1.METADATA_KEYS.CORE_EVENT, { event }, target, propertyKey);
29
+ return (target, propertyKey, _descriptor) => {
30
+ Reflect.defineMetadata(metadata_server_keys_1.METADATA_KEYS.INTERNAL_EVENT, { event }, target, propertyKey);
28
31
  };
29
32
  }
@@ -65,6 +65,11 @@ export declare class Player {
65
65
  * @returns An array of identifier strings (e.g., `['steam:11000...', 'license:2332...']`).
66
66
  */
67
67
  getIdentifiers(): string[];
68
+ /**
69
+ * FiveM license
70
+ */
71
+ getLicense(): string | undefined;
72
+ getIdentifier(identifier: string): string | undefined;
68
73
  /**
69
74
  * Sends a network event exclusively to this specific player (Client-side).
70
75
  * Wrapper for `emitNet` ensuring the correct target Source ID is used.
@@ -130,6 +135,7 @@ export declare class Player {
130
135
  * @param accountID - The unique ID from the database.
131
136
  */
132
137
  linkAccount(accountID: LinkedID): void;
138
+ unlinkAccount(): void;
133
139
  /**
134
140
  * Checks if the player currently possesses a specific state flag.
135
141
  *
@@ -67,6 +67,15 @@ class Player {
67
67
  getIdentifiers() {
68
68
  return this.adapters.playerServer.getIdentifiers(this.clientIDStr);
69
69
  }
70
+ /**
71
+ * FiveM license
72
+ */
73
+ getLicense() {
74
+ return this.adapters.playerServer.getIdentifier(this.clientIDStr, 'license');
75
+ }
76
+ getIdentifier(identifier) {
77
+ return this.adapters.playerServer.getIdentifier(this.clientIDStr, identifier);
78
+ }
70
79
  /**
71
80
  * Sends a network event exclusively to this specific player (Client-side).
72
81
  * Wrapper for `emitNet` ensuring the correct target Source ID is used.
@@ -153,6 +162,9 @@ class Player {
153
162
  linkAccount(accountID) {
154
163
  this.session.accountID = accountID;
155
164
  }
165
+ unlinkAccount() {
166
+ this.session.accountID = undefined;
167
+ }
156
168
  /**
157
169
  * Checks if the player currently possesses a specific state flag.
158
170
  *
@@ -1,4 +1,5 @@
1
1
  export * from './bootstrap.validation';
2
+ export { onFrameworkEvent } from './bus/internal-event.bus';
2
3
  export * from './configs';
3
4
  export * from './contracts/index';
4
5
  export { init } from './core';
@@ -9,4 +10,4 @@ export * from './runtime';
9
10
  export * from './services';
10
11
  export * from './setup';
11
12
  export * from './templates';
12
- export type * from './types/core-events';
13
+ export type * from './types/internal-events';
@@ -15,8 +15,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
16
16
  };
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.init = void 0;
18
+ exports.init = exports.onFrameworkEvent = void 0;
19
19
  __exportStar(require("./bootstrap.validation"), exports);
20
+ var internal_event_bus_1 = require("./bus/internal-event.bus");
21
+ Object.defineProperty(exports, "onFrameworkEvent", { enumerable: true, get: function () { return internal_event_bus_1.onFrameworkEvent; } });
20
22
  // Configs
21
23
  __exportStar(require("./configs"), exports);
22
24
  __exportStar(require("./contracts/index"), exports);
@@ -5,7 +5,6 @@ import { IPlayerServer } from '../../../../adapters/contracts/IPlayerServer';
5
5
  import { Player } from '../../entities';
6
6
  import { PlayerDirectoryPort } from '../ports/player-directory.port';
7
7
  import { PlayerSessionLifecyclePort } from '../ports/player-session-lifecycle.port';
8
- import { LinkedID } from '../types/linked-id';
9
8
  import { PlayerSession } from '../types/player-session.object';
10
9
  /**
11
10
  * Service responsible for managing the lifecycle of player sessions.
@@ -41,16 +40,6 @@ export declare class PlayerService implements PlayerDirectoryPort, PlayerSession
41
40
  * @returns The newly created `Player` instance.
42
41
  */
43
42
  bind(clientID: number, identifiers?: PlayerSession['identifiers']): Player;
44
- /**
45
- * Associates an authenticated Account ID (database ID) with an active player session.
46
- *
47
- * Call this method once the player has successfully authenticated (e.g., after character selection
48
- * or login) to link their session to their persistent data.
49
- *
50
- * @param clientID - The FiveM server ID of the player.
51
- * @param accountID - The unique identifier from your database/persistence layer.
52
- */
53
- linkAccount(clientID: number, accountID: LinkedID): void;
54
43
  /**
55
44
  * Terminates a player session and removes them from the registry.
56
45
  *
@@ -70,21 +70,6 @@ let PlayerService = class PlayerService {
70
70
  });
71
71
  return player;
72
72
  }
73
- /**
74
- * Associates an authenticated Account ID (database ID) with an active player session.
75
- *
76
- * Call this method once the player has successfully authenticated (e.g., after character selection
77
- * or login) to link their session to their persistent data.
78
- *
79
- * @param clientID - The FiveM server ID of the player.
80
- * @param accountID - The unique identifier from your database/persistence layer.
81
- */
82
- linkAccount(clientID, accountID) {
83
- const player = this.playersByClient.get(clientID);
84
- if (!player)
85
- return;
86
- player.linkAccount(accountID);
87
- }
88
73
  /**
89
74
  * Terminates a player session and removes them from the registry.
90
75
  *
@@ -1,5 +1,4 @@
1
1
  import { Player } from '../../entities';
2
- import { LinkedID } from '../types/linked-id';
3
2
  import { PlayerSession } from '../types/player-session.object';
4
3
  /**
5
4
  * Core port responsible for managing the lifecycle of player sessions.
@@ -35,15 +34,4 @@ export declare abstract class PlayerSessionLifecyclePort {
35
34
  * @param clientID - The FiveM server client ID (`source`).
36
35
  */
37
36
  abstract unbind(clientID: number): void;
38
- /**
39
- * Links an authenticated account to an existing player session.
40
- *
41
- * @remarks
42
- * This method is typically invoked after successful authentication or
43
- * character selection to associate persistent data with the active session.
44
- *
45
- * @param clientID - The FiveM server client ID (`source`).
46
- * @param accountID - The persistent account identifier.
47
- */
48
- abstract linkAccount(clientID: number, accountID: LinkedID): void;
49
37
  }
@@ -3,7 +3,7 @@ export declare const METADATA_KEYS: {
3
3
  COMMAND: string;
4
4
  NET_EVENT: string;
5
5
  TICK: string;
6
- CORE_EVENT: string;
6
+ INTERNAL_EVENT: string;
7
7
  FIVEM_EVENT: string;
8
8
  EXPORT: string;
9
9
  PUBLIC: string;
@@ -2,14 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.METADATA_KEYS = void 0;
4
4
  exports.METADATA_KEYS = {
5
- CONTROLLER: 'core:meta:controller',
6
- COMMAND: 'core:meta:command',
7
- NET_EVENT: 'core:meta:net_event',
8
- TICK: 'core:meta:tick',
9
- CORE_EVENT: 'core:meta:core_event',
10
- FIVEM_EVENT: 'core:meta:fivem_event',
11
- EXPORT: 'core:meta:export',
12
- PUBLIC: 'core:meta:public',
13
- THROTTLE: 'core:throttle',
14
- REQUIRES_STATE: 'core:requires_state',
5
+ CONTROLLER: 'decorator:meta:controller',
6
+ COMMAND: 'decorator:meta:command',
7
+ NET_EVENT: 'decorator:meta:net_event',
8
+ TICK: 'decorator:meta:tick',
9
+ INTERNAL_EVENT: 'decorator:meta:internal_event',
10
+ FIVEM_EVENT: 'decorator:meta:fivem_event',
11
+ EXPORT: 'decorator:meta:export',
12
+ PUBLIC: 'decorator:meta:public',
13
+ THROTTLE: 'decorator:throttle',
14
+ REQUIRES_STATE: 'decorator:requires_state',
15
15
  };
@@ -1,5 +1,5 @@
1
1
  import { DecoratorProcessor } from '../../../../kernel/di/decorator-processor';
2
- export declare class CoreEventProcessor implements DecoratorProcessor {
2
+ export declare class InternalEventProcessor implements DecoratorProcessor {
3
3
  readonly metadataKey: string;
4
4
  process(instance: any, methodName: string, metadata: {
5
5
  event: string;
@@ -6,27 +6,27 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.CoreEventProcessor = void 0;
9
+ exports.InternalEventProcessor = void 0;
10
10
  const tsyringe_1 = require("tsyringe");
11
11
  const logger_1 = require("../../../../kernel/shared/logger");
12
- const core_event_bus_1 = require("../../bus/core-event-bus");
12
+ const internal_event_bus_1 = require("../../bus/internal-event.bus");
13
13
  const resolve_method_1 = require("../../helpers/resolve-method");
14
14
  const metadata_server_keys_1 = require("../metadata-server.keys");
15
- let CoreEventProcessor = class CoreEventProcessor {
15
+ let InternalEventProcessor = class InternalEventProcessor {
16
16
  constructor() {
17
- this.metadataKey = metadata_server_keys_1.METADATA_KEYS.CORE_EVENT;
17
+ this.metadataKey = metadata_server_keys_1.METADATA_KEYS.INTERNAL_EVENT;
18
18
  }
19
19
  process(instance, methodName, metadata) {
20
- const result = (0, resolve_method_1.resolveMethod)(instance, methodName, `[CoreEventProcessor] Method "${methodName}" not found`);
20
+ const result = (0, resolve_method_1.resolveMethod)(instance, methodName, `[InternalEventProcessor] Method "${methodName}" not found`);
21
21
  if (!result)
22
22
  return;
23
23
  const { handler, handlerName } = result;
24
- (0, core_event_bus_1.onFrameworkEvent)(metadata.event, (payload) => {
24
+ (0, internal_event_bus_1.onFrameworkEvent)(metadata.event, (payload) => {
25
25
  try {
26
26
  handler(payload);
27
27
  }
28
28
  catch (error) {
29
- logger_1.loggers.eventBus.error(`Handler error in CoreEvent`, {
29
+ logger_1.loggers.eventBus.error(`Handler error in InternalEvent`, {
30
30
  event: metadata.event,
31
31
  handler: handlerName,
32
32
  }, error);
@@ -35,7 +35,7 @@ let CoreEventProcessor = class CoreEventProcessor {
35
35
  logger_1.loggers.eventBus.debug(`Registered: ${metadata.event} -> ${handlerName}`);
36
36
  }
37
37
  };
38
- exports.CoreEventProcessor = CoreEventProcessor;
39
- exports.CoreEventProcessor = CoreEventProcessor = __decorate([
38
+ exports.InternalEventProcessor = InternalEventProcessor;
39
+ exports.InternalEventProcessor = InternalEventProcessor = __decorate([
40
40
  (0, tsyringe_1.injectable)()
41
- ], CoreEventProcessor);
41
+ ], InternalEventProcessor);
@@ -7,9 +7,9 @@ const security_handler_contract_1 = require("../contracts/security/security-hand
7
7
  const default_net_event_security_observer_1 = require("../services/default/default-net-event-security-observer");
8
8
  const default_security_handler_1 = require("../services/default/default-security.handler");
9
9
  const command_processor_1 = require("./processors/command.processor");
10
- const coreEvent_processor_1 = require("./processors/coreEvent.processor");
11
10
  const export_processor_1 = require("./processors/export.processor");
12
11
  const fivemEvent_processor_1 = require("./processors/fivemEvent.processor");
12
+ const internalEvent_processor_1 = require("./processors/internalEvent.processor");
13
13
  const netEvent_processor_1 = require("./processors/netEvent.processor");
14
14
  const tick_processor_1 = require("./processors/tick.processor");
15
15
  function registerSystemServer(ctx) {
@@ -27,7 +27,7 @@ function registerSystemServer(ctx) {
27
27
  if (features.exports.enabled) {
28
28
  index_1.di.register('DecoratorProcessor', { useClass: export_processor_1.ExportProcessor });
29
29
  }
30
- index_1.di.register('DecoratorProcessor', { useClass: coreEvent_processor_1.CoreEventProcessor });
30
+ index_1.di.register('DecoratorProcessor', { useClass: internalEvent_processor_1.InternalEventProcessor });
31
31
  if (features.commands.enabled) {
32
32
  index_1.di.register('DecoratorProcessor', { useClass: command_processor_1.CommandProcessor });
33
33
  }
@@ -1,4 +1,4 @@
1
- export * from './core-events';
2
1
  export * from './core-exports';
2
+ export * from './internal-events';
3
3
  export * from './security.types';
4
4
  export * from './vehicle.types';
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./core-events"), exports);
18
17
  __exportStar(require("./core-exports"), exports);
18
+ __exportStar(require("./internal-events"), exports);
19
19
  __exportStar(require("./security.types"), exports);
20
20
  __exportStar(require("./vehicle.types"), exports);
@@ -0,0 +1,19 @@
1
+ import { Player } from '../entities';
2
+ export interface PlayerSessionCreatedPayload {
3
+ clientId: number;
4
+ license: string;
5
+ }
6
+ export interface PlayerSessionDestroyedPayload {
7
+ clientId: number;
8
+ }
9
+ export interface TransferCompletedPayload {
10
+ playerId: number;
11
+ amount: number;
12
+ targetId: number;
13
+ }
14
+ export type InternalEventMap = {
15
+ 'internal:playerSessionCreated': PlayerSessionCreatedPayload;
16
+ 'internal:playerSessionDestroyed': PlayerSessionDestroyedPayload;
17
+ 'internal:transfer:completed': TransferCompletedPayload;
18
+ 'internal:playerFullyConnected': Player;
19
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-core/framework",
3
- "version": "0.2.4",
3
+ "version": "0.2.5",
4
4
  "description": "Secure, Event-Driven, OOP Engine for FiveM. Stop scripting, start engineering.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1,6 +0,0 @@
1
- import { CoreEventMap } from '../types/core-events';
2
- type CoreEventName = keyof CoreEventMap;
3
- type CoreEventHandler<E extends CoreEventName> = (payload: CoreEventMap[E]) => void;
4
- export declare function onFrameworkEvent<E extends CoreEventName>(event: E, handler: CoreEventHandler<E>): () => void;
5
- export declare function emitFrameworkEvent<E extends CoreEventName>(event: E, payload: CoreEventMap[E]): void;
6
- export {};
@@ -1,22 +0,0 @@
1
- export interface PlayerSessionCreatedPayload {
2
- clientId: number;
3
- license: string;
4
- }
5
- export interface PlayerSessionDestroyedPayload {
6
- clientId: number;
7
- }
8
- export interface TransferCompletedPayload {
9
- playerId: number;
10
- amount: number;
11
- targetId: number;
12
- }
13
- export interface PlayerFullyConnectedPayload {
14
- clientId: number;
15
- license: string;
16
- }
17
- export type CoreEventMap = {
18
- 'core:playerSessionCreated': PlayerSessionCreatedPayload;
19
- 'core:playerSessionDestroyed': PlayerSessionDestroyedPayload;
20
- 'core:transfer:completed': TransferCompletedPayload;
21
- 'core:playerFullyConnected': PlayerFullyConnectedPayload;
22
- };