@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.
- package/LICENSE +373 -0
- package/README.md +360 -0
- package/dist/client/client-bootstrap.d.ts +1 -0
- package/dist/client/client-bootstrap.js +50 -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 +1 -0
- package/dist/client/client-core.js +7 -0
- package/dist/client/controllers/spawner.controller.d.ts +12 -0
- package/dist/client/controllers/spawner.controller.js +51 -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 +7 -0
- package/dist/client/index.js +23 -0
- package/dist/client/interfaces/appearance.interface.d.ts +19 -0
- package/dist/client/interfaces/appearance.interface.js +2 -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/appearance.service.d.ts +6 -0
- package/dist/client/services/appearance.service.js +89 -0
- package/dist/client/services/blip.service.d.ts +112 -0
- package/dist/client/services/blip.service.js +215 -0
- package/dist/client/services/index.d.ts +9 -0
- package/dist/client/services/index.js +25 -0
- package/dist/client/services/marker.service.d.ts +94 -0
- package/dist/client/services/marker.service.js +153 -0
- package/dist/client/services/notification.service.d.ts +76 -0
- package/dist/client/services/notification.service.js +111 -0
- package/dist/client/services/ped.service.d.ts +182 -0
- package/dist/client/services/ped.service.js +302 -0
- package/dist/client/services/progress.service.d.ts +82 -0
- package/dist/client/services/progress.service.js +210 -0
- package/dist/client/services/spawn.service.d.ts +73 -0
- package/dist/client/services/spawn.service.js +261 -0
- package/dist/client/services/streaming.service.d.ts +165 -0
- package/dist/client/services/streaming.service.js +341 -0
- package/dist/client/services/textui.service.d.ts +82 -0
- package/dist/client/services/textui.service.js +156 -0
- package/dist/client/services/vehicle.service.d.ts +168 -0
- package/dist/client/services/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 +5 -0
- package/dist/index.js +41 -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/controllers/session.controller.d.ts +9 -0
- package/dist/server/controllers/session.controller.js +70 -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 +49 -0
- package/dist/server/decorators/command.js +23 -0
- package/dist/server/decorators/controller.d.ts +25 -0
- package/dist/server/decorators/controller.js +36 -0
- package/dist/server/decorators/export.d.ts +39 -0
- package/dist/server/decorators/export.js +47 -0
- package/dist/server/decorators/guard.d.ts +56 -0
- package/dist/server/decorators/guard.js +82 -0
- package/dist/server/decorators/index.d.ts +10 -0
- package/dist/server/decorators/index.js +29 -0
- package/dist/server/decorators/onFiveMEvent.d.ts +6 -0
- package/dist/server/decorators/onFiveMEvent.js +14 -0
- package/dist/server/decorators/onFrameworkEvent.d.ts +22 -0
- package/dist/server/decorators/onFrameworkEvent.js +29 -0
- package/dist/server/decorators/onNet.d.ts +58 -0
- package/dist/server/decorators/onNet.js +57 -0
- package/dist/server/decorators/onTick.d.ts +32 -0
- package/dist/server/decorators/onTick.js +40 -0
- package/dist/server/decorators/public.d.ts +27 -0
- package/dist/server/decorators/public.js +36 -0
- package/dist/server/decorators/requiresState.d.ts +56 -0
- package/dist/server/decorators/requiresState.js +63 -0
- package/dist/server/decorators/throttle.d.ts +48 -0
- package/dist/server/decorators/throttle.js +63 -0
- package/dist/server/decorators/utils.d.ts +57 -0
- package/dist/server/decorators/utils.js +63 -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/helpers/resolve-method.d.ts +5 -0
- package/dist/server/helpers/resolve-method.js +18 -0
- package/dist/server/index.d.ts +10 -0
- package/dist/server/index.js +31 -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 +51 -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 +77 -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 +10 -0
- package/dist/server/system/metadata-server.keys.js +13 -0
- package/dist/server/system/processors/command.processor.d.ts +9 -0
- package/dist/server/system/processors/command.processor.js +30 -0
- package/dist/server/system/processors/coreEvent.processor.d.ts +7 -0
- package/dist/server/system/processors/coreEvent.processor.js +41 -0
- package/dist/server/system/processors/export.processor.d.ts +7 -0
- package/dist/server/system/processors/export.processor.js +30 -0
- package/dist/server/system/processors/fivemEvent.processor.d.ts +7 -0
- package/dist/server/system/processors/fivemEvent.processor.js +40 -0
- package/dist/server/system/processors/netEvent.processor.d.ts +11 -0
- package/dist/server/system/processors/netEvent.processor.js +103 -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 +23 -0
- package/dist/server/system/schema-generator.d.ts +2 -0
- package/dist/server/system/schema-generator.js +34 -0
- package/dist/server/templates/admin/admin.controller-template.d.ts +12 -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 +22 -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 +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
|
+
}
|