# ws::WebSocketAdapter

<a id="websocketadapter"></a>

# WebSocketAdapter

```cpp
#include <icy/http/websocket.h>

class WebSocketAdapter
```

[Defined in src/http/include/icy/http/websocket.h:268](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L268)

> **Inherits:** [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter)
> **Subclassed by:** [`ConnectionAdapter`](https://auscaster.com/icey/docs/api-reference/icy-http-ws-ConnectionAdapter.md#connectionadapter-4), [`WebSocket`](https://auscaster.com/icey/docs/api-reference/icy-http-ws-WebSocket.md#websocket)

[WebSocket](https://auscaster.com/icey/docs/api-reference/icy-http-ws-WebSocket.md#websocket) protocol adapter for both client and server endpoints.

## List of all members

| Name | Kind | Owner |
|------|------|-------|
| [`WebSocketFramer`](#websocketframer) | `friend` | Declared here |
| [`socket`](#socket-7) | `variable` | Declared here |
| [`WebSocketAdapter`](#websocketadapter-1) | `function` | Declared here |
| [`send`](#send-15) | `function` | Declared here |
| [`send`](#send-16) | `function` | Declared here |
| [`sendOwned`](#sendowned-12) | `function` | Declared here |
| [`sendOwned`](#sendowned-13) | `function` | Declared here |
| [`shutdown`](#shutdown-10) | `function` | Declared here |
| [`sendClientRequest`](#sendclientrequest) | `function` | Declared here |
| [`handleClientResponse`](#handleclientresponse) | `function` | Declared here |
| [`handleServerRequest`](#handleserverrequest) | `function` | Declared here |
| [`onHandshakeComplete`](#onhandshakecomplete-1) | `function` | Declared here |
| [`framer`](#framer) | `variable` | Declared here |
| [`_request`](#_request-4) | `variable` | Declared here |
| [`_response`](#_response-4) | `variable` | Declared here |
| [`_closeState`](#_closestate) | `variable` | Declared here |
| [`~WebSocketAdapter`](#websocketadapter-2) | `function` | Declared here |
| [`sendControlFrame`](#sendcontrolframe) | `function` | Declared here |
| [`resetFrameState`](#resetframestate) | `function` | Declared here |
| [`onSocketConnect`](#onsocketconnect-4) | `function` | Declared here |
| [`onSocketRecv`](#onsocketrecv-6) | `function` | Declared here |
| [`onSocketClose`](#onsocketclose-4) | `function` | Declared here |
| [`Connect`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#connect-4) | `variable` | Inherited from [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter) |
| [`Recv`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#recv) | `variable` | Inherited from [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter) |
| [`Error`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#error-13) | `variable` | Inherited from [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter) |
| [`Close`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#close-20) | `variable` | Inherited from [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter) |
| [`impl`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#impl) | `variable` | Inherited from [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter) |
| [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter-1) | `function` | Inherited from [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter) |
| [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter-2) | `function` | Inherited from [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter) |
| [`~SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter-3) | `function` | Inherited from [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter) |
| [`addReceiver`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#addreceiver-1) | `function` | Inherited from [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter) |
| [`removeReceiver`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#removereceiver-1) | `function` | Inherited from [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter) |
| [`swap`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#swap-11) | `function` | Inherited from [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter) |
| [`as`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#as) | `function` | Inherited from [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter) |
| [`operator->`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#operator-180) | `function` | Inherited from [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter) |
| [`onSocketConnect`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#onsocketconnect-1) | `function` | Inherited from [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter) |
| [`onSocketRecv`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#onsocketrecv-2) | `function` | Inherited from [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter) |
| [`onSocketError`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#onsocketerror-1) | `function` | Inherited from [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter) |
| [`onSocketClose`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#onsocketclose-1) | `function` | Inherited from [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter) |
| [`priority`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#priority-3) | `variable` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter-1) | `function` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`~SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter-2) | `function` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`send`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#send-1) | `function` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`send`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#send-2) | `function` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`sendOwned`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#sendowned-2) | `function` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`sendOwned`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#sendowned-3) | `function` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`sendPacket`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#sendpacket) | `function` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`sendPacket`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#sendpacket-1) | `function` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`sendPacket`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#sendpacket-2) | `function` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`setSender`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#setsender) | `function` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`sender`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#sender) | `function` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`addReceiver`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#addreceiver) | `function` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`removeReceiver`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#removereceiver) | `function` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`hasReceiver`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#hasreceiver) | `function` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`receivers`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#receivers) | `function` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`onSocketConnect`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#onsocketconnect) | `function` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`onSocketRecv`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#onsocketrecv-1) | `function` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`onSocketError`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#onsocketerror) | `function` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`onSocketClose`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#onsocketclose) | `function` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`_sender`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#_sender) | `variable` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`_receivers`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#_receivers) | `variable` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`_dirty`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#_dirty) | `variable` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`_dispatchDepth`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#_dispatchdepth) | `variable` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |
| [`cleanupReceivers`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#cleanupreceivers) | `function` | Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) |

## Inherited from [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter)

| Kind | Name | Description |
|------|------|-------------|
| `variable` | [`Connect`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#connect-4)  | Signals that the socket is connected. |
| `variable` | [`Recv`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#recv)  | Signals when data is received by the socket. |
| `variable` | [`Error`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#error-13)  | Signals that the socket is closed in error. This signal will be sent just before the Closed signal. |
| `variable` | [`Close`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#close-20)  | Signals that the underlying socket is closed. |
| `variable` | [`impl`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#impl)  | Pointer to the underlying socket. Sent data will be proxied to this socket. |
| `function` | [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter-1)  | Creates the [SocketEmitter](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter) and optionally attaches it to a socket. If `socket` is provided, this emitter registers itself as a receiver. |
| `function` | [`SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter-2)  | Copy constructor; copies all signal connections and attaches to the same socket. |
| `function` | [`~SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter-3) `virtual` `noexcept` | Destroys the [SocketAdapter](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter). |
| `function` | [`addReceiver`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#addreceiver-1) `virtual` `override` | Attaches a [SocketAdapter](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) as a receiver; wires it to all four socket signals. |
| `function` | [`removeReceiver`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#removereceiver-1) `virtual` `override` | Detaches a [SocketAdapter](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) from all four socket signals. |
| `function` | [`swap`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#swap-11) `virtual` | Replaces the underlying socket with `socket`. |
| `function` | [`as`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#as) `inline` | Returns the underlying socket cast to type T, or nullptr if the cast fails. |
| `function` | [`operator->`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#operator-180) `const` `inline` | Returns a raw pointer to the underlying socket for direct method access. Follows shared_ptr semantics; the caller must not delete the returned pointer. |
| `function` | [`onSocketConnect`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#onsocketconnect-1) `virtual` `override` | Forwards the connect event to chained adapters, then fires the Connect signal. |
| `function` | [`onSocketRecv`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#onsocketrecv-2) `virtual` `override` | Forwards the recv event to chained adapters, then fires the Recv signal. |
| `function` | [`onSocketError`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#onsocketerror-1) `virtual` `override` | Forwards the error event to chained adapters, then fires the [Error](https://auscaster.com/icey/docs/api-reference/icy-Error.md#error) signal. |
| `function` | [`onSocketClose`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#onsocketclose-1) `virtual` `override` | Forwards the close event to chained adapters, then fires the Close signal. |

## Inherited from [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter)

| Kind | Name | Description |
|------|------|-------------|
| `variable` | [`priority`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#priority-3)  | The priority of this adapter for STL sort operations. |
| `function` | [`SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter-1)  | Creates the [SocketAdapter](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter). |
| `function` | [`~SocketAdapter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter-2) `virtual` `noexcept` | Destroys the [SocketAdapter](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter). |
| `function` | [`send`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#send-1) `virtual` | Sends the given data buffer to the connected peer. Returns the number of bytes sent or -1 on error. No exception will be thrown. For TCP sockets the given peer address must match the connected peer address. |
| `function` | [`send`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#send-2) `virtual` |  |
| `function` | [`sendOwned`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#sendowned-2) `virtual` | Sends an owned payload buffer to the connected peer. |
| `function` | [`sendOwned`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#sendowned-3) `virtual` |  |
| `function` | [`sendPacket`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#sendpacket) `virtual` | Sends the given packet to the connected peer. Returns the number of bytes sent or -1 on error. No exception will be thrown. For TCP sockets the given peer address must match the connected peer address. |
| `function` | [`sendPacket`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#sendpacket-1) `virtual` |  |
| `function` | [`sendPacket`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#sendpacket-2) `virtual` | Sends the given packet to the connected peer. This method provides delegate compatibility, and unlike other send methods throws an exception if the underlying socket is closed. |
| `function` | [`setSender`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#setsender) `virtual` | Sets the pointer to the outgoing data adapter. Send methods proxy data to this adapter by default. |
| `function` | [`sender`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#sender)  | Returns the output [SocketAdapter](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) pointer. |
| `function` | [`addReceiver`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#addreceiver) `virtual` | Sets the pointer to the incoming data adapter. Events proxy data to this adapter by default. |
| `function` | [`removeReceiver`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#removereceiver) `virtual` | Remove the given receiver. |
| `function` | [`hasReceiver`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#hasreceiver) `virtual` | Returns true if the given receiver is connected. |
| `function` | [`receivers`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#receivers)  | Returns all currently registered input [SocketAdapter](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#socketadapter) pointers. Dead (removed) entries are excluded from the returned list. |
| `function` | [`onSocketConnect`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#onsocketconnect) `virtual` | Called when the socket establishes a connection. Forwards the event to all registered receivers in priority order. Override to intercept before the application sees the event. |
| `function` | [`onSocketRecv`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#onsocketrecv-1) `virtual` | Called when data is received from the socket. Forwards the event to all registered receivers in priority order. |
| `function` | [`onSocketError`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#onsocketerror) `virtual` | Called when the socket encounters an error. Forwards the event to all registered receivers in priority order. |
| `function` | [`onSocketClose`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#onsocketclose) `virtual` | Called when the socket is closed. Forwards the event to all registered receivers in priority order. |
| `variable` | [`_sender`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#_sender)  |  |
| `variable` | [`_receivers`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#_receivers)  |  |
| `variable` | [`_dirty`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#_dirty)  |  |
| `variable` | [`_dispatchDepth`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#_dispatchdepth)  |  |
| `function` | [`cleanupReceivers`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#cleanupreceivers) `virtual` |  |

## Friends

| Name | Description |
|------|-------------|
| [`WebSocketFramer`](#websocketframer)  |  |

---

<a id="websocketframer"></a>

### WebSocketFramer

```cpp
friend class WebSocketFramer
```

[Defined in src/http/include/icy/http/websocket.h:351](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L351)

## Public Attributes

| Return | Name | Description |
|--------|------|-------------|
| [`net::Socket::Ptr`](https://auscaster.com/icey/docs/api-reference/icy-net-Socket.md#ptr-9) | [`socket`](#socket-7)  | Pointer to the underlying socket. Sent data will be proxied to this socket. |

---

<a id="socket-7"></a>

### socket

```cpp
net::Socket::Ptr socket
```

Type: [`net::Socket::Ptr`](https://auscaster.com/icey/docs/api-reference/icy-net-Socket.md#ptr-9)

[Defined in src/http/include/icy/http/websocket.h:305](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L305)

Pointer to the underlying socket. Sent data will be proxied to this socket.

## Public Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`WebSocketAdapter`](#websocketadapter-1)  | Creates a [WebSocketAdapter](#websocketadapter) using the given socket, mode and HTTP message objects. |
| `ssize_t` | [`send`](#send-15) `virtual` `override` | Frames and sends data to the peer's address. |
| `ssize_t` | [`send`](#send-16) `virtual` `override` | Frames and sends data to a specific peer address (for UDP-backed sockets). |
| `ssize_t` | [`sendOwned`](#sendowned-12) `virtual` `override` | Sends an owned payload buffer to the connected peer. |
| `ssize_t` | [`sendOwned`](#sendowned-13) `virtual` `override` |  |
| `bool` | [`shutdown`](#shutdown-10) `virtual` | Sends a [WebSocket](https://auscaster.com/icey/docs/api-reference/icy-http-ws-WebSocket.md#websocket) CLOSE frame with the given status code and message, then closes the underlying socket. |
| `void` | [`sendClientRequest`](#sendclientrequest) `virtual` | [Client](https://auscaster.com/icey/docs/api-reference/icy-http-Client.md#client) side. |
| `void` | [`handleClientResponse`](#handleclientresponse) `virtual` | Parses the server's HTTP upgrade response and completes the handshake. Any data remaining in the buffer after the HTTP response is re-fed as [WebSocket](https://auscaster.com/icey/docs/api-reference/icy-http-ws-WebSocket.md#websocket) frames. |
| `void` | [`handleServerRequest`](#handleserverrequest) `virtual` | [Server](https://auscaster.com/icey/docs/api-reference/icy-http-Server.md#server) side. |
| `void` | [`onHandshakeComplete`](#onhandshakecomplete-1) `virtual` | Called when the [WebSocket](https://auscaster.com/icey/docs/api-reference/icy-http-ws-WebSocket.md#websocket) handshake completes. Emits the connect event to downstream handlers. |

---

<a id="websocketadapter-1"></a>

### WebSocketAdapter

```cpp
WebSocketAdapter(const net::Socket::Ptr & socket, ws::Mode mode, http::Request & request, http::Response & response)
```

[Defined in src/http/include/icy/http/websocket.h:276](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L276)

Creates a [WebSocketAdapter](#websocketadapter) using the given socket, mode and HTTP message objects.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `socket` | const [`net::Socket::Ptr`](https://auscaster.com/icey/docs/api-reference/icy-net-Socket.md#ptr-9) & | The underlying TCP or SSL socket. |
| `mode` | [`ws::Mode`](https://auscaster.com/icey/docs/api-reference/icy-http-ws.md#mode-2) | ServerSide or ClientSide. |
| `request` | [`http::Request`](https://auscaster.com/icey/docs/api-reference/icy-http-Request.md#request-6) & | HTTP request used for the handshake. |
| `response` | [`http::Response`](https://auscaster.com/icey/docs/api-reference/icy-http-Response.md#response-3) & | HTTP response used for the handshake. |

---

<a id="send-15"></a>

### send

`virtual` `override`

```cpp
virtual ssize_t send(const char * data, size_t len, int flags = 0) override
```

[Defined in src/http/include/icy/http/websocket.h:284](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L284)

Frames and sends data to the peer's address. 
#### Returns
Number of bytes sent, or -1 on error.

#### Reimplements

- [`SocketAdapter::send`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#send-1)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `data` | `const char *` | Pointer to the payload. |
| `len` | `size_t` | Payload length in bytes. |
| `flags` | `int` | [ws::SendFlags::Text](https://auscaster.com/icey/docs/api-reference/icy-http-ws.md#sendflags) or [ws::SendFlags::Binary](https://auscaster.com/icey/docs/api-reference/icy-http-ws.md#sendflags). |

---

<a id="send-16"></a>

### send

`virtual` `override`

```cpp
virtual ssize_t send(const char * data, size_t len, const net::Address & peerAddr, int flags = 0) override
```

[Defined in src/http/include/icy/http/websocket.h:292](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L292)

Frames and sends data to a specific peer address (for UDP-backed sockets). 
#### Returns
Number of bytes sent, or -1 on error.

#### Reimplements

- [`SocketAdapter::send`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#send-2)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `data` | `const char *` | Pointer to the payload. |
| `len` | `size_t` | Payload length in bytes. |
| `peerAddr` | const [`net::Address`](https://auscaster.com/icey/docs/api-reference/icy-net-Address.md#address) & | Destination address. |
| `flags` | `int` | [ws::SendFlags::Text](https://auscaster.com/icey/docs/api-reference/icy-http-ws.md#sendflags) or [ws::SendFlags::Binary](https://auscaster.com/icey/docs/api-reference/icy-http-ws.md#sendflags). |

---

<a id="sendowned-12"></a>

### sendOwned

`virtual` `override`

```cpp
virtual ssize_t sendOwned(Buffer && buffer, int flags = 0) override
```

[Defined in src/http/include/icy/http/websocket.h:293](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L293)

Sends an owned payload buffer to the connected peer.

The buffer is moved through the adapter chain and retained by the transport layer until async write completion.

#### Reimplements

- [`SocketAdapter::sendOwned`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#sendowned-2)

---

<a id="sendowned-13"></a>

### sendOwned

`virtual` `override`

```cpp
virtual ssize_t sendOwned(Buffer && buffer, const net::Address & peerAddr, int flags = 0) override
```

[Defined in src/http/include/icy/http/websocket.h:294](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L294)

#### Reimplements

- [`SocketAdapter::sendOwned`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketAdapter.md#sendowned-3)

---

<a id="shutdown-10"></a>

### shutdown

`virtual`

```cpp
virtual bool shutdown(uint16_t statusCode, const std::string & statusMessage)
```

[Defined in src/http/include/icy/http/websocket.h:301](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L301)

Sends a [WebSocket](https://auscaster.com/icey/docs/api-reference/icy-http-ws-WebSocket.md#websocket) CLOSE frame with the given status code and message, then closes the underlying socket. 
#### Returns
true if the close frame was sent successfully.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `statusCode` | `uint16_t` | [WebSocket](https://auscaster.com/icey/docs/api-reference/icy-http-ws-WebSocket.md#websocket) close status code (e.g. 1000 for normal close). |
| `statusMessage` | `const std::string &` | Human-readable reason for closing. |

---

<a id="sendclientrequest"></a>

### sendClientRequest

`virtual`

```cpp
virtual void sendClientRequest()
```

[Defined in src/http/include/icy/http/websocket.h:312](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L312)

[Client](https://auscaster.com/icey/docs/api-reference/icy-http-Client.md#client) side.

Sends the [WebSocket](https://auscaster.com/icey/docs/api-reference/icy-http-ws-WebSocket.md#websocket) HTTP upgrade request to initiate the handshake. Called automatically on socket connect.

---

<a id="handleclientresponse"></a>

### handleClientResponse

`virtual`

```cpp
virtual void handleClientResponse(const MutableBuffer & buffer, const net::Address & peerAddr)
```

[Defined in src/http/include/icy/http/websocket.h:318](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L318)

Parses the server's HTTP upgrade response and completes the handshake. Any data remaining in the buffer after the HTTP response is re-fed as [WebSocket](https://auscaster.com/icey/docs/api-reference/icy-http-ws-WebSocket.md#websocket) frames.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `buffer` | const [`MutableBuffer`](https://auscaster.com/icey/docs/api-reference/icy-MutableBuffer.md#mutablebuffer-6) & | Buffer containing the server's HTTP response. |
| `peerAddr` | const [`net::Address`](https://auscaster.com/icey/docs/api-reference/icy-net-Address.md#address) & | Address of the peer. |

---

<a id="handleserverrequest"></a>

### handleServerRequest

`virtual`

```cpp
virtual void handleServerRequest(const MutableBuffer & buffer, const net::Address & peerAddr)
```

[Defined in src/http/include/icy/http/websocket.h:326](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L326)

[Server](https://auscaster.com/icey/docs/api-reference/icy-http-Server.md#server) side.

Parses the client's HTTP upgrade request and sends the 101 response.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `buffer` | const [`MutableBuffer`](https://auscaster.com/icey/docs/api-reference/icy-MutableBuffer.md#mutablebuffer-6) & | Buffer containing the client's HTTP upgrade request. |
| `peerAddr` | const [`net::Address`](https://auscaster.com/icey/docs/api-reference/icy-net-Address.md#address) & | Address of the peer. |

---

<a id="onhandshakecomplete-1"></a>

### onHandshakeComplete

`virtual`

```cpp
virtual void onHandshakeComplete()
```

[Defined in src/http/include/icy/http/websocket.h:340](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L340)

Called when the [WebSocket](https://auscaster.com/icey/docs/api-reference/icy-http-ws-WebSocket.md#websocket) handshake completes. Emits the connect event to downstream handlers.

#### Reimplemented by

- [`ConnectionAdapter::onHandshakeComplete`](https://auscaster.com/icey/docs/api-reference/icy-http-ws-ConnectionAdapter.md#onhandshakecomplete)

## Protected Attributes

| Return | Name | Description |
|--------|------|-------------|
| [`WebSocketFramer`](https://auscaster.com/icey/docs/api-reference/icy-http-ws-WebSocketFramer.md#websocketframer-1) | [`framer`](#framer)  |  |
| [`http::Request`](https://auscaster.com/icey/docs/api-reference/icy-http-Request.md#request-6) & | [`_request`](#_request-4)  |  |
| [`http::Response`](https://auscaster.com/icey/docs/api-reference/icy-http-Response.md#response-3) & | [`_response`](#_response-4)  |  |
| [`ws::CloseState`](https://auscaster.com/icey/docs/api-reference/icy-http-ws.md#closestate) | [`_closeState`](#_closestate)  |  |

---

<a id="framer"></a>

### framer

```cpp
WebSocketFramer framer
```

Type: [`WebSocketFramer`](https://auscaster.com/icey/docs/api-reference/icy-http-ws-WebSocketFramer.md#websocketframer-1)

[Defined in src/http/include/icy/http/websocket.h:353](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L353)

---

<a id="_request-4"></a>

### _request

```cpp
http::Request & _request
```

Type: [`http::Request`](https://auscaster.com/icey/docs/api-reference/icy-http-Request.md#request-6) &

[Defined in src/http/include/icy/http/websocket.h:354](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L354)

---

<a id="_response-4"></a>

### _response

```cpp
http::Response & _response
```

Type: [`http::Response`](https://auscaster.com/icey/docs/api-reference/icy-http-Response.md#response-3) &

[Defined in src/http/include/icy/http/websocket.h:355](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L355)

---

<a id="_closestate"></a>

### _closeState

```cpp
ws::CloseState _closeState {ws::CloseState::Open}
```

Type: [`ws::CloseState`](https://auscaster.com/icey/docs/api-reference/icy-http-ws.md#closestate)

[Defined in src/http/include/icy/http/websocket.h:356](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L356)

## Protected Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`~WebSocketAdapter`](#websocketadapter-2) `virtual` |  |
| `bool` | [`sendControlFrame`](#sendcontrolframe)  |  |
| `void` | [`resetFrameState`](#resetframestate)  |  |

---

<a id="websocketadapter-2"></a>

### ~WebSocketAdapter

`virtual`

```cpp
virtual ~WebSocketAdapter()
```

[Defined in src/http/include/icy/http/websocket.h:343](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L343)

---

<a id="sendcontrolframe"></a>

### sendControlFrame

```cpp
bool sendControlFrame(ws::Opcode opcode, const char * payload, size_t payloadLen, const net::Address & peerAddr)
```

[Defined in src/http/include/icy/http/websocket.h:345](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L345)

---

<a id="resetframestate"></a>

### resetFrameState

```cpp
void resetFrameState()
```

[Defined in src/http/include/icy/http/websocket.h:349](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L349)

## Private Methods

| Return | Name | Description |
|--------|------|-------------|
| `bool` | [`onSocketConnect`](#onsocketconnect-4) `virtual` `override` | Called by the socket on connect; initiates the client handshake. |
| `bool` | [`onSocketRecv`](#onsocketrecv-6) `virtual` `override` | Called by the socket on each received buffer; handles handshake or frame parsing depending on state. |
| `bool` | [`onSocketClose`](#onsocketclose-4) `virtual` `override` | Called by the socket on close; resets framer state. |

---

<a id="onsocketconnect-4"></a>

### onSocketConnect

`virtual` `override`

```cpp
virtual bool onSocketConnect(net::Socket & socket) override
```

[Defined in src/http/include/icy/http/websocket.h:329](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L329)

Called by the socket on connect; initiates the client handshake.

#### Reimplements

- [`SocketEmitter::onSocketConnect`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#onsocketconnect-1)

---

<a id="onsocketrecv-6"></a>

### onSocketRecv

`virtual` `override`

```cpp
virtual bool onSocketRecv(net::Socket & socket, const MutableBuffer & buffer, const net::Address & peerAddress) override
```

[Defined in src/http/include/icy/http/websocket.h:333](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L333)

Called by the socket on each received buffer; handles handshake or frame parsing depending on state.

#### Reimplements

- [`SocketEmitter::onSocketRecv`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#onsocketrecv-2)

---

<a id="onsocketclose-4"></a>

### onSocketClose

`virtual` `override`

```cpp
virtual bool onSocketClose(net::Socket & socket) override
```

[Defined in src/http/include/icy/http/websocket.h:336](https://github.com/auscaster/icey/blob/main/src/http/include/icy/http/websocket.h#L336)

Called by the socket on close; resets framer state.

#### Reimplements

- [`SocketEmitter::onSocketClose`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#onsocketclose-1)
