Skip to main content

Limits & Constraints

The binary protocol that makes Loren fast also imposes a few hard ceilings. None are configurable at runtime — design around them.

Hard limits

LimitValueSourceWhat happens if exceeded
Requests per second, per player50RATE_LIMITFurther requests that second are dropped; server warns once.
Arguments per call20MAX_ARGUMENTSThe request is silently dropped before your method runs.
Services per game255u8 service idThe 256th service cannot be addressed over the network.
Client methods per service255u8 method idExtra client methods are unreachable.
Signals per service255u8 signal idExtra signals are unreachable.
In-flight request IDs65535u16 request idIDs wrap around 1..65535; only matters with tens of thousands of unresolved calls at once.
Call timeout10 sclient task.delayThe Promise rejects with "(LORENঌ) Timeout".

Why these exist

The packet header encodes IDs and the argument count in single bytes (u8, max 255) and the request id in two bytes (u16, max 65535). Keeping the header tiny is what lets Loren run every call through one RemoteEvent cheaply.

Practical guidance

  • Batch arguments into a table if you are anywhere near 20. One table counts as one argument.
  • Group related methods under fewer services rather than spreading hundreds of micro-services.
  • Expect rejection on the client. A call can fail from a timeout, a rate-limit drop, an argument-cap drop, or a middleware denial — always attach a :catch.
self.Dependencies.DataService:Get("coins")
:andThen(function(value) -- ... end)
:catch(function(err)
warn("request failed:", err)
end)