Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 23 additions & 24 deletions [core]/es_extended/client/modules/callback.lua
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,12 @@ Callbacks.id = 0
-- MARK: Internal Functions
-- =============================================

function Callbacks:Trigger(event, cb, invoker, ...)

self.requests[self.id] = {
await = type(cb) == "boolean",
cb = cb or promise:new()
function Callbacks:Register(name, resource, cb)
self.storage[name] = {
resource = resource,
cb = cb
}
local table = self.requests[self.id]

TriggerServerEvent("esx:triggerServerCallback", event, self.id, invoker, ...)

self.id += 1

return table.cb
end

function Callbacks:Execute(cb, id, ...)
Expand All @@ -39,6 +32,20 @@ function Callbacks:Execute(cb, id, ...)
end
end

function Callbacks:Trigger(event, cb, invoker, ...)
self.requests[self.id] = {
await = type(cb) == "boolean",
cb = cb or promise:new()
}
local table = self.requests[self.id]

TriggerServerEvent("esx:triggerServerCallback", event, self.id, invoker, ...)

self.id += 1

return table.cb
end

function Callbacks:ServerRecieve(requestId, invoker, ...)
if not self.requests[requestId] then
return error(("Server Callback with requestId ^5%s^1 Was Called by ^5%s^1 but does not exist."):format(requestId, invoker))
Expand All @@ -49,21 +56,13 @@ function Callbacks:ServerRecieve(requestId, invoker, ...)
self.requests[requestId] = nil

if callback.await then
callback.cb:resolve({...})
callback.cb:resolve({ ... })
else
self:Execute(callback.cb, requestId, ...)
end
end

function Callbacks:Register(name, resource, cb)
self.storage[name] = {
resource = resource,
cb = cb
}
end

function Callbacks:ClientRecieve(eventName, requestId, invoker, ...)

if not self.storage[eventName] then
return error(("Client Callback with requestId ^5%s^1 Was Called by ^5%s^1 but does not exist."):format(eventName, invoker))
end
Expand Down Expand Up @@ -130,14 +129,14 @@ end
-- MARK: Events
-- =============================================

ESX.SecureNetEvent("esx:triggerClientCallback", function(...)
Callbacks:ClientRecieve(...)
end)

ESX.SecureNetEvent("esx:serverCallback", function(...)
Callbacks:ServerRecieve(...)
end)

ESX.SecureNetEvent("esx:triggerClientCallback", function(...)
Callbacks:ClientRecieve(...)
end)

AddEventHandler("onResourceStop", function(resource)
for k, v in pairs(Callbacks.storage) do
if v.resource == resource then
Expand Down
36 changes: 34 additions & 2 deletions [core]/es_extended/server/modules/callback.lua
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,17 @@ function Callbacks:Execute(cb, ...)
end

function Callbacks:Trigger(player, event, cb, invoker, ...)
self.requests[self.id] = cb
self.requests[self.id] = {
await = type(cb) == "boolean",
cb = cb or promise:new()
}
local table = self.requests[self.id]

TriggerClientEvent("esx:triggerClientCallback", player, event, self.id, invoker, ...)

self.id += 1

return table.cb
end

function Callbacks:ServerRecieve(player, event, requestId, invoker, ...)
Expand All @@ -64,8 +70,12 @@ function Callbacks:RecieveClient(requestId, invoker, ...)

local callback = self.requests[self.currentId]

self:Execute(callback, ...)
self.requests[requestId] = nil
if callback.await then
callback.cb:resolve({ ... })
else
self:Execute(callback.cb, ...)
end
end

-- =============================================
Expand All @@ -83,6 +93,28 @@ function ESX.TriggerClientCallback(player, eventName, callback, ...)
Callbacks:Trigger(player, eventName, callback, invoker, ...)
end

---@param player number playerId
---@param eventName string
---@param ... any
---@return any
function ESX.AwaitClientCallback(player, eventName, ...)
local invokingResource = GetInvokingResource()
local invoker = (invokingResource and invokingResource ~= "Unknown") and invokingResource or "es_extended"

local p = Callbacks:Trigger(player, eventName, false, invoker, ...)
if not p then return end

SetTimeout(15000, function()
if p.state == "pending" then
p:reject("Server Callback Timed Out")
end
end)

Citizen.Await(p)

return table.unpack(p.value)
end

---@param eventName string
---@param callback function
---@return nil
Expand Down
Loading