Build1 distinct publisher3 min readPublished
gRPC got the announcement slot, but underneath it is a raw inbound socket that a Worker can route in JavaScript. Full duplex only shows up once that socket gets passed down to a Durable Object and a Container.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
When the connection arrives, the handler gets an object with a stream pair on it. Cloudflare's own sample takes a writer off `socket.writable`, encodes `Hello, world!\n`, writes it and closes [6]. That is the whole entry-point surface. The interesting decisions come after: keep the socket in the Worker, hand it to a different Worker, or pass it to a Durable Object [4]. From the Durable Object, `getTcpPort()` delivers it into a Container, and that is where the full-duplex path terminates [5].
That is three deployment units for one bidirectional connection [22]. Which means the code speaking your protocol end to end lives in a Container process, with the Worker in front of it as ingress and routing. The demos make that legible: a Go gRPC echo server and a Python `socketserver`, both running unmodified [7]. Unmodified means an ordinary socket-listening process, which is a compliment to the plumbing rather than a claim about the isolate. Cloudflare's phrase for the result is full-duplex communication between client and server running any program, in any language, for any TCP-based protocol [8], and that sentence is accurate about the Container leg.
The Worker leg stops short, and the reason sits in the transport rather than in the roadmap. Developer code speaks gRPC-web, and Cloudflare converts incoming gRPC to gRPC-web and the outgoing direction back again [10]. gRPC's streaming, cancellation, flow control and trailers all depend on HTTP/2 frames carrying stream IDs, and web platform APIs such as `fetch()` do not expose that level [11]. Browsers hit the same wall, which is the reason gRPC-web exists at all [12]. Cloudflare has been converting gRPC down to HTTP/1.1 inside its reverse proxy since 2020 precisely so WAF rules and Bot Management can inspect the messages [13]. That history is baked into the transport, so a flag alone cannot undo it.
So the sharpest reply to the announcement is the operational one. Sebastian Buzdugan asked whether Workers expose enough backpressure control for gRPC streams, and noted that streaming edge cases are what decide whether an implementation holds; the post does not address it [14]. For a translated stream to survive a slow consumer, the consumer's read rate has to propagate back through the stream objects to the sender. Until that behaviour is documented and measured, server-streaming out of a Worker is an untested number in someone else's deployment.
On the cheap path the adoption cost is small. Existing clients need no changes, so a Worker can front an existing gRPC backend or serve mobile apps built on grpc-swift-2 and grpc-kotlin [15], and the server side is a few lines with the open-source `@connectrpc/connect` package [16]. The larger prize is the eight years of workloads the HTTP-only restriction excluded: message brokers, database proxies, custom binary protocols, anything expecting a socket [19]. A Worker now sees the connection before deciding where it goes, which is the shape of an API gateway applied to raw bytes, and what the Worker may inspect or enforce from that position is not covered in the announcement [20]. The voice-AI framing of Agents Week [21] describes one workload on this primitive, and a narrower one than most platform teams are likely to reach for first.
Ranked by verification strength, evidence, and original report placement.
Cloudflare Workers can now accept inbound TCP connections via a new connect(socket) handler, and gRPC support is the first thing built on top of it.
Since the Workers platform launched in 2017, a Worker could open outbound sockets to a database or a service, but it could only be a server for HTTP.
The connect(socket) handler accepts a raw inbound socket routed to a Worker through Spectrum, Cloudflare's existing ingress proxy for non-HTTP traffic.
A Worker can read and write the inbound socket directly, hand it to another Worker, or pass it to a Durable Object.
From a Durable Object the socket can go on to a Container through getTcpPort(), which is where the full-duplex path ends.
Cloudflare's example connect handler gets a writer from socket.writable, writes a TextEncoder-encoded "Hello, world!\n", and closes the writer.
Follow any of these and your For You feed starts watching them — no settings page required.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One outlet reading one vendor post
The mechanics are unusually checkable for a launch story — a named handler, a real code sample, getTcpPort(), Spectrum as the ingress, a stated reason why bidirectional streaming is out — and Cloudflare volunteers the awkward parts itself. What is missing is anyone outside Cloudflare who has run it. InfoQ is the only publication here, and every technical fact traces to the company's announcement plus one developer's reply.
A signup form and two demos
Nothing here is in anyone's hands yet. Access runs through a private-beta form, the working examples are a Go echo server and a Python socketserver, and the vendor says outright that it uses Cap'n Proto and Cap'n Web internally instead. The one piece of real production mileage is adjacent: the reverse proxy has been downgrading gRPC to HTTP/1.1 since 2020, which is precedent for the approach, not uptake of the product.
The social post oversold the blog post
The gap sits inside Cloudflare, not in this reporting. One channel says gRPC 'is now available' and served natively without translation layers; the engineering post it links to describes a private beta whose whole mechanism is converting gRPC to gRPC-web and back, with bidirectional streaming only reachable by handing the socket down to a Container. InfoQ marks the distance rather than repeating it, and Cloudflare's own admission that it does not use gRPC pulls in the other direction — which is why this reads as overstatement in the marketing, not in the engineering.
Launch-week timing, candid footnotes
This arrived on a schedule: Agents Week, voice AI as the framing, a protocol Cloudflare does not itself use offered to developers who do. That is a positioning motive, and the social copy shows it leaking. Against it, the same announcement publishes the two facts a vendor would rather bury — private beta because the implementation may not be right, and an internal RPC stack that is Cap'n Proto, not gRPC — which is more disclosure than the incentive would predict.
Clear on shape, blank on behaviour
We can be fairly confident about what exists and where its edges are; the API surface, the ceiling, and the beta status are all stated plainly. We can say almost nothing about how it behaves. The backpressure question a developer put directly to Cloudflare went unanswered, no throughput or latency figure appears, the inspection and policy powers of a Worker sitting on a raw socket are undescribed, and there is no second outlet to cross-check any of it.
build
Cloudflare's own researchers broke the Spectre defense it shipped in 20211 distinct publisher
build
Cloudflare's own team beat its Spectre defence and pulled 12 bits a second out of production1 distinct publisher
build
Cloudflare lets users strip scopes at the consent screen, and your agent has to cope1 distinct publisher
product
A 2x LLM bill is not a bug report: token spend is an observability problem1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
1 article · August 29, 2026