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.
- package/README.md +112 -122
- package/commands/setup-game.md +108 -108
- package/commands/sync-check.md +53 -53
- package/core/roblox-core.md +93 -93
- package/dist/server.js +189 -167
- package/package.json +35 -35
- package/skills/roblox-analytics/SKILL.md +277 -277
- package/skills/roblox-analytics/references/event-batcher.luau +75 -75
- package/skills/roblox-animation-vfx/SKILL.md +1325 -1325
- package/skills/roblox-architecture/SKILL.md +877 -863
- package/skills/roblox-architecture/references/combat-systems.md +1381 -1381
- package/skills/roblox-code-review/SKILL.md +686 -686
- package/skills/roblox-data/SKILL.md +889 -889
- package/skills/roblox-data/references/inventory-systems.md +1729 -1729
- package/skills/roblox-debug/SKILL.md +98 -98
- package/skills/roblox-gui/SKILL.md +1103 -1103
- package/skills/roblox-gui-fusion/SKILL.md +150 -150
- package/skills/roblox-gui-fusion/references/inventory.luau +427 -427
- package/skills/roblox-gui-fusion/references/settings-menu.luau +579 -579
- package/skills/roblox-gui-fusion/references/shop.luau +411 -411
- package/skills/roblox-luau-mastery/SKILL.md +1618 -1519
- package/skills/roblox-monetization/SKILL.md +1084 -1084
- package/skills/roblox-monetization/references/process-receipt.luau +131 -131
- package/skills/roblox-networking/SKILL.md +669 -669
- package/skills/roblox-networking/references/remote-validator.luau +193 -193
- package/skills/roblox-publish-checklist/SKILL.md +127 -127
- package/skills/roblox-runtime/SKILL.md +753 -753
- package/skills/roblox-sharp-edges/SKILL.md +294 -294
- package/skills/roblox-sync/SKILL.md +126 -126
- package/skills/roblox-testing/SKILL.md +943 -943
- package/skills/roblox-tooling/SKILL.md +149 -149
- package/vendor/LICENSES/ProfileStore-LICENSE +201 -201
- package/vendor/LICENSES/RbxUtil-LICENSE +7 -7
- package/vendor/LICENSES/promise-LICENSE +20 -20
- package/vendor/LICENSES/t-LICENSE +21 -21
- package/vendor/LICENSES/testez-LICENSE +200 -200
- package/vendor/README.md +83 -83
- package/vendor/fusion/Animation/ExternalTime.luau +83 -83
- package/vendor/fusion/Animation/Spring.luau +321 -321
- package/vendor/fusion/Animation/Stopwatch.luau +127 -127
- package/vendor/fusion/Animation/Tween.luau +187 -187
- package/vendor/fusion/Animation/getTweenDuration.luau +27 -27
- package/vendor/fusion/Animation/getTweenRatio.luau +47 -47
- package/vendor/fusion/Animation/lerpType.luau +163 -163
- package/vendor/fusion/Animation/packType.luau +99 -99
- package/vendor/fusion/Animation/springCoefficients.luau +80 -80
- package/vendor/fusion/Animation/unpackType.luau +102 -102
- package/vendor/fusion/Colour/Oklab.luau +70 -70
- package/vendor/fusion/Colour/sRGB.luau +54 -54
- package/vendor/fusion/External.luau +167 -167
- package/vendor/fusion/ExternalDebug.luau +69 -69
- package/vendor/fusion/Graph/Observer.luau +113 -113
- package/vendor/fusion/Graph/castToGraph.luau +28 -28
- package/vendor/fusion/Graph/change.luau +80 -80
- package/vendor/fusion/Graph/depend.luau +32 -32
- package/vendor/fusion/Graph/evaluate.luau +55 -55
- package/vendor/fusion/Instances/Attribute.luau +57 -57
- package/vendor/fusion/Instances/AttributeChange.luau +46 -46
- package/vendor/fusion/Instances/AttributeOut.luau +63 -63
- package/vendor/fusion/Instances/Child.luau +21 -21
- package/vendor/fusion/Instances/Children.luau +147 -147
- package/vendor/fusion/Instances/Hydrate.luau +32 -32
- package/vendor/fusion/Instances/New.luau +52 -52
- package/vendor/fusion/Instances/OnChange.luau +49 -49
- package/vendor/fusion/Instances/OnEvent.luau +53 -53
- package/vendor/fusion/Instances/Out.luau +69 -69
- package/vendor/fusion/Instances/applyInstanceProps.luau +148 -148
- package/vendor/fusion/Instances/defaultProps.luau +194 -194
- package/vendor/fusion/LICENSE +21 -21
- package/vendor/fusion/Logging/formatError.luau +48 -48
- package/vendor/fusion/Logging/messages.luau +51 -51
- package/vendor/fusion/Logging/parseError.luau +24 -24
- package/vendor/fusion/Memory/checkLifetime.luau +133 -133
- package/vendor/fusion/Memory/deriveScope.luau +23 -23
- package/vendor/fusion/Memory/deriveScopeImpl.luau +44 -44
- package/vendor/fusion/Memory/doCleanup.luau +78 -78
- package/vendor/fusion/Memory/innerScope.luau +33 -33
- package/vendor/fusion/Memory/legacyCleanup.luau +17 -17
- package/vendor/fusion/Memory/needsDestruction.luau +16 -16
- package/vendor/fusion/Memory/poisonScope.luau +33 -33
- package/vendor/fusion/Memory/scopePool.luau +54 -54
- package/vendor/fusion/Memory/scoped.luau +26 -26
- package/vendor/fusion/Memory/whichLivesLonger.luau +74 -74
- package/vendor/fusion/RobloxExternal.luau +97 -97
- package/vendor/fusion/State/Computed.luau +138 -138
- package/vendor/fusion/State/For/Disassembly.luau +210 -210
- package/vendor/fusion/State/For/ForTypes.luau +30 -30
- package/vendor/fusion/State/For/init.luau +109 -109
- package/vendor/fusion/State/ForKeys.luau +93 -93
- package/vendor/fusion/State/ForPairs.luau +96 -96
- package/vendor/fusion/State/ForValues.luau +93 -93
- package/vendor/fusion/State/Value.luau +87 -87
- package/vendor/fusion/State/castToState.luau +25 -25
- package/vendor/fusion/State/peek.luau +30 -30
- package/vendor/fusion/Types.luau +314 -314
- package/vendor/fusion/Utility/Contextual.luau +90 -90
- package/vendor/fusion/Utility/Safe.luau +22 -22
- package/vendor/fusion/Utility/isSimilar.luau +29 -29
- package/vendor/fusion/Utility/merge.luau +35 -35
- package/vendor/fusion/Utility/nameOf.luau +34 -34
- package/vendor/fusion/Utility/never.luau +13 -13
- package/vendor/fusion/Utility/nicknames.luau +10 -10
- package/vendor/fusion/Utility/xtypeof.luau +26 -26
- package/vendor/fusion/init.luau +82 -82
- package/vendor/profilestore/init.luau +2242 -2242
- package/vendor/promise/init.luau +1982 -1982
- package/vendor/rbxutil/buffer-util/Buffer.test.luau +25 -25
- package/vendor/rbxutil/buffer-util/BufferReader.luau +228 -228
- package/vendor/rbxutil/buffer-util/BufferWriter.luau +269 -269
- package/vendor/rbxutil/buffer-util/DataTypeBuffer.luau +223 -223
- package/vendor/rbxutil/buffer-util/Types.luau +60 -60
- package/vendor/rbxutil/buffer-util/index.d.ts +153 -153
- package/vendor/rbxutil/buffer-util/init.luau +41 -41
- package/vendor/rbxutil/buffer-util/package.json +16 -16
- package/vendor/rbxutil/buffer-util/wally.toml +9 -9
- package/vendor/rbxutil/comm/Client/ClientComm.luau +232 -232
- package/vendor/rbxutil/comm/Client/ClientRemoteProperty.luau +156 -156
- package/vendor/rbxutil/comm/Client/ClientRemoteSignal.luau +109 -109
- package/vendor/rbxutil/comm/Client/init.luau +135 -135
- package/vendor/rbxutil/comm/Server/RemoteProperty.luau +295 -295
- package/vendor/rbxutil/comm/Server/RemoteSignal.luau +211 -211
- package/vendor/rbxutil/comm/Server/ServerComm.luau +211 -211
- package/vendor/rbxutil/comm/Server/init.luau +140 -140
- package/vendor/rbxutil/comm/Types.luau +18 -18
- package/vendor/rbxutil/comm/Util.luau +27 -27
- package/vendor/rbxutil/comm/init.luau +35 -35
- package/vendor/rbxutil/comm/wally.toml +13 -13
- package/vendor/rbxutil/component/init.luau +759 -759
- package/vendor/rbxutil/component/init.test.luau +311 -311
- package/vendor/rbxutil/component/wally.toml +14 -14
- package/vendor/rbxutil/concur/init.luau +542 -542
- package/vendor/rbxutil/concur/init.test.luau +364 -364
- package/vendor/rbxutil/concur/wally.toml +8 -8
- package/vendor/rbxutil/enum-list/init.luau +101 -101
- package/vendor/rbxutil/enum-list/init.test.luau +91 -91
- package/vendor/rbxutil/enum-list/wally.toml +8 -8
- package/vendor/rbxutil/find/index.d.ts +20 -20
- package/vendor/rbxutil/find/init.luau +44 -44
- package/vendor/rbxutil/find/package.json +17 -17
- package/vendor/rbxutil/find/wally.toml +8 -8
- package/vendor/rbxutil/input/Gamepad.luau +559 -559
- package/vendor/rbxutil/input/Keyboard.luau +124 -124
- package/vendor/rbxutil/input/Mouse.luau +278 -278
- package/vendor/rbxutil/input/PreferredInput.luau +91 -91
- package/vendor/rbxutil/input/Touch.luau +120 -120
- package/vendor/rbxutil/input/init.luau +33 -33
- package/vendor/rbxutil/input/wally.toml +12 -12
- package/vendor/rbxutil/loader/index.d.ts +15 -15
- package/vendor/rbxutil/loader/init.luau +137 -137
- package/vendor/rbxutil/loader/wally.toml +8 -8
- package/vendor/rbxutil/log/index.d.ts +38 -38
- package/vendor/rbxutil/log/init.luau +746 -746
- package/vendor/rbxutil/log/wally.toml +8 -8
- package/vendor/rbxutil/net/init.luau +190 -190
- package/vendor/rbxutil/net/wally.toml +8 -8
- package/vendor/rbxutil/option/index.d.ts +44 -44
- package/vendor/rbxutil/option/init.luau +489 -489
- package/vendor/rbxutil/option/init.test.luau +342 -342
- package/vendor/rbxutil/option/wally.toml +8 -8
- package/vendor/rbxutil/pid/index.d.ts +53 -53
- package/vendor/rbxutil/pid/init.luau +195 -195
- package/vendor/rbxutil/pid/package.json +16 -16
- package/vendor/rbxutil/pid/wally.toml +9 -9
- package/vendor/rbxutil/quaternion/index.d.ts +117 -117
- package/vendor/rbxutil/quaternion/init.luau +570 -570
- package/vendor/rbxutil/quaternion/package.json +16 -16
- package/vendor/rbxutil/quaternion/wally.toml +9 -9
- package/vendor/rbxutil/query/index.d.ts +43 -43
- package/vendor/rbxutil/query/init.luau +117 -117
- package/vendor/rbxutil/query/package.json +18 -18
- package/vendor/rbxutil/query/wally.toml +9 -9
- package/vendor/rbxutil/sequent/index.d.ts +28 -28
- package/vendor/rbxutil/sequent/init.luau +340 -340
- package/vendor/rbxutil/sequent/package.json +16 -16
- package/vendor/rbxutil/sequent/wally.toml +9 -9
- package/vendor/rbxutil/ser/init.luau +175 -175
- package/vendor/rbxutil/ser/init.test.luau +50 -50
- package/vendor/rbxutil/ser/wally.toml +11 -11
- package/vendor/rbxutil/shake/index.d.ts +36 -36
- package/vendor/rbxutil/shake/init.luau +532 -532
- package/vendor/rbxutil/shake/init.test.luau +267 -267
- package/vendor/rbxutil/shake/package.json +16 -16
- package/vendor/rbxutil/shake/wally.toml +9 -9
- package/vendor/rbxutil/signal/index.d.ts +100 -100
- package/vendor/rbxutil/signal/init.luau +432 -432
- package/vendor/rbxutil/signal/init.test.luau +190 -190
- package/vendor/rbxutil/signal/package.json +17 -17
- package/vendor/rbxutil/signal/wally.toml +9 -9
- package/vendor/rbxutil/silo/TableWatcher.luau +65 -65
- package/vendor/rbxutil/silo/Util.luau +55 -55
- package/vendor/rbxutil/silo/init.luau +338 -338
- package/vendor/rbxutil/silo/init.test.luau +215 -215
- package/vendor/rbxutil/silo/wally.toml +8 -8
- package/vendor/rbxutil/spring/index.d.ts +40 -40
- package/vendor/rbxutil/spring/init.luau +97 -97
- package/vendor/rbxutil/spring/package.json +17 -17
- package/vendor/rbxutil/spring/wally.toml +8 -8
- package/vendor/rbxutil/stream/index.d.ts +88 -88
- package/vendor/rbxutil/stream/init.luau +597 -597
- package/vendor/rbxutil/stream/package.json +18 -18
- package/vendor/rbxutil/stream/wally.toml +9 -9
- package/vendor/rbxutil/streamable/Streamable.luau +202 -202
- package/vendor/rbxutil/streamable/StreamableUtil.luau +80 -80
- package/vendor/rbxutil/streamable/init.luau +8 -8
- package/vendor/rbxutil/streamable/wally.toml +12 -12
- package/vendor/rbxutil/symbol/init.luau +56 -56
- package/vendor/rbxutil/symbol/init.test.luau +37 -37
- package/vendor/rbxutil/symbol/wally.toml +8 -8
- package/vendor/rbxutil/table-util/init.luau +938 -938
- package/vendor/rbxutil/table-util/init.test.luau +439 -439
- package/vendor/rbxutil/task-queue/index.d.ts +27 -27
- package/vendor/rbxutil/task-queue/init.luau +97 -97
- package/vendor/rbxutil/task-queue/wally.toml +8 -8
- package/vendor/rbxutil/timer/index.d.ts +81 -81
- package/vendor/rbxutil/timer/init.luau +249 -249
- package/vendor/rbxutil/timer/init.test.luau +73 -73
- package/vendor/rbxutil/timer/wally.toml +11 -11
- package/vendor/rbxutil/tree/index.d.ts +15 -15
- package/vendor/rbxutil/tree/init.luau +137 -137
- package/vendor/rbxutil/tree/wally.toml +8 -8
- package/vendor/rbxutil/trove/index.d.ts +46 -46
- package/vendor/rbxutil/trove/init.luau +787 -787
- package/vendor/rbxutil/trove/init.test.luau +203 -203
- package/vendor/rbxutil/trove/wally.toml +8 -8
- package/vendor/rbxutil/typed-remote/init.luau +196 -196
- package/vendor/rbxutil/typed-remote/wally.toml +8 -8
- package/vendor/rbxutil/wait-for/index.d.ts +17 -17
- package/vendor/rbxutil/wait-for/init.luau +257 -257
- package/vendor/rbxutil/wait-for/init.test.luau +182 -182
- package/vendor/rbxutil/wait-for/wally.toml +11 -11
- package/vendor/t/t.lua +1350 -1350
- package/vendor/testez/Context.lua +26 -26
- package/vendor/testez/Expectation.lua +311 -311
- package/vendor/testez/ExpectationContext.lua +38 -38
- package/vendor/testez/LifecycleHooks.lua +89 -89
- package/vendor/testez/Reporters/TeamCityReporter.lua +101 -101
- package/vendor/testez/Reporters/TextReporter.lua +105 -105
- package/vendor/testez/Reporters/TextReporterQuiet.lua +96 -96
- package/vendor/testez/TestBootstrap.lua +146 -146
- package/vendor/testez/TestEnum.lua +27 -27
- package/vendor/testez/TestPlan.lua +304 -304
- package/vendor/testez/TestPlanner.lua +39 -39
- package/vendor/testez/TestResults.lua +111 -111
- package/vendor/testez/TestRunner.lua +188 -188
- package/vendor/testez/TestSession.lua +243 -243
- 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
|