From 8004dcfbf087aa1e1668cc6a7a6ba5f5b0b5d727 Mon Sep 17 00:00:00 2001 From: Kasey FItton Date: Sun, 17 Nov 2024 21:42:23 +0000 Subject: [PATCH 1/4] feat(es_extended/client/callback): implement ESX.AwaitServerCallback example usage: ```lua RegisterCommand("callback", function () local value, value2 = ESX.AwaitServerCallback("es_extended:callbackTest") print(value, value2) end, false) ``` --- .../es_extended/client/modules/callback.lua | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/[core]/es_extended/client/modules/callback.lua b/[core]/es_extended/client/modules/callback.lua index 738b3bb1..7d69a6ff 100644 --- a/[core]/es_extended/client/modules/callback.lua +++ b/[core]/es_extended/client/modules/callback.lua @@ -7,10 +7,18 @@ Callbacks.storage = {} Callbacks.id = 0 function Callbacks:Trigger(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] + TriggerServerEvent("esx:triggerServerCallback", event, self.id, invoker, ...) self.id += 1 + + return table.cb end function Callbacks:Execute(cb, ...) @@ -32,7 +40,12 @@ function Callbacks:ServerRecieve(requestId, invoker, ...) local callback = self.requests[self.currentId] - Callbacks:Execute(callback, ...) + if callback.await then + return callback.cb:resolve({...}) + else + Callbacks:Execute(callback.cb, ...) + end + self.requests[requestId] = nil end @@ -66,6 +79,28 @@ ESX.TriggerServerCallback = function(eventName, callback, ...) Callbacks:Trigger(eventName, callback, invoker, ...) end +---@param eventName string +---@param ... any +---@return any +ESX.AwaitServerCallback = function(eventName, ...) + local invokingResource = GetInvokingResource() + local invoker = (invokingResource and invokingResource ~= "unknown") and invokingResource or "es_extended" + + local p = Callbacks:Trigger(eventName, false, invoker, ...) + if not p then return end + + -- if the server callback takes longer than 15 seconds to respond, reject the promise + 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 + ESX.SecureNetEvent("esx:serverCallback", function(...) Callbacks:ServerRecieve(...) end) From b4548945dddd6dc0a4695071f5040db6abc46966 Mon Sep 17 00:00:00 2001 From: Kasey FItton Date: Sun, 17 Nov 2024 22:09:55 +0000 Subject: [PATCH 2/4] tweak(es_extended/client/callback): use self:Execute --- [core]/es_extended/client/modules/callback.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/[core]/es_extended/client/modules/callback.lua b/[core]/es_extended/client/modules/callback.lua index 7d69a6ff..9e614b43 100644 --- a/[core]/es_extended/client/modules/callback.lua +++ b/[core]/es_extended/client/modules/callback.lua @@ -43,7 +43,7 @@ function Callbacks:ServerRecieve(requestId, invoker, ...) if callback.await then return callback.cb:resolve({...}) else - Callbacks:Execute(callback.cb, ...) + self:Execute(callback.cb, ...) end self.requests[requestId] = nil @@ -65,7 +65,7 @@ function Callbacks:ClientRecieve(eventName, requestId, invoker, ...) end local callback = self.storage[eventName] - Callbacks:Execute(callback, returnCb, ...) + self:Execute(callback, returnCb, ...) end ---@param eventName string From 32f8e05442d1856f178fb1af992240dee2ba0f3f Mon Sep 17 00:00:00 2001 From: Kasey FItton Date: Sun, 17 Nov 2024 22:12:29 +0000 Subject: [PATCH 3/4] fix(es_extended/client/callback): dont return before cleanup --- [core]/es_extended/client/modules/callback.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/[core]/es_extended/client/modules/callback.lua b/[core]/es_extended/client/modules/callback.lua index 9e614b43..74692840 100644 --- a/[core]/es_extended/client/modules/callback.lua +++ b/[core]/es_extended/client/modules/callback.lua @@ -41,7 +41,7 @@ function Callbacks:ServerRecieve(requestId, invoker, ...) local callback = self.requests[self.currentId] if callback.await then - return callback.cb:resolve({...}) + callback.cb:resolve({...}) else self:Execute(callback.cb, ...) end From faef100addef0fb98ab2010a3c3e542e9b1fd12d Mon Sep 17 00:00:00 2001 From: Kasey FItton Date: Sun, 17 Nov 2024 22:59:21 +0000 Subject: [PATCH 4/4] fix(es_extended/client/callback): make sure data is cleaned up --- .../es_extended/client/modules/callback.lua | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/[core]/es_extended/client/modules/callback.lua b/[core]/es_extended/client/modules/callback.lua index 74692840..bd47e447 100644 --- a/[core]/es_extended/client/modules/callback.lua +++ b/[core]/es_extended/client/modules/callback.lua @@ -21,32 +21,30 @@ function Callbacks:Trigger(event, cb, invoker, ...) return table.cb end -function Callbacks:Execute(cb, ...) +function Callbacks:Execute(cb, id, ...) local success, errorString = pcall(cb, ...) if not success then - print(("[^1ERROR^7] Failed to execute Callback with RequestId: ^5%s^7"):format(self.currentId)) + print(("[^1ERROR^7] Failed to execute Callback with RequestId: ^5%s^7"):format(id)) error(errorString) return end - self.currentId = nil end function Callbacks:ServerRecieve(requestId, invoker, ...) - self.currentId = requestId - if not self.requests[self.currentId] then - return error(("Server Callback with requestId ^5%s^1 Was Called by ^5%s^1 but does not exist."):format(self.currentId, 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)) end - local callback = self.requests[self.currentId] + local callback = self.requests[requestId] + + self.requests[requestId] = nil if callback.await then callback.cb:resolve({...}) else - self:Execute(callback.cb, ...) + self:Execute(callback.cb, requestId, ...) end - - self.requests[requestId] = nil end function Callbacks:Register(name, cb) @@ -54,7 +52,6 @@ function Callbacks:Register(name, cb) end function Callbacks:ClientRecieve(eventName, requestId, invoker, ...) - self.currentId = requestId 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)) @@ -65,7 +62,7 @@ function Callbacks:ClientRecieve(eventName, requestId, invoker, ...) end local callback = self.storage[eventName] - self:Execute(callback, returnCb, ...) + self:Execute(callback, requestId, returnCb, ...) end ---@param eventName string