@axpecter/lync 1.5.2 → 2.1.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 (55) hide show
  1. package/README.md +499 -357
  2. package/package.json +2 -2
  3. package/src/Types.luau +69 -27
  4. package/src/api/Group.luau +101 -106
  5. package/src/api/Packet.luau +191 -157
  6. package/src/api/Query.luau +223 -282
  7. package/src/api/Scope.luau +46 -57
  8. package/src/api/Signal.luau +104 -137
  9. package/src/codec/Base.luau +69 -20
  10. package/src/codec/composite/Array.luau +189 -201
  11. package/src/codec/composite/Map.luau +97 -341
  12. package/src/codec/composite/Optional.luau +27 -23
  13. package/src/codec/composite/Shared.luau +96 -65
  14. package/src/codec/composite/Struct.luau +201 -339
  15. package/src/codec/composite/Tagged.luau +64 -178
  16. package/src/codec/composite/Tuple.luau +81 -95
  17. package/src/codec/datatype/Buffer.luau +49 -21
  18. package/src/codec/datatype/CFrame.luau +207 -30
  19. package/src/codec/datatype/Color.luau +21 -11
  20. package/src/codec/datatype/Instance.luau +29 -19
  21. package/src/codec/datatype/IntVector.luau +33 -21
  22. package/src/codec/datatype/NumberRange.luau +19 -10
  23. package/src/codec/datatype/Ray.luau +26 -22
  24. package/src/codec/datatype/Rect.luau +20 -16
  25. package/src/codec/datatype/Region.luau +51 -45
  26. package/src/codec/datatype/Sequence.luau +64 -56
  27. package/src/codec/datatype/String.luau +89 -56
  28. package/src/codec/datatype/UDim.luau +40 -22
  29. package/src/codec/datatype/Vector.luau +181 -17
  30. package/src/codec/meta/Auto.luau +295 -253
  31. package/src/codec/meta/Bitfield.luau +104 -148
  32. package/src/codec/meta/Custom.luau +8 -4
  33. package/src/codec/meta/Enum.luau +29 -57
  34. package/src/codec/meta/Float.luau +64 -0
  35. package/src/codec/meta/Nothing.luau +9 -5
  36. package/src/codec/meta/Unknown.luau +44 -35
  37. package/src/codec/primitive/Bool.luau +16 -26
  38. package/src/codec/primitive/Float16.luau +58 -64
  39. package/src/codec/primitive/Int.luau +68 -0
  40. package/src/codec/primitive/Number.luau +21 -43
  41. package/src/codec/primitive/Varint.luau +67 -46
  42. package/src/index.d.ts +249 -306
  43. package/src/init.luau +332 -173
  44. package/src/internal/Baseline.luau +29 -24
  45. package/src/internal/Channel.luau +346 -161
  46. package/src/internal/Middleware.luau +60 -85
  47. package/src/internal/Pool.luau +19 -30
  48. package/src/internal/Registry.luau +61 -101
  49. package/src/transport/Bridge.luau +64 -43
  50. package/src/transport/Client.luau +60 -117
  51. package/src/transport/Gate.luau +282 -133
  52. package/src/transport/Reader.luau +159 -100
  53. package/src/transport/Server.luau +147 -292
  54. package/src/api/Namespace.luau +0 -251
  55. package/src/codec/meta/Quantized.luau +0 -174
@@ -1,152 +1,95 @@
1
1
  --!strict
2
2
  --!optimize 2
3
- -- Client-side transport with batching, frame XOR on reliable.
3
+ -- Client-side transport: single channel pair, flush.
4
4
 
5
- local RunService = game:GetService("RunService")
6
-
7
- local Bridge = require(script.Parent.Bridge)
5
+ local Bridge = require(script.Parent.Parent.transport.Bridge)
8
6
  local Channel = require(script.Parent.Parent.internal.Channel)
9
- local Middleware = require(script.Parent.Parent.internal.Middleware)
10
- local Reader = require(script.Parent.Reader)
7
+ local Reader = require(script.Parent.Parent.transport.Reader)
11
8
  local Types = require(script.Parent.Parent.Types)
12
9
 
13
- type ChannelState = Types.ChannelState
14
- type Codec<T> = Types.Codec<T>
15
-
16
10
  -- State ---------------------------------------------------------------
17
11
 
18
- local NOT_STARTED = "[Lync] Client not started. Call Lync.start() before sending"
19
-
20
- local _reliable = nil :: ChannelState?
21
- local _unreliable = nil :: ChannelState?
22
- local _prevRecv = nil :: buffer?
23
- local _isStarted = false
12
+ local _reliable: Types.ChannelState = Channel.create()
13
+ local _unreliable: Types.ChannelState = Channel.create()
14
+ local _prevIncoming: buffer? = nil
15
+ local _prevIncomingLen = 0
24
16
 
25
- -- Private -------------------------------------------------------------
26
-
27
- local function receive(data: any, refs: any, applyXor: boolean): ()
28
- local buf = Reader.decodeIncoming(data)
29
- if not buf then
30
- return
31
- end
17
+ -- Public --------------------------------------------------------------
32
18
 
33
- local raw: buffer
34
- if applyXor then
35
- raw = Channel.xorApply(buf, _prevRecv)
36
- _prevRecv = raw
37
- else
38
- raw = buf
39
- end
19
+ local Client = {}
40
20
 
41
- local safeRefs: { Instance }? = if typeof(refs) == "table" then refs else nil
42
- local ok, err = pcall(Reader.process, raw, safeRefs, nil, 0)
43
- if not ok then
44
- warn(`[Lync] Read failed: {err}`)
45
- end
21
+ function Client.getChannel(isUnreliable: boolean): Types.ChannelState
22
+ return if isUnreliable then _unreliable else _reliable
46
23
  end
47
24
 
48
- local function flushChannel(remote: any, ch: ChannelState, applyXor: boolean): ()
49
- if ch.cursor == 0 then
50
- return
25
+ function Client.flush(): ()
26
+ if Channel.hasTimestamps() then
27
+ Channel.updateTimestamp()
51
28
  end
52
29
 
53
- local raw, refs = Channel.sealAndDump(ch)
54
-
55
- if applyXor then
56
- local xored = Channel.xorApply(raw, ch.prevDump)
57
- ch.prevDump = raw
58
- remote:FireServer(xored, refs)
59
- else
60
- remote:FireServer(raw, refs)
30
+ -- Reliable
31
+ if _reliable.cursor > 0 then
32
+ local snapshot, refs, byteLen, _ = Channel.sealAndDump(_reliable)
33
+ Bridge.fireServer(snapshot, refs)
34
+ Channel.reset(_reliable)
61
35
  end
62
36
 
63
- Channel.reset(ch)
64
- end
65
-
66
- local function flush(): ()
67
- flushChannel(Bridge.reliable, _reliable :: ChannelState, true)
68
- flushChannel(Bridge.unreliable, _unreliable :: ChannelState, false)
37
+ -- Unreliable
38
+ if _unreliable.cursor > 0 then
39
+ local snapshot, refs, byteLen, _ = Channel.sealAndDump(_unreliable)
40
+ Bridge.fireServerUnreliable(snapshot, refs)
41
+ Channel.reset(_unreliable)
42
+ end
69
43
  end
70
44
 
71
- -- Public --------------------------------------------------------------
72
-
73
- local Client = {}
74
-
75
45
  function Client.start(): ()
76
- if _isStarted then
77
- return
78
- end
79
- _isStarted = true
46
+ local container = game:GetService("ReplicatedStorage"):WaitForChild("LyncRemotes")
47
+ Bridge.setup(container)
80
48
 
81
- Bridge.setup()
49
+ local reliable = Bridge.reliable()
50
+ local unreliable = Bridge.unreliable()
82
51
 
83
- _reliable = Channel.create()
84
- _unreliable = Channel.create()
85
-
86
- Bridge.reliable.OnClientEvent:Connect(function(data: any, refs: any): ()
87
- receive(data, refs, true)
88
- end)
89
- Bridge.unreliable.OnClientEvent:Connect(function(data: any, refs: any): ()
90
- receive(data, refs, false)
91
- end)
92
- RunService.Heartbeat:Connect(flush)
93
- end
52
+ -- Incoming reliable (XOR encoded)
53
+ reliable.OnClientEvent:Connect(function(data: any, refs: any?)
54
+ local incoming = Reader.decodeIncoming(data)
55
+ if not incoming then
56
+ return
57
+ end
94
58
 
95
- function Client.write(
96
- id: number,
97
- name: string,
98
- codec: Codec<any>,
99
- data: any,
100
- isUnreliable: boolean
101
- ): ()
102
- if not _isStarted then
103
- error(NOT_STARTED)
104
- end
59
+ local incomingLen = buffer.len(incoming)
105
60
 
106
- local final: any
107
- if Middleware.hasSend then
108
- final = Middleware.runSend(data, name, nil)
109
- if final == nil then
110
- return
61
+ -- XOR decode against previous frame
62
+ local decoded: buffer
63
+ if _prevIncoming then
64
+ decoded = Channel.xorApply(incoming, incomingLen, _prevIncoming, _prevIncomingLen)
65
+ else
66
+ decoded = incoming
111
67
  end
112
- else
113
- final = data
114
- end
115
68
 
116
- local ch = if isUnreliable then _unreliable :: ChannelState else _reliable :: ChannelState
117
- Channel.writeBatch(ch, id, name, codec, final)
118
- end
69
+ -- Store decoded (not XOR'd) for next frame's XOR base
70
+ _prevIncoming = decoded
71
+ _prevIncomingLen = incomingLen
119
72
 
120
- -- Shared for both query requests and responses(identical wire format).
121
- function Client.writeQuery(
122
- id: number,
123
- name: string,
124
- correlationId: number,
125
- codec: Codec<any>,
126
- data: any
127
- ): ()
128
- if not _isStarted then
129
- error(NOT_STARTED)
130
- end
73
+ local ok, err = pcall(Reader.process, decoded, incomingLen, refs :: any, nil, false)
74
+ if not ok then
75
+ warn(`[Lync] Client: read error: {err}`)
76
+ end
77
+ end)
131
78
 
132
- local final: any
133
- if Middleware.hasSend then
134
- final = Middleware.runSend(data, name, nil)
135
- if final == nil then
79
+ -- Incoming unreliable (no XOR)
80
+ unreliable.OnClientEvent:Connect(function(data: any, refs: any?)
81
+ local incoming = Reader.decodeIncoming(data)
82
+ if not incoming then
136
83
  return
137
84
  end
138
- else
139
- final = data
140
- end
141
85
 
142
- Channel.writeQuery(_reliable :: ChannelState, id, name, correlationId, codec, final)
143
- end
86
+ local incomingLen = buffer.len(incoming)
144
87
 
145
- function Client.writeQueryNil(id: number, name: string, correlationId: number): ()
146
- if not _isStarted then
147
- error(NOT_STARTED)
148
- end
149
- Channel.writeQuery(_reliable :: ChannelState, id, name, correlationId, nil, nil)
88
+ local ok, err = pcall(Reader.process, incoming, incomingLen, refs :: any, nil, false)
89
+ if not ok then
90
+ warn(`[Lync] Client: read error (unreliable): {err}`)
91
+ end
92
+ end)
150
93
  end
151
94
 
152
95
  return table.freeze(Client)