@open-core/framework 1.0.5-beta.2 → 1.0.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 (122) hide show
  1. package/dist/adapters/contracts/IEngineEvents.d.ts +3 -3
  2. package/dist/adapters/contracts/IExports.d.ts +2 -2
  3. package/dist/adapters/contracts/client/IClientLocalPlayerBridge.d.ts +21 -0
  4. package/dist/adapters/contracts/client/IClientLocalPlayerBridge.js +6 -0
  5. package/dist/adapters/contracts/client/IClientRuntimeBridge.d.ts +5 -5
  6. package/dist/adapters/contracts/client/camera/IClientCameraPort.d.ts +107 -0
  7. package/dist/adapters/contracts/client/camera/IClientCameraPort.js +8 -0
  8. package/dist/adapters/contracts/client/camera/index.d.ts +1 -0
  9. package/dist/adapters/contracts/client/camera/index.js +1 -0
  10. package/dist/adapters/contracts/client/index.d.ts +4 -0
  11. package/dist/adapters/contracts/client/index.js +4 -0
  12. package/dist/adapters/contracts/client/ped/IClientPedPort.d.ts +62 -0
  13. package/dist/adapters/contracts/client/ped/IClientPedPort.js +5 -0
  14. package/dist/adapters/contracts/client/ped/index.d.ts +1 -0
  15. package/dist/adapters/contracts/client/ped/index.js +1 -0
  16. package/dist/adapters/contracts/client/progress/IClientProgressPort.d.ts +53 -0
  17. package/dist/adapters/contracts/client/progress/IClientProgressPort.js +8 -0
  18. package/dist/adapters/contracts/client/progress/index.d.ts +1 -0
  19. package/dist/adapters/contracts/client/progress/index.js +1 -0
  20. package/dist/adapters/contracts/client/spawn/IClientSpawnBridge.d.ts +5 -6
  21. package/dist/adapters/contracts/client/spawn/IClientSpawnBridge.js +5 -1
  22. package/dist/adapters/contracts/client/spawn/IClientSpawnPort.d.ts +19 -0
  23. package/dist/adapters/contracts/client/spawn/IClientSpawnPort.js +2 -0
  24. package/dist/adapters/contracts/client/spawn/index.d.ts +2 -0
  25. package/dist/adapters/contracts/client/spawn/index.js +2 -0
  26. package/dist/adapters/contracts/client/spawn/types.d.ts +3 -0
  27. package/dist/adapters/contracts/client/ui/webview/IClientWebViewBridge.d.ts +1 -0
  28. package/dist/adapters/contracts/client/ui/webview/types.d.ts +2 -0
  29. package/dist/adapters/contracts/client/vehicle/IClientVehiclePort.d.ts +166 -0
  30. package/dist/adapters/contracts/client/vehicle/IClientVehiclePort.js +8 -0
  31. package/dist/adapters/contracts/client/vehicle/index.d.ts +1 -0
  32. package/dist/adapters/contracts/client/vehicle/index.js +1 -0
  33. package/dist/adapters/contracts/transport/events.api.d.ts +3 -3
  34. package/dist/adapters/contracts/transport/rpc.api.d.ts +3 -3
  35. package/dist/adapters/node/transport/node.events.d.ts +4 -4
  36. package/dist/adapters/node/transport/node.rpc.d.ts +3 -3
  37. package/dist/adapters/node/transport/node.rpc.js +1 -1
  38. package/dist/contracts.d.ts +1 -0
  39. package/dist/contracts.js +1 -0
  40. package/dist/index.d.ts +1 -0
  41. package/dist/index.js +1 -0
  42. package/dist/kernel/logger/client-log-console.js +8 -8
  43. package/dist/kernel/logger/index.d.ts +1 -1
  44. package/dist/kernel/logger/index.js +1 -1
  45. package/dist/kernel/logger/logger.types.d.ts +1 -0
  46. package/dist/kernel/logger/logger.types.js +35 -0
  47. package/dist/kernel/logger/transports/buffered.transport.js +4 -4
  48. package/dist/kernel/logger/transports/console.transport.js +2 -2
  49. package/dist/kernel/logger/transports/simple-console.transport.js +2 -2
  50. package/dist/runtime/client/adapter/index.d.ts +5 -0
  51. package/dist/runtime/client/adapter/index.js +5 -0
  52. package/dist/runtime/client/adapter/node-camera-port.d.ts +19 -0
  53. package/dist/runtime/client/adapter/node-camera-port.js +31 -0
  54. package/dist/runtime/client/adapter/node-client-adapter.js +15 -1
  55. package/dist/runtime/client/adapter/node-local-player-bridge.d.ts +3 -0
  56. package/dist/runtime/client/adapter/node-local-player-bridge.js +9 -0
  57. package/dist/runtime/client/adapter/node-log-console.js +8 -8
  58. package/dist/runtime/client/adapter/node-ped-port.d.ts +20 -0
  59. package/dist/runtime/client/adapter/node-ped-port.js +38 -0
  60. package/dist/runtime/client/adapter/node-progress-port.d.ts +8 -0
  61. package/dist/runtime/client/adapter/node-progress-port.js +27 -0
  62. package/dist/runtime/client/adapter/node-runtime-bridge.d.ts +2 -4
  63. package/dist/runtime/client/adapter/node-spawn-bridge.d.ts +5 -5
  64. package/dist/runtime/client/adapter/node-spawn-bridge.js +8 -4
  65. package/dist/runtime/client/adapter/node-vehicle-port.d.ts +31 -0
  66. package/dist/runtime/client/adapter/node-vehicle-port.js +73 -0
  67. package/dist/runtime/client/adapter/node-webview-bridge.d.ts +1 -0
  68. package/dist/runtime/client/adapter/node-webview-bridge.js +2 -0
  69. package/dist/runtime/client/controllers/appearance.controller.d.ts +3 -3
  70. package/dist/runtime/client/controllers/appearance.controller.js +11 -10
  71. package/dist/runtime/client/controllers/spawner.controller.js +4 -3
  72. package/dist/runtime/client/services/camera.d.ts +4 -26
  73. package/dist/runtime/client/services/camera.js +21 -27
  74. package/dist/runtime/client/services/notification.service.d.ts +3 -3
  75. package/dist/runtime/client/services/notification.service.js +7 -7
  76. package/dist/runtime/client/services/ped.service.d.ts +6 -21
  77. package/dist/runtime/client/services/ped.service.js +31 -78
  78. package/dist/runtime/client/services/progress.service.d.ts +4 -50
  79. package/dist/runtime/client/services/progress.service.js +11 -143
  80. package/dist/runtime/client/services/session-bridge.service.js +3 -2
  81. package/dist/runtime/client/services/spawn.service.d.ts +3 -5
  82. package/dist/runtime/client/services/spawn.service.js +12 -17
  83. package/dist/runtime/client/services/vehicle-client.service.d.ts +3 -3
  84. package/dist/runtime/client/services/vehicle-client.service.js +43 -143
  85. package/dist/runtime/client/services/vehicle.service.d.ts +4 -41
  86. package/dist/runtime/client/services/vehicle.service.js +24 -130
  87. package/dist/runtime/client/webview-bridge.d.ts +3 -0
  88. package/dist/runtime/client/webview-bridge.js +6 -0
  89. package/dist/runtime/client/webview.service.d.ts +1 -0
  90. package/dist/runtime/client/webview.service.js +5 -0
  91. package/dist/runtime/server/adapter/node-player-appearance-lifecycle-server.js +3 -2
  92. package/dist/runtime/server/adapter/node-player-lifecycle-server.js +4 -3
  93. package/dist/runtime/server/adapter/node-vehicle-lifecycle-server.js +2 -1
  94. package/dist/runtime/server/apis/chat.api.js +6 -5
  95. package/dist/runtime/server/apis/npcs.api.js +2 -1
  96. package/dist/runtime/server/apis/parallel-compute.api.js +1 -0
  97. package/dist/runtime/server/apis/vehicle-modification.api.js +6 -4
  98. package/dist/runtime/server/apis/vehicles.api.js +7 -4
  99. package/dist/runtime/server/bootstrap.js +13 -12
  100. package/dist/runtime/server/controllers/command-export.controller.js +4 -2
  101. package/dist/runtime/server/controllers/remote-command-execution.controller.js +2 -1
  102. package/dist/runtime/server/controllers/vehicle.controller.js +6 -5
  103. package/dist/runtime/server/decorators/command.d.ts +2 -0
  104. package/dist/runtime/server/decorators/command.js +3 -1
  105. package/dist/runtime/server/entities/npc.d.ts +1 -1
  106. package/dist/runtime/server/entities/player.d.ts +1 -1
  107. package/dist/runtime/server/entities/player.js +10 -3
  108. package/dist/runtime/server/helpers/command-validation.helper.js +20 -7
  109. package/dist/runtime/server/helpers/function-helper.d.ts +1 -0
  110. package/dist/runtime/server/helpers/function-helper.js +15 -8
  111. package/dist/runtime/server/implementations/local/channel.local.d.ts +1 -1
  112. package/dist/runtime/server/implementations/local/channel.local.js +3 -2
  113. package/dist/runtime/server/ports/channel.api-port.d.ts +1 -1
  114. package/dist/runtime/server/services/parallel/worker-pool.d.ts +1 -1
  115. package/dist/runtime/server/services/parallel/worker-pool.js +38 -6
  116. package/dist/runtime/server/services/parallel/worker.js +1 -0
  117. package/dist/runtime/server/system/schema-generator.d.ts +1 -1
  118. package/dist/runtime/server/system/schema-generator.js +6 -3
  119. package/dist/runtime/shared/helpers/process-tuple-schema.js +3 -0
  120. package/dist/runtime/shared/types/system-types.d.ts +55 -0
  121. package/dist/runtime/shared/types/system-types.js +54 -0
  122. package/package.json +21 -11
@@ -1,6 +1,6 @@
1
1
  import { EventContext, RuntimeContext } from './context';
2
2
  import { Player } from '../../../runtime/server/entities/player';
3
- type EmitArgs<C extends RuntimeContext> = C extends 'server' ? [target: Player | number | number[] | 'all', ...args: any[]] : [...args: any[]];
3
+ type EmitArgs<C extends RuntimeContext> = C extends 'server' ? [target: Player | number | number[] | 'all', ...args: unknown[]] : [...args: unknown[]];
4
4
  /**
5
5
  * broadcast and listen to events without relying on runtime. The adapter will be used.
6
6
  */
@@ -13,7 +13,7 @@ export declare abstract class EventsAPI<C extends RuntimeContext> {
13
13
  * Client:
14
14
  * - triggered by server
15
15
  */
16
- abstract on(event: string, handler: (ctx: EventContext, ...args: any[]) => void | Promise<void>): void;
16
+ abstract on<TArgs extends readonly unknown[]>(event: string, handler: (ctx: EventContext, ...args: TArgs) => void | Promise<void>): void;
17
17
  /**
18
18
  * Emit an event.
19
19
  * SERVER → CLIENT
@@ -22,7 +22,7 @@ export declare abstract class EventsAPI<C extends RuntimeContext> {
22
22
  * Client:
23
23
  * - sends to server, targetOrArg will be ignored
24
24
  */
25
- abstract emit(event: string, target: Player | number | number[] | 'all', ...args: any[]): void;
25
+ abstract emit(event: string, target: Player | number | number[] | 'all', ...args: unknown[]): void;
26
26
  /**
27
27
  * Emit an event.
28
28
  * CLIENT → SERVER
@@ -14,8 +14,8 @@ export interface RpcContext extends EventContext {
14
14
  */
15
15
  export type RpcTarget = number | number[] | 'all';
16
16
  export type RpcCallTarget = number | number[];
17
- type RpcCallArgs<C extends RuntimeContext> = C extends 'server' ? [target: RpcCallTarget, ...args: any[]] : [...args: any[]];
18
- type RpcNotifyArgs<C extends RuntimeContext> = C extends 'server' ? [target: RpcTarget, ...args: any[]] : [...args: any[]];
17
+ type RpcCallArgs<C extends RuntimeContext> = C extends 'server' ? [target: RpcCallTarget, ...args: unknown[]] : [...args: unknown[]];
18
+ type RpcNotifyArgs<C extends RuntimeContext> = C extends 'server' ? [target: RpcTarget, ...args: unknown[]] : [...args: unknown[]];
19
19
  /**
20
20
  * Remote Procedure Call API.
21
21
  *
@@ -47,7 +47,7 @@ export declare abstract class RpcAPI<C extends RuntimeContext> {
47
47
  * The handler receives a {@link RpcContext}. In server environments this usually includes
48
48
  * the `clientId` of the caller (via {@link EventContext}).
49
49
  */
50
- abstract on<TArgs extends any[], TResult>(name: string, handler: (ctx: RpcContext, ...args: TArgs) => TResult | Promise<TResult>): void;
50
+ abstract on<TArgs extends readonly unknown[], TResult>(name: string, handler: (ctx: RpcContext, ...args: TArgs) => TResult | Promise<TResult>): void;
51
51
  /**
52
52
  * Call an RPC and wait for the result.
53
53
  *
@@ -3,12 +3,12 @@ import { RuntimeContext } from '../../contracts/transport/context';
3
3
  type NodeTarget = number | number[] | 'all';
4
4
  export declare class NodeEvents extends EventsAPI<RuntimeContext> {
5
5
  private readonly emitter;
6
- on(event: string, handler: (ctx: {
6
+ on<TArgs extends readonly unknown[]>(event: string, handler: (ctx: {
7
7
  clientId?: number;
8
8
  raw?: unknown;
9
- }, ...args: any[]) => any): void;
10
- emit(event: string, targetOrArg?: NodeTarget | any, ...args: any[]): void;
11
- simulateClientEvent(event: string, clientId: number, ...args: any[]): void;
9
+ }, ...args: TArgs) => unknown): void;
10
+ emit(event: string, targetOrArg?: NodeTarget | unknown, ...args: unknown[]): void;
11
+ simulateClientEvent(event: string, clientId: number, ...args: unknown[]): void;
12
12
  clearHandlers(): void;
13
13
  }
14
14
  export {};
@@ -4,13 +4,13 @@ export declare class NodeRpc<C extends RuntimeContext = RuntimeContext> extends
4
4
  private readonly context;
5
5
  private readonly handlers;
6
6
  constructor(context: C);
7
- on<TArgs extends any[], TResult>(name: string, handler: (ctx: {
7
+ on<TArgs extends readonly unknown[], TResult>(name: string, handler: (ctx: {
8
8
  requestId: string;
9
9
  clientId?: number;
10
10
  raw?: unknown;
11
11
  }, ...args: TArgs) => TResult | Promise<TResult>): void;
12
- call<TResult = unknown>(name: string, ...args: any[]): Promise<TResult>;
13
- notify(name: string, ...args: any[]): Promise<void>;
12
+ call<TResult = unknown>(name: string, ...args: unknown[]): Promise<TResult>;
13
+ notify(name: string, ...args: unknown[]): Promise<void>;
14
14
  private normalizeInvocation;
15
15
  private isValidTarget;
16
16
  private executeCall;
@@ -8,7 +8,7 @@ export class NodeRpc extends RpcAPI {
8
8
  this.context = context;
9
9
  }
10
10
  on(name, handler) {
11
- this.handlers.set(name, handler);
11
+ this.handlers.set(name, (ctx, ...args) => handler(ctx, ...args));
12
12
  }
13
13
  call(name, ...args) {
14
14
  const { target, payload } = this.normalizeInvocation(name, 'call', args);
@@ -2,3 +2,4 @@ export * from './adapters/contracts/IHasher';
2
2
  export * from './adapters/contracts/transport';
3
3
  export * from './adapters/contracts/types';
4
4
  export * from './adapters/contracts/runtime';
5
+ export * from './runtime/shared/types/system-types';
package/dist/contracts.js CHANGED
@@ -2,3 +2,4 @@ export * from './adapters/contracts/IHasher';
2
2
  export * from './adapters/contracts/transport';
3
3
  export * from './adapters/contracts/types';
4
4
  export * from './adapters/contracts/runtime';
5
+ export * from './runtime/shared/types/system-types';
package/dist/index.d.ts CHANGED
@@ -2,3 +2,4 @@ import 'reflect-metadata';
2
2
  export * from './kernel';
3
3
  export * from './runtime/core';
4
4
  export * from './contracts';
5
+ export * from './runtime/shared/types/system-types';
package/dist/index.js CHANGED
@@ -2,3 +2,4 @@ import 'reflect-metadata';
2
2
  export * from './kernel';
3
3
  export * from './runtime/core';
4
4
  export * from './contracts';
5
+ export * from './runtime/shared/types/system-types';
@@ -9,26 +9,26 @@ class DefaultClientLogConsole extends IClientLogConsole {
9
9
  return DEFAULT_CLIENT_LOG_CONSOLE_CAPABILITIES;
10
10
  }
11
11
  trace(message, details) {
12
- this.write(console.debug, message, details);
12
+ this.write('debug', message, details);
13
13
  }
14
14
  debug(message, details) {
15
- this.write(console.debug, message, details);
15
+ this.write('debug', message, details);
16
16
  }
17
17
  info(message, details) {
18
- this.write(console.info, message, details);
18
+ this.write('info', message, details);
19
19
  }
20
20
  warn(message, details) {
21
- this.write(console.warn, message, details);
21
+ this.write('warn', message, details);
22
22
  }
23
23
  error(message, details) {
24
- this.write(console.error, message, details);
24
+ this.write('error', message, details);
25
25
  }
26
- write(method, message, details) {
26
+ write(level, message, details) {
27
27
  if (details === undefined) {
28
- method(message);
28
+ console[level](message);
29
29
  return;
30
30
  }
31
- method(message, details);
31
+ console[level](message, details);
32
32
  }
33
33
  }
34
34
  let activeClientLogConsole = new DefaultClientLogConsole();
@@ -6,7 +6,7 @@ export { getLogLevel, isClientEnvironment, isDebugMode, isFiveMEnvironment, isSe
6
6
  export { ChildLogger, LoggerService } from './logger.service';
7
7
  export type { ClientLogConsoleCapabilities } from '../../adapters/contracts/client/IClientLogConsole';
8
8
  export type { LogContext, LogEntry } from './logger.types';
9
- export { LogDomain, LogDomainLabels, LogLevel, LogLevelLabels, parseLogLevel } from './logger.types';
9
+ export { getLogDomainLabel, LogDomain, LogDomainLabels, LogLevel, LogLevelLabels, parseLogLevel, } from './logger.types';
10
10
  export type { BufferedTransportOptions, LogOutputFormat } from './transports/buffered.transport';
11
11
  export { BufferedTransport } from './transports/buffered.transport';
12
12
  export type { ConsoleTransportOptions } from './transports/console.transport';
@@ -7,7 +7,7 @@ export { createLoggerConfig, DEFAULT_LOGGER_CONFIG } from './logger.config';
7
7
  export { getLogLevel, isClientEnvironment, isDebugMode, isFiveMEnvironment, isServerEnvironment, } from './logger.env';
8
8
  // Service
9
9
  export { ChildLogger, LoggerService } from './logger.service';
10
- export { LogDomain, LogDomainLabels, LogLevel, LogLevelLabels, parseLogLevel } from './logger.types';
10
+ export { getLogDomainLabel, LogDomain, LogDomainLabels, LogLevel, LogLevelLabels, parseLogLevel, } from './logger.types';
11
11
  export { BufferedTransport } from './transports/buffered.transport';
12
12
  export { ConsoleTransport } from './transports/console.transport';
13
13
  export { SimpleConsoleTransport } from './transports/simple-console.transport';
@@ -45,6 +45,7 @@ export declare enum LogDomain {
45
45
  * Human-readable labels for each log domain.
46
46
  */
47
47
  export declare const LogDomainLabels: Record<LogDomain, string>;
48
+ export declare function getLogDomainLabel(domain: LogDomain): string;
48
49
  /**
49
50
  * Additional contextual information that can be attached to any log entry.
50
51
  * Useful for tracing, debugging, and correlation.
@@ -60,6 +60,41 @@ export const LogDomainLabels = {
60
60
  [LogDomain.CLIENT]: 'CLIENT',
61
61
  [LogDomain.EXTERNAL]: 'EXTERNAL',
62
62
  };
63
+ function normalizeResourceName(resourceName) {
64
+ return resourceName.trim().replace(/^\[(.*)\]$/, '$1');
65
+ }
66
+ function getInjectedResourceName() {
67
+ if (typeof __OPENCORE_RESOURCE_NAME__ === 'string' &&
68
+ normalizeResourceName(__OPENCORE_RESOURCE_NAME__).length > 0) {
69
+ return normalizeResourceName(__OPENCORE_RESOURCE_NAME__);
70
+ }
71
+ const fn = globalThis.GetCurrentResourceName;
72
+ if (typeof fn === 'function') {
73
+ try {
74
+ const value = fn();
75
+ if (typeof value === 'string' && normalizeResourceName(value).length > 0) {
76
+ return normalizeResourceName(value);
77
+ }
78
+ }
79
+ catch {
80
+ // Ignore runtime lookup failures and fall back to default labels.
81
+ }
82
+ }
83
+ return undefined;
84
+ }
85
+ export function getLogDomainLabel(domain) {
86
+ if (domain !== LogDomain.FRAMEWORK) {
87
+ return LogDomainLabels[domain];
88
+ }
89
+ const resourceName = getInjectedResourceName();
90
+ if (!resourceName) {
91
+ return LogDomainLabels[domain];
92
+ }
93
+ if (resourceName.toLowerCase() === 'core') {
94
+ return 'CORE';
95
+ }
96
+ return resourceName.toUpperCase();
97
+ }
63
98
  /**
64
99
  * Configuration for parsing log level from string (useful for env vars).
65
100
  */
@@ -1,4 +1,4 @@
1
- import { LogDomainLabels, LogLevel, LogLevelLabels } from '../logger.types';
1
+ import { getLogDomainLabel, LogLevel, LogLevelLabels } from '../logger.types';
2
2
  /**
3
3
  * A transport that buffers log entries in memory for later export.
4
4
  *
@@ -95,7 +95,7 @@ export class BufferedTransport {
95
95
  const entries = this.buffer.map((entry) => ({
96
96
  timestamp: entry.timestamp,
97
97
  level: LogLevelLabels[entry.level],
98
- domain: LogDomainLabels[entry.domain],
98
+ domain: getLogDomainLabel(entry.domain),
99
99
  source: entry.context?.source,
100
100
  message: entry.message,
101
101
  context: this.cleanContext(entry.context),
@@ -114,7 +114,7 @@ export class BufferedTransport {
114
114
  .map((entry) => {
115
115
  const time = entry.timestamp.replace('T', ' ').slice(0, 23);
116
116
  const level = LogLevelLabels[entry.level].padEnd(5);
117
- const domain = LogDomainLabels[entry.domain].padEnd(8);
117
+ const domain = getLogDomainLabel(entry.domain).padEnd(8);
118
118
  const source = entry.context?.source ? `[${entry.context.source}]` : '';
119
119
  let line = `${time} | ${domain} | ${level} | ${source} ${entry.message}`;
120
120
  const ctx = this.cleanContext(entry.context);
@@ -133,7 +133,7 @@ export class BufferedTransport {
133
133
  const rows = this.buffer.map((entry) => [
134
134
  entry.timestamp,
135
135
  LogLevelLabels[entry.level],
136
- LogDomainLabels[entry.domain],
136
+ getLogDomainLabel(entry.domain),
137
137
  entry.context?.source ?? '',
138
138
  `"${entry.message.replace(/"/g, '""')}"`,
139
139
  JSON.stringify(this.cleanContext(entry.context)),
@@ -1,4 +1,4 @@
1
- import { LogDomain, LogDomainLabels, LogLevel, LogLevelLabels, } from '../logger.types';
1
+ import { getLogDomainLabel, LogDomain, LogLevel, LogLevelLabels, } from '../logger.types';
2
2
  /**
3
3
  * Color codes for console output.
4
4
  * Uses ANSI escape codes compatible with most terminals.
@@ -63,7 +63,7 @@ export class ConsoleTransport {
63
63
  write(entry) {
64
64
  const { level, domain, message, timestamp, context, error } = entry;
65
65
  const levelLabel = LogLevelLabels[level].padEnd(5);
66
- const domainLabel = LogDomainLabels[domain];
66
+ const domainLabel = getLogDomainLabel(domain);
67
67
  const levelColor = this.colors ? LEVEL_COLORS[level] : '';
68
68
  const domainColor = this.colors ? DOMAIN_COLORS[domain] : '';
69
69
  const reset = this.colors ? COLORS.reset : '';
@@ -1,4 +1,4 @@
1
- import { LogDomainLabels, LogLevel, LogLevelLabels } from '../logger.types';
1
+ import { getLogDomainLabel, LogLevel, LogLevelLabels } from '../logger.types';
2
2
  import { getClientLogConsole } from '../client-log-console';
3
3
  /**
4
4
  * Simple console transport without ANSI color codes.
@@ -29,7 +29,7 @@ export class SimpleConsoleTransport {
29
29
  const output = getClientLogConsole();
30
30
  const capabilities = output.getCapabilities();
31
31
  const levelLabel = LogLevelLabels[level].padEnd(5);
32
- const domainLabel = LogDomainLabels[domain];
32
+ const domainLabel = getLogDomainLabel(domain);
33
33
  // Build the log line without ANSI codes
34
34
  const parts = [];
35
35
  if (this.timestamps) {
@@ -1,6 +1,11 @@
1
1
  export * from './client-adapter';
2
+ export * from '../../../adapters/contracts/client/camera/IClientCameraPort';
2
3
  export * from '../../../adapters/contracts/client/IClientLogConsole';
4
+ export * from '../../../adapters/contracts/client/ped/IClientPedPort';
5
+ export * from '../../../adapters/contracts/client/progress/IClientProgressPort';
6
+ export * from '../../../adapters/contracts/client/spawn/IClientSpawnPort';
3
7
  export * from '../../../adapters/contracts/client/spawn/IClientSpawnBridge';
8
+ export * from '../../../adapters/contracts/client/vehicle/IClientVehiclePort';
4
9
  export * from '../../../adapters/contracts/client/ui/IClientBlipBridge';
5
10
  export * from '../../../adapters/contracts/client/ui/IClientMarkerBridge';
6
11
  export * from '../../../adapters/contracts/client/ui/IClientNotificationBridge';
@@ -1,6 +1,11 @@
1
1
  export * from './client-adapter';
2
+ export * from '../../../adapters/contracts/client/camera/IClientCameraPort';
2
3
  export * from '../../../adapters/contracts/client/IClientLogConsole';
4
+ export * from '../../../adapters/contracts/client/ped/IClientPedPort';
5
+ export * from '../../../adapters/contracts/client/progress/IClientProgressPort';
6
+ export * from '../../../adapters/contracts/client/spawn/IClientSpawnPort';
3
7
  export * from '../../../adapters/contracts/client/spawn/IClientSpawnBridge';
8
+ export * from '../../../adapters/contracts/client/vehicle/IClientVehiclePort';
4
9
  export * from '../../../adapters/contracts/client/ui/IClientBlipBridge';
5
10
  export * from '../../../adapters/contracts/client/ui/IClientMarkerBridge';
6
11
  export * from '../../../adapters/contracts/client/ui/IClientNotificationBridge';
@@ -0,0 +1,19 @@
1
+ import { type ClientCameraCreateOptions, type ClientCameraRotation, type ClientCameraRenderOptions, type ClientCameraShakeOptions, type ClientCameraTransform, IClientCameraPort } from '../../../adapters/contracts/client/camera/IClientCameraPort';
2
+ import type { Vector3 } from '../../../kernel/utils/vector3';
3
+ export declare class NodeClientCameraPort extends IClientCameraPort {
4
+ create(_options?: ClientCameraCreateOptions): number;
5
+ setActive(_camera: number, _active: boolean): void;
6
+ render(_enable: boolean, _options?: ClientCameraRenderOptions): void;
7
+ destroy(_camera: number, _destroyActiveCamera?: boolean): void;
8
+ destroyAll(_destroyActiveCamera?: boolean): void;
9
+ setTransform(_camera: number, _transform: ClientCameraTransform): void;
10
+ setPosition(_camera: number, _position: Vector3): void;
11
+ setRotation(_camera: number, _rotation: ClientCameraRotation, _rotationOrder?: number): void;
12
+ setFov(_camera: number, _fov: number): void;
13
+ pointAtCoords(_camera: number, _position: Vector3): void;
14
+ pointAtEntity(_camera: number, _entity: number, _offset?: Vector3): void;
15
+ stopPointing(_camera: number): void;
16
+ interpolate(_fromCamera: number, _toCamera: number, _durationMs: number, _easeLocation?: boolean, _easeRotation?: boolean): void;
17
+ shake(_camera: number, _options: ClientCameraShakeOptions): void;
18
+ stopShaking(_camera: number, _stopImmediately?: boolean): void;
19
+ }
@@ -0,0 +1,31 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { injectable } from 'tsyringe';
8
+ import { IClientCameraPort, } from '../../../adapters/contracts/client/camera/IClientCameraPort';
9
+ let NodeClientCameraPort = class NodeClientCameraPort extends IClientCameraPort {
10
+ create(_options) {
11
+ return 0;
12
+ }
13
+ setActive(_camera, _active) { }
14
+ render(_enable, _options) { }
15
+ destroy(_camera, _destroyActiveCamera) { }
16
+ destroyAll(_destroyActiveCamera) { }
17
+ setTransform(_camera, _transform) { }
18
+ setPosition(_camera, _position) { }
19
+ setRotation(_camera, _rotation, _rotationOrder) { }
20
+ setFov(_camera, _fov) { }
21
+ pointAtCoords(_camera, _position) { }
22
+ pointAtEntity(_camera, _entity, _offset) { }
23
+ stopPointing(_camera) { }
24
+ interpolate(_fromCamera, _toCamera, _durationMs, _easeLocation, _easeRotation) { }
25
+ shake(_camera, _options) { }
26
+ stopShaking(_camera, _stopImmediately) { }
27
+ };
28
+ NodeClientCameraPort = __decorate([
29
+ injectable()
30
+ ], NodeClientCameraPort);
31
+ export { NodeClientCameraPort };
@@ -5,20 +5,29 @@ import { NodeClientLocalPlayerBridge } from './node-local-player-bridge';
5
5
  import { NodeClientNotificationBridge } from './node-notification-bridge';
6
6
  import { IClientLogConsole } from '../../../adapters/contracts/client/IClientLogConsole';
7
7
  import { IClientSpawnBridge } from '../../../adapters/contracts/client/spawn/IClientSpawnBridge';
8
+ import { IClientSpawnPort } from '../../../adapters/contracts/client/spawn/IClientSpawnPort';
8
9
  import { IClientBlipBridge } from '../../../adapters/contracts/client/ui/IClientBlipBridge';
9
10
  import { IClientMarkerBridge } from '../../../adapters/contracts/client/ui/IClientMarkerBridge';
10
11
  import { IClientNotificationBridge } from '../../../adapters/contracts/client/ui/IClientNotificationBridge';
11
12
  import { IClientWebViewBridge } from '../../../adapters/contracts/client/ui/webview/IClientWebViewBridge';
12
13
  import { installNodeClientLogConsole, NodeClientLogConsole } from './node-log-console';
13
14
  import { NodeClientBlipBridge } from './node-blip-bridge';
15
+ import { NodeClientCameraPort } from './node-camera-port';
14
16
  import { NodeClientMarkerBridge } from './node-marker-bridge';
17
+ import { NodeClientPedPort } from './node-ped-port';
15
18
  import { NodeClientPlatformBridge } from './node-platform-bridge';
19
+ import { NodeClientProgressPort } from './node-progress-port';
16
20
  import { NodeClientSpawnBridge } from './node-spawn-bridge';
21
+ import { NodeClientVehiclePort } from './node-vehicle-port';
17
22
  import { NodeClientWebViewBridge } from './node-webview-bridge';
18
23
  import { IClientPlatformBridge } from './platform-bridge';
19
24
  import { NodeClientRuntimeBridge } from './node-runtime-bridge';
20
25
  import { defineClientAdapter } from './client-adapter';
21
26
  import { IClientRuntimeBridge } from './runtime-bridge';
27
+ import { IClientCameraPort } from '../../../adapters/contracts/client/camera/IClientCameraPort';
28
+ import { IClientPedPort } from '../../../adapters/contracts/client/ped/IClientPedPort';
29
+ import { IClientProgressPort } from '../../../adapters/contracts/client/progress/IClientProgressPort';
30
+ import { IClientVehiclePort } from '../../../adapters/contracts/client/vehicle/IClientVehiclePort';
22
31
  /**
23
32
  * Default client adapter used when no runtime adapter is provided.
24
33
  */
@@ -38,7 +47,12 @@ export function createNodeClientAdapter() {
38
47
  ctx.bindSingleton(IClientRuntimeBridge, NodeClientRuntimeBridge);
39
48
  ctx.bindSingleton(IClientLocalPlayerBridge, NodeClientLocalPlayerBridge);
40
49
  ctx.bindSingleton(IClientPlatformBridge, NodeClientPlatformBridge);
41
- ctx.bindSingleton(IClientSpawnBridge, NodeClientSpawnBridge);
50
+ ctx.bindSingleton(IClientCameraPort, NodeClientCameraPort);
51
+ ctx.bindSingleton(IClientVehiclePort, NodeClientVehiclePort);
52
+ ctx.bindSingleton(IClientPedPort, NodeClientPedPort);
53
+ ctx.bindSingleton(IClientProgressPort, NodeClientProgressPort);
54
+ ctx.bindSingleton(IClientSpawnPort, NodeClientSpawnBridge);
55
+ ctx.bindFactory(IClientSpawnBridge, () => ctx.container.resolve(IClientSpawnPort));
42
56
  ctx.bindSingleton(IClientBlipBridge, NodeClientBlipBridge);
43
57
  ctx.bindSingleton(IClientMarkerBridge, NodeClientMarkerBridge);
44
58
  ctx.bindSingleton(IClientNotificationBridge, NodeClientNotificationBridge);
@@ -4,5 +4,8 @@ import { IClientLocalPlayerBridge } from './local-player-bridge';
4
4
  * Node fallback local player bridge.
5
5
  */
6
6
  export declare class NodeClientLocalPlayerBridge extends IClientLocalPlayerBridge {
7
+ getHandle(): number;
8
+ getPosition(): Vector3;
9
+ getHeading(): number;
7
10
  setPosition(_position: Vector3, _heading?: number): void;
8
11
  }
@@ -10,6 +10,15 @@ import { IClientLocalPlayerBridge } from './local-player-bridge';
10
10
  * Node fallback local player bridge.
11
11
  */
12
12
  let NodeClientLocalPlayerBridge = class NodeClientLocalPlayerBridge extends IClientLocalPlayerBridge {
13
+ getHandle() {
14
+ return 0;
15
+ }
16
+ getPosition() {
17
+ return { x: 0, y: 0, z: 0 };
18
+ }
19
+ getHeading() {
20
+ return 0;
21
+ }
13
22
  setPosition(_position, _heading) { }
14
23
  };
15
24
  NodeClientLocalPlayerBridge = __decorate([
@@ -17,26 +17,26 @@ let NodeClientLogConsole = class NodeClientLogConsole extends IClientLogConsole
17
17
  return NODE_CLIENT_LOG_CAPABILITIES;
18
18
  }
19
19
  trace(message, details) {
20
- this.write(console.debug, message, details);
20
+ this.write('debug', message, details);
21
21
  }
22
22
  debug(message, details) {
23
- this.write(console.debug, message, details);
23
+ this.write('debug', message, details);
24
24
  }
25
25
  info(message, details) {
26
- this.write(console.info, message, details);
26
+ this.write('info', message, details);
27
27
  }
28
28
  warn(message, details) {
29
- this.write(console.warn, message, details);
29
+ this.write('warn', message, details);
30
30
  }
31
31
  error(message, details) {
32
- this.write(console.error, message, details);
32
+ this.write('error', message, details);
33
33
  }
34
- write(method, message, details) {
34
+ write(level, message, details) {
35
35
  if (details === undefined) {
36
- method(message);
36
+ console[level](message);
37
37
  return;
38
38
  }
39
- method(message, details);
39
+ console[level](message, details);
40
40
  }
41
41
  };
42
42
  NodeClientLogConsole = __decorate([
@@ -0,0 +1,20 @@
1
+ import { type ClientPedAnimationOptions, type ClientPedSpawnOptions, IClientPedPort } from '../../../adapters/contracts/client/ped/IClientPedPort';
2
+ import type { Vector3 } from '../../../kernel/utils/vector3';
3
+ export declare class NodeClientPedPort extends IClientPedPort {
4
+ spawn(_options: ClientPedSpawnOptions): Promise<number>;
5
+ delete(_handle: number): void;
6
+ exists(_handle: number): boolean;
7
+ playAnimation(_handle: number, _options: ClientPedAnimationOptions): Promise<void>;
8
+ stopAnimation(_handle: number): void;
9
+ stopAnimationImmediately(_handle: number): void;
10
+ freeze(_handle: number, _freeze: boolean): void;
11
+ setInvincible(_handle: number, _invincible: boolean): void;
12
+ giveWeapon(_handle: number, _weapon: string, _ammo?: number, _hidden?: boolean, _forceInHand?: boolean): void;
13
+ removeAllWeapons(_handle: number): void;
14
+ getClosest(_radius?: number, _excludeLocalPlayer?: boolean): number | null;
15
+ getNearby(_position: Vector3, _radius: number, _excludeEntity?: number): number[];
16
+ lookAtEntity(_handle: number, _entity: number, _duration?: number): void;
17
+ lookAtCoords(_handle: number, _position: Vector3, _duration?: number): void;
18
+ walkTo(_handle: number, _position: Vector3, _speed?: number): void;
19
+ setCombatAttributes(_handle: number, _canFight: boolean, _canUseCover?: boolean): void;
20
+ }
@@ -0,0 +1,38 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { injectable } from 'tsyringe';
8
+ import { IClientPedPort, } from '../../../adapters/contracts/client/ped/IClientPedPort';
9
+ let NodeClientPedPort = class NodeClientPedPort extends IClientPedPort {
10
+ async spawn(_options) {
11
+ return 0;
12
+ }
13
+ delete(_handle) { }
14
+ exists(_handle) {
15
+ return false;
16
+ }
17
+ async playAnimation(_handle, _options) { }
18
+ stopAnimation(_handle) { }
19
+ stopAnimationImmediately(_handle) { }
20
+ freeze(_handle, _freeze) { }
21
+ setInvincible(_handle, _invincible) { }
22
+ giveWeapon(_handle, _weapon, _ammo = 100, _hidden = false, _forceInHand = true) { }
23
+ removeAllWeapons(_handle) { }
24
+ getClosest(_radius = 10, _excludeLocalPlayer = true) {
25
+ return null;
26
+ }
27
+ getNearby(_position, _radius, _excludeEntity) {
28
+ return [];
29
+ }
30
+ lookAtEntity(_handle, _entity, _duration = -1) { }
31
+ lookAtCoords(_handle, _position, _duration = -1) { }
32
+ walkTo(_handle, _position, _speed = 1) { }
33
+ setCombatAttributes(_handle, _canFight, _canUseCover = true) { }
34
+ };
35
+ NodeClientPedPort = __decorate([
36
+ injectable()
37
+ ], NodeClientPedPort);
38
+ export { NodeClientPedPort };
@@ -0,0 +1,8 @@
1
+ import { type ClientProgressOptions, type ClientProgressState, IClientProgressPort } from '../../../adapters/contracts/client/progress/IClientProgressPort';
2
+ export declare class NodeClientProgressPort extends IClientProgressPort {
3
+ start(_options: ClientProgressOptions): Promise<boolean>;
4
+ cancel(): void;
5
+ isActive(): boolean;
6
+ getProgress(): number;
7
+ getState(): ClientProgressState | null;
8
+ }
@@ -0,0 +1,27 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { injectable } from 'tsyringe';
8
+ import { IClientProgressPort, } from '../../../adapters/contracts/client/progress/IClientProgressPort';
9
+ let NodeClientProgressPort = class NodeClientProgressPort extends IClientProgressPort {
10
+ start(_options) {
11
+ return Promise.resolve(true);
12
+ }
13
+ cancel() { }
14
+ isActive() {
15
+ return false;
16
+ }
17
+ getProgress() {
18
+ return 0;
19
+ }
20
+ getState() {
21
+ return null;
22
+ }
23
+ };
24
+ NodeClientProgressPort = __decorate([
25
+ injectable()
26
+ ], NodeClientProgressPort);
27
+ export { NodeClientProgressPort };
@@ -1,7 +1,5 @@
1
1
  import { IClientRuntimeBridge } from './runtime-bridge';
2
- type RuntimeHandler = (...args: readonly unknown[]) => void | Promise<void>;
3
2
  type WebViewCallback = (data: unknown, cb: (response: unknown) => void) => void | Promise<void>;
4
- type RuntimeExport = (...args: readonly unknown[]) => unknown;
5
3
  /**
6
4
  * Node fallback runtime bridge used in tests and standalone execution.
7
5
  */
@@ -9,7 +7,7 @@ export declare class NodeClientRuntimeBridge extends IClientRuntimeBridge {
9
7
  private readonly events;
10
8
  private readonly tickHandles;
11
9
  getCurrentResourceName(): string;
12
- on(eventName: string, handler: RuntimeHandler): void;
10
+ on<TArgs extends readonly unknown[]>(eventName: string, handler: (...args: TArgs) => void | Promise<void>): void;
13
11
  registerCommand(_commandName: string, _handler: (...args: readonly unknown[]) => void, _restricted: boolean): void;
14
12
  registerKeyMapping(_commandName: string, _description: string, _inputMapper: string, _key: string): void;
15
13
  setTick(handler: () => void | Promise<void>): unknown;
@@ -19,6 +17,6 @@ export declare class NodeClientRuntimeBridge extends IClientRuntimeBridge {
19
17
  sendNuiMessage(_message: string): void;
20
18
  setNuiFocus(_hasFocus: boolean, _hasCursor: boolean): void;
21
19
  setNuiFocusKeepInput(_keepInput: boolean): void;
22
- registerExport(exportName: string, handler: RuntimeExport): void;
20
+ registerExport<TArgs extends readonly unknown[], TResult = unknown>(exportName: string, handler: (...args: TArgs) => TResult): void;
23
21
  }
24
22
  export {};
@@ -1,8 +1,8 @@
1
- import { IClientSpawnBridge } from '../../../adapters/contracts/client/spawn/IClientSpawnBridge';
2
- import type { RespawnRequest, SpawnRequest, TeleportRequest } from '../../../adapters/contracts/client/spawn/types';
3
- export declare class NodeClientSpawnBridge extends IClientSpawnBridge {
1
+ import { IClientSpawnPort } from '../../../adapters/contracts/client/spawn/IClientSpawnPort';
2
+ import type { RespawnRequest, SpawnExecutionResult, SpawnRequest, TeleportRequest } from '../../../adapters/contracts/client/spawn/types';
3
+ export declare class NodeClientSpawnBridge extends IClientSpawnPort {
4
4
  waitUntilReady(_timeoutMs?: number): Promise<void>;
5
- spawn(_request: SpawnRequest): Promise<void>;
6
- respawn(_request: RespawnRequest): Promise<void>;
5
+ spawn(_request: SpawnRequest): Promise<SpawnExecutionResult>;
6
+ respawn(_request: RespawnRequest): Promise<SpawnExecutionResult>;
7
7
  teleport(_request: TeleportRequest): Promise<void>;
8
8
  }