Skip to content

Instantly share code, notes, and snippets.

@danieljsummers
Created April 28, 2017 02:37
Show Gist options
  • Save danieljsummers/fb2bf9427bf42191b7b9cc1ca74f2be3 to your computer and use it in GitHub Desktop.
Save danieljsummers/fb2bf9427bf42191b7b9cc1ca74f2be3 to your computer and use it in GitHub Desktop.
Suave userData persisting with keep-alive
open Suave
open Suave.Filters
open Suave.Operators
open System
module View =
let page (data : Map<string, obj>) =
match data |> Map.tryFind "messages" with
| Some x ->
x :?> string list |> List.reduce (+)
| _ -> ""
let readUserState ctx key : 'value =
ctx.userState |> Map.tryFind key |> Option.map (fun x -> x :?> 'value) |> Option.get
let addUserMessage (message : string) : WebPart =
context (fun ctx ->
let read = readUserState ctx
let existing =
match ctx.userState |> Map.tryFind "messages" with
| Some msgs ->
read "messages"
| _ ->
[]
Writers.setUserData "messages" (message :: existing))
let app =
choose [
path "/"
>=> addUserMessage "Message One"
>=> addUserMessage "Message Two"
>=> context (fun ctx -> Successful.OK (View.page ctx.userState))
//>=> Writers.unsetUserData "messages"
]
[<EntryPoint>]
let main argv =
Web.startWebServer Web.defaultConfig app
0
<Project Sdk="FSharp.NET.Sdk;Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp1.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Compile Include="Program.fs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="FSharp.Core" Version="4.1.*" />
<PackageReference Include="FSharp.NET.Sdk" Version="1.0.*" PrivateAssets="All" />
<PackageReference Include="Suave" Version="2.1.0" />
</ItemGroup>
</Project>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment