Workers - Connect handler no longer requires an experimental flag
- Announced
- Tags
- Workers
- Severity
- info, set by
reef/rss-rule-v1 - Source
- https://developers.cloudflare.com/changelog/post/2026-08-18-connect-handler/
<p>Workers can now export a <a href="https://developers.cloudflare.com/workers/runtime-apis/handlers/connect/"><code>connect()</code> handler</a> without enabling any <a href="https://developers.cloudflare.com/workers/configuration/compatibility-flags/">compatibility flag</a>. Previously, using a <code>connect()</code> handler required the <code>experimental</code> compatibility flag, which cannot be enabled in production.</p> <p>A <code>connect()</code> handler lets a Worker accept a TCP connection forwarded from another Worker over a <a href="https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/">service binding</a>, and read and write raw bytes on it using a <a href="https://developers.cloudflare.com/workers/runtime-apis/tcp-sockets/#socket"><code>Socket</code></a> object:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">backend-worker.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> connect</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">socket</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> writer</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> socket.writable.</span><span class="nb-shiki-1t8gfj">getWriter</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> writer.</span><span class="nb-shiki-1t8gfj">write</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">new</span><span class="nb-shiki-1t8gfj"> TextEncoder</span><span class="nb-shiki-140thh">().</span><span class="nb-shiki-1t8gfj">encode</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"hello"</span><span class="nb-shiki-140thh">));</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> writer.</span><span class="nb-shiki-1t8gfj">close</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>Another Worker forwards a connection to it by calling <code>connect()</code> on the service binding:</p> <figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">frontend-worker.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> socket</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> env.</span><span class="nb-shiki-dzsirb">BACKEND</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">connect</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"example.com:1234"</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(socket.readable);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure> <p>On the <code>connect()</code> handler side, <code>socket.opened</code> resolves with <code>localAddress</code> set to the address the caller passed to <code>connect()</code>.</p> <p>Direct inbound TCP connections remain unsupported at present.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/workers/runtime-apis/handlers/connect/">connect handler documentation</a>.</p>
The text above is the source's. reef added the severity, the dates it could read from the text, and the endpoints and scopes named in code.