A11 (C++ runtime)
Native C++ implementation of the A11 streaming action runtime
Loading...
Searching...
No Matches
websocket_signalling.h
Go to the documentation of this file.
1/*
2 * Copyright 2026 The A11 Authors
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
29#ifndef A11_NET_WEBSOCKET_SIGNALLING_H_
30#define A11_NET_WEBSOCKET_SIGNALLING_H_
31
32#include <cstddef>
33#include <cstdint>
34#include <memory>
35#include <string>
36
37#include <absl/base/nullability.h>
38#include <absl/status/status.h>
39#include <absl/status/statusor.h>
40#include <absl/time/time.h>
41
43#include "a11/net/http2.h"
44#include "a11/net/signalling.h"
45
46namespace a11::net {
47
63 absl::Time deadline = absl::InfiniteFuture();
64 size_t max_message_size = 1024 * 1024;
73
75 absl::Status Validate() const;
76};
77
87 : public SignallingTransport,
88 public std::enable_shared_from_this<WebSocketSignallingClient> {
89 private:
90 struct State;
91
92 struct ConstructorToken {};
93
94 public:
105 std::string url, std::string identity,
106 OnSignallingMessage on_message = {},
108
110
111 absl::Status Send(SignallingMessage message) override;
112 absl::Status SetOnMessage(OnSignallingMessage on_message) override;
113 absl::Status Close() override;
114 [[nodiscard]] std::string identity() const override;
115 [[nodiscard]] bool connected() const override;
116 [[nodiscard]] absl::Status GetStatus() const override;
118 [[nodiscard]] void* absl_nullable GetImpl() const;
119
120 explicit WebSocketSignallingClient(ConstructorToken,
121 std::shared_ptr<State> state)
122 : state_(std::move(state)) {}
123
124 private:
125 static void Pump(const std::shared_ptr<State>& state);
126 static void Fail(const std::shared_ptr<State>& state, absl::Status status);
127
128 std::shared_ptr<State> state_;
129};
130
140 std::string identity;
141 std::string path;
142 std::string query;
144};
145
154
156using OnSignallingDeparture = std::function<void(std::string identity)>;
157
168 std::function<absl::Status(SignallingMessage* absl_nonnull message)>;
169
179 std::function<absl::Status(const SignallingMessage& message)>;
180
219
228 : public std::enable_shared_from_this<WebSocketSignallingServer> {
229 public:
237 static absl::StatusOr<std::shared_ptr<WebSocketSignallingServer>> Create(
238 std::shared_ptr<SignallingService> service,
240
242
244 absl::Status Stop();
257 absl::Status Disconnect(std::string_view identity);
259 [[nodiscard]] std::uint16_t port() const;
261 [[nodiscard]] bool running() const;
263 [[nodiscard]] std::shared_ptr<SignallingService> service() const;
265 [[nodiscard]] void* absl_nullable GetImpl() const;
266
267 private:
268 struct State;
269
270 explicit WebSocketSignallingServer(std::shared_ptr<State> state)
271 : state_(std::move(state)) {}
272
276 static a11::Task Register(const std::shared_ptr<State>& state,
277 std::string identity, HttpRequest request,
278 std::shared_ptr<Http2ResponseWriter> response);
279
280 static void Remove(const std::shared_ptr<State>& state,
281 const std::string& identity, std::uint64_t only = 0,
282 bool report = true);
283
284 std::shared_ptr<State> state_;
285};
286
287} // namespace a11::net
288
289#endif // A11_NET_WEBSOCKET_SIGNALLING_H_
Shared handle to one asynchronous result.
Definition future.h:126
Abstract identity-bound channel over which signalling flows.
Definition signalling.h:105
A SignallingTransport that relays messages over a WebSocket.
Definition websocket_signalling.h:88
absl::Status GetStatus() const override
Definition websocket_signalling.cc:444
void *absl_nullable GetImpl() const
Definition websocket_signalling.cc:449
~WebSocketSignallingClient() override
Definition websocket_signalling.cc:368
bool connected() const override
Definition websocket_signalling.cc:439
absl::Status Send(SignallingMessage message) override
Sends a signalling message to the peer (non-blocking).
Definition websocket_signalling.cc:372
absl::Status Close() override
Closes the transport and releases its resources.
Definition websocket_signalling.cc:408
absl::Status SetOnMessage(OnSignallingMessage on_message) override
Registers the async callback invoked for each inbound message.
Definition websocket_signalling.cc:392
std::string identity() const override
Definition websocket_signalling.cc:435
WebSocketSignallingClient(ConstructorToken, std::shared_ptr< State > state)
Definition websocket_signalling.h:120
static a11::Future< std::shared_ptr< WebSocketSignallingClient > > Connect(std::string url, std::string identity, OnSignallingMessage on_message={}, WebSocketSignallingClientOptions options={})
Asynchronously connects to a WebSocket signalling server.
Definition websocket_signalling.cc:157
Fronts an in-process SignallingService over a WebSocket.
Definition websocket_signalling.h:228
~WebSocketSignallingServer()
Definition websocket_signalling.cc:763
absl::Status Stop()
Stops the server and closes all client connections.
Definition websocket_signalling.cc:767
bool running() const
Definition websocket_signalling.cc:797
static absl::StatusOr< std::shared_ptr< WebSocketSignallingServer > > Create(std::shared_ptr< SignallingService > service, WebSocketSignallingServerOptions options={})
Creates a WebSocket signalling server fronting service.
Definition websocket_signalling.cc:491
std::uint16_t port() const
Definition websocket_signalling.cc:792
std::shared_ptr< SignallingService > service() const
Definition websocket_signalling.cc:803
void *absl_nullable GetImpl() const
Definition websocket_signalling.cc:807
absl::Status Disconnect(std::string_view identity)
Closes one identity's connection, if this server holds it.
Definition websocket_signalling.cc:722
Completion values used by every asynchronous A11 operation.
A11's nghttp2 HTTP/2 client, server, and streaming primitives.
Definition action.h:65
std::vector< std::pair< std::string, std::string > > HttpHeaders
An ordered list of (name, value) HTTP/2 header fields.
Definition http2.h:70
std::function< a11::Task(SignallingMessage message)> OnSignallingMessage
Async callback invoked for each inbound SignallingMessage.
Definition signalling.h:96
std::function< a11::Task(SignallingAdmission)> OnSignallingAdmission
Decides whether a peer may register, asynchronously.
Definition websocket_signalling.h:153
std::function< void(std::string identity)> OnSignallingDeparture
Notified when a registered identity's connection goes away.
Definition websocket_signalling.h:156
std::function< absl::Status(const SignallingMessage &message)> OnSignallingUnroutable
Offered a message whose recipient is not connected to this server.
Definition websocket_signalling.h:179
std::function< absl::Status(SignallingMessage *absl_nonnull message)> OnSignallingMessageFilter
Inspects, rewrites or refuses each inbound message before routing.
Definition websocket_signalling.h:168
Future< Unit > Task
Asynchronous operation whose only successful result is completion itself.
Definition future.h:411
Out-of-band signalling used to negotiate WebRTC peer connections.
Body-size limits, buffering thresholds, deadline, TLS, and HTTP protocol negotiation for an HTTP clie...
Definition http2.h:150
A parsed HTTP/2 request: pseudo-headers, fields, and body.
Definition http2.h:90
What a peer presented when asking to register an identity.
Definition websocket_signalling.h:139
std::string identity
Identity taken from the request path.
Definition websocket_signalling.h:140
std::string path
Full request path, query included.
Definition websocket_signalling.h:141
std::string query
The part after ?, without it.
Definition websocket_signalling.h:142
HttpHeaders headers
Request headers, as sent.
Definition websocket_signalling.h:143
One signalling payload: an SDP description, an ICE candidate, or an error.
Definition signalling.h:62
Connection tuning for a WebSocketSignallingClient.
Definition websocket_signalling.h:54
absl::Time deadline
How long registering may take.
Definition websocket_signalling.h:63
size_t max_message_size
Inbound JSON message limit.
Definition websocket_signalling.h:64
HttpHeaders headers
Extra headers sent on the WebSocket handshake.
Definition websocket_signalling.h:72
absl::Status Validate() const
Definition websocket_signalling.cc:121
Http2Options http2_options
HTTP/2 connection and TLS policy.
Definition websocket_signalling.h:55
Definition websocket_signalling.cc:132
Listen address, limits and policy hooks for a WebSocketSignallingServer.
Definition websocket_signalling.h:190
OnSignallingAdmission on_admit
Admission control, if any.
Definition websocket_signalling.h:198
size_t max_message_size
Inbound JSON message limit.
Definition websocket_signalling.h:196
std::uint16_t port
Listen port; zero requests an ephemeral port.
Definition websocket_signalling.h:194
absl::Status Validate() const
Definition websocket_signalling.cc:454
OnSignallingMessageFilter on_message
Per-message policy, if any.
Definition websocket_signalling.h:200
bool replace_existing
Whether a new registration displaces an existing one.
Definition websocket_signalling.h:214
OnSignallingUnroutable on_unroutable
Where else to look, if anywhere.
Definition websocket_signalling.h:201
Http2Options http2_options
Server HTTP/2 and TLS policy.
Definition websocket_signalling.h:195
OnSignallingDeparture on_departed
Presence bookkeeping, if any.
Definition websocket_signalling.h:199
std::string path_prefix
Prefix before identity registration paths.
Definition websocket_signalling.h:191
std::string bind_address
Local listen address.
Definition websocket_signalling.h:193
Definition websocket_signalling.cc:470
const std::string identity
Definition webrtc_wire_stream.cc:107