@open-core/framework 1.0.1-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +350 -0
  3. package/dist/client/client-bootstrap.d.ts +1 -0
  4. package/dist/client/client-bootstrap.js +53 -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 +18 -0
  8. package/dist/client/client-core.js +52 -0
  9. package/dist/client/decorators/controller.d.ts +3 -0
  10. package/dist/client/decorators/controller.js +14 -0
  11. package/dist/client/decorators/export.d.ts +7 -0
  12. package/dist/client/decorators/export.js +15 -0
  13. package/dist/client/decorators/gameEvent.d.ts +47 -0
  14. package/dist/client/decorators/gameEvent.js +54 -0
  15. package/dist/client/decorators/index.d.ts +10 -0
  16. package/dist/client/decorators/index.js +26 -0
  17. package/dist/client/decorators/interval.d.ts +7 -0
  18. package/dist/client/decorators/interval.js +15 -0
  19. package/dist/client/decorators/key.d.ts +2 -0
  20. package/dist/client/decorators/key.js +10 -0
  21. package/dist/client/decorators/localEvent.d.ts +7 -0
  22. package/dist/client/decorators/localEvent.js +15 -0
  23. package/dist/client/decorators/nui.d.ts +1 -0
  24. package/dist/client/decorators/nui.js +9 -0
  25. package/dist/client/decorators/onNet.d.ts +1 -0
  26. package/dist/client/decorators/onNet.js +9 -0
  27. package/dist/client/decorators/resourceLifecycle.d.ts +11 -0
  28. package/dist/client/decorators/resourceLifecycle.js +24 -0
  29. package/dist/client/decorators/tick.d.ts +1 -0
  30. package/dist/client/decorators/tick.js +9 -0
  31. package/dist/client/index.d.ts +6 -0
  32. package/dist/client/index.js +22 -0
  33. package/dist/client/loaders/exports.loader.d.ts +1 -0
  34. package/dist/client/loaders/exports.loader.js +13 -0
  35. package/dist/client/player/player.d.ts +262 -0
  36. package/dist/client/player/player.js +480 -0
  37. package/dist/client/player/player.loader.d.ts +1 -0
  38. package/dist/client/player/player.loader.js +22 -0
  39. package/dist/client/services/core/index.d.ts +1 -0
  40. package/dist/client/services/core/index.js +17 -0
  41. package/dist/client/services/core/spawn.service.d.ts +20 -0
  42. package/dist/client/services/core/spawn.service.js +143 -0
  43. package/dist/client/services/index.d.ts +4 -0
  44. package/dist/client/services/index.js +24 -0
  45. package/dist/client/services/streaming/index.d.ts +1 -0
  46. package/dist/client/services/streaming/index.js +17 -0
  47. package/dist/client/services/streaming/streaming.service.d.ts +165 -0
  48. package/dist/client/services/streaming/streaming.service.js +341 -0
  49. package/dist/client/services/ui/index.d.ts +3 -0
  50. package/dist/client/services/ui/index.js +19 -0
  51. package/dist/client/services/ui/notification.service.d.ts +76 -0
  52. package/dist/client/services/ui/notification.service.js +111 -0
  53. package/dist/client/services/ui/progress.service.d.ts +82 -0
  54. package/dist/client/services/ui/progress.service.js +210 -0
  55. package/dist/client/services/ui/textui.service.d.ts +82 -0
  56. package/dist/client/services/ui/textui.service.js +156 -0
  57. package/dist/client/services/world/blip.service.d.ts +112 -0
  58. package/dist/client/services/world/blip.service.js +215 -0
  59. package/dist/client/services/world/index.d.ts +4 -0
  60. package/dist/client/services/world/index.js +20 -0
  61. package/dist/client/services/world/marker.service.d.ts +94 -0
  62. package/dist/client/services/world/marker.service.js +153 -0
  63. package/dist/client/services/world/ped.service.d.ts +182 -0
  64. package/dist/client/services/world/ped.service.js +302 -0
  65. package/dist/client/services/world/vehicle.service.d.ts +168 -0
  66. package/dist/client/services/world/vehicle.service.js +296 -0
  67. package/dist/client/system/metadata-client.keys.d.ts +13 -0
  68. package/dist/client/system/metadata-client.keys.js +16 -0
  69. package/dist/client/system/processors/export.processor.d.ts +7 -0
  70. package/dist/client/system/processors/export.processor.js +39 -0
  71. package/dist/client/system/processors/gameEvent.processor.d.ts +10 -0
  72. package/dist/client/system/processors/gameEvent.processor.js +58 -0
  73. package/dist/client/system/processors/interval.processor.d.ts +7 -0
  74. package/dist/client/system/processors/interval.processor.js +43 -0
  75. package/dist/client/system/processors/key.processor.d.ts +8 -0
  76. package/dist/client/system/processors/key.processor.js +27 -0
  77. package/dist/client/system/processors/localEvent.processor.d.ts +7 -0
  78. package/dist/client/system/processors/localEvent.processor.js +38 -0
  79. package/dist/client/system/processors/netEvent.processor.d.ts +7 -0
  80. package/dist/client/system/processors/netEvent.processor.js +38 -0
  81. package/dist/client/system/processors/nui.processor.d.ts +7 -0
  82. package/dist/client/system/processors/nui.processor.js +40 -0
  83. package/dist/client/system/processors/resourceLifecycle.processor.d.ts +9 -0
  84. package/dist/client/system/processors/resourceLifecycle.processor.js +69 -0
  85. package/dist/client/system/processors/tick.processor.d.ts +5 -0
  86. package/dist/client/system/processors/tick.processor.js +37 -0
  87. package/dist/client/system/processors.register.d.ts +1 -0
  88. package/dist/client/system/processors.register.js +27 -0
  89. package/dist/client/types/game-events.d.ts +126 -0
  90. package/dist/client/types/game-events.js +83 -0
  91. package/dist/client/types/index.d.ts +1 -0
  92. package/dist/client/types/index.js +17 -0
  93. package/dist/client/ui-bridge.d.ts +116 -0
  94. package/dist/client/ui-bridge.js +201 -0
  95. package/dist/index.d.ts +7 -0
  96. package/dist/index.js +46 -0
  97. package/dist/server/bootstrap.d.ts +16 -0
  98. package/dist/server/bootstrap.js +57 -0
  99. package/dist/server/bus/core-event-bus.d.ts +6 -0
  100. package/dist/server/bus/core-event-bus.js +31 -0
  101. package/dist/server/configs/api.config.d.ts +71 -0
  102. package/dist/server/configs/api.config.js +81 -0
  103. package/dist/server/configs/config.base.d.ts +63 -0
  104. package/dist/server/configs/config.base.js +64 -0
  105. package/dist/server/configs/index.d.ts +2 -0
  106. package/dist/server/configs/index.js +18 -0
  107. package/dist/server/container.d.ts +2 -0
  108. package/dist/server/container.js +6 -0
  109. package/dist/server/controllers/chat.controller.d.ts +10 -0
  110. package/dist/server/controllers/chat.controller.js +50 -0
  111. package/dist/server/controllers/command.controller.d.ts +7 -0
  112. package/dist/server/controllers/command.controller.js +47 -0
  113. package/dist/server/core.d.ts +1 -0
  114. package/dist/server/core.js +7 -0
  115. package/dist/server/database/adapters/oxmysql.adapter.d.ts +89 -0
  116. package/dist/server/database/adapters/oxmysql.adapter.js +149 -0
  117. package/dist/server/database/database.contract.d.ts +128 -0
  118. package/dist/server/database/database.contract.js +29 -0
  119. package/dist/server/database/database.service.d.ts +216 -0
  120. package/dist/server/database/database.service.js +301 -0
  121. package/dist/server/database/index.d.ts +53 -0
  122. package/dist/server/database/index.js +70 -0
  123. package/dist/server/database/types.d.ts +67 -0
  124. package/dist/server/database/types.js +7 -0
  125. package/dist/server/database.d.ts +7 -0
  126. package/dist/server/database.js +23 -0
  127. package/dist/server/decorators/bind.d.ts +2 -0
  128. package/dist/server/decorators/bind.js +15 -0
  129. package/dist/server/decorators/command.d.ts +19 -0
  130. package/dist/server/decorators/command.js +18 -0
  131. package/dist/server/decorators/controller.d.ts +3 -0
  132. package/dist/server/decorators/controller.js +14 -0
  133. package/dist/server/decorators/coreEvent.d.ts +2 -0
  134. package/dist/server/decorators/coreEvent.js +9 -0
  135. package/dist/server/decorators/export.d.ts +1 -0
  136. package/dist/server/decorators/export.js +9 -0
  137. package/dist/server/decorators/guard.d.ts +5 -0
  138. package/dist/server/decorators/guard.js +39 -0
  139. package/dist/server/decorators/index.d.ts +10 -0
  140. package/dist/server/decorators/index.js +26 -0
  141. package/dist/server/decorators/netEvent.d.ts +36 -0
  142. package/dist/server/decorators/netEvent.js +40 -0
  143. package/dist/server/decorators/onTick.d.ts +1 -0
  144. package/dist/server/decorators/onTick.js +9 -0
  145. package/dist/server/decorators/public.d.ts +16 -0
  146. package/dist/server/decorators/public.js +25 -0
  147. package/dist/server/decorators/requiresState.d.ts +55 -0
  148. package/dist/server/decorators/requiresState.js +62 -0
  149. package/dist/server/decorators/throttle.d.ts +9 -0
  150. package/dist/server/decorators/throttle.js +36 -0
  151. package/dist/server/decorators/utils.d.ts +7 -0
  152. package/dist/server/decorators/utils.js +13 -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/index.d.ts +10 -0
  160. package/dist/server/index.js +29 -0
  161. package/dist/server/loaders/exports.loader.d.ts +0 -0
  162. package/dist/server/loaders/exports.loader.js +23 -0
  163. package/dist/server/loaders/playerSession.loader.d.ts +1 -0
  164. package/dist/server/loaders/playerSession.loader.js +42 -0
  165. package/dist/server/services/access-control.service.d.ts +56 -0
  166. package/dist/server/services/access-control.service.js +99 -0
  167. package/dist/server/services/chat.service.d.ts +7 -0
  168. package/dist/server/services/chat.service.js +31 -0
  169. package/dist/server/services/command.service.d.ts +15 -0
  170. package/dist/server/services/command.service.js +74 -0
  171. package/dist/server/services/config.service.d.ts +75 -0
  172. package/dist/server/services/config.service.js +116 -0
  173. package/dist/server/services/default/default-security.handler.d.ts +6 -0
  174. package/dist/server/services/default/default-security.handler.js +26 -0
  175. package/dist/server/services/http/http.service.d.ts +50 -0
  176. package/dist/server/services/http/http.service.js +126 -0
  177. package/dist/server/services/index.d.ts +10 -0
  178. package/dist/server/services/index.js +26 -0
  179. package/dist/server/services/parallel/index.d.ts +49 -0
  180. package/dist/server/services/parallel/index.js +67 -0
  181. package/dist/server/services/parallel/parallel-compute.service.d.ts +132 -0
  182. package/dist/server/services/parallel/parallel-compute.service.js +449 -0
  183. package/dist/server/services/parallel/types.d.ts +188 -0
  184. package/dist/server/services/parallel/types.js +7 -0
  185. package/dist/server/services/parallel/worker-pool.d.ts +83 -0
  186. package/dist/server/services/parallel/worker-pool.js +350 -0
  187. package/dist/server/services/parallel/worker.d.ts +19 -0
  188. package/dist/server/services/parallel/worker.js +49 -0
  189. package/dist/server/services/persistence.service.d.ts +59 -0
  190. package/dist/server/services/persistence.service.js +166 -0
  191. package/dist/server/services/player.service.d.ts +96 -0
  192. package/dist/server/services/player.service.js +132 -0
  193. package/dist/server/services/rate-limiter.service.d.ts +5 -0
  194. package/dist/server/services/rate-limiter.service.js +39 -0
  195. package/dist/server/services/registers.d.ts +1 -0
  196. package/dist/server/services/registers.js +18 -0
  197. package/dist/server/setup.d.ts +9 -0
  198. package/dist/server/setup.js +28 -0
  199. package/dist/server/system/metadata-server.keys.d.ts +9 -0
  200. package/dist/server/system/metadata-server.keys.js +12 -0
  201. package/dist/server/system/processors/command.processor.d.ts +9 -0
  202. package/dist/server/system/processors/command.processor.js +31 -0
  203. package/dist/server/system/processors/coreEvent.processor.d.ts +7 -0
  204. package/dist/server/system/processors/coreEvent.processor.js +38 -0
  205. package/dist/server/system/processors/export.processor.d.ts +7 -0
  206. package/dist/server/system/processors/export.processor.js +26 -0
  207. package/dist/server/system/processors/netEvent.processor.d.ts +11 -0
  208. package/dist/server/system/processors/netEvent.processor.js +100 -0
  209. package/dist/server/system/processors/tick.processor.d.ts +5 -0
  210. package/dist/server/system/processors/tick.processor.js +36 -0
  211. package/dist/server/system/processors.register.d.ts +1 -0
  212. package/dist/server/system/processors.register.js +21 -0
  213. package/dist/server/templates/admin/admin.controller-template.d.ts +10 -0
  214. package/dist/server/templates/admin/admin.controller-template.js +2 -0
  215. package/dist/server/templates/auth/auth-provider.contract.d.ts +58 -0
  216. package/dist/server/templates/auth/auth-provider.contract.js +23 -0
  217. package/dist/server/templates/index.d.ts +8 -0
  218. package/dist/server/templates/index.js +21 -0
  219. package/dist/server/templates/persistence/index.d.ts +30 -0
  220. package/dist/server/templates/persistence/index.js +34 -0
  221. package/dist/server/templates/persistence/player-persistence.contract.d.ts +86 -0
  222. package/dist/server/templates/persistence/player-persistence.contract.js +52 -0
  223. package/dist/server/templates/repository/index.d.ts +57 -0
  224. package/dist/server/templates/repository/index.js +61 -0
  225. package/dist/server/templates/repository/repository.contract.d.ts +224 -0
  226. package/dist/server/templates/repository/repository.contract.js +342 -0
  227. package/dist/server/templates/repository/repository.types.d.ts +51 -0
  228. package/dist/server/templates/repository/repository.types.js +7 -0
  229. package/dist/server/templates/security/permission.types.d.ts +32 -0
  230. package/dist/server/templates/security/permission.types.js +2 -0
  231. package/dist/server/templates/security/principal-provider.contract.d.ts +43 -0
  232. package/dist/server/templates/security/principal-provider.contract.js +19 -0
  233. package/dist/server/templates/security/security-handler.contract.d.ts +5 -0
  234. package/dist/server/templates/security/security-handler.contract.js +6 -0
  235. package/dist/server/types/core-events.d.ts +17 -0
  236. package/dist/server/types/core-events.js +2 -0
  237. package/dist/server/types/security.types.d.ts +7 -0
  238. package/dist/server/types/security.types.js +2 -0
  239. package/dist/shared/index.d.ts +1 -0
  240. package/dist/shared/index.js +17 -0
  241. package/dist/shared/logger/core-logger.d.ts +35 -0
  242. package/dist/shared/logger/core-logger.js +52 -0
  243. package/dist/shared/logger/index.d.ts +11 -0
  244. package/dist/shared/logger/index.js +26 -0
  245. package/dist/shared/logger/logger.config.d.ts +47 -0
  246. package/dist/shared/logger/logger.config.js +33 -0
  247. package/dist/shared/logger/logger.service.d.ts +161 -0
  248. package/dist/shared/logger/logger.service.js +279 -0
  249. package/dist/shared/logger/logger.types.d.ts +85 -0
  250. package/dist/shared/logger/logger.types.js +74 -0
  251. package/dist/shared/logger/transports/buffered.transport.d.ts +88 -0
  252. package/dist/shared/logger/transports/buffered.transport.js +174 -0
  253. package/dist/shared/logger/transports/console.transport.d.ts +37 -0
  254. package/dist/shared/logger/transports/console.transport.js +134 -0
  255. package/dist/shared/logger/transports/index.d.ts +3 -0
  256. package/dist/shared/logger/transports/index.js +19 -0
  257. package/dist/shared/logger/transports/transport.interface.d.ts +40 -0
  258. package/dist/shared/logger/transports/transport.interface.js +2 -0
  259. package/dist/system/class-constructor.d.ts +1 -0
  260. package/dist/system/class-constructor.js +2 -0
  261. package/dist/system/decorator-processor.d.ts +4 -0
  262. package/dist/system/decorator-processor.js +2 -0
  263. package/dist/system/metadata.scanner.d.ts +7 -0
  264. package/dist/system/metadata.scanner.js +45 -0
  265. package/dist/utils/errors.d.ts +14 -0
  266. package/dist/utils/errors.js +25 -0
  267. package/dist/utils/index.d.ts +4 -0
  268. package/dist/utils/index.js +20 -0
  269. package/dist/utils/result.d.ts +12 -0
  270. package/dist/utils/result.js +10 -0
  271. package/dist/utils/rgb.d.ts +5 -0
  272. package/dist/utils/rgb.js +2 -0
  273. package/dist/utils/vector3.d.ts +13 -0
  274. package/dist/utils/vector3.js +27 -0
  275. package/package.json +70 -0
@@ -0,0 +1,188 @@
1
+ /**
2
+ * ParallelCompute Module Types
3
+ *
4
+ * Provides type definitions for the parallel computation system.
5
+ */
6
+ /**
7
+ * Task execution mode
8
+ */
9
+ export type ExecutionMode = 'auto' | 'sync' | 'parallel';
10
+ /**
11
+ * Worker pool configuration
12
+ */
13
+ export interface WorkerPoolConfig {
14
+ /** Minimum number of workers to keep alive */
15
+ minWorkers: number;
16
+ /** Maximum number of workers to spawn */
17
+ maxWorkers: number;
18
+ /** Time in ms before idle workers are terminated */
19
+ idleTimeout: number;
20
+ /** Maximum time in ms a task can run before timeout */
21
+ taskTimeout: number;
22
+ }
23
+ /**
24
+ * Options for defining a parallel task
25
+ */
26
+ export interface ParallelTaskOptions<TInput, TOutput> {
27
+ /** Unique name for the task (used for debugging and metrics) */
28
+ name: string;
29
+ /**
30
+ * Function to estimate computational cost based on input.
31
+ * Higher values = more likely to use worker.
32
+ * Return a number representing relative complexity.
33
+ */
34
+ estimateCost?: (input: TInput) => number;
35
+ /**
36
+ * If estimated cost exceeds this threshold, automatically use worker.
37
+ * Default: 10000
38
+ */
39
+ workerThreshold?: number;
40
+ /**
41
+ * The compute function to execute.
42
+ * MUST be pure (no closures, no external dependencies).
43
+ * Will be serialized and sent to worker.
44
+ */
45
+ compute: (input: TInput) => TOutput;
46
+ /**
47
+ * Optional function to split input into chunks for multiple workers.
48
+ * Enables parallel processing across multiple workers.
49
+ */
50
+ chunker?: (input: TInput, workerCount: number) => TInput[];
51
+ /**
52
+ * Optional function to merge results from multiple chunks.
53
+ * Required if chunker is provided.
54
+ */
55
+ merger?: (results: TOutput[]) => TOutput;
56
+ }
57
+ /**
58
+ * A defined parallel task that can be executed
59
+ */
60
+ export interface ParallelTask<TInput, TOutput> {
61
+ /** Task name */
62
+ readonly name: string;
63
+ /** Task options */
64
+ readonly options: ParallelTaskOptions<TInput, TOutput>;
65
+ /**
66
+ * Execute the task with automatic mode selection.
67
+ * Uses worker if estimated cost exceeds threshold.
68
+ */
69
+ run(input: TInput): Promise<TOutput>;
70
+ /**
71
+ * Force execution on main thread (synchronous).
72
+ */
73
+ sync(input: TInput): TOutput;
74
+ /**
75
+ * Force execution on worker thread.
76
+ */
77
+ parallel(input: TInput): Promise<TOutput>;
78
+ /**
79
+ * Execute with multiple workers (requires chunker/merger).
80
+ */
81
+ distributed(input: TInput, workerCount?: number): Promise<TOutput>;
82
+ }
83
+ /**
84
+ * Message sent to worker
85
+ */
86
+ export interface WorkerMessage {
87
+ id: string;
88
+ taskName: string;
89
+ functionBody: string;
90
+ input: unknown;
91
+ }
92
+ /**
93
+ * Response from worker
94
+ */
95
+ export interface WorkerResponse {
96
+ id: string;
97
+ success: boolean;
98
+ result?: unknown;
99
+ error?: string;
100
+ executionTime: number;
101
+ }
102
+ /**
103
+ * Worker status
104
+ */
105
+ export type WorkerStatus = 'idle' | 'busy' | 'terminated';
106
+ /**
107
+ * Worker info for pool management
108
+ */
109
+ export interface WorkerInfo {
110
+ id: number;
111
+ status: WorkerStatus;
112
+ currentTaskId: string | null;
113
+ tasksCompleted: number;
114
+ lastActiveAt: number;
115
+ }
116
+ /**
117
+ * Metrics for parallel compute service
118
+ */
119
+ export interface ParallelComputeMetrics {
120
+ /** Total tasks executed */
121
+ totalTasks: number;
122
+ /** Tasks executed on main thread */
123
+ syncTasks: number;
124
+ /** Tasks executed on workers */
125
+ parallelTasks: number;
126
+ /** Tasks that failed */
127
+ failedTasks: number;
128
+ /** Average execution time in ms */
129
+ avgExecutionTime: number;
130
+ /** Total time saved by parallelization (estimated) */
131
+ estimatedTimeSaved: number;
132
+ /** Current active workers */
133
+ activeWorkers: number;
134
+ /** Peak worker count */
135
+ peakWorkers: number;
136
+ }
137
+ /**
138
+ * Task execution result with timing info
139
+ */
140
+ export interface TaskResult<T> {
141
+ result: T;
142
+ executionTime: number;
143
+ mode: 'sync' | 'parallel' | 'distributed';
144
+ workerCount?: number;
145
+ }
146
+ /**
147
+ * Built-in compute functions for common operations
148
+ */
149
+ export interface BuiltInComputes {
150
+ /**
151
+ * Filter entities by distance from a position
152
+ */
153
+ filterByDistance: <T extends {
154
+ x: number;
155
+ y: number;
156
+ z: number;
157
+ }>(input: {
158
+ entities: T[];
159
+ position: {
160
+ x: number;
161
+ y: number;
162
+ z: number;
163
+ };
164
+ radius: number;
165
+ }) => T[];
166
+ /**
167
+ * Sort entities by distance from a position
168
+ */
169
+ sortByDistance: <T extends {
170
+ x: number;
171
+ y: number;
172
+ z: number;
173
+ }>(input: {
174
+ entities: T[];
175
+ position: {
176
+ x: number;
177
+ y: number;
178
+ z: number;
179
+ };
180
+ }) => T[];
181
+ /**
182
+ * Batch process items with a transform function
183
+ */
184
+ batchProcess: <T, R>(input: {
185
+ items: T[];
186
+ transform: string;
187
+ }) => R[];
188
+ }
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ /**
3
+ * ParallelCompute Module Types
4
+ *
5
+ * Provides type definitions for the parallel computation system.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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.