Push (Server) Releases
1.0 TBD
Section titled “1.0 TBD”Initial release — provider-agnostic server-side push core: IPushManager orchestrator, IPushProvider
transport seam, IPushRepository persistence, IPushInterceptor pipeline, structured PushFilter
targeting, rich PushNotification model, automatic dead-token pruning + token rotation, bounded-concurrency
dispatch, and an in-memory repository + debug provider. AOT/trim-safe.
One package, four transports — APNs, FCM, Web Push and WNS all ship inside Shiny.Extensions.Push;
there are no separate *.Apns / *.Fcm / *.WebPush / *.Wns packages. Each keeps its own namespace
(Shiny.Extensions.Push.Apns / .Fcm / .WebPush / .Wns) and stays opt-in via AddApns / AddFcm /
AddWebPush / AddWns, so you only pay for what you register. Shiny.Extensions.Push.DocumentDb stays a
separate package (it pulls a third-party dependency). The implementation types you don’t inject directly
(PushManager, InMemoryPushRepository, DebugPushProvider, PushMetrics) live in the
Shiny.Extensions.Push.Infrastructure namespace — resolve the interfaces from the root namespace; you only
need the Infrastructure import to name a concrete type, e.g. AddProvider<DebugPushProvider>().
Direct APNs provider — HTTP/2 with token-based .p8 / ES256 JWT auth (no FCM dependency),
per-registration sandbox/production, cached provider JWT, pooled HTTP/2 connection, Apple-specific payload
options, and multi-app keyed registration via AddApns("key", …) + AppId.
WNS / Windows provider — delivers to Windows devices via WNS using the modern Windows App SDK /
Microsoft Entra (Azure AD) auth model (AddWns with TenantId / ClientId / ClientSecret; OAuth2
client-credentials token, cached). Sends a ToastGeneric toast by default (or a raw/tile/badge payload via
WindowsPushOptions) to the channel URI, maps 410/404 to dead-token pruning and 406/429 to
rate-limited, and supports multi-app keyed registration.
Shiny.DocumentDb persistence (Shiny.Extensions.Push.DocumentDb) — IPushRepository over any
DocumentDb backend with O(1) token-keyed writes; SQLite integration-tested.
Metrics — System.Diagnostics.Metrics counters (push.notifications.sent/.failed/.skipped,
push.tokens.pruned) and a push.send.duration histogram under the meter Shiny.Extensions.Push,
tagged by platform/provider/status. OpenTelemetry-ready.
Provider batching / FCM multicast — a new optional IPushBatchProvider capability lets a transport
deliver one notification to many devices in a single call. FcmProvider implements it (up to 500 devices
per multipart /batch request), so broadcasts and topic fan-out use far fewer round trips. Enabled by
default (PushManagerOptions.EnableBatching); devices are grouped by the identical notification instance,
so per-device localization falls back to per-device sends. Per-device pruning, token rotation, metrics, and
OnSent/OnFailed are all preserved.