4#include <neograph/provider.h>
5#include <neograph/runtime_context.h>
7#include <asio/awaitable.hpp>
17struct ProviderDispatchReceiptData {
18 std::string dispatch_id;
19 std::string provider_binding_identity;
20 std::string assembly_receipt_id;
21 std::string normalized_request_digest;
23 ProviderMode mode = ProviderMode::Collect;
29 static constexpr std::uint32_t STORAGE_SCHEMA_VERSION = 1;
34 const std::string& dispatch_id()
const noexcept;
35 const std::string& provider_binding_identity()
const noexcept;
36 const std::string& assembly_receipt_id()
const noexcept;
37 const std::string& normalized_request_digest()
const noexcept;
38 const std::string& model()
const noexcept;
39 ProviderMode mode()
const noexcept;
40 const std::string& id()
const noexcept;
41 std::string serialize_canonical()
const;
46 std::shared_ptr<const Impl> impl_;
50enum class ProviderDispatchState : std::uint8_t {
51 Unavailable, Missing, AdmittedPending, Succeeded, Failed, ReconciliationRequired,
54struct ProviderDispatchOutcomeReceiptData {
55 std::string dispatch_id;
56 std::string dispatch_receipt_id;
57 ProviderDispatchState state = ProviderDispatchState::ReconciliationRequired;
58 std::string response_digest;
65 static constexpr std::uint32_t STORAGE_SCHEMA_VERSION = 1;
70 const std::string& dispatch_id()
const noexcept;
71 const std::string& dispatch_receipt_id()
const noexcept;
72 ProviderDispatchState state()
const noexcept;
73 const std::string& response_digest()
const noexcept;
74 const std::string& error()
const noexcept;
75 const std::string& id()
const noexcept;
76 std::string serialize_canonical()
const;
81 std::shared_ptr<const Impl> impl_;
84enum class ProviderDispatchReceiptPutResult : std::uint8_t { Stored, AlreadyPresent, Conflict };
86enum class ProviderDispatchOutcomePutResult : std::uint8_t {
100 virtual ProviderDispatchReceiptPutResult
persist(std::string_view owner_scope,
103 return persist(receipt);
107 virtual ProviderDispatchState
state(std::string_view dispatch_id)
const {
109 return ProviderDispatchState::Unavailable;
111 virtual ProviderDispatchState state(std::string_view owner_scope,
112 std::string_view dispatch_id)
const {
114 return state(dispatch_id);
122 virtual ProviderDispatchOutcomePutResult settle(
123 std::string_view owner_scope,
125 virtual std::optional<ProviderDispatchOutcomeReceipt> outcome(
126 std::string_view owner_scope,
127 std::string_view dispatch_id)
const = 0;
150 ProviderDispatchReceiptPutResult
persist(std::string_view owner_scope,
152 ProviderDispatchState
state(std::string_view dispatch_id)
const override;
153 ProviderDispatchState state(std::string_view owner_scope,
154 std::string_view dispatch_id)
const override;
155 ProviderDispatchOutcomePutResult settle(
156 std::string_view owner_scope,
158 std::optional<ProviderDispatchOutcomeReceipt> outcome(
159 std::string_view owner_scope,
160 std::string_view dispatch_id)
const override;
164 std::unique_ptr<Impl> impl_;
169 ProviderDispatchOutcomePersistenceError(sp::runtime::Result outcome, std::exception_ptr cause,
170 std::exception_ptr delivery_error = {})
171 : ProviderOutcomeError(
"Provider outcome settlement could not be persisted",
172 std::move(outcome), std::move(cause)),
173 delivery_error_(std::move(delivery_error)) {}
174 const std::exception_ptr& delivery_error() const noexcept {
return delivery_error_; }
176 std::exception_ptr delivery_error_;
186 std::shared_ptr<ProviderDispatchReceiptStore> receipts,
187 std::string provider_binding_identity);
194 sp::runtime::Result dispatch(std::string dispatch_id,
196 sp::runtime::Result dispatch(std::string owner_scope, std::string dispatch_id,
198 asio::awaitable<sp::runtime::Result> dispatch_async(std::string dispatch_id,
200 asio::awaitable<sp::runtime::Result> dispatch_async(std::string owner_scope, std::string dispatch_id,
202 sp::runtime::Result dispatch_prepared(std::string dispatch_id,
204 sp::runtime::Result dispatch_prepared(std::string owner_scope, std::string dispatch_id,
206 asio::awaitable<sp::runtime::Result> dispatch_prepared_async(std::string dispatch_id,
208 asio::awaitable<sp::runtime::Result> dispatch_prepared_async(std::string owner_scope, std::string dispatch_id,
213 static asio::awaitable<sp::runtime::Result> dispatch_impl(
214 std::shared_ptr<Impl> impl,
215 std::string owner_scope,
216 std::string dispatch_id,
218 PreparedProviderRequest request, ProviderBudgetClaim claim);
219 std::shared_ptr<Impl> impl_;
NEOGRAPH_API export/import macro for shared-library builds.
Evidence that one normalized provider request was assembled from one exact epoch.
Standalone write-ahead dispatch boundary.
Opt-in marker for receipt stores backed by durable storage.
Thread-safe in-memory receipt journal for standalone use and tests.
ProviderDispatchState state(std::string_view dispatch_id) const override
Returns durable progress for a dispatch id.
ProviderDispatchReceiptPutResult persist(std::string_view owner_scope, const ProviderDispatchReceipt &receipt) override
Scoped operations prevent one owner's dispatch id from colliding with another's.
Immutable terminal or reconciliation evidence for one admitted dispatch.
Optional terminal-outcome extension for receipt stores.
Durable write-ahead journal keyed by owner scope and dispatch_id; AlreadyPresent requires exact recei...
virtual ProviderDispatchReceiptPutResult persist(std::string_view owner_scope, const ProviderDispatchReceipt &receipt)
Scoped operations prevent one owner's dispatch id from colliding with another's.
virtual ProviderDispatchState state(std::string_view dispatch_id) const
Returns durable progress for a dispatch id.
Immutable proof that an assembled request was admitted to provider dispatch.
Post-dispatch host failure retaining the exact drained provider outcome.
Portable request controls remain the SDK's declared, family-specific fields.