Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

@adobe/fetch

adobe258.7kApache-2.04.2.2TypeScript support: included

Light-weight Fetch implementation transparently supporting both HTTP/1(.1) and HTTP/2

fetch, whatwg, Fetch API, http, https, http2, h2, promise, async, request, RFC 7234, 7234, caching, cache

readme

Adobe Fetch

Light-weight Fetch API implementation transparently supporting both HTTP/1(.1) and HTTP/2

codecov CircleCI GitHub license GitHub issues Renovate enabled semantic-release Install size Current version


About

@adobe/fetch in general adheres to the Fetch API Specification, implementing a subset of the API. However, there are some notable deviations:

  • Response.body returns a Node.js Readable stream.
  • Response.blob() is not implemented. Use Response.buffer() instead.
  • Response.formData() is not implemented.
  • Cookies are not stored by default. However, cookies can be extracted and passed by manipulating request and response headers.
  • The following values of the fetch() option cache are supported: 'default' (the implicit default) and 'no-store'. All other values are currently ignored.
  • The following fetch() options are ignored due to the nature of Node.js and since @adobe/fetch doesn't have the concept of web pages: mode, referrer, referrerPolicy, integrity and credentials.
  • The fetch() option keepalive is not supported. But you can use the h1.keepAlive context option, as demonstrated here.

@adobe/fetch also supports the following non-spec extensions:

  • Response.buffer() returns a Node.js Buffer.
  • Response.url contains the final url when following redirects.
  • The body that can be sent in a Request can also be a Readable Node.js stream, a Buffer, a string or a plain object.
  • There are no forbidden header names.
  • The Response object has an extra property httpVersion which is one of '1.0', '1.1' or '2.0', depending on what was negotiated with the server.
  • The Response object has an extra property fromCache which determines whether the response was retrieved from cache.
  • The Response object has an extra property decoded which determines whether the response body was automatically decoded (see Fetch option decode below).
  • Response.headers.plain() returns the headers as a plain object.
  • Response.headers.raw() returns the internal/raw representation of the headers where e.g. the Set-Cokkie header is represented with an array of strings value.
  • The Fetch option follow allows to limit the number of redirects to follow (default: 20).
  • The Fetch option compress enables transparent gzip/deflate/br content encoding (default: true).
  • The Fetch option decode enables transparent gzip/deflate/br content decoding (default: true).

Note that non-standard Fetch options have been aligned with node-fetch where appropriate.

Features

  • <input checked="" disabled="" type="checkbox"> supports reasonable subset of the standard Fetch specification
  • <input checked="" disabled="" type="checkbox"> Transparent handling of HTTP/1(.1) and HTTP/2 connections
  • <input checked="" disabled="" type="checkbox"> RFC 7234 compliant cache
  • <input checked="" disabled="" type="checkbox"> Support gzip/deflate/br content encoding
  • <input checked="" disabled="" type="checkbox"> HTTP/2 request and response multiplexing support
  • <input checked="" disabled="" type="checkbox"> HTTP/2 Server Push support (transparent caching and explicit listener support)
  • <input checked="" disabled="" type="checkbox"> overridable User-Agent
  • <input checked="" disabled="" type="checkbox"> low-level HTTP/1.* agent/connect options support (e.g. keepAlive, rejectUnauthorized)

ESM/CJS support

This package is native ESM and no longer provides CommonJS exports. Use 3.x version if you still need to use this package with CommonJS.

Installation

Note:

As of v4 Node version >= 14.16 is required.

$ npm install @adobe/fetch

API

Apart from the standard Fetch API

  • fetch()
  • Request
  • Response
  • Headers
  • Body

@adobe/fetch exposes the following non-spec extensions:

  • context() - creates a new customized API context
  • reset() - resets the current API context, i.e. closes pending sessions/sockets, clears internal caches, etc ...
  • onPush() - registers an HTTP/2 Server Push listener
  • offPush()- deregisters a listener previously registered with onPush()
  • clearCache() - clears the HTTP cache (cached responses)
  • cacheStats() - returns cache statistics
  • noCache() - creates a customized API context with disabled caching (convenience)
  • h1() - creates a customized API context with enforced HTTP/1.1 protocol (convenience)
  • keepAlive() - creates a customized API context with enforced HTTP/1.1 protocol and persistent connections (convenience)
  • h1NoCache() - creates a customized API context with disabled caching and enforced HTTP/1.1 protocol (convenience)
  • keepAliveNoCache() - creates a customized API context with disabled caching and enforced HTTP/1.1 protocol with persistent connections (convenience)
  • createUrl() - creates a URL with query parameters (convenience)
  • timeoutSignal() - ceates a timeout signal (convenience)

