Push (Server) Releases
0.1 TBD
Section titled “0.1 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.
Direct APNs provider (Shiny.Extensions.Push.Apns) — 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.
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.