# ServerAllocation

<a id="serverallocation"></a>

# ServerAllocation

```cpp
#include <icy/turn/server/serverallocation.h>

class ServerAllocation
```

[Defined in src/turn/include/icy/turn/server/serverallocation.h:29](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L29)

> **Inherits:** [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation)
> **Subclassed by:** [`TCPAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-TCPAllocation.md#tcpallocation), [`UDPAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-UDPAllocation.md#udpallocation)

Server-side TURN allocation that tracks permissions, lifetime, and relay state. Handles Refresh and CreatePermission requests common to both UDP and TCP allocations. Subclassed by [UDPAllocation](https://auscaster.com/icey/docs/api-reference/icy-turn-UDPAllocation.md#udpallocation) and [TCPAllocation](https://auscaster.com/icey/docs/api-reference/icy-turn-TCPAllocation.md#tcpallocation) for transport-specific behaviour.

## List of all members

| Name | Kind | Owner |
|------|------|-------|
| [`Server`](#server-10) | `friend` | Declared here |
| [`ServerAllocation`](#serverallocation-1) | `function` | Declared here |
| [`~ServerAllocation`](#serverallocation-2) | `function` | Declared here |
| [`handleRequest`](#handlerequest-1) | `function` | Declared here |
| [`handleRefreshRequest`](#handlerefreshrequest) | `function` | Declared here |
| [`handleCreatePermission`](#handlecreatepermission) | `function` | Declared here |
| [`onTimer`](#ontimer-4) | `function` | Declared here |
| [`timeRemaining`](#timeremaining-1) | `function` | Declared here |
| [`maxTimeRemaining`](#maxtimeremaining) | `function` | Declared here |
| [`hasPermission`](#haspermission-4) | `function` | Declared here |
| [`hasPermission`](#haspermission-5) | `function` | Declared here |
| [`server`](#server-11) | `function` | Declared here |
| [`print`](#print-14) | `function` | Declared here |
| [`refreshDeleteRequested`](#refreshdeleterequested) | `function` | Declared here |
| [`_maxLifetime`](#_maxlifetime) | `variable` | Declared here |
| [`_server`](#_server-1) | `variable` | Declared here |
| [`_permissionPolicy`](#_permissionpolicy) | `variable` | Declared here |
| [`_refreshDeleteRequested`](#_refreshdeleterequested) | `variable` | Declared here |
| [`ServerAllocation`](#serverallocation-3) | `function` | Declared here |
| [`operator=`](#operator-228) | `function` | Declared here |
| [`ServerAllocation`](#serverallocation-4) | `function` | Declared here |
| [`operator=`](#operator-229) | `function` | Declared here |
| [`operator<<`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#operator-224) | `friend` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation-1) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`~IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation-2) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation-3) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#operator-225) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation-4) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#operator-226) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`updateUsage`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#updateusage) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`setLifetime`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#setlifetime) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`setBandwidthLimit`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#setbandwidthlimit) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`expired`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#expired-1) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`deleted`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#deleted-1) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`bandwidthLimit`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#bandwidthlimit) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`bandwidthUsed`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#bandwidthused) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`bandwidthRemaining`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#bandwidthremaining) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`timeRemaining`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#timeremaining) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`tuple`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#tuple) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`username`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#username-3) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`lifetime`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#lifetime-1) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`permissions`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#permissions) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`relayedAddress`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#relayedaddress-1) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`addPermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#addpermission-4) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`addPermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#addpermission-5) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`addPermissions`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#addpermissions) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`removePermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#removepermission-2) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`removePermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#removepermission-3) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`removeAllPermissions`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#removeallpermissions) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`removeExpiredPermissions`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#removeexpiredpermissions) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`hasPermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#haspermission-2) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`hasPermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#haspermission-3) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`print`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#print-13) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`_tuple`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_tuple) | `variable` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`_username`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_username-2) | `variable` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`_permissions`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_permissions) | `variable` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`_lifetime`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_lifetime) | `variable` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`_bandwidthLimit`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_bandwidthlimit) | `variable` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`_bandwidthUsed`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_bandwidthused) | `variable` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`_createdAt`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_createdat) | `variable` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`_updatedAt`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_updatedat) | `variable` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`_deleted`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_deleted) | `variable` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |

## Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation)

| Kind | Name | Description |
|------|------|-------------|
| `friend` | [`operator<<`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#operator-224) `inline` |  |
| `function` | [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation-1)  |  |
| `function` | [`~IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation-2) `virtual` |  |
| `function` | [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation-3)  | Deleted constructor. |
| `function` | [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#operator-225)  | Deleted assignment operator. |
| `function` | [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation-4)  | Deleted constructor. |
| `function` | [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#operator-226)  | Deleted assignment operator. |
| `function` | [`updateUsage`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#updateusage) `virtual` | Updates the last-activity timestamp and accumulates bandwidth usage. Call this whenever data is relayed through the allocation. |
| `function` | [`setLifetime`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#setlifetime) `virtual` | Sets the allocation lifetime in seconds and resets the activity timestamp, effectively extending the expiry from the current moment. |
| `function` | [`setBandwidthLimit`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#setbandwidthlimit) `virtual` | Sets the maximum number of bytes this allocation may relay in its lifetime. Pass 0 to disable bandwidth limiting. |
| `function` | [`expired`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#expired-1) `virtual` `const` |  |
| `function` | [`deleted`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#deleted-1) `virtual` `const` | Returns true if the allocation's deleted flag is set and or if the allocation has expired. |
| `function` | [`bandwidthLimit`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#bandwidthlimit) `virtual` `const` |  |
| `function` | [`bandwidthUsed`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#bandwidthused) `virtual` `const` |  |
| `function` | [`bandwidthRemaining`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#bandwidthremaining) `virtual` `const` |  |
| `function` | [`timeRemaining`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#timeremaining) `virtual` `const` |  |
| `function` | [`tuple`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#tuple) `virtual` |  |
| `function` | [`username`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#username-3) `virtual` `const` |  |
| `function` | [`lifetime`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#lifetime-1) `virtual` `const` |  |
| `function` | [`permissions`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#permissions) `virtual` `const` |  |
| `function` | [`relayedAddress`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#relayedaddress-1) `virtual` `const` |  |
| `function` | [`addPermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#addpermission-4) `virtual` | Adds a permission for `ip`, or refreshes the existing one. |
| `function` | [`addPermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#addpermission-5) `virtual` | Adds a permission for `address`, or refreshes the existing one. The port is ignored; TURN permissions are IP-only. |
| `function` | [`addPermissions`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#addpermissions) `virtual` | Adds (or refreshes) permissions for multiple IPs. |
| `function` | [`removePermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#removepermission-2) `virtual` | Removes the permission for `ip` if present. |
| `function` | [`removePermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#removepermission-3) `virtual` | Removes the permission for `address` if present. The port is ignored; TURN permissions are IP-only. |
| `function` | [`removeAllPermissions`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#removeallpermissions) `virtual` | Removes all permissions from the list. |
| `function` | [`removeExpiredPermissions`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#removeexpiredpermissions) `virtual` | Removes any permissions whose 5-minute lifetime has elapsed. |
| `function` | [`hasPermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#haspermission-2) `virtual` | Checks whether a permission exists for `peerIP`. Local addresses (192.168.x.x and 127.x.x.x) are always permitted. |
| `function` | [`hasPermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#haspermission-3) `virtual` | Checks whether a permission exists for `peerAddress`. The port is ignored; TURN permissions are IP-only. |
| `function` | [`print`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#print-13) `virtual` `const` `inline` |  |
| `variable` | [`_tuple`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_tuple)  |  |
| `variable` | [`_username`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_username-2)  |  |
| `variable` | [`_permissions`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_permissions)  |  |
| `variable` | [`_lifetime`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_lifetime)  |  |
| `variable` | [`_bandwidthLimit`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_bandwidthlimit)  |  |
| `variable` | [`_bandwidthUsed`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_bandwidthused)  |  |
| `variable` | [`_createdAt`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_createdat)  |  |
| `variable` | [`_updatedAt`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_updatedat)  |  |
| `variable` | [`_deleted`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_deleted)  |  |

## Friends

| Name | Description |
|------|-------------|
| [`Server`](#server-10)  |  |

---

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

### Server

```cpp
friend class Server
```

[Defined in src/turn/include/icy/turn/server/serverallocation.h:84](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L84)

## Public Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`ServerAllocation`](#serverallocation-1)  |  |
|  | [`~ServerAllocation`](#serverallocation-2) `virtual` |  |
| `bool` | [`handleRequest`](#handlerequest-1) `virtual` | Dispatches incoming STUN requests to [handleCreatePermission()](#handlecreatepermission) or [handleRefreshRequest()](#handlerefreshrequest). Subclasses override to add transport-specific methods. |
| `void` | [`handleRefreshRequest`](#handlerefreshrequest) `virtual` | Processes a Refresh request; updates the lifetime or sets the delete flag if the requested lifetime is 0, then sends a success response. |
| `void` | [`handleCreatePermission`](#handlecreatepermission) `virtual` | Processes a CreatePermission request; installs or refreshes permissions for each XOR-PEER-ADDRESS attribute, then sends a success response. |
| `bool` | [`onTimer`](#ontimer-4)  | Periodic maintenance callback called by [Server::onTimer()](https://auscaster.com/icey/docs/api-reference/icy-turn-Server.md#ontimer-3). Removes expired permissions. Returns false to signal that this allocation should be destroyed. |
| `std::int64_t` | [`timeRemaining`](#timeremaining-1) `virtual` `const` `override` |  |
| `std::int64_t` | [`maxTimeRemaining`](#maxtimeremaining) `const` |  |
| `bool` | [`hasPermission`](#haspermission-4) `virtual` `override` | Checks permission, auto-granting local IPs if enabled in server options. |
| `bool` | [`hasPermission`](#haspermission-5) `virtual` `override` | Checks whether a permission exists for `peerAddress`. The port is ignored; TURN permissions are IP-only. |
| [`Server`](https://auscaster.com/icey/docs/api-reference/icy-turn-Server.md#server-7) & | [`server`](#server-11) `virtual` |  |
| `void` | [`print`](#print-14) `virtual` `const` `override` | Writes a detailed diagnostic dump of this allocation to `os`. |
| `bool` | [`refreshDeleteRequested`](#refreshdeleterequested) `const` `inline` | Returns true if the refresh request set lifetime to 0, signaling the parent [Server](https://auscaster.com/icey/docs/api-reference/icy-turn-Server.md#server-7) to delete this allocation. |

---

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

### ServerAllocation

```cpp
ServerAllocation(Server & server, const FiveTuple & tuple, const std::string & username, std::int64_t lifetime)
```

[Defined in src/turn/include/icy/turn/server/serverallocation.h:36](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L36)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `server` | [`Server`](https://auscaster.com/icey/docs/api-reference/icy-turn-Server.md#server-7) & | Owning TURN server. |
| `tuple` | const [`FiveTuple`](https://auscaster.com/icey/docs/api-reference/icy-turn-FiveTuple.md#fivetuple) & | 5-tuple uniquely identifying this allocation. |
| `username` | `const std::string &` | Authenticated username from the Allocate request. |
| `lifetime` | `std::int64_t` | Initial lifetime in seconds as negotiated with the client. |

---

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

### ~ServerAllocation

`virtual`

```cpp
virtual ~ServerAllocation()
```

[Defined in src/turn/include/icy/turn/server/serverallocation.h:38](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L38)

---

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

### handleRequest

`virtual`

```cpp
virtual bool handleRequest(Request & request)
```

[Defined in src/turn/include/icy/turn/server/serverallocation.h:45](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L45)

Dispatches incoming STUN requests to [handleCreatePermission()](#handlecreatepermission) or [handleRefreshRequest()](#handlerefreshrequest). Subclasses override to add transport-specific methods. 
#### Returns
true if the request was handled; false signals the server to respond with a 600 "Operation Not Supported" error.

#### Reimplemented by

- [`TCPAllocation::handleRequest`](https://auscaster.com/icey/docs/api-reference/icy-turn-TCPAllocation.md#handlerequest-2)
- [`UDPAllocation::handleRequest`](https://auscaster.com/icey/docs/api-reference/icy-turn-UDPAllocation.md#handlerequest-3)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `request` | [`Request`](https://auscaster.com/icey/docs/api-reference/icy-turn-Request.md#request-14) & | Incoming STUN request. |

---

<a id="handlerefreshrequest"></a>

### handleRefreshRequest

`virtual`

```cpp
virtual void handleRefreshRequest(Request & request)
```

[Defined in src/turn/include/icy/turn/server/serverallocation.h:50](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L50)

Processes a Refresh request; updates the lifetime or sets the delete flag if the requested lifetime is 0, then sends a success response.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `request` | [`Request`](https://auscaster.com/icey/docs/api-reference/icy-turn-Request.md#request-14) & | Incoming Refresh request. |

---

<a id="handlecreatepermission"></a>

### handleCreatePermission

`virtual`

```cpp
virtual void handleCreatePermission(Request & request)
```

[Defined in src/turn/include/icy/turn/server/serverallocation.h:55](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L55)

Processes a CreatePermission request; installs or refreshes permissions for each XOR-PEER-ADDRESS attribute, then sends a success response.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `request` | [`Request`](https://auscaster.com/icey/docs/api-reference/icy-turn-Request.md#request-14) & | Incoming CreatePermission request. |

---

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

### onTimer

```cpp
bool onTimer()
```

[Defined in src/turn/include/icy/turn/server/serverallocation.h:61](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L61)

Periodic maintenance callback called by [Server::onTimer()](https://auscaster.com/icey/docs/api-reference/icy-turn-Server.md#ontimer-3). Removes expired permissions. Returns false to signal that this allocation should be destroyed. 
#### Returns
true to keep the allocation alive; false to destroy it.

---

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

### timeRemaining

`virtual` `const` `override`

```cpp
virtual std::int64_t timeRemaining() const override
```

[Defined in src/turn/include/icy/turn/server/serverallocation.h:64](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L64)

#### Returns
The lesser of [IAllocation::timeRemaining()](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#timeremaining) and [maxTimeRemaining()](#maxtimeremaining).

#### Reimplements

- [`IAllocation::timeRemaining`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#timeremaining)

---

<a id="maxtimeremaining"></a>

### maxTimeRemaining

`const`

```cpp
std::int64_t maxTimeRemaining() const
```

[Defined in src/turn/include/icy/turn/server/serverallocation.h:67](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L67)

#### Returns
Seconds remaining before the server-enforced maximum lifetime expires.

---

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

### hasPermission

`virtual` `override`

```cpp
virtual bool hasPermission(const std::string & peerIP) override
```

[Defined in src/turn/include/icy/turn/server/serverallocation.h:70](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L70)

Checks permission, auto-granting local IPs if enabled in server options.

#### Reimplements

- [`IAllocation::hasPermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#haspermission-2)

---

<a id="haspermission-5"></a>

### hasPermission

`virtual` `override`

```cpp
virtual bool hasPermission(const net::Address & peerAddress) override
```

[Defined in src/turn/include/icy/turn/server/serverallocation.h:71](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L71)

Checks whether a permission exists for `peerAddress`. The port is ignored; TURN permissions are IP-only.

#### Reimplements

- [`IAllocation::hasPermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#haspermission-3)

---

<a id="server-11"></a>

### server

`virtual`

```cpp
virtual Server & server()
```

[Defined in src/turn/include/icy/turn/server/serverallocation.h:74](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L74)

#### Returns
Reference to the owning TURN server.

---

<a id="print-14"></a>

### print

`virtual` `const` `override`

```cpp
virtual void print(std::ostream & os) const override
```

[Defined in src/turn/include/icy/turn/server/serverallocation.h:77](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L77)

Writes a detailed diagnostic dump of this allocation to `os`.

#### Reimplements

- [`IAllocation::print`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#print-13)

---

<a id="refreshdeleterequested"></a>

### refreshDeleteRequested

`const` `inline`

```cpp
inline bool refreshDeleteRequested() const
```

[Defined in src/turn/include/icy/turn/server/serverallocation.h:81](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L81)

Returns true if the refresh request set lifetime to 0, signaling the parent [Server](https://auscaster.com/icey/docs/api-reference/icy-turn-Server.md#server-7) to delete this allocation.

## Protected Attributes

| Return | Name | Description |
|--------|------|-------------|
| `uint32_t` | [`_maxLifetime`](#_maxlifetime)  |  |
| [`Server`](https://auscaster.com/icey/docs/api-reference/icy-turn-Server.md#server-7) & | [`_server`](#_server-1)  |  |
| [`PermissionPolicy`](https://auscaster.com/icey/docs/api-reference/icy-turn-PermissionPolicy.md#permissionpolicy) | [`_permissionPolicy`](#_permissionpolicy)  |  |
| `bool` | [`_refreshDeleteRequested`](#_refreshdeleterequested)  |  |

---

<a id="_maxlifetime"></a>

### _maxLifetime

```cpp
uint32_t _maxLifetime
```

[Defined in src/turn/include/icy/turn/server/serverallocation.h:86](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L86)

---

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

### _server

```cpp
Server & _server
```

Type: [`Server`](https://auscaster.com/icey/docs/api-reference/icy-turn-Server.md#server-7) &

[Defined in src/turn/include/icy/turn/server/serverallocation.h:87](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L87)

---

<a id="_permissionpolicy"></a>

### _permissionPolicy

```cpp
PermissionPolicy _permissionPolicy
```

Type: [`PermissionPolicy`](https://auscaster.com/icey/docs/api-reference/icy-turn-PermissionPolicy.md#permissionpolicy)

[Defined in src/turn/include/icy/turn/server/serverallocation.h:88](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L88)

---

<a id="_refreshdeleterequested"></a>

### _refreshDeleteRequested

```cpp
bool _refreshDeleteRequested = false
```

[Defined in src/turn/include/icy/turn/server/serverallocation.h:89](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L89)

## Private Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`ServerAllocation`](#serverallocation-3)  | NonCopyable and NonMovable. |
| [`ServerAllocation`](#serverallocation) & | [`operator=`](#operator-228)  | Deleted assignment operator. |
|  | [`ServerAllocation`](#serverallocation-4)  | Deleted constructor. |
| [`ServerAllocation`](#serverallocation) & | [`operator=`](#operator-229)  | Deleted assignment operator. |

---

<a id="serverallocation-3"></a>

### ServerAllocation

```cpp
ServerAllocation(const ServerAllocation &) = delete
```

[Defined in src/turn/include/icy/turn/server/serverallocation.h:93](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L93)

NonCopyable and NonMovable.

---

<a id="operator-228"></a>

### operator=

```cpp
ServerAllocation & operator=(const ServerAllocation &) = delete
```

[Defined in src/turn/include/icy/turn/server/serverallocation.h:94](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L94)

Deleted assignment operator.

---

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

### ServerAllocation

```cpp
ServerAllocation(ServerAllocation &&) = delete
```

[Defined in src/turn/include/icy/turn/server/serverallocation.h:95](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L95)

Deleted constructor.

---

<a id="operator-229"></a>

### operator=

```cpp
ServerAllocation & operator=(ServerAllocation &&) = delete
```

[Defined in src/turn/include/icy/turn/server/serverallocation.h:96](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/serverallocation.h#L96)

Deleted assignment operator.
