Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
session.hpp
Go to the documentation of this file.
1#pragma once
2
8
9#include <chrono>
10#include <condition_variable>
11#include <functional>
12#include <memory>
13#include <optional>
14#include <mutex>
15#include <span>
16#include <string>
17#include <string_view>
18#include <thread>
19#include <vector>
20
21namespace pulp::inspect {
22
24
27 std::vector<InspectorCapability> custom_capabilities;
28 std::vector<InspectorCapability> available_capabilities;
30};
31
37public:
39
40 InspectorProfile profile() const { return profile_; }
41 std::span<const InspectorCapability> available_capabilities() const {
42 return available_;
43 }
44 std::span<const InspectorCapability> effective_capabilities() const {
45 return effective_;
46 }
47
48 bool is_available(InspectorCapability capability) const;
49 bool is_granted(InspectorCapability capability) const;
50
53 std::optional<InspectorMessage> authorize(const InspectorMessage& request,
54 bool owns_controller_lease) const;
55
56private:
58 std::vector<InspectorCapability> available_;
59 std::vector<InspectorCapability> effective_;
60};
61
68
75
79public:
80 using Clock = std::function<std::chrono::steady_clock::time_point()>;
81
83 std::chrono::milliseconds ttl = std::chrono::seconds(15),
84 Clock clock = [] { return std::chrono::steady_clock::now(); });
85
88 bool release(std::string_view owner);
89 void disconnect(std::string_view owner);
90
91 bool owns(std::string_view owner);
92 std::optional<std::string> owner();
93 std::chrono::milliseconds remaining();
94
95private:
96 friend class InspectorSession;
97
98public:
103
104private:
105
106 void expire_if_needed();
107 bool begin_operation(std::string_view owner);
108 void end_operation(std::string_view owner);
109 bool release_with_reason(std::string_view owner,
111 void terminate();
112 std::vector<EndedScope> take_ended_scopes();
113 void finish_scope(TestInputReleaseReason reason);
114
115 std::chrono::milliseconds ttl_;
116 Clock clock_;
117 std::string owner_;
118 std::chrono::steady_clock::time_point expires_at_{};
119 std::size_t active_operations_ = 0;
120 bool release_pending_ = false;
121 TestInputReleaseReason pending_reason_ =
123 std::vector<EndedScope> ended_scopes_;
124};
125
127 std::string session_id;
128 std::string instance_id;
129 std::string plugin_id;
130 std::string protocol_version = "1";
131};
132
138public:
140 std::function<InspectorMessage(const InspectorMessage& request)>;
142 const InspectorRequestContext& context,
143 const InspectorMessage& request)>;
145 std::function<void(const InspectorControllerScopeEnd& event)>;
147 std::function<void(std::string_view client_id)>;
148
151 RequestHandler handler,
152 std::chrono::milliseconds lease_ttl =
153 std::chrono::seconds(15),
155 [] { return std::chrono::steady_clock::now(); });
158 ContextRequestHandler handler,
159 std::chrono::milliseconds lease_ttl =
160 std::chrono::seconds(15),
162 [] { return std::chrono::steady_clock::now(); });
164
165 InspectorMessage handle(std::string_view client_id,
166 const InspectorMessage& request);
169 void set_main_thread_rpc(std::shared_ptr<InspectorMainThreadRpc> rpc);
175 std::string method, ContextRequestHandler handler);
184 void set_audit_log(std::shared_ptr<InspectorAuditLog> audit_log);
185 void disconnect(std::string_view client_id);
191 void after_concurrent_dispatches(std::function<void()> completion);
199
200 const InspectorSessionInfo& info() const { return info_; }
201 const InspectorAccessPolicy& policy() const { return policy_; }
202
203private:
204 class State;
205 InspectorMessage handle_session_method(std::string_view client_id,
206 const InspectorMessage& request);
207
209 InspectorAccessPolicy policy_;
210 std::shared_ptr<State> state_;
211};
212
213} // namespace pulp::inspect
Resolves named profiles and exact custom grants against capabilities that the host actually attached.
Definition session.hpp:36
std::span< const InspectorCapability > available_capabilities() const
Definition session.hpp:41
bool is_granted(InspectorCapability capability) const
InspectorProfile profile() const
Definition session.hpp:40
std::span< const InspectorCapability > effective_capabilities() const
Definition session.hpp:44
std::optional< InspectorMessage > authorize(const InspectorMessage &request, bool owns_controller_lease) const
Returns an error response when the request is unknown, unavailable, not granted, or requires a contro...
bool is_available(InspectorCapability capability) const
InspectorAccessPolicy(InspectorPolicyConfig config={})
bool release(std::string_view owner)
void disconnect(std::string_view owner)
std::optional< std::string > owner()
InspectorControllerLease(std::chrono::milliseconds ttl=std::chrono::seconds(15), Clock clock=[] { return std::chrono::steady_clock::now();})
bool owns(std::string_view owner)
ControllerLeaseResult acquire(std::string_view owner)
ControllerLeaseResult renew(std::string_view owner)
std::function< std::chrono::steady_clock::time_point()> Clock
Definition session.hpp:80
std::chrono::milliseconds remaining()
friend class InspectorSession
Definition session.hpp:96
Bounded response-after-apply handoff from an inspector transport thread to the registered host main t...
Definition main_thread_rpc.hpp:23
void set_audit_log(std::shared_ptr< InspectorAuditLog > audit_log)
void disconnect(std::string_view client_id)
void set_main_thread_rpc(std::shared_ptr< InspectorMainThreadRpc > rpc)
Install the generation-scoped main-thread handoff used for domain requests.
bool dispatches_accepting() const
Snapshot whether new domain dispatches are currently admitted.
void set_controller_scope_end_handler(ControllerScopeEndHandler handler)
Install the host cleanup hook for controller-scoped test input.
InspectorMessage handle(std::string_view client_id, const InspectorMessage &request)
std::function< InspectorMessage(const InspectorMessage &request)> RequestHandler
Definition session.hpp:139
void set_client_disconnect_handler(ClientDisconnectHandler handler)
Install generation-scoped cleanup for per-client domain state.
const InspectorAccessPolicy & policy() const
Definition session.hpp:201
InspectorSession(InspectorSessionInfo info, InspectorPolicyConfig policy, ContextRequestHandler handler, std::chrono::milliseconds lease_ttl=std::chrono::seconds(15), InspectorControllerLease::Clock clock=[] { return std::chrono::steady_clock::now();})
std::function< void(std::string_view client_id)> ClientDisconnectHandler
Definition session.hpp:146
const InspectorSessionInfo & info() const
Definition session.hpp:200
void resume_dispatches()
Reopen domain-handler admission for a new authenticated server generation.
InspectorSession(InspectorSessionInfo info, InspectorPolicyConfig policy, RequestHandler handler, std::chrono::milliseconds lease_ttl=std::chrono::seconds(15), InspectorControllerLease::Clock clock=[] { return std::chrono::steady_clock::now();})
void close_dispatch_admission()
Refuse new work without waiting for already-admitted concurrent work.
void set_concurrent_request_handler(std::string method, ContextRequestHandler handler)
Route one exact authorized method through a handler that is safe to run concurrently on its transport...
std::function< InspectorMessage( const InspectorRequestContext &context, const InspectorMessage &request)> ContextRequestHandler
Definition session.hpp:141
void after_concurrent_dispatches(std::function< void()> completion)
Run completion after every already-admitted concurrent dispatch has returned.
void suspend_dispatches()
Cancel queued domain handlers and reject new ones during server teardown.
std::function< void(const InspectorControllerScopeEnd &event)> ControllerScopeEndHandler
Definition session.hpp:144
Definition agent_context.hpp:7
InspectorProfile
Definition capabilities.hpp:34
@ Off
Definition capabilities.hpp:35
InspectorCapability
Definition capabilities.hpp:10
ControllerLeaseResult
Definition session.hpp:62
@ Acquired
Definition session.hpp:63
@ HeldByOther
Definition session.hpp:65
@ InvalidOwner
Definition session.hpp:66
@ Renewed
Definition session.hpp:64
TestInputReleaseReason
Definition test_input.hpp:43
@ ControllerReleased
Definition test_input.hpp:44
@ State
Definition capabilities.hpp:44
std::string owner
Definition session.hpp:100
TestInputReleaseReason reason
Definition session.hpp:101
std::string client_id
Definition session.hpp:72
TestInputReleaseReason reason
Definition session.hpp:73
std::string instance_id
Definition session.hpp:71
std::string session_id
Definition session.hpp:70
A single inspector protocol message (request, response, or event).
Definition protocol.hpp:18
Definition session.hpp:25
InspectorProfile profile
Definition session.hpp:26
bool runtime_eval_enabled
Definition session.hpp:29
std::vector< InspectorCapability > available_capabilities
Definition session.hpp:28
std::vector< InspectorCapability > custom_capabilities
Definition session.hpp:27
Authenticated transport identity attached to a domain request.
Definition inspector_delivery.hpp:11
Definition session.hpp:126
std::string plugin_id
Definition session.hpp:129
std::string instance_id
Definition session.hpp:128
std::string protocol_version
Definition session.hpp:130
std::string session_id
Definition session.hpp:127