mirror of
https://github.com/esx-framework/esx_core.git
synced 2026-08-31 10:18:54 +00:00
feat(modules/callback): add Await callbacks
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user