mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-10-02 10:53:44 +00:00
The dashboard's web server answers one request at a time, so converting a big .nif (glom files up to tens of MB) held up every other request, flairs included. - dWeb: Web::Defer hands a request to another thread; the reply is sent from the web thread on its next poll (DeferredQueue). A client that leaves first cancels it and the late reply is dropped. The synchronous route API is unchanged. - Web::Shutdown closes connections while the state their close events touch is still alive; the destructor no longer runs handlers during static destruction (stopping the dashboard aborted in ~WSClient). - WorkerPool: priority lanes, with one thread only for urgent work (flairs, small models, textures), and limited background work. - Scenery: mesh and texture routes (and the showcase's) convert on the pool; thread-safe memory and disk caches, one conversion per model at a time with waiters sharing it; zones are converted ahead onto the disk cache while viewed. - Setting scenery_workers (0: half the cores, 2 to 4). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
38 lines
1.1 KiB
C++
38 lines
1.1 KiB
C++
#pragma once
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "eHTTPStatusCode.h"
|
|
|
|
// Content type enum for HTTP responses
|
|
enum class eContentType {
|
|
APPLICATION_JSON,
|
|
TEXT_HTML,
|
|
TEXT_CSS,
|
|
TEXT_JAVASCRIPT,
|
|
TEXT_PLAIN,
|
|
TEXT_CSV,
|
|
IMAGE_PNG,
|
|
IMAGE_JPEG,
|
|
APPLICATION_OCTET_STREAM,
|
|
TEXT_PROMETHEUS // the Prometheus text exposition format
|
|
};
|
|
|
|
struct DeferredState;
|
|
|
|
// For passing HTTP messages between functions
|
|
struct HTTPReply {
|
|
eHTTPStatusCode status = eHTTPStatusCode::NOT_FOUND;
|
|
std::string message = "{\"error\":\"Not Found\"}";
|
|
eContentType contentType = eContentType::APPLICATION_JSON;
|
|
std::string location = ""; // For redirect responses (Location header)
|
|
std::vector<std::string> headers{}; // Extra raw headers, e.g. "Set-Cookie: a=b"
|
|
// When set on a 200 reply, this file is streamed from disk as the body (with contentType and headers) instead of
|
|
// message, so large downloads never sit in memory
|
|
std::string file{};
|
|
// Set by Web::Defer: the handler answers later, from another thread (DeferredReply), so nothing is sent now
|
|
std::shared_ptr<DeferredState> deferred{};
|
|
};
|