Context

An API context allows to customize certain aspects of the implementation and provides isolation of internal structures (session caches, HTTP cache, etc.) per API context.

The following options are supported:

interface ContextOptions {
  /**
   * Value of `user-agent` request header
   * @default 'adobe-fetch/<version>'
   */
  userAgent?: string;
  /**
   * The maximum total size of the cached entries (in bytes). 0 disables caching.
   * @default 100 * 1024 * 1024
   */
  maxCacheSize?: number;
  /**
   * The protocols to be negotiated, in order of preference
   * @default [ALPN_HTTP2, ALPN_HTTP1_1, ALPN_HTTP1_0]
   */
  alpnProtocols?: ReadonlyArray< ALPNProtocol >;
  /**
   * How long (in milliseconds) should ALPN information be cached for a given host?
   * @default 60 * 60 * 1000
   */
  alpnCacheTTL?: number;
  /**
   * (HTTPS only, applies to HTTP/1.x and HTTP/2)
   * If not false, the server certificate is verified against the list of supplied CAs. An 'error' event is emitted if verification fails; err.code contains the OpenSSL error code.
   * @default true
   */
  rejectUnauthorized?: boolean;
  /**
   * Maximum number of ALPN cache entries
   * @default 100
   */
  alpnCacheSize?: number;
  h1?: Http1Options;
  h2?: Http2Options;
};

interface Http1Options {
  /**
   * Keep sockets around in a pool to be used by other requests in the future.
   * @default false
   */
  keepAlive?: boolean;
  /**
   * When using HTTP KeepAlive, how often to send TCP KeepAlive packets over sockets being kept alive.
   * Only relevant if keepAlive is set to true.
   * @default 1000
   */
  keepAliveMsecs?: number;
  /**
   * (HTTPS only)
   * If not false, the server certificate is verified against the list of supplied CAs. An 'error' event is emitted if verification fails; err.code contains the OpenSSL error code.
   * @default true
   */
  rejectUnauthorized?: boolean;
  /**
   * (HTTPS only)
   * Maximum number of TLS cached sessions. Use 0 to disable TLS session caching.
   * @default 100
   */
  maxCachedSessions?: number;
}

interface Http2Options {
  /**
   * Max idle time in milliseconds after which a session will be automatically closed. 
   * @default 5 * 60 * 1000
   */
  idleSessionTimeout?: number;
  /**
   * Enable HTTP/2 Server Push?
   * @default true
   */
  enablePush?: boolean;
  /**
   * Max idle time in milliseconds after which a pushed stream will be automatically closed. 
   * @default 5000
   */
  pushedStreamIdleTimeout?: number;
  /**
   * (HTTPS only)
   * If not false, the server certificate is verified against the list of supplied CAs. An 'error' event is emitted if verification fails; err.code contains the OpenSSL error code.
   * @default true
   */
  rejectUnauthorized?: boolean;
};

Common Usage Examples

Access Response Headers and other Meta data

  import { fetch } from '@adobe/fetch';

  const resp = await fetch('https://httpbin.org/get');
  console.log(resp.ok);
  console.log(resp.status);
  console.log(resp.statusText);
  console.log(resp.httpVersion);
  console.log(resp.headers.plain());
  console.log(resp.headers.get('content-type'));

Fetch JSON

  import { fetch } from '@adobe/fetch';

  const resp = await fetch('https://httpbin.org/json');
  const jsonData = await resp.json();

Fetch text data

  import { fetch } from '@adobe/fetch';

  const resp = await fetch('https://httpbin.org/');
  const textData = await resp.text();

Fetch binary data

  import { fetch } from '@adobe/fetch';

  const resp = await fetch('https://httpbin.org//stream-bytes/65535');
  const imageData = await resp.buffer();

Specify a timeout for a fetch operation

Using timeoutSignal(ms) non-spec extension:

  import { fetch, timeoutSignal, AbortError } from '@adobe/fetch';

  const signal = timeoutSignal(1000);
  try {
    const resp = await fetch('https://httpbin.org/json', { signal });
    const jsonData = await resp.json();
  } catch (err) {
    if (err instanceof AbortError) {
      console.log('fetch timed out after 1s');
    }
  } finally {
    // avoid pending timers which prevent node process from exiting
    signal.clear();
  }

