{"id":"gamingguy84/notwork","name":"notwork","scope":"gamingguy84","platform":"roblox","description":"lightweight Roblox networking library that adds type safety, schema validation, and compact binary serialization to RemoteEvents.","version":"0.1.9","latest":"0.1.9","versions":["0.1.1","0.1.2","0.1.5","0.1.6","0.1.8","0.1.9"],"license":"MIT","licenseRating":"safe","licenseCaveats":[],"licenseVerified":true,"dependencies":{},"integrity":"c10c2ca7b56ee0739829130f4271f779e0560824b0bfcb2df057f80bc147736d","likes":0,"downloads":0,"install":"forest install gamingguy84/notwork","url":"https://forest.dev/p/roblox/gamingguy84/notwork","files":"https://api.forest.dev/ai/package/roblox/gamingguy84/notwork/files","readme":"# Notwork\r\n\r\nNotwork is a lightweight Roblox networking library that adds type safety, schema validation, and compact binary serialization to RemoteEvents, without changing how you use them.\r\n\r\n---\r\n\r\n## Features\r\n\r\n- Strongly typed remote events\r\n- Schema-based data validation\r\n- Automatic serialization via buffers\r\n- Smaller payloads compared to raw tables\r\n- Shared definitions between client and server\r\n- Simple event-driven API\r\n- Support for Roblox types (Vector3, CFrame, etc.)\r\n\r\n---\r\n\r\n## Installation\r\n\r\nPlace `Notwork` in a shared location (e.g. `ReplicatedStorage`) and require it on both client and server.\r\n\r\nShared Packet Definition\r\n```lua\r\nlocal Notwork = require(path.to.Notwork)\r\n\r\nlocal Packets = {}\r\n\r\n--Define a packet once and use it on both client and server.\r\nPackets.Packet = Notwork.DefinePacket({\r\n    Foo = Notwork.string,\r\n    Foo2 = Notwork.vector3\r\n})\r\n\r\nreturn Packets\r\n```\r\n\r\nServer Example\r\n```lua\r\nlocal Packets = require(path.to.SharedPackets)\r\n\r\nlocal Packet = Packets.Packet\r\n\r\nPacket.OnClientEvent:Connect(function(player, data)\r\n    print(\"Received from client:\", data)\r\n\r\n    Packet:FireAllClients({\r\n        Foo = \"Hello from the Server!\",\r\n        Foo2 = Vector3.new(0, -5, 25)\r\n    })\r\nend)\r\n```\r\n\r\nClient Example\r\n```lua\r\nlocal Packets = require(path.to.SharedPackets)\r\n\r\nlocal Packet = Packets.Packet\r\n\r\nPacket.OnServerEvent:Connect(function(data)\r\n    print(\"Received from server:\", data)\r\nend)\r\n\r\nPacket:FireServer({\r\n    Foo = \"Hello from the Client!\",\r\n    Foo2 = Vector3.new(0, 5, 0)\r\n})\r\n```\r\n\r\n---\r\n\r\n## API\r\n\r\n### Packet Constructors\r\n```lua\r\nlocal Notwork = require(path.to.Notwork)\r\n\r\n-- Reliable (guaranteed delivery)\r\nNotwork.DefinePacket(schema: {[string]: Notwork.DataType}) -> Packet\r\n\r\n-- Unreliable (may drop, lower overhead)\r\nNotwork.DefineUnreliablePacket(schema: {[string]: Notwork.DataType}) -> Packet\r\n\r\n--Example:\r\nlocal ReliablePacket = Notwork.DefinePacket({\r\n    Foo = Notwork.string,\r\n    Foo2 = Notwork.vector3\r\n})\r\n\r\nlocal UnreliablePacket = Notwork.DefineUnreliablePacket({\r\n    Foo = Notwork.string,\r\n    Foo2 = Notwork.vector3\r\n})\r\n```\r\n\r\n### Packet Methods\r\n```lua\r\nlocal Packet = require(path.to.SharedPackets).Packet\r\n\r\n-- Data has type annotations with intellisense, allowing you to see data types based on the packet.\r\n\r\n-- Can only be called from the client\r\nPacket:FireServer(Data: {[string]: any})\r\n\r\n-- Can only be called from the server\r\nPacket:FireClient(Player: Player, Data : {[string]: any})\r\nPacket:FireAllClients(Data : {[string]: any})\r\n```\r\n\r\n### Packet Events\r\n\r\n```lua\r\nlocal Packet = require(path.to.SharedPackets).Packet\r\n\r\n-- Can only be listened to on the server\r\nPacket.OnServerEvent:Connect(function(Player: Player, Data: {[string]: any})\r\n\r\n-- Can only be listened to on the client\r\nPacket.OnClientEvent:Connect(function(Data: {[string]: any})\r\n\r\n```\r\n---\r\n\r\n## Reliable vs Unreliable\r\n\r\nSimilar to Roblox's RemoteEvents, reliable and unreliable events both have the purpose of networking, but do it in slightly different ways.\r\n\r\nReliable (`DefinePacket`)\r\n- Guaranteed delivery\r\n- Used for gameplay-critical data\r\n\r\nUnreliable (`DefineUnreliablePacket`)\r\n- May drop packets\r\n- Lower latency / overhead\r\n- Used for frequent updates (e.g positions, effects)\r\n\r\n---\r\n\r\n## How It Works\r\n\r\nNotwork serializes structured Lua tables into compact binary buffers before sending them over Roblox RemoteEvents.\r\n\r\nThis provides:\r\n\r\n- Reduced network payload size\r\n\r\n- Faster replication of structured data\r\n\r\n- Strict schema validation\r\n\r\n- Consistent type handling between client and server\r\n\r\nInstead of sending raw tables, data is encoded into a compact buffer format and decoded on the receiving side using the shared schema.\r\n\r\n---\r\n\r\n## Why Not Just Use RemoteEvents?\r\n\r\nRemoteEvents are:\r\n- Untyped\r\n- Unvalidated\r\n- Inefficient for structured data\r\n\r\nThis leads to:\r\n- Silent bugs\r\n- Inconsistent data formats\r\n- Larger network costs\r\n\r\nNotwork solves all three without changing your workflow.\r\n\r\n---\r\n\r\n## Supported Types\r\n`Notwork.string`\r\n\r\n`Notwork.number`\r\n\r\n`Notwork.any`\r\n\r\n`Notwork.bool`\r\n\r\n`Notwork.f32`\r\n\r\n`Notwork.f64`\r\n\r\n`Notwork.i8`\r\n\r\n`Notwork.i16`\r\n\r\n`Notwork.i32`\r\n\r\n`Notwork.u16`\r\n\r\n`Notwork.u32`\r\n\r\n`Notwork.instance`\r\n\r\n`Notwork.vector2`\r\n\r\n`Notwork.vector2int16`\r\n\r\n`Notwork.vector3`\r\n\r\n`Notwork.vector3int16`\r\n\r\n`Notwork.udim`\r\n\r\n`Notwork.udim2`\r\n\r\n`Notwork.cframe`\r\n\r\n`Notwork.array`\r\n\r\n`Notwork.dict`\r\n\r\n---\r\n\r\n## Limitations\r\n\r\n- Packets must be defined ahead of time\r\n  \r\n- Not intended for dynamic runtime packet creation\r\n\r\n- Does NOT have any Disconnect options for Packets\r\n","readmeTruncated":false}