From b425db5f0bfaa05bc30f1fe90ee04ac532542277 Mon Sep 17 00:00:00 2001 From: Khietsly Tristan Date: Wed, 22 Apr 2026 08:40:17 +0700 Subject: [PATCH 1/4] chore: fix client & server processing for invoke --- src/Client/init.luau | 95 +++++++++++++++++----------------- src/Replication/init.luau | 5 +- src/Server/init.luau | 104 ++++++++++++++++++++------------------ 3 files changed, 102 insertions(+), 102 deletions(-) diff --git a/src/Client/init.luau b/src/Client/init.luau index 01e9c8d..8d63f50 100644 --- a/src/Client/init.luau +++ b/src/Client/init.luau @@ -3,10 +3,12 @@ --@EternityDev local Client = {} -local RunService = game:GetService("RunService") local Thread = require("./Util/Thread") local Buffer = require("./Util/Buffer") local Replication = require("./Replication") +local Xor = require("./Util/Xor") + +local RunService = game:GetService("RunService") local Event: RemoteEvent = script.Parent:WaitForChild("Event") local UnreliableEvent: UnreliableRemoteEvent = script.Parent:WaitForChild("UnreliableEvent") local deltaT: number, cycle: number = 0, 1 / 61 @@ -23,9 +25,10 @@ type Event = { local queueEvent: { { any } } = {} local queueUnreliableEvent: { { any } } = {} -local eventListeners: { Event } = {} +local eventListeners: { [number]: { Event } } = {} local eventSchemas: { [number]: Buffer.SchemaType } = {} +local lastDelta: { [number]: { any } } = {} local pendingInvokes: { [string]: thread } = {} local invokeId = 0 @@ -52,13 +55,21 @@ Client.Connect = function(remoteName: string, fn: (Player, ...any?) -> ...any?): local id = Replication.get_id[remoteName] if not id then warn(`[Warp]: ".Connect"::"{remoteName}" does not exist, likely its not registered on the server yet.`) - return { Connected = false, Disconnect = function() return end } :: Connection + return { + Connected = false, + Disconnect = function() + return + end, + } :: Connection end local detail = { i = id, c = fn, } - table.insert(eventListeners, detail) + if not eventListeners[id] then + eventListeners[id] = {} + end + table.insert(eventListeners[id], detail) return { Connected = true, Disconnect = function(self: Connection) @@ -66,9 +77,12 @@ Client.Connect = function(remoteName: string, fn: (Player, ...any?) -> ...any?): return end self.Connected = false - local idx = table.find(eventListeners, detail) - if idx then - table.remove(eventListeners, idx) + local bucket = eventListeners[detail.i] + if bucket then + local idx = table.find(bucket, detail) + if idx then + table.remove(bucket, idx) + end end end, } :: Connection @@ -105,11 +119,7 @@ Client.DisconnectAll = function(remoteName: string) if not id then return end - for idx = #eventListeners, 1, -1 do - if eventListeners[idx].i == id then - table.remove(eventListeners, idx) - end - end + eventListeners[id] = nil end --@remoteName string @@ -158,17 +168,16 @@ end if RunService:IsClient() then local function processIncoming(b: buffer, ref: { Instance }?, handleInvokes: boolean) - if type(b) ~= "buffer" then - return - end - local contents = Buffer.readEvents(b, ref, eventSchemas) + if type(b) ~= "buffer" then return end + local decoded: buffer = handleInvokes and Xor.decodeClient(b) or b + local contents = Buffer.readEvents(decoded, ref, eventSchemas) for _, content in contents do local remote = content[1] - local content = content[2] + local args = content[2] if handleInvokes then if remote == 0 then - local id = content[1] - local results = content[2] + local id = args[1] + local results = args[2] local pending = pendingInvokes[id] if pending then task.spawn(pending :: any, table.unpack(results)) @@ -177,35 +186,22 @@ if RunService:IsClient() then continue end if remote == 1 then - if #eventListeners == 0 then - continue - end - local remoteName = content[1] - local id = content[2] - local args = content[3] - for _, connection in eventListeners do - if connection.i == remoteName then - Thread(function() - local results = { connection.c(table.unpack(args)) } - table.insert(queueEvent, { - 1, - { id, results } :: any, - }) - end) - break - end + local remoteName, id, rargs = args[1], args[2], args[3] + local connections = eventListeners[remoteName] + if connections and #connections > 0 then + Thread(function() + local results = { connections[1].c(table.unpack(rargs)) } + table.insert(queueEvent, { 1, { id, results } :: any }) + end) end continue end end - if #eventListeners == 0 then - continue - end - for _, connection in eventListeners do - if connection.i ~= remote then - continue + local connections = eventListeners[remote] + if connections then + for _, connection in connections do + Thread(connection.c, table.unpack(args)) end - Thread(connection.c, table.unpack(content)) end end end @@ -220,21 +216,20 @@ if RunService:IsClient() then RunService.PostSimulation:Connect(function(d: number) deltaT += d - if deltaT < cycle then - return - end + if deltaT < cycle then return end deltaT = 0 - - -- reliable + + --reliable if #queueEvent > 0 then Buffer.writeEvents(writer, queueEvent, eventSchemas) do local buf, ref = Buffer.buildWithRefs(writer) + local encoded = Xor.encodeClient(buf) Buffer.reset(writer) if not ref or #ref == 0 then - Event:FireServer(buf) + Event:FireServer(encoded) else - Event:FireServer(buf, ref) + Event:FireServer(encoded, ref) end end table.clear(queueEvent) diff --git a/src/Replication/init.luau b/src/Replication/init.luau index 224c501..930e941 100644 --- a/src/Replication/init.luau +++ b/src/Replication/init.luau @@ -14,7 +14,7 @@ local warp_identifier_registry = shared.__warp_identifier_registry if RunService:IsClient() or RunService:IsRunMode() then local pending_id_yields, pending_name_yields, ready_yields = {}, {}, {} local is_ready = false - + if RunService:IsClient() then _repl.OnClientEvent:Connect(function(b: buffer) if type(b) ~= "buffer" then @@ -26,7 +26,7 @@ if RunService:IsClient() or RunService:IsRunMode() then local id: number, remote: string = content[1], content[2] warp_identifier_registry.cache[remote] = id warp_identifier_registry.name[id] = remote - + if pending_id_yields[remote] then for _, thread in pending_id_yields[remote] do task.spawn(thread, id) @@ -55,7 +55,6 @@ if RunService:IsClient() or RunService:IsRunMode() then -- wait for the identifiers to be replicated from the server Replication.wait_for_ready = function() if is_ready then return end - local thread = coroutine.running() table.insert(ready_yields, thread) coroutine.yield() diff --git a/src/Server/init.luau b/src/Server/init.luau index c3effd3..5af7b8b 100644 --- a/src/Server/init.luau +++ b/src/Server/init.luau @@ -3,12 +3,14 @@ --@EternityDev local Server = {} -local Players = game:GetService("Players") -local RunService = game:GetService("RunService") local Thread = require("./Util/Thread") local Buffer = require("./Util/Buffer") local Identifier = require("./Util/Identifier") local Replication = require("./Replication") +local Xor = require("./Util/Xor") + +local Players = game:GetService("Players") +local RunService = game:GetService("RunService") local Event: RemoteEvent = script.Parent:WaitForChild("Event") local _repl: RemoteEvent = script.Parent:WaitForChild("_repl") local UnreliableEvent: UnreliableRemoteEvent = script.Parent:WaitForChild("UnreliableEvent") @@ -30,7 +32,7 @@ local queueEvent: { local queueUnreliableEvent: { [Player]: { { any } }, } = {} -local eventListeners: { Event } = {} +local eventListeners: { [number]: { Event } } = {} local eventSchemas: { [number]: Buffer.SchemaType } = {} local players_ready: { Player }, player_bytes: { [Player]: number } = {}, {} @@ -61,7 +63,10 @@ Server.Connect = function(remoteName: string, fn: (Player, ...any?) -> ...any?): i = Identifier.get_id(remoteName), c = fn, } - table.insert(eventListeners, detail) + if not eventListeners[detail.i] then + eventListeners[detail.i] = {} + end + table.insert(eventListeners[detail.i], detail) return { Connected = true, Disconnect = function(self: Connection) @@ -69,9 +74,12 @@ Server.Connect = function(remoteName: string, fn: (Player, ...any?) -> ...any?): return end self.Connected = false - local idx = table.find(eventListeners, detail) - if idx then - table.remove(eventListeners, idx) + local bucket = eventListeners[detail.i] + if bucket then + local idx = table.find(bucket, detail) + if idx then + table.remove(bucket, idx) + end end end, } :: Connection @@ -108,11 +116,7 @@ Server.DisconnectAll = function(remoteName: string) if not id then return end - for idx = #eventListeners, 1, -1 do - if eventListeners[idx].i == id then - table.remove(eventListeners, idx) - end - end + eventListeners[id] = nil end --@remoteName string @@ -149,7 +153,9 @@ end -- Fire an event to all players except specified ones. Server.FireExcept = function(remoteName: string, reliable: boolean, except: { Player }, ...: any?) for _, player: Player in players_ready do - if table.find(except, player) then continue end + if table.find(except, player) then + continue + end Server.Fire(remoteName, reliable, player, ...) end end @@ -188,18 +194,21 @@ if RunService:IsServer() then end if not RunService:IsStudio() then local bytes: number = (player_bytes[player] or 0) + math.max(buffer.len(b), 800) - if bytes > 8e3 then return end + if bytes > 8e3 then + return + end player_bytes[player] = bytes end - local contents = Buffer.readEvents(b, ref, eventSchemas) + local decoded = handleInvokes and Xor.decodeServer(player, b) or b + local contents = Buffer.readEvents(decoded, ref, eventSchemas) for _, content in contents do local remote = content[1] - local content = content[2] + local d = content[2] if handleInvokes then if remote == 1 then - local id = content[1] - local results = content[2] + local id = d[1] + local results = d[2] local pending = pendingInvokes[id] if pending then task.spawn(pending :: any, table.unpack(results)) @@ -208,38 +217,33 @@ if RunService:IsServer() then continue end if remote == 0 then - if #eventListeners == 0 then + if not next(eventListeners) then continue end - local remoteName = content[1] - local id = content[2] - local args = content[3] - for _, connection in eventListeners do - if connection.i == remoteName then - Thread(function() - local results = { connection.c(player, table.unpack(args)) } - if not queueEvent[player] then - queueEvent[player] = {} :: any - end - table.insert(queueEvent[player], { - 0, - { id, results } :: any, - }) - end) - break - end + local remoteName = d[1] + local id = d[2] + local args = d[3] + local connections = eventListeners[remoteName] + if connections and #connections > 0 then + Thread(function() + local results = { connections[1].c(player, table.unpack(args)) } + if not queueEvent[player] then + queueEvent[player] = {} :: any + end + table.insert(queueEvent[player], { + 0, + { id, results } :: any, + }) + end) end continue end end - if #eventListeners == 0 then - continue - end - for _, connection in eventListeners do - if connection.i ~= remote then - continue + local connections = eventListeners[remote] + if connections then + for _, connection in connections do + Thread(connection.c, player, table.unpack(d)) end - Thread(connection.c, player, table.unpack(content)) end end end @@ -267,11 +271,12 @@ if RunService:IsServer() then Buffer.writeEvents(writer, content, eventSchemas) do local buf, ref = Buffer.buildWithRefs(writer) + local encoded = Xor.encodeServer(player, buf) Buffer.reset(writer) if not ref or #ref == 0 then - Event:FireClient(player, buf) + Event:FireClient(player, encoded) else - Event:FireClient(player, buf, ref) + Event:FireClient(player, encoded, ref) end end player_bytes[player] = 0 @@ -292,7 +297,7 @@ if RunService:IsServer() then UnreliableEvent:FireClient(player, buf, ref) end end - table.clear(player_bytes) + player_bytes[player] = 0 table.clear(queueUnreliableEvent[player]) end end) @@ -323,6 +328,7 @@ if RunService:IsServer() then table.clear(queueUnreliableEvent[player]) queueUnreliableEvent[player] = nil end + Xor.remove(player) end) for _, player: Player in ipairs(Players:GetPlayers()) do onAdded(player) @@ -330,9 +336,9 @@ if RunService:IsServer() then end --[[ - @class Server - @schema - define a schema for your data and use a strict packing + @class Server + @schema + define a schema for your data and use a strict packing ]] Server.Schema = Buffer.Schema From 36137ea9406ba3edec0cf9fd95197dc77ff8271e Mon Sep 17 00:00:00 2001 From: Khietsly Tristan Date: Wed, 22 Apr 2026 08:49:30 +0700 Subject: [PATCH 2/4] chore(server): dont pass identifier id for invoke client --- src/Server/init.luau | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Server/init.luau b/src/Server/init.luau index 5af7b8b..0976bf0 100644 --- a/src/Server/init.luau +++ b/src/Server/init.luau @@ -182,7 +182,7 @@ Server.Invoke = function(remoteName: string, player: Player, timeout: number?, . end table.insert(queueEvent[player], { 0, - { Identifier.get_id(remoteName), reqId :: any, { ... } :: any } :: any, + { reqId :: any, { ... } :: any } :: any, }) return coroutine.yield() end From f470f74b29da7cd85d479491aeaaeb077ee72411 Mon Sep 17 00:00:00 2001 From: Khietsly Tristan Date: Wed, 22 Apr 2026 08:50:59 +0700 Subject: [PATCH 3/4] chore: fix lint error for studio editor --- src/Client/init.luau | 6 +++--- src/Server/init.luau | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Client/init.luau b/src/Client/init.luau index 8d63f50..201ad75 100644 --- a/src/Client/init.luau +++ b/src/Client/init.luau @@ -9,8 +9,8 @@ local Replication = require("./Replication") local Xor = require("./Util/Xor") local RunService = game:GetService("RunService") -local Event: RemoteEvent = script.Parent:WaitForChild("Event") -local UnreliableEvent: UnreliableRemoteEvent = script.Parent:WaitForChild("UnreliableEvent") +local Event: RemoteEvent = script.Parent:WaitForChild("Event") :: RemoteEvent +local UnreliableEvent: UnreliableRemoteEvent = script.Parent:WaitForChild("UnreliableEvent") :: UnreliableRemoteEvent local deltaT: number, cycle: number = 0, 1 / 61 local writer: Buffer.Writer = Buffer.createWriter() @@ -200,7 +200,7 @@ if RunService:IsClient() then local connections = eventListeners[remote] if connections then for _, connection in connections do - Thread(connection.c, table.unpack(args)) + Thread(connection.c :: any, table.unpack(args)) end end end diff --git a/src/Server/init.luau b/src/Server/init.luau index 0976bf0..6e8fb15 100644 --- a/src/Server/init.luau +++ b/src/Server/init.luau @@ -11,9 +11,9 @@ local Xor = require("./Util/Xor") local Players = game:GetService("Players") local RunService = game:GetService("RunService") -local Event: RemoteEvent = script.Parent:WaitForChild("Event") -local _repl: RemoteEvent = script.Parent:WaitForChild("_repl") -local UnreliableEvent: UnreliableRemoteEvent = script.Parent:WaitForChild("UnreliableEvent") +local Event: RemoteEvent = script.Parent:WaitForChild("Event") :: RemoteEvent +local _repl: RemoteEvent = script.Parent:WaitForChild("_repl") :: RemoteEvent +local UnreliableEvent: UnreliableRemoteEvent = script.Parent:WaitForChild("UnreliableEvent") :: UnreliableRemoteEvent local deltaT: number, cycle: number = 0, 1 / 61 local writer: Buffer.Writer = Buffer.createWriter() @@ -242,7 +242,7 @@ if RunService:IsServer() then local connections = eventListeners[remote] if connections then for _, connection in connections do - Thread(connection.c, player, table.unpack(d)) + Thread(connection.c :: any, player, table.unpack(d)) end end end From 61deb37bae68d8dc8a5974828255aa23d6ff1fe8 Mon Sep 17 00:00:00 2001 From: Khietsly Tristan Date: Wed, 22 Apr 2026 08:52:44 +0700 Subject: [PATCH 4/4] bump versions to pre.7 --- Warp.rbxm | Bin 29326 -> 29376 bytes pesde.toml | 2 +- wally.toml | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Warp.rbxm b/Warp.rbxm index ba989eb55e4881b18aa34c5b326240a1d8b7e4fd..07a28e81933a754941b3c580ba46b561a1c2bf4d 100644 GIT binary patch delta 4036 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 Po6cWTh&B2CkumLGO_bRa diff --git a/pesde.toml b/pesde.toml index b6b797b..934b63a 100644 --- a/pesde.toml +++ b/pesde.toml @@ -1,5 +1,5 @@ name = "eternitydev/warp" -version = "1.1.0-pre4" +version = "1.1.0-pre7" description = "A rapidly-fast & powerful networking library." authors = ["eternitydev"] repository = "https://github.com/imezx/Warp" diff --git a/wally.toml b/wally.toml index 1762f23..77786f6 100644 --- a/wally.toml +++ b/wally.toml @@ -1,6 +1,6 @@ [package] name = "imezx/warp" -version = "1.1.0-pre4" +version = "1.1.0-pre7" registry = "https://github.com/UpliftGames/wally-index" realm = "shared" license = "MIT"