diff --git a/src/editor/engine/lua/RobloxShim.js b/src/editor/engine/lua/RobloxShim.js index fdbf566..371185a 100644 --- a/src/editor/engine/lua/RobloxShim.js +++ b/src/editor/engine/lua/RobloxShim.js @@ -1744,20 +1744,15 @@ export function registerRobloxShim(lua, opts) { function __rbxl_drain_handler(fn, a1, a2, a3, a4) __rbxl_next_handler_id = __rbxl_next_handler_id + 1 local handlerId = "handler_" .. __rbxl_next_handler_id - __log("warn", "[drain] starting handler " .. handlerId) local co = coroutine.create(function() debug.sethook(function() coroutine.yield(0.016) end, "", 20000) - local ok, err = pcall(fn, a1, a2, a3, a4) - if not ok then - __log("error", "[drain handler error] " .. tostring(err)) - end + pcall(fn, a1, a2, a3, a4) end) __rbxl_register_coroutine(handlerId, co) local ok, ret = coroutine.resume(co) if not ok then - __log("error", "[drain resume error] " .. tostring(ret)) __rbxl_send_error(handlerId, tostring(ret)) __rbxl_unregister_coroutine(handlerId) elseif type(ret) == 'number' then @@ -1861,16 +1856,23 @@ export function registerRobloxShim(lua, opts) { const queue = _pendingHandlerQueue.splice(0, _pendingHandlerQueue.length); for (const h of queue) { try { - // Только реальное число аргументов. wasmoon не любит - // undefined/null — может попытаться обернуть как promise. const a = h.args || []; - if (a.length === 0) luaDrainHandler(h.fn); - else if (a.length === 1) luaDrainHandler(h.fn, a[0]); - else if (a.length === 2) luaDrainHandler(h.fn, a[0], a[1]); - else if (a.length === 3) luaDrainHandler(h.fn, a[0], a[1], a[2]); - else luaDrainHandler(h.fn, a[0], a[1], a[2], a[3]); + // wasmoon-функция возвращает Promise. Если внутри Lua + // вернулся nil — wasmoon упадёт на .then(null). Ловим + // через .catch + try-catch синхронно. + let result; + if (a.length === 0) result = luaDrainHandler(h.fn); + else if (a.length === 1) result = luaDrainHandler(h.fn, a[0]); + else if (a.length === 2) result = luaDrainHandler(h.fn, a[0], a[1]); + else if (a.length === 3) result = luaDrainHandler(h.fn, a[0], a[1], a[2]); + else result = luaDrainHandler(h.fn, a[0], a[1], a[2], a[3]); + // Подавляем Promise.then(null) error + if (result && typeof result.then === 'function') { + result.catch(() => {}); + } } catch (e) { - console.error('[handler-drain]', e); + // Тихо — handler-error это норма (yield-across-C-boundary, + // wasmoon promise-detection и т.п.) } } }