forked from Simnation/Main
62 lines
No EOL
1.7 KiB
Lua
62 lines
No EOL
1.7 KiB
Lua
FM.callback = {}
|
|
|
|
local callbacks = {}
|
|
local requests = {}
|
|
|
|
local function getRandomReqId(e)
|
|
local reqId
|
|
repeat
|
|
reqId = ('reqId_%s_%s'):format(e, math.random(0, 100000))
|
|
until not requests[reqId]
|
|
return reqId
|
|
end
|
|
|
|
---@param e string -- event name
|
|
---@param cb function -- callback function
|
|
---Register a callback
|
|
function FM.callback.register(e, cb)
|
|
callbacks[e] = cb
|
|
end
|
|
|
|
---@param e string -- event name
|
|
---@param src number -- source
|
|
---@param cb function -- response function
|
|
---@param ... any -- arguments
|
|
---@async
|
|
---Perform an asynchronous callback request
|
|
function FM.callback.async(e, src, cb, ...)
|
|
local reqId = getRandomReqId(e)
|
|
requests[reqId] = cb
|
|
TriggerClientEvent('fmLib:client:callback:request', src, e, reqId, ...)
|
|
end
|
|
|
|
---@param e string -- event name
|
|
---@param src number -- source
|
|
---@param ... any -- arguments
|
|
---@return ... any -- response arguments
|
|
---Perform an synchronous callback request
|
|
function FM.callback.sync(e, src, ...)
|
|
local reqId = getRandomReqId(e)
|
|
local cb = promise.new()
|
|
|
|
requests[reqId] = function(...)
|
|
cb:resolve({...})
|
|
end
|
|
|
|
TriggerClientEvent('fmLib:client:callback:request', src, e, reqId, ...)
|
|
|
|
return table.unpack(Citizen.Await(cb))
|
|
end
|
|
|
|
RegisterNetEvent('fmLib:server:callback:listener', function(reqId, ...)
|
|
requests[reqId](...)
|
|
requests[reqId] = nil
|
|
end)
|
|
|
|
RegisterNetEvent('fmLib:server:callback:request', function(e, reqId, ...)
|
|
local src = source
|
|
if not callbacks[e] then FM.console.err("No callback found for "..e, false) return end
|
|
TriggerClientEvent('fmLib:client:callback:listener', src, reqId, callbacks[e](src, ...))
|
|
end)
|
|
|
|
FM.cb = FM.callback |