-
DcRouter v34.5.0
StableRelease / build-and-release (push) Successful in 15m27sreleased this
2026-11-11 11:47:23 +00:00 | 0 commits to main since this release2026-11-11 - 34.5.0
Features
- Request headers on gateway-client routes (gateway clients, ops API).
syncGatewayClientRouteacceptsroute.action.requestHeaders(@serve.zone/interfaces32.75.0): header fields dcrouter sets on every request and WebSocket upgrade the route forwards, validated by the sharedvalidateGatewayRouteRequestHeaders(lowercase names, no field dcrouter owns on the backend leg such ashost, hop-by-hop fields,x-forwarded-*,proxy-*orsec-websocket-*, at most 16 fields; a refusal names fields, never a value) and stored as the SmartProxy route'sheaders.request, which replaces every copy of a name the client sent, on WebSocket upgrades too (@push.rocks/smartproxy27.22.1). A gateway client hands its backend a trusted-proxy secret this way. A route withroute.action.tls.mode: 'passthrough'orroute.match.transport: 'udp'is refused with request headers: SmartProxy forwards a passthrough TLS stream unread, and a UDP-only route's traffic never reaches its HTTP service, so they would never be set. The values are write-only: each sync states the complete set (a sync without it removes them),getGatewayClientRouteslists onlyrequestHeaderNames, and every route listing (RouteConfigManager.getMergedRoutes: opsgetMergedRoutes, the Ops UI, MCP, gateway reads) takesheaders.requestoff a gateway-client route and lists the names inIMergedRoute.requestHeaderNames; operator routes are listed as before. The stored route keeps the values, so a failed sync's rollback restores them.getGatewayCapabilitiesanswersroutes.requestHeaders: true. The values sit in the route database as SmartProxy applies them. - Source profile names in gateway-client route reads (gateway clients).
getGatewayClientRoutesanswerssourceProfileNamenext tosourceProfileRef(@serve.zone/interfaces32.75.0), both from the same source binding: the profile name dcrouter recorded when the route was synced, so a client reads the binding back by the name it synced. A binding stored without a name answers the id alone. - Data version 34.5.0 and its way back (migrations, CLI). The
gateway-route-request-headersstep changes nothing on the way up; dcrouter 33.0.0 through 34.4.0 refuse to start on its ledger.dcrouter migrate --to 34.0.0deletes the request headers of every gateway-client route in one transaction with the ledger stamp (operator routes keep theirs) and logs each route and its field names, never a value, so dcrouter 34.0.0 through 34.4.0 never list one. Nothing keeps the values: after upgrading again, each gateway client's next full sync sets them again. From 34.5.0 data,--to 32.6.0runs this step first and then the route DNS ownership restore; each commits on its own, so a refusal of the second leaves the data at 34.0.0.
Maintenance
- Restore sha512 integrity for 22
pnpm-lock.yamlentries (once,wrappy,etagand other old packages) that a Verdaccio resolve had recorded as sha1 in the 34.0.0 tooling update; each value is npmjs's and matches the tarball both registries serve. - Release tooling:
@git.zone/tsrepo1.1.1 → 2.0.0,@git.zone/tsdocker3.13.0 → 3.14.0,@types/node26.6.5 → 26.6.6 and pnpm 12.14.0 → 12.17.0 (12.18.0 does not yet meet the seven-day rule). tsrepo 2.0.0 makes@push.rocks/smartmongoan optional peer. No dcrouter test callscreateSmartmongo(), so smartmongo,@lossless.org/nosqldband the rest of tsrepo's former subtree are gone from the install.@git.zone/tsdenostays on 1.15.0 until lane D5 of the Deno-removal programme movesbuild:binaryoff it. The runtime dependency versions are unchanged; the only change in the production closure is the type-only@types/node, which resolves to 26.6.6 alone (it was 26.6.2 and 26.6.5). Sevensha1-lockfile entries written by the Verdaccio resolve are restored to npmjs's sha512.
Downloads
- Request headers on gateway-client routes (gateway clients, ops API).