diff --git a/server/src/core/index.ts b/server/src/core/index.ts new file mode 100644 index 0000000..48fa963 --- /dev/null +++ b/server/src/core/index.ts @@ -0,0 +1,3 @@ +export * from './player' +export * from './server' +export * from './logger' diff --git a/server/src/logger.ts b/server/src/core/logger.ts similarity index 96% rename from server/src/logger.ts rename to server/src/core/logger.ts index e47cb0f..5108dee 100644 --- a/server/src/logger.ts +++ b/server/src/core/logger.ts @@ -1,7 +1,7 @@ import winston, { format } from 'winston' const { timestamp, printf, colorize } = format -export default class Logger { +export class Logger { private format = printf(({ message, level, timestamp }) => { return `[${new Date(timestamp).toLocaleTimeString()}] [${level}]: ${message}` }) diff --git a/server/src/core/player.ts b/server/src/core/player.ts new file mode 100644 index 0000000..d00c588 --- /dev/null +++ b/server/src/core/player.ts @@ -0,0 +1,34 @@ +import rpc from 'rage-rpc' + +import { + _CefEventHasArgs, + _ClientEventHasArgs, + RageFW_CefArgs, + RageFW_CefEvent, + RageFW_CefReturn, + RageFW_ClientEvent, + RageFW_ServerClientEventArguments, + RageFW_ServerClientEventReturn, +} from '../types' + +export class Player { + public triggerClient( + player: PlayerMp, + eventName: EventName, + ...args: _ClientEventHasArgs extends true + ? [RageFW_ServerClientEventArguments] + : [] + ): Promise> { + return rpc.callClient(player, eventName, args) + } + + public triggerBrowser( + player: PlayerMp, + eventName: EventName, + ...args: _CefEventHasArgs extends true + ? [RageFW_CefArgs] + : [] + ): Promise> { + return rpc.callBrowsers(player, eventName, args) + } +} diff --git a/server/src/core/server.ts b/server/src/core/server.ts new file mode 100644 index 0000000..73ecb0f --- /dev/null +++ b/server/src/core/server.ts @@ -0,0 +1,147 @@ +import rpc from 'rage-rpc' +import { RageFW_ICustomServerEvent } from 'rage-fw-shared-types' + +import { nativeEvents } from '../native.events' +import { + _CefEventHasArgs, + _ClientEventHasArgs, + _ServerEventHasArgs, + RageFW_CefArgs, + RageFW_CefEvent, + RageFW_ClientEvent, + RageFW_ServerClientEventArguments, + RageFW_ServerEvent, + RageFW_ServerEventArguments, + RageFW_ServerEventCallback, + RageFW_ServerEventCallbackCustom, + RageFW_ServerEventCallbackNative, + RageFW_ServerEventReturn, +} from '../types' + +type MiddlewarePoolServer = Partial<{ + [K in EventName]: { + mwName: string + mw: MiddlewareFunction + } +}> + +type MiddlewareFunction = ( + player: PlayerMp, + eventName: EventName, + ...args: _ServerEventHasArgs extends true + ? [RageFW_ServerEventArguments] + : [] +) => void + +export class Server { + private middlewarePool: MiddlewarePoolServer = {} + + public use( + mwName: string, + eventName: EventName, + mw: MiddlewareFunction, + ) { + this.middlewarePool = { + ...this.middlewarePool, + [eventName]: { + mwName, + mw, + }, + } + } + + private isNativeEvent(eventName: string): eventName is keyof IServerEvents { + return nativeEvents.includes(eventName) + } + + private registerCustom( + eventName: EventName, + callback: RageFW_ServerEventCallbackCustom, + ): void { + rpc.register( + eventName, + async (args: RageFW_ServerEventArguments, info) => { + callback([info.player as PlayerMp, ...args]) + }, + ) + } + + private registerNative( + eventName: EventName, + callback: RageFW_ServerEventCallbackNative, + ): void { + mp.events.add( + eventName, + (...args: Parameters) => + callback([...args]), + ) + } + + public register( + eventName: EventName, + callback: RageFW_ServerEventCallback, + ): void { + if (this.isNativeEvent(eventName)) { + this.registerNative( + eventName, + callback as RageFW_ServerEventCallbackNative, + ) + } else { + this.registerCustom( + eventName, + callback as unknown as RageFW_ServerEventCallbackCustom, + ) + } + } + + public registerMany(events: { + [event in EventName]: RageFW_ServerEventCallback + }): void { + Object.entries>(events).map( + ([eventName, callback]) => { + if (this.isNativeEvent(eventName)) { + this.registerNative( + eventName, + callback as RageFW_ServerEventCallbackNative, + ) + } else { + this.registerCustom( + eventName as keyof RageFW_ICustomServerEvent, + callback as unknown as RageFW_ServerEventCallbackCustom, + ) + } + }, + ) + } + + private unregisterCustom( + eventName: EventName, + ): void { + 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_ServerEventArguments] + : [] + ): Promise> { + return rpc.call>(eventName, args) + } +} diff --git a/server/src/index.ts b/server/src/index.ts index 7595f40..4c195f6 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -1,145 +1,4 @@ -import rpc from 'rage-rpc' - -import Logger from './logger' - -import { - _CefEventHasArgs, - _ClientEventHasArgs, - _ServerEventHasArgs, - RageFW_CefArgs, - RageFW_CefEvent, - RageFW_CefReturn, - RageFW_ClientEvent, - RageFW_ICustomServerEvent, - RageFW_ServerClientEventArguments, - RageFW_ServerClientEventReturn, - RageFW_ServerEvent, - RageFW_ServerEventArguments, - RageFW_ServerEventCallback, - RageFW_ServerEventCallbackCustom, - RageFW_ServerEventCallbackNative, - RageFW_ServerEventReturn, -} from './types' -import { nativeEvents } from './native.events' - -class Server { - private isNativeEvent(eventName: string): eventName is keyof IServerEvents { - return nativeEvents.includes(eventName) - } - - private registerCustom( - eventName: EventName, - callback: RageFW_ServerEventCallbackCustom, - ): void { - rpc.register( - eventName, - async (args: RageFW_ServerEventArguments, info) => { - callback([info.player as PlayerMp, ...args]) - }, - ) - } - - private registerNative( - eventName: EventName, - callback: RageFW_ServerEventCallbackNative, - ): void { - mp.events.add( - eventName, - (...args: Parameters) => - callback([...args]), - ) - } - - public register( - eventName: EventName, - callback: RageFW_ServerEventCallback, - ): void { - if (this.isNativeEvent(eventName)) { - this.registerNative( - eventName, - callback as RageFW_ServerEventCallbackNative, - ) - } else { - this.registerCustom( - eventName, - callback as unknown as RageFW_ServerEventCallbackCustom, - ) - } - } - - public registerMany(events: { - [event in EventName]: RageFW_ServerEventCallback - }): void { - Object.entries>(events).map( - ([eventName, callback]) => { - if (this.isNativeEvent(eventName)) { - this.registerNative( - eventName, - callback as RageFW_ServerEventCallbackNative, - ) - } else { - this.registerCustom( - eventName as keyof RageFW_ICustomServerEvent, - callback as unknown as RageFW_ServerEventCallbackCustom, - ) - } - }, - ) - } - - private unregisterCustom( - eventName: EventName, - ): void { - 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_ServerEventArguments] - : [] - ): Promise> { - return rpc.call>(eventName, args) - } -} - -class Player { - public triggerClient( - player: PlayerMp, - eventName: EventName, - ...args: _ClientEventHasArgs extends true - ? [RageFW_ServerClientEventArguments] - : [] - ): Promise> { - return rpc.callClient(player, eventName, args) - } - - public triggerBrowser( - player: PlayerMp, - eventName: EventName, - ...args: _CefEventHasArgs extends true - ? [RageFW_CefArgs] - : [] - ): Promise> { - return rpc.callBrowsers(player, eventName, args) - } -} +import { Server, Logger, Player } from './core' export const fw = { event: new Server(), diff --git a/server/src/types/server.ts b/server/src/types/server.ts index e7a487b..a327af0 100644 --- a/server/src/types/server.ts +++ b/server/src/types/server.ts @@ -65,10 +65,19 @@ export type RageFW_ServerEventCallbackNative< K extends keyof IServerEvents = keyof IServerEvents, > = (payload: Parameters) => ReturnType -export type _ServerEventHasArgs< - EventName extends keyof RageFW_ICustomServerEvent, -> = keyof RageFW_ICustomClientEvent extends never - ? false - : Parameters[0] extends undefined - ? false - : true +export type _ServerEventHasArgs = + EventName extends keyof RageFW_ICustomServerEvent + ? keyof RageFW_ICustomClientEvent extends never + ? false + : Parameters< + RageFW_ICustomServerEvent[EventName] + >[0] extends undefined + ? false + : true + : EventName extends keyof IServerEvents + ? keyof IServerEvents extends never + ? false + : Parameters[0] extends undefined + ? false + : true + : false diff --git a/shared-types/types/types/index.d.ts b/shared-types/types/types/index.d.ts index a65c140..5cbd72e 100644 --- a/shared-types/types/types/index.d.ts +++ b/shared-types/types/types/index.d.ts @@ -1,7 +1,13 @@ declare module 'rage-fw-shared-types' { - export interface RageFW_ICustomServerEvent {} + export interface RageFW_ICustomServerEvent { + customServerEvent(arg1: string): number + } - export interface RageFW_ICustomClientEvent {} + export interface RageFW_ICustomClientEvent { + customClientEvent(arg1: string): number + } - export interface RageFW_ICustomCefEvent {} + export interface RageFW_ICustomCefEvent { + customCefEvent(arg1: string): number + } }