import { Rpc } from 'rage-fw-rpc' import { RageFW_ICustomServerEvent } from 'rage-fw-shared-types' import { nativeEvents } from '../native.events' import type { _ServerEventHasArgs, RageFW_ServerArgs, RageFW_ServerCallback, RageFW_ServerCallbackCustom, RageFW_ServerCallbackNative, RageFW_ServerEvent, RageFW_ServerReturn, } from '../types' export class Server { private _rpc: Rpc = new Rpc() get rpc(): Rpc { return this._rpc } private isNativeEvent(eventName: string): eventName is keyof IServerEvents { return nativeEvents.includes(eventName) } private registerCustom( eventName: EventName, callback: RageFW_ServerCallbackCustom, ): void { this._rpc.register( eventName, // fixme async (args: RageFW_ServerArgs, info) => { await callback([info.player as PlayerMp, ...args]) }, ) } private registerNative( eventName: EventName, callback: RageFW_ServerCallbackNative, ): void { mp.events.add( eventName, (...args: Parameters) => callback([...args]), ) } public register( eventName: EventName, callback: RageFW_ServerCallback, ): void { if (this.isNativeEvent(eventName)) { this.registerNative( eventName, callback as RageFW_ServerCallbackNative, ) } else { this.registerCustom( eventName, callback as unknown as RageFW_ServerCallbackCustom, ) } } public registerMany(events: { [event in EventName]: RageFW_ServerCallback }): void { Object.entries>(events).map( ([eventName, callback]) => { if (this.isNativeEvent(eventName)) { this.registerNative( eventName, callback as RageFW_ServerCallbackNative, ) } else { this.registerCustom( eventName as keyof RageFW_ICustomServerEvent, callback as unknown as RageFW_ServerCallbackCustom, ) } }, ) } private unregisterCustom( eventName: EventName, ): void { this._rpc.unregister(eventName) } private unregisterNative( eventName: EventName, ): void { mp.events.remove(eventName) } public unregister( eventName: EventName, ): void { if (this.isNativeEvent(eventName)) { this.unregisterNative(eventName) } else { this.unregisterCustom(eventName) } } public trigger( eventName: EventName, ...args: _ServerEventHasArgs extends true ? [RageFW_ServerArgs] : [] ): Promise> { return this._rpc.call(eventName, args) } }