game info

wasm
Alexander Bentkamp 3 years ago
parent 32a2ff3e18
commit 4e45111dd8

@ -2,6 +2,7 @@
var stderrBuffer = "" var stderrBuffer = ""
var messageBuffer = [] var messageBuffer = []
var initialized = false; var initialized = false;
var pointer = null;
var headerMode = true; var headerMode = true;
var header=""; var header="";
@ -15,7 +16,7 @@ function flushMessageBuffer(){
if (initialized) { if (initialized) {
while(messageBuffer.length > 0) { while(messageBuffer.length > 0) {
var msg = messageBuffer.shift(); var msg = messageBuffer.shift();
Module.ccall('send_message', 'void', ['string'], [msg]); Module.ccall('send_message', 'void', ['string', 'pointer'], [msg, pointer]);
} }
} }
} }
@ -57,8 +58,12 @@ var Module = {
}], }],
"noInitialRun": true, "noInitialRun": true,
"onRuntimeInitialized": () => { "onRuntimeInitialized": () => {
Module.ccall('main', 'number', [], []); pointer = Module.ccall('main', 'pointer', [], []);
initialized = true; initialized = true;
if (stderrBuffer !== "") {
console.log(stderrBuffer);
stderrBuffer = ""
}
flushMessageBuffer(); flushMessageBuffer();
} }
}; };

@ -1,6 +1,12 @@
import Lean.Server.Watchdog
import GameServer.Commands import GameServer.Commands
import GameServer.Game
Game "TestGame" Game "TestGame"
Title "Hello Test" Title "Hello Test"
MakeGame MakeGame
#eval do
let env ← (Lean.getEnv : Lean.MetaM _)
return (gameExt.getState env).size

