Private/Utils/Logging.ps1

function Write-WormholeDebug {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [string] $Component,

        [Parameter(Mandatory = $true)]
        [string] $Message,

        [Parameter()]
        [pscustomobject] $Session,

        [Parameter()]
        [hashtable] $Data
    )

    $timestamp = [DateTimeOffset]::UtcNow.ToString('o')
    $contextParts = @()

    if ($null -ne $Session) {
        if ($null -ne $Session.Side -and -not [string]::IsNullOrWhiteSpace([string]$Session.Side)) {
            $contextParts += "side=$($Session.Side)"
        }

        if ($null -ne $Session.Nameplate -and -not [string]::IsNullOrWhiteSpace([string]$Session.Nameplate)) {
            $contextParts += "nameplate=$($Session.Nameplate)"
        }

        if ($null -ne $Session.MailboxId -and -not [string]::IsNullOrWhiteSpace([string]$Session.MailboxId)) {
            $contextParts += "mailbox=$($Session.MailboxId)"
        }
    }

    $contextText = ''
    if ($contextParts.Count -gt 0) {
        $contextText = ' [' + ($contextParts -join ',') + ']'
    }

    $dataText = ''
    if ($null -ne $Data -and $Data.Count -gt 0) {
        try {
            $json = ConvertTo-Json -InputObject $Data -Depth 10 -Compress
            $dataText = " data=$json"
        }
        catch {
            $dataText = ' data=<unserializable>'
        }
    }

    Write-Verbose "[$timestamp][PowerWormhole][$Component]$contextText $Message$dataText"
}