Using AbortController:

  import { fetch, AbortController, AbortError } from '@adobe/fetch';

  const controller = new AbortController();
  const timerId = setTimeout(() => controller.abort(), 1000);
  const { signal } = controller;

  try {
    const resp = await fetch('https://httpbin.org/json', { signal });
    const jsonData = await resp.json();
  } catch (err) {
    if (err instanceof AbortError) {
      console.log('fetch timed out after 1s');
    }
  } finally {
    // avoid pending timers which prevent node process from exiting
    clearTimeout(timerId);
  }

Stream an image

  import { createWriteStream } from 'fs';
  import { fetch } from '@adobe/fetch';

  const resp = await fetch('https://httpbin.org/image/jpeg');
  resp.body.pipe(createWriteStream('saved-image.jpg'));

Post JSON

  import { fetch } from '@adobe/fetch';

  const method = 'POST';
  const body = { foo: 'bar' };
  const resp = await fetch('https://httpbin.org/post', { method, body });

Post JPEG image

  import { createReadStream } from 'fs';
  import { fetch } from '@adobe/fetch';

  const method = 'POST';
  const body = createReadStream('some-image.jpg');
  const headers = { 'content-type': 'image/jpeg' };
  const resp = await fetch('https://httpbin.org/post', { method, body, headers });

Post form data

  import { FormData, Blob, File } from 'formdata-node'; // spec-compliant implementations
  import { fileFromPath } from 'formdata-node/file-from-path'; // helper for creating File instance from disk file

  import { fetch } from '@adobe/fetch';

  const method = 'POST';
  const fd = new FormData();
  fd.set('field1', 'foo');
  fd.set('field2', 'bar');
  fd.set('blob', new Blob([0x68, 0x65, 0x6c, 0x69, 0x78, 0x2d, 0x66, 0x65, 0x74, 0x63, 0x68]));
  fd.set('file', new File(['File content goes here'], 'file.txt'));
  fd.set('other_file', await fileFromPath('/foo/bar.jpg', 'bar.jpg', { type: 'image/jpeg' }));
  const resp = await fetch('https://httpbin.org/post', { method, body: fd });

GET with query parameters object

import { createUrl, fetch } from '@adobe/fetch';

const qs = {
  fake: 'dummy',
  foo: 'bar',
  rumple: "stiltskin",
};

const resp = await fetch(createUrl('https://httpbin.org/json', qs));

or using URLSearchParams:

import { fetch } from '@adobe/fetch';

const body = new URLSearchParams({
  fake: 'dummy',
  foo: 'bar',
  rumple: "stiltskin",
});

const resp = await fetch('https://httpbin.org/json', { body });

Cache

Responses of GET and HEAD requests are by default cached, according to the rules of RFC 7234:

import { fetch } from '@adobe/fetch';

const url = 'https://httpbin.org/cache/60'; // -> max-age=60 (seconds)
// send initial request, priming cache
let resp = await fetch(url);
assert(resp.ok);
assert(!resp.fromCache);

// re-send request and verify it's served from cache
resp = await fetch(url);
assert(resp.ok);
assert(resp.fromCache);

You can disable caching per request with the cache: 'no-store' option:

import { fetch } from '@adobe/fetch';

const resp = await fetch('https://httbin.org/', { cache: 'no-store' });
assert(resp.ok);
assert(!resp.fromCache);

You can disable caching entirely:

import { noCache } from '@adobe/fetch';
const { fetch } = noCache();

Advanced Usage Examples

HTTP/2 Server Push

Note that pushed resources will be automatically and transparently added to the cache. You can however add a listener which will be notified on every pushed (and cached) resource.

  import { fetch, onPush } from '@adobe/fetch';

  onPush((url, response) => console.log(`received server push: ${url} status ${response.status}`));

  const resp = await fetch('https://nghttp2.org');
  console.log(`Http version: ${resp.httpVersion}`);

Use h2c (http2 cleartext w/prior-knowledge) protocol

  import { fetch } from '@adobe/fetch';

  const resp = await fetch('http2://nghttp2.org');
  console.log(`Http version: ${resp.httpVersion}`);

Force HTTP/1(.1) protocol

  import { h1 } from '@adobe/fetch';
  const { fetch } = h1();

  const resp = await fetch('https://nghttp2.org');
  console.log(`Http version: ${resp.httpVersion}`);

HTTP/1.1 Keep-Alive

import { keepAlive } from '@adobe/fetch';
const { fetch } = keepAlive();

