S
Or, you can try Reaction (google keywords "f# reaction server middleware").
Or you can use websockets as you use them usual via C#
https://github.com/joewalnes/websocketd
Size: a a a
S
АВ
AH
АВ
АВ
let rec nonExpiring (getToken : Alt<string * System.DateTime>) =
memo getToken
|> Alt.afterJob (fun (token, expiresAt) ->
if expiresAt > System.DateTime.UtcNow then Alt.always token
else nonExpiring getToken
)
module Test =
let getToken =
Alt.always()
|> Alt.afterFun(fun() ->
let now = System.DateTime.UtcNow
printfn "get token at %A" now
let time = System.TimeSpan.FromSeconds 5.0
"token", now + time
)
|> nonExpiring
getToken |> run
AH
AH
VK
AH
AH
VK
AH
Job<_>
|
Alt<_>
|
+-------+--------+----+-----+--------+--------+
| | | | | |
Ch<_> Latch Mailbox<_> MVar<_> Proc Promise<_>
|
IVar<_>
AH
АВ
let nonExpiring =
let cache = MVar(("", DateTime.UtcNow))
fun (getToken : Alt<string * DateTime>) ->
cache
|> MVar.read
|> Alt.afterJob(fun(token, expiresAt) ->
if expiresAt > DateTime.UtcNow then
Alt.always token
else
cache |> MVar.modifyJob(fun _ -> getToken |> Alt.afterFun(fun a -> a, fst a))
)
AH
IB
VS
VS
IC