49 lines
1.3 KiB
TypeScript
49 lines
1.3 KiB
TypeScript
import type { SysCallMapping } from "$lib/plugos/system.ts";
|
|
import type { EventListenerDef } from "$common/space_script.ts";
|
|
import { buildThreadLocalEnv, handleLuaError } from "$common/space_lua_api.ts";
|
|
import {
|
|
type ILuaFunction,
|
|
jsToLuaValue,
|
|
luaCall,
|
|
LuaStackFrame,
|
|
luaValueToJS,
|
|
} from "$common/space_lua/runtime.ts";
|
|
import type { CommonSystem } from "$common/common_system.ts";
|
|
|
|
export type CallbackEventListener = EventListenerDef & {
|
|
run: ILuaFunction;
|
|
};
|
|
|
|
export function eventListenerSyscalls(
|
|
commonSystem: CommonSystem,
|
|
): SysCallMapping {
|
|
return {
|
|
/**
|
|
* Define a Lua event listener
|
|
*/
|
|
"event.listen": (
|
|
_ctx,
|
|
def: CallbackEventListener,
|
|
) => {
|
|
console.log("Registering Lua event listener: ", def.name);
|
|
commonSystem.scriptEnv.registerEventListener(
|
|
def,
|
|
async (...args: any[]) => {
|
|
const tl = await buildThreadLocalEnv(
|
|
commonSystem.system,
|
|
commonSystem.spaceLuaEnv.env,
|
|
);
|
|
const sf = new LuaStackFrame(tl, null);
|
|
try {
|
|
return luaValueToJS(
|
|
await luaCall(def.run, args.map(jsToLuaValue), sf),
|
|
);
|
|
} catch (e: any) {
|
|
await handleLuaError(e, commonSystem.system);
|
|
}
|
|
},
|
|
);
|
|
},
|
|
};
|
|
}
|