roblox-opencode 1.0.0 → 1.0.2

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 (246) hide show
  1. package/README.md +112 -122
  2. package/commands/setup-game.md +108 -108
  3. package/commands/sync-check.md +53 -53
  4. package/core/roblox-core.md +93 -93
  5. package/dist/server.js +189 -167
  6. package/package.json +35 -35
  7. package/skills/roblox-analytics/SKILL.md +277 -277
  8. package/skills/roblox-analytics/references/event-batcher.luau +75 -75
  9. package/skills/roblox-animation-vfx/SKILL.md +1325 -1325
  10. package/skills/roblox-architecture/SKILL.md +877 -863
  11. package/skills/roblox-architecture/references/combat-systems.md +1381 -1381
  12. package/skills/roblox-code-review/SKILL.md +686 -686
  13. package/skills/roblox-data/SKILL.md +889 -889
  14. package/skills/roblox-data/references/inventory-systems.md +1729 -1729
  15. package/skills/roblox-debug/SKILL.md +98 -98
  16. package/skills/roblox-gui/SKILL.md +1103 -1103
  17. package/skills/roblox-gui-fusion/SKILL.md +150 -150
  18. package/skills/roblox-gui-fusion/references/inventory.luau +427 -427
  19. package/skills/roblox-gui-fusion/references/settings-menu.luau +579 -579
  20. package/skills/roblox-gui-fusion/references/shop.luau +411 -411
  21. package/skills/roblox-luau-mastery/SKILL.md +1618 -1519
  22. package/skills/roblox-monetization/SKILL.md +1084 -1084
  23. package/skills/roblox-monetization/references/process-receipt.luau +131 -131
  24. package/skills/roblox-networking/SKILL.md +669 -669
  25. package/skills/roblox-networking/references/remote-validator.luau +193 -193
  26. package/skills/roblox-publish-checklist/SKILL.md +127 -127
  27. package/skills/roblox-runtime/SKILL.md +753 -753
  28. package/skills/roblox-sharp-edges/SKILL.md +294 -294
  29. package/skills/roblox-sync/SKILL.md +126 -126
  30. package/skills/roblox-testing/SKILL.md +943 -943
  31. package/skills/roblox-tooling/SKILL.md +149 -149
  32. package/vendor/LICENSES/ProfileStore-LICENSE +201 -201
  33. package/vendor/LICENSES/RbxUtil-LICENSE +7 -7
  34. package/vendor/LICENSES/promise-LICENSE +20 -20
  35. package/vendor/LICENSES/t-LICENSE +21 -21
  36. package/vendor/LICENSES/testez-LICENSE +200 -200
  37. package/vendor/README.md +83 -83
  38. package/vendor/fusion/Animation/ExternalTime.luau +83 -83
  39. package/vendor/fusion/Animation/Spring.luau +321 -321
  40. package/vendor/fusion/Animation/Stopwatch.luau +127 -127
  41. package/vendor/fusion/Animation/Tween.luau +187 -187
  42. package/vendor/fusion/Animation/getTweenDuration.luau +27 -27
  43. package/vendor/fusion/Animation/getTweenRatio.luau +47 -47
  44. package/vendor/fusion/Animation/lerpType.luau +163 -163
  45. package/vendor/fusion/Animation/packType.luau +99 -99
  46. package/vendor/fusion/Animation/springCoefficients.luau +80 -80
  47. package/vendor/fusion/Animation/unpackType.luau +102 -102
  48. package/vendor/fusion/Colour/Oklab.luau +70 -70
  49. package/vendor/fusion/Colour/sRGB.luau +54 -54
  50. package/vendor/fusion/External.luau +167 -167
  51. package/vendor/fusion/ExternalDebug.luau +69 -69
  52. package/vendor/fusion/Graph/Observer.luau +113 -113
  53. package/vendor/fusion/Graph/castToGraph.luau +28 -28
  54. package/vendor/fusion/Graph/change.luau +80 -80
  55. package/vendor/fusion/Graph/depend.luau +32 -32
  56. package/vendor/fusion/Graph/evaluate.luau +55 -55
  57. package/vendor/fusion/Instances/Attribute.luau +57 -57
  58. package/vendor/fusion/Instances/AttributeChange.luau +46 -46
  59. package/vendor/fusion/Instances/AttributeOut.luau +63 -63
  60. package/vendor/fusion/Instances/Child.luau +21 -21
  61. package/vendor/fusion/Instances/Children.luau +147 -147
  62. package/vendor/fusion/Instances/Hydrate.luau +32 -32
  63. package/vendor/fusion/Instances/New.luau +52 -52
  64. package/vendor/fusion/Instances/OnChange.luau +49 -49
  65. package/vendor/fusion/Instances/OnEvent.luau +53 -53
  66. package/vendor/fusion/Instances/Out.luau +69 -69
  67. package/vendor/fusion/Instances/applyInstanceProps.luau +148 -148
  68. package/vendor/fusion/Instances/defaultProps.luau +194 -194
  69. package/vendor/fusion/LICENSE +21 -21
  70. package/vendor/fusion/Logging/formatError.luau +48 -48
  71. package/vendor/fusion/Logging/messages.luau +51 -51
  72. package/vendor/fusion/Logging/parseError.luau +24 -24
  73. package/vendor/fusion/Memory/checkLifetime.luau +133 -133
  74. package/vendor/fusion/Memory/deriveScope.luau +23 -23
  75. package/vendor/fusion/Memory/deriveScopeImpl.luau +44 -44
  76. package/vendor/fusion/Memory/doCleanup.luau +78 -78
  77. package/vendor/fusion/Memory/innerScope.luau +33 -33
  78. package/vendor/fusion/Memory/legacyCleanup.luau +17 -17
  79. package/vendor/fusion/Memory/needsDestruction.luau +16 -16
  80. package/vendor/fusion/Memory/poisonScope.luau +33 -33
  81. package/vendor/fusion/Memory/scopePool.luau +54 -54
  82. package/vendor/fusion/Memory/scoped.luau +26 -26
  83. package/vendor/fusion/Memory/whichLivesLonger.luau +74 -74
  84. package/vendor/fusion/RobloxExternal.luau +97 -97
  85. package/vendor/fusion/State/Computed.luau +138 -138
  86. package/vendor/fusion/State/For/Disassembly.luau +210 -210
  87. package/vendor/fusion/State/For/ForTypes.luau +30 -30
  88. package/vendor/fusion/State/For/init.luau +109 -109
  89. package/vendor/fusion/State/ForKeys.luau +93 -93
  90. package/vendor/fusion/State/ForPairs.luau +96 -96
  91. package/vendor/fusion/State/ForValues.luau +93 -93
  92. package/vendor/fusion/State/Value.luau +87 -87
  93. package/vendor/fusion/State/castToState.luau +25 -25
  94. package/vendor/fusion/State/peek.luau +30 -30
  95. package/vendor/fusion/Types.luau +314 -314
  96. package/vendor/fusion/Utility/Contextual.luau +90 -90
  97. package/vendor/fusion/Utility/Safe.luau +22 -22
  98. package/vendor/fusion/Utility/isSimilar.luau +29 -29
  99. package/vendor/fusion/Utility/merge.luau +35 -35
  100. package/vendor/fusion/Utility/nameOf.luau +34 -34
  101. package/vendor/fusion/Utility/never.luau +13 -13
  102. package/vendor/fusion/Utility/nicknames.luau +10 -10
  103. package/vendor/fusion/Utility/xtypeof.luau +26 -26
  104. package/vendor/fusion/init.luau +82 -82
  105. package/vendor/profilestore/init.luau +2242 -2242
  106. package/vendor/promise/init.luau +1982 -1982
  107. package/vendor/rbxutil/buffer-util/Buffer.test.luau +25 -25
  108. package/vendor/rbxutil/buffer-util/BufferReader.luau +228 -228
  109. package/vendor/rbxutil/buffer-util/BufferWriter.luau +269 -269
  110. package/vendor/rbxutil/buffer-util/DataTypeBuffer.luau +223 -223
  111. package/vendor/rbxutil/buffer-util/Types.luau +60 -60
  112. package/vendor/rbxutil/buffer-util/index.d.ts +153 -153
  113. package/vendor/rbxutil/buffer-util/init.luau +41 -41
  114. package/vendor/rbxutil/buffer-util/package.json +16 -16
  115. package/vendor/rbxutil/buffer-util/wally.toml +9 -9
  116. package/vendor/rbxutil/comm/Client/ClientComm.luau +232 -232
  117. package/vendor/rbxutil/comm/Client/ClientRemoteProperty.luau +156 -156
  118. package/vendor/rbxutil/comm/Client/ClientRemoteSignal.luau +109 -109
  119. package/vendor/rbxutil/comm/Client/init.luau +135 -135
  120. package/vendor/rbxutil/comm/Server/RemoteProperty.luau +295 -295
  121. package/vendor/rbxutil/comm/Server/RemoteSignal.luau +211 -211
  122. package/vendor/rbxutil/comm/Server/ServerComm.luau +211 -211
  123. package/vendor/rbxutil/comm/Server/init.luau +140 -140
  124. package/vendor/rbxutil/comm/Types.luau +18 -18
  125. package/vendor/rbxutil/comm/Util.luau +27 -27
  126. package/vendor/rbxutil/comm/init.luau +35 -35
  127. package/vendor/rbxutil/comm/wally.toml +13 -13
  128. package/vendor/rbxutil/component/init.luau +759 -759
  129. package/vendor/rbxutil/component/init.test.luau +311 -311
  130. package/vendor/rbxutil/component/wally.toml +14 -14
  131. package/vendor/rbxutil/concur/init.luau +542 -542
  132. package/vendor/rbxutil/concur/init.test.luau +364 -364
  133. package/vendor/rbxutil/concur/wally.toml +8 -8
  134. package/vendor/rbxutil/enum-list/init.luau +101 -101
  135. package/vendor/rbxutil/enum-list/init.test.luau +91 -91
  136. package/vendor/rbxutil/enum-list/wally.toml +8 -8
  137. package/vendor/rbxutil/find/index.d.ts +20 -20
  138. package/vendor/rbxutil/find/init.luau +44 -44
  139. package/vendor/rbxutil/find/package.json +17 -17
  140. package/vendor/rbxutil/find/wally.toml +8 -8
  141. package/vendor/rbxutil/input/Gamepad.luau +559 -559
  142. package/vendor/rbxutil/input/Keyboard.luau +124 -124
  143. package/vendor/rbxutil/input/Mouse.luau +278 -278
  144. package/vendor/rbxutil/input/PreferredInput.luau +91 -91
  145. package/vendor/rbxutil/input/Touch.luau +120 -120
  146. package/vendor/rbxutil/input/init.luau +33 -33
  147. package/vendor/rbxutil/input/wally.toml +12 -12
  148. package/vendor/rbxutil/loader/index.d.ts +15 -15
  149. package/vendor/rbxutil/loader/init.luau +137 -137
  150. package/vendor/rbxutil/loader/wally.toml +8 -8
  151. package/vendor/rbxutil/log/index.d.ts +38 -38
  152. package/vendor/rbxutil/log/init.luau +746 -746
  153. package/vendor/rbxutil/log/wally.toml +8 -8
  154. package/vendor/rbxutil/net/init.luau +190 -190
  155. package/vendor/rbxutil/net/wally.toml +8 -8
  156. package/vendor/rbxutil/option/index.d.ts +44 -44
  157. package/vendor/rbxutil/option/init.luau +489 -489
  158. package/vendor/rbxutil/option/init.test.luau +342 -342
  159. package/vendor/rbxutil/option/wally.toml +8 -8
  160. package/vendor/rbxutil/pid/index.d.ts +53 -53
  161. package/vendor/rbxutil/pid/init.luau +195 -195
  162. package/vendor/rbxutil/pid/package.json +16 -16
  163. package/vendor/rbxutil/pid/wally.toml +9 -9
  164. package/vendor/rbxutil/quaternion/index.d.ts +117 -117
  165. package/vendor/rbxutil/quaternion/init.luau +570 -570
  166. package/vendor/rbxutil/quaternion/package.json +16 -16
  167. package/vendor/rbxutil/quaternion/wally.toml +9 -9
  168. package/vendor/rbxutil/query/index.d.ts +43 -43
  169. package/vendor/rbxutil/query/init.luau +117 -117
  170. package/vendor/rbxutil/query/package.json +18 -18
  171. package/vendor/rbxutil/query/wally.toml +9 -9
  172. package/vendor/rbxutil/sequent/index.d.ts +28 -28
  173. package/vendor/rbxutil/sequent/init.luau +340 -340
  174. package/vendor/rbxutil/sequent/package.json +16 -16
  175. package/vendor/rbxutil/sequent/wally.toml +9 -9
  176. package/vendor/rbxutil/ser/init.luau +175 -175
  177. package/vendor/rbxutil/ser/init.test.luau +50 -50
  178. package/vendor/rbxutil/ser/wally.toml +11 -11
  179. package/vendor/rbxutil/shake/index.d.ts +36 -36
  180. package/vendor/rbxutil/shake/init.luau +532 -532
  181. package/vendor/rbxutil/shake/init.test.luau +267 -267
  182. package/vendor/rbxutil/shake/package.json +16 -16
  183. package/vendor/rbxutil/shake/wally.toml +9 -9
  184. package/vendor/rbxutil/signal/index.d.ts +100 -100
  185. package/vendor/rbxutil/signal/init.luau +432 -432
  186. package/vendor/rbxutil/signal/init.test.luau +190 -190
  187. package/vendor/rbxutil/signal/package.json +17 -17
  188. package/vendor/rbxutil/signal/wally.toml +9 -9
  189. package/vendor/rbxutil/silo/TableWatcher.luau +65 -65
  190. package/vendor/rbxutil/silo/Util.luau +55 -55
  191. package/vendor/rbxutil/silo/init.luau +338 -338
  192. package/vendor/rbxutil/silo/init.test.luau +215 -215
  193. package/vendor/rbxutil/silo/wally.toml +8 -8
  194. package/vendor/rbxutil/spring/index.d.ts +40 -40
  195. package/vendor/rbxutil/spring/init.luau +97 -97
  196. package/vendor/rbxutil/spring/package.json +17 -17
  197. package/vendor/rbxutil/spring/wally.toml +8 -8
  198. package/vendor/rbxutil/stream/index.d.ts +88 -88
  199. package/vendor/rbxutil/stream/init.luau +597 -597
  200. package/vendor/rbxutil/stream/package.json +18 -18
  201. package/vendor/rbxutil/stream/wally.toml +9 -9
  202. package/vendor/rbxutil/streamable/Streamable.luau +202 -202
  203. package/vendor/rbxutil/streamable/StreamableUtil.luau +80 -80
  204. package/vendor/rbxutil/streamable/init.luau +8 -8
  205. package/vendor/rbxutil/streamable/wally.toml +12 -12
  206. package/vendor/rbxutil/symbol/init.luau +56 -56
  207. package/vendor/rbxutil/symbol/init.test.luau +37 -37
  208. package/vendor/rbxutil/symbol/wally.toml +8 -8
  209. package/vendor/rbxutil/table-util/init.luau +938 -938
  210. package/vendor/rbxutil/table-util/init.test.luau +439 -439
  211. package/vendor/rbxutil/task-queue/index.d.ts +27 -27
  212. package/vendor/rbxutil/task-queue/init.luau +97 -97
  213. package/vendor/rbxutil/task-queue/wally.toml +8 -8
  214. package/vendor/rbxutil/timer/index.d.ts +81 -81
  215. package/vendor/rbxutil/timer/init.luau +249 -249
  216. package/vendor/rbxutil/timer/init.test.luau +73 -73
  217. package/vendor/rbxutil/timer/wally.toml +11 -11
  218. package/vendor/rbxutil/tree/index.d.ts +15 -15
  219. package/vendor/rbxutil/tree/init.luau +137 -137
  220. package/vendor/rbxutil/tree/wally.toml +8 -8
  221. package/vendor/rbxutil/trove/index.d.ts +46 -46
  222. package/vendor/rbxutil/trove/init.luau +787 -787
  223. package/vendor/rbxutil/trove/init.test.luau +203 -203
  224. package/vendor/rbxutil/trove/wally.toml +8 -8
  225. package/vendor/rbxutil/typed-remote/init.luau +196 -196
  226. package/vendor/rbxutil/typed-remote/wally.toml +8 -8
  227. package/vendor/rbxutil/wait-for/index.d.ts +17 -17
  228. package/vendor/rbxutil/wait-for/init.luau +257 -257
  229. package/vendor/rbxutil/wait-for/init.test.luau +182 -182
  230. package/vendor/rbxutil/wait-for/wally.toml +11 -11
  231. package/vendor/t/t.lua +1350 -1350
  232. package/vendor/testez/Context.lua +26 -26
  233. package/vendor/testez/Expectation.lua +311 -311
  234. package/vendor/testez/ExpectationContext.lua +38 -38
  235. package/vendor/testez/LifecycleHooks.lua +89 -89
  236. package/vendor/testez/Reporters/TeamCityReporter.lua +101 -101
  237. package/vendor/testez/Reporters/TextReporter.lua +105 -105
  238. package/vendor/testez/Reporters/TextReporterQuiet.lua +96 -96
  239. package/vendor/testez/TestBootstrap.lua +146 -146
  240. package/vendor/testez/TestEnum.lua +27 -27
  241. package/vendor/testez/TestPlan.lua +304 -304
  242. package/vendor/testez/TestPlanner.lua +39 -39
  243. package/vendor/testez/TestResults.lua +111 -111
  244. package/vendor/testez/TestRunner.lua +188 -188
  245. package/vendor/testez/TestSession.lua +243 -243
  246. package/vendor/testez/init.lua +39 -39