const resp = await fetch('https://httpbin.org/status/200');
console.log(`Connection: ${resp.headers.get('connection')}`); // -> keep-alive

Unlike browsers, you can access raw Set-Cookie headers manually using Headers.raw(). This is an @adobe/fetch only API.

import { fetch } from '@adobe/fetch';

const resp = await fetch('https://httpbin.org/cookies/set?a=1&b=2');
// returns an array of values, instead of a string of comma-separated values
console.log(resp.headers.raw()['set-cookie']);

Self-signed Certificates

import { context } from '@adobe/fetch';
const { fetch } = context({ rejectUnauthorized: false });

const resp = await fetch('https://localhost:8443/');  // a server using a self-signed certificate

Set cache size limit

  import { context } from '@adobe/fetch';
  const { fetch } = context({
    maxCacheSize: 100 * 1024, // 100kb (Default: 100mb)
  });

  let resp = await fetch('https://httpbin.org/bytes/60000'); // ~60kb response
  resp = await fetch('https://httpbin.org/bytes/50000'); // ~50kb response
  console.log(cacheStats());

Disable caching

  import { noCache } from '@adobe/fetch';
  const { fetch } = noCache();

  let resp = await fetch('https://httpbin.org/cache/60'); // -> max-age=60 (seconds)
  // re-fetch
  resp = await fetch('https://httpbin.org/cache/60');
  assert(!resp.fromCache);

Set a custom user agent

  import { context } from '@adobe/fetch';
  const { fetch } = context({
    userAgent: 'custom-fetch'
  });

  const resp = await fetch('https://httpbin.org//user-agent');
  const json = await resp.json();
  console.log(json['user-agent']);

More examples

More example code can be found in the test source files.

Development

Build

$ npm install

Test

$ npm test

Lint

$ npm run lint

Troubleshooting

You can enable @adobe/fetch low-level debug console output by setting the DEBUG environment variable to adobe/fetch*, e.g.:

$ DEBUG=adobe/fetch* node test.js

This will produce console outout similar to:

  ...
  adobe/fetch:core established TLS connection: #48 (www.nghttp2.org) +2s
  adobe/fetch:core www.nghttp2.org -> h2 +0ms
  adobe/fetch:h2 reusing socket #48 (www.nghttp2.org) +2s
  adobe/fetch:h2 GET www.nghttp2.org/httpbin/user-agent +0ms
  adobe/fetch:h2 session https://www.nghttp2.org established +1ms
  adobe/fetch:h2 caching session https://www.nghttp2.org +0ms
  adobe/fetch:h2 session https://www.nghttp2.org remoteSettings: {"headerTableSize":8192,"enablePush":true,"initialWindowSize":1048576,"maxFrameSize":16384,"maxConcurrentStreams":100,"maxHeaderListSize":4294967295,"maxHeaderSize":4294967295,"enableConnectProtocol":true} +263ms
  adobe/fetch:h2 session https://www.nghttp2.org localSettings: {"headerTableSize":4096,"enablePush":true,"initialWindowSize":65535,"maxFrameSize":16384,"maxConcurrentStreams":4294967295,"maxHeaderListSize":4294967295,"maxHeaderSize":4294967295,"enableConnectProtocol":false} +0ms
  adobe/fetch:h2 session https://www.nghttp2.org closed +6ms
  adobe/fetch:h2 discarding cached session https://www.nghttp2.org +0ms
  ... 

Additionally, you can enable Node.js low-level debug console output by setting the NODE_DEBUG environment variable appropriately, e.g.

$ export NODE_DEBUG=http*,stream*
$ export DEBUG=adobe/fetch*

$ node test.js

Note: this will flood the console with highly verbose debug output.

Acknowledgement

Thanks to node-fetch and github/fetch for providing a solid implementation reference.

License

Apache 2.0

changelog

4.2.2 (2025-05-19)

Bug Fixes

4.2.1 (2025-05-10)

Bug Fixes

4.2.0 (2025-03-04)

Features

  • support node built-in AbortController & AbortSignal (#518) (f627a17)

4.1.11 (2024-12-07)

Bug Fixes

  • deps: update dependency debug to v4.4.0 (#507) (348e17d)

4.1.10 (2024-12-05)

Bug Fixes

  • use package.cjs import instead of requiring package.json (#506) (fad8a1e)

4.1.9 (2024-09-21)

Bug Fixes

  • deps: update external fixes (f4f7d9b)

4.1.8 (2024-06-07)

Bug Fixes

  • deal with node v19 breaking change (keep-alive enabled on global agent) (#478) (89d982d)

4.1.7 (2024-06-07)

Reverts

  • Revert "fix: deal with node v19 breaking change (keep-alive enabled on global agent)" (5d575a1)

4.1.6 (2024-06-07)

Bug Fixes

  • deal with node v19 breaking change (keep-alive enabled on global agent) (d699d2f)

4.1.5 (2024-06-07)

Bug Fixes

4.1.4 (2024-06-06)

Bug Fixes

  • deal with node v19 breaking change (keep-alive enabled on global agent) (#476) (6586b31)

4.1.3 (2024-06-01)

Bug Fixes

  • deps: update dependency debug to v4.3.5 (7bc0c80)

4.1.2 (2024-04-10)

Bug Fixes

4.1.1 (2023-10-30)

Bug Fixes

  • redirect behaviour according to current fetch spec (#449) (a53ede6)

4.1.0 (2023-09-13)

Features

4.0.13 (2023-05-18)

Bug Fixes

4.0.12 (2023-05-09)

Bug Fixes

4.0.11 (2023-05-09)

Bug Fixes

4.0.10 (2023-04-15)

Bug Fixes

  • deps: update dependency lru-cache to v9.0.3 (#395) (643d7ca)

4.0.9 (2023-04-15)

Bug Fixes

4.0.8 (2023-04-13)

Bug Fixes

4.0.7 (2023-04-12)

Bug Fixes

  • deps: update dependency lru-cache to v9 (#391) (43f7ae4)

4.0.6 (2023-03-20)

Bug Fixes

  • deps: update external fixes (1a66335)

4.0.5 (2023-03-13)

Bug Fixes

  • deps: update dependency lru-cache to v8 (#363) (6fd1db3)

4.0.4 (2023-02-25)

Bug Fixes

  • deps: update dependency lru-cache to v7.17.0 (3bd2eff)

4.0.3 (2023-02-14)

Bug Fixes

4.0.2 (2023-02-13)

Bug Fixes

  • loading of package.json via createRequire (#352) (bddafe0)

4.0.1 (2023-01-30)

Bug Fixes

4.0.0 (2023-01-27)

Bug Fixes

BREAKING CHANGES

  • Removed CommonJS support. This package is native ESM from now on.

3.3.1 (2022-12-25)

Bug Fixes

  • typings: export ALPNProtocol as "const enum" (#332) (7b36000)

3.3.0 (2022-10-25)

Features

  • don't use ALPN when enforcing HTTP/1.X (#316) (e2fcc05)

3.2.1 (2022-10-14)

Bug Fixes

  • regression regarding Headers.plain(); introduced Headers.raw() (#312) (2a05a77)

3.2.0 (2022-10-13)

Features

3.1.4 (2022-09-20)

Bug Fixes

3.1.3 (2022-09-20)

Bug Fixes

  • force release (rename adobe/helix-fetch to adobe/fetch) (dbfc05f)

3.1.2 (2022-08-07)

Bug Fixes

  • deps: update dependency lru-cache to v7.13.2 (#298) (47e0290)

3.1.1 (2022-06-29)

Bug Fixes

3.1.0 (2022-06-28)

Features

  • decode option to disable automatic response body decoding (#289) (6546487)

3.0.11 (2022-06-16)

Bug Fixes

  • report name of header with illegal value (#287) (3ed4ae0)

3.0.10 (2022-05-14)

Bug Fixes

  • deps: update dependency lru-cache to v7.10.1 (#278) (addd291)

3.0.9 (2022-04-09)

Bug Fixes

  • deps: update dependency lru-cache to v7.8.1 (6710be6)

3.0.8 (2022-04-02)

Bug Fixes

  • deps: update dependency lru-cache to v7.7.3 (#269) (3da5765)

3.0.7 (2022-03-20)

Bug Fixes

3.0.6 (2022-02-28)

Bug Fixes

3.0.5 (2022-02-14)

Bug Fixes

  • cache: don't allocate memory if cache is disabled (#259) (9653b4c)

3.0.4 (2022-02-14)

Bug Fixes

  • deps: update dependency lru-cache to v7 (#257) (ce8a3f1)

3.0.3 (2022-02-04)

Bug Fixes

3.0.2 (2022-02-03)

Bug Fixes

3.0.1 (2022-02-03)

Bug Fixes

3.0.0 (2021-10-15)

Features

BREAKING CHANGES

  • FormData is no longer exported by helix-fetch. You can use a spec-compliant FormData implementation instead (e.g. formdata-node)

  • feat: setting maxCacheSize = 0 disables cache

  • feat: new convenience functions: noCache(), h1(), keepAlive(), h1NoCache(), keepAliveNoCche()

  • chore: fix ts declarations

  • chore: update deps

2.4.2 (2021-08-18)

Bug Fixes

  • handle server protocol h2->h1 downgrade (#203) (1526126)

2.4.1 (2021-07-30)

Bug Fixes

  • add distinct exports for commonjs and esm (#197) (418b6d3)

2.4.0 (2021-07-29)

Features

  • types: add full typedefs and esm support (#196) (0859cd3)

2.3.0 (2021-06-11)

Features

2.2.1 (2021-05-17)

Bug Fixes

  • properly propagate global rejectUnauthorized context option (#173) (e61c326)

2.2.0 (2021-03-26)

Features

  • core: use buffer.length for content-length if possible (#155) (e614297)

2.1.9 (2021-03-25)

Bug Fixes

2.1.8 (2021-03-22)

Bug Fixes

  • guard against race condition on reset (72fb3a4)

2.1.7 (2021-03-04)

Bug Fixes

  • concurrent h2 requests to same origin using separate contexts (#148) (ac85163)

2.1.6 (2021-02-25)

Bug Fixes

  • preserve original req body and calculate content-length for non-stream body (#144) (d4f04e5)

2.1.5 (2021-02-16)

Bug Fixes

2.1.4 (2021-02-12)

Bug Fixes

  • response: don't set content-type for null body (#137) (492e74d)

2.1.3 (2021-02-09)

Bug Fixes

  • h2: fixing ERR_HTTP2_SOCKET_BOUND errors (55213b3), closes #135

2.1.2 (2021-02-04)

Bug Fixes

2.1.1 (2021-02-04)

Bug Fixes

2.1.0 (2021-01-28)

Features

2.0.1 (2021-01-26)

Bug Fixes

2.0.0 (2021-01-25)

Features

BREAKING CHANGES

  • ** The exposed API, options etc have been aligned with node-fetch. Due to the major changes there are numerous breaking changes both in the API and the options. See the 1.x to 2.x Upgrade Guide for details.

1.9.2 (2020-12-09)

Bug Fixes

  • index: workaround for persistent ERR_HTTP2_INVALID_SESSION errors (1cc78b3), closes #103

1.9.1 (2020-08-10)

Bug Fixes

  • deps: update dependency get-stream to v6 (1f18b4e)

1.9.0 (2020-08-03)

Features

  • support URLSearchParams and FormData as body (a8cfa92), closes #67

1.8.1 (2020-07-22)

Bug Fixes

  • follow redirects by default (d5901fe), closes #79

1.8.0 (2020-07-20)

Features

  • replace references to "master" branch with "main" (ad9f254), closes #77

1.7.1 (2020-07-13)

Bug Fixes

  • deps: update dependency lru-cache to v6 (a41d842)

1.7.0 (2020-06-30)

Features

  • support AbortController for aborting fetch operations (bb06b3e), closes #64

1.6.2 (2020-06-15)

Bug Fixes

  • explicitly set Host header (331fcc9), closes #52

1.6.1 (2020-05-14)

Bug Fixes

  • make sure returned Response is wrapped (5b7c0d7), closes #41

1.6.0 (2020-04-02)

Features

  • index: support array-type query param values (fc07e7c), closes #14

1.5.0 (2020-03-27)

Features

  • index: allow queryParams (961b3a2)
  • index: query strings allowed (a776286), closes #12
  • index: querystring support (45da799), closes #11
  • minor tweaks and added test (6c41275), closes #11

1.4.2 (2020-03-24)

Bug Fixes

  • index: sanitize method name (fc539e1), closes #24

1.4.1 (2020-03-17)

Performance Improvements

  • bumped fetch-h2 dependency and some housekeeping (db66e1e), closes #14

1.4.0 (2020-02-28)

Features

  • make cache size limit configurable (7fd632d), closes #9

1.3.0 (2020-02-28)

Features

  • option to force HTTP/1(.1) protocol (501d6a2), closes #8

1.2.0 (2020-02-27)

Features

  • expose fetch context to allow custom configuration (6be0b6c), closes #15

1.1.0 (2020-02-03)

Features

  • support timeout on fetch requests; doc and test (ce6c1ce), closes #1

1.0.0 (2020-01-31)

Bug Fixes

  • package.json: trigger initial release (1280c16)