Skip to content

Commit 532070b

Browse files
committed
feat(callback): add AwaitClientCallback function
1 parent 4627d8a commit 532070b

File tree

2 files changed

+57
-26
lines changed

2 files changed

+57
-26
lines changed

[core]/es_extended/client/modules/callback.lua

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,12 @@ Callbacks.id = 0
1414
-- MARK: Internal Functions
1515
-- =============================================
1616

17-
function Callbacks:Trigger(event, cb, invoker, ...)
1817

19-
self.requests[self.id] = {
20-
await = type(cb) == "boolean",
21-
cb = cb or promise:new()
18+
function Callbacks:Register(name, resource, cb)
19+
self.storage[name] = {
20+
resource = resource,
21+
cb = cb
2222
}
23-
local table = self.requests[self.id]
24-
25-
TriggerServerEvent("esx:triggerServerCallback", event, self.id, invoker, ...)
26-
27-
self.id += 1
28-
29-
return table.cb
3023
end
3124

3225
function Callbacks:Execute(cb, id, ...)
@@ -39,6 +32,20 @@ function Callbacks:Execute(cb, id, ...)
3932
end
4033
end
4134

35+
function Callbacks:Trigger(event, cb, invoker, ...)
36+
self.requests[self.id] = {
37+
await = type(cb) == "boolean",
38+
cb = cb or promise:new()
39+
}
40+
local table = self.requests[self.id]
41+
42+
TriggerServerEvent("esx:triggerServerCallback", event, self.id, invoker, ...)
43+
44+
self.id += 1
45+
46+
return table.cb
47+
end
48+
4249
function Callbacks:ServerRecieve(requestId, invoker, ...)
4350
if not self.requests[requestId] then
4451
return error(("Server Callback with requestId ^5%s^1 Was Called by ^5%s^1 but does not exist."):format(requestId, invoker))
@@ -49,21 +56,13 @@ function Callbacks:ServerRecieve(requestId, invoker, ...)
4956
self.requests[requestId] = nil
5057

5158
if callback.await then
52-
callback.cb:resolve({...})
59+
callback.cb:resolve({ ... })
5360
else
5461
self:Execute(callback.cb, requestId, ...)
5562
end
5663
end
5764

58-
function Callbacks:Register(name, resource, cb)
59-
self.storage[name] = {
60-
resource = resource,
61-
cb = cb
62-
}
63-
end
64-
6565
function Callbacks:ClientRecieve(eventName, requestId, invoker, ...)
66-
6766
if not self.storage[eventName] then
6867
return error(("Client Callback with requestId ^5%s^1 Was Called by ^5%s^1 but does not exist."):format(eventName, invoker))
6968
end
@@ -130,14 +129,14 @@ end
130129
-- MARK: Events
131130
-- =============================================
132131

133-
ESX.SecureNetEvent("esx:triggerClientCallback", function(...)
134-
Callbacks:ClientRecieve(...)
135-
end)
136-
137132
ESX.SecureNetEvent("esx:serverCallback", function(...)
138133
Callbacks:ServerRecieve(...)
139134
end)
140135

136+
ESX.SecureNetEvent("esx:triggerClientCallback", function(...)
137+
Callbacks:ClientRecieve(...)
138+
end)
139+
141140
AddEventHandler("onResourceStop", function(resource)
142141
for k, v in pairs(Callbacks.storage) do
143142
if v.resource == resource then

[core]/es_extended/server/modules/callback.lua

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,17 @@ function Callbacks:Execute(cb, ...)
3333
end
3434

3535
function Callbacks:Trigger(player, event, cb, invoker, ...)
36-
self.requests[self.id] = cb
36+
self.requests[self.id] = {
37+
await = type(cb) == "boolean",
38+
cb = cb or promise:new()
39+
}
40+
local table = self.requests[self.id]
3741

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

4044
self.id += 1
45+
46+
return table.cb
4147
end
4248

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

6571
local callback = self.requests[self.currentId]
6672

67-
self:Execute(callback, ...)
6873
self.requests[requestId] = nil
74+
if callback.await then
75+
callback.cb:resolve({ ... })
76+
else
77+
self:Execute(callback.cb, ...)
78+
end
6979
end
7080

7181
-- =============================================
@@ -83,6 +93,28 @@ function ESX.TriggerClientCallback(player, eventName, callback, ...)
8393
Callbacks:Trigger(player, eventName, callback, invoker, ...)
8494
end
8595

96+
---@param player number playerId
97+
---@param eventName string
98+
---@param ... any
99+
---@return any
100+
function ESX.AwaitClientCallback(player, eventName, ...)
101+
local invokingResource = GetInvokingResource()
102+
local invoker = (invokingResource and invokingResource ~= "Unknown") and invokingResource or "es_extended"
103+
104+
local p = Callbacks:Trigger(player, eventName, false, invoker, ...)
105+
if not p then return end
106+
107+
SetTimeout(15000, function()
108+
if p.state == "pending" then
109+
p:reject("Server Callback Timed Out")
110+
end
111+
end)
112+
113+
Citizen.Await(p)
114+
115+
return table.unpack(p.value)
116+
end
117+
86118
---@param eventName string
87119
---@param callback function
88120
---@return nil

0 commit comments

Comments
 (0)