diff --git a/[core]/es_extended/client/modules/callback.lua b/[core]/es_extended/client/modules/callback.lua index 180c9216..a4d03d3b 100644 --- a/[core]/es_extended/client/modules/callback.lua +++ b/[core]/es_extended/client/modules/callback.lua @@ -3,22 +3,47 @@ local serverRequests = {} local clientCallbacks = {} ----@param eventName string ----@param callback function ----@param ... any -ESX.TriggerServerCallback = function(eventName, callback, ...) - serverRequests[RequestId] = callback - - TriggerServerEvent('esx:triggerServerCallback', eventName, RequestId, GetInvokingResource() or "unknown", ...) +ESX.TriggerServerCallback = setmetatable({ + ---@param eventName string + ---@param ... any + Await = function(eventName, ...) + assert(type(eventName) == 'string', 'Argument 1 `eventName` is not a string!') + local p = promise.new() - RequestId = RequestId + 1 -end + serverRequests[RequestId] = p + + TriggerServerEvent('esx:triggerServerCallback', eventName, RequestId, GetInvokingResource() or "unknown", ...) + + RequestId = RequestId + 1 + + return Citizen.Await(p) + end +}, { + ---@param eventName string + ---@param callback function + ---@param ... any + __call = function(_, eventName, callback, ...) + assert(type(eventName) == 'string', 'Argument 1 `eventName` is not a string!') + assert(type(callback) == 'function', 'Argument 2 `callback` is not a function!') + + serverRequests[RequestId] = callback + + TriggerServerEvent('esx:triggerServerCallback', eventName, RequestId, GetInvokingResource() or "unknown", ...) + + RequestId = RequestId + 1 + end +}) RegisterNetEvent('esx:serverCallback', function(requestId, invoker, ...) if not serverRequests[requestId] then return print(('[^1ERROR^7] Server Callback with requestId ^5%s^7 Was Called by ^5%s^7 but does not exist.'):format(requestId, invoker)) end + if type(serverRequests[requestId]) == 'table' then + serverRequests[requestId]:resolve(...) + return + end + serverRequests[requestId](...) serverRequests[requestId] = nil end) diff --git a/[core]/es_extended/server/modules/callback.lua b/[core]/es_extended/server/modules/callback.lua index 4c7e17fd..9d78696b 100644 --- a/[core]/es_extended/server/modules/callback.lua +++ b/[core]/es_extended/server/modules/callback.lua @@ -21,23 +21,56 @@ RegisterNetEvent('esx:triggerServerCallback', function(eventName, requestId, inv end, ...) end) ----@param player number playerId ----@param eventName string ----@param callback function ----@param ... any -ESX.TriggerClientCallback = function(player, eventName, callback, ...) - clientRequests[RequestId] = callback +ESX.TriggerClientCallback = setmetatable({ + ---@param player number? + ---@param eventName string + ---@param ... any + Await = function(player, eventName, ...) + player = tonumber(player) - TriggerClientEvent('esx:triggerClientCallback', player, eventName, RequestId, GetInvokingResource() or "unknown", ...) + assert(player, 'Argument 1 `player` is not a number!') + assert(type(eventName) == 'string', 'Argument 2 `eventName` is not a string!') - RequestId = RequestId + 1 -end + local p = promise.new() + + clientRequests[RequestId] = p + + TriggerClientEvent('esx:triggerClientCallback', player, eventName, RequestId, GetInvokingResource() or "unknown", ...) + + RequestId = RequestId + 1 + + return Citizen.Await(p) + end +}, { + ---@param player number? playerId + ---@param eventName string + ---@param callback function + ---@param ... any + __call = function(_, player, eventName, callback, ...) + player = tonumber(player) + + assert(player, 'Argument 1 `player` is not a number!') + assert(type(eventName) == 'string', 'Argument 2 `eventName` is not a string!') + assert(type(callback) == 'function', 'Argument 3 `callback` is not a function!') + + clientRequests[RequestId] = callback + + TriggerClientEvent('esx:triggerClientCallback', player, eventName, RequestId, GetInvokingResource() or "unknown", ...) + + RequestId = RequestId + 1 + end +}) RegisterNetEvent('esx:clientCallback', function(requestId, invoker, ...) if not clientRequests[requestId] then return print(('[^1ERROR^7] Client Callback with requestId ^5%s^7 Was Called by ^5%s^7 but does not exist.'):format(requestId, invoker)) end + if type(clientRequests[requestId]) == 'table' then + clientRequests[requestId]:resolve(...) + return + end + clientRequests[requestId](...) clientRequests[requestId] = nil end) \ No newline at end of file