refactor(es_extended/server): rewrite callbacks

This commit is contained in:
Kasey FItton
2024-10-25 16:11:53 +01:00
parent 174f5cff18
commit 8a18978264
2 changed files with 77 additions and 30 deletions
@@ -1,3 +1,5 @@
---@diagnostic disable: duplicate-set-field
Callbacks = {}
Callbacks.__index = Callbacks
@@ -16,7 +18,7 @@ function Callbacks:Execute(cb, ...)
local success, errorString = pcall(cb, ...)
if not success then
error(("Failed to execute Callback with RequestId: ^5%s^1"):format(self.currentId ))
print(("[^1ERROR^7] Failed to execute Callback with RequestId: ^5%s^7"):format(self.currentId))
error(errorString)
return
end
@@ -33,13 +35,14 @@ function Callbacks:ServerRecieve(requestId, invoker, ...)
local callback = self.requests[self.currentId]
Callbacks:Execute(callback, ...)
self.requests[self.currentId] = nil
end
function Callbacks:Register(name, cb)
self.storage[name] = cb
end
function Callbacks:RecieveClient(eventName, requestId, invoker, ...)
function Callbacks:ClientRecieve(eventName, requestId, invoker, ...)
self.currentId = requestId
if not self.storage[eventName] then
@@ -47,7 +50,7 @@ function Callbacks:RecieveClient(eventName, requestId, invoker, ...)
end
local returnCb = function(...)
TriggerServerEvent("esx:clientCallback", self.currentId, invoker, ...)
TriggerServerEvent("esx:clientCallback", requestId, invoker, ...)
end
local callback = self.storage[eventName]
@@ -77,5 +80,5 @@ ESX.RegisterClientCallback = function(eventName, callback)
end
RegisterNetEvent("esx:triggerClientCallback", function(...)
Callbacks:RecieveClient(...)
Callbacks:ClientRecieve(...)
end)
+70 -26
View File
@@ -1,43 +1,87 @@
local serverCallbacks = {}
---@diagnostic disable: duplicate-set-field
local clientRequests = {}
local RequestId = 0
Callbacks = {}
Callbacks.__index = Callbacks
---@param eventName string
---@param callback function
ESX.RegisterServerCallback = function(eventName, callback)
serverCallbacks[eventName] = callback
Callbacks.requests = {}
Callbacks.storage = {}
Callbacks.id = 0
function Callbacks:Register(name, cb)
self.storage[name] = cb
end
RegisterNetEvent("esx:triggerServerCallback", function(eventName, requestId, invoker, ...)
if not serverCallbacks[eventName] then
return error(("Server Callback not registered, name: ^5%s^1, invoker resource: ^5%s^1"):format(eventName, invoker))
function Callbacks:Execute(cb, ...)
local success, errorString = pcall(cb, ...)
if not success then
print(("[^1ERROR^7] Failed to execute Callback with RequestId: ^5%s^7"):format(self.currentId))
error(errorString)
return
end
self.currentId = nil
end
function Callbacks:Trigger(player, event, cb, invoker, ...)
self.requests[self.id] = cb
TriggerClientEvent("esx:triggerClientCallback", player, event, self.id, invoker, ...)
self.id += 1
end
function Callbacks:ServerRecieve(player, event, requestId, invoker, ...)
self.currentId = requestId
if not self.storage[event] then
return error(("Server Callback with requestId ^5%s^1 Was Called by ^5%s^1 but does not exist."):format(event, invoker))
end
local source = source
local returnCb = function(...)
TriggerClientEvent("esx:serverCallback", player, self.currentId, invoker, ...)
end
local callback = self.storage[event]
serverCallbacks[eventName](source, function(...)
TriggerClientEvent("esx:serverCallback", source, requestId, invoker, ...)
end, ...)
self:Execute(callback, player, returnCb, ...)
end
function Callbacks:RecieveClient(requestId, invoker, ...)
self.currentId = requestId
if not self.requests[self.currentId] then
return error(("Client Callback with requestId ^5%s^1 Was Called by ^5%s^1 but does not exist."):format(self.currentId, invoker))
end
local callback = self.requests[self.currentId]
self:Execute(callback, ...)
self.requests[self.currentId] = nil
end
RegisterNetEvent("esx:clientCallback", function(requestId, invoker, ...)
Callbacks:RecieveClient(requestId, invoker, ...)
end)
RegisterNetEvent("esx:triggerServerCallback", function(eventName, requestId, invoker, ...)
local source = source
Callbacks:ServerRecieve(source, eventName, requestId, invoker, ...)
end)
---@param player number playerId
---@param eventName string
---@param callback function
---@param ... any
ESX.TriggerClientCallback = function(player, eventName, callback, ...)
clientRequests[RequestId] = callback
function ESX.TriggerClientCallback(player, eventName, callback, ...)
local invokingResource = GetInvokingResource()
local invoker = (invokingResource and invokingResource ~= "unknown") and invokingResource or "es_extended"
TriggerClientEvent("esx:triggerClientCallback", player, eventName, RequestId, GetInvokingResource() or "unknown", ...)
RequestId = RequestId + 1
Callbacks:Trigger(player, eventName, callback, invoker, ...)
end
RegisterNetEvent("esx:clientCallback", function(requestId, invoker, ...)
if not clientRequests[requestId] then
return error(("Client Callback with requestId ^5%s^1 Was Called by ^5%s^1 but does not exist."):format(requestId, invoker))
end
---@param eventName string
---@param callback function
ESX.RegisterServerCallback = function(eventName, callback)
Callbacks:Register(eventName, callback)
end
clientRequests[requestId](...)
clientRequests[requestId] = nil
end)