Pax8API/Private/Get-Pax8RetryDelay.ps1

function Get-Pax8RetryDelay {
    [CmdletBinding()]
    param (
        [object]$Headers,
        [int]$Attempt,
        [int]$DefaultSeconds = 2
    )

    $retryAfter = $null
    if ($Headers) {
        if ($Headers -is [System.Collections.IDictionary] -and $Headers.Contains('Retry-After')) {
            $retryAfter = $Headers['Retry-After']
        } elseif ($Headers.PSObject.Properties['Retry-After']) {
            $retryAfter = $Headers.'Retry-After'
        }
    }

    if ($retryAfter -is [array]) {
        $retryAfter = $retryAfter | Select-Object -First 1
    }

    $seconds = 0
    if ($retryAfter -and [int]::TryParse([string]$retryAfter, [ref]$seconds)) {
        return [Math]::Max(1, $seconds)
    }

    $retryDate = [datetimeoffset]::MinValue
    if ($retryAfter -and [datetimeoffset]::TryParse([string]$retryAfter, [ref]$retryDate)) {
        return [Math]::Max(1, [int][Math]::Ceiling(($retryDate - [datetimeoffset]::UtcNow).TotalSeconds))
    }

    $backoff = [Math]::Min(60, $DefaultSeconds * [Math]::Pow(2, [Math]::Max(0, $Attempt - 1)))
    $jitter = Get-Random -Minimum 0 -Maximum 1000
    [int][Math]::Ceiling($backoff + ($jitter / 1000))
}