Skip to content

From v1.X to v2.X

This is a brief guide on migrating from Pode v1.X to Pode v2.X.

In Pode v2.X the Server got the biggest overhaul with the dropping of HttpListener.

Server

If you were previously specifying -Type Pode on your Start-PodeServer, then you no longer need to - all servers now default to using Pode's new .NET Core socket listener.

Furthermore, the -Type parameter has been renamed to -ServerlessType.

Configuration

Settings that use to be under Server > Pode are now just under Server. For example, SSL protocols have moved from:

@{
    Server = @{
        Pode=  @{
            Ssl= @{
                Protocols = @('TLS', 'TLS11', 'TLS12')
            }
        }
    }
}

to:

@{
    Server = @{
        Ssl= @{
            Protocols = @('TLS', 'TLS11', 'TLS12')
        }
    }
}

Web Event

Originally the Web Event object was the first parameter supplied to the ScriptBlocks of Routes, Middleware, and Endware. These already all had access to the main $WebEvent object, including Authentication, without the need to supply it as a parameter.

In 2.0, this first event parameter has been dropped, and you should now use the main $WebEvent object.

So from the following:

Add-PodeRoute -Method Get -Path '/' -ScriptBlock {
    param($e)
    Write-PodeJsonResponse -Value @{ Result = $e.Data['value']}
}

To this:

Add-PodeRoute -Method Get -Path '/' -ScriptBlock {
    Write-PodeJsonResponse -Value @{ Result = $WebEvent.Data['value']}
}

This also applies to Middleware, Endware, and Authentication.

Endpoints

With the dropping of HttpListener, the -Certificate parameter is now the old -CertificateFile parameter. The -RawCertificate parameter has been renamed, and it now called -X509Certificate.

The -CertificateThumbprint parameter remains the same, and only works on Windows. The -Certificate parameter is now the -CertificateName parameter, and also only works on Windows.

There is a new -Hostname parameter to specify a hostname for your endpoint. Using -Address still works for ease, and the IP for the hostname by default is 127.0.0.1. If you used a host file/DNS entry for your hostname address, then supplying -LookupHostname will source the IP for your hostname appropriately.

Authentication

Authentication underwent a hefty change in 2.0, with Get-PodeAuthMiddleware being removed.

First, New-PodeAuthType has been renamed to New-PodeAuthScheme - with its -Scheme parameter also being renamed to -Type.

The old -AutoLogin (now just -Login), and -Logout switches, from Get-PodeAuthMiddleware, have been moved onto the Add-PodeRoute function. The Add-PodeRoute function now also has a new -Authentication parameter, which accepts the name supplied to Add-PodeAuth; this will automatically setup authentication middleware for that route.

The old -Sessionless, -FailureUrl, -FailureMessage and -SuccessUrl parameters, from Get-PodeAuthMiddleware, have all been moved onto the Add-PodeAuth function.

The old -EnableFlash switch has been removed (it's just enabled by default if sessions are enabled).

There's also a new Add-PodeAuthMiddleware function, which will let you setup global authentication middleware.

Furthermore, the OpenAPI functions for Set-PodeOAAuth and Set-PodeOAGlobalAuth have been removed. The new Add-PodeAuthMiddleware function and -Authentication parameter on Add-PodeRoute set these up for you automatically in OpenAPI.

On Add-PodeAuth, Add-PodeAuthWindowsAd, and Add-PodeAuthUserFile the -Type parameter has been renamed to -Scheme. If you have always piped New-PodeAuthScheme (formally New-PodeAuthType) into them, then this won't affect you.

Endpoint and Protocol

On the following functions:

  • Add-PodeRoute
  • Add-PodeStaticRoute
  • Get-PodeRoute
  • Get-PodeStaticRoute
  • Remove-PodeRoute
  • Remove-PodeStaticRoute

The -Endpoint and -Protocol parameters have been removed in favour of -EndpointName.

Further to this, if no -Name is supplied to Add-PodeEndpoint then a random GUID is used instead. To get the name back you can use -PassThru for the endpoint to be returned.

Scoping and Auto-Importing

The 2.0 release sees a big change to some scoping issues in Pode, around modules/snapins/functions and variables. For more information, see the new page on Scoping.

Modules/Snapins

You can now use the normal Import-Module, or Add-PSSnapin, and Pode will automatically import all loaded modules/snapins into its runspaces:

Import-Module SomeModule

Start-PodeServer -ScriptBlock {
    Add-PodeEndpoint -Address localhost -Port 9000 -Protocol Http

    Add-PodeRoute -Method Get -Path '/' -ScriptBlock {
        Use-SomeModuleFunction
    }
}

Import-PodeModule still exists, as it supports the use of local modules in ps_modules. The only difference is that the -Now switch has been removed, and you can now use Import-PodeModule outside of the Start-PodeServer block.

Import-PodeSnapin also still exists, and has the same differences as Import-PodeModule above.

To disable the auto-import, you can do so via the server.psd1 configuration file. You can also set auto-imported modules to only used exported ones via Export-PodeModule/Export-PodeSnapin.

@{
    Server = @{
        AutoImport = @{
            Modules = @{
                Enable = $false
                ExportOnly = $true
            }
            Snapins = @{
                Enable = $false
                ExportOnly = $true
            }
        }
    }
}

Functions

Local functions are now automatically imported into Pode's runspaces! This makes it a little simpler to use quick functions in Pode:

function Write-HelloResponse
{
    Write-PodeJsonResponse -Value @{ Message = 'Hello!' }
}

Start-PodeServer -ScriptBlock {
    function Write-ByeResponse
    {
        Write-PodeJsonResponse -Value @{ Message = 'Bye!' }
    }

    Add-PodeEndpoint -Address localhost -Port 9000 -Protocol Http

    Add-PodeRoute -Method Get -Path '/hello' -ScriptBlock {
        Write-HelloResponse
    }

    Add-PodeRoute -Method Get -Path '/bye' -ScriptBlock {
        Write-ByeResponse
    }
}

If you store Routes/etc in other files, you can also have local functions in these files as well. However, for Pode to import them you must use Use-PodeScript to dot-source the scripts - this will trigger Pode to scan the file for functions.

To disable the auto-import, you can do so via the server.psd1 configuration file. You can also set auto-imported modules to only used exported ones via Export-PodeFunction.

@{
    Server = @{
        AutoImport = @{
            Functions = @{
                Enable = $false
                ExportOnly = $true
            }
        }
    }
}

Variables

You can now define local variables, and use the $using: syntax in almost all -ScriptBlock parameters, like:

  • Routes
  • Middleware
  • Authentication
  • Logging
  • Endware
  • Timers
  • Schedules
  • Handlers

This allows you to do something like:

$outer_msg = 'Hello, there'

Start-PodeServer -ScriptBlock {
    Add-PodeEndpoint -Address localhost -Port 9000 -Protocol Http

    $inner_msg = 'General Kenobi'

    Add-PodeRoute -Method Get -Path '/random' -ScriptBlock {
        Write-PodeJsonResponse -Value @{ Message = "$($using:outer_msg) ... $($using:inner_msg)" }
    }
}

For more information, see the new page on Scoping.

Test Functions

If you're using any of the following:

  • Test-IsEmpty
  • Test-IsUnix
  • Test-IsWindows
  • Test-IsPSCore

these have been updated to:

  • Test-PodeIsEmpty
  • Test-PodeIsUnix
  • Test-PodeIsWindows
  • Test-PodeIsPSCore