• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

bleedingdeacons / monitor / 32638907869
93%

Build:
DEFAULT BRANCH: main
Ran 23 Aug 2026 12:16PM UTC
Jobs 1
Files 13
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

23 Aug 2026 12:16PM UTC coverage: 95.945% (+0.3%) from 95.606%
32638907869

push

github

web-flow
Open a wholly encrypted push payload (#17)

* feat!: open a wholly encrypted push payload

Reach now seals the entire FCM data map to this handset's key and sends
one `ciphertext` field beside nothing else — not just title, body and
reference. So `AlertPayloadCipher.Open` returns the decrypted map rather
than an `AlertText`, gunzipping first (the server compresses before
sealing, because the largest payload it will accept does not otherwise
fit FCM's 4KB limit), and `HandAlert.FromPushData` builds the whole
alert out of what that opens into.

Two changes of behaviour, both deliberate. A push with no `ciphertext`
is ignored: Reach sends nothing unsealed, so an unencrypted one is not a
legitimate message from this server. A push that will not open is
ignored too — a failure, not a degraded alert.

That replaces "ring with a fault message", so `UnsealedMessage`,
`UnopenableMessage`, `IsUnreadable` and `SetUnreadable` go, and
`AlertText` with them. Ignored means not shown to the responder, not
unreported: the fault still goes to `alerts/unreadable`, which is what
puts a broken handset on Reach's devices screen. The trigger moves from
`AlertService.AdmitAsync` — nothing reaches it now — to the messaging
service, through `IAlertService.ReportUnreadableAsync` when the app is
up and `HeadlessAlerts.ReportUnreadable` when it is not. The alert
itself is not lost either: the poll is HTTPS to our own server and is
unaffected by a bad key.

The iOS extension is updated to the same format for when it can be
built. It still shows a fault notice rather than ignoring, because a
terminated iOS app has no poll to fall back to.

Tests seal their fixtures with raw AesGcm and GZipStream rather than
calling the app's own code, so a format change on one side alone still
fails — the two halves ship from different repositories.

* test: size the worst-case fixture with content gzip cannot help

A payload built from repeated characters compresses to almost nothing
and would kee... (continued)

899 of 937 relevant lines covered (95.94%)

15.14 hits per line

Coverage Regressions

Lines Coverage ∆ File
4
93.27
-0.09% Services/AlertService.cs
2
96.15
10.04% Models/AlertPayloadCipher.cs
Jobs
ID Job ID Ran Files Coverage
1 32638907869.1 23 Aug 2026 12:16PM UTC 13
95.94
GitHub Action Run
Source Files on build 32638907869
  • Tree
  • List 13
  • Changed 4
  • Source Changed 0
  • Coverage Changed 4
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #32638907869
  • b78ec226 on github
  • Prev Build on main (#32605891113)
  • Next Build on main (#32664018712)
  • Delete
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc