@axpecter/lync 1.4.3 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +41 -2
  2. package/package.json +1 -1
  3. package/src/Types.luau +13 -1
  4. package/src/api/Group.luau +35 -28
  5. package/src/api/Namespace.luau +107 -89
  6. package/src/api/Packet.luau +69 -51
  7. package/src/api/Query.luau +101 -95
  8. package/src/api/Scope.luau +32 -18
  9. package/src/api/Signal.luau +78 -56
  10. package/src/codec/Base.luau +17 -17
  11. package/src/codec/composite/Array.luau +74 -74
  12. package/src/codec/composite/Map.luau +80 -80
  13. package/src/codec/composite/Optional.luau +14 -14
  14. package/src/codec/composite/Shared.luau +35 -35
  15. package/src/codec/composite/Struct.luau +108 -108
  16. package/src/codec/composite/Tagged.luau +71 -71
  17. package/src/codec/composite/Tuple.luau +35 -35
  18. package/src/codec/datatype/Buffer.luau +18 -18
  19. package/src/codec/datatype/CFrame.luau +24 -24
  20. package/src/codec/datatype/Color.luau +8 -12
  21. package/src/codec/datatype/Instance.luau +13 -13
  22. package/src/codec/datatype/IntVector.luau +17 -17
  23. package/src/codec/datatype/NumberRange.luau +7 -7
  24. package/src/codec/datatype/Ray.luau +16 -16
  25. package/src/codec/datatype/Rect.luau +13 -13
  26. package/src/codec/datatype/Region.luau +32 -36
  27. package/src/codec/datatype/Sequence.luau +41 -41
  28. package/src/codec/datatype/String.luau +28 -28
  29. package/src/codec/datatype/UDim.luau +17 -17
  30. package/src/codec/datatype/Vector.luau +14 -18
  31. package/src/codec/meta/Auto.luau +75 -73
  32. package/src/codec/meta/Bitfield.luau +46 -46
  33. package/src/codec/meta/Custom.luau +7 -7
  34. package/src/codec/meta/Enum.luau +25 -25
  35. package/src/codec/meta/Nothing.luau +3 -3
  36. package/src/codec/meta/Quantized.luau +63 -60
  37. package/src/codec/meta/Unknown.luau +11 -11
  38. package/src/codec/primitive/Bool.luau +12 -12
  39. package/src/codec/primitive/Float16.luau +28 -28
  40. package/src/codec/primitive/Number.luau +41 -41
  41. package/src/codec/primitive/Varint.luau +19 -19
  42. package/src/init.luau +81 -61
  43. package/src/internal/Baseline.luau +7 -7
  44. package/src/internal/Channel.luau +56 -56
  45. package/src/internal/Middleware.luau +29 -29
  46. package/src/internal/Pool.luau +15 -15
  47. package/src/internal/Registry.luau +19 -19
  48. package/src/transport/Bridge.luau +17 -17
  49. package/src/transport/Client.luau +46 -46
  50. package/src/transport/Gate.luau +56 -64
  51. package/src/transport/Reader.luau +34 -34
  52. package/src/transport/Server.luau +89 -89
@@ -2,17 +2,17 @@
2
2
  --!optimize 2
3
3
  -- Server-side transport with batching, delta state, frame XOR.
4
4
 
5
- local Players = game:GetService ("Players")
6
- local RunService = game:GetService ("RunService")
7
-
8
- local Baseline = require (script.Parent.Parent.internal.Baseline)
9
- local Bridge = require (script.Parent.Bridge)
10
- local Channel = require (script.Parent.Parent.internal.Channel)
11
- local Gate = require (script.Parent.Gate)
12
- local Middleware = require (script.Parent.Parent.internal.Middleware)
13
- local Pool = require (script.Parent.Parent.internal.Pool)
14
- local Reader = require (script.Parent.Reader)
15
- local Types = require (script.Parent.Parent.Types)
5
+ local Players = game:GetService("Players")
6
+ local RunService = game:GetService("RunService")
7
+
8
+ local Baseline = require(script.Parent.Parent.internal.Baseline)
9
+ local Bridge = require(script.Parent.Bridge)
10
+ local Channel = require(script.Parent.Parent.internal.Channel)
11
+ local Gate = require(script.Parent.Gate)
12
+ local Middleware = require(script.Parent.Parent.internal.Middleware)
13
+ local Pool = require(script.Parent.Parent.internal.Pool)
14
+ local Reader = require(script.Parent.Reader)
15
+ local Types = require(script.Parent.Parent.Types)
16
16
 
17
17
  type ChannelState = Types.ChannelState
18
18
  type Codec<T> = Types.Codec<T>
@@ -21,7 +21,7 @@ local channelWriteBatch = Channel.writeBatch
21
21
  local channelWriteBatchRaw = Channel.writeBatchRaw
22
22
  local channelSetPacket = Channel.setCurrentPacket
23
23
 
24
- -- State --------------------------------------------------------------
24
+ -- State ---------------------------------------------------------------
25
25
 
26
26
  type PlayerState = {
27
27
  reliable: ChannelState,
@@ -31,116 +31,116 @@ type PlayerState = {
31
31
  local _players = {} :: { [Player]: PlayerState }
32
32
  local _prevRecv = {} :: { [Player]: buffer }
33
33
  local _isStarted = false
34
- local _broadScratch = Channel.create ()
34
+ local _broadScratch = Channel.create()
35
35
 
36
- -- Private ------------------------------------------------------------
36
+ -- Private -------------------------------------------------------------
37
37
 
38
- local function onPlayerAdded (player: Player): ()
38
+ local function onPlayerAdded(player: Player): ()
39
39
  _players[player] = {
40
- reliable = Pool.acquire (),
41
- unreliable = Pool.acquire (),
40
+ reliable = Pool.acquire(),
41
+ unreliable = Pool.acquire(),
42
42
  }
43
- Gate.onPlayerAdded (player)
43
+ Gate.onPlayerAdded(player)
44
44
  end
45
45
 
46
- local function onPlayerRemoving (player: Player): ()
46
+ local function onPlayerRemoving(player: Player): ()
47
47
  local state = _players[player]
48
48
  if not state then
49
49
  return
50
50
  end
51
51
 
52
- Pool.release (state.reliable)
53
- Pool.release (state.unreliable)
52
+ Pool.release(state.reliable)
53
+ Pool.release(state.unreliable)
54
54
  _players[player] = nil
55
55
  _prevRecv[player] = nil
56
56
 
57
- Gate.onPlayerRemoved (player)
58
- Baseline.clearSource (player)
57
+ Gate.onPlayerRemoved(player)
58
+ Baseline.clearSource(player)
59
59
  end
60
60
 
61
- local function receive (player: Player, data: any, refs: any, applyXor: boolean): ()
62
- local buf = Reader.decodeIncoming (data)
61
+ local function receive(player: Player, data: any, refs: any, applyXor: boolean): ()
62
+ local buf = Reader.decodeIncoming(data)
63
63
  if not buf then
64
64
  return
65
65
  end
66
66
 
67
67
  local raw: buffer
68
68
  if applyXor then
69
- raw = Channel.xorApply (buf, _prevRecv[player])
69
+ raw = Channel.xorApply(buf, _prevRecv[player])
70
70
  _prevRecv[player] = raw
71
71
  else
72
72
  raw = buf
73
73
  end
74
74
 
75
- local safeRefs: { Instance }? = if typeof (refs) == "table" then refs else nil
76
- local ok, err = pcall (Reader.process, raw, safeRefs, player, 0)
75
+ local safeRefs: { Instance }? = if typeof(refs) == "table" then refs else nil
76
+ local ok, err = pcall(Reader.process, raw, safeRefs, player, 0)
77
77
  if not ok then
78
- warn (`[Lync] Read failed from {player.Name} ({player.UserId}): {err}`)
78
+ warn(`[Lync] Read failed from {player.Name} ({player.UserId}): {err}`)
79
79
  end
80
80
  end
81
81
 
82
- local function flushChannel (remote: any, ch: ChannelState, target: Player, applyXor: boolean): ()
82
+ local function flushChannel(remote: any, ch: ChannelState, target: Player, applyXor: boolean): ()
83
83
  if ch.cursor == 0 then
84
84
  return
85
85
  end
86
86
 
87
- local raw, refs = Channel.sealAndDump (ch)
87
+ local raw, refs = Channel.sealAndDump(ch)
88
88
 
89
89
  if applyXor then
90
- local xored = Channel.xorApply (raw, ch.prevDump)
90
+ local xored = Channel.xorApply(raw, ch.prevDump)
91
91
  ch.prevDump = raw
92
- remote:FireClient (target, xored, refs)
92
+ remote:FireClient(target, xored, refs)
93
93
  else
94
- remote:FireClient (target, raw, refs)
94
+ remote:FireClient(target, raw, refs)
95
95
  end
96
96
 
97
- Channel.reset (ch)
97
+ Channel.reset(ch)
98
98
  end
99
99
 
100
- local function flush (): ()
100
+ local function flush(): ()
101
101
  local reliable = Bridge.reliable
102
102
  local unreliable = Bridge.unreliable
103
103
 
104
104
  for player, state in _players do
105
- local ok, err = pcall (flushChannel, reliable, state.reliable, player, true)
105
+ local ok, err = pcall(flushChannel, reliable, state.reliable, player, true)
106
106
  if not ok then
107
- warn (`[Lync] Flush failed for {player.Name} ({player.UserId}): {err}`)
108
- Channel.reset (state.reliable)
107
+ warn(`[Lync] Flush failed for {player.Name} ({player.UserId}): {err}`)
108
+ Channel.reset(state.reliable)
109
109
  end
110
110
 
111
- local ok2, err2 = pcall (flushChannel, unreliable, state.unreliable, player, false)
111
+ local ok2, err2 = pcall(flushChannel, unreliable, state.unreliable, player, false)
112
112
  if not ok2 then
113
- warn (`[Lync] Flush failed for {player.Name} ({player.UserId}): {err2}`)
114
- Channel.reset (state.unreliable)
113
+ warn(`[Lync] Flush failed for {player.Name} ({player.UserId}): {err2}`)
114
+ Channel.reset(state.unreliable)
115
115
  end
116
116
  end
117
117
  end
118
118
 
119
119
  -- Serialize data once into shared scratch, return raw bytes + refs snapshot.
120
- local function serializeBroadcast (
120
+ local function serializeBroadcast(
121
121
  name: string,
122
122
  codec: Codec<any>,
123
123
  data: any
124
124
  ): (number, { Instance }?)
125
125
  local scratch = _broadScratch
126
126
  scratch.cursor = 0
127
- table.clear (scratch.refs)
128
- channelSetPacket (name)
129
- codec.write (scratch, data)
127
+ table.clear(scratch.refs)
128
+ channelSetPacket(name)
129
+ codec.write(scratch, data)
130
130
 
131
- local snapRefs = if #scratch.refs > 0 then table.clone (scratch.refs) else nil
131
+ local snapRefs = if #scratch.refs > 0 then table.clone(scratch.refs) else nil
132
132
  return scratch.cursor, snapRefs
133
133
  end
134
134
 
135
135
  -- Run middleware and serialize once. Returns nil if middleware dropped.
136
- local function prepareBroadcast (
136
+ local function prepareBroadcast(
137
137
  name: string,
138
138
  codec: Codec<any>,
139
139
  data: any
140
140
  ): (any, number, { Instance }?)
141
141
  local final: any
142
142
  if Middleware.hasSend then
143
- final = Middleware.runSend (data, name, nil)
143
+ final = Middleware.runSend(data, name, nil)
144
144
  if final == nil then
145
145
  return nil, 0, nil
146
146
  end
@@ -148,12 +148,12 @@ local function prepareBroadcast (
148
148
  final = data
149
149
  end
150
150
 
151
- local snapLen, snapRefs = serializeBroadcast (name, codec, final)
151
+ local snapLen, snapRefs = serializeBroadcast(name, codec, final)
152
152
  return final, snapLen, snapRefs
153
153
  end
154
154
 
155
155
  -- Fan out to all connected players via _players map.
156
- local function broadcastToAll (
156
+ local function broadcastToAll(
157
157
  id: number,
158
158
  name: string,
159
159
  codec: Codec<any>,
@@ -161,7 +161,7 @@ local function broadcastToAll (
161
161
  isUnreliable: boolean,
162
162
  exceptSet: { [Player]: true }?
163
163
  ): ()
164
- local final, snapLen, snapRefs = prepareBroadcast (name, codec, data)
164
+ local final, snapLen, snapRefs = prepareBroadcast(name, codec, data)
165
165
  if final == nil and data ~= nil then
166
166
  return
167
167
  end
@@ -172,12 +172,12 @@ local function broadcastToAll (
172
172
  continue
173
173
  end
174
174
  local ch = if isUnreliable then state.unreliable else state.reliable
175
- channelWriteBatchRaw (ch, id, scratchBuff, snapLen, snapRefs)
175
+ channelWriteBatchRaw(ch, id, scratchBuff, snapLen, snapRefs)
176
176
  end
177
177
  end
178
178
 
179
179
  -- Fan out to a specific player list.
180
- local function broadcastToList (
180
+ local function broadcastToList(
181
181
  players: { Player },
182
182
  id: number,
183
183
  name: string,
@@ -185,7 +185,7 @@ local function broadcastToList (
185
185
  data: any,
186
186
  isUnreliable: boolean
187
187
  ): ()
188
- local final, snapLen, snapRefs = prepareBroadcast (name, codec, data)
188
+ local final, snapLen, snapRefs = prepareBroadcast(name, codec, data)
189
189
  if final == nil and data ~= nil then
190
190
  return
191
191
  end
@@ -197,12 +197,12 @@ local function broadcastToList (
197
197
  continue
198
198
  end
199
199
  local ch = if isUnreliable then state.unreliable else state.reliable
200
- channelWriteBatchRaw (ch, id, scratchBuff, snapLen, snapRefs)
200
+ channelWriteBatchRaw(ch, id, scratchBuff, snapLen, snapRefs)
201
201
  end
202
202
  end
203
203
 
204
204
  -- Fan out to a group set { [Player]: true }.
205
- local function broadcastToSet (
205
+ local function broadcastToSet(
206
206
  set: { [Player]: true },
207
207
  id: number,
208
208
  name: string,
@@ -210,7 +210,7 @@ local function broadcastToSet (
210
210
  data: any,
211
211
  isUnreliable: boolean
212
212
  ): ()
213
- local final, snapLen, snapRefs = prepareBroadcast (name, codec, data)
213
+ local final, snapLen, snapRefs = prepareBroadcast(name, codec, data)
214
214
  if final == nil and data ~= nil then
215
215
  return
216
216
  end
@@ -222,38 +222,38 @@ local function broadcastToSet (
222
222
  continue
223
223
  end
224
224
  local ch = if isUnreliable then state.unreliable else state.reliable
225
- channelWriteBatchRaw (ch, id, scratchBuff, snapLen, snapRefs)
225
+ channelWriteBatchRaw(ch, id, scratchBuff, snapLen, snapRefs)
226
226
  end
227
227
  end
228
228
 
229
- -- Public -------------------------------------------------------------
229
+ -- Public --------------------------------------------------------------
230
230
 
231
231
  local Server = {}
232
232
 
233
- function Server.start (): ()
233
+ function Server.start(): ()
234
234
  if _isStarted then
235
235
  return
236
236
  end
237
237
  _isStarted = true
238
238
 
239
- Bridge.setup ()
239
+ Bridge.setup()
240
240
 
241
- Players.PlayerAdded:Connect (onPlayerAdded)
242
- Players.PlayerRemoving:Connect (onPlayerRemoving)
243
- for _, player in Players:GetPlayers () do
244
- onPlayerAdded (player)
241
+ Players.PlayerAdded:Connect(onPlayerAdded)
242
+ Players.PlayerRemoving:Connect(onPlayerRemoving)
243
+ for _, player in Players:GetPlayers() do
244
+ onPlayerAdded(player)
245
245
  end
246
246
 
247
- Bridge.reliable.OnServerEvent:Connect (function (player: Player, data: any, refs: any): ()
248
- receive (player, data, refs, true)
247
+ Bridge.reliable.OnServerEvent:Connect(function(player: Player, data: any, refs: any): ()
248
+ receive(player, data, refs, true)
249
249
  end)
250
- Bridge.unreliable.OnServerEvent:Connect (function (player: Player, data: any, refs: any): ()
251
- receive (player, data, refs, false)
250
+ Bridge.unreliable.OnServerEvent:Connect(function(player: Player, data: any, refs: any): ()
251
+ receive(player, data, refs, false)
252
252
  end)
253
- RunService.Heartbeat:Connect (flush)
253
+ RunService.Heartbeat:Connect(flush)
254
254
  end
255
255
 
256
- function Server.writeTo (
256
+ function Server.writeTo(
257
257
  player: Player,
258
258
  id: number,
259
259
  name: string,
@@ -268,7 +268,7 @@ function Server.writeTo (
268
268
 
269
269
  local final: any
270
270
  if Middleware.hasSend then
271
- final = Middleware.runSend (data, name, player)
271
+ final = Middleware.runSend(data, name, player)
272
272
  if final == nil then
273
273
  return
274
274
  end
@@ -277,20 +277,20 @@ function Server.writeTo (
277
277
  end
278
278
 
279
279
  local ch = if isUnreliable then state.unreliable else state.reliable
280
- channelWriteBatch (ch, id, name, codec, final)
280
+ channelWriteBatch(ch, id, name, codec, final)
281
281
  end
282
282
 
283
- function Server.writeToAll (
283
+ function Server.writeToAll(
284
284
  id: number,
285
285
  name: string,
286
286
  codec: Codec<any>,
287
287
  data: any,
288
288
  isUnreliable: boolean
289
289
  ): ()
290
- broadcastToAll (id, name, codec, data, isUnreliable, nil)
290
+ broadcastToAll(id, name, codec, data, isUnreliable, nil)
291
291
  end
292
292
 
293
- function Server.writeToList (
293
+ function Server.writeToList(
294
294
  players: { Player },
295
295
  id: number,
296
296
  name: string,
@@ -298,10 +298,10 @@ function Server.writeToList (
298
298
  data: any,
299
299
  isUnreliable: boolean
300
300
  ): ()
301
- broadcastToList (players, id, name, codec, data, isUnreliable)
301
+ broadcastToList(players, id, name, codec, data, isUnreliable)
302
302
  end
303
303
 
304
- function Server.writeToAllExcept (
304
+ function Server.writeToAllExcept(
305
305
  exceptSet: { [Player]: true },
306
306
  id: number,
307
307
  name: string,
@@ -309,10 +309,10 @@ function Server.writeToAllExcept (
309
309
  data: any,
310
310
  isUnreliable: boolean
311
311
  ): ()
312
- broadcastToAll (id, name, codec, data, isUnreliable, exceptSet)
312
+ broadcastToAll(id, name, codec, data, isUnreliable, exceptSet)
313
313
  end
314
314
 
315
- function Server.writeToSet (
315
+ function Server.writeToSet(
316
316
  set: { [Player]: true },
317
317
  id: number,
318
318
  name: string,
@@ -320,11 +320,11 @@ function Server.writeToSet (
320
320
  data: any,
321
321
  isUnreliable: boolean
322
322
  ): ()
323
- broadcastToSet (set, id, name, codec, data, isUnreliable)
323
+ broadcastToSet(set, id, name, codec, data, isUnreliable)
324
324
  end
325
325
 
326
- -- Shared for both query requests and responses (identical wire format).
327
- function Server.writeQuery (
326
+ -- Shared for both query requests and responses(identical wire format).
327
+ function Server.writeQuery(
328
328
  player: Player,
329
329
  id: number,
330
330
  name: string,
@@ -339,7 +339,7 @@ function Server.writeQuery (
339
339
 
340
340
  local final: any
341
341
  if Middleware.hasSend then
342
- final = Middleware.runSend (data, name, player)
342
+ final = Middleware.runSend(data, name, player)
343
343
  if final == nil then
344
344
  return
345
345
  end
@@ -347,16 +347,16 @@ function Server.writeQuery (
347
347
  final = data
348
348
  end
349
349
 
350
- Channel.writeQuery (state.reliable, id, name, correlationId, codec, final)
350
+ Channel.writeQuery(state.reliable, id, name, correlationId, codec, final)
351
351
  end
352
352
 
353
- function Server.writeQueryNil (player: Player, id: number, name: string, correlationId: number): ()
353
+ function Server.writeQueryNil(player: Player, id: number, name: string, correlationId: number): ()
354
354
  local state = _players[player]
355
355
  if not state then
356
356
  return
357
357
  end
358
358
 
359
- Channel.writeQuery (state.reliable, id, name, correlationId, nil, nil)
359
+ Channel.writeQuery(state.reliable, id, name, correlationId, nil, nil)
360
360
  end
361
361
 
362
- return table.freeze (Server)
362
+ return table.freeze(Server)