Skip to content

Commit 1e86f3b

Browse files
committed
ye
1 parent 8370908 commit 1e86f3b

6 files changed

Lines changed: 62 additions & 39 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Packets, queries, groups, validation, and rate limiting — all batched into one
1717

1818
```toml
1919
[dependencies]
20-
Lync = "axp3cter/lync@2.2.0"
20+
Lync = "axp3cter/lync@2.2.1"
2121
```
2222

2323
**npm (roblox-ts)**

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@axpecter/lync",
3-
"version": "2.2.0",
3+
"version": "2.2.1",
44
"description": "Buffer networking for Roblox. Delta compression, XOR framing, built-in security",
55
"main": "src/init.luau",
66
"types": "src/index.d.ts",

src/api/Packet.luau

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -39,24 +39,24 @@ end
3939

4040
-- Public types -----------------------------------------------------------
4141

42-
export type PacketHandle = {
43-
send: (self: PacketHandle, data: any, target: any?) -> (),
44-
on: (self: PacketHandle, fn: (...any) -> ()) -> Types.Connection,
45-
once: (self: PacketHandle, fn: (...any) -> ()) -> Types.Connection,
46-
wait: (self: PacketHandle) -> ...any,
47-
name: (self: PacketHandle) -> string,
48-
stats: (self: PacketHandle) -> Types.PacketStats,
42+
export type PacketHandle<T> = {
43+
send: (self: PacketHandle<T>, data: T, target: any?) -> (),
44+
on: (self: PacketHandle<T>, fn: (data: T, sender: Player?, timestamp: number?) -> ()) -> Types.Connection,
45+
once: (self: PacketHandle<T>, fn: (data: T, sender: Player?, timestamp: number?) -> ()) -> Types.Connection,
46+
wait: (self: PacketHandle<T>) -> (T, Player?, number?),
47+
name: (self: PacketHandle<T>) -> string,
48+
stats: (self: PacketHandle<T>) -> Types.PacketStats,
4949
}
5050

5151
-- Public -----------------------------------------------------------------
5252

5353
local Packet = {}
5454

55-
function Packet.define(
55+
function Packet.define<T>(
5656
name: string,
57-
codec: Types.InternalCodec<any>,
57+
codec: Types.InternalCodec<T>,
5858
options: Types.PacketOptions?
59-
): PacketHandle
59+
): PacketHandle<T>
6060
local opts = options or ({} :: Types.PacketOptions)
6161
local isUnreliable = opts.unreliable or false
6262

@@ -189,20 +189,23 @@ function Packet.define(
189189
bumpFires()
190190
end
191191

192+
type Self = PacketHandle<T>
193+
type Listener = (data: T, sender: Player?, timestamp: number?) -> ()
194+
192195
local handle = {
193-
send = function(_self: PacketHandle, data: any, target: any?): ()
196+
send = function(_self: Self, data: T, target: any?): ()
194197
if IS_SERVER then
195198
sendFromServer(data, target)
196199
else
197200
sendFromClient(data)
198201
end
199202
end,
200203

201-
on = function(_self: PacketHandle, fn: (...any) -> ()): Types.Connection
202-
return reg.signal:connect(fn)
204+
on = function(_self: Self, fn: Listener): Types.Connection
205+
return reg.signal:connect(fn :: any)
203206
end,
204207

205-
once = function(_self: PacketHandle, fn: (...any) -> ()): Types.Connection
208+
once = function(_self: Self, fn: Listener): Types.Connection
206209
local conn: Types.Connection
207210
conn = reg.signal:connect(function(...: any)
208211
conn:disconnect()
@@ -211,15 +214,15 @@ function Packet.define(
211214
return conn
212215
end,
213216

214-
wait = function(_self: PacketHandle): ...any
217+
wait = function(_self: Self): (T, Player?, number?)
215218
return reg.signal:wait()
216219
end,
217220

218-
name = function(_self: PacketHandle): string
221+
name = function(_self: Self): string
219222
return reg.name
220223
end,
221224

222-
stats = function(_self: PacketHandle): Types.PacketStats
225+
stats = function(_self: Self): Types.PacketStats
223226
return {
224227
bytesSent = reg.bytesSent,
225228
bytesReceived = reg.bytesReceived,
@@ -230,7 +233,7 @@ function Packet.define(
230233
end,
231234
}
232235

233-
return table.freeze(handle) :: PacketHandle
236+
return table.freeze(handle) :: PacketHandle<T>
234237
end
235238

236239
return table.freeze(Packet)

src/api/Query.luau

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -33,23 +33,29 @@ end
3333

3434
-- Public types -----------------------------------------------------------
3535

36-
export type QueryHandle = {
37-
handle: (self: QueryHandle, fn: (request: any, player: Player?) -> any) -> Types.Connection,
38-
request: (self: QueryHandle, data: any, target: any?) -> any,
39-
name: (self: QueryHandle) -> string,
40-
stats: (self: QueryHandle) -> Types.PacketStats,
36+
--[[
37+
Server `request(data, target)` returns `Resp?` for a Player target and
38+
`{ [Player]: Resp? }` for a multi-target table; Luau doesn't support
39+
overloads on table fields, so the type advertises `Resp?` (the common
40+
single-target case). Multi-target callers must cast the return.
41+
]]
42+
export type QueryHandle<Req, Resp> = {
43+
handle: (self: QueryHandle<Req, Resp>, fn: (request: Req, player: Player?) -> Resp?) -> Types.Connection,
44+
request: (self: QueryHandle<Req, Resp>, data: Req, target: any?) -> Resp?,
45+
name: (self: QueryHandle<Req, Resp>) -> string,
46+
stats: (self: QueryHandle<Req, Resp>) -> Types.PacketStats,
4147
}
4248

4349
-- Public -----------------------------------------------------------------
4450

4551
local Query = {}
4652

47-
function Query.define(
53+
function Query.define<Req, Resp>(
4854
name: string,
49-
requestCodec: Types.InternalCodec<any>,
50-
responseCodec: Types.InternalCodec<any>,
55+
requestCodec: Types.InternalCodec<Req>,
56+
responseCodec: Types.InternalCodec<Resp>,
5157
options: Types.QueryOptions?
52-
): QueryHandle
58+
): QueryHandle<Req, Resp>
5359
local opts = options or ({} :: Types.QueryOptions)
5460
local timeout = opts.timeout or DEFAULT_TIMEOUT
5561

@@ -228,14 +234,13 @@ function Query.define(
228234
return coroutine.yield()
229235
end
230236

237+
type Self = QueryHandle<Req, Resp>
238+
231239
local handle = {
232-
handle = function(
233-
_self: QueryHandle,
234-
fn: (request: any, player: Player?) -> any
235-
): Types.Connection
240+
handle = function(_self: Self, fn: (request: Req, player: Player?) -> Resp?): Types.Connection
236241
handlerToken += 1
237242
local myToken = handlerToken
238-
activeHandler = fn
243+
activeHandler = fn :: any
239244

240245
local conn = { connected = true }
241246
function conn.disconnect(self): ()
@@ -250,18 +255,18 @@ function Query.define(
250255
return conn :: Types.Connection
251256
end,
252257

253-
request = function(_self: QueryHandle, data: any, target: any?): any
258+
request = function(_self: Self, data: Req, target: any?): Resp?
254259
if IS_SERVER then
255260
return requestFromServer(data, target)
256261
end
257262
return requestFromClient(data)
258263
end,
259264

260-
name = function(_self: QueryHandle): string
265+
name = function(_self: Self): string
261266
return name
262267
end,
263268

264-
stats = function(_self: QueryHandle): Types.PacketStats
269+
stats = function(_self: Self): Types.PacketStats
265270
return {
266271
bytesSent = reqReg.bytesSent + respReg.bytesSent,
267272
bytesReceived = reqReg.bytesReceived + respReg.bytesReceived,
@@ -272,7 +277,7 @@ function Query.define(
272277
end,
273278
}
274279

275-
return table.freeze(handle) :: QueryHandle
280+
return table.freeze(handle) :: QueryHandle<Req, Resp>
276281
end
277282

278283
function Query.pendingCount(): number

src/init.luau

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,21 @@ local UDimC = require(script.codec.datatype.UDim)
4848
local UnknownC = require(script.codec.meta.Unknown)
4949
local VectorC = require(script.codec.datatype.Vector)
5050

51+
-- Public types (re-exported so users can write `Lync.Packet<MyData>`) ---
52+
53+
export type Codec<T> = Types.Codec<T>
54+
export type Connection = Types.Connection
55+
export type Packet<T> = Packet.PacketHandle<T>
56+
export type Query<Req, Resp> = Query.QueryHandle<Req, Resp>
57+
export type Group = Group.GroupHandle
58+
export type Scope = Scope.ScopeHandle
59+
export type PacketOptions = Types.PacketOptions
60+
export type QueryOptions = Types.QueryOptions
61+
export type ConfigureOptions = Types.ConfigureOptions
62+
export type RateLimitConfig = Types.RateLimitConfig
63+
export type PacketStats = Types.PacketStats
64+
export type PlayerStats = Types.PlayerStats
65+
5166
-- Constants --------------------------------------------------------------
5267

5368
local IS_SERVER = RunService:IsServer()

wally.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "axp3cter/lync"
3-
version = "2.2.0"
3+
version = "2.2.1"
44
description = "Buffer networking for Roblox. Delta compression, XOR framing, built-in security"
55
license = "MIT"
66
authors = ["Axp3cter"]

0 commit comments

Comments
 (0)