@@ -1,269 +1,269 @@
1
- --!native
2
-
3
- local MAX_SIZE = 1073741824
4
-
5
- local DataTypeBuffer = require(script.Parent.DataTypeBuffer)
6
- local Types = require(script.Parent.Types)
7
-
8
- --[=[
9
- @class BufferWriter
10
-
11
- A BufferWriter is an abstraction wrapper for `buffer` objects
12
- that provides a convenient way of writing data to buffers.
13
-
14
- The internal buffer is automatically resized to fit the data
15
- that is being written.
16
- ]=]
17
- local BufferWriter = {}
18
- BufferWriter.__index = BufferWriter
19
-
20
- function BufferWriter.new(initialSize: number?): Types.BufferWriter
21
- local size = if typeof(initialSize) == "number" then math.clamp(initialSize, 0, MAX_SIZE) else 0
22
-
23
- local self = setmetatable({
24
- _buffer = buffer.create(size),
25
- _cursor = 0,
26
- _size = 0,
27
- }, BufferWriter)
28
-
29
- return self
30
- end
31
-
32
- function BufferWriter:_resizeUpTo(desiredSize: number)
33
- if desiredSize > MAX_SIZE then
34
- error(`cannot resize buffer to {desiredSize} bytes (max size: {MAX_SIZE} bytes)`, 3)
35
- end
36
-
37
- self._size = math.max(self._size, desiredSize)
38
-
39
- if desiredSize <= buffer.len(self._buffer) then
40
- return
41
- end
42
-
43
- local newSize = desiredSize
44
-
45
- local powerOfTwo = math.log(desiredSize, 2)
46
- if math.floor(powerOfTwo) ~= powerOfTwo then
47
- newSize = 2 ^ (math.floor(powerOfTwo) + 1)
48
- end
49
-
50
- local oldBuffer = self._buffer
51
- local newBuffer = buffer.create(newSize)
52
-
53
- buffer.copy(newBuffer, 0, oldBuffer, 0)
54
-
55
- self._buffer = newBuffer
56
- end
57
-
58
- --[=[
59
- Write a signed 8-bit integer to the buffer.
60
- ]=]
61
- function BufferWriter:WriteInt8(int8: number)
62
- self:_resizeUpTo(self._cursor + 1)
63
- buffer.writei8(self._buffer, self._cursor, int8)
64
- self._cursor += 1
65
- end
66
-
67
- --[=[
68
- Write an unsigned 8-bit integer to the buffer.
69
- ]=]
70
- function BufferWriter:WriteUInt8(uint8: number)
71
- self:_resizeUpTo(self._cursor + 1)
72
- buffer.writeu8(self._buffer, self._cursor, uint8)
73
- self._cursor += 1
74
- end
75
-
76
- --[=[
77
- Write a signed 16-bit integer to the buffer.
78
- ]=]
79
- function BufferWriter:WriteInt16(int16: number)
80
- self:_resizeUpTo(self._cursor + 2)
81
- buffer.writei16(self._buffer, self._cursor, int16)
82
- self._cursor += 2
83
- end
84
-
85
- --[=[
86
- Write an unsigned 16-bit integer to the buffer.
87
- ]=]
88
- function BufferWriter:WriteUInt16(uint16: number)
89
- self:_resizeUpTo(self._cursor + 2)
90
- buffer.writeu16(self._buffer, self._cursor, uint16)
91
- self._cursor += 2
92
- end
93
-
94
- --[=[
95
- Write a signed 32-bit integer to the buffer.
96
- ]=]
97
- function BufferWriter:WriteInt32(int32: number)
98
- self:_resizeUpTo(self._cursor + 4)
99
- buffer.writei32(self._buffer, self._cursor, int32)
100
- self._cursor += 4
101
- end
102
-
103
- --[=[
104
- Write an unsigned 32-bit integer to the buffer.
105
- ]=]
106
- function BufferWriter:WriteUInt32(uint32: number)
107
- self:_resizeUpTo(self._cursor + 4)
108
- buffer.writeu32(self._buffer, self._cursor, uint32)
109
- self._cursor += 4
110
- end
111
-
112
- --[=[
113
- Write a 32-bit single-precision float to the buffer.
114
- ]=]
115
- function BufferWriter:WriteFloat32(f32: number)
116
- self:_resizeUpTo(self._cursor + 4)
117
- buffer.writef32(self._buffer, self._cursor, f32)
118
- self._cursor += 4
119
- end
120
-
121
- --[=[
122
- Write a 64-bit double-precision float to the buffer.
123
- ]=]
124
- function BufferWriter:WriteFloat64(f64: number)
125
- self:_resizeUpTo(self._cursor + 8)
126
- buffer.writef64(self._buffer, self._cursor, f64)
127
- self._cursor += 8
128
- end
129
-
130
- --[=[
131
- Write a boolean to the buffer.
132
- ]=]
133
- function BufferWriter:WriteBool(bool: boolean)
134
- self:WriteUInt8(if bool then 1 else 0)
135
- end
136
-
137
- --[=[
138
- Write a string to the buffer. An optional `length` argument can
139
- be provided to limit the number of bytes read from the string.
140
-
141
- :::info
142
- An extra 32-bit integer is stored before the string to mark the
143
- length of the string. If the length of the string is always
144
- known, it is more memory-efficient to use `WriteStringRaw`.
145
- :::
146
- ]=]
147
- function BufferWriter:WriteString(str: string, length: number?)
148
- local len = if length then math.min(#str, length) else #str
149
- local size = len + 4
150
- self:_resizeUpTo(self._cursor + size)
151
- buffer.writeu32(self._buffer, self._cursor, len)
152
- buffer.writestring(self._buffer, self._cursor + 4, str, length)
153
- self._cursor += size
154
- end
155
-
156
- --[=[
157
- Write a string to the buffer. An optional `length` argument can
158
- be provided to limit the number of bytes read from the string.
159
-
160
- :::info
161
- The length of the string must be known to the reader in order to
162
- read this string from the buffer, as the length of the string is
163
- not stored in the buffer. For strings of dynamic/unknown length,
164
- use `WriteString` instead.
165
- :::
166
- ]=]
167
- function BufferWriter:WriteStringRaw(str: string, length: number?)
168
- local len = if length then math.min(#str, length) else #str
169
- self:_resizeUpTo(self._cursor + len)
170
- buffer.writestring(self._buffer, self._cursor, str, length)
171
- self._cursor += len
172
- end
173
-
174
- --[=[
175
- Write a DataType to the buffer.
176
-
177
- ```lua
178
- writer:WriteDataType(CFrame.new(0, 10, 5))
179
- ```
180
- ]=]
181
- function BufferWriter:WriteDataType(value: any)
182
- local t = typeof(value)
183
- local readWrite = DataTypeBuffer.ReadWrite[t]
184
- if not readWrite then
185
- error(`unsupported data type "{t}"`, 2)
186
- end
187
- readWrite.write(self, value)
188
- end
189
-
190
- --[=[
191
- Shrinks the capacity of the buffer to the current data size.
192
- ]=]
193
- function BufferWriter:Shrink()
194
- if self._size == buffer.len(self._buffer) then
195
- return
196
- end
197
-
198
- local oldBuffer = self._buffer
199
- local newBuffer = buffer.create(self._size)
200
-
201
- buffer.copy(newBuffer, 0, oldBuffer, 0, self._size)
202
-
203
- self._buffer = newBuffer
204
- end
205
-
206
- --[=[
207
- Returns the current data size of the buffer. This is _not_ necessarily
208
- equal to the capacity of the buffer.
209
- ]=]
210
- function BufferWriter:GetSize(): number
211
- return self._size
212
- end
213
-
214
- --[=[
215
- Returns the current capacity of the buffer. This is the length of the
216
- internal buffer, which is usually not the same as the length of the stored
217
- data.
218
-
219
- The buffer capacity automatically grows as data is added.
220
- ]=]
221
- function BufferWriter:GetCapacity(): number
222
- return buffer.len(self._buffer)
223
- end
224
-
225
- --[=[
226
- Sets the position of the cursor.
227
- ]=]
228
- function BufferWriter:SetCursor(position: number)
229
- position = math.floor(position)
230
- if position < 0 or position > self._size then
231
- error(`cursor position {position} out of range [0, {self._size}]`, 3)
232
- end
233
-
234
- self._cursor = position
235
- end
236
-
237
- --[=[
238
- Gets the position of the cursor.
239
- ]=]
240
- function BufferWriter:GetCursor(): number
241
- return self._cursor
242
- end
243
-
244
- --[=[
245
- Resets the position of the cursor.
246
- ]=]
247
- function BufferWriter:ResetCursor()
248
- self._cursor = 0
249
- end
250
-
251
- --[=[
252
- Returns the `buffer` object.
253
- ]=]
254
- function BufferWriter:GetBuffer(): buffer
255
- return self._buffer
256
- end
257
-
258
- --[=[
259
- Returns the string version of the internal buffer.
260
- ]=]
261
- function BufferWriter:ToString(): string
262
- return buffer.tostring(self._buffer)
263
- end
264
-
265
- function BufferWriter:__tostring()
266
- return "BufferWriter"
267
- end
268
-
269
- return BufferWriter
1
+ --!native
2
+
3
+ local MAX_SIZE = 1073741824
4
+
5
+ local DataTypeBuffer = require(script.Parent.DataTypeBuffer)
6
+ local Types = require(script.Parent.Types)
7
+
8
+ --[=[
9
+ @class BufferWriter
10
+
11
+ A BufferWriter is an abstraction wrapper for `buffer` objects
12
+ that provides a convenient way of writing data to buffers.
13
+
14
+ The internal buffer is automatically resized to fit the data
15
+ that is being written.
16
+ ]=]
17
+ local BufferWriter = {}
18
+ BufferWriter.__index = BufferWriter
19
+
20
+ function BufferWriter.new(initialSize: number?): Types.BufferWriter
21
+ local size = if typeof(initialSize) == "number" then math.clamp(initialSize, 0, MAX_SIZE) else 0
22
+
23
+ local self = setmetatable({
24
+ _buffer = buffer.create(size),
25
+ _cursor = 0,
26
+ _size = 0,
27
+ }, BufferWriter)
28
+
29
+ return self
30
+ end
31
+
32
+ function BufferWriter:_resizeUpTo(desiredSize: number)
33
+ if desiredSize > MAX_SIZE then
34
+ error(`cannot resize buffer to {desiredSize} bytes (max size: {MAX_SIZE} bytes)`, 3)
35
+ end
36
+
37
+ self._size = math.max(self._size, desiredSize)
38
+
39
+ if desiredSize <= buffer.len(self._buffer) then
40
+ return
41
+ end
42
+
43
+ local newSize = desiredSize
44
+
45
+ local powerOfTwo = math.log(desiredSize, 2)
46
+ if math.floor(powerOfTwo) ~= powerOfTwo then
47
+ newSize = 2 ^ (math.floor(powerOfTwo) + 1)
48
+ end
49
+
50
+ local oldBuffer = self._buffer
51
+ local newBuffer = buffer.create(newSize)
52
+
53
+ buffer.copy(newBuffer, 0, oldBuffer, 0)
54
+
55
+ self._buffer = newBuffer
56
+ end
57
+
58
+ --[=[
59
+ Write a signed 8-bit integer to the buffer.
60
+ ]=]
61
+ function BufferWriter:WriteInt8(int8: number)
62
+ self:_resizeUpTo(self._cursor + 1)
63
+ buffer.writei8(self._buffer, self._cursor, int8)
64
+ self._cursor += 1
65
+ end
66
+
67
+ --[=[
68
+ Write an unsigned 8-bit integer to the buffer.
69
+ ]=]
70
+ function BufferWriter:WriteUInt8(uint8: number)
71
+ self:_resizeUpTo(self._cursor + 1)
72
+ buffer.writeu8(self._buffer, self._cursor, uint8)
73
+ self._cursor += 1
74
+ end
75
+
76
+ --[=[
77
+ Write a signed 16-bit integer to the buffer.
78
+ ]=]
79
+ function BufferWriter:WriteInt16(int16: number)
80
+ self:_resizeUpTo(self._cursor + 2)
81
+ buffer.writei16(self._buffer, self._cursor, int16)
82
+ self._cursor += 2
83
+ end
84
+
85
+ --[=[
86
+ Write an unsigned 16-bit integer to the buffer.
87
+ ]=]
88
+ function BufferWriter:WriteUInt16(uint16: number)
89
+ self:_resizeUpTo(self._cursor + 2)
90
+ buffer.writeu16(self._buffer, self._cursor, uint16)
91
+ self._cursor += 2
92
+ end
93
+
94
+ --[=[
95
+ Write a signed 32-bit integer to the buffer.
96
+ ]=]
97
+ function BufferWriter:WriteInt32(int32: number)
98
+ self:_resizeUpTo(self._cursor + 4)
99
+ buffer.writei32(self._buffer, self._cursor, int32)
100
+ self._cursor += 4
101
+ end
102
+
103
+ --[=[
104
+ Write an unsigned 32-bit integer to the buffer.
105
+ ]=]
106
+ function BufferWriter:WriteUInt32(uint32: number)
107
+ self:_resizeUpTo(self._cursor + 4)
108
+ buffer.writeu32(self._buffer, self._cursor, uint32)
109
+ self._cursor += 4
110
+ end
111
+
112
+ --[=[
113
+ Write a 32-bit single-precision float to the buffer.
114
+ ]=]
115
+ function BufferWriter:WriteFloat32(f32: number)
116
+ self:_resizeUpTo(self._cursor + 4)
117
+ buffer.writef32(self._buffer, self._cursor, f32)
118
+ self._cursor += 4
119
+ end
120
+
121
+ --[=[
122
+ Write a 64-bit double-precision float to the buffer.
123
+ ]=]
124
+ function BufferWriter:WriteFloat64(f64: number)
125
+ self:_resizeUpTo(self._cursor + 8)
126
+ buffer.writef64(self._buffer, self._cursor, f64)
127
+ self._cursor += 8
128
+ end
129
+
130
+ --[=[
131
+ Write a boolean to the buffer.
132
+ ]=]
133
+ function BufferWriter:WriteBool(bool: boolean)
134
+ self:WriteUInt8(if bool then 1 else 0)
135
+ end
136
+
137
+ --[=[
138
+ Write a string to the buffer. An optional `length` argument can
139
+ be provided to limit the number of bytes read from the string.
140
+
141
+ :::info
142
+ An extra 32-bit integer is stored before the string to mark the
143
+ length of the string. If the length of the string is always
144
+ known, it is more memory-efficient to use `WriteStringRaw`.
145
+ :::
146
+ ]=]
147
+ function BufferWriter:WriteString(str: string, length: number?)
148
+ local len = if length then math.min(#str, length) else #str
149
+ local size = len + 4
150
+ self:_resizeUpTo(self._cursor + size)
151
+ buffer.writeu32(self._buffer, self._cursor, len)
152
+ buffer.writestring(self._buffer, self._cursor + 4, str, length)
153
+ self._cursor += size
154
+ end
155
+
156
+ --[=[
157
+ Write a string to the buffer. An optional `length` argument can
158
+ be provided to limit the number of bytes read from the string.
159
+
160
+ :::info
161
+ The length of the string must be known to the reader in order to
162
+ read this string from the buffer, as the length of the string is
163
+ not stored in the buffer. For strings of dynamic/unknown length,
164
+ use `WriteString` instead.
165
+ :::
166
+ ]=]
167
+ function BufferWriter:WriteStringRaw(str: string, length: number?)
168
+ local len = if length then math.min(#str, length) else #str
169
+ self:_resizeUpTo(self._cursor + len)
170
+ buffer.writestring(self._buffer, self._cursor, str, length)
171
+ self._cursor += len
172
+ end
173
+
174
+ --[=[
175
+ Write a DataType to the buffer.
176
+
177
+ ```lua
178
+ writer:WriteDataType(CFrame.new(0, 10, 5))
179
+ ```
180
+ ]=]
181
+ function BufferWriter:WriteDataType(value: any)
182
+ local t = typeof(value)
183
+ local readWrite = DataTypeBuffer.ReadWrite[t]
184
+ if not readWrite then
185
+ error(`unsupported data type "{t}"`, 2)
186
+ end
187
+ readWrite.write(self, value)
188
+ end
189
+
190
+ --[=[
191
+ Shrinks the capacity of the buffer to the current data size.
192
+ ]=]
193
+ function BufferWriter:Shrink()
194
+ if self._size == buffer.len(self._buffer) then
195
+ return
196
+ end
197
+
198
+ local oldBuffer = self._buffer
199
+ local newBuffer = buffer.create(self._size)
200
+
201
+ buffer.copy(newBuffer, 0, oldBuffer, 0, self._size)
202
+
203
+ self._buffer = newBuffer
204
+ end
205
+
206
+ --[=[
207
+ Returns the current data size of the buffer. This is _not_ necessarily
208
+ equal to the capacity of the buffer.
209
+ ]=]
210
+ function BufferWriter:GetSize(): number
211
+ return self._size
212
+ end
213
+
214
+ --[=[
215
+ Returns the current capacity of the buffer. This is the length of the
216
+ internal buffer, which is usually not the same as the length of the stored
217
+ data.
218
+
219
+ The buffer capacity automatically grows as data is added.
220
+ ]=]
221
+ function BufferWriter:GetCapacity(): number
222
+ return buffer.len(self._buffer)
223
+ end
224
+
225
+ --[=[
226
+ Sets the position of the cursor.
227
+ ]=]
228
+ function BufferWriter:SetCursor(position: number)
229
+ position = math.floor(position)
230
+ if position < 0 or position > self._size then
231
+ error(`cursor position {position} out of range [0, {self._size}]`, 3)
232
+ end
233
+
234
+ self._cursor = position
235
+ end
236
+
237
+ --[=[
238
+ Gets the position of the cursor.
239
+ ]=]
240
+ function BufferWriter:GetCursor(): number
241
+ return self._cursor
242
+ end
243
+
244
+ --[=[
245
+ Resets the position of the cursor.
246
+ ]=]
247
+ function BufferWriter:ResetCursor()
248
+ self._cursor = 0
249
+ end
250
+
251
+ --[=[
252
+ Returns the `buffer` object.
253
+ ]=]
254
+ function BufferWriter:GetBuffer(): buffer
255
+ return self._buffer
256
+ end
257
+
258
+ --[=[
259
+ Returns the string version of the internal buffer.
260
+ ]=]
261
+ function BufferWriter:ToString(): string
262
+ return buffer.tostring(self._buffer)
263
+ end
264
+
265
+ function BufferWriter:__tostring()
266
+ return "BufferWriter"
267
+ end
268
+
269
+ return BufferWriter