Private/Graph/Get-HydrationBatchRetryAfterSeconds.ps1

function Get-HydrationBatchRetryAfterSeconds {
    [CmdletBinding()]
    param(
        [Parameter()]
        [object]$Headers,

        [Parameter()]
        [object]$Body
    )

    $headerCandidates = @('Retry-After', 'retry-after', 'x-ms-retry-after-ms', 'X-Ms-Retry-After-Ms')
    foreach ($headerName in $headerCandidates) {
        if (-not $Headers) {
            continue
        }

        $headerValue = $null
        if ($Headers -is [System.Collections.IDictionary] -and $Headers.Contains($headerName)) {
            $headerValue = $Headers[$headerName]
        } elseif ($Headers.PSObject -and $Headers.PSObject.Properties[$headerName]) {
            $headerValue = $Headers.$headerName
        }

        if ($null -eq $headerValue) {
            continue
        }

        $parsedValue = 0
        if ([int]::TryParse([string]$headerValue, [ref]$parsedValue) -and $parsedValue -gt 0) {
            if ($headerName -like '*-ms') {
                return [Math]::Ceiling($parsedValue / 1000)
            }

            return $parsedValue
        }
    }

    $retryAfterCandidates = @(
        $Body.error.innerError.retryAfterSeconds,
        $Body.error.innerError.retryAfter,
        $Body.error.details.retryAfterSeconds,
        $Body.error.details.retryAfter
    )
    foreach ($candidate in $retryAfterCandidates) {
        $parsedValue = 0
        if ([int]::TryParse([string]$candidate, [ref]$parsedValue) -and $parsedValue -gt 0) {
            return $parsedValue
        }
    }

    return $null
}