micro-ftch
Wrappers for built-in fetch() enabling killswitch, logging, concurrency limit and other features.
fetch is great, however, its usage in secure environments is complicated. The library makes it simple.
Usage
A standalone file
micro-ftch.js is also available.
npm install micro-ftch
There are three wrappers over fetch()
:
ftch(fetch)
- killswitch, logging, timeouts, concurrency limits, basic authjsonrpc(fetch)
- batched JSON-RPC functionalityreplayable(fetch)
- log & replay network requests without actually calling network code.
import { ftch, jsonrpc, replayable } from 'micro-ftch';
Killswitch: instantly enable and disable network
When kill-switch is enabled, all requests will throw an error.
You can dynamically enable and disable it any any time.
let ENABLED = true;
const f = ftch(fetch, { killswitch: () => ENABLED });
f('http://localhost');
ENABLED = false;
f('http://localhost');
ENABLED = true;
f('http://localhost');
Logging
const f = ftch(fetch, { log: (url, opts) => console.log('fetching', url, opts) });
f('http://url/');
Timeouts
const f = ftch(fetch);
const res = await f('http://url/', { timeout: 1000 });
const f = ftch(fetch, { timeout: 1000 });
const res = await f('http://url/');
Concurrency limit
Allows to not accidentally hit rate limits or do DoS.
const f = ftch(fetch, { concurrencyLimit: 1 });
const res = await Promise.all([f('http://url1/'), f('http://url2/')]);
Basic auth
const f = ftch(fetch);
const res = await f('https://user:pwd@httpbin.org/basic-auth/user/pwd');
jsonrpc
Supports batching multiple HTTP requests into one "Batched" JSON RPC HTTP request. Can massively speed-up when servers are single-threaded, has small per-user limits
const rpc = jsonrpc(fetch, 'http://rpc_node/', {
headers: {},
batchSize: 20,
});
const res = await rpc.call('method', 'arg0', 'arg1');
const res2 = await rpc.callNamed('method', { arg0: '0', arg1: '1' });
replayable
Small utility to log & replay network requests in tests, without actually calling network code.
const ftch = ftch(fetch);
const replayCapture = replayable(ftch);
await replayCapture('http://url/1');
await replayCapture('http://url/2');
const logs = replayCapture.export();
const replayTest = replayable(ftch, JSON.parse(logs));
await replayTest('http://url/1');
await replayTest('http://url/2');
await replayTest('http://url/3');
const replayTestOffline = replayable(ftch, JSON.parse(logs), {
offline: true,
});
await replayTest('http://url/1');
await replayTest('http://url/2');
await replayTest('http://url/3');
Privacy
ftch() disables referrer by default by setting referrerPolicy: 'no-referrer'
.
License
MIT (c) Paul Miller (https://paulmillr.com), see LICENSE file.