@axpecter/lync 2.3.3 → 3.0.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 (135) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +302 -299
  3. package/Types.luau +215 -0
  4. package/api/Define.luau +154 -0
  5. package/api/Lifecycle.luau +119 -0
  6. package/api/Packet.luau +108 -0
  7. package/api/Query.luau +149 -0
  8. package/api/Set.luau +189 -0
  9. package/channel/Blocks.luau +124 -0
  10. package/channel/Group.luau +118 -0
  11. package/channel/Link.luau +135 -0
  12. package/channel/Outbox.luau +261 -0
  13. package/channel/Recipients.luau +129 -0
  14. package/channel/Transport.luau +138 -0
  15. package/codec/Base.luau +236 -0
  16. package/codec/Composites.luau +128 -0
  17. package/codec/Datatypes.luau +162 -0
  18. package/codec/Legality.luau +61 -0
  19. package/codec/Scalars.luau +72 -0
  20. package/codec/Text.luau +89 -0
  21. package/codec/init.luau +39 -0
  22. package/index.d.ts +285 -0
  23. package/init.luau +91 -0
  24. package/kernel/Bits.luau +16 -0
  25. package/kernel/Catalog.luau +121 -0
  26. package/kernel/Heap.luau +80 -0
  27. package/kernel/Listeners.luau +95 -0
  28. package/kernel/Log.luau +197 -0
  29. package/kernel/Tally.luau +128 -0
  30. package/kernel/Threads.luau +44 -0
  31. package/kernel/Wide.luau +267 -0
  32. package/package.json +15 -32
  33. package/runtime/Boundary.luau +180 -0
  34. package/runtime/Dispatch.luau +91 -0
  35. package/runtime/Handles.luau +114 -0
  36. package/runtime/Handshake.luau +90 -0
  37. package/runtime/Pending.luau +196 -0
  38. package/runtime/Router.luau +379 -0
  39. package/runtime/Session.luau +731 -0
  40. package/shape/Compile.luau +340 -0
  41. package/shape/Folds.luau +332 -0
  42. package/shape/Frames.luau +170 -0
  43. package/shape/Grid.luau +169 -0
  44. package/shape/Ir.luau +540 -0
  45. package/shape/Joins.luau +125 -0
  46. package/shape/Legality.luau +273 -0
  47. package/shape/Lower.luau +419 -0
  48. package/shape/Order.luau +64 -0
  49. package/shape/Regions.luau +113 -0
  50. package/shape/Rotation.luau +472 -0
  51. package/shape/Serial.luau +258 -0
  52. package/shape/Words.luau +89 -0
  53. package/shape/emit/Block.luau +453 -0
  54. package/shape/emit/Column.luau +338 -0
  55. package/shape/emit/Leaf.luau +462 -0
  56. package/shape/emit/Word.luau +234 -0
  57. package/shape/emit/init.luau +222 -0
  58. package/shape/init.luau +78 -0
  59. package/state/Apply.luau +330 -0
  60. package/state/Audience.luau +126 -0
  61. package/state/Catchup.luau +218 -0
  62. package/state/Coalesce.luau +43 -0
  63. package/state/Fieldset.luau +177 -0
  64. package/state/Newest.luau +339 -0
  65. package/state/Plan.luau +441 -0
  66. package/state/Sections.luau +468 -0
  67. package/state/Store.luau +188 -0
  68. package/state/Sync.luau +762 -0
  69. package/wire/Bytes.luau +118 -0
  70. package/wire/Clock.luau +37 -0
  71. package/wire/Protocol.luau +110 -0
  72. package/wire/Sequence.luau +40 -0
  73. package/wire/Varint.luau +124 -0
  74. package/src/Types.luau +0 -180
  75. package/src/api/Group.luau +0 -156
  76. package/src/api/Packet.luau +0 -317
  77. package/src/api/Query.luau +0 -338
  78. package/src/api/Scope.luau +0 -90
  79. package/src/api/Signal.luau +0 -193
  80. package/src/codec/Base.luau +0 -136
  81. package/src/codec/composite/Array.luau +0 -473
  82. package/src/codec/composite/Map.luau +0 -485
  83. package/src/codec/composite/Optional.luau +0 -54
  84. package/src/codec/composite/Shared.luau +0 -311
  85. package/src/codec/composite/Struct.luau +0 -494
  86. package/src/codec/composite/Tagged.luau +0 -103
  87. package/src/codec/composite/Tuple.luau +0 -143
  88. package/src/codec/datatype/Buffer.luau +0 -66
  89. package/src/codec/datatype/CFrame.luau +0 -109
  90. package/src/codec/datatype/Color.luau +0 -32
  91. package/src/codec/datatype/Instance.luau +0 -52
  92. package/src/codec/datatype/IntVector.luau +0 -39
  93. package/src/codec/datatype/NumberRange.luau +0 -39
  94. package/src/codec/datatype/Ray.luau +0 -36
  95. package/src/codec/datatype/Rect.luau +0 -31
  96. package/src/codec/datatype/Region.luau +0 -62
  97. package/src/codec/datatype/Sequence.luau +0 -184
  98. package/src/codec/datatype/String.luau +0 -94
  99. package/src/codec/datatype/UDim.luau +0 -46
  100. package/src/codec/datatype/Vector.luau +0 -130
  101. package/src/codec/meta/Auto.luau +0 -318
  102. package/src/codec/meta/Bitfield.luau +0 -160
  103. package/src/codec/meta/Custom.luau +0 -33
  104. package/src/codec/meta/DeltaScalar.luau +0 -390
  105. package/src/codec/meta/Enum.luau +0 -50
  106. package/src/codec/meta/Float.luau +0 -38
  107. package/src/codec/meta/Nothing.luau +0 -13
  108. package/src/codec/meta/Unknown.luau +0 -41
  109. package/src/codec/primitive/Bool.luau +0 -26
  110. package/src/codec/primitive/Float16.luau +0 -99
  111. package/src/codec/primitive/Int.luau +0 -59
  112. package/src/codec/primitive/Number.luau +0 -24
  113. package/src/codec/primitive/Signed.luau +0 -32
  114. package/src/codec/primitive/Varint.luau +0 -165
  115. package/src/codec/primitive/Zint.luau +0 -99
  116. package/src/index.d.ts +0 -423
  117. package/src/init.luau +0 -362
  118. package/src/internal/Baseline.luau +0 -57
  119. package/src/internal/Channel.luau +0 -484
  120. package/src/internal/Middleware.luau +0 -100
  121. package/src/internal/Pool.luau +0 -66
  122. package/src/internal/Registry.luau +0 -119
  123. package/src/internal/Transport.luau +0 -28
  124. package/src/transport/Bridge.luau +0 -110
  125. package/src/transport/Client.luau +0 -97
  126. package/src/transport/Gate.luau +0 -488
  127. package/src/transport/Reader.luau +0 -331
  128. package/src/transport/Server.luau +0 -233
  129. package/src/util/Array.luau +0 -18
  130. package/src/util/Buffer.luau +0 -90
  131. package/src/util/Constants.luau +0 -30
  132. package/src/util/Log.luau +0 -68
  133. package/src/util/Player.luau +0 -14
  134. package/src/util/Quantize.luau +0 -84
  135. package/src/util/Quat.luau +0 -124
