roblox-opencode 1.0.0 → 1.0.1
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 +863 -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 +1519 -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,168 +1,168 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
Abstraction layer between Fusion internals and external environments,
|
|
8
|
-
allowing for flexible integration with schedulers and test mocks.
|
|
9
|
-
]]
|
|
10
|
-
|
|
11
|
-
local Package = script.Parent
|
|
12
|
-
local formatError = require(Package.Logging.formatError)
|
|
13
|
-
local Types = require(Package.Types)
|
|
14
|
-
|
|
15
|
-
local ERROR_INFO_URL = "https://elttob.uk/Fusion/0.3/api-reference/general/errors/#"
|
|
16
|
-
|
|
17
|
-
local External = {}
|
|
18
|
-
|
|
19
|
-
-- Indicates that a highly time-critical passage of code is running. During
|
|
20
|
-
-- critical periods of a program, Fusion might decide to change some of its
|
|
21
|
-
-- internal behaviour to be more performance friendly.
|
|
22
|
-
local timeCritical = false
|
|
23
|
-
|
|
24
|
-
-- Multiplier for running-time safety checks across the Fusion codebase. Used to
|
|
25
|
-
-- stricten tests on infinite loop detection during unit testing.
|
|
26
|
-
External.safetyTimerMultiplier = 1
|
|
27
|
-
|
|
28
|
-
local updateStepCallbacks = {}
|
|
29
|
-
local currentProvider: Types.ExternalProvider? = nil
|
|
30
|
-
local lastUpdateStep = 0
|
|
31
|
-
|
|
32
|
-
--[[
|
|
33
|
-
Swaps to a new provider for external operations.
|
|
34
|
-
Returns the old provider, so it can be used again later.
|
|
35
|
-
]]
|
|
36
|
-
function External.setExternalProvider(
|
|
37
|
-
newProvider: Types.ExternalProvider?
|
|
38
|
-
): Types.ExternalProvider?
|
|
39
|
-
local oldProvider = currentProvider
|
|
40
|
-
if oldProvider ~= nil then
|
|
41
|
-
oldProvider.stopScheduler()
|
|
42
|
-
end
|
|
43
|
-
currentProvider = newProvider
|
|
44
|
-
if newProvider ~= nil then
|
|
45
|
-
newProvider.startScheduler()
|
|
46
|
-
end
|
|
47
|
-
return oldProvider
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
--[[
|
|
51
|
-
Returns true if a highly time-critical passage of code is running.
|
|
52
|
-
]]
|
|
53
|
-
function External.isTimeCritical(): boolean
|
|
54
|
-
return timeCritical
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
--[[
|
|
58
|
-
Sends an immediate task to the external provider. Throws if none is set.
|
|
59
|
-
]]
|
|
60
|
-
function External.doTaskImmediate(
|
|
61
|
-
resume: () -> ()
|
|
62
|
-
)
|
|
63
|
-
if currentProvider == nil then
|
|
64
|
-
External.logError("noTaskScheduler")
|
|
65
|
-
else
|
|
66
|
-
currentProvider.doTaskImmediate(resume)
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
--[[
|
|
71
|
-
Sends a deferred task to the external provider. Throws if none is set.
|
|
72
|
-
]]
|
|
73
|
-
function External.doTaskDeferred(
|
|
74
|
-
resume: () -> ()
|
|
75
|
-
)
|
|
76
|
-
if currentProvider == nil then
|
|
77
|
-
External.logError("noTaskScheduler")
|
|
78
|
-
else
|
|
79
|
-
currentProvider.doTaskDeferred(resume)
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
--[[
|
|
84
|
-
Errors in the current thread and halts execution.
|
|
85
|
-
]]
|
|
86
|
-
function External.logError(
|
|
87
|
-
messageID: string,
|
|
88
|
-
errObj: Types.Error?,
|
|
89
|
-
...: unknown
|
|
90
|
-
): never
|
|
91
|
-
error(formatError(currentProvider, messageID, errObj, ...), 0)
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
--[[
|
|
95
|
-
Errors in a different thread to preserve the flow of execution.
|
|
96
|
-
]]
|
|
97
|
-
function External.logErrorNonFatal(
|
|
98
|
-
messageID: string,
|
|
99
|
-
errObj: Types.Error?,
|
|
100
|
-
...: unknown
|
|
101
|
-
): ()
|
|
102
|
-
local errorString = formatError(currentProvider, messageID, errObj, ...)
|
|
103
|
-
if currentProvider ~= nil then
|
|
104
|
-
currentProvider.logErrorNonFatal(errorString)
|
|
105
|
-
else
|
|
106
|
-
print(errorString)
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
--[[
|
|
111
|
-
Shows a warning message in the output.
|
|
112
|
-
]]
|
|
113
|
-
function External.logWarn(
|
|
114
|
-
messageID: string,
|
|
115
|
-
...: unknown
|
|
116
|
-
): ()
|
|
117
|
-
local errorString = formatError(currentProvider, messageID, debug.traceback(nil, 2), ...)
|
|
118
|
-
if currentProvider ~= nil then
|
|
119
|
-
currentProvider.logWarn(errorString)
|
|
120
|
-
else
|
|
121
|
-
print(errorString)
|
|
122
|
-
end
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
--[[
|
|
126
|
-
Registers a callback to the update step of the external provider.
|
|
127
|
-
Returns a function that can be used to disconnect later.
|
|
128
|
-
|
|
129
|
-
Callbacks are given the current number of seconds since an arbitrary epoch.
|
|
130
|
-
|
|
131
|
-
TODO: This epoch may change between providers. We could investigate ways
|
|
132
|
-
of allowing providers to co-operate to keep the epoch the same, so that
|
|
133
|
-
monotonicity can be better preserved.
|
|
134
|
-
]]
|
|
135
|
-
function External.bindToUpdateStep(
|
|
136
|
-
callback: (
|
|
137
|
-
now: number
|
|
138
|
-
) -> ()
|
|
139
|
-
): () -> ()
|
|
140
|
-
local uniqueIdentifier = {}
|
|
141
|
-
updateStepCallbacks[uniqueIdentifier] = callback
|
|
142
|
-
return function()
|
|
143
|
-
updateStepCallbacks[uniqueIdentifier] = nil
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
--[[
|
|
148
|
-
Steps time-dependent systems with the current number of seconds since an
|
|
149
|
-
arbitrary epoch. This should be called as early as possible in the external
|
|
150
|
-
provider's update cycle.
|
|
151
|
-
]]
|
|
152
|
-
function External.performUpdateStep(
|
|
153
|
-
now: number
|
|
154
|
-
)
|
|
155
|
-
lastUpdateStep = now
|
|
156
|
-
for _, callback in updateStepCallbacks do
|
|
157
|
-
callback(now)
|
|
158
|
-
end
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
--[[
|
|
162
|
-
Returns the timestamp of the last update step.
|
|
163
|
-
]]
|
|
164
|
-
function External.lastUpdateStep()
|
|
165
|
-
return lastUpdateStep
|
|
166
|
-
end
|
|
167
|
-
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
Abstraction layer between Fusion internals and external environments,
|
|
8
|
+
allowing for flexible integration with schedulers and test mocks.
|
|
9
|
+
]]
|
|
10
|
+
|
|
11
|
+
local Package = script.Parent
|
|
12
|
+
local formatError = require(Package.Logging.formatError)
|
|
13
|
+
local Types = require(Package.Types)
|
|
14
|
+
|
|
15
|
+
local ERROR_INFO_URL = "https://elttob.uk/Fusion/0.3/api-reference/general/errors/#"
|
|
16
|
+
|
|
17
|
+
local External = {}
|
|
18
|
+
|
|
19
|
+
-- Indicates that a highly time-critical passage of code is running. During
|
|
20
|
+
-- critical periods of a program, Fusion might decide to change some of its
|
|
21
|
+
-- internal behaviour to be more performance friendly.
|
|
22
|
+
local timeCritical = false
|
|
23
|
+
|
|
24
|
+
-- Multiplier for running-time safety checks across the Fusion codebase. Used to
|
|
25
|
+
-- stricten tests on infinite loop detection during unit testing.
|
|
26
|
+
External.safetyTimerMultiplier = 1
|
|
27
|
+
|
|
28
|
+
local updateStepCallbacks = {}
|
|
29
|
+
local currentProvider: Types.ExternalProvider? = nil
|
|
30
|
+
local lastUpdateStep = 0
|
|
31
|
+
|
|
32
|
+
--[[
|
|
33
|
+
Swaps to a new provider for external operations.
|
|
34
|
+
Returns the old provider, so it can be used again later.
|
|
35
|
+
]]
|
|
36
|
+
function External.setExternalProvider(
|
|
37
|
+
newProvider: Types.ExternalProvider?
|
|
38
|
+
): Types.ExternalProvider?
|
|
39
|
+
local oldProvider = currentProvider
|
|
40
|
+
if oldProvider ~= nil then
|
|
41
|
+
oldProvider.stopScheduler()
|
|
42
|
+
end
|
|
43
|
+
currentProvider = newProvider
|
|
44
|
+
if newProvider ~= nil then
|
|
45
|
+
newProvider.startScheduler()
|
|
46
|
+
end
|
|
47
|
+
return oldProvider
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
--[[
|
|
51
|
+
Returns true if a highly time-critical passage of code is running.
|
|
52
|
+
]]
|
|
53
|
+
function External.isTimeCritical(): boolean
|
|
54
|
+
return timeCritical
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
--[[
|
|
58
|
+
Sends an immediate task to the external provider. Throws if none is set.
|
|
59
|
+
]]
|
|
60
|
+
function External.doTaskImmediate(
|
|
61
|
+
resume: () -> ()
|
|
62
|
+
)
|
|
63
|
+
if currentProvider == nil then
|
|
64
|
+
External.logError("noTaskScheduler")
|
|
65
|
+
else
|
|
66
|
+
currentProvider.doTaskImmediate(resume)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
--[[
|
|
71
|
+
Sends a deferred task to the external provider. Throws if none is set.
|
|
72
|
+
]]
|
|
73
|
+
function External.doTaskDeferred(
|
|
74
|
+
resume: () -> ()
|
|
75
|
+
)
|
|
76
|
+
if currentProvider == nil then
|
|
77
|
+
External.logError("noTaskScheduler")
|
|
78
|
+
else
|
|
79
|
+
currentProvider.doTaskDeferred(resume)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
--[[
|
|
84
|
+
Errors in the current thread and halts execution.
|
|
85
|
+
]]
|
|
86
|
+
function External.logError(
|
|
87
|
+
messageID: string,
|
|
88
|
+
errObj: Types.Error?,
|
|
89
|
+
...: unknown
|
|
90
|
+
): never
|
|
91
|
+
error(formatError(currentProvider, messageID, errObj, ...), 0)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
--[[
|
|
95
|
+
Errors in a different thread to preserve the flow of execution.
|
|
96
|
+
]]
|
|
97
|
+
function External.logErrorNonFatal(
|
|
98
|
+
messageID: string,
|
|
99
|
+
errObj: Types.Error?,
|
|
100
|
+
...: unknown
|
|
101
|
+
): ()
|
|
102
|
+
local errorString = formatError(currentProvider, messageID, errObj, ...)
|
|
103
|
+
if currentProvider ~= nil then
|
|
104
|
+
currentProvider.logErrorNonFatal(errorString)
|
|
105
|
+
else
|
|
106
|
+
print(errorString)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
--[[
|
|
111
|
+
Shows a warning message in the output.
|
|
112
|
+
]]
|
|
113
|
+
function External.logWarn(
|
|
114
|
+
messageID: string,
|
|
115
|
+
...: unknown
|
|
116
|
+
): ()
|
|
117
|
+
local errorString = formatError(currentProvider, messageID, debug.traceback(nil, 2), ...)
|
|
118
|
+
if currentProvider ~= nil then
|
|
119
|
+
currentProvider.logWarn(errorString)
|
|
120
|
+
else
|
|
121
|
+
print(errorString)
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
--[[
|
|
126
|
+
Registers a callback to the update step of the external provider.
|
|
127
|
+
Returns a function that can be used to disconnect later.
|
|
128
|
+
|
|
129
|
+
Callbacks are given the current number of seconds since an arbitrary epoch.
|
|
130
|
+
|
|
131
|
+
TODO: This epoch may change between providers. We could investigate ways
|
|
132
|
+
of allowing providers to co-operate to keep the epoch the same, so that
|
|
133
|
+
monotonicity can be better preserved.
|
|
134
|
+
]]
|
|
135
|
+
function External.bindToUpdateStep(
|
|
136
|
+
callback: (
|
|
137
|
+
now: number
|
|
138
|
+
) -> ()
|
|
139
|
+
): () -> ()
|
|
140
|
+
local uniqueIdentifier = {}
|
|
141
|
+
updateStepCallbacks[uniqueIdentifier] = callback
|
|
142
|
+
return function()
|
|
143
|
+
updateStepCallbacks[uniqueIdentifier] = nil
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
--[[
|
|
148
|
+
Steps time-dependent systems with the current number of seconds since an
|
|
149
|
+
arbitrary epoch. This should be called as early as possible in the external
|
|
150
|
+
provider's update cycle.
|
|
151
|
+
]]
|
|
152
|
+
function External.performUpdateStep(
|
|
153
|
+
now: number
|
|
154
|
+
)
|
|
155
|
+
lastUpdateStep = now
|
|
156
|
+
for _, callback in updateStepCallbacks do
|
|
157
|
+
callback(now)
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
--[[
|
|
162
|
+
Returns the timestamp of the last update step.
|
|
163
|
+
]]
|
|
164
|
+
function External.lastUpdateStep()
|
|
165
|
+
return lastUpdateStep
|
|
166
|
+
end
|
|
167
|
+
|
|
168
168
|
return External
|
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
Abstraction layer between Fusion internals and external debuggers, allowing
|
|
8
|
-
for deep introspection using function hooks.
|
|
9
|
-
|
|
10
|
-
Unlike `External`, attaching a debugger is optional, and all debugger
|
|
11
|
-
functions are expected to be infallible and non-blocking.
|
|
12
|
-
]]
|
|
13
|
-
|
|
14
|
-
local Package = script.Parent
|
|
15
|
-
local Types = require(Package.Types)
|
|
16
|
-
|
|
17
|
-
local currentProvider: Types.ExternalDebugger? = nil
|
|
18
|
-
local lastUpdateStep = 0
|
|
19
|
-
|
|
20
|
-
local Debugger = {}
|
|
21
|
-
|
|
22
|
-
--[[
|
|
23
|
-
Swaps to a new debugger.
|
|
24
|
-
Returns the old debugger, so it can be used again later.
|
|
25
|
-
]]
|
|
26
|
-
function Debugger.setDebugger(
|
|
27
|
-
newProvider: Types.ExternalDebugger?
|
|
28
|
-
): Types.ExternalDebugger?
|
|
29
|
-
local oldProvider = currentProvider
|
|
30
|
-
if oldProvider ~= nil then
|
|
31
|
-
oldProvider.stopDebugging()
|
|
32
|
-
end
|
|
33
|
-
currentProvider = newProvider
|
|
34
|
-
if newProvider ~= nil then
|
|
35
|
-
newProvider.startDebugging()
|
|
36
|
-
end
|
|
37
|
-
return oldProvider
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
--[[
|
|
41
|
-
Called at the earliest moment after a scope is created or removed from the
|
|
42
|
-
scope pool, but not before the scope has finished being prepared by the
|
|
43
|
-
library, so that debuggers can register its existence and track changes
|
|
44
|
-
to the scope over time.
|
|
45
|
-
]]
|
|
46
|
-
function Debugger.trackScope(
|
|
47
|
-
scope: Types.Scope<unknown>
|
|
48
|
-
): ()
|
|
49
|
-
if currentProvider == nil then
|
|
50
|
-
return
|
|
51
|
-
end
|
|
52
|
-
currentProvider.trackScope(scope)
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
--[[
|
|
56
|
-
Called at the final moment before a scope is poisoned or added to the scope
|
|
57
|
-
pool, after all cleanup tasks have completed, so that debuggers can erase
|
|
58
|
-
the scope from internal trackers. Note that, due to scope pooling and user
|
|
59
|
-
code, never assume that this correlates with garbage collection events.
|
|
60
|
-
]]
|
|
61
|
-
function Debugger.untrackScope(
|
|
62
|
-
scope: Types.Scope<unknown>
|
|
63
|
-
): ()
|
|
64
|
-
if currentProvider == nil then
|
|
65
|
-
return
|
|
66
|
-
end
|
|
67
|
-
currentProvider.trackScope(scope)
|
|
68
|
-
end
|
|
69
|
-
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
Abstraction layer between Fusion internals and external debuggers, allowing
|
|
8
|
+
for deep introspection using function hooks.
|
|
9
|
+
|
|
10
|
+
Unlike `External`, attaching a debugger is optional, and all debugger
|
|
11
|
+
functions are expected to be infallible and non-blocking.
|
|
12
|
+
]]
|
|
13
|
+
|
|
14
|
+
local Package = script.Parent
|
|
15
|
+
local Types = require(Package.Types)
|
|
16
|
+
|
|
17
|
+
local currentProvider: Types.ExternalDebugger? = nil
|
|
18
|
+
local lastUpdateStep = 0
|
|
19
|
+
|
|
20
|
+
local Debugger = {}
|
|
21
|
+
|
|
22
|
+
--[[
|
|
23
|
+
Swaps to a new debugger.
|
|
24
|
+
Returns the old debugger, so it can be used again later.
|
|
25
|
+
]]
|
|
26
|
+
function Debugger.setDebugger(
|
|
27
|
+
newProvider: Types.ExternalDebugger?
|
|
28
|
+
): Types.ExternalDebugger?
|
|
29
|
+
local oldProvider = currentProvider
|
|
30
|
+
if oldProvider ~= nil then
|
|
31
|
+
oldProvider.stopDebugging()
|
|
32
|
+
end
|
|
33
|
+
currentProvider = newProvider
|
|
34
|
+
if newProvider ~= nil then
|
|
35
|
+
newProvider.startDebugging()
|
|
36
|
+
end
|
|
37
|
+
return oldProvider
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
--[[
|
|
41
|
+
Called at the earliest moment after a scope is created or removed from the
|
|
42
|
+
scope pool, but not before the scope has finished being prepared by the
|
|
43
|
+
library, so that debuggers can register its existence and track changes
|
|
44
|
+
to the scope over time.
|
|
45
|
+
]]
|
|
46
|
+
function Debugger.trackScope(
|
|
47
|
+
scope: Types.Scope<unknown>
|
|
48
|
+
): ()
|
|
49
|
+
if currentProvider == nil then
|
|
50
|
+
return
|
|
51
|
+
end
|
|
52
|
+
currentProvider.trackScope(scope)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
--[[
|
|
56
|
+
Called at the final moment before a scope is poisoned or added to the scope
|
|
57
|
+
pool, after all cleanup tasks have completed, so that debuggers can erase
|
|
58
|
+
the scope from internal trackers. Note that, due to scope pooling and user
|
|
59
|
+
code, never assume that this correlates with garbage collection events.
|
|
60
|
+
]]
|
|
61
|
+
function Debugger.untrackScope(
|
|
62
|
+
scope: Types.Scope<unknown>
|
|
63
|
+
): ()
|
|
64
|
+
if currentProvider == nil then
|
|
65
|
+
return
|
|
66
|
+
end
|
|
67
|
+
currentProvider.trackScope(scope)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
70
|
return Debugger
|