Skip to content

[Bug]: Can't get downloaded file content #93

@ntcho

Description

@ntcho

Version

@cloudflare/[email protected]

Steps to reproduce

Steps

  1. Run wrangler dev
  2. Send any http request to the dev server (e.g. curl localhost:8787)

Files

src/index.ts

// Cloudflare Browser Rendering via Workers with Playwright
// https://developers.cloudflare.com/browser-rendering/platform/playwright/

import fs from 'node:fs';
import { launch } from '@cloudflare/playwright';

export default {
  async fetch(request: Request, env: Env) {
    function ls(path: string) {
      console.log(`ls ${path}\n`, fs.readdirSync(path));
    }

    const browser = await launch(env.MYBROWSER);
    console.log('Opened browser');

    ls('/tmp');
    ls('/tmp/playwright-artifacts-0');

    const page = await browser.newPage();
    await page.goto('https://sample-files.com/data/csv/');
    console.log('Navigated to sample-files.com/data/csv/');

    // listen for all download events
    page.on('download', async (download) => {
      console.log('Download event detected: ', download.suggestedFilename());
      // log save path
      const path = await download.path();
      console.log('Download path: ', path);
      // save to /tmp with suggested filename
      // const filePath = `/tmp/${download.suggestedFilename()}`;

      // console.log('Download event detected: ', download.suggestedFilename());
      // await download.saveAs(filePath);
      // console.log(`Download saved to ${filePath}`);
    });

    console.log('starting to click download buttons...');

    await page.getByRole('link', { name: 'Download Basic Data Set' }).click();
    // await page.getByRole('link', { name: 'Download Mixed Data Types' }).click();
    // await page.getByRole('link', { name: 'Download International Characters' }).click();

    const wait = 5;
    console.log(`waiting ${wait} seconds for downloads to complete...`);
    await new Promise((resolve) => setTimeout(resolve, wait * 1000));

    ls('/tmp');
    ls('/tmp/playwright-artifacts-0');

    return null;
  },
};

wrangler.jsonc

{
  "$schema": "./node_modules/wrangler/config-schema.json",
  "name": "workers-browser",
  "main": "src/index.ts",
  "compatibility_date": "2025-11-01",
  "workers_dev": true,
  "observability": {
    "enabled": true
  },
  "compatibility_flags": ["nodejs_compat"],
  "upload_source_maps": true,
  "browser": {
    "binding": "MYBROWSER",
    "remote": true
  }
}

package.json

{
  "name": "workers-browser",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "deploy": "wrangler deploy",
    "dev": "wrangler dev",
    "start": "wrangler dev",
    "test": "vitest",
    "cf-typegen": "wrangler types"
  },
  "devDependencies": {
    "@cloudflare/playwright": "^1.0.0",
    "@cloudflare/vitest-pool-workers": "^0.10.4",
    "@types/node": "^24.10.0",
    "typescript": "^5.9.3",
    "vitest": "~3.2",
    "wrangler": "^4.45.4"
  }
}

Expected behavior

Opened browser
ls /tmp
 [ 'playwright-artifacts-0' ]
ls /tmp/playwright-artifacts-0
 []
Navigated to sample-files.com/data/csv/
starting to click download buttons...
Download event detected:  basic-data.csv
Download path:  /tmp/playwright-artifacts-0/7f8a0c3c-ccbc-4aa3-9457-43529213a5aa
waiting 5 seconds for downloads to complete...
ls /tmp
 [ 'playwright-artifacts-0' ]
ls /tmp/playwright-artifacts-0
 [ '7f8a0c3c-ccbc-4aa3-9457-43529213a5aa' ]

The file should exist under the path

Actual behavior

Opened browser
ls /tmp
 [ 'playwright-artifacts-0' ]
ls /tmp/playwright-artifacts-0
 []
Navigated to sample-files.com/data/csv/
starting to click download buttons...
Download event detected:  basic-data.csv
Download path:  /tmp/playwright-artifacts-0/7f8a0c3c-ccbc-4aa3-9457-43529213a5aa
waiting 5 seconds for downloads to complete...
ls /tmp
 [ 'playwright-artifacts-0' ]
ls /tmp/playwright-artifacts-0
 []

There are no files under the path

Additional context

  • download.path() - returns a path but can't find the file (maybe it's only in the browser worker?)
  • download.createReadStream() - returns empty stream
  • download.suggestedFilename() - returns correct suggested filename

I have a sense that this is because the browser worker is isolated from the main worker. But I couldn't find documentation on this edge case (whether it's supported or not currently)

Environment

System:
    OS: macOS 15.6
    CPU: (8) arm64 Apple M2
    Memory: 104.67 MB / 24.00 GB
  Binaries:
    Node: 22.17.0
    npm: 10.9.2
    pnpm: 10.20.0
  IDEs:
    VSCode: 1.105.1 - /opt/homebrew/bin/code
  Languages:
    Bash: 3.2.57 - /bin/bash

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions