@open-core/framework 1.0.1-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +373 -0
- package/README.md +350 -0
- package/dist/client/client-bootstrap.d.ts +1 -0
- package/dist/client/client-bootstrap.js +53 -0
- package/dist/client/client-container.d.ts +2 -0
- package/dist/client/client-container.js +6 -0
- package/dist/client/client-core.d.ts +18 -0
- package/dist/client/client-core.js +52 -0
- package/dist/client/decorators/controller.d.ts +3 -0
- package/dist/client/decorators/controller.js +14 -0
- package/dist/client/decorators/export.d.ts +7 -0
- package/dist/client/decorators/export.js +15 -0
- package/dist/client/decorators/gameEvent.d.ts +47 -0
- package/dist/client/decorators/gameEvent.js +54 -0
- package/dist/client/decorators/index.d.ts +10 -0
- package/dist/client/decorators/index.js +26 -0
- package/dist/client/decorators/interval.d.ts +7 -0
- package/dist/client/decorators/interval.js +15 -0
- package/dist/client/decorators/key.d.ts +2 -0
- package/dist/client/decorators/key.js +10 -0
- package/dist/client/decorators/localEvent.d.ts +7 -0
- package/dist/client/decorators/localEvent.js +15 -0
- package/dist/client/decorators/nui.d.ts +1 -0
- package/dist/client/decorators/nui.js +9 -0
- package/dist/client/decorators/onNet.d.ts +1 -0
- package/dist/client/decorators/onNet.js +9 -0
- package/dist/client/decorators/resourceLifecycle.d.ts +11 -0
- package/dist/client/decorators/resourceLifecycle.js +24 -0
- package/dist/client/decorators/tick.d.ts +1 -0
- package/dist/client/decorators/tick.js +9 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.js +22 -0
- package/dist/client/loaders/exports.loader.d.ts +1 -0
- package/dist/client/loaders/exports.loader.js +13 -0
- package/dist/client/player/player.d.ts +262 -0
- package/dist/client/player/player.js +480 -0
- package/dist/client/player/player.loader.d.ts +1 -0
- package/dist/client/player/player.loader.js +22 -0
- package/dist/client/services/core/index.d.ts +1 -0
- package/dist/client/services/core/index.js +17 -0
- package/dist/client/services/core/spawn.service.d.ts +20 -0
- package/dist/client/services/core/spawn.service.js +143 -0
- package/dist/client/services/index.d.ts +4 -0
- package/dist/client/services/index.js +24 -0
- package/dist/client/services/streaming/index.d.ts +1 -0
- package/dist/client/services/streaming/index.js +17 -0
- package/dist/client/services/streaming/streaming.service.d.ts +165 -0
- package/dist/client/services/streaming/streaming.service.js +341 -0
- package/dist/client/services/ui/index.d.ts +3 -0
- package/dist/client/services/ui/index.js +19 -0
- package/dist/client/services/ui/notification.service.d.ts +76 -0
- package/dist/client/services/ui/notification.service.js +111 -0
- package/dist/client/services/ui/progress.service.d.ts +82 -0
- package/dist/client/services/ui/progress.service.js +210 -0
- package/dist/client/services/ui/textui.service.d.ts +82 -0
- package/dist/client/services/ui/textui.service.js +156 -0
- package/dist/client/services/world/blip.service.d.ts +112 -0
- package/dist/client/services/world/blip.service.js +215 -0
- package/dist/client/services/world/index.d.ts +4 -0
- package/dist/client/services/world/index.js +20 -0
- package/dist/client/services/world/marker.service.d.ts +94 -0
- package/dist/client/services/world/marker.service.js +153 -0
- package/dist/client/services/world/ped.service.d.ts +182 -0
- package/dist/client/services/world/ped.service.js +302 -0
- package/dist/client/services/world/vehicle.service.d.ts +168 -0
- package/dist/client/services/world/vehicle.service.js +296 -0
- package/dist/client/system/metadata-client.keys.d.ts +13 -0
- package/dist/client/system/metadata-client.keys.js +16 -0
- package/dist/client/system/processors/export.processor.d.ts +7 -0
- package/dist/client/system/processors/export.processor.js +39 -0
- package/dist/client/system/processors/gameEvent.processor.d.ts +10 -0
- package/dist/client/system/processors/gameEvent.processor.js +58 -0
- package/dist/client/system/processors/interval.processor.d.ts +7 -0
- package/dist/client/system/processors/interval.processor.js +43 -0
- package/dist/client/system/processors/key.processor.d.ts +8 -0
- package/dist/client/system/processors/key.processor.js +27 -0
- package/dist/client/system/processors/localEvent.processor.d.ts +7 -0
- package/dist/client/system/processors/localEvent.processor.js +38 -0
- package/dist/client/system/processors/netEvent.processor.d.ts +7 -0
- package/dist/client/system/processors/netEvent.processor.js +38 -0
- package/dist/client/system/processors/nui.processor.d.ts +7 -0
- package/dist/client/system/processors/nui.processor.js +40 -0
- package/dist/client/system/processors/resourceLifecycle.processor.d.ts +9 -0
- package/dist/client/system/processors/resourceLifecycle.processor.js +69 -0
- package/dist/client/system/processors/tick.processor.d.ts +5 -0
- package/dist/client/system/processors/tick.processor.js +37 -0
- package/dist/client/system/processors.register.d.ts +1 -0
- package/dist/client/system/processors.register.js +27 -0
- package/dist/client/types/game-events.d.ts +126 -0
- package/dist/client/types/game-events.js +83 -0
- package/dist/client/types/index.d.ts +1 -0
- package/dist/client/types/index.js +17 -0
- package/dist/client/ui-bridge.d.ts +116 -0
- package/dist/client/ui-bridge.js +201 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +46 -0
- package/dist/server/bootstrap.d.ts +16 -0
- package/dist/server/bootstrap.js +57 -0
- package/dist/server/bus/core-event-bus.d.ts +6 -0
- package/dist/server/bus/core-event-bus.js +31 -0
- package/dist/server/configs/api.config.d.ts +71 -0
- package/dist/server/configs/api.config.js +81 -0
- package/dist/server/configs/config.base.d.ts +63 -0
- package/dist/server/configs/config.base.js +64 -0
- package/dist/server/configs/index.d.ts +2 -0
- package/dist/server/configs/index.js +18 -0
- package/dist/server/container.d.ts +2 -0
- package/dist/server/container.js +6 -0
- package/dist/server/controllers/chat.controller.d.ts +10 -0
- package/dist/server/controllers/chat.controller.js +50 -0
- package/dist/server/controllers/command.controller.d.ts +7 -0
- package/dist/server/controllers/command.controller.js +47 -0
- package/dist/server/core.d.ts +1 -0
- package/dist/server/core.js +7 -0
- package/dist/server/database/adapters/oxmysql.adapter.d.ts +89 -0
- package/dist/server/database/adapters/oxmysql.adapter.js +149 -0
- package/dist/server/database/database.contract.d.ts +128 -0
- package/dist/server/database/database.contract.js +29 -0
- package/dist/server/database/database.service.d.ts +216 -0
- package/dist/server/database/database.service.js +301 -0
- package/dist/server/database/index.d.ts +53 -0
- package/dist/server/database/index.js +70 -0
- package/dist/server/database/types.d.ts +67 -0
- package/dist/server/database/types.js +7 -0
- package/dist/server/database.d.ts +7 -0
- package/dist/server/database.js +23 -0
- package/dist/server/decorators/bind.d.ts +2 -0
- package/dist/server/decorators/bind.js +15 -0
- package/dist/server/decorators/command.d.ts +19 -0
- package/dist/server/decorators/command.js +18 -0
- package/dist/server/decorators/controller.d.ts +3 -0
- package/dist/server/decorators/controller.js +14 -0
- package/dist/server/decorators/coreEvent.d.ts +2 -0
- package/dist/server/decorators/coreEvent.js +9 -0
- package/dist/server/decorators/export.d.ts +1 -0
- package/dist/server/decorators/export.js +9 -0
- package/dist/server/decorators/guard.d.ts +5 -0
- package/dist/server/decorators/guard.js +39 -0
- package/dist/server/decorators/index.d.ts +10 -0
- package/dist/server/decorators/index.js +26 -0
- package/dist/server/decorators/netEvent.d.ts +36 -0
- package/dist/server/decorators/netEvent.js +40 -0
- package/dist/server/decorators/onTick.d.ts +1 -0
- package/dist/server/decorators/onTick.js +9 -0
- package/dist/server/decorators/public.d.ts +16 -0
- package/dist/server/decorators/public.js +25 -0
- package/dist/server/decorators/requiresState.d.ts +55 -0
- package/dist/server/decorators/requiresState.js +62 -0
- package/dist/server/decorators/throttle.d.ts +9 -0
- package/dist/server/decorators/throttle.js +36 -0
- package/dist/server/decorators/utils.d.ts +7 -0
- package/dist/server/decorators/utils.js +13 -0
- package/dist/server/entities/index.d.ts +1 -0
- package/dist/server/entities/index.js +17 -0
- package/dist/server/entities/player.d.ts +157 -0
- package/dist/server/entities/player.js +217 -0
- package/dist/server/error-handler.d.ts +2 -0
- package/dist/server/error-handler.js +43 -0
- package/dist/server/index.d.ts +10 -0
- package/dist/server/index.js +29 -0
- package/dist/server/loaders/exports.loader.d.ts +0 -0
- package/dist/server/loaders/exports.loader.js +23 -0
- package/dist/server/loaders/playerSession.loader.d.ts +1 -0
- package/dist/server/loaders/playerSession.loader.js +42 -0
- package/dist/server/services/access-control.service.d.ts +56 -0
- package/dist/server/services/access-control.service.js +99 -0
- package/dist/server/services/chat.service.d.ts +7 -0
- package/dist/server/services/chat.service.js +31 -0
- package/dist/server/services/command.service.d.ts +15 -0
- package/dist/server/services/command.service.js +74 -0
- package/dist/server/services/config.service.d.ts +75 -0
- package/dist/server/services/config.service.js +116 -0
- package/dist/server/services/default/default-security.handler.d.ts +6 -0
- package/dist/server/services/default/default-security.handler.js +26 -0
- package/dist/server/services/http/http.service.d.ts +50 -0
- package/dist/server/services/http/http.service.js +126 -0
- package/dist/server/services/index.d.ts +10 -0
- package/dist/server/services/index.js +26 -0
- package/dist/server/services/parallel/index.d.ts +49 -0
- package/dist/server/services/parallel/index.js +67 -0
- package/dist/server/services/parallel/parallel-compute.service.d.ts +132 -0
- package/dist/server/services/parallel/parallel-compute.service.js +449 -0
- package/dist/server/services/parallel/types.d.ts +188 -0
- package/dist/server/services/parallel/types.js +7 -0
- package/dist/server/services/parallel/worker-pool.d.ts +83 -0
- package/dist/server/services/parallel/worker-pool.js +350 -0
- package/dist/server/services/parallel/worker.d.ts +19 -0
- package/dist/server/services/parallel/worker.js +49 -0
- package/dist/server/services/persistence.service.d.ts +59 -0
- package/dist/server/services/persistence.service.js +166 -0
- package/dist/server/services/player.service.d.ts +96 -0
- package/dist/server/services/player.service.js +132 -0
- package/dist/server/services/rate-limiter.service.d.ts +5 -0
- package/dist/server/services/rate-limiter.service.js +39 -0
- package/dist/server/services/registers.d.ts +1 -0
- package/dist/server/services/registers.js +18 -0
- package/dist/server/setup.d.ts +9 -0
- package/dist/server/setup.js +28 -0
- package/dist/server/system/metadata-server.keys.d.ts +9 -0
- package/dist/server/system/metadata-server.keys.js +12 -0
- package/dist/server/system/processors/command.processor.d.ts +9 -0
- package/dist/server/system/processors/command.processor.js +31 -0
- package/dist/server/system/processors/coreEvent.processor.d.ts +7 -0
- package/dist/server/system/processors/coreEvent.processor.js +38 -0
- package/dist/server/system/processors/export.processor.d.ts +7 -0
- package/dist/server/system/processors/export.processor.js +26 -0
- package/dist/server/system/processors/netEvent.processor.d.ts +11 -0
- package/dist/server/system/processors/netEvent.processor.js +100 -0
- package/dist/server/system/processors/tick.processor.d.ts +5 -0
- package/dist/server/system/processors/tick.processor.js +36 -0
- package/dist/server/system/processors.register.d.ts +1 -0
- package/dist/server/system/processors.register.js +21 -0
- package/dist/server/templates/admin/admin.controller-template.d.ts +10 -0
- package/dist/server/templates/admin/admin.controller-template.js +2 -0
- package/dist/server/templates/auth/auth-provider.contract.d.ts +58 -0
- package/dist/server/templates/auth/auth-provider.contract.js +23 -0
- package/dist/server/templates/index.d.ts +8 -0
- package/dist/server/templates/index.js +21 -0
- package/dist/server/templates/persistence/index.d.ts +30 -0
- package/dist/server/templates/persistence/index.js +34 -0
- package/dist/server/templates/persistence/player-persistence.contract.d.ts +86 -0
- package/dist/server/templates/persistence/player-persistence.contract.js +52 -0
- package/dist/server/templates/repository/index.d.ts +57 -0
- package/dist/server/templates/repository/index.js +61 -0
- package/dist/server/templates/repository/repository.contract.d.ts +224 -0
- package/dist/server/templates/repository/repository.contract.js +342 -0
- package/dist/server/templates/repository/repository.types.d.ts +51 -0
- package/dist/server/templates/repository/repository.types.js +7 -0
- package/dist/server/templates/security/permission.types.d.ts +32 -0
- package/dist/server/templates/security/permission.types.js +2 -0
- package/dist/server/templates/security/principal-provider.contract.d.ts +43 -0
- package/dist/server/templates/security/principal-provider.contract.js +19 -0
- package/dist/server/templates/security/security-handler.contract.d.ts +5 -0
- package/dist/server/templates/security/security-handler.contract.js +6 -0
- package/dist/server/types/core-events.d.ts +17 -0
- package/dist/server/types/core-events.js +2 -0
- package/dist/server/types/security.types.d.ts +7 -0
- package/dist/server/types/security.types.js +2 -0
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.js +17 -0
- package/dist/shared/logger/core-logger.d.ts +35 -0
- package/dist/shared/logger/core-logger.js +52 -0
- package/dist/shared/logger/index.d.ts +11 -0
- package/dist/shared/logger/index.js +26 -0
- package/dist/shared/logger/logger.config.d.ts +47 -0
- package/dist/shared/logger/logger.config.js +33 -0
- package/dist/shared/logger/logger.service.d.ts +161 -0
- package/dist/shared/logger/logger.service.js +279 -0
- package/dist/shared/logger/logger.types.d.ts +85 -0
- package/dist/shared/logger/logger.types.js +74 -0
- package/dist/shared/logger/transports/buffered.transport.d.ts +88 -0
- package/dist/shared/logger/transports/buffered.transport.js +174 -0
- package/dist/shared/logger/transports/console.transport.d.ts +37 -0
- package/dist/shared/logger/transports/console.transport.js +134 -0
- package/dist/shared/logger/transports/index.d.ts +3 -0
- package/dist/shared/logger/transports/index.js +19 -0
- package/dist/shared/logger/transports/transport.interface.d.ts +40 -0
- package/dist/shared/logger/transports/transport.interface.js +2 -0
- package/dist/system/class-constructor.d.ts +1 -0
- package/dist/system/class-constructor.js +2 -0
- package/dist/system/decorator-processor.d.ts +4 -0
- package/dist/system/decorator-processor.js +2 -0
- package/dist/system/metadata.scanner.d.ts +7 -0
- package/dist/system/metadata.scanner.js +45 -0
- package/dist/utils/errors.d.ts +14 -0
- package/dist/utils/errors.js +25 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +20 -0
- package/dist/utils/result.d.ts +12 -0
- package/dist/utils/result.js +10 -0
- package/dist/utils/rgb.d.ts +5 -0
- package/dist/utils/rgb.js +2 -0
- package/dist/utils/vector3.d.ts +13 -0
- package/dist/utils/vector3.js +27 -0
- package/package.json +70 -0
|
@@ -0,0 +1,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,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.
|