Not implemented
No server-to-client invocation
No server-to-client invocation
The
Server type has OnInvoke but no Invoke; the Client type has Invoke but no
OnInvoke. The server’s dispatcher only handles requests and the client’s only handles
responses, so round trips run from client to server only.The workaround is two events. See Invocations, which is also
the safer design, since a server thread parked on a client’s response is a thread an exploiter
can hold open.No unified constructor
No unified constructor
Flux.Server and Flux.Client each error in the wrong context, and there is no
auto-detecting factory. The internal Bridge module is the batching layer, not an environment
selector, and it is not re-exported.The workaround is to branch on RunService:IsServer(). See
Shared Modules.No automatic connection cleanup
No automatic connection cleanup
Listeners live in module-level tables keyed by event name. Nothing observes script lifetime,
Destroying or AncestryChanged. A listener registered by a destroyed LocalScript stays
registered for the session, keeps firing, and keeps its upvalues alive.The workaround is to disconnect explicitly. See
Connections.No circular table support
No circular table support
WriteAny recurses into tables with no visited-set and no depth limit, so a self-referencing
table overflows the Luau stack.The workaround is to break cycles, or send an id and rebuild on the receiver.No middleware, rate limiting or validation hooks
No middleware, rate limiting or validation hooks
There is no interception point between the wire and your listener, so every payload reaches
your callback exactly as decoded.The workaround is to validate at the top of each server listener, and rate-limit per player
yourself.
Fixed constants
None of these are configurable through the public API.Silent failure modes
These are the ones most likely to cost you an afternoon.Ordering and timing
Name collisions
All state is keyed by event name in module-level tables, so two systems that pick the same name silently share traffic, andOnInvoke assigned twice on one name replaces rather than adds.
Payload size
large payloads split by the engine
Flux_Reliable follows normal RemoteEvent behaviour. Very large batches cost bandwidth and
decode time but are not dropped.hard engine limit
UnreliableRemoteEvent caps its payload. Because Flux batches, the cap applies to the whole
accumulated frame rather than to your individual call, so many unreliable sends in one frame can
collectively exceed it even when each is small.Security
Studio and environment
required
Flux’s internal modules require each other by relative path, as in
@self/Utils/Types and
./Utils/Buffers. This has to be available in your environment.required
The client resolves remotes with
WaitForChild, so if no server code calls Flux.Server(...),
every client hangs indefinitely. Requiring the root module is not enough, because the transport
initialises lazily on the first constructor call.Next steps
Migrating
Coming from raw remotes or a Warp-style API.
Supported types
What survives the wire.
