Skip to content

server ​

Obsidian Engine: Server Module High-level server abstraction built on top of network.lua Greatly simplifies building dedicated servers with Obsidian. Injected by the bundler / init.lua loader; see src/init.lua.

Types ​

NetworkPacket ​

Network packet structure

FieldTypeDescription
typestringMessage type identifier
datatableArbitrary message data payload
sendernumberComputer ID of the sender
timestampnumberEpoch time in milliseconds when the packet was sent

ServerProfile ​

Server profile object structure

FieldTypeDescription
cidnumberClient ID
namestringPlayer name
passwordHashstringDJB2 hash of the player's password (stored but never sent to clients)
classstring|nilOptional player class/type for game-specific logic

ServerModule ​

This module provides a high-level server abstraction built on top of network.lua, making it easy to build dedicated servers with Obsidian. It includes client management, message handling, rooms, a built-in auth system, and an optional server console for logging and monitoring.

AuthOptions ​

Auth config structure

FieldTypeDescription
minNameLen (optional)numberMinimum allowed username length (default 3)
maxNameLen (optional)numberMaximum allowed username length (default 16)
onLogin (optional)fun(clientId: number, profile: ServerProfile)Optional callback fired after successful login
onRegister (optional)fun(clientId: number, profile: ServerProfile)Optional callback fired after successful registration
onLogout (optional)fun(clientId: number, profile: ServerProfile)Optional callback fired after logout
buildProfile (optional)fun(clientId: number, data: table): tableOptional function to build a complete profile on registration. Receives the client ID and original registration data, should return a table of additional profile fields to merge into the stored profile (e.g. starting stats or inventory).

Methods ​

server.showConsole(title) ​

Enable the server console. Call before server.run().

  • title (string, optional) Optional title string shown in the header.

server.log(text, level) ​

Write a line to the server console.

  • text (any) Message to log.
  • level ("info"|"warn"|"error"|"success"|"system"|"debug", optional)

server.getClients() ​

Returns all currently connected client IDs as a list.

  • returns list (number[]) List of connected client IDs

server.clientCount() ​

Returns the number of connected clients.

  • returns count (number) Count of connected clients

server.isConnected(clientId) ​

Returns true if the given client ID is connected.

  • clientId (number) Client ID to check

  • returns isConnected (boolean) True if the client is currently connected, false otherwise

server.setMeta(clientId, key, value) ​

Store arbitrary key/value metadata on a connected client.

  • clientId (number) Client ID of the client
  • key (string) Metadata key
  • value (any) Metadata value

server.getMeta(clientId, key) ​

Retrieve metadata from a connected client. Returns nil if not found.

  • clientId (number) Client ID of the client

  • key (string) Metadata key

  • returns data (any|nil) Metadata value or nil if not found

server.kick(clientId, reason) ​

Kick a client from the server with an optional reason string.

  • clientId (number) Client ID to kick
  • reason (string, optional) Optional reason for the kick, sent to the client before disconnecting

server.joinRoom(clientId, roomName) ​

Add a client to a named room (creates it if it doesn't exist).

  • clientId (number) Client ID to add to the room
  • roomName (string) Name of the room to join

server.leaveRoom(clientId, roomName) ​

Remove a client from a named room.

  • clientId (number) Client ID to remove from the room
  • roomName (string) Name of the room to leave

server.getRoomClients(roomName) ​

Returns a list of client IDs currently in the given room.

  • roomName (string) Name of the room to query

  • returns list (number[]) List of client IDs in the room, or empty list if room doesn't exist

server.getClientRooms(clientId) ​

Returns a list of room names the given client is a member of.

  • clientId (number) Client ID to query

  • returns list (string[]) List of room names the client is a member of

server.send(clientId, msgType, data) ​

Send a typed message to a specific client.

  • clientId (number) Client ID of the recipient

  • msgType (string) Message type identifier

  • data (table, optional) Optional message data payload

  • returns success (boolean) True if the message was sent successfully, false if the client is not connected or network is closed

server.broadcast(msgType, data, exceptId) ​

Broadcast a typed message to all connected clients.

  • msgType (string) Message type identifier
  • data (table, optional) Optional message data payload
  • exceptId (number, optional) Optional client ID to skip

server.broadcastRoom(roomName, msgType, data, exceptId) ​

Broadcast a message to all clients in a specific room.

  • roomName (string) Name of the room to broadcast to
  • msgType (string) Message type identifier
  • data (table, optional) Optional message data payload
  • exceptId (number, optional) Optional client ID to skip

server.on(msgType, fn) ​

Register a handler for a specific message type.

  • msgType (string) Message type identifier
  • fn (fun(clientId: number, data: table, packet: NetworkPacket)) Handler function that processes incoming messages of the specified type. Receives the client ID, message data, and the full packet as arguments.

server.off(msgType) ​

Remove a message type handler.

  • msgType (string) Message type identifier

server.use(fn) ​

Add middleware that runs before every message handler.

  • fn (fun(clientId: number, packet: NetworkPacket, next: function)) Middleware function that runs before message handlers. Receives the client ID, full packet, and a next function to call to continue processing. Middleware can modify the packet or perform actions before or after calling next().

server.onConnect(fn) ​

Called when a new client connects. fn(clientId)

  • fn (fun(clientId: number)) Callback function that is called when a new client connects. Receives the client ID as an argument.

server.onDisconnect(fn) ​

Called when a client disconnects. fn(clientId)

  • fn (fun(clientId: number)) Callback function that is called when a client disconnects. Receives the client ID as an argument.

server.enableAuth(db, opts) ​

Enable the built-in auth system.

  • db (Collection) An Obsidian DB collection
  • opts (AuthOptions, optional) Optional configuration for the auth system (e.g. password requirements)

server.onTick(fn) ​

Register a callback to be called every server tick. fn(dt)

  • fn (fun(dt: number)) Callback function that is called every server tick. Receives the delta time in seconds since the last tick as an argument.

server.setTickRate(n) ​

Set the server tick rate (ticks per second, default 20).

  • n (number) Desired tick rate (ticks per second). Must be a positive number; values less than 1 will be treated as 1.

server.setTimeout(seconds) ​

Set the client timeout in seconds (0 to disable). Default 30.

  • seconds (number) Desired timeout in seconds. Set to 0 to disable.

server.setHeartbeatInterval(seconds) ​

Set the heartbeat interval in seconds (0 to disable). Default 5.

  • seconds (number) Desired heartbeat interval in seconds. Set to 0 to disable automatic heartbeats.

server.enableSequencing() ​

Enable per-client message sequence numbers.

server.getPing(clientId) ​

Returns the last measured ping (ms) for a client, or nil if unknown.

  • clientId (number) Client ID to query

  • returns ping (number|nil) Last measured ping in milliseconds, or nil if no heartbeat response received yet

server.sendToList(idList, msgType, data) ​

Send a typed message to a list of specific client IDs.

  • idList (number[]) List of client IDs to send the message to
  • msgType (string) Message type identifier
  • data (table, optional) Optional message data payload

server.init(protocol, hostname, side) ​

Initialise the server: open modem, host protocol.

  • protocol (string) Protocol name to host (must match what clients connect to)

  • hostname (string) Human-readable server name (used for discovery, can be same as protocol)

  • side (string, optional) Optional modem side to use (e.g. "back"); if not specified, will use the first available modem

  • returns success (boolean) True if the server was successfully initialized, false if there was an error (e.g. no modem found or failed to host protocol)

server.stop() ​

Shut down the server, kick all clients, and close the modem.

server.processEvent(rawEvent) ​

Process a single raw OS event. Called by server.run() internally or by the Engine event loop for non-blocking integrated use.

  • rawEvent (table) The raw event table as returned by os.pullEventRaw()

server.start() ​

Start the server without blocking. Events must be fed via server.processEvent() or by calling server.run(). Returns false if server.init() was not called first.

  • returns success (boolean) True if the server started successfully, false if server.init() was not called

server.run() ​

Run the server loop (blocking, for dedicated server computers). Equivalent to server.start() followed by a manual os.pullEventRaw() loop.

Last updated:

Released under the MIT License.