Kit standard
The shared architecture used by every Betide online kit
Kit standard
Every Betide online kit uses BetideCore for shared lifetime, errors, results, web requests, settings, and operation control. Platform behavior stays inside its kit, while cross-kit behavior is exposed through provider interfaces. A kit still builds independently: WITH_UCIK=1 when Source/UCIKCore is present and WITH_UCIK=0 in its standalone package.
Module shape
Runtime source belongs under Public/ and Private/. Public headers expose the smallest stable API; implementation helpers and Automation tests remain private. Each runtime kit enables full IWYU and C++20, publicly depends on BetideCore, and uses the canonical WITH_UCIK probe. External SDK bridge modules remain ModuleType.External and do not own runtime objects or tests.
Shared primitives
| Concern | Use |
|---|---|
| Async Blueprint lifetime | UBetideAsyncAction |
| Web Blueprint lifetime | UBetideWebApiAction |
| SDK/delegate ownership | UBetideKitSubsystem and its binding set |
| Settings discovery | UBetideKitSettings and FBetideSettingsRegistry |
| Errors and callbacks | FBetideError, TBetideResult<T>, FBetideCallback<T> |
| HTTP, retry, and JSON | UBetideWebRequest |
| Serialized/deduplicated work | BetideOps |
Async nodes implement Run() and leave lifetime completion to Finish() or Cancel(). Callback-owning subsystems put Steam callbacks, EOS notification removers, and Unreal delegate handles into the shared binding set. Kit nodes never create their own HTTP retry pipeline.
#include "BetideAsyncAction.h"
UCLASS()
class UMyKit_Query final : public UBetideAsyncAction
{
GENERATED_BODY()
protected:
virtual void Run() override;
};
void UMyKit_Query::Run()
{
Service->Query(FBetideCallback<FMyResult>::CreateWeakLambda(
this, [this](const TBetideResult<FMyResult>& Result)
{
Result.bOk ? OnSuccess.Broadcast(Result.GetValue()) : OnFailure.Broadcast(Result.Error);
Finish();
}));
}Completion checks
Automation tests live in Private/Tests/ and use the UCIK.<Kit>.<Area> prefix. They cover validation, state transitions, conversions, total error mapping, and mocked provider or HTTP behavior. Before committing a converted module, run:
python Scripts/check-standard.py --module <Module>
clang-format -i <touched C++ files>See Hosting providers and Matchmaking providers for the cross-kit adapter contracts.