@ -1,4 +1,5 @@
import Lean.Server.Watchdog import Lean.Server.Watchdog
import GameServer.EnvExtensions
import GameServer.Game import GameServer.Game
namespace WasmServer.Watchdog namespace WasmServer.Watchdog
@ -13,21 +14,39 @@ open System.Uri
def ServerState := GameServerState def ServerState := GameServerState
@[export game_make_state] @[export game_make_state]
def makeState : IO (Ref ServerState) := do unsafe def makeState : IO (ServerState) := do
let e ← IO.getStderr let e ← IO.getStderr
try try
Lean.enableInitializersExecution
searchPathRef.set ["/lib", "/gamelib"] searchPathRef.set ["/lib", "/gamelib"]
e.putStrLn s!"Importing"
let state : GameServerState := { let state : GameServerState := {
env := ← importModules #[ env := ← importModules #[
{ module := `Init : Import } { module := `Init : Import },
-- { module := `GameServer : Import } { module := `GameServer : Import }
] {} 0 --← createEnv gameDir module, ] {} 0 --← createEnv gameDir module,
game := "TEST", game := "TEST",
gameDir := "test", gameDir := "test",
inventory := #[] inventory := #[]
difficulty := 0 difficulty := 0
} }
return ← IO.mkRef state e.putStrLn s!"Import complete"
let pExtDescrs ← persistentEnvExtensionsRef.get
pExtDescrs.forM fun extDescr => do
e.putStrLn ("extension '" ++ toString extDescr.name ++ "'")
let s := extDescr.toEnvExtension.getState state.env
let fmt := extDescr.statsFn s.state
unless fmt.isNil do IO.println (" " ++ toString (Format.nest 2 (extDescr.statsFn s.state)))
e.putStrLn (" number of imported entries: " ++ toString (s.importedEntries.foldl (fun sum es => sum + es.size) 0))
e.putStrLn s!"{(gameExt.getState state.env).size}"
let some game := (gameExt.getState state.env).find? `TestGame
| throwServerError "Game not found"
let gameJson : Json := toJson game
-- Add world sizes to Json object
-- let worldSize := game.worlds.nodes.toList.map (fun (n, w) => (n.toString, w.levels.size))
-- let gameJson := gameJson.mergeObj (Json.mkObj [("worldSize", Json.mkObj worldSize)])
e.putStrLn s!"{gameJson}"
return state
catch err => catch err =>
e.putStrLn s!"Import error: {err}" e.putStrLn s!"Import error: {err}"
throw err throw err
@ -67,8 +86,9 @@ def initializeServer (id : RequestID) : IO Unit := do
} }
return () return ()
@[export game_send_message] @[export game_send_message]
def sendMessage (s : String) (state : Ref ServerState) : IO Unit := do unsafe def sendMessage (s : String) (state : ServerState) : IO Unit := do
let o ← IO.getStdout let o ← IO.getStdout
let e ← IO.getStderr let e ← IO.getStderr
try try
@ -77,14 +97,16 @@ def sendMessage (s : String) (state : Ref ServerState) : IO Unit := do
| Message.request id "initialize" params? => | Message.request id "initialize" params? =>
initializeServer id initializeServer id
| Message.request id "info" _ => | Message.request id "info" _ =>
let some game := (gameExt.getState (← state.get).env).find? `TestGame
let some game := (gameExt.getState state.env).find? `TestGame
| throwServerError "Game not found" | throwServerError "Game not found"
let gameJson : Json := toJson game let gameJson : Json := toJson game
-- Add world sizes to Json object -- Add world sizes to Json object
let worldSize := game.worlds.nodes.toList.map (fun (n, w) => (n.toString, w.levels.size)) -- let worldSize := game.worlds.nodes.toList.map (fun (n, w) => (n.toString, w.levels.size))
let gameJson := gameJson.mergeObj (Json.mkObj [("worldSize", Json.mkObj worldSize)]) -- let gameJson := gameJson.mergeObj (Json.mkObj [("worldSize", Json.mkObj worldSize)])
e.putStrLn s!"{gameJson}"
o.writeLspResponse ⟨id, gameJson⟩ o.writeLspResponse ⟨id, gameJson⟩
| _ => throw $ userError s!"Expected JSON-RPC request, got: '{(toJson m).compress}'" | _ => pure () --throw $ userError s!"Expected JSON-RPC request, got: '{(toJson m).compress}'"
catch err => catch err =>
e.putStrLn s!"Server error: {err}" e.putStrLn s!"Server error: {err}"

@ -13,7 +13,8 @@ extern lean_object * initialize_GameServer_WasmServer(uint8_t builtin, lean_obje
lean_object * state; lean_object * state;
lean_object * io_world; lean_object * io_world;
int main() {
lean_object * main() {
lean_initialize(); lean_initialize();
lean_initialize_runtime_module(); lean_initialize_runtime_module();
lean_object * res; lean_object * res;
@ -26,13 +27,21 @@ int main() {
} else { } else {
lean_io_result_show_error(res); lean_io_result_show_error(res);
lean_dec(res); lean_dec(res);
return 1; // do not access Lean declarations if initialization failed return 0; // do not access Lean declarations if initialization failed
} }
lean_io_mark_end_initialization(); lean_io_mark_end_initialization();
state = lean_io_result_get_value(game_make_state(io_world)); res = game_make_state(io_world);
if (lean_io_result_is_ok(res)) {
state = lean_io_result_get_value(res);
return state;
} else {
lean_io_result_show_error(res);
lean_dec(res);
return 0; // do not access Lean declarations if initialization failed
}
} }
void send_message(char* msg){ void send_message(char* msg, lean_object * state){
lean_object * s = lean_mk_string(msg); lean_object * s = lean_mk_string(msg);
game_send_message(s, state, io_world); game_send_message(s, state, io_world);
} }

@ -5,6 +5,7 @@ cp -r server server32bit
cd server32bit cd server32bit
/home/alex/Projects/lean4/build/test/stage1/bin/lake update -R /home/alex/Projects/lean4/build/test/stage1/bin/lake update -R
/home/alex/Projects/lean4/build/test/stage1/bin/lake clean
/home/alex/Projects/lean4/build/test/stage1/bin/lake build /home/alex/Projects/lean4/build/test/stage1/bin/lake build
cd ../server cd ../server
@ -21,7 +22,7 @@ emcc -o $OUT_DIR/server.js main.c -I $LEAN_SYSROOT/include -L $LEAN_LIBDIR build
--preload-file "${LEAN_SYSROOT}/lib/lean/Init"@/lib/Init \ --preload-file "${LEAN_SYSROOT}/lib/lean/Init"@/lib/Init \
--preload-file "${LEAN_SYSROOT}/lib/lean/Init.olean"@/lib/Init.olean \ --preload-file "${LEAN_SYSROOT}/lib/lean/Init.olean"@/lib/Init.olean \
--preload-file "${LEAN_SYSROOT}/lib/lean/Init.ilean"@/lib/Init.ilean \ --preload-file "${LEAN_SYSROOT}/lib/lean/Init.ilean"@/lib/Init.ilean \
# --preload-file "${LEAN_SYSROOT}/lib/lean/Lean"@/lib/Lean \ --preload-file "${LEAN_SYSROOT}/lib/lean/Lean"@/lib/Lean \
# --preload-file "${LEAN_SYSROOT}/lib/lean/Lean.olean"@/lib/Lean.olean \ --preload-file "${LEAN_SYSROOT}/lib/lean/Lean.olean"@/lib/Lean.olean \
# --preload-file "${LEAN_SYSROOT}/lib/lean/Lean.ilean"@/lib/Lean.ilean \ --preload-file "${LEAN_SYSROOT}/lib/lean/Lean.ilean"@/lib/Lean.ilean \
# --preload-file "../server32bit/build/lib"@/gamelib --preload-file "../server32bit/build/lib"@/gamelib

Loading…
Cancel
Save