// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "UObject/Object.h" #include "Containers/Queue.h" #include "Tickable.h" #include "Struct/DTFluxRequestStructs.h" #include "Struct/DTFluxServerResponseStruct.h" #include "Types/Enum/DTFluxCoreEnum.h" #include "DTFluxQueuedManager.generated.h" DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnRequestTimedOut, const FDTFluxQueuedRequest&, TimedOutRequest); /** * @brief Classe Tickable gérant les requêtes WebSockets qui ne sont pas traçables nativement par l'API. * Cette classe utilise TQueue pour gérer efficacement les requêtes en attente et vérifie leur état dans le tick. */ UCLASS() class DTFLUXNETWORK_API UDTFluxQueuedManager : public UObject, public FTickableGameObject { GENERATED_BODY() public: /** Constructeur par défaut */ UDTFluxQueuedManager(); virtual ~UDTFluxQueuedManager() override; void Initialize(); FGuid QueueRequest(EDTFluxRequestType RequestType, int32 ContestId = -1, int32 StageId = -1, int32 SplitId = -1, const FString& RawMessage = ""); bool MarkRequestAsError(const FGuid& TargetRequestGuid); bool MarkRequestAsResponded(const FGuid& TargetRequestGuid); bool MarkRequestAsResponded(const FDTFluxQueuedRequest& TargetRequest); bool IsRequestPending(FGuid& OutRequestId, EDTFluxRequestType RequestType, int32 ContestId = -1, int32 StageId = -1, int32 SplitId = -1); FDTFluxQueuedRequest* GetRequestPending(EDTFluxRequestType RequestType, int32 ContestId = -1, int32 StageId = -1, int32 SplitId = -1); const FDTFluxQueuedRequest* GetRequest(const FGuid& SearchedGuid); int32 GetPendingRequestCount(); int32 CleanupTimedOutRequests(); int32 CleanCashedRequests(); void ClearAllRequests(); // bool TryProcessResponse(const FDTFluxServerResponse& Response); // Interface FTickableGameObject virtual void Tick(float DeltaTime) override; virtual bool IsTickable() const override; virtual TStatId GetStatId() const override; virtual bool IsTickableWhenPaused() const override { return true; } virtual bool IsTickableInEditor() const override { return true; } // Interface ~FTickableGameObject UPROPERTY(BlueprintAssignable, Category = "DTFlux|Network") FOnRequestTimedOut OnRequestTimedOut; private: TQueue PendingRequestsQueue; TQueue CompletedRequestsQueue; TQueue TimedOutRequestsQueue; bool bIsInitialized; float CheckInterval; float TimeSinceLastCheck; };