@@ -1,184 +0,0 @@
1
- --!strict
2
- --!native
3
- -- NumberSequence (12B/keypoint) and ColorSequence (7B/keypoint) codecs.
4
-
5
- local Base = require(script.Parent.Parent.Base)
6
- local Constants = require(script.Parent.Parent.Parent.util.Constants)
7
- local Log = require(script.Parent.Parent.Parent.util.Log)
8
- local Types = require(script.Parent.Parent.Parent.Types)
9
- local Varint = require(script.Parent.Parent.primitive.Varint)
10
-
11
- -- Constants --------------------------------------------------------------
12
-
13
- local NUMSEQ_KP_BYTES = 12
14
- local COLSEQ_KP_BYTES = 7
15
- local MAX_KEYPOINTS = 20
16
-
17
- -- Private ----------------------------------------------------------------
18
-
19
- local U8_MAX = Constants.U8_MAX
20
- local alloc = Base.alloc
21
- local writef32 = buffer.writef32
22
- local readf32 = buffer.readf32
23
- local writeu8 = buffer.writeu8
24
- local readu8 = buffer.readu8
25
- local round = math.round
26
- local clamp = math.clamp
27
- local varintRead = Varint.read
28
- local varintWrite = Varint.write
29
-
30
- --[[
31
- Common write prelude: count cap check, varint count, payload alloc.
32
- Returns (cursor, b) for the per-keypoint writer; (nil, nil) when count
33
- is 0 so callers short-circuit.
34
- ]]
35
- local function beginSeqWrite(
36
- ch: Types.ChannelState,
37
- label: string,
38
- count: number,
39
- kpBytes: number
40
- ): (number?, buffer?)
41
- if count > MAX_KEYPOINTS then
42
- Log.error(`{label}.write: keypoint count {count} exceeds Roblox limit {MAX_KEYPOINTS}`)
43
- end
44
- varintWrite(ch, count)
45
- if count == 0 then
46
- return nil, nil
47
- end
48
-
49
- local bytes = count * kpBytes
50
- local cursor = ch.cursor
51
- if cursor + bytes > ch.size then
52
- alloc(ch, bytes)
53
- end
54
- ch.cursor = cursor + bytes
55
- return cursor, ch.buff
56
- end
57
-
58
- --[[
59
- Common read prelude: varint count, cap check, bounds check. Returns
60
- (count, dataStart, lenBytes) for the per-keypoint reader; (0, _, lenBytes)
61
- when payload is empty.
62
- ]]
63
- local function beginSeqRead(
64
- src: buffer,
65
- pos: number,
66
- label: string,
67
- kpBytes: number
68
- ): (number, number, number)
69
- local count, lenBytes = varintRead(src, pos)
70
- if count == 0 then
71
- return 0, pos + lenBytes, lenBytes
72
- end
73
- if count > MAX_KEYPOINTS then
74
- Log.error(`{label}.read: keypoint count {count} exceeds Roblox limit {MAX_KEYPOINTS}`)
75
- end
76
-
77
- local bytes = count * kpBytes
78
- local dataStart = pos + lenBytes
79
- if dataStart + bytes > buffer.len(src) then
80
- Log.error(`{label}.read: payload {bytes}B exceeds remaining buffer`)
81
- end
82
- return count, dataStart, lenBytes
83
- end
84
-
85
- local function writeNumberSequence(ch: Types.ChannelState, value: NumberSequence): ()
86
- local keypoints = value.Keypoints
87
- local count = #keypoints
88
- local cursor, b = beginSeqWrite(ch, "NumberSequence", count, NUMSEQ_KP_BYTES)
89
- if not cursor then
90
- return
91
- end
92
- local off = cursor :: number
93
- local buf = b :: buffer
94
- for i = 1, count do
95
- local kp = keypoints[i]
96
- writef32(buf, off, kp.Time)
97
- writef32(buf, off + 4, kp.Value)
98
- writef32(buf, off + 8, kp.Envelope)
99
- off += NUMSEQ_KP_BYTES
100
- end
101
- end
102
-
103
- local function readNumberSequence(
104
- src: buffer,
105
- pos: number,
106
- _refs: { Instance }?
107
- ): (NumberSequence, number)
108
- local count, dataStart, lenBytes = beginSeqRead(src, pos, "NumberSequence", NUMSEQ_KP_BYTES)
109
- if count == 0 then
110
- return NumberSequence.new(0), lenBytes
111
- end
112
-
113
- local keypoints = table.create(count)
114
- local off = dataStart
115
- for i = 1, count do
116
- keypoints[i] = NumberSequenceKeypoint.new(
117
- readf32(src, off),
118
- readf32(src, off + 4),
119
- readf32(src, off + 8)
120
- )
121
- off += NUMSEQ_KP_BYTES
122
- end
123
- return NumberSequence.new(keypoints), lenBytes + count * NUMSEQ_KP_BYTES
124
- end
125
-
126
- local function writeColorSequence(ch: Types.ChannelState, value: ColorSequence): ()
127
- local keypoints = value.Keypoints
128
- local count = #keypoints
129
- local cursor, b = beginSeqWrite(ch, "ColorSequence", count, COLSEQ_KP_BYTES)
130
- if not cursor then
131
- return
132
- end
133
- local off = cursor :: number
134
- local buf = b :: buffer
135
- for i = 1, count do
136
- local kp = keypoints[i]
137
- local c = kp.Value
138
- writef32(buf, off, kp.Time)
139
- writeu8(buf, off + 4, round(clamp(c.R, 0, 1) * U8_MAX))
140
- writeu8(buf, off + 5, round(clamp(c.G, 0, 1) * U8_MAX))
141
- writeu8(buf, off + 6, round(clamp(c.B, 0, 1) * U8_MAX))
142
- off += COLSEQ_KP_BYTES
143
- end
144
- end
145
-
146
- local function readColorSequence(
147
- src: buffer,
148
- pos: number,
149
- _refs: { Instance }?
150
- ): (ColorSequence, number)
151
- local count, dataStart, lenBytes = beginSeqRead(src, pos, "ColorSequence", COLSEQ_KP_BYTES)
152
- if count == 0 then
153
- return ColorSequence.new(Color3.new()), lenBytes
154
- end
155
-
156
- local keypoints = table.create(count)
157
- local off = dataStart
158
- for i = 1, count do
159
- keypoints[i] = ColorSequenceKeypoint.new(
160
- readf32(src, off),
161
- Color3.fromRGB(readu8(src, off + 4), readu8(src, off + 5), readu8(src, off + 6))
162
- )
163
- off += COLSEQ_KP_BYTES
164
- end
165
- return ColorSequence.new(keypoints), lenBytes + count * COLSEQ_KP_BYTES
166
- end
167
-
168
- -- Public -----------------------------------------------------------------
169
-
170
- local Sequence = {}
171
-
172
- Sequence.numberSequence = table.freeze({
173
- _typeCheck = "NumberSequence",
174
- write = writeNumberSequence,
175
- read = readNumberSequence,
176
- })
177
-
178
- Sequence.colorSequence = table.freeze({
179
- _typeCheck = "ColorSequence",
180
- write = writeColorSequence,
181
- read = readColorSequence,
182
- })
183
-
184
- return table.freeze(Sequence)
@@ -1,94 +0,0 @@
1
- --!strict
2
- --!native
3
- -- UTF-8 string codec. __call yields a length-bounded variant.
4
-
5
- local Base = require(script.Parent.Parent.Base)
6
- local Log = require(script.Parent.Parent.Parent.util.Log)
7
- local Types = require(script.Parent.Parent.Parent.Types)
8
- local Varint = require(script.Parent.Parent.primitive.Varint)
9
-
10
- -- Private ----------------------------------------------------------------
11
-
12
- local alloc = Base.alloc
13
- local INLINE_MAX = Varint.INLINE_MAX
14
-
15
- local function writeString(ch: Types.ChannelState, value: string): ()
16
- local len = #value
17
- local cursor = ch.cursor
18
-
19
- -- Single-byte length fast path skips the full varint encode.
20
- if len <= INLINE_MAX then
21
- if cursor + 1 + len > ch.size then
22
- alloc(ch, 1 + len)
23
- end
24
- local b = ch.buff
25
- buffer.writeu8(b, cursor, len)
26
- if len > 0 then
27
- buffer.writestring(b, cursor + 1, value)
28
- end
29
- ch.cursor = cursor + 1 + len
30
- return
31
- end
32
-
33
- Varint.write(ch, len)
34
- cursor = ch.cursor
35
- if cursor + len > ch.size then
36
- alloc(ch, len)
37
- end
38
- buffer.writestring(ch.buff, cursor, value)
39
- ch.cursor = cursor + len
40
- end
41
-
42
- local readLengthPrefix = Varint.readLengthPrefix
43
-
44
- local function readString(src: buffer, pos: number, _refs: { Instance }?): (string, number)
45
- local len, lenBytes = readLengthPrefix(src, pos)
46
- if len == 0 then
47
- return "", lenBytes
48
- end
49
-
50
- local dataStart = pos + lenBytes
51
- if dataStart + len > buffer.len(src) then
52
- Log.error(`length {len}B exceeds remaining buffer`)
53
- end
54
- return buffer.readstring(src, dataStart, len), lenBytes + len
55
- end
56
-
57
- -- _maxStringLength lets Gate.validate reject oversized values send-side.
58
- local function boundedFactory(_self, maxLength: number): Types.InternalCodec<string>
59
- Log.assert(maxLength > 0, "maxLength must be positive")
60
-
61
- return table.freeze({
62
- _typeCheck = "string",
63
- _maxStringLength = maxLength,
64
- write = function(ch: Types.ChannelState, value: string): ()
65
- if #value > maxLength then
66
- Log.error(`length {#value} exceeds max {maxLength}`)
67
- end
68
- writeString(ch, value)
69
- end,
70
- read = function(src: buffer, pos: number, _refs: { Instance }?): (string, number)
71
- local len, lenBytes = readLengthPrefix(src, pos)
72
- if len > maxLength then
73
- Log.error(`length {len} exceeds max {maxLength}`)
74
- end
75
- if len == 0 then
76
- return "", lenBytes
77
- end
78
-
79
- local dataStart = pos + lenBytes
80
- if dataStart + len > buffer.len(src) then
81
- Log.error(`length {len}B exceeds remaining buffer`)
82
- end
83
- return buffer.readstring(src, dataStart, len), lenBytes + len
84
- end,
85
- })
86
- end
87
-
88
- -- Public -----------------------------------------------------------------
89
-
90
- return table.freeze(setmetatable({
91
- _typeCheck = "string",
92
- write = writeString,
93
- read = readString,
94
- }, table.freeze({ __call = boundedFactory })))
@@ -1,46 +0,0 @@
1
- --!strict
2
- --!native
3
- -- UDim (8B) and UDim2 (16B) codecs. Scale = f32, Offset = i32.
4
-
5
- local Base = require(script.Parent.Parent.Base)
6
- local Signed = require(script.Parent.Parent.primitive.Signed)
7
-
8
- -- Private ----------------------------------------------------------------
9
-
10
- local writef32 = buffer.writef32
11
- local readf32 = buffer.readf32
12
- local writeI32 = Signed.writeI32
13
- local readi32 = buffer.readi32
14
-
15
- local function writeUDim(b: buffer, off: number, value: UDim): ()
16
- writef32(b, off, value.Scale)
17
- writeI32(b, off + 4, value.Offset)
18
- end
19
-
20
- local function readUDim(b: buffer, off: number): UDim
21
- return UDim.new(readf32(b, off), readi32(b, off + 4))
22
- end
23
-
24
- local function writeUDim2(b: buffer, off: number, value: UDim2): ()
25
- local x, y = value.X, value.Y
26
- writef32(b, off, x.Scale)
27
- writeI32(b, off + 4, x.Offset)
28
- writef32(b, off + 8, y.Scale)
29
- writeI32(b, off + 12, y.Offset)
30
- end
31
-
32
- local function readUDim2(b: buffer, off: number): UDim2
33
- return UDim2.new(
34
- UDim.new(readf32(b, off), readi32(b, off + 4)),
35
- UDim.new(readf32(b, off + 8), readi32(b, off + 12))
36
- )
37
- end
38
-
39
- -- Public -----------------------------------------------------------------
40
-
41
- local UDimCodec = {}
42
-
43
- UDimCodec.udim = Base.define(8, writeUDim, readUDim, { _typeCheck = "UDim" })
44
- UDimCodec.udim2 = Base.define(16, writeUDim2, readUDim2, { _typeCheck = "UDim2" })
45
-
46
- return table.freeze(UDimCodec)
@@ -1,130 +0,0 @@
1
- --!strict
2
- --!native
3
- -- Vector2 / Vector3 codecs. __call yields a quantized variant.
4
-
5
- local Base = require(script.Parent.Parent.Base)
6
- local Quantize = require(script.Parent.Parent.Parent.util.Quantize)
7
- local Types = require(script.Parent.Parent.Parent.Types)
8
-
9
- -- Private ----------------------------------------------------------------
10
-
11
- local alloc = Base.alloc
12
- local writef32 = buffer.writef32
13
- local readf32 = buffer.readf32
14
- local clamp = math.clamp
15
- local round = math.round
16
-
17
- local function writeVec2(b: buffer, off: number, value: Vector2): ()
18
- writef32(b, off, value.X)
19
- writef32(b, off + 4, value.Y)
20
- end
21
-
22
- local function readVec2(b: buffer, off: number): Vector2
23
- return Vector2.new(readf32(b, off), readf32(b, off + 4))
24
- end
25
-
26
- local function writeVec3(b: buffer, off: number, value: Vector3): ()
27
- writef32(b, off, value.X)
28
- writef32(b, off + 4, value.Y)
29
- writef32(b, off + 8, value.Z)
30
- end
31
-
32
- local function readVec3(b: buffer, off: number): Vector3
33
- return Vector3.new(readf32(b, off), readf32(b, off + 4), readf32(b, off + 8))
34
- end
35
-
36
- local function quantizeVec2(
37
- _self,
38
- rangeMin: number,
39
- rangeMax: number,
40
- precision: number
41
- ): Types.InternalCodec<Vector2>
42
- -- Degenerate range: emit nothing, decode to the constant.
43
- if rangeMax - rangeMin == 0 then
44
- return Base.constant(Vector2.new(rangeMin, rangeMin))
45
- end
46
-
47
- local compBytes, wfn, rfn, scale, invScale, delta =
48
- Quantize.setup("Lync.vec2", rangeMin, rangeMax, precision)
49
- local totalSize = compBytes * 2
50
-
51
- return Base.define(totalSize, function(b: buffer, off: number, value: Vector2): ()
52
- wfn(b, off, round(clamp(value.X - rangeMin, 0, delta) * scale))
53
- wfn(b, off + compBytes, round(clamp(value.Y - rangeMin, 0, delta) * scale))
54
- end, function(b: buffer, off: number): Vector2
55
- return Vector2.new(
56
- rfn(b, off) * invScale + rangeMin,
57
- rfn(b, off + compBytes) * invScale + rangeMin
58
- )
59
- end, { _typeCheck = "Vector2", _min = rangeMin, _max = rangeMax })
60
- end
61
-
62
- local function quantizeVec3(
63
- _self,
64
- rangeMin: number,
65
- rangeMax: number,
66
- precision: number
67
- ): Types.InternalCodec<Vector3>
68
- if rangeMax - rangeMin == 0 then
69
- return Base.constant(Vector3.new(rangeMin, rangeMin, rangeMin))
70
- end
71
-
72
- local compBytes, wfn, rfn, scale, invScale, delta =
73
- Quantize.setup("Lync.vec3", rangeMin, rangeMax, precision)
74
- local totalSize = compBytes * 3
75
- local off2 = compBytes * 2
76
-
77
- return Base.define(totalSize, function(b: buffer, off: number, value: Vector3): ()
78
- wfn(b, off, round(clamp(value.X - rangeMin, 0, delta) * scale))
79
- wfn(b, off + compBytes, round(clamp(value.Y - rangeMin, 0, delta) * scale))
80
- wfn(b, off + off2, round(clamp(value.Z - rangeMin, 0, delta) * scale))
81
- end, function(b: buffer, off: number): Vector3
82
- return Vector3.new(
83
- rfn(b, off) * invScale + rangeMin,
84
- rfn(b, off + compBytes) * invScale + rangeMin,
85
- rfn(b, off + off2) * invScale + rangeMin
86
- )
87
- end, { _typeCheck = "Vector3", _min = rangeMin, _max = rangeMax })
88
- end
89
-
90
- -- Public -----------------------------------------------------------------
91
-
92
- local VectorCodec = {}
93
-
94
- VectorCodec.vec2 = table.freeze(setmetatable({
95
- _size = 8,
96
- _directWrite = writeVec2,
97
- _directRead = readVec2,
98
- _typeCheck = "Vector2",
99
- write = function(ch: Types.ChannelState, value: Vector2): ()
100
- local cursor = ch.cursor
101
- if cursor + 8 > ch.size then
102
- alloc(ch, 8)
103
- end
104
- writeVec2(ch.buff, cursor, value)
105
- ch.cursor = cursor + 8
106
- end,
107
- read = function(src: buffer, pos: number, _refs: { Instance }?): (Vector2, number)
108
- return readVec2(src, pos), 8
109
- end,
110
- }, table.freeze({ __call = quantizeVec2 })))
111
-
112
- VectorCodec.vec3 = table.freeze(setmetatable({
113
- _size = 12,
114
- _directWrite = writeVec3,
115
- _directRead = readVec3,
116
- _typeCheck = "Vector3",
117
- write = function(ch: Types.ChannelState, value: Vector3): ()
118
- local cursor = ch.cursor
119
- if cursor + 12 > ch.size then
120
- alloc(ch, 12)
121
- end
122
- writeVec3(ch.buff, cursor, value)
123
- ch.cursor = cursor + 12
124
- end,
125
- read = function(src: buffer, pos: number, _refs: { Instance }?): (Vector3, number)
126
- return readVec3(src, pos), 12
127
- end,
128
- }, table.freeze({ __call = quantizeVec3 })))
129
-
130
- return table.freeze(VectorCodec)