deno/ext/fetch
Nathan Whitaker c22d17824b
perf(fs): don't canonicalize path when opening file if --allow-all is passed (#28716)
Fixes #28702.

Super artificial benchmark:

```ts
const perf = performance;

async function asyncOpen() {
  const start = perf.now();
  for (let i = 0; i < 100_000; i++) {
    const file = await Deno.open("./foo.txt");
    file.close();
  }
  const end = perf.now();
  console.log(end - start);
}

function syncOpen() {
  const start = perf.now();
  for (let i = 0; i < 100_000; i++) {
    const file = Deno.openSync("./foo.txt");
    file.close();
  }
  const end = perf.now();
  console.log(end - start);
}

if (Deno.args[0]?.trim() === "async") {
  await asyncOpen();
} else {
  syncOpen();
}
```

Results (average of 10 for each):

```
deno sync               1785.59
deno-this-pr sync       491.69
deno async              1839.71
deno-this-pr async      528.78
```

---------

Co-authored-by: David Sherret <dsherret@users.noreply.github.com>
2025-04-29 23:16:24 +00:00
..
20_headers.js fix: move extension file declarations to cli/tsc/dts (#28180) 2025-02-19 02:53:21 +01:00
21_formdata.js fix: move extension file declarations to cli/tsc/dts (#28180) 2025-02-19 02:53:21 +01:00
22_body.js fix: move extension file declarations to cli/tsc/dts (#28180) 2025-02-19 02:53:21 +01:00
22_http_client.js fix: move extension file declarations to cli/tsc/dts (#28180) 2025-02-19 02:53:21 +01:00
23_request.js fix: move extension file declarations to cli/tsc/dts (#28180) 2025-02-19 02:53:21 +01:00
23_response.js fix: move extension file declarations to cli/tsc/dts (#28180) 2025-02-19 02:53:21 +01:00
26_fetch.js feat(otel): span context propagators (#28460) 2025-03-13 16:32:45 +01:00
27_eventsource.js chore: Happy New Year 2025 (#27509) 2024-12-31 19:12:39 +00:00
Cargo.toml chore: forward v2.2.12 release commit to main (#29044) 2025-04-24 20:22:57 -04:00
dns.rs chore: Happy New Year 2025 (#27509) 2024-12-31 19:12:39 +00:00
fs_fetch_handler.rs perf(fs): don't canonicalize path when opening file if --allow-all is passed (#28716) 2025-04-29 23:16:24 +00:00
internal.d.ts chore: Happy New Year 2025 (#27509) 2024-12-31 19:12:39 +00:00
lib.rs perf(fs): don't canonicalize path when opening file if --allow-all is passed (#28716) 2025-04-29 23:16:24 +00:00
proxy.rs chore: update to rust 1.85 (#28236) 2025-02-25 08:50:01 -08:00
README.md chore(ext/fetch): remove op_fetch_response_upgrade (#25421) 2024-09-04 18:10:28 +05:30
tests.rs feat(ext/fetch): support localAddress option in custom HTTP client (#28781) 2025-04-25 18:03:24 +05:30

deno_fetch

This crate implements the Fetch API.

Spec: https://fetch.spec.whatwg.org/

Usage Example

From javascript, include the extension's source, and assign the following properties to the global scope:

import * as headers from "ext:deno_fetch/20_headers.js";
import * as formData from "ext:deno_fetch/21_formdata.js";
import * as request from "ext:deno_fetch/23_request.js";
import * as response from "ext:deno_fetch/23_response.js";
import * as fetch from "ext:deno_fetch/26_fetch.js";
import * as eventSource from "ext:deno_fetch/27_eventsource.js";

// Set up the callback for Wasm streaming ops
Deno.core.setWasmStreamingCallback(fetch.handleWasmStreaming);

Object.defineProperty(globalThis, "fetch", {
  value: fetch.fetch,
  enumerable: true,
  configurable: true,
  writable: true,
});

Object.defineProperty(globalThis, "Request", {
  value: request.Request,
  enumerable: false,
  configurable: true,
  writable: true,
});

Object.defineProperty(globalThis, "Response", {
  value: response.Response,
  enumerable: false,
  configurable: true,
  writable: true,
});

Object.defineProperty(globalThis, "Headers", {
  value: headers.Headers,
  enumerable: false,
  configurable: true,
  writable: true,
});

Object.defineProperty(globalThis, "FormData", {
  value: formData.FormData,
  enumerable: false,
  configurable: true,
  writable: true,
});

Then from rust, provide deno_fetch::deno_fetch::init_ops_and_esm<Permissions>(Default::default()) in the extensions field of your RuntimeOptions

Where:

  • Permissions: a struct implementing deno_fetch::FetchPermissions
  • Options: deno_fetch::Options, which implements Default

Dependencies

  • deno_webidl: Provided by the deno_webidl crate
  • deno_web: Provided by the deno_web crate
  • deno_url: Provided by the deno_url crate
  • deno_console: Provided by the deno_console crate

Provided ops

Following ops are provided, which can be accessed through Deno.ops:

  • op_fetch
  • op_fetch_send
  • op_utf8_to_byte_string
  • op_fetch_custom_client