Восемь лет Worker мог открыть соединение наружу, но слушать умел только HTTP. Появился обработчик
connect(socket): сырое соединение приезжает через Spectrum, входной прокси Cloudflare для не-HTTP, и Worker читает его сам или отдаёт в Durable Object, долгоживущий объект с состоянием.Полный дуплекс живёт дальше, в контейнерах: сервер gRPC на Go и питоновский socketserver из примеров работают без единой правки. Самим Workers достался вариант поскромнее, только запрос-ответ и серверный поток.
Причина в том, что
fetch() не даёт доступа к потокам HTTP/2, на которых держится gRPC. Внутри всё переводится в gRPC-web, тот самый, что придумали ради браузеров. Пока это закрытая бета, а InfoQ разбирает, у какого из трёх кусков какой потолок.