blob: 102fd1fccefc30440cbe5dcf950dc5a125fb1dbc [file] [log] [blame]
// Copyright (c) 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This header contains interfaces that abstract away different backing
// protocols for WebTransport.
#include <cstddef>
#include <memory>
#include "absl/base/attributes.h"
#include "absl/strings/string_view.h"
#include "quic/core/quic_datagram_queue.h"
#include "quic/core/quic_types.h"
#include "quic/platform/api/quic_export.h"
#include "spdy/core/spdy_header_block.h"
namespace quic {
// Visitor that gets notified about events related to a WebTransport stream.
class QUIC_EXPORT_PRIVATE WebTransportStreamVisitor {
virtual ~WebTransportStreamVisitor() {}
// Called whenever the stream has readable data available.
virtual void OnCanRead() = 0;
// Called whenever the stream is not write-blocked and can accept new data.
virtual void OnCanWrite() = 0;
// Called when RESET_STREAM is received for the stream.
virtual void OnResetStreamReceived(WebTransportStreamError error) = 0;
// Called when STOP_SENDING is received for the stream.
virtual void OnStopSendingReceived(WebTransportStreamError error) = 0;
// Called when the write side of the stream is closed and all of the data sent
// has been acknowledged ("Data Recvd" state of RFC 9000).
virtual void OnWriteSideInDataRecvdState() = 0;
// A stream (either bidirectional or unidirectional) that is contained within a
// WebTransport session.
class QUIC_EXPORT_PRIVATE WebTransportStream {
struct QUIC_EXPORT_PRIVATE ReadResult {
// Number of bytes actually read.
size_t bytes_read;
// Whether the FIN has been received; if true, no further data will arrive
// on the stream, and the stream object can be soon potentially garbage
// collected.
bool fin;
virtual ~WebTransportStream() {}
// Reads at most |buffer_size| bytes into |buffer|.
ABSL_MUST_USE_RESULT virtual ReadResult Read(char* buffer,
size_t buffer_size) = 0;
// Reads all available data and appends it to the end of |output|.
ABSL_MUST_USE_RESULT virtual ReadResult Read(std::string* output) = 0;
// Writes |data| into the stream. Returns true on success.
ABSL_MUST_USE_RESULT virtual bool Write(absl::string_view data) = 0;
// Sends the FIN on the stream. Returns true on success.
ABSL_MUST_USE_RESULT virtual bool SendFin() = 0;
// Indicates whether it is possible to write into stream right now.
virtual bool CanWrite() const = 0;
// Indicates the number of bytes that can be read from the stream.
virtual size_t ReadableBytes() const = 0;
// An ID that is unique within the session. Those are not exposed to the user
// via the web API, but can be used internally for bookkeeping and
// diagnostics.
virtual QuicStreamId GetStreamId() const = 0;
// Resets the stream with the specified error code.
virtual void ResetWithUserCode(WebTransportStreamError error) = 0;
virtual void ResetDueToInternalError() = 0;
virtual void SendStopSending(WebTransportStreamError error) = 0;
// Called when the owning object has been garbage-collected.
virtual void MaybeResetDueToStreamObjectGone() = 0;
virtual WebTransportStreamVisitor* visitor() = 0;
virtual void SetVisitor(
std::unique_ptr<WebTransportStreamVisitor> visitor) = 0;
// Visitor that gets notified about events related to a WebTransport session.
class QUIC_EXPORT_PRIVATE WebTransportVisitor {
virtual ~WebTransportVisitor() {}
// Notifies the visitor when the session is ready to exchange application
// data.
virtual void OnSessionReady(const spdy::SpdyHeaderBlock& headers) = 0;
// Notifies the visitor when the session has been closed.
virtual void OnSessionClosed(WebTransportSessionError error_code,
const std::string& error_message) = 0;
// Notifies the visitor when a new stream has been received. The stream in
// question can be retrieved using AcceptIncomingBidirectionalStream() or
// AcceptIncomingUnidirectionalStream().
virtual void OnIncomingBidirectionalStreamAvailable() = 0;
virtual void OnIncomingUnidirectionalStreamAvailable() = 0;
// Notifies the visitor when a new datagram has been received.
virtual void OnDatagramReceived(absl::string_view datagram) = 0;
// Notifies the visitor that a new outgoing stream can now be created.
virtual void OnCanCreateNewOutgoingBidirectionalStream() = 0;
virtual void OnCanCreateNewOutgoingUnidirectionalStream() = 0;
// An abstract interface for a WebTransport session.
class QUIC_EXPORT_PRIVATE WebTransportSession {
virtual ~WebTransportSession() {}
// Closes the WebTransport session in question with the specified |error_code|
// and |error_message|.
virtual void CloseSession(WebTransportSessionError error_code,
absl::string_view error_message) = 0;
// Return the earliest incoming stream that has been received by the session
// but has not been accepted. Returns nullptr if there are no incoming
// streams.
virtual WebTransportStream* AcceptIncomingBidirectionalStream() = 0;
virtual WebTransportStream* AcceptIncomingUnidirectionalStream() = 0;
// Returns true if flow control allows opening a new stream.
virtual bool CanOpenNextOutgoingBidirectionalStream() = 0;
virtual bool CanOpenNextOutgoingUnidirectionalStream() = 0;
// Opens a new WebTransport stream, or returns nullptr if that is not possible
// due to flow control.
virtual WebTransportStream* OpenOutgoingBidirectionalStream() = 0;
virtual WebTransportStream* OpenOutgoingUnidirectionalStream() = 0;
virtual MessageStatus SendOrQueueDatagram(QuicMemSlice datagram) = 0;
// Returns a conservative estimate of the largest datagram size that the
// session would be able to send.
virtual QuicByteCount GetMaxDatagramSize() const = 0;
// Sets the largest duration that a datagram can spend in the queue before
// being silently dropped.
virtual void SetDatagramMaxTimeInQueue(QuicTime::Delta max_time_in_queue) = 0;
} // namespace quic