createNativeEvent()
function createNativeEvent\<THandler\>(
eventName: string,
wrapHandler: (handler: THandler) => (...args: unknown[]) => void,
options?: NativeEventOptions): NativeEventApi\<THandler\>;Defined in: src/lib/events/helpers.ts:184
Creates a typed wrapper around a FiveM native event.
This factory creates listen-only events (no emit capability) with:
- Custom handler transformation (e.g., extracting
sourceas first argument) - Proper cleanup via disposable pattern
- Type safety for handler arguments
Use this for wrapping FiveM's built-in events like playerJoining, playerDropped,
onResourceStart, gameEventTriggered, etc.
Type Parameters
| Type Parameter | Description |
|---|---|
THandler extends (...args: never[]) => void | The typed handler signature users will provide. |
Parameters
| Parameter | Type | Description |
|---|---|---|
eventName | string | The FiveM native event name. |
wrapHandler | (handler: THandler) => (...args: unknown[]) => void | Transforms the typed handler into a raw FiveM handler. |
options? | NativeEventOptions | Optional configuration including source for tracking. |
Returns
NativeEventApi<THandler>
An event object with a typed .on() method.
Examples
// Server: Wrap playerJoining with automatic source extraction
const playerJoining = createNativeEvent<(playerId: number) => void>(
"playerJoining",
(handler) => () => {
const playerId = getCurrentSource();
if (playerId !== null) handler(playerId);
},
{ source: "lib/server/events" }
);
// Usage
const disposable = playerJoining.on((playerId) => {
console.log(`Player ${playerId} is joining`);
});
// Cleanup
disposable.dispose();// Client: Wrap gameEventTriggered with typed arguments
const gameEvent = createNativeEvent<(name: string, args: unknown[]) => void>(
"gameEventTriggered",
(handler) => (name: unknown, args: unknown) => {
if (typeof name === "string" && Array.isArray(args)) {
handler(name, args);
}
},
{ source: "lib/client/events" }
);
// Usage
gameEvent.on((name, args) => {
console.log(`Game event: ${name}`, args);
});