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

valkyrjaio / valkyrja-java / 30593351493 / 1
100%
26.x: 100%

Build:
DEFAULT BRANCH: 26.x
Ran 31 Jul 2026 12:23AM UTC
Files 670
Run time 15s
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

31 Jul 2026 12:22AM UTC coverage: 100.0%. Remained the same
30593351493.1

push

github

web-flow
[Grpc] fix(#81): Bound the outbound drain by transport writability (#82)

# Description

`GrpcBridge` applied flow control to the inbound side of a call only.
The buffered path requests one
message at a time and the streaming path requests up to
`maxInboundMessages` and refills one per
drained message, so a client cannot flood the server. Outbound had no
counterpart — no `isReady()`,
no `onReady`, no readiness check anywhere in the bridge — so a
server-streaming handler wrote as fast
as it yielded, and grpc-java queued everything a stalled peer had not
read. A large response to a
client that stops reading grew the transport's write queue for the life
of the call. This bounds the
other direction.

Closes #81

## The contract question: this is adapter-local, not agnostic

The issue asks whether outbound readiness belongs on the worker-agnostic
surface. It does not, and
nothing in `GRPC.md` / `GRPC_IMPLEMENTATION.md` or any sibling port
needs to change.

The agnostic surface already hands the adapter both places it needs to
pause:

- **Buffered model** — outbound messages are a *pull* iterable drained
through `call.cancellable(...)`.
The adapter controls when it pulls the next item, so "wait for
writability" is just "don't pull yet."
- **Streaming model** — `OutboundStreamContract.sendMessage` is a
synchronous call the adapter
  implements. "Wait for writability" is just "don't return yet."

`GRPC.md` step 7 already assigns the adapter the job of translating a
`ServiceResponse` into the
library's native response API; pacing that translation to the transport
is the same job. Hoisting
readiness onto the contract would mean inventing a portable spelling for
a concept whose primitives
genuinely differ per library (`isReady`/`onReady` in grpc-java,
`writable`/`drain` on a Node stream,
channel-send blocking in Go) in order to express a behavior each port
can already produce without it.
The portable *semantics* — the drain pauses between messages — is
reachable... (continued)

1921 of 1921 branches covered (100.0%)

Branch coverage included in aggregate %.

7042 of 7042 relevant lines covered (100.0%)

4.33 hits per line

Source Files on job 30593351493.1
  • Tree
  • List 670
  • Changed 1
  • Source Changed 1
  • Coverage Changed 1
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Build 30593351493
  • a2300836 on github
  • Prev Job for on 26.x (#30593220200.1)
  • Next Job for on 26.x (#30593700688.1)
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