Private/WinGet/Wait-IntuneWin32ContentState.ps1

function Wait-IntuneWin32ContentState {
    [CmdletBinding()]
    [OutputType([object])]
    param(
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$AppId,

        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$ContentVersionId,

        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$FileId,

        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$DesiredState,

        [Parameter()]
        [ValidateRange(1, [int]::MaxValue)]
        [int]$PollIntervalSeconds = 5,

        [Parameter()]
        [ValidateRange(1, [int]::MaxValue)]
        [int]$TimeoutSeconds = 180
    )

    $fileUri = "beta/deviceAppManagement/mobileApps/$AppId/microsoft.graph.win32LobApp/contentVersions/$ContentVersionId/files/$FileId"
    Write-Debug "Waiting for Win32 content file '$FileId' for app '$AppId' to reach upload state '$DesiredState' (PollIntervalSeconds=$PollIntervalSeconds, TimeoutSeconds=$TimeoutSeconds)."

    $elapsedSeconds = 0
    while ($elapsedSeconds -le $TimeoutSeconds) {
        $file = Invoke-HydrationGraphRequest -Method GET -Uri $fileUri
        Write-Debug "Win32 content file '$FileId' current upload state is '$($file.uploadState)' after $elapsedSeconds second(s)."

        if ($file.uploadState -eq $DesiredState) {
            Write-Debug "Win32 content file '$FileId' reached desired upload state '$DesiredState'."
            return $file
        }

        if ($file.uploadState -eq 'commitFileFailed') {
            throw "Win32 content file commit failed for file '$FileId'."
        }

        $remainingSeconds = $TimeoutSeconds - $elapsedSeconds
        if ($remainingSeconds -le 0) {
            break
        }

        $sleepSeconds = [Math]::Min($PollIntervalSeconds, $remainingSeconds)
        Start-Sleep -Seconds $sleepSeconds
        $elapsedSeconds += $sleepSeconds
    }

    $timeoutMessage = "Timed out waiting for upload state '$DesiredState' for file '$FileId'."
    Write-Debug "Timed out waiting for Win32 content file '$FileId' to reach upload state '$DesiredState'."
    throw $timeoutMessage
}