Private/Throttle/Add-ThrottleRequest.ps1
|
<#
Copyright (c) 2025-2026 Robert Faddes SPDX-License-Identifier: MPL-2.0 #> <# .SYNOPSIS Records a completed API request in the local sliding-window throttle counters. .DESCRIPTION Routes the timestamp into the correct bucket based on HTTP method. Read (GET) requests are recorded in the read bucket only. Write (PUT/POST/DELETE) requests are recorded in the global write bucket and the per-operation write bucket (if the operation is tracked). Reads and writes are independent quotas — a read never touches the write bucket and a write never touches the read bucket. This function is called after each API response to record the timestamp only. Local utilisation ratios are derived from these timestamps at evaluation time. API-calibrated utilisation fields are owned exclusively by Update-Throttle. #> function Add-ThrottleRequest { [CmdletBinding()] param ( [Microsoft.PowerShell.Commands.WebRequestMethod] $Method = 'Get', [string] $OperationName ) $Now = [datetime]::UtcNow if ($Script:LegacyThrottleMode -or $Method -eq 'Get') { # Record in read bucket $Script:RMMThrottle.ReadLocalTimestamps.Add($Now) } else { # Record in global write bucket $Script:RMMThrottle.WriteLocalTimestamps.Add($Now) # Per-operation write bucket if ($OperationName -and $Script:RMMThrottle.OperationBuckets.ContainsKey($OperationName)) { $Script:RMMThrottle.OperationBuckets[$OperationName].LocalTimestamps.Add($Now) } } } # SIG # Begin signature block # MIIF+wYJKoZIhvcNAQcCoIIF7DCCBegCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDuwPLnOZ0RG11+ # uO0coMZ3ChK33hfuDQZhQoZwoPDpxqCCA04wggNKMIICMqADAgECAhB464iXHfI6 # gksEkDDTyrNsMA0GCSqGSIb3DQEBCwUAMD0xFjAUBgNVBAoMDVJvYmVydCBGYWRk # ZXMxIzAhBgNVBAMMGkRhdHRvUk1NLkNvcmUgQ29kZSBTaWduaW5nMB4XDTI2MDMz # MTAwMTMzMFoXDTI4MDMzMTAwMjMzMFowPTEWMBQGA1UECgwNUm9iZXJ0IEZhZGRl # czEjMCEGA1UEAwwaRGF0dG9STU0uQ29yZSBDb2RlIFNpZ25pbmcwggEiMA0GCSqG # SIb3DQEBAQUAA4IBDwAwggEKAoIBAQChn1EpMYQgl1RgWzQj2+wp2mvdfb3UsaBS # nxEVGoQ0gj96tJ2MHAF7zsITdUjwaflKS1vE6wAlOg5EI1V79tJCMxzM0bFpOdR1 # L5F2HE/ovIAKNkHxFUF5qWU8vVeAsOViFQ4yhHpzLen0WLF6vhmc9eH23dLQy5fy # tELZQEc2WbQFa4HMAitP/P9kHAu6CUx5s4woLIOyyR06jkr3l9vk0sxcbCxx7+dF # RrsSLyPYPH+bUAB8+a0hs+6qCeteBuUfLvGzpMhpzKAsY82WZ3Rd9X38i32dYj+y # dYx+nx+UEMDLjDJrZgnVa8as4RojqVLcEns5yb/XTjLxDc58VatdAgMBAAGjRjBE # MA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQU # H+B0vf97dYXqdUX1YMcWhFsY6fcwDQYJKoZIhvcNAQELBQADggEBAJmD4EEGNmcD # 1JtFoRGxuLJaTHxDwBsjqcRQRE1VPZNGaiwIm8oSQdHVjQg0oIyK7SEb02cs6n6Y # NZbwf7B7WZJ4aKYbcoLug1k1x9SoqwBmfElECeJTKXf6dkRRNmrAodpGCixR4wMH # KXqwqP5F+5j7bdnQPiIVXuMesxc4tktz362ysph1bqKjDQSCBpwi0glEIH7bv5Ms # Ey9Gl3fe+vYC5W06d2LYVebEfm9+7766hsOgpdDVgdtnN+e6uwIJjG/6PTG6TMDP # y+pr5K6LyUVYJYcWWUTZRBqqwBHiLGekPbxrjEVfxUY32Pq4QfLzUH5hhUCAk4HN # XpF9pOzFLMUxggIDMIIB/wIBATBRMD0xFjAUBgNVBAoMDVJvYmVydCBGYWRkZXMx # IzAhBgNVBAMMGkRhdHRvUk1NLkNvcmUgQ29kZSBTaWduaW5nAhB464iXHfI6gksE # kDDTyrNsMA0GCWCGSAFlAwQCAQUAoIGEMBgGCisGAQQBgjcCAQwxCjAIoAKAAKEC # gAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwG # CisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIAUSe/ELLzzGu+hsIZwefocnAjkW # 6aRBh6T6pSWmjCW3MA0GCSqGSIb3DQEBAQUABIIBAGfao8yzPALPVfRIlm7DfO6v # pTQphWHHl7Gy4XNxnwUroz5IN8SGgZw8T8nLn99RmVeuaAoifvFmoCD9tqBbXJfu # hdh3SzvjJw+naFUhTRUPJ76lkkZ0rP9E/FOsPe5pZ0E/rLRJVzZu26yJsBN59gFU # VAnpv8facRCXnBY7KZ0ntvO5H7s7cQR1bULVUqlqonww6rgCuUucZS0ssFH7cx3h # kNVisn0jOrBDyAk5kWlHl4JnFd2FWxMyV3Xl27Bw6ob56QKsKUjGALvD+umQLBhW # EECGT1fxmg5G3mlYmbMCNUeSF2cLNaPtb2oBrUn1mQdwh9Jv+9nCBGV1tFTgiPY= # SIG # End signature block |