feat(modules/callback): add Await callbacks

This commit is contained in:
Csoki
2023-04-28 11:19:02 +02:00
parent c565cadc2d
commit 1c9ad325cf
2 changed files with 76 additions and 18 deletions
+34 -9
View File
@@ -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)
+42 -9
View File
@@ -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)