-
DcRouter v32.0.0
StableRelease / build-and-release (push) Successful in 14m49sreleased this
2026-09-18 13:13:05 +00:00 | 87 commits to main since this release2026-09-18 - 32.0.0
Breaking Changes
- require @serve.zone/interfaces 32.0.0 (deps)
- Move the dependency from the exact
30.14.0to^32.0.0; dcrouter no longer builds or runs against interfaces 31.x and below. The repository version jumps 20.2.0 to 32.0.0: the serve.zone platform repositories share one major from 32 on, and the installed interfaces release is the contract version. - The gateway-client, mail, Web Push and CoreMail gateway contracts dcrouter serves are byte-identical in interfaces 32.0.0 and carry no protocol offer, and dcrouter opens no peer session, so no handler, no caller and no wire body gains the protocol handshake with this release.
IWebPushNotificationPayloadlosesschemaVersion. dcrouter refuses a push payload that still carries it, and the payload it sends to a push service no longer contains it, so a hosted-app service worker that reads the field must stop expecting it.TCoreMailCredentialVerifierFormatbecomesargon2idandICoreMailGatewayPeerDesiredStatelosesschemaVersion. AsyncCoreMailGatewayPeerbody that still statesargon2id-v1orschemaVersionis refused as an unknown key by the shared normalizer; the verification-hash bytes are unchanged.
- Move the dependency from the exact
- reseal Web Push envelopes and drop the stored shape versions (webpush)
- The AES-GCM associated data every Web Push envelope is sealed under loses its
schemaVersionmember, the envelope itself loses itsversionmember, andWebPushSpoolDocloses itsschemaVersionfield. An envelope whose member set is not exactly the sealed one is refused as malformed instead of being read with the extra member ignored. - The new migration step
webpush-encryption-context(19.1.0to19.2.0) reseals everyWebPushSpoolDocsubscription and payload envelope and everyWebPushBindingDocVAPID private key and credential-rotation recovery secret: decrypt under the old associated data, re-encrypt under the new one with a fresh nonce, decrypt the result again and compare the plaintext, then write the document. Whether a document still needs resealing is decided by its stored shape, never by trying to decrypt it. The walk is ordered byidand resumes from a step-owned checkpoint cursor that smartmigration clears on success. - The step needs
DCROUTER_WEB_PUSH_MASTER_KEY_RINGto hold the key each existing envelope names. With no Web Push document at all it does nothing and needs no key; with one and no key ring it refuses by name and dcrouter does not start. A spool row whose binding no longer exists is counted and left untouched, because no release can rebuild its associated data. - New migration step
coremail-peer-verifier-format(19.2.0to32.0.0) rewritesCoreMailGatewayPeerDoc.credentials[].formatfromargon2id-v1toargon2id, leaving the verification hash and every other member alone.
- The AES-GCM associated data every Web Push envelope is sealed under loses its
- pin the migration ledger floor at the chain start (migrations)
oldestSupportedVersionis17.7.2, and every released step below it is deleted with it. A database whose ledger is older is refused by name withLEDGER_BELOW_OLDEST_SUPPORTED_VERSIONon the first ledger read — before the lock and before any write — and the operator is told to run dcrouter 20.2.0 first.17.7.2is the highest floor this release can carry: smartmigration requires the floor to be the chain start, and the chain has to start at or belowfreshInstallVersionbecauseindex-service-mail-idempotencyandweb-push-provider-schemaare what create a fresh install's indexes.- The live hub's ledger is
18.9.2, comfortably above the floor, so its upgrade plans exactly as it does today and then runs the two new steps. - The nested chain registration is replaced by a flat one that stops at
targetVersion, and the fourteen hand-writtenbackfill-settings-after-*bridges by onebackfill-settings-to-targetstep that repeats the safeguards the chain reached. @push.rocks/smartmigrationmoves 1.5.0 to 1.7.0, which is whereoldestSupportedVersionexists. Two of its behaviours are answered explicitly: step failures are redacted unless anerrorSanitizeris configured, so dcrouter's own refusals now travel asDcRouterMigrationErrorand reach the operator unchanged while an unknown throw is reported as the step or phase it failed in; and a forwardrun()plans a reverse run when the ledger is ahead of the target, socreateApplicationMigrationRunnerreads the ledger first and refuses a database a newer dcrouter wrote instead of letting it be walked back.
- publish version-tagged images only (docker)
- Build from
Dockerfile_##version##instead ofDockerfile, sotsdockerpublishesdcrouter:32.0.0and neverdcrouter:latestagain. dcrouter:latestfreezes at the 20.2.0 build. Onebox's managed dcrouter still pulls that name and keeps the frozen image until it is moved to a version pin; retiring the frozen tag is a separate registry step.- The image smoke test now asserts that the image carries
@serve.zone/interfaces32 beside its existing IdP SDK major assertion.
- Build from
Downloads
- require @serve.zone/interfaces 32.0.0 (deps)