Skip to content

Commit 8f9d482

Browse files
authored
Merge pull request #1160 from Z3rio/main
feat: use promises in callbacks + cleanup
2 parents de351c0 + 369f15b commit 8f9d482

File tree

5 files changed

+68
-26
lines changed

5 files changed

+68
-26
lines changed

client/events.lua

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,15 +208,22 @@ end)
208208

209209
-- Client Callback
210210
RegisterNetEvent('QBCore:Client:TriggerClientCallback', function(name, ...)
211-
QBCore.Functions.TriggerClientCallback(name, function(...)
211+
if not QBCore.ClientCallbacks[name] then return end
212+
213+
QBCore.ClientCallbacks[name](function(...)
212214
TriggerServerEvent('QBCore:Server:TriggerClientCallback', name, ...)
213215
end, ...)
214216
end)
215217

216218
-- Server Callback
217219
RegisterNetEvent('QBCore:Client:TriggerCallback', function(name, ...)
218220
if QBCore.ServerCallbacks[name] then
219-
QBCore.ServerCallbacks[name](...)
221+
QBCore.ServerCallbacks[name].promise:resolve(...)
222+
223+
if QBCore.ServerCallbacks[name].callback then
224+
QBCore.ServerCallbacks[name].callback(...)
225+
end
226+
220227
QBCore.ServerCallbacks[name] = nil
221228
end
222229
end)

client/functions.lua

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,26 @@ function QBCore.Functions.CreateClientCallback(name, cb)
66
QBCore.ClientCallbacks[name] = cb
77
end
88

9-
function QBCore.Functions.TriggerClientCallback(name, cb, ...)
10-
if not QBCore.ClientCallbacks[name] then return end
11-
QBCore.ClientCallbacks[name](cb, ...)
12-
end
9+
function QBCore.Functions.TriggerCallback(name, ...)
10+
local cb = nil
11+
local args = { ... }
12+
13+
if QBCore.Shared.IsFunction(args[1]) then
14+
cb = args[1]
15+
table.remove(args, 1)
16+
end
1317

14-
function QBCore.Functions.TriggerCallback(name, cb, ...)
15-
QBCore.ServerCallbacks[name] = cb
16-
TriggerServerEvent('QBCore:Server:TriggerCallback', name, ...)
18+
QBCore.ServerCallbacks[name] = {
19+
callback = cb,
20+
promise = promise.new()
21+
}
22+
23+
TriggerServerEvent('QBCore:Server:TriggerCallback', name, table.unpack(args))
24+
25+
if cb == nil then
26+
Citizen.Await(QBCore.ServerCallbacks[name].promise)
27+
return QBCore.ServerCallbacks[name].promise.value
28+
end
1729
end
1830

1931
function QBCore.Debug(resource, obj, depth)

server/events.lua

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ local databaseConnected, bansTableExists = readyFunction == nil, readyFunction =
3232
if readyFunction ~= nil then
3333
MySQL.ready(function()
3434
databaseConnected = true
35-
35+
3636
local DatabaseInfo = QBCore.Functions.GetDatabaseInfo()
3737
if not DatabaseInfo or not DatabaseInfo.exists then return end
3838

@@ -125,15 +125,23 @@ end)
125125
-- Client Callback
126126
RegisterNetEvent('QBCore:Server:TriggerClientCallback', function(name, ...)
127127
if QBCore.ClientCallbacks[name] then
128-
QBCore.ClientCallbacks[name](...)
128+
QBCore.ClientCallbacks[name].promise:resolve(...)
129+
130+
if QBCore.ClientCallbacks[name].callback then
131+
QBCore.ClientCallbacks[name].callback(...)
132+
end
133+
129134
QBCore.ClientCallbacks[name] = nil
130135
end
131136
end)
132137

133138
-- Server Callback
134139
RegisterNetEvent('QBCore:Server:TriggerCallback', function(name, ...)
140+
if not QBCore.ServerCallbacks[name] then return end
141+
135142
local src = source
136-
QBCore.Functions.TriggerCallback(name, src, function(...)
143+
144+
QBCore.ServerCallbacks[name](src, function(...)
137145
TriggerClientEvent('QBCore:Client:TriggerCallback', src, name, ...)
138146
end, ...)
139147
end)

server/functions.lua

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -434,9 +434,26 @@ end
434434
---@param source any
435435
---@param cb function
436436
---@param ... any
437-
function QBCore.Functions.TriggerClientCallback(name, source, cb, ...)
438-
QBCore.ClientCallbacks[name] = cb
439-
TriggerClientEvent('QBCore:Client:TriggerClientCallback', source, name, ...)
437+
function QBCore.Functions.TriggerClientCallback(name, source, ...)
438+
local cb = nil
439+
local args = { ... }
440+
441+
if QBCore.Shared.IsFunction(args[1]) then
442+
cb = args[1]
443+
table.remove(args, 1)
444+
end
445+
446+
QBCore.ClientCallbacks[name] = {
447+
callback = cb,
448+
promise = promise.new()
449+
}
450+
451+
TriggerClientEvent('QBCore:Client:TriggerClientCallback', source, name, table.unpack(args))
452+
453+
if cb == nil then
454+
Citizen.Await(QBCore.ClientCallbacks[name].promise)
455+
return QBCore.ClientCallbacks[name].promise.value
456+
end
440457
end
441458

442459
---Create Server Callback
@@ -446,16 +463,6 @@ function QBCore.Functions.CreateCallback(name, cb)
446463
QBCore.ServerCallbacks[name] = cb
447464
end
448465

449-
---Trigger Serv er Callback
450-
---@param name string
451-
---@param source any
452-
---@param cb function
453-
---@param ... any
454-
function QBCore.Functions.TriggerCallback(name, source, cb, ...)
455-
if not QBCore.ServerCallbacks[name] then return end
456-
QBCore.ServerCallbacks[name](source, cb, ...)
457-
end
458-
459466
-- Items
460467

461468
---Create a usable item
@@ -475,7 +482,7 @@ function QBCore.Functions.CreateUseableItem(item, data)
475482
elseif type(data) == "function" then
476483
rawFunc = data
477484
end
478-
485+
479486
if rawFunc then
480487
QBCore.UsableItems[item] = {
481488
func = rawFunc,

shared/main.lua

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,14 @@ function QBShared.ChangeVehicleExtra(vehicle, extra, enable)
6868
end
6969
end
7070

71+
function QBShared.IsFunction(value)
72+
if type(value) == 'table' then
73+
return value.__cfx_functionReference ~= nil and type(value.__cfx_functionReference) == "string"
74+
end
75+
76+
return type(value) == 'function'
77+
end
78+
7179
function QBShared.SetDefaultVehicleExtras(vehicle, config)
7280
-- Clear Extras
7381
for i = 1, 20 do

0 commit comments

Comments
 (0)