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,140 +1,140 @@
|
|
|
1
|
-
local RemoteProperty = require(script.RemoteProperty)
|
|
2
|
-
local RemoteSignal = require(script.RemoteSignal)
|
|
3
|
-
local Types = require(script.Parent.Types)
|
|
4
|
-
local Util = require(script.Parent.Util)
|
|
5
|
-
|
|
6
|
-
local Server = {}
|
|
7
|
-
|
|
8
|
-
--[=[
|
|
9
|
-
@within Comm
|
|
10
|
-
@prop ServerComm ServerComm
|
|
11
|
-
]=]
|
|
12
|
-
--[=[
|
|
13
|
-
@within Comm
|
|
14
|
-
@prop ClientComm ClientComm
|
|
15
|
-
]=]
|
|
16
|
-
|
|
17
|
-
--[=[
|
|
18
|
-
@within Comm
|
|
19
|
-
@private
|
|
20
|
-
@interface Server
|
|
21
|
-
.BindFunction (parent: Instance, name: string, fn: FnBind, inboundMiddleware: ServerMiddleware?, outboundMiddleware: ServerMiddleware?): RemoteFunction
|
|
22
|
-
.WrapMethod (parent: Instance, tbl: table, name: string, inboundMiddleware: ServerMiddleware?, outboundMiddleware: ServerMiddleware?): RemoteFunction
|
|
23
|
-
.CreateSignal (parent: Instance, name: string, inboundMiddleware: ServerMiddleware?, outboundMiddleware: ServerMiddleware?): RemoteSignal
|
|
24
|
-
.CreateProperty (parent: Instance, name: string, value: any, inboundMiddleware: ServerMiddleware?, outboundMiddleware: ServerMiddleware?): RemoteProperty
|
|
25
|
-
Server Comm
|
|
26
|
-
]=]
|
|
27
|
-
--[=[
|
|
28
|
-
@within Comm
|
|
29
|
-
@private
|
|
30
|
-
@interface Client
|
|
31
|
-
.GetFunction (parent: Instance, name: string, usePromise: boolean, inboundMiddleware: ClientMiddleware?, outboundMiddleware: ClientMiddleware?): (...: any) -> any
|
|
32
|
-
.GetSignal (parent: Instance, name: string, inboundMiddleware: ClientMiddleware?, outboundMiddleware: ClientMiddleware?): ClientRemoteSignal
|
|
33
|
-
.GetProperty (parent: Instance, name: string, inboundMiddleware: ClientMiddleware?, outboundMiddleware: ClientMiddleware?): ClientRemoteProperty
|
|
34
|
-
Client Comm
|
|
35
|
-
]=]
|
|
36
|
-
|
|
37
|
-
function Server.BindFunction(
|
|
38
|
-
parent: Instance,
|
|
39
|
-
name: string,
|
|
40
|
-
func: Types.FnBind,
|
|
41
|
-
inboundMiddleware: Types.ServerMiddleware?,
|
|
42
|
-
outboundMiddleware: Types.ServerMiddleware?
|
|
43
|
-
): RemoteFunction
|
|
44
|
-
assert(Util.IsServer, "BindFunction must be called from the server")
|
|
45
|
-
local folder = Util.GetCommSubFolder(parent, "RF"):Expect("Failed to get Comm RF folder")
|
|
46
|
-
local rf = Instance.new("RemoteFunction")
|
|
47
|
-
rf.Name = name
|
|
48
|
-
local hasInbound = type(inboundMiddleware) == "table" and #inboundMiddleware > 0
|
|
49
|
-
local hasOutbound = type(outboundMiddleware) == "table" and #outboundMiddleware > 0
|
|
50
|
-
local function ProcessOutbound(player, ...)
|
|
51
|
-
local args = table.pack(...)
|
|
52
|
-
for _, middlewareFunc in ipairs(outboundMiddleware) do
|
|
53
|
-
local middlewareResult = table.pack(middlewareFunc(player, args))
|
|
54
|
-
if not middlewareResult[1] then
|
|
55
|
-
return table.unpack(middlewareResult, 2, middlewareResult.n)
|
|
56
|
-
end
|
|
57
|
-
args.n = #args
|
|
58
|
-
end
|
|
59
|
-
return table.unpack(args, 1, args.n)
|
|
60
|
-
end
|
|
61
|
-
if hasInbound and hasOutbound then
|
|
62
|
-
local function OnServerInvoke(player, ...)
|
|
63
|
-
local args = table.pack(...)
|
|
64
|
-
for _, middlewareFunc in ipairs(inboundMiddleware) do
|
|
65
|
-
local middlewareResult = table.pack(middlewareFunc(player, args))
|
|
66
|
-
if not middlewareResult[1] then
|
|
67
|
-
return table.unpack(middlewareResult, 2, middlewareResult.n)
|
|
68
|
-
end
|
|
69
|
-
args.n = #args
|
|
70
|
-
end
|
|
71
|
-
return ProcessOutbound(player, func(player, table.unpack(args, 1, args.n)))
|
|
72
|
-
end
|
|
73
|
-
rf.OnServerInvoke = OnServerInvoke
|
|
74
|
-
elseif hasInbound then
|
|
75
|
-
local function OnServerInvoke(player, ...)
|
|
76
|
-
local args = table.pack(...)
|
|
77
|
-
for _, middlewareFunc in ipairs(inboundMiddleware) do
|
|
78
|
-
local middlewareResult = table.pack(middlewareFunc(player, args))
|
|
79
|
-
if not middlewareResult[1] then
|
|
80
|
-
return table.unpack(middlewareResult, 2, middlewareResult.n)
|
|
81
|
-
end
|
|
82
|
-
args.n = #args
|
|
83
|
-
end
|
|
84
|
-
return func(player, table.unpack(args, 1, args.n))
|
|
85
|
-
end
|
|
86
|
-
rf.OnServerInvoke = OnServerInvoke
|
|
87
|
-
elseif hasOutbound then
|
|
88
|
-
local function OnServerInvoke(player, ...)
|
|
89
|
-
return ProcessOutbound(player, func(player, ...))
|
|
90
|
-
end
|
|
91
|
-
rf.OnServerInvoke = OnServerInvoke
|
|
92
|
-
else
|
|
93
|
-
rf.OnServerInvoke = func
|
|
94
|
-
end
|
|
95
|
-
rf.Parent = folder
|
|
96
|
-
return rf
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
function Server.WrapMethod(
|
|
100
|
-
parent: Instance,
|
|
101
|
-
tbl: {},
|
|
102
|
-
name: string,
|
|
103
|
-
inboundMiddleware: Types.ServerMiddleware?,
|
|
104
|
-
outboundMiddleware: Types.ServerMiddleware?
|
|
105
|
-
): RemoteFunction
|
|
106
|
-
assert(Util.IsServer, "WrapMethod must be called from the server")
|
|
107
|
-
local fn = tbl[name]
|
|
108
|
-
assert(type(fn) == "function", "Value at index " .. name .. " must be a function; got " .. type(fn))
|
|
109
|
-
return Server.BindFunction(parent, name, function(...)
|
|
110
|
-
return fn(tbl, ...)
|
|
111
|
-
end, inboundMiddleware, outboundMiddleware)
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
function Server.CreateSignal(
|
|
115
|
-
parent: Instance,
|
|
116
|
-
name: string,
|
|
117
|
-
reliable: boolean?,
|
|
118
|
-
inboundMiddleware: Types.ServerMiddleware?,
|
|
119
|
-
outboundMiddleware: Types.ServerMiddleware?
|
|
120
|
-
)
|
|
121
|
-
assert(Util.IsServer, "CreateSignal must be called from the server")
|
|
122
|
-
local folder = Util.GetCommSubFolder(parent, "RE"):Expect("Failed to get Comm RE folder")
|
|
123
|
-
local rs = RemoteSignal.new(folder, name, reliable, inboundMiddleware, outboundMiddleware)
|
|
124
|
-
return rs
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
function Server.CreateProperty(
|
|
128
|
-
parent: Instance,
|
|
129
|
-
name: string,
|
|
130
|
-
initialValue: any,
|
|
131
|
-
inboundMiddleware: Types.ServerMiddleware?,
|
|
132
|
-
outboundMiddleware: Types.ServerMiddleware?
|
|
133
|
-
)
|
|
134
|
-
assert(Util.IsServer, "CreateProperty must be called from the server")
|
|
135
|
-
local folder = Util.GetCommSubFolder(parent, "RP"):Expect("Failed to get Comm RP folder")
|
|
136
|
-
local rp = RemoteProperty.new(folder, name, initialValue, inboundMiddleware, outboundMiddleware)
|
|
137
|
-
return rp
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
return Server
|
|
1
|
+
local RemoteProperty = require(script.RemoteProperty)
|
|
2
|
+
local RemoteSignal = require(script.RemoteSignal)
|
|
3
|
+
local Types = require(script.Parent.Types)
|
|
4
|
+
local Util = require(script.Parent.Util)
|
|
5
|
+
|
|
6
|
+
local Server = {}
|
|
7
|
+
|
|
8
|
+
--[=[
|
|
9
|
+
@within Comm
|
|
10
|
+
@prop ServerComm ServerComm
|
|
11
|
+
]=]
|
|
12
|
+
--[=[
|
|
13
|
+
@within Comm
|
|
14
|
+
@prop ClientComm ClientComm
|
|
15
|
+
]=]
|
|
16
|
+
|
|
17
|
+
--[=[
|
|
18
|
+
@within Comm
|
|
19
|
+
@private
|
|
20
|
+
@interface Server
|
|
21
|
+
.BindFunction (parent: Instance, name: string, fn: FnBind, inboundMiddleware: ServerMiddleware?, outboundMiddleware: ServerMiddleware?): RemoteFunction
|
|
22
|
+
.WrapMethod (parent: Instance, tbl: table, name: string, inboundMiddleware: ServerMiddleware?, outboundMiddleware: ServerMiddleware?): RemoteFunction
|
|
23
|
+
.CreateSignal (parent: Instance, name: string, inboundMiddleware: ServerMiddleware?, outboundMiddleware: ServerMiddleware?): RemoteSignal
|
|
24
|
+
.CreateProperty (parent: Instance, name: string, value: any, inboundMiddleware: ServerMiddleware?, outboundMiddleware: ServerMiddleware?): RemoteProperty
|
|
25
|
+
Server Comm
|
|
26
|
+
]=]
|
|
27
|
+
--[=[
|
|
28
|
+
@within Comm
|
|
29
|
+
@private
|
|
30
|
+
@interface Client
|
|
31
|
+
.GetFunction (parent: Instance, name: string, usePromise: boolean, inboundMiddleware: ClientMiddleware?, outboundMiddleware: ClientMiddleware?): (...: any) -> any
|
|
32
|
+
.GetSignal (parent: Instance, name: string, inboundMiddleware: ClientMiddleware?, outboundMiddleware: ClientMiddleware?): ClientRemoteSignal
|
|
33
|
+
.GetProperty (parent: Instance, name: string, inboundMiddleware: ClientMiddleware?, outboundMiddleware: ClientMiddleware?): ClientRemoteProperty
|
|
34
|
+
Client Comm
|
|
35
|
+
]=]
|
|
36
|
+
|
|
37
|
+
function Server.BindFunction(
|
|
38
|
+
parent: Instance,
|
|
39
|
+
name: string,
|
|
40
|
+
func: Types.FnBind,
|
|
41
|
+
inboundMiddleware: Types.ServerMiddleware?,
|
|
42
|
+
outboundMiddleware: Types.ServerMiddleware?
|
|
43
|
+
): RemoteFunction
|
|
44
|
+
assert(Util.IsServer, "BindFunction must be called from the server")
|
|
45
|
+
local folder = Util.GetCommSubFolder(parent, "RF"):Expect("Failed to get Comm RF folder")
|
|
46
|
+
local rf = Instance.new("RemoteFunction")
|
|
47
|
+
rf.Name = name
|
|
48
|
+
local hasInbound = type(inboundMiddleware) == "table" and #inboundMiddleware > 0
|
|
49
|
+
local hasOutbound = type(outboundMiddleware) == "table" and #outboundMiddleware > 0
|
|
50
|
+
local function ProcessOutbound(player, ...)
|
|
51
|
+
local args = table.pack(...)
|
|
52
|
+
for _, middlewareFunc in ipairs(outboundMiddleware) do
|
|
53
|
+
local middlewareResult = table.pack(middlewareFunc(player, args))
|
|
54
|
+
if not middlewareResult[1] then
|
|
55
|
+
return table.unpack(middlewareResult, 2, middlewareResult.n)
|
|
56
|
+
end
|
|
57
|
+
args.n = #args
|
|
58
|
+
end
|
|
59
|
+
return table.unpack(args, 1, args.n)
|
|
60
|
+
end
|
|
61
|
+
if hasInbound and hasOutbound then
|
|
62
|
+
local function OnServerInvoke(player, ...)
|
|
63
|
+
local args = table.pack(...)
|
|
64
|
+
for _, middlewareFunc in ipairs(inboundMiddleware) do
|
|
65
|
+
local middlewareResult = table.pack(middlewareFunc(player, args))
|
|
66
|
+
if not middlewareResult[1] then
|
|
67
|
+
return table.unpack(middlewareResult, 2, middlewareResult.n)
|
|
68
|
+
end
|
|
69
|
+
args.n = #args
|
|
70
|
+
end
|
|
71
|
+
return ProcessOutbound(player, func(player, table.unpack(args, 1, args.n)))
|
|
72
|
+
end
|
|
73
|
+
rf.OnServerInvoke = OnServerInvoke
|
|
74
|
+
elseif hasInbound then
|
|
75
|
+
local function OnServerInvoke(player, ...)
|
|
76
|
+
local args = table.pack(...)
|
|
77
|
+
for _, middlewareFunc in ipairs(inboundMiddleware) do
|
|
78
|
+
local middlewareResult = table.pack(middlewareFunc(player, args))
|
|
79
|
+
if not middlewareResult[1] then
|
|
80
|
+
return table.unpack(middlewareResult, 2, middlewareResult.n)
|
|
81
|
+
end
|
|
82
|
+
args.n = #args
|
|
83
|
+
end
|
|
84
|
+
return func(player, table.unpack(args, 1, args.n))
|
|
85
|
+
end
|
|
86
|
+
rf.OnServerInvoke = OnServerInvoke
|
|
87
|
+
elseif hasOutbound then
|
|
88
|
+
local function OnServerInvoke(player, ...)
|
|
89
|
+
return ProcessOutbound(player, func(player, ...))
|
|
90
|
+
end
|
|
91
|
+
rf.OnServerInvoke = OnServerInvoke
|
|
92
|
+
else
|
|
93
|
+
rf.OnServerInvoke = func
|
|
94
|
+
end
|
|
95
|
+
rf.Parent = folder
|
|
96
|
+
return rf
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
function Server.WrapMethod(
|
|
100
|
+
parent: Instance,
|
|
101
|
+
tbl: {},
|
|
102
|
+
name: string,
|
|
103
|
+
inboundMiddleware: Types.ServerMiddleware?,
|
|
104
|
+
outboundMiddleware: Types.ServerMiddleware?
|
|
105
|
+
): RemoteFunction
|
|
106
|
+
assert(Util.IsServer, "WrapMethod must be called from the server")
|
|
107
|
+
local fn = tbl[name]
|
|
108
|
+
assert(type(fn) == "function", "Value at index " .. name .. " must be a function; got " .. type(fn))
|
|
109
|
+
return Server.BindFunction(parent, name, function(...)
|
|
110
|
+
return fn(tbl, ...)
|
|
111
|
+
end, inboundMiddleware, outboundMiddleware)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
function Server.CreateSignal(
|
|
115
|
+
parent: Instance,
|
|
116
|
+
name: string,
|
|
117
|
+
reliable: boolean?,
|
|
118
|
+
inboundMiddleware: Types.ServerMiddleware?,
|
|
119
|
+
outboundMiddleware: Types.ServerMiddleware?
|
|
120
|
+
)
|
|
121
|
+
assert(Util.IsServer, "CreateSignal must be called from the server")
|
|
122
|
+
local folder = Util.GetCommSubFolder(parent, "RE"):Expect("Failed to get Comm RE folder")
|
|
123
|
+
local rs = RemoteSignal.new(folder, name, reliable, inboundMiddleware, outboundMiddleware)
|
|
124
|
+
return rs
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
function Server.CreateProperty(
|
|
128
|
+
parent: Instance,
|
|
129
|
+
name: string,
|
|
130
|
+
initialValue: any,
|
|
131
|
+
inboundMiddleware: Types.ServerMiddleware?,
|
|
132
|
+
outboundMiddleware: Types.ServerMiddleware?
|
|
133
|
+
)
|
|
134
|
+
assert(Util.IsServer, "CreateProperty must be called from the server")
|
|
135
|
+
local folder = Util.GetCommSubFolder(parent, "RP"):Expect("Failed to get Comm RP folder")
|
|
136
|
+
local rp = RemoteProperty.new(folder, name, initialValue, inboundMiddleware, outboundMiddleware)
|
|
137
|
+
return rp
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
return Server
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
-- Types
|
|
2
|
-
-- Stephen Leitnick
|
|
3
|
-
-- December 20, 2021
|
|
4
|
-
|
|
5
|
-
export type Args = {
|
|
6
|
-
n: number,
|
|
7
|
-
[any]: any,
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export type FnBind = (Instance, ...any) -> ...any
|
|
11
|
-
|
|
12
|
-
export type ServerMiddlewareFn = (Instance, Args) -> (boolean, ...any)
|
|
13
|
-
export type ServerMiddleware = { ServerMiddlewareFn }
|
|
14
|
-
|
|
15
|
-
export type ClientMiddlewareFn = (Args) -> (boolean, ...any)
|
|
16
|
-
export type ClientMiddleware = { ClientMiddlewareFn }
|
|
17
|
-
|
|
18
|
-
return nil
|
|
1
|
+
-- Types
|
|
2
|
+
-- Stephen Leitnick
|
|
3
|
+
-- December 20, 2021
|
|
4
|
+
|
|
5
|
+
export type Args = {
|
|
6
|
+
n: number,
|
|
7
|
+
[any]: any,
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export type FnBind = (Instance, ...any) -> ...any
|
|
11
|
+
|
|
12
|
+
export type ServerMiddlewareFn = (Instance, Args) -> (boolean, ...any)
|
|
13
|
+
export type ServerMiddleware = { ServerMiddlewareFn }
|
|
14
|
+
|
|
15
|
+
export type ClientMiddlewareFn = (Args) -> (boolean, ...any)
|
|
16
|
+
export type ClientMiddleware = { ClientMiddlewareFn }
|
|
17
|
+
|
|
18
|
+
return nil
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
local RunService = game:GetService("RunService")
|
|
2
|
-
|
|
3
|
-
local Option = require(script.Parent.Parent.Option)
|
|
4
|
-
|
|
5
|
-
local Util = {}
|
|
6
|
-
|
|
7
|
-
Util.IsServer = RunService:IsServer()
|
|
8
|
-
Util.WaitForChildTimeout = 60
|
|
9
|
-
Util.DefaultCommFolderName = "__comm__"
|
|
10
|
-
Util.None = newproxy()
|
|
11
|
-
|
|
12
|
-
function Util.GetCommSubFolder(parent: Instance, subFolderName: string): Option.Option
|
|
13
|
-
local subFolder: Instance = nil
|
|
14
|
-
if Util.IsServer then
|
|
15
|
-
subFolder = parent:FindFirstChild(subFolderName)
|
|
16
|
-
if not subFolder then
|
|
17
|
-
subFolder = Instance.new("Folder")
|
|
18
|
-
subFolder.Name = subFolderName
|
|
19
|
-
subFolder.Parent = parent
|
|
20
|
-
end
|
|
21
|
-
else
|
|
22
|
-
subFolder = parent:WaitForChild(subFolderName, Util.WaitForChildTimeout)
|
|
23
|
-
end
|
|
24
|
-
return Option.Wrap(subFolder)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
return Util
|
|
1
|
+
local RunService = game:GetService("RunService")
|
|
2
|
+
|
|
3
|
+
local Option = require(script.Parent.Parent.Option)
|
|
4
|
+
|
|
5
|
+
local Util = {}
|
|
6
|
+
|
|
7
|
+
Util.IsServer = RunService:IsServer()
|
|
8
|
+
Util.WaitForChildTimeout = 60
|
|
9
|
+
Util.DefaultCommFolderName = "__comm__"
|
|
10
|
+
Util.None = newproxy()
|
|
11
|
+
|
|
12
|
+
function Util.GetCommSubFolder(parent: Instance, subFolderName: string): Option.Option
|
|
13
|
+
local subFolder: Instance = nil
|
|
14
|
+
if Util.IsServer then
|
|
15
|
+
subFolder = parent:FindFirstChild(subFolderName)
|
|
16
|
+
if not subFolder then
|
|
17
|
+
subFolder = Instance.new("Folder")
|
|
18
|
+
subFolder.Name = subFolderName
|
|
19
|
+
subFolder.Parent = parent
|
|
20
|
+
end
|
|
21
|
+
else
|
|
22
|
+
subFolder = parent:WaitForChild(subFolderName, Util.WaitForChildTimeout)
|
|
23
|
+
end
|
|
24
|
+
return Option.Wrap(subFolder)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
return Util
|
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
-- Comm
|
|
2
|
-
-- Stephen Leitnick
|
|
3
|
-
-- August 05, 2021
|
|
4
|
-
|
|
5
|
-
--[=[
|
|
6
|
-
@class Comm
|
|
7
|
-
Remote communication library.
|
|
8
|
-
|
|
9
|
-
This exposes the raw functions that are used by the `ServerComm` and `ClientComm` classes.
|
|
10
|
-
Those two classes should be preferred over accessing the functions directly through this
|
|
11
|
-
Comm library.
|
|
12
|
-
|
|
13
|
-
```lua
|
|
14
|
-
-- Server
|
|
15
|
-
local ServerComm = require(ReplicatedStorage.Packages.Comm).ServerComm
|
|
16
|
-
local serverComm = ServerComm.new(somewhere, "MyComm")
|
|
17
|
-
serverComm:BindFunction("Hello", function(player: Player)
|
|
18
|
-
return "Hi"
|
|
19
|
-
end)
|
|
20
|
-
|
|
21
|
-
-- Client
|
|
22
|
-
local ClientComm = require(ReplicatedStorage.Packages.Comm).ClientComm
|
|
23
|
-
local clientComm = ClientComm.new(somewhere, false, "MyComm")
|
|
24
|
-
local comm = clientComm:BuildObject()
|
|
25
|
-
print(comm:Hello()) --> Hi
|
|
26
|
-
```
|
|
27
|
-
]=]
|
|
28
|
-
local Comm = {
|
|
29
|
-
Server = require(script.Server),
|
|
30
|
-
Client = require(script.Client),
|
|
31
|
-
ServerComm = require(script.Server.ServerComm),
|
|
32
|
-
ClientComm = require(script.Client.ClientComm),
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return Comm
|
|
1
|
+
-- Comm
|
|
2
|
+
-- Stephen Leitnick
|
|
3
|
+
-- August 05, 2021
|
|
4
|
+
|
|
5
|
+
--[=[
|
|
6
|
+
@class Comm
|
|
7
|
+
Remote communication library.
|
|
8
|
+
|
|
9
|
+
This exposes the raw functions that are used by the `ServerComm` and `ClientComm` classes.
|
|
10
|
+
Those two classes should be preferred over accessing the functions directly through this
|
|
11
|
+
Comm library.
|
|
12
|
+
|
|
13
|
+
```lua
|
|
14
|
+
-- Server
|
|
15
|
+
local ServerComm = require(ReplicatedStorage.Packages.Comm).ServerComm
|
|
16
|
+
local serverComm = ServerComm.new(somewhere, "MyComm")
|
|
17
|
+
serverComm:BindFunction("Hello", function(player: Player)
|
|
18
|
+
return "Hi"
|
|
19
|
+
end)
|
|
20
|
+
|
|
21
|
+
-- Client
|
|
22
|
+
local ClientComm = require(ReplicatedStorage.Packages.Comm).ClientComm
|
|
23
|
+
local clientComm = ClientComm.new(somewhere, false, "MyComm")
|
|
24
|
+
local comm = clientComm:BuildObject()
|
|
25
|
+
print(comm:Hello()) --> Hi
|
|
26
|
+
```
|
|
27
|
+
]=]
|
|
28
|
+
local Comm = {
|
|
29
|
+
Server = require(script.Server),
|
|
30
|
+
Client = require(script.Client),
|
|
31
|
+
ServerComm = require(script.Server.ServerComm),
|
|
32
|
+
ClientComm = require(script.Client.ClientComm),
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return Comm
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
[package]
|
|
2
|
-
name = "sleitnick/comm"
|
|
3
|
-
description = "Comm library for remote communication"
|
|
4
|
-
version = "1.0.1"
|
|
5
|
-
license = "MIT"
|
|
6
|
-
authors = ["Stephen Leitnick"]
|
|
7
|
-
registry = "https://github.com/UpliftGames/wally-index"
|
|
8
|
-
realm = "shared"
|
|
9
|
-
|
|
10
|
-
[dependencies]
|
|
11
|
-
Signal = "sleitnick/signal@2"
|
|
12
|
-
Option = "sleitnick/option@1"
|
|
13
|
-
Promise = "evaera/promise@4"
|
|
1
|
+
[package]
|
|
2
|
+
name = "sleitnick/comm"
|
|
3
|
+
description = "Comm library for remote communication"
|
|
4
|
+
version = "1.0.1"
|
|
5
|
+
license = "MIT"
|
|
6
|
+
authors = ["Stephen Leitnick"]
|
|
7
|
+
registry = "https://github.com/UpliftGames/wally-index"
|
|
8
|
+
realm = "shared"
|
|
9
|
+
|
|
10
|
+
[dependencies]
|
|
11
|
+
Signal = "sleitnick/signal@2"
|
|
12
|
+
Option = "sleitnick/option@1"
|
|
13
|
+
Promise = "evaera/promise@4"
|