Skip to content
vic

lipp/lua-websockets.json
{
"createdAt": "2012-02-23T08:57:12Z",
"defaultBranch": "master",
"description": "Websockets for Lua.",
"fullName": "lipp/lua-websockets",
"homepage": "http://lipp.github.com/lua-websockets/",
"language": "Lua",
"name": "lua-websockets",
"pushedAt": "2022-11-14T21:32:49Z",
"stargazersCount": 415,
"topics": [],
"updatedAt": "2025-11-09T14:54:59Z",
"url": "https://github.com/lipp/lua-websockets"
}

If someone wants to maintain / take ownership of this project, reach out to me (issue, email). I like Lua very much, but I don’t have enough time / resources to stay engaged with it.

This project provides Lua modules for Websocket Version 13 conformant clients and servers. Build Status Coverage Status

The minified version is only ~10k bytes in size.

Clients are available in three different flavours:

  • synchronous
  • coroutine based (copas)
  • asynchronous (lua-ev)

Servers are available as two different flavours:

A webserver is NOT part of lua-websockets. If you are looking for a feature rich webserver framework, have a look at orbit or others. It is no problem to work with a “normal” webserver and lua-websockets side by side (two processes, different ports), since websockets are not subject of the ‘Same origin policy’.

This implements a basic echo server via Websockets protocol. Once you are connected with the server, all messages you send will be returned (‘echoed’) by the server immediately.

local copas = require'copas'
-- create a copas webserver and start listening
local server = require'websocket'.server.copas.listen
{
-- listen on port 8080
port = 8080,
-- the protocols field holds
-- key: protocol name
-- value: callback on new connection
protocols = {
-- this callback is called, whenever a new client connects.
-- ws is a new websocket instance
echo = function(ws)
while true do
local message = ws:receive()
if message then
ws:send(message)
else
ws:close()
return
end
end
end
}
}
-- use the copas loop
copas.loop()

This implements a basic echo server via Websockets protocol. Once you are connected with the server, all messages you send will be returned (‘echoed’) by the server immediately.

local ev = require'ev'
-- create a copas webserver and start listening
local server = require'websocket'.server.ev.listen
{
-- listen on port 8080
port = 8080,
-- the protocols field holds
-- key: protocol name
-- value: callback on new connection
protocols = {
-- this callback is called, whenever a new client connects.
-- ws is a new websocket instance
echo = function(ws)
ws:on_message(function(ws,message)
ws:send(message)
end)
-- this is optional
ws:on_close(function()
ws:close()
end)
end
}
}
-- use the lua-ev loop
ev.Loop.default:loop()

The folder test-server contains two re-implementations of the libwebsocket test-server.c example.

Terminal window
cd test-server
lua test-server-ev.lua
Terminal window
cd test-server
lua test-server-copas.lua

Connect to the from Javascript (e.g. chrome’s debugging console) like this:

var echoWs = new WebSocket('ws://127.0.0.1:8002','echo');

The client and server modules depend on:

  • luasocket
  • luabitop (if not using Lua 5.2 nor luajit)
  • luasec
  • copas (optionally)
  • lua-ev (optionally)
Terminal window
$ git clone git://github.com/lipp/lua-websockets.git
$ cd lua-websockets
$ luarocks make rockspecs/lua-websockets-scm-1.rockspec

A squishy file for squish is provided. Creating the minified version (~10k) can be created with:

Terminal window
$ squish --gzip

The minifed version has be to be installed manually though.

Running tests requires:

Terminal window
docker build .

The first run will take A WHILE.