Skip to content

Node 24.16.0: extract-zip hangs extracting #63487

@SynRJ

Description

@SynRJ

Version

v24.16.0

Platform

Linux, Docker image `node:24.16.0-slim`

Subsystem

No response

What steps will reproduce the bug?

#!/usr/bin/env bash
set -euo pipefail

for NODE_VERSION in 24.15.0 24.16.0; do
  echo "### Testing Node ${NODE_VERSION}"

  docker run --rm "node:${NODE_VERSION}-slim" sh -lc '
    set -eu
    apt-get update >/dev/null
    apt-get install -y curl >/dev/null

    mkdir -p /repro /tmp/out-node
    cd /repro

    npm init -y >/dev/null 2>&1
    npm install extract-zip@2.0.1 >/dev/null 2>&1

    curl -fsSL -o chrome.zip https://storage.googleapis.com/chrome-for-testing-public/134.0.6998.35/linux64/chrome-linux64.zip

    node --input-type=module -e "import extract from \"extract-zip\"; await extract(\"chrome.zip\", { dir: \"/tmp/out-node\" }); console.log(\"extract-zip done\")"

    test -x /tmp/out-node/chrome-linux64/chrome
    echo "extract-zip: PASS"
  '
done

How often does it reproduce? Is there a required condition?

Always with v24.16.0, never with v24.15.0

What is the expected behavior? Why is that the expected behavior?

Both Node versions should complete extraction successfully

What do you see instead?

### Testing Node 24.15.0
debconf: delaying package configuration, since apt-utils is not installed
extract-zip done
extract-zip: PASS
### Testing Node 24.16.0
debconf: delaying package configuration, since apt-utils is not installed
Warning: Detected unsettled top-level await at file:///repro/[eval1]:1
import extract from "extract-zip"; await extract("chrome.zip", { dir: "/tmp/out-node" }); console.log("extract-zip done")

Seems like extract-zip started extracting, but its async operation got stuck in a state where Node thinks there is nothing left to wait for. And the extraction remains incomplete.

Additional information

When this happens through Puppeteer / @puppeteer/browsers, the install appears to leave a partial extraction. For example, only a few files exist:

/tmp/out-node/chrome-linux64/ABOUT
/tmp/out-node/chrome-linux64/MEIPreload/manifest.json
/tmp/out-node/chrome-linux64/MEIPreload/preloaded_data.pb
/tmp/out-node/chrome-linux64/PrivacySandboxAttestationsPreloaded/manifest.json
/tmp/out-node/chrome-linux64/PrivacySandboxAttestationsPreloaded/privacy-sandbox-attestations.dat
/tmp/out-node/chrome-linux64/WidevineCdm/LICENSE

But the expected executable is missing:

/tmp/out-node/chrome-linux64/chrome

Chrome and Puppeteer versions are all fixed on our side and we didn't change them.

Thanks :)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions