{"id":"voxovistired/network","name":"network","scope":"voxovistired","platform":"roblox","description":"Single-remote multiplexed networking for Roblox with built-in compression, validation, and rate limiting.","version":"1.2.1","latest":"1.2.1","versions":["1.0.0","1.1.0","1.2.0","1.2.1"],"license":"MIT","licenseRating":"safe","licenseCaveats":[],"licenseVerified":true,"dependencies":{},"integrity":"59efe3fcdb68ce63aa04db209808b30c55ff9e5bde2d0154db7adc5ced8d4ddd","likes":0,"downloads":0,"install":"forest install voxovistired/network","url":"https://forest.dev/p/roblox/voxovistired/network","files":"https://api.forest.dev/ai/package/roblox/voxovistired/network/files","readme":"# RoNetwork\r\n\r\nSingle-remote multiplexed networking for Roblox with built-in compression, schema validation, and token-bucket rate limiting.\r\n\r\n## Features\r\n\r\n- **Single-remote multiplexing** — all communication routes through one RemoteEvent, RemoteFunction, UnreliableRemoteEvent, and BindableEvent\r\n- **Argument compression** — automatic serialization/deserialization via buffer-based compression\r\n- **Schema validation** — validate incoming arguments on the server with type-checked schemas\r\n- **Rate limiting** — built-in token-bucket rate limiting per connection\r\n- **Connection registry** — frequently used connection names are encoded as numeric IDs to save bandwidth\r\n- **Clean API** — `Network.Server` and `Network.Client` with intuitive methods like `:On`, `:Fire`, `:Invoke`, and `:Dispatch`\r\n- **Backward compatible** — legacy API (`SetConnection`, `FireClientConnection`, etc.) is fully preserved\r\n\r\n## Installation\r\n\r\n### Wally\r\n\r\nAdd to your `wally.toml`:\r\n\r\n```toml\r\n[dependencies]\r\nnetwork = \"voxovistired/network@1.2.0\"\r\n```\r\n\r\n## Usage\r\n\r\n### Server\r\n\r\n```lua\r\nlocal Network = require(path.to.Network)\r\n\r\n-- Listen for a remote event\r\nNetwork.Server:On(\"GetInventory\", function(player, itemId)\r\n    return getInventory(player)\r\nend, {\r\n    type = \"REMOTE_FUNCTION\",\r\n    schema = { { name = \"itemId\", type = \"string\" } },\r\n    rateLimit = { maxTokens = 10, fillRate = 2 },\r\n})\r\n\r\n-- Fire to a single player\r\nNetwork.Server:Fire(player, \"UpdateHUD\", hudData)\r\n\r\n-- Fire to all players\r\nNetwork.Server:FireAll(\"Announcement\", message)\r\n\r\n-- Fire unreliable (e.g. position sync)\r\nNetwork.Server:FireUnreliable(player, \"PositionUpdate\", pos)\r\n\r\n-- Invoke a client and wait for response\r\nlocal result = Network.Server:Invoke(player, \"ClientCalculation\", data)\r\n\r\n-- Server-to-server communication via BindableEvent\r\nNetwork.Server:Dispatch(\"InternalEvent\", data)\r\n\r\n-- Remove a connection\r\nNetwork.Server:Off(\"GetInventory\", \"REMOTE_FUNCTION\")\r\n```\r\n\r\n### Client\r\n\r\n```lua\r\nlocal Network = require(path.to.Network)\r\n\r\n-- Listen for a remote event from the server\r\nNetwork.Client:On(\"UpdateHUD\", function(hudData)\r\n    updateUI(hudData)\r\nend)\r\n\r\n-- Fire to the server\r\nNetwork.Client:Fire(\"RequestItem\", itemId)\r\n\r\n-- Invoke the server and wait for response\r\nlocal inventory = Network.Client:Invoke(\"GetInventory\")\r\n\r\n-- Client-to-client communication via BindableEvent\r\nNetwork.Client:Dispatch(\"UIEvent\", data)\r\n\r\n-- Remove a connection\r\nNetwork.Client:Off(\"UpdateHUD\")\r\n```\r\n\r\n### Signals\r\n\r\nOne-shot signals that auto-remove after firing:\r\n\r\n```lua\r\n-- Server: wait for a signal\r\nlocal signal = Network.Server:Signal(\"PlayerReady\")\r\nlocal args = signal.Wait()\r\n\r\n-- Client: fire the signal\r\nNetwork.Client:FireSignal(\"PlayerReady\", data)\r\n```\r\n\r\n## API Reference\r\n\r\n### `Network.Server`\r\n\r\n| Method | Description |\r\n|---|---|\r\n| `:On(name, callback, options?)` | Register a connection. Options: `{ type?, schema?, rateLimit? }` |\r\n| `:Off(name, type?)` | Remove a connection. Defaults to `REMOTE_EVENT` |\r\n| `:Fire(player, name, ...)` | Fire a RemoteEvent to one player |\r\n| `:FireAll(name, ...)` | Fire a RemoteEvent to all players |\r\n| `:FireUnreliable(player, name, ...)` | Fire an UnreliableRemoteEvent to one player |\r\n| `:FireAllUnreliable(name, ...)` | Fire an UnreliableRemoteEvent to all players |\r\n| `:Invoke(player, name, ...)` | Invoke a RemoteFunction on a client (with timeout) |\r\n| `:Dispatch(name, ...)` | Fire a BindableEvent (server-to-server) |\r\n| `:Signal(name)` | Create a one-shot signal |\r\n| `:FireSignal(name, player, ...)` | Fire a signal to a player |\r\n| `:GetRemote(type)` | Get the underlying remote instance |\r\n\r\n### `Network.Client`\r\n\r\n| Method | Description |\r\n|---|---|\r\n| `:On(name, callback, options?)` | Register a connection. Options: `{ type? }` |\r\n| `:Off(name, type?)` | Remove a connection. Defaults to `REMOTE_EVENT` |\r\n| `:Fire(name, ...)` | Fire a RemoteEvent to the server |\r\n| `:FireUnreliable(name, ...)` | Fire an UnreliableRemoteEvent to the server |\r\n| `:Invoke(name, ...)` | Invoke a RemoteFunction on the server (with timeout) |\r\n| `:Dispatch(name, ...)` | Fire a BindableEvent (client-to-client) |\r\n| `:Signal(name)` | Create a one-shot signal |\r\n| `:FireSignal(name, ...)` | Fire a signal to the server |\r\n| `:GetRemote(type)` | Get the underlying remote instance |\r\n\r\n### Connection Types\r\n\r\n| Type | Remote |\r\n|---|---|\r\n| `REMOTE_EVENT` | RemoteEvent |\r\n| `REMOTE_FUNCTION` | RemoteFunction |\r\n| `UREMOTE_EVENT` | UnreliableRemoteEvent |\r\n| `BINDABLE_EVENT` | BindableEvent |\r\n\r\n### Rate Limit Config\r\n\r\n```lua\r\n{\r\n    maxTokens = 10,  -- max tokens in bucket\r\n    fillRate = 2,    -- tokens added per second\r\n    consume = 1,     -- tokens consumed per request\r\n}\r\n```\r\n\r\n### Schema Validation\r\n\r\n```lua\r\n{\r\n    { name = \"itemId\", type = \"string\", constraints = { maxLength = 50 } },\r\n    { name = \"count\", type = \"number\", constraints = { min = 1, max = 100, integer = true } },\r\n}\r\n```\r\n\r\nSupported types: `string`, `number`, `boolean`, `Vector3`, `Vector2`, `Vector3int16`, `Vector2int16`, `CFrame`, `Color3`, `UDim2`, `Instance`, `table`.\r\n\r\n## Contributing\r\n\r\nContributions are welcome. Please ensure your code passes linting and formatting before submitting a PR:\r\n\r\n```bash\r\nselene ./src\r\nstylua ./src\r\n```\r\n","readmeTruncated":false}