fix: Resolve EADDRINUSE in kitchen-sink api dev script - #13328
Conversation
|
@ashusnapx is attempting to deploy a commit to the Vercel Team on Vercel. A member of the Team first needs to authorize it. |
|
cc @anthonyshew — you previously fixed the tsdown version pinning for this dev script in #13105. This PR addresses the remaining EADDRINUSE issue caused by the onSuccess child process lifecycle. Would appreciate your review. |
|
@ashusnapx We require verified commit signatures. Can you rewrite history with verification? |
05c1966 to
f443806
Compare
|
@anthonyshew Done — history rewritten with a GPG-signed commit. The commit should now show as Verified. |
Replace tsdown --watch --onSuccess with tsx watch for the api dev script. tsdown's onSuccess hook spawns a new node process via shell but fails to kill the process tree on rebuild, leaving orphaned Express servers that hold the port open and cause EADDRINUSE on subsequent saves. tsx watch directly runs TypeScript source and properly manages the child process lifecycle, killing the previous process before restarting on file changes. Also fixes CJS/ESM interop in server.ts by using default imports for the pure-CJS body-parser package.
f443806 to
b188433
Compare
|
@anthonyshew Fixed — the issue was that the GPG key's email didn't match the committer email. I've created a new key matching |
## Release v2.10.5-canary.6 > [!CAUTION] > Versioned docs aliasing FAILED. [View logs](https://github.com/vercel/turborepo/actions/runs/29208587549) ### Changes - chore: Remove planning docs (#13329) (`5cd1d02`) - docs: Migrate docs site to @vercel/geistdocs package (#13320) (`5517bb2`) - ci: Update Remote Cache action (#13330) (`4a39887`) - release(turborepo): 2.10.5-canary.5 (#13331) (`f699719`) - ci: Remove path-based workflow scheduling (#13332) (`84f2b2c`) - fix: Resolve EADDRINUSE in kitchen-sink api dev script (#13328) (`5886c71`) - ci: Disable telemetry messages in workflows (#13334) (`2218dea`) - fix: Prevent Cargo run tasks from being cached (#13335) (`68f449b`) - fix: Isolate Cargo cache by host platform (#13337) (`c71f5cd`) - fix: Continue TUI text selection beyond viewport (#13338) (`9cbfd90`) - ci: Dogfood Cargo target restoration (#13336) (`8ad90a7`) - fix: Require current Cargo lockfiles for caching (#13339) (`3a3d381`) - fix: Reject unsupported Cargo local packages (#13340) (`708d656`) - fix: Allow outputs outside package roots (#13342) (`de6a0d3`) - fix: Resolve Cargo lock dependencies by source (#13343) (`2223a33`) - docs: Update Cargo workspace support (#13349) (`241ada8`) - fix: Build Ghostty for baseline CPUs (#13352) (`a2a04cc`) - fix: Preserve watch rerun semantics for task inputs (#13351) (`6ed5eab`) - fix: Isolate Command Overrides From Toolchain Cache I/O (#13354) (`e76f0b4`) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
## Release v2.10.5 > [!CAUTION] > Versioned docs aliasing FAILED. [View logs](https://github.com/vercel/turborepo/actions/runs/29267191097) ### Changes - perf: Evaluate simple include globs without wax compilation (#13285) (`189897a`) - chore: Dogfood native Cargo support in this repository (#13283) (`42f067b`) - release(turborepo): 2.10.4 (#13286) (`f2fce38`) - ci: Remove dead sccache configuration (#13289) (`558df3f`) - feat: Serve the Remote Cache as an sccache backend for Cargo tasks (#13288) (`0d9803f`) - fix: Reject output path traversal (#13290) (`733ccca`) - fix: Disable the sccache proxy when remote cache use is off (#13291) (`3249e22`) - feat: Embed sccache so the Cargo compile cache needs no installation (#13293) (`b6d0035`) - release(turborepo): 2.10.5-canary.1 (#13294) (`e6cd498`) - fix: Pin a flag-aware turbo canary for the eve-agent deployment (#13295) (`e60a4bd`) - fix: Make the sccache compile cache actually cache (#13296) (`2ac099c`) - release(turborepo): 2.10.5-canary.2 (#13297) (`e6e6fb6`) - fix: Stop ambient CARGO_INCREMENTAL from suppressing compile cache injection (#13298) (`784af75`) - fix: Never let compile cache storage failures fail the build (#13299) (`a6fc6c5`) - test: Add outputs path-traversal negative-case regression tests (#13300) (`2ff6df9`) - release(turborepo): 2.10.5-canary.3 (#13302) (`7e44a29`) - ci: Authenticate to Remote Cache via OIDC token exchange (#13303) (`a86839c`) - fix: Keep pnpm patches with version range keys during prune (#13307) (`3c27a89`) - test: Scrub ambient turbo configuration from integration test children (#13306) (`b03d0d6`) - fix: Show toolchain tasks in the TUI and never run in silence (#13308) (`d7622b6`) - ci: Fix change detection on push events (#13304) (`eec3d61`) - refactor: Rename the Cargo toolchain id to rust (#13311) (`a548b02`) - fix: Remove extraneous bun.lock entries during prune (#13317) (`382e9f5`) - feat: Require a user-declared name for the Cargo workspace package (#13312) (`5f01746`) - feat: Parse and validate the task command field (#13313) (`389ea49`) - chore: Harden turbo-vsc to invoke turbo without a shell (#13319) (`4a19b6e`) - feat: Resolve and execute task command overrides (#13315) (`a549baa`) - release(turborepo): 2.10.5-canary.4 (#13325) (`6626261`) - feat: Run the Rust workspace tests through nextest via command override (#13316) (`6711bbc`) - feat: Engage the Remote Cache and sccache compile cache for Rust CI (#13292) (`1ae2065`) - ci: Pin GitHub Actions to full commit SHAs (#13143) (`ad614d6`) - fix: Make npm prune rehoisting deterministic and complete (#13323) (`2dac737`) - feat: Report incremental cache reuse in the run summary (#13327) (`9f3d24a`) - chore: Remove planning docs (#13329) (`5cd1d02`) - docs: Migrate docs site to @vercel/geistdocs package (#13320) (`5517bb2`) - ci: Update Remote Cache action (#13330) (`4a39887`) - release(turborepo): 2.10.5-canary.5 (#13331) (`f699719`) - ci: Remove path-based workflow scheduling (#13332) (`84f2b2c`) - fix: Resolve EADDRINUSE in kitchen-sink api dev script (#13328) (`5886c71`) - ci: Disable telemetry messages in workflows (#13334) (`2218dea`) - fix: Prevent Cargo run tasks from being cached (#13335) (`68f449b`) - fix: Isolate Cargo cache by host platform (#13337) (`c71f5cd`) - fix: Continue TUI text selection beyond viewport (#13338) (`9cbfd90`) - ci: Dogfood Cargo target restoration (#13336) (`8ad90a7`) - fix: Require current Cargo lockfiles for caching (#13339) (`3a3d381`) - fix: Reject unsupported Cargo local packages (#13340) (`708d656`) - fix: Allow outputs outside package roots (#13342) (`de6a0d3`) - fix: Resolve Cargo lock dependencies by source (#13343) (`2223a33`) - docs: Update Cargo workspace support (#13349) (`241ada8`) - fix: Build Ghostty for baseline CPUs (#13352) (`a2a04cc`) - fix: Preserve watch rerun semantics for task inputs (#13351) (`6ed5eab`) - fix: Isolate Command Overrides From Toolchain Cache I/O (#13354) (`e76f0b4`) - release(turborepo): 2.10.5-canary.6 (#13355) (`f82e2c7`) - fix: Include patched Ghostty crate in Cargo workspace (#13357) (`b3cd7a1`) - ci: Shard Rust tests across runners (#13356) (`ef122d9`) - fix: Hash Cargo build environment inputs (#13348) (`d533266`) - fix: Synchronize Cargo prune Docker lockfile (#13350) (`ed17249`) - chore: Update agents app Eve dependency (#13364) (`38aa7d2`) - fix: Preserve Yarn package extension ranges when pruning (#13363) (`6ed2fb4`) - refactor: Add `Toolchain` output availability (#13360) (`82bcfb6`) --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

Problem
Closes #13326
The
apiapp in theexamples/kitchen-sinkexample crashes withEADDRINUSE: address already in useevery time a source file is saved during development.Root cause: The dev script
tsdown --watch --onSuccess "node dist/index.cjs"spawns a newnodeprocess on each rebuild via a shell (shell: true), but does not kill the process tree of the previous child. The orphaned Express server continues holding port 5001, so the next rebuild fails when the new server tries to bind the same port.Fix
Two changes to
examples/kitchen-sink/apps/api:package.json— Replace the dev script withtsx watch src/index.tsand addtsxas a devDependency.tsx watchruns TypeScript source directly and natively manages the child process lifecycle: it kills the previous process tree before restarting on file changes. This matches the dev-server pattern used by the other apps in the example (Next.js, Vite, Remix all have built-in process management).src/server.ts— Change the named imports ofbody-parserto a default import with destructuring.body-parseris a pure CJS package with noexportsfield, so its named exports are unavailable when loaded as ESM bytsx. This import style is the standard ESM best practice for CJS interop.Verification
EADDRINUSE2/2)tsdown) succeeds