@open-core/framework 0.2.1-beta.1 → 0.2.4

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 (38) hide show
  1. package/LICENSE +373 -373
  2. package/README.md +217 -217
  3. package/dist/adapters/node/node-entity-server.js +3 -0
  4. package/dist/adapters/node/node-exports.d.ts +2 -2
  5. package/dist/kernel/utils/vector3.d.ts +1 -0
  6. package/dist/kernel/utils/vector3.js +1 -0
  7. package/dist/runtime/client/services/appearance.service.js +4 -0
  8. package/dist/runtime/server/bootstrap.js +1 -1
  9. package/dist/runtime/server/bootstrap.validation.js +2 -0
  10. package/dist/runtime/server/bus/core-event-bus.js +5 -2
  11. package/dist/runtime/server/controllers/principal-export.controller.js +1 -1
  12. package/dist/runtime/server/decorators/command.d.ts +6 -3
  13. package/dist/runtime/server/decorators/onNet.d.ts +5 -2
  14. package/dist/runtime/server/decorators/throttle.js +3 -1
  15. package/dist/runtime/server/helpers/command-validation.helper.d.ts +1 -1
  16. package/dist/runtime/server/helpers/function-helper.d.ts +1 -1
  17. package/dist/runtime/server/services/chat.service.d.ts +33 -0
  18. package/dist/runtime/server/services/chat.service.js +67 -1
  19. package/dist/runtime/server/services/core/command.service.d.ts +1 -1
  20. package/dist/runtime/server/services/parallel/worker-pool.js +4 -0
  21. package/dist/runtime/server/services/ports/command-execution.port.d.ts +1 -1
  22. package/dist/runtime/server/services/remote/remote-command.service.d.ts +1 -1
  23. package/dist/runtime/server/services/services.register.js +2 -2
  24. package/package.json +100 -98
  25. package/dist/kernel/di/tokens.d.ts +0 -30
  26. package/dist/kernel/di/tokens.js +0 -38
  27. package/dist/runtime/client/interfaces/appearance.interface.d.ts +0 -25
  28. package/dist/runtime/client/interfaces/appearance.interface.js +0 -2
  29. package/dist/runtime/server/controllers/command.controller.d.ts +0 -15
  30. package/dist/runtime/server/controllers/command.controller.js +0 -100
  31. package/dist/runtime/server/services/access-control.service.d.ts +0 -59
  32. package/dist/runtime/server/services/access-control.service.js +0 -127
  33. package/dist/runtime/server/services/core/vehicle-modification.service.d.ts +0 -104
  34. package/dist/runtime/server/services/core/vehicle-modification.service.js +0 -330
  35. package/dist/runtime/server/services/core/vehicle.service.d.ts +0 -128
  36. package/dist/runtime/server/services/core/vehicle.service.js +0 -391
  37. package/dist/runtime/server/services/remote/remote-principal.provider.d.ts +0 -55
  38. package/dist/runtime/server/services/remote/remote-principal.provider.js +0 -130
@@ -1,128 +0,0 @@
1
- import { Vehicle } from '../../entities/vehicle'
2
- import type {
3
- VehicleCreateOptions,
4
- VehicleSpawnResult,
5
- SerializedVehicleData,
6
- } from '../../types/vehicle.types'
7
- import { PlayerDirectoryPort } from '../ports/player-directory.port'
8
- /**
9
- * Server-side service for managing vehicle entities.
10
- *
11
- * This service is the central authority for all vehicle operations:
12
- * - Creating vehicles server-side (prevents client-side spawning abuse)
13
- * - Managing vehicle registry by Network ID
14
- * - Validating permissions and positions
15
- * - Synchronizing vehicle state across clients
16
- *
17
- * @remarks
18
- * All vehicle creation MUST go through this service to ensure security.
19
- * Uses CreateVehicleServerSetter for server-authoritative spawning.
20
- */
21
- export declare class VehicleService {
22
- private readonly playerDirectory
23
- /**
24
- * Internal registry of all managed vehicles indexed by Network ID
25
- */
26
- private vehiclesByNetworkId
27
- constructor(playerDirectory: PlayerDirectoryPort)
28
- /**
29
- * Creates a new vehicle on the server.
30
- *
31
- * This method uses CreateVehicleServerSetter to spawn the vehicle server-side,
32
- * preventing client-side spawning exploits.
33
- *
34
- * @param options - Vehicle creation options
35
- * @returns Spawn result with network ID and handle
36
- */
37
- create(options: VehicleCreateOptions): Promise<VehicleSpawnResult>
38
- /**
39
- * Creates a vehicle for a specific player.
40
- *
41
- * @param clientID - Client ID of the requesting player
42
- * @param options - Vehicle creation options
43
- * @returns Spawn result
44
- */
45
- createForPlayer(clientID: number, options: VehicleCreateOptions): Promise<VehicleSpawnResult>
46
- /**
47
- * Retrieves a vehicle by its Network ID.
48
- *
49
- * @param networkId - Network ID of the vehicle
50
- * @returns Vehicle entity or undefined
51
- */
52
- getByNetworkId(networkId: number): Vehicle | undefined
53
- /**
54
- * Retrieves a vehicle by its entity handle.
55
- *
56
- * @param handle - Entity handle
57
- * @returns Vehicle entity or undefined
58
- */
59
- getByHandle(handle: number): Vehicle | undefined
60
- /**
61
- * Gets all vehicles owned by a specific player.
62
- *
63
- * @param clientID - Client ID of the owner
64
- * @returns Array of vehicles
65
- */
66
- getPlayerVehicles(clientID: number): Vehicle[]
67
- /**
68
- * Gets all vehicles in a specific routing bucket.
69
- *
70
- * @param bucket - Routing bucket ID
71
- * @returns Array of vehicles
72
- */
73
- getVehiclesInBucket(bucket: number): Vehicle[]
74
- /**
75
- * Gets all managed vehicles.
76
- *
77
- * @returns Array of all vehicles
78
- */
79
- getAll(): Vehicle[]
80
- /**
81
- * Deletes a vehicle from the server.
82
- *
83
- * @param networkId - Network ID of the vehicle to delete
84
- * @param requestedBy - Optional client ID for permission validation
85
- * @returns Success status
86
- */
87
- delete(networkId: number, requestedBy?: number): boolean
88
- /**
89
- * Deletes all vehicles owned by a player.
90
- * Useful when a player disconnects.
91
- *
92
- * @param clientID - Client ID of the owner
93
- */
94
- deletePlayerVehicles(clientID: number): void
95
- /**
96
- * Validates if a player can perform an action on a vehicle.
97
- *
98
- * @param networkId - Network ID of the vehicle
99
- * @param clientID - Client ID of the player
100
- * @returns True if authorized
101
- */
102
- validateOwnership(networkId: number, clientID: number): boolean
103
- /**
104
- * Validates if a player is near a vehicle.
105
- *
106
- * @param networkId - Network ID of the vehicle
107
- * @param clientID - Client ID of the player
108
- * @param maxDistance - Maximum distance in units
109
- * @returns True if within range
110
- */
111
- validateProximity(networkId: number, clientID: number, maxDistance?: number): boolean
112
- /**
113
- * Cleans up orphaned vehicles that no longer exist.
114
- */
115
- cleanup(): void
116
- /**
117
- * Gets the total count of managed vehicles.
118
- *
119
- * @returns Vehicle count
120
- */
121
- getCount(): number
122
- /**
123
- * Serializes all vehicles for data transfer.
124
- *
125
- * @returns Array of serialized vehicle data
126
- */
127
- serializeAll(): SerializedVehicleData[]
128
- }
@@ -1,391 +0,0 @@
1
- 'use strict'
2
- var __decorate =
3
- (this && this.__decorate) ||
4
- function (decorators, target, key, desc) {
5
- var c = arguments.length,
6
- r =
7
- c < 3
8
- ? target
9
- : desc === null
10
- ? (desc = Object.getOwnPropertyDescriptor(target, key))
11
- : desc,
12
- d
13
- if (typeof Reflect === 'object' && typeof Reflect.decorate === 'function')
14
- r = Reflect.decorate(decorators, target, key, desc)
15
- else
16
- for (var i = decorators.length - 1; i >= 0; i--)
17
- if ((d = decorators[i]))
18
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r
19
- return c > 3 && r && Object.defineProperty(target, key, r), r
20
- }
21
- var __metadata =
22
- (this && this.__metadata) ||
23
- ((k, v) => {
24
- if (typeof Reflect === 'object' && typeof Reflect.metadata === 'function')
25
- return Reflect.metadata(k, v)
26
- })
27
- var __param =
28
- (this && this.__param) ||
29
- ((paramIndex, decorator) => (target, key) => {
30
- decorator(target, key, paramIndex)
31
- })
32
- Object.defineProperty(exports, '__esModule', { value: true })
33
- exports.VehicleService = void 0
34
- const tsyringe_1 = require('tsyringe')
35
- const vehicle_1 = require('../../entities/vehicle')
36
- const logger_1 = require('../../../../kernel/shared/logger')
37
- const player_directory_port_1 = require('../ports/player-directory.port')
38
- /**
39
- * Server-side service for managing vehicle entities.
40
- *
41
- * This service is the central authority for all vehicle operations:
42
- * - Creating vehicles server-side (prevents client-side spawning abuse)
43
- * - Managing vehicle registry by Network ID
44
- * - Validating permissions and positions
45
- * - Synchronizing vehicle state across clients
46
- *
47
- * @remarks
48
- * All vehicle creation MUST go through this service to ensure security.
49
- * Uses CreateVehicleServerSetter for server-authoritative spawning.
50
- */
51
- let VehicleService = class VehicleService {
52
- constructor(playerDirectory) {
53
- this.playerDirectory = playerDirectory
54
- /**
55
- * Internal registry of all managed vehicles indexed by Network ID
56
- */
57
- this.vehiclesByNetworkId = new Map()
58
- }
59
- /**
60
- * Creates a new vehicle on the server.
61
- *
62
- * This method uses CreateVehicleServerSetter to spawn the vehicle server-side,
63
- * preventing client-side spawning exploits.
64
- *
65
- * @param options - Vehicle creation options
66
- * @returns Spawn result with network ID and handle
67
- */
68
- async create(options) {
69
- var _a
70
- try {
71
- const {
72
- model,
73
- position,
74
- heading = 0,
75
- plate,
76
- primaryColor,
77
- secondaryColor,
78
- mods,
79
- persistent = false,
80
- ownership,
81
- metadata,
82
- routingBucket = 0,
83
- locked = false,
84
- fuel = 1.0,
85
- } = options
86
- const modelHash = typeof model === 'string' ? GetHashKey(model) : model
87
- if (!IsModelInCdimage(modelHash) || !IsModelAVehicle(modelHash)) {
88
- logger_1.coreLogger.error('Invalid vehicle model', { model, modelHash })
89
- return {
90
- networkId: 0,
91
- handle: 0,
92
- success: false,
93
- error: `Invalid vehicle model: ${model}`,
94
- }
95
- }
96
- const vehicleType = 'automobile'
97
- const handle = CreateVehicleServerSetter(
98
- modelHash,
99
- vehicleType,
100
- position.x,
101
- position.y,
102
- position.z,
103
- heading,
104
- )
105
- if (!handle || handle === 0) {
106
- logger_1.coreLogger.error('Failed to create vehicle', { model, position })
107
- return {
108
- networkId: 0,
109
- handle: 0,
110
- success: false,
111
- error: 'Failed to create vehicle entity',
112
- }
113
- }
114
- while (!DoesEntityExist(handle)) {
115
- await new Promise((resolve) => setTimeout(resolve, 0))
116
- }
117
- const networkId = NetworkGetNetworkIdFromEntity(handle)
118
- const vehicleOwnership = {
119
- clientID: ownership === null || ownership === void 0 ? void 0 : ownership.clientID,
120
- accountID: ownership === null || ownership === void 0 ? void 0 : ownership.accountID,
121
- type:
122
- (_a = ownership === null || ownership === void 0 ? void 0 : ownership.type) !== null &&
123
- _a !== void 0
124
- ? _a
125
- : 'temporary',
126
- }
127
- const vehicle = new vehicle_1.Vehicle(
128
- handle,
129
- networkId,
130
- vehicleOwnership,
131
- persistent,
132
- routingBucket,
133
- )
134
- if (plate) {
135
- SetVehicleNumberPlateText(handle, plate)
136
- }
137
- if (primaryColor !== undefined || secondaryColor !== undefined) {
138
- const [currentPrimary, currentSecondary] = GetVehicleColours(handle)
139
- SetVehicleColours(
140
- handle,
141
- primaryColor !== null && primaryColor !== void 0 ? primaryColor : currentPrimary,
142
- secondaryColor !== null && secondaryColor !== void 0 ? secondaryColor : currentSecondary,
143
- )
144
- }
145
- if (mods) {
146
- vehicle.applyMods(mods)
147
- }
148
- if (metadata) {
149
- for (const [key, value] of Object.entries(metadata)) {
150
- vehicle.setMetadata(key, value)
151
- }
152
- }
153
- vehicle.setDoorsLocked(locked)
154
- vehicle.setFuel(fuel)
155
- if (routingBucket !== 0) {
156
- vehicle.setRoutingBucket(routingBucket)
157
- }
158
- this.vehiclesByNetworkId.set(networkId, vehicle)
159
- logger_1.coreLogger.info('Vehicle created', {
160
- networkId,
161
- model,
162
- ownership: vehicleOwnership.type,
163
- persistent,
164
- totalVehicles: this.vehiclesByNetworkId.size,
165
- })
166
- emitNet('opencore:vehicle:created', -1, vehicle.serialize())
167
- return {
168
- networkId,
169
- handle,
170
- success: true,
171
- }
172
- } catch (error) {
173
- logger_1.coreLogger.error('Error creating vehicle', { error, options })
174
- return {
175
- networkId: 0,
176
- handle: 0,
177
- success: false,
178
- error: error instanceof Error ? error.message : 'Unknown error',
179
- }
180
- }
181
- }
182
- /**
183
- * Creates a vehicle for a specific player.
184
- *
185
- * @param clientID - Client ID of the requesting player
186
- * @param options - Vehicle creation options
187
- * @returns Spawn result
188
- */
189
- async createForPlayer(clientID, options) {
190
- const player = this.playerDirectory.getByClient(clientID)
191
- if (!player) {
192
- return {
193
- networkId: 0,
194
- handle: 0,
195
- success: false,
196
- error: 'Player not found',
197
- }
198
- }
199
- const ownership = {
200
- clientID,
201
- accountID: player.accountID,
202
- type: 'player',
203
- }
204
- return this.create(Object.assign(Object.assign({}, options), { ownership }))
205
- }
206
- /**
207
- * Retrieves a vehicle by its Network ID.
208
- *
209
- * @param networkId - Network ID of the vehicle
210
- * @returns Vehicle entity or undefined
211
- */
212
- getByNetworkId(networkId) {
213
- return this.vehiclesByNetworkId.get(networkId)
214
- }
215
- /**
216
- * Retrieves a vehicle by its entity handle.
217
- *
218
- * @param handle - Entity handle
219
- * @returns Vehicle entity or undefined
220
- */
221
- getByHandle(handle) {
222
- const networkId = NetworkGetNetworkIdFromEntity(handle)
223
- return this.vehiclesByNetworkId.get(networkId)
224
- }
225
- /**
226
- * Gets all vehicles owned by a specific player.
227
- *
228
- * @param clientID - Client ID of the owner
229
- * @returns Array of vehicles
230
- */
231
- getPlayerVehicles(clientID) {
232
- const vehicles = []
233
- for (const vehicle of this.vehiclesByNetworkId.values()) {
234
- if (vehicle.ownership.clientID === clientID) {
235
- vehicles.push(vehicle)
236
- }
237
- }
238
- return vehicles
239
- }
240
- /**
241
- * Gets all vehicles in a specific routing bucket.
242
- *
243
- * @param bucket - Routing bucket ID
244
- * @returns Array of vehicles
245
- */
246
- getVehiclesInBucket(bucket) {
247
- const vehicles = []
248
- for (const vehicle of this.vehiclesByNetworkId.values()) {
249
- if (vehicle.routingBucket === bucket) {
250
- vehicles.push(vehicle)
251
- }
252
- }
253
- return vehicles
254
- }
255
- /**
256
- * Gets all managed vehicles.
257
- *
258
- * @returns Array of all vehicles
259
- */
260
- getAll() {
261
- return Array.from(this.vehiclesByNetworkId.values())
262
- }
263
- /**
264
- * Deletes a vehicle from the server.
265
- *
266
- * @param networkId - Network ID of the vehicle to delete
267
- * @param requestedBy - Optional client ID for permission validation
268
- * @returns Success status
269
- */
270
- delete(networkId, requestedBy) {
271
- const vehicle = this.vehiclesByNetworkId.get(networkId)
272
- if (!vehicle) {
273
- return false
274
- }
275
- if (requestedBy !== undefined) {
276
- if (vehicle.ownership.clientID !== requestedBy) {
277
- logger_1.coreLogger.warn('Unauthorized vehicle deletion attempt', {
278
- networkId,
279
- requestedBy,
280
- owner: vehicle.ownership.clientID,
281
- })
282
- return false
283
- }
284
- }
285
- vehicle.delete()
286
- this.vehiclesByNetworkId.delete(networkId)
287
- logger_1.coreLogger.info('Vehicle deleted', {
288
- networkId,
289
- totalVehicles: this.vehiclesByNetworkId.size,
290
- })
291
- emitNet('opencore:vehicle:deleted', -1, networkId)
292
- return true
293
- }
294
- /**
295
- * Deletes all vehicles owned by a player.
296
- * Useful when a player disconnects.
297
- *
298
- * @param clientID - Client ID of the owner
299
- */
300
- deletePlayerVehicles(clientID) {
301
- const vehicles = this.getPlayerVehicles(clientID)
302
- for (const vehicle of vehicles) {
303
- this.delete(vehicle.networkId)
304
- }
305
- }
306
- /**
307
- * Validates if a player can perform an action on a vehicle.
308
- *
309
- * @param networkId - Network ID of the vehicle
310
- * @param clientID - Client ID of the player
311
- * @returns True if authorized
312
- */
313
- validateOwnership(networkId, clientID) {
314
- const vehicle = this.vehiclesByNetworkId.get(networkId)
315
- if (!vehicle) return false
316
- if (vehicle.ownership.type === 'server' || vehicle.ownership.type === 'shared') {
317
- return true
318
- }
319
- return vehicle.ownership.clientID === clientID
320
- }
321
- /**
322
- * Validates if a player is near a vehicle.
323
- *
324
- * @param networkId - Network ID of the vehicle
325
- * @param clientID - Client ID of the player
326
- * @param maxDistance - Maximum distance in units
327
- * @returns True if within range
328
- */
329
- validateProximity(networkId, clientID, maxDistance = 10.0) {
330
- const vehicle = this.vehiclesByNetworkId.get(networkId)
331
- if (!vehicle || !vehicle.exists) return false
332
- const player = this.playerDirectory.getByClient(clientID)
333
- if (!player) return false
334
- const playerPed = GetPlayerPed(player.clientIDStr)
335
- if (!playerPed || playerPed === 0) return false
336
- const playerPos = GetEntityCoords(playerPed)
337
- const vehiclePos = vehicle.position
338
- const distance = Math.sqrt(
339
- (playerPos[0] - vehiclePos.x) ** 2 +
340
- (playerPos[1] - vehiclePos.y) ** 2 +
341
- (playerPos[2] - vehiclePos.z) ** 2,
342
- )
343
- return distance <= maxDistance
344
- }
345
- /**
346
- * Cleans up orphaned vehicles that no longer exist.
347
- */
348
- cleanup() {
349
- const toDelete = []
350
- for (const [networkId, vehicle] of this.vehiclesByNetworkId.entries()) {
351
- if (!vehicle.exists) {
352
- toDelete.push(networkId)
353
- }
354
- }
355
- for (const networkId of toDelete) {
356
- this.vehiclesByNetworkId.delete(networkId)
357
- logger_1.coreLogger.debug('Cleaned up orphaned vehicle', { networkId })
358
- }
359
- if (toDelete.length > 0) {
360
- logger_1.coreLogger.info('Vehicle cleanup completed', {
361
- cleaned: toDelete.length,
362
- remaining: this.vehiclesByNetworkId.size,
363
- })
364
- }
365
- }
366
- /**
367
- * Gets the total count of managed vehicles.
368
- *
369
- * @returns Vehicle count
370
- */
371
- getCount() {
372
- return this.vehiclesByNetworkId.size
373
- }
374
- /**
375
- * Serializes all vehicles for data transfer.
376
- *
377
- * @returns Array of serialized vehicle data
378
- */
379
- serializeAll() {
380
- return Array.from(this.vehiclesByNetworkId.values()).map((v) => v.serialize())
381
- }
382
- }
383
- exports.VehicleService = VehicleService
384
- exports.VehicleService = VehicleService = __decorate(
385
- [
386
- (0, tsyringe_1.injectable)(),
387
- __param(0, (0, tsyringe_1.inject)(player_directory_port_1.PlayerDirectoryPort)),
388
- __metadata('design:paramtypes', [player_directory_port_1.PlayerDirectoryPort]),
389
- ],
390
- VehicleService,
391
- )
@@ -1,55 +0,0 @@
1
- import { Player } from '../../entities'
2
- import { Principal, PrincipalProviderContract } from '../../contracts'
3
- import { IExports } from '../../../../adapters'
4
- import type { LinkedID } from '../types/linked-id'
5
- /**
6
- * Principal provider implementation for `RESOURCE` mode.
7
- *
8
- * @remarks
9
- * This provider delegates all principal/permission operations to CORE via exports.
10
- * It provides the full PrincipalProviderContract interface for RESOURCE mode.
11
- */
12
- export declare class RemotePrincipalProvider extends PrincipalProviderContract {
13
- private readonly exportsService
14
- constructor(exportsService: IExports)
15
- /**
16
- * Gets typed access to CORE resource exports.
17
- */
18
- private get core()
19
- /**
20
- * Gets the Principal for a connected player.
21
- */
22
- getPrincipal(player: Player): Promise<Principal | null>
23
- /**
24
- * Forces a refresh of the player's permissions from persistence.
25
- */
26
- refreshPrincipal(player: Player): Promise<void>
27
- /**
28
- * Gets Principal by account ID (works for offline players too).
29
- */
30
- getPrincipalByLinkedID(linkedID: LinkedID): Promise<Principal | null>
31
- /**
32
- * Quick permission check without fetching full Principal.
33
- */
34
- hasPermission(clientID: number, permission: string): Promise<boolean>
35
- /**
36
- * Quick rank check without fetching full Principal.
37
- */
38
- hasRank(clientID: number, requiredRank: number): Promise<boolean>
39
- /**
40
- * Check if player has any of the specified permissions.
41
- */
42
- hasAnyPermission(clientID: number, permissions: string[]): Promise<boolean>
43
- /**
44
- * Check if player has all of the specified permissions.
45
- */
46
- hasAllPermissions(clientID: number, permissions: string[]): Promise<boolean>
47
- /**
48
- * Get all permissions for a player.
49
- */
50
- getPermissions(clientID: number): Promise<string[]>
51
- /**
52
- * Get the rank value for a player.
53
- */
54
- getRank(clientID: number): Promise<number | null>
55
- }
@@ -1,130 +0,0 @@
1
- 'use strict'
2
- var __decorate =
3
- (this && this.__decorate) ||
4
- function (decorators, target, key, desc) {
5
- var c = arguments.length,
6
- r =
7
- c < 3
8
- ? target
9
- : desc === null
10
- ? (desc = Object.getOwnPropertyDescriptor(target, key))
11
- : desc,
12
- d
13
- if (typeof Reflect === 'object' && typeof Reflect.decorate === 'function')
14
- r = Reflect.decorate(decorators, target, key, desc)
15
- else
16
- for (var i = decorators.length - 1; i >= 0; i--)
17
- if ((d = decorators[i]))
18
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r
19
- return c > 3 && r && Object.defineProperty(target, key, r), r
20
- }
21
- var __metadata =
22
- (this && this.__metadata) ||
23
- ((k, v) => {
24
- if (typeof Reflect === 'object' && typeof Reflect.metadata === 'function')
25
- return Reflect.metadata(k, v)
26
- })
27
- var __param =
28
- (this && this.__param) ||
29
- ((paramIndex, decorator) => (target, key) => {
30
- decorator(target, key, paramIndex)
31
- })
32
- Object.defineProperty(exports, '__esModule', { value: true })
33
- exports.RemotePrincipalProvider = void 0
34
- const tsyringe_1 = require('tsyringe')
35
- const runtime_1 = require('../../runtime')
36
- const contracts_1 = require('../../contracts')
37
- const adapters_1 = require('../../../../adapters')
38
- /**
39
- * Principal provider implementation for `RESOURCE` mode.
40
- *
41
- * @remarks
42
- * This provider delegates all principal/permission operations to CORE via exports.
43
- * It provides the full PrincipalProviderContract interface for RESOURCE mode.
44
- */
45
- let RemotePrincipalProvider = class RemotePrincipalProvider extends contracts_1.PrincipalProviderContract {
46
- constructor(exportsService) {
47
- super()
48
- this.exportsService = exportsService
49
- }
50
- /**
51
- * Gets typed access to CORE resource exports.
52
- */
53
- get core() {
54
- const { coreResourceName } = (0, runtime_1.getRuntimeContext)()
55
- const coreExports = this.exportsService.getResource(coreResourceName)
56
- if (!coreExports) {
57
- throw new Error(
58
- `[OpenCore] CORE resource '${coreResourceName}' exports not found. ` +
59
- `Ensure the CORE resource is started BEFORE RESOURCE mode resources.`,
60
- )
61
- }
62
- return coreExports
63
- }
64
- /**
65
- * Gets the Principal for a connected player.
66
- */
67
- async getPrincipal(player) {
68
- return await this.core.getPrincipal(player.clientID)
69
- }
70
- /**
71
- * Forces a refresh of the player's permissions from persistence.
72
- */
73
- async refreshPrincipal(player) {
74
- await this.core.refreshPrincipal(player.clientID)
75
- }
76
- /**
77
- * Gets Principal by account ID (works for offline players too).
78
- */
79
- async getPrincipalByLinkedID(linkedID) {
80
- return await this.core.getPrincipalByAccountId(linkedID.toString())
81
- }
82
- // ═══════════════════════════════════════════════════════════════
83
- // Convenience methods (not part of contract, but useful)
84
- // ═══════════════════════════════════════════════════════════════
85
- /**
86
- * Quick permission check without fetching full Principal.
87
- */
88
- async hasPermission(clientID, permission) {
89
- return await this.core.hasPermission(clientID, permission)
90
- }
91
- /**
92
- * Quick rank check without fetching full Principal.
93
- */
94
- async hasRank(clientID, requiredRank) {
95
- return await this.core.hasRank(clientID, requiredRank)
96
- }
97
- /**
98
- * Check if player has any of the specified permissions.
99
- */
100
- async hasAnyPermission(clientID, permissions) {
101
- return await this.core.hasAnyPermission(clientID, permissions)
102
- }
103
- /**
104
- * Check if player has all of the specified permissions.
105
- */
106
- async hasAllPermissions(clientID, permissions) {
107
- return await this.core.hasAllPermissions(clientID, permissions)
108
- }
109
- /**
110
- * Get all permissions for a player.
111
- */
112
- async getPermissions(clientID) {
113
- return await this.core.getPermissions(clientID)
114
- }
115
- /**
116
- * Get the rank value for a player.
117
- */
118
- async getRank(clientID) {
119
- return await this.core.getRank(clientID)
120
- }
121
- }
122
- exports.RemotePrincipalProvider = RemotePrincipalProvider
123
- exports.RemotePrincipalProvider = RemotePrincipalProvider = __decorate(
124
- [
125
- (0, tsyringe_1.injectable)(),
126
- __param(0, (0, tsyringe_1.inject)(adapters_1.IExports)),
127
- __metadata('design:paramtypes', [adapters_1.IExports]),
128
- ],
129
- RemotePrincipalProvider,
130
- )