Home

Awesome

pollnet

Compact polling-based C-API networking library designed to be easily used from within game-embedded LuaJIT environments (e.g., mods)

Features

Usage (luajit FFI bindings)

-- pollnet.lua FFI loads pollnet.dll
local pollnet = require("pollnet")

-- Reactor is a convenience for running Lua coroutines
local reactor = pollnet.Reactor()

reactor:run(function()
  local sock = pollnet.open_ws("wss://irc-ws.chat.twitch.tv:443")
  -- special nick for anon read-only access on twitch
  sock:send("NICK justinfan" .. math.random(1, 100000))
  sock:send("JOIN #some_twitch_channel")

  while true do
    print("CHAT: ", sock:await())
  end
end)

reactor:run(function()
  -- HTTP requests return three messages in order:
  -- status code, headers, body
  local req_sock = pollnet.http_get("https://www.example.com")
  print("Status:", req_sock:await())
  print("Headers:", req_sock:await())
  print("Body:", req_sock:await())
end)

-- This part will be application specific:
-- you need to call reactor:update() regularly (e.g., every frame)
function on_frame()
  reactor:update()
end
AppSpecifiAPI.setFrameCallback(on_frame)

FAQ

Why would I want this?

This is most useful for running from within the LuaJIT environment of a game, or other interactive-type application, where you don't have control over the overall program flow, but only get to run some Lua every frame or simulation 'tick'.

What makes this useful for mods?

Can this be used outside of LuaJIT?

It can be used from anything that can link a C-API dynamic library (so in practice, anything with an FFI).

Building

Prebuilt binaries (including win32) are available from releases.

Pollnet builds with Rust in the standard way. Assuming you're on a 64 bit machine, building for 64 bit:

cargo build --release

However to use this from a 32 bit Windows binary (e.g., LuaJIT in a 32 bit application such as Noita, MWSE, etc.), you'll need to build for 32 bit:

rustup target add i686-pc-windows-msvc
cargo build --target=i686-pc-windows-msvc --release

The resulting .dll will end up in target/i686-pc-windows-msvc/release/pollnet.dll.