MegaBites-AI/Windows-powershell
0372
1# Copyright (c) Microsoft Corporation.2# Licensed under the MIT License.3 4Class UnixSocket5{6 [System.Management.Automation.Job]$Job7 8 UnixSocket () { }9 10 [String] GetStatus()11 {12 return $this.Job.JobStateInfo.State13 }14}15 16[UnixSocket]$UnixSocket17 18function Get-UnixSocket19{20 [CmdletBinding(ConfirmImpact = 'Low')]21 [OutputType([UnixSocket])]22 param()23 24 process25 {26 return [UnixSocket]$Script:UnixSocket27 }28}29 30function Start-UnixSocket31{32 [CmdletBinding(ConfirmImpact = 'Low')]33 [OutputType([UnixSocket])]34 param([string] $socketPath)35 36 process37 {38 $runningListener = Get-UnixSocket39 if ($null -ne $runningListener -and $runningListener.GetStatus() -eq 'Running')40 {41 return $runningListener42 }43 44 $initTimeoutSeconds = 2545 $appExe = (Get-Command UnixSocket).Path46 $initCompleteMessage = 'Now listening on'47 $sleepMilliseconds = 10048 49 $Job = Start-Job {50 $path = Split-Path -Parent (Get-Command UnixSocket).Path -Verbose51 Push-Location $path -Verbose52 'appEXE: {0}' -f $using:appExe53 $env:ASPNETCORE_ENVIRONMENT = 'Development'54 & $using:appExe $using:socketPath55 }56 57 $Script:UnixSocket = [UnixSocket]@{58 Job = $Job59 }60 61 # Count iterations of $sleepMilliseconds instead of using system time to work around possible CI VM sleep/delays62 $sleepCountRemaining = $initTimeoutSeconds * 1000 / $sleepMilliseconds63 do64 {65 Start-Sleep -Milliseconds $sleepMilliseconds66 $initStatus = $Job.ChildJobs[0].Output | Out-String67 $isRunning = $initStatus -match $initCompleteMessage68 $sleepCountRemaining--69 }70 while (-not $isRunning -and $sleepCountRemaining -gt 0)71 72 if (-not $isRunning)73 {74 $jobErrors = $Job.ChildJobs[0].Error | Out-String75 $jobOutput = $Job.ChildJobs[0].Output | Out-String76 $jobVerbose = $Job.ChildJobs[0].Verbose | Out-String77 $Job | Stop-Job78 $Job | Remove-Job -Force79 $message = 'UnixSocket did not start before the timeout was reached.{0}Errors:{0}{1}{0}Output:{0}{2}{0}Verbose:{0}{3}' -f ([System.Environment]::NewLine), $jobErrors, $jobOutput, $jobVerbose80 throw $message81 }82 return $Script:UnixSocket83 }84}85 86function Stop-UnixSocket87{88 [CmdletBinding(ConfirmImpact = 'Low')]89 [OutputType([Void])]90 param()91 92 process93 {94 $Script:UnixSocket.Job | Stop-Job -PassThru | Remove-Job95 $Script:UnixSocket = $null96 }97}98 99function Get-UnixSocketName {100 [CmdletBinding()]101 [OutputType([string])]102 param ()103 104 process {105 return [System.IO.Path]::Join([System.IO.Path]::GetTempPath(), [System.IO.Path]::ChangeExtension([System.IO.Path]::GetRandomFileName(), "sock"))106 }107}108 109function Get-UnixSocketUri {110 [CmdletBinding()]111 [OutputType([Uri])]112 param ()113 114 process {115 $runningListener = Get-UnixSocket116 if ($null -eq $runningListener -or $runningListener.GetStatus() -ne 'Running')117 {118 return $null119 }120 $Uri = [System.UriBuilder]::new()121 $Uri.Host = '127.0.0.0'122 123 return [Uri]$Uri.ToString()124 }125}126 