@open-core/framework 0.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +360 -0
  3. package/dist/client/client-bootstrap.d.ts +1 -0
  4. package/dist/client/client-bootstrap.js +50 -0
  5. package/dist/client/client-container.d.ts +2 -0
  6. package/dist/client/client-container.js +6 -0
  7. package/dist/client/client-core.d.ts +1 -0
  8. package/dist/client/client-core.js +7 -0
  9. package/dist/client/controllers/spawner.controller.d.ts +12 -0
  10. package/dist/client/controllers/spawner.controller.js +51 -0
  11. package/dist/client/decorators/controller.d.ts +3 -0
  12. package/dist/client/decorators/controller.js +14 -0
  13. package/dist/client/decorators/export.d.ts +7 -0
  14. package/dist/client/decorators/export.js +15 -0
  15. package/dist/client/decorators/gameEvent.d.ts +47 -0
  16. package/dist/client/decorators/gameEvent.js +54 -0
  17. package/dist/client/decorators/index.d.ts +10 -0
  18. package/dist/client/decorators/index.js +26 -0
  19. package/dist/client/decorators/interval.d.ts +7 -0
  20. package/dist/client/decorators/interval.js +15 -0
  21. package/dist/client/decorators/key.d.ts +2 -0
  22. package/dist/client/decorators/key.js +10 -0
  23. package/dist/client/decorators/localEvent.d.ts +7 -0
  24. package/dist/client/decorators/localEvent.js +15 -0
  25. package/dist/client/decorators/nui.d.ts +1 -0
  26. package/dist/client/decorators/nui.js +9 -0
  27. package/dist/client/decorators/onNet.d.ts +1 -0
  28. package/dist/client/decorators/onNet.js +9 -0
  29. package/dist/client/decorators/resourceLifecycle.d.ts +11 -0
  30. package/dist/client/decorators/resourceLifecycle.js +24 -0
  31. package/dist/client/decorators/tick.d.ts +1 -0
  32. package/dist/client/decorators/tick.js +9 -0
  33. package/dist/client/index.d.ts +7 -0
  34. package/dist/client/index.js +23 -0
  35. package/dist/client/interfaces/appearance.interface.d.ts +19 -0
  36. package/dist/client/interfaces/appearance.interface.js +2 -0
  37. package/dist/client/player/player.d.ts +262 -0
  38. package/dist/client/player/player.js +480 -0
  39. package/dist/client/player/player.loader.d.ts +1 -0
  40. package/dist/client/player/player.loader.js +22 -0
  41. package/dist/client/services/appearance.service.d.ts +6 -0
  42. package/dist/client/services/appearance.service.js +89 -0
  43. package/dist/client/services/blip.service.d.ts +112 -0
  44. package/dist/client/services/blip.service.js +215 -0
  45. package/dist/client/services/index.d.ts +9 -0
  46. package/dist/client/services/index.js +25 -0
  47. package/dist/client/services/marker.service.d.ts +94 -0
  48. package/dist/client/services/marker.service.js +153 -0
  49. package/dist/client/services/notification.service.d.ts +76 -0
  50. package/dist/client/services/notification.service.js +111 -0
  51. package/dist/client/services/ped.service.d.ts +182 -0
  52. package/dist/client/services/ped.service.js +302 -0
  53. package/dist/client/services/progress.service.d.ts +82 -0
  54. package/dist/client/services/progress.service.js +210 -0
  55. package/dist/client/services/spawn.service.d.ts +73 -0
  56. package/dist/client/services/spawn.service.js +261 -0
  57. package/dist/client/services/streaming.service.d.ts +165 -0
  58. package/dist/client/services/streaming.service.js +341 -0
  59. package/dist/client/services/textui.service.d.ts +82 -0
  60. package/dist/client/services/textui.service.js +156 -0
  61. package/dist/client/services/vehicle.service.d.ts +168 -0
  62. package/dist/client/services/vehicle.service.js +296 -0
  63. package/dist/client/system/metadata-client.keys.d.ts +13 -0
  64. package/dist/client/system/metadata-client.keys.js +16 -0
  65. package/dist/client/system/processors/export.processor.d.ts +7 -0
  66. package/dist/client/system/processors/export.processor.js +39 -0
  67. package/dist/client/system/processors/gameEvent.processor.d.ts +10 -0
  68. package/dist/client/system/processors/gameEvent.processor.js +58 -0
  69. package/dist/client/system/processors/interval.processor.d.ts +7 -0
  70. package/dist/client/system/processors/interval.processor.js +43 -0
  71. package/dist/client/system/processors/key.processor.d.ts +8 -0
  72. package/dist/client/system/processors/key.processor.js +27 -0
  73. package/dist/client/system/processors/localEvent.processor.d.ts +7 -0
  74. package/dist/client/system/processors/localEvent.processor.js +38 -0
  75. package/dist/client/system/processors/netEvent.processor.d.ts +7 -0
  76. package/dist/client/system/processors/netEvent.processor.js +38 -0
  77. package/dist/client/system/processors/nui.processor.d.ts +7 -0
  78. package/dist/client/system/processors/nui.processor.js +40 -0
  79. package/dist/client/system/processors/resourceLifecycle.processor.d.ts +9 -0
  80. package/dist/client/system/processors/resourceLifecycle.processor.js +69 -0
  81. package/dist/client/system/processors/tick.processor.d.ts +5 -0
  82. package/dist/client/system/processors/tick.processor.js +37 -0
  83. package/dist/client/system/processors.register.d.ts +1 -0
  84. package/dist/client/system/processors.register.js +27 -0
  85. package/dist/client/types/game-events.d.ts +126 -0
  86. package/dist/client/types/game-events.js +83 -0
  87. package/dist/client/types/index.d.ts +1 -0
  88. package/dist/client/types/index.js +17 -0
  89. package/dist/client/ui-bridge.d.ts +116 -0
  90. package/dist/client/ui-bridge.js +201 -0
  91. package/dist/index.d.ts +5 -0
  92. package/dist/index.js +41 -0
  93. package/dist/server/bootstrap.d.ts +16 -0
  94. package/dist/server/bootstrap.js +57 -0
  95. package/dist/server/bus/core-event-bus.d.ts +6 -0
  96. package/dist/server/bus/core-event-bus.js +31 -0
  97. package/dist/server/configs/api.config.d.ts +71 -0
  98. package/dist/server/configs/api.config.js +81 -0
  99. package/dist/server/configs/config.base.d.ts +63 -0
  100. package/dist/server/configs/config.base.js +64 -0
  101. package/dist/server/configs/index.d.ts +2 -0
  102. package/dist/server/configs/index.js +18 -0
  103. package/dist/server/container.d.ts +2 -0
  104. package/dist/server/container.js +6 -0
  105. package/dist/server/controllers/chat.controller.d.ts +10 -0
  106. package/dist/server/controllers/chat.controller.js +50 -0
  107. package/dist/server/controllers/command.controller.d.ts +7 -0
  108. package/dist/server/controllers/command.controller.js +47 -0
  109. package/dist/server/controllers/session.controller.d.ts +9 -0
  110. package/dist/server/controllers/session.controller.js +70 -0
  111. package/dist/server/core.d.ts +1 -0
  112. package/dist/server/core.js +7 -0
  113. package/dist/server/database/adapters/oxmysql.adapter.d.ts +89 -0
  114. package/dist/server/database/adapters/oxmysql.adapter.js +149 -0
  115. package/dist/server/database/database.contract.d.ts +128 -0
  116. package/dist/server/database/database.contract.js +29 -0
  117. package/dist/server/database/database.service.d.ts +216 -0
  118. package/dist/server/database/database.service.js +301 -0
  119. package/dist/server/database/index.d.ts +53 -0
  120. package/dist/server/database/index.js +70 -0
  121. package/dist/server/database/types.d.ts +67 -0
  122. package/dist/server/database/types.js +7 -0
  123. package/dist/server/database.d.ts +7 -0
  124. package/dist/server/database.js +23 -0
  125. package/dist/server/decorators/bind.d.ts +2 -0
  126. package/dist/server/decorators/bind.js +15 -0
  127. package/dist/server/decorators/command.d.ts +49 -0
  128. package/dist/server/decorators/command.js +23 -0
  129. package/dist/server/decorators/controller.d.ts +25 -0
  130. package/dist/server/decorators/controller.js +36 -0
  131. package/dist/server/decorators/export.d.ts +39 -0
  132. package/dist/server/decorators/export.js +47 -0
  133. package/dist/server/decorators/guard.d.ts +56 -0
  134. package/dist/server/decorators/guard.js +82 -0
  135. package/dist/server/decorators/index.d.ts +10 -0
  136. package/dist/server/decorators/index.js +29 -0
  137. package/dist/server/decorators/onFiveMEvent.d.ts +6 -0
  138. package/dist/server/decorators/onFiveMEvent.js +14 -0
  139. package/dist/server/decorators/onFrameworkEvent.d.ts +22 -0
  140. package/dist/server/decorators/onFrameworkEvent.js +29 -0
  141. package/dist/server/decorators/onNet.d.ts +58 -0
  142. package/dist/server/decorators/onNet.js +57 -0
  143. package/dist/server/decorators/onTick.d.ts +32 -0
  144. package/dist/server/decorators/onTick.js +40 -0
  145. package/dist/server/decorators/public.d.ts +27 -0
  146. package/dist/server/decorators/public.js +36 -0
  147. package/dist/server/decorators/requiresState.d.ts +56 -0
  148. package/dist/server/decorators/requiresState.js +63 -0
  149. package/dist/server/decorators/throttle.d.ts +48 -0
  150. package/dist/server/decorators/throttle.js +63 -0
  151. package/dist/server/decorators/utils.d.ts +57 -0
  152. package/dist/server/decorators/utils.js +63 -0
  153. package/dist/server/entities/index.d.ts +1 -0
  154. package/dist/server/entities/index.js +17 -0
  155. package/dist/server/entities/player.d.ts +157 -0
  156. package/dist/server/entities/player.js +217 -0
  157. package/dist/server/error-handler.d.ts +2 -0
  158. package/dist/server/error-handler.js +43 -0
  159. package/dist/server/helpers/resolve-method.d.ts +5 -0
  160. package/dist/server/helpers/resolve-method.js +18 -0
  161. package/dist/server/index.d.ts +10 -0
  162. package/dist/server/index.js +31 -0
  163. package/dist/server/loaders/exports.loader.d.ts +0 -0
  164. package/dist/server/loaders/exports.loader.js +23 -0
  165. package/dist/server/loaders/playerSession.loader.d.ts +1 -0
  166. package/dist/server/loaders/playerSession.loader.js +51 -0
  167. package/dist/server/services/access-control.service.d.ts +56 -0
  168. package/dist/server/services/access-control.service.js +99 -0
  169. package/dist/server/services/chat.service.d.ts +7 -0
  170. package/dist/server/services/chat.service.js +31 -0
  171. package/dist/server/services/command.service.d.ts +15 -0
  172. package/dist/server/services/command.service.js +77 -0
  173. package/dist/server/services/config.service.d.ts +75 -0
  174. package/dist/server/services/config.service.js +116 -0
  175. package/dist/server/services/default/default-security.handler.d.ts +6 -0
  176. package/dist/server/services/default/default-security.handler.js +26 -0
  177. package/dist/server/services/http/http.service.d.ts +50 -0
  178. package/dist/server/services/http/http.service.js +126 -0
  179. package/dist/server/services/index.d.ts +10 -0
  180. package/dist/server/services/index.js +26 -0
  181. package/dist/server/services/parallel/index.d.ts +49 -0
  182. package/dist/server/services/parallel/index.js +67 -0
  183. package/dist/server/services/parallel/parallel-compute.service.d.ts +132 -0
  184. package/dist/server/services/parallel/parallel-compute.service.js +449 -0
  185. package/dist/server/services/parallel/types.d.ts +188 -0
  186. package/dist/server/services/parallel/types.js +7 -0
  187. package/dist/server/services/parallel/worker-pool.d.ts +83 -0
  188. package/dist/server/services/parallel/worker-pool.js +350 -0
  189. package/dist/server/services/parallel/worker.d.ts +19 -0
  190. package/dist/server/services/parallel/worker.js +49 -0
  191. package/dist/server/services/persistence.service.d.ts +59 -0
  192. package/dist/server/services/persistence.service.js +166 -0
  193. package/dist/server/services/player.service.d.ts +96 -0
  194. package/dist/server/services/player.service.js +132 -0
  195. package/dist/server/services/rate-limiter.service.d.ts +5 -0
  196. package/dist/server/services/rate-limiter.service.js +39 -0
  197. package/dist/server/services/registers.d.ts +1 -0
  198. package/dist/server/services/registers.js +18 -0
  199. package/dist/server/setup.d.ts +9 -0
  200. package/dist/server/setup.js +28 -0
  201. package/dist/server/system/metadata-server.keys.d.ts +10 -0
  202. package/dist/server/system/metadata-server.keys.js +13 -0
  203. package/dist/server/system/processors/command.processor.d.ts +9 -0
  204. package/dist/server/system/processors/command.processor.js +30 -0
  205. package/dist/server/system/processors/coreEvent.processor.d.ts +7 -0
  206. package/dist/server/system/processors/coreEvent.processor.js +41 -0
  207. package/dist/server/system/processors/export.processor.d.ts +7 -0
  208. package/dist/server/system/processors/export.processor.js +30 -0
  209. package/dist/server/system/processors/fivemEvent.processor.d.ts +7 -0
  210. package/dist/server/system/processors/fivemEvent.processor.js +40 -0
  211. package/dist/server/system/processors/netEvent.processor.d.ts +11 -0
  212. package/dist/server/system/processors/netEvent.processor.js +103 -0
  213. package/dist/server/system/processors/tick.processor.d.ts +5 -0
  214. package/dist/server/system/processors/tick.processor.js +36 -0
  215. package/dist/server/system/processors.register.d.ts +1 -0
  216. package/dist/server/system/processors.register.js +23 -0
  217. package/dist/server/system/schema-generator.d.ts +2 -0
  218. package/dist/server/system/schema-generator.js +34 -0
  219. package/dist/server/templates/admin/admin.controller-template.d.ts +12 -0
  220. package/dist/server/templates/admin/admin.controller-template.js +2 -0
  221. package/dist/server/templates/auth/auth-provider.contract.d.ts +58 -0
  222. package/dist/server/templates/auth/auth-provider.contract.js +23 -0
  223. package/dist/server/templates/index.d.ts +8 -0
  224. package/dist/server/templates/index.js +21 -0
  225. package/dist/server/templates/persistence/index.d.ts +30 -0
  226. package/dist/server/templates/persistence/index.js +34 -0
  227. package/dist/server/templates/persistence/player-persistence.contract.d.ts +86 -0
  228. package/dist/server/templates/persistence/player-persistence.contract.js +52 -0
  229. package/dist/server/templates/repository/index.d.ts +57 -0
  230. package/dist/server/templates/repository/index.js +61 -0
  231. package/dist/server/templates/repository/repository.contract.d.ts +224 -0
  232. package/dist/server/templates/repository/repository.contract.js +342 -0
  233. package/dist/server/templates/repository/repository.types.d.ts +51 -0
  234. package/dist/server/templates/repository/repository.types.js +7 -0
  235. package/dist/server/templates/security/permission.types.d.ts +32 -0
  236. package/dist/server/templates/security/permission.types.js +2 -0
  237. package/dist/server/templates/security/principal-provider.contract.d.ts +43 -0
  238. package/dist/server/templates/security/principal-provider.contract.js +19 -0
  239. package/dist/server/templates/security/security-handler.contract.d.ts +5 -0
  240. package/dist/server/templates/security/security-handler.contract.js +6 -0
  241. package/dist/server/types/core-events.d.ts +22 -0
  242. package/dist/server/types/core-events.js +2 -0
  243. package/dist/server/types/security.types.d.ts +7 -0
  244. package/dist/server/types/security.types.js +2 -0
  245. package/dist/shared/index.d.ts +1 -0
  246. package/dist/shared/index.js +17 -0
  247. package/dist/shared/logger/core-logger.d.ts +35 -0
  248. package/dist/shared/logger/core-logger.js +52 -0
  249. package/dist/shared/logger/index.d.ts +11 -0
  250. package/dist/shared/logger/index.js +26 -0
  251. package/dist/shared/logger/logger.config.d.ts +47 -0
  252. package/dist/shared/logger/logger.config.js +33 -0
  253. package/dist/shared/logger/logger.service.d.ts +161 -0
  254. package/dist/shared/logger/logger.service.js +279 -0
  255. package/dist/shared/logger/logger.types.d.ts +85 -0
  256. package/dist/shared/logger/logger.types.js +74 -0
  257. package/dist/shared/logger/transports/buffered.transport.d.ts +88 -0
  258. package/dist/shared/logger/transports/buffered.transport.js +174 -0
  259. package/dist/shared/logger/transports/console.transport.d.ts +37 -0
  260. package/dist/shared/logger/transports/console.transport.js +134 -0
  261. package/dist/shared/logger/transports/index.d.ts +3 -0
  262. package/dist/shared/logger/transports/index.js +19 -0
  263. package/dist/shared/logger/transports/transport.interface.d.ts +40 -0
  264. package/dist/shared/logger/transports/transport.interface.js +2 -0
  265. package/dist/system/class-constructor.d.ts +1 -0
  266. package/dist/system/class-constructor.js +2 -0
  267. package/dist/system/decorator-processor.d.ts +4 -0
  268. package/dist/system/decorator-processor.js +2 -0
  269. package/dist/system/metadata.scanner.d.ts +7 -0
  270. package/dist/system/metadata.scanner.js +45 -0
  271. package/dist/utils/errors.d.ts +14 -0
  272. package/dist/utils/errors.js +25 -0
  273. package/dist/utils/index.d.ts +4 -0
  274. package/dist/utils/index.js +20 -0
  275. package/dist/utils/result.d.ts +12 -0
  276. package/dist/utils/result.js +10 -0
  277. package/dist/utils/rgb.d.ts +5 -0
  278. package/dist/utils/rgb.js +2 -0
  279. package/dist/utils/vector3.d.ts +13 -0
  280. package/dist/utils/vector3.js +27 -0
  281. package/package.json +98 -0
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Worker Pool
3
+ *
4
+ * Abstract worker pool that supports different backends.
5
+ * In FiveM environment, falls back to async execution.
6
+ * Can be extended to support native workers when available.
7
+ */
8
+ import type { WorkerPoolConfig, WorkerInfo, WorkerMessage } from './types';
9
+ type EventCallback = (...args: unknown[]) => void;
10
+ /**
11
+ * Simple event emitter (FiveM compatible)
12
+ */
13
+ declare class SimpleEventEmitter {
14
+ private events;
15
+ on(event: string, callback: EventCallback): void;
16
+ off(event: string, callback: EventCallback): void;
17
+ emit(event: string, ...args: unknown[]): void;
18
+ }
19
+ export declare class WorkerPool extends SimpleEventEmitter {
20
+ private workers;
21
+ private taskQueue;
22
+ private config;
23
+ private workerIdCounter;
24
+ private cleanupInterval;
25
+ private isShuttingDown;
26
+ private useNativeWorkers;
27
+ constructor(config?: Partial<WorkerPoolConfig>);
28
+ /**
29
+ * Detect if native worker threads are available
30
+ */
31
+ private detectWorkerSupport;
32
+ /**
33
+ * Check if using native workers
34
+ */
35
+ get isNative(): boolean;
36
+ /**
37
+ * Execute a task
38
+ */
39
+ execute(message: WorkerMessage): Promise<unknown>;
40
+ /**
41
+ * Get current pool statistics
42
+ */
43
+ getStats(): {
44
+ totalWorkers: number;
45
+ idleWorkers: number;
46
+ busyWorkers: number;
47
+ queuedTasks: number;
48
+ isNative: boolean;
49
+ };
50
+ /**
51
+ * Get all worker info
52
+ */
53
+ getWorkerInfo(): WorkerInfo[];
54
+ /**
55
+ * Shutdown the pool gracefully
56
+ */
57
+ shutdown(): Promise<void>;
58
+ /**
59
+ * Spawn a new virtual worker
60
+ */
61
+ private spawnWorker;
62
+ /**
63
+ * Find an idle worker
64
+ */
65
+ private findIdleWorker;
66
+ /**
67
+ * Assign a task to a worker
68
+ */
69
+ private assignTask;
70
+ /**
71
+ * Handle task timeout
72
+ */
73
+ private handleTaskTimeout;
74
+ /**
75
+ * Process queued tasks
76
+ */
77
+ private processQueue;
78
+ /**
79
+ * Cleanup idle workers
80
+ */
81
+ private cleanupIdleWorkers;
82
+ }
83
+ export {};
@@ -0,0 +1,350 @@
1
+ "use strict";
2
+ /**
3
+ * Worker Pool
4
+ *
5
+ * Abstract worker pool that supports different backends.
6
+ * In FiveM environment, falls back to async execution.
7
+ * Can be extended to support native workers when available.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.WorkerPool = void 0;
11
+ const DEFAULT_CONFIG = {
12
+ minWorkers: 0,
13
+ maxWorkers: 4,
14
+ idleTimeout: 30000,
15
+ taskTimeout: 60000,
16
+ };
17
+ /**
18
+ * Simple event emitter (FiveM compatible)
19
+ */
20
+ class SimpleEventEmitter {
21
+ constructor() {
22
+ this.events = new Map();
23
+ }
24
+ on(event, callback) {
25
+ const callbacks = this.events.get(event) || [];
26
+ callbacks.push(callback);
27
+ this.events.set(event, callbacks);
28
+ }
29
+ off(event, callback) {
30
+ const callbacks = this.events.get(event) || [];
31
+ const index = callbacks.indexOf(callback);
32
+ if (index !== -1) {
33
+ callbacks.splice(index, 1);
34
+ }
35
+ }
36
+ emit(event, ...args) {
37
+ const callbacks = this.events.get(event) || [];
38
+ for (const callback of callbacks) {
39
+ try {
40
+ callback(...args);
41
+ }
42
+ catch (_a) {
43
+ // Ignore callback errors
44
+ }
45
+ }
46
+ }
47
+ }
48
+ /**
49
+ * Virtual worker that executes tasks asynchronously
50
+ * Used as fallback when native workers aren't available
51
+ */
52
+ class VirtualWorker {
53
+ constructor(id) {
54
+ this._status = 'idle';
55
+ this.tasksCompleted = 0;
56
+ this.lastActiveAt = Date.now();
57
+ this.currentTask = null;
58
+ this.id = id;
59
+ }
60
+ get status() {
61
+ return this._status;
62
+ }
63
+ get info() {
64
+ var _a, _b;
65
+ return {
66
+ id: this.id,
67
+ status: this._status,
68
+ currentTaskId: (_b = (_a = this.currentTask) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : null,
69
+ tasksCompleted: this.tasksCompleted,
70
+ lastActiveAt: this.lastActiveAt,
71
+ };
72
+ }
73
+ async execute(task) {
74
+ this._status = 'busy';
75
+ this.currentTask = task;
76
+ const startTime = performance.now();
77
+ try {
78
+ // Execute the function
79
+ const fn = new Function('input', `return (${task.message.functionBody})(input)`);
80
+ const result = fn(task.message.input);
81
+ const executionTime = performance.now() - startTime;
82
+ this.tasksCompleted++;
83
+ this.lastActiveAt = Date.now();
84
+ this._status = 'idle';
85
+ this.currentTask = null;
86
+ return {
87
+ id: task.id,
88
+ success: true,
89
+ result,
90
+ executionTime,
91
+ };
92
+ }
93
+ catch (error) {
94
+ const executionTime = performance.now() - startTime;
95
+ this._status = 'idle';
96
+ this.currentTask = null;
97
+ return {
98
+ id: task.id,
99
+ success: false,
100
+ error: error instanceof Error ? error.message : String(error),
101
+ executionTime,
102
+ };
103
+ }
104
+ }
105
+ terminate() {
106
+ this._status = 'terminated';
107
+ this.currentTask = null;
108
+ }
109
+ }
110
+ class WorkerPool extends SimpleEventEmitter {
111
+ constructor(config = {}) {
112
+ super();
113
+ this.workers = new Map();
114
+ this.taskQueue = [];
115
+ this.workerIdCounter = 0;
116
+ this.cleanupInterval = null;
117
+ this.isShuttingDown = false;
118
+ this.useNativeWorkers = false;
119
+ this.config = Object.assign(Object.assign({}, DEFAULT_CONFIG), config);
120
+ // Check if native workers are available
121
+ this.detectWorkerSupport();
122
+ // Start cleanup interval
123
+ this.cleanupInterval = setInterval(() => this.cleanupIdleWorkers(), 10000);
124
+ // Spawn minimum workers
125
+ for (let i = 0; i < this.config.minWorkers; i++) {
126
+ this.spawnWorker();
127
+ }
128
+ }
129
+ /**
130
+ * Detect if native worker threads are available
131
+ */
132
+ detectWorkerSupport() {
133
+ try {
134
+ // Try to detect worker_threads module
135
+ // In FiveM this will fail, which is expected
136
+ this.useNativeWorkers = false;
137
+ }
138
+ catch (_a) {
139
+ this.useNativeWorkers = false;
140
+ }
141
+ }
142
+ /**
143
+ * Check if using native workers
144
+ */
145
+ get isNative() {
146
+ return this.useNativeWorkers;
147
+ }
148
+ /**
149
+ * Execute a task
150
+ */
151
+ async execute(message) {
152
+ if (this.isShuttingDown) {
153
+ throw new Error('Worker pool is shutting down');
154
+ }
155
+ return new Promise((resolve, reject) => {
156
+ const task = {
157
+ id: message.id,
158
+ message,
159
+ resolve,
160
+ reject,
161
+ startTime: Date.now(),
162
+ timeoutId: null,
163
+ };
164
+ // Set timeout
165
+ task.timeoutId = setTimeout(() => {
166
+ this.handleTaskTimeout(task);
167
+ }, this.config.taskTimeout);
168
+ // Find an idle worker
169
+ const idleWorker = this.findIdleWorker();
170
+ if (idleWorker) {
171
+ this.assignTask(idleWorker, task);
172
+ }
173
+ else if (this.workers.size < this.config.maxWorkers) {
174
+ const newWorker = this.spawnWorker();
175
+ if (newWorker) {
176
+ this.assignTask(newWorker, task);
177
+ }
178
+ else {
179
+ this.taskQueue.push(task);
180
+ }
181
+ }
182
+ else {
183
+ this.taskQueue.push(task);
184
+ }
185
+ });
186
+ }
187
+ /**
188
+ * Get current pool statistics
189
+ */
190
+ getStats() {
191
+ let idle = 0;
192
+ let busy = 0;
193
+ for (const worker of this.workers.values()) {
194
+ if (worker.status === 'idle')
195
+ idle++;
196
+ else if (worker.status === 'busy')
197
+ busy++;
198
+ }
199
+ return {
200
+ totalWorkers: this.workers.size,
201
+ idleWorkers: idle,
202
+ busyWorkers: busy,
203
+ queuedTasks: this.taskQueue.length,
204
+ isNative: this.useNativeWorkers,
205
+ };
206
+ }
207
+ /**
208
+ * Get all worker info
209
+ */
210
+ getWorkerInfo() {
211
+ return Array.from(this.workers.values()).map((w) => w.info);
212
+ }
213
+ /**
214
+ * Shutdown the pool gracefully
215
+ */
216
+ async shutdown() {
217
+ this.isShuttingDown = true;
218
+ if (this.cleanupInterval) {
219
+ clearInterval(this.cleanupInterval);
220
+ this.cleanupInterval = null;
221
+ }
222
+ // Reject all queued tasks
223
+ for (const task of this.taskQueue) {
224
+ if (task.timeoutId)
225
+ clearTimeout(task.timeoutId);
226
+ task.reject(new Error('Worker pool shutdown'));
227
+ }
228
+ this.taskQueue = [];
229
+ // Terminate all workers
230
+ for (const worker of this.workers.values()) {
231
+ worker.terminate();
232
+ }
233
+ this.workers.clear();
234
+ }
235
+ /**
236
+ * Spawn a new virtual worker
237
+ */
238
+ spawnWorker() {
239
+ try {
240
+ const id = this.workerIdCounter++;
241
+ const worker = new VirtualWorker(id);
242
+ this.workers.set(id, worker);
243
+ this.emit('workerSpawned', id);
244
+ return worker;
245
+ }
246
+ catch (_a) {
247
+ return null;
248
+ }
249
+ }
250
+ /**
251
+ * Find an idle worker
252
+ */
253
+ findIdleWorker() {
254
+ for (const worker of this.workers.values()) {
255
+ if (worker.status === 'idle') {
256
+ return worker;
257
+ }
258
+ }
259
+ return null;
260
+ }
261
+ /**
262
+ * Assign a task to a worker
263
+ */
264
+ async assignTask(worker, task) {
265
+ try {
266
+ const response = await worker.execute(task);
267
+ if (task.timeoutId)
268
+ clearTimeout(task.timeoutId);
269
+ if (response.success) {
270
+ task.resolve(response.result);
271
+ }
272
+ else {
273
+ task.reject(new Error(response.error || 'Unknown worker error'));
274
+ }
275
+ this.emit('taskCompleted', {
276
+ taskId: response.id,
277
+ workerId: worker.id,
278
+ executionTime: response.executionTime,
279
+ });
280
+ // Process next queued task
281
+ this.processQueue();
282
+ }
283
+ catch (error) {
284
+ if (task.timeoutId)
285
+ clearTimeout(task.timeoutId);
286
+ task.reject(error instanceof Error ? error : new Error(String(error)));
287
+ }
288
+ }
289
+ /**
290
+ * Handle task timeout
291
+ */
292
+ handleTaskTimeout(task) {
293
+ task.reject(new Error('Task timeout'));
294
+ // Remove from queue if present
295
+ const queueIndex = this.taskQueue.findIndex((t) => t.id === task.id);
296
+ if (queueIndex !== -1) {
297
+ this.taskQueue.splice(queueIndex, 1);
298
+ }
299
+ }
300
+ /**
301
+ * Process queued tasks
302
+ */
303
+ processQueue() {
304
+ while (this.taskQueue.length > 0) {
305
+ const idleWorker = this.findIdleWorker();
306
+ if (idleWorker) {
307
+ const task = this.taskQueue.shift();
308
+ this.assignTask(idleWorker, task);
309
+ }
310
+ else if (this.workers.size < this.config.maxWorkers) {
311
+ const newWorker = this.spawnWorker();
312
+ if (newWorker) {
313
+ const task = this.taskQueue.shift();
314
+ this.assignTask(newWorker, task);
315
+ }
316
+ else {
317
+ break;
318
+ }
319
+ }
320
+ else {
321
+ break;
322
+ }
323
+ }
324
+ }
325
+ /**
326
+ * Cleanup idle workers
327
+ */
328
+ cleanupIdleWorkers() {
329
+ if (this.isShuttingDown)
330
+ return;
331
+ const now = Date.now();
332
+ const workersToRemove = [];
333
+ for (const [id, worker] of this.workers) {
334
+ if (worker.status === 'idle' &&
335
+ now - worker.info.lastActiveAt > this.config.idleTimeout &&
336
+ this.workers.size > this.config.minWorkers) {
337
+ workersToRemove.push(id);
338
+ }
339
+ }
340
+ for (const id of workersToRemove) {
341
+ const worker = this.workers.get(id);
342
+ if (worker) {
343
+ worker.terminate();
344
+ this.workers.delete(id);
345
+ this.emit('workerExit', { workerId: id, code: 0 });
346
+ }
347
+ }
348
+ }
349
+ }
350
+ exports.WorkerPool = WorkerPool;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Worker Script
3
+ *
4
+ * This file is reserved for future native worker thread support.
5
+ * Currently, the WorkerPool uses virtual workers that execute
6
+ * tasks asynchronously on the main thread with yielding.
7
+ *
8
+ * When FiveM or the target environment supports native worker threads,
9
+ * this script can be used as the worker entry point.
10
+ */
11
+ import type { WorkerMessage, WorkerResponse } from './types';
12
+ /**
13
+ * Execute a compute function from its string body
14
+ */
15
+ export declare function executeCompute(functionBody: string, input: unknown): unknown;
16
+ /**
17
+ * Process a worker message and return a response
18
+ */
19
+ export declare function processMessage(message: WorkerMessage): WorkerResponse;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ /**
3
+ * Worker Script
4
+ *
5
+ * This file is reserved for future native worker thread support.
6
+ * Currently, the WorkerPool uses virtual workers that execute
7
+ * tasks asynchronously on the main thread with yielding.
8
+ *
9
+ * When FiveM or the target environment supports native worker threads,
10
+ * this script can be used as the worker entry point.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.executeCompute = executeCompute;
14
+ exports.processMessage = processMessage;
15
+ /**
16
+ * Execute a compute function from its string body
17
+ */
18
+ function executeCompute(functionBody, input) {
19
+ const fn = new Function('input', `return (${functionBody})(input)`);
20
+ return fn(input);
21
+ }
22
+ /**
23
+ * Process a worker message and return a response
24
+ */
25
+ function processMessage(message) {
26
+ const startTime = performance.now();
27
+ try {
28
+ const result = executeCompute(message.functionBody, message.input);
29
+ const executionTime = performance.now() - startTime;
30
+ return {
31
+ id: message.id,
32
+ success: true,
33
+ result,
34
+ executionTime,
35
+ };
36
+ }
37
+ catch (error) {
38
+ const executionTime = performance.now() - startTime;
39
+ return {
40
+ id: message.id,
41
+ success: false,
42
+ error: error instanceof Error ? error.message : String(error),
43
+ executionTime,
44
+ };
45
+ }
46
+ }
47
+ // Note: Native worker thread initialization would go here
48
+ // when the runtime supports it. For now, this module exports
49
+ // utilities that can be used by the virtual worker implementation.
@@ -0,0 +1,59 @@
1
+ import type { Player } from '../entities/player';
2
+ /**
3
+ * Internal service that orchestrates player data persistence.
4
+ *
5
+ * This service manages the lifecycle of persistence hooks and auto-save intervals.
6
+ * It is used internally by the framework and should not be instantiated directly.
7
+ */
8
+ export declare class PlayerPersistenceService {
9
+ private provider;
10
+ private autoSaveIntervals;
11
+ private initialized;
12
+ /**
13
+ * Initializes the persistence service by resolving the provider from DI.
14
+ * Called during bootstrap if a provider is registered.
15
+ */
16
+ initialize(): void;
17
+ /**
18
+ * Whether persistence is enabled (provider is configured).
19
+ */
20
+ get isEnabled(): boolean;
21
+ /**
22
+ * Handles player session load - called when a player joins.
23
+ *
24
+ * @param player - The player who just joined
25
+ */
26
+ handleSessionLoad(player: Player): Promise<void>;
27
+ /**
28
+ * Handles player session save - called when a player disconnects.
29
+ *
30
+ * @param player - The player who is disconnecting
31
+ */
32
+ handleSessionSave(player: Player): Promise<void>;
33
+ /**
34
+ * Manually triggers a save for a specific player.
35
+ *
36
+ * @param player - The player whose data should be saved
37
+ */
38
+ savePlayer(player: Player): Promise<void>;
39
+ /**
40
+ * Saves all connected players' data.
41
+ * Useful for server shutdown or periodic global saves.
42
+ *
43
+ * @param players - Array of all connected players
44
+ */
45
+ saveAllPlayers(players: Player[]): Promise<void>;
46
+ /**
47
+ * Starts the auto-save interval for a player.
48
+ */
49
+ private startAutoSave;
50
+ /**
51
+ * Stops the auto-save interval for a player.
52
+ */
53
+ private stopAutoSave;
54
+ /**
55
+ * Stops all auto-save intervals.
56
+ * Called during server shutdown.
57
+ */
58
+ stopAllAutoSaves(): void;
59
+ }