Toolbox.psm1
|
#Requires -Version 5.1 <# .SYNOPSIS Toolbox - Remote Task Orchestrator Module .DESCRIPTION A robust PowerShell module for parallel remote task orchestration with runspaces, throttling, timeout controls, structured output, error aggregation, retry logic, and pluggable task framework. .NOTES Author: Zachary Shupp Version: 0.1.0 #> #region Module Variables $script:ModuleRoot = $PSScriptRoot $script:ModuleName = 'Toolbox' $script:ModuleVersion = '0.1.0' # Initialize module-level configuration store $script:ModuleConfig = $null $script:ConfigPath = $null # Initialize module-level logging state $script:LoggingInitialized = $false # Initialize module-level task cache $script:TaskCache = $null #endregion #region Auto-Load Functions # Load StatusEnum.ps1 first (C# type definition must be loaded before PowerShell classes) $StatusEnumFile = Join-Path $PSScriptRoot 'Private\StatusEnum.ps1' if (Test-Path $StatusEnumFile) { try { Write-Verbose "Loading Status enum from $StatusEnumFile" . $StatusEnumFile } catch { Write-Error "Failed to load Status enum: $_" } } # Load Types.ps1 second (PowerShell classes that reference the enum) $TypesFile = Join-Path $PSScriptRoot 'Private\Types.ps1' if (Test-Path $TypesFile) { try { Write-Verbose "Loading PowerShell classes from $TypesFile" . $TypesFile } catch { Write-Error "Failed to load PowerShell classes: $_" } } # Get public and private function definition files (excluding StatusEnum.ps1 and Types.ps1 since we already loaded them) $Public = @(Get-ChildItem -Path "$PSScriptRoot\Public\*.ps1" -ErrorAction SilentlyContinue) $Private = @(Get-ChildItem -Path "$PSScriptRoot\Private\*.ps1" -ErrorAction SilentlyContinue | Where-Object { $_.Name -notin @('StatusEnum.ps1', 'Types.ps1') }) # Dot source the files foreach ($import in @($Public + $Private)) { try { Write-Verbose "Importing $($import.FullName)" . $import.FullName } catch { Write-Error "Failed to import function $($import.FullName): $_" } } # Export public functions Export-ModuleMember -Function $Public.BaseName #endregion #region Module Initialization # Initialize module on import Write-Verbose "Toolbox module loaded. Version: $script:ModuleVersion" Write-Verbose "Module root: $script:ModuleRoot" # Initialize configuration try { Initialize-TbConfig Write-Verbose "Configuration initialized" } catch { Write-Warning "Failed to initialize configuration: $_" } # Check for ImportExcel module (required dependency) if (-not (Get-Module -ListAvailable -Name ImportExcel)) { Write-Warning "ImportExcel module is not installed. Excel export functionality will not be available." Write-Warning "Install it using: Install-Module -Name ImportExcel -Scope CurrentUser" } #endregion #region Module Cleanup # Register cleanup on module removal $ExecutionContext.SessionState.Module.OnRemove = { Write-Verbose "Cleaning up Toolbox module..." # Clean up any module-level resources Remove-Variable -Name ModuleConfig -Scope Script -ErrorAction SilentlyContinue Remove-Variable -Name ConfigPath -Scope Script -ErrorAction SilentlyContinue Remove-Variable -Name LoggingInitialized -Scope Script -ErrorAction SilentlyContinue Remove-Variable -Name TaskCache -Scope Script -ErrorAction SilentlyContinue } #endregion |