Fuaran.UI.ServerDriven.AspNetCore
0.35.0
Prefix Reserved
See the version list below for details.
dotnet add package Fuaran.UI.ServerDriven.AspNetCore --version 0.35.0
NuGet\Install-Package Fuaran.UI.ServerDriven.AspNetCore -Version 0.35.0
<PackageReference Include="Fuaran.UI.ServerDriven.AspNetCore" Version="0.35.0" />
<PackageVersion Include="Fuaran.UI.ServerDriven.AspNetCore" Version="0.35.0" />
<PackageReference Include="Fuaran.UI.ServerDriven.AspNetCore" />
paket add Fuaran.UI.ServerDriven.AspNetCore --version 0.35.0
#r "nuget: Fuaran.UI.ServerDriven.AspNetCore, 0.35.0"
#:package Fuaran.UI.ServerDriven.AspNetCore@0.35.0
#addin nuget:?package=Fuaran.UI.ServerDriven.AspNetCore&version=0.35.0
#tool nuget:?package=Fuaran.UI.ServerDriven.AspNetCore&version=0.35.0
Fuaran.UI.ServerDriven.AspNetCore
Backend 1 (the v1 default) for Fuaran.UI.ServerDriven — SSE-push +
POST-receive over ASP.NET. The thin transport glue around the tested
server-driven core: an SSE IFuaranLiveChannel, the POST inbound parser, the
connection registry, and the endpoint wiring.
Wiring
open Fuaran.UI.ServerDriven.Driver
open Fuaran.UI.ServerDriven.AspNetCore.Endpoints
// In your ASP.NET app, after building `app`:
let makeSession () =
Driver.init
(DriverServices.create renderFragment) // renderFragment = Renderer.Server.Render.render sources
update
view
initialModel
mapFuaranLive app (defaultConfig makeSession) |> ignore
This maps:
GET /live/stream— opens the SSE stream. Assigns aconnId, sets the correlation cookie, builds a freshLiveSession+SseChannel+LiveConnection, registers it, and drains the channel's frame queue to the long-lived response (FrameWire.encodeSse+ flush) until the client disconnects.Last-Event-IDdrivesLiveConnection.Resync(reconnect replay).POST /live/event— verifies the signedconnIdtoken against the request principal (ConnToken.verify; 401 on a forged / unbound cookie), guard-parses the body (Inbound.tryParseLiveEvent; 400 on a malformed body), and routes it to the registered connection (→ G1 trust boundary → driver → frames pushed back down the GET stream).
Auth floor (Phase 211). The host must layer authentication in front of
/live/*. TheconnIdis bound, not bearer: the cookie carries a signed, principal-bound token (ConnToken), so a forged / cross-principal cookie is rejected 401 rather than routed.ResolvePrincipal(defaultctx.User.Identity.Name) feeds both the binding and the durability attribution (ConfigureConnectionreceives the resolved principal — thread it intoconn.EnableDurability(store, userId = principal)). Seedocs/SERVER_DRIVEN.md.
Serve the generic shim (Fuaran.UI.ServerDriven's content/fuaran-live-patch.js)
as a static asset and point it at the two endpoints:
<script src="/fuaran-live-patch.js"
data-fuaran-live-stream="/live/stream"
data-fuaran-live-send="/live/event"></script>
Why SSE+POST is the default
Both backends are freshly written against the same IFuaranLiveChannel seam, so
the default is not maturity. SSE+POST wins on four durable axes: infra
traversal (no Upgrade/101 handshake to be blocked by enterprise proxies),
per-event HTTP governance for free (every client event is an ordinary request
through the whole auth/rate-limit/audit pipeline), browser-native reconnect that
maps 1:1 onto the journal via Last-Event-ID, and a smaller debuggable surface.
The WebSocket backend (Fuaran.UI.ServerDriven.WebSocket) is the drop-in for
measured high-frequency interaction. See fuaran-dotnet/docs/SERVER_DRIVEN.md.
Testability
The shared Inbound.tryParseLiveEvent (JSON → LiveEvent option), ConnToken
(the connId authz binding), and ConnectionRegistry are pure / deterministic and
unit-tested headlessly. The SSE streaming handler + the POST endpoint are thin
ASP.NET glue, browser-verified via samples/server-driven.
No platform-SDK dependency — the SSE framing is self-contained (FrameWire), not
referenced. Apache-2.0 licensed — see the repo LICENSE.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Fable.Core (>= 5.0.0)
- FSharp.Core (>= 10.1.300)
- Fuaran.Core.Column (>= 0.11.0)
- Fuaran.Core.DataFrame (>= 0.11.0)
- Fuaran.Core.Function (>= 0.11.0)
- Fuaran.Core.Ops (>= 0.11.0)
- Fuaran.Core.OpStream (>= 0.11.0)
- Fuaran.Core.Tree (>= 0.11.0)
- Fuaran.Core.Validator (>= 0.11.0)
- Fuaran.Core.Wire (>= 0.11.0)
- Fuaran.UI.ServerDriven (>= 0.35.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.39.0 | 0 | 8/27/2026 |
| 0.35.0 | 77 | 8/24/2026 |
| 0.32.0 | 80 | 8/23/2026 |
| 0.31.0 | 101 | 8/21/2026 |
| 0.30.0 | 82 | 8/21/2026 |
| 0.29.0 | 78 | 8/19/2026 |
| 0.28.0 | 84 | 8/18/2026 |
| 0.27.0 | 84 | 8/18/2026 |
| 0.26.0 | 85 | 8/18/2026 |
| 0.18.0 | 94 | 8/10/2026 |
| 0.15.0 | 87 | 8/9/2026 |
| 0.12.0 | 101 | 7/31/2026 |
| 0.11.0 | 99 | 7/30/2026 |
| 0.10.0 | 102 | 7/29/2026 |
| 0.6.0 | 102 | 7/27/2026 |
| 0.4.0 | 105 | 7/26/2026 |
| 0.3.0 | 111 | 7/24/2026 |