# @ackee/antonio-utils

> ![ackee|Antonio](/assets/ackee_git_frontend_antonio.png)

Latest version **5.0.3** (published 2025-04-22) · MIT license · 0 weekly downloads

## Install

```sh
npm install @ackee/antonio-utils
pnpm add @ackee/antonio-utils
yarn add @ackee/antonio-utils
bun add @ackee/antonio-utils
```

## Health

**Score 35/100 (D)** — status: maintenance-mode.

Positive: has types; esm support; no vulnerabilities.

Warnings: low downloads.

Negative: stale; low maintenance score.

## Facts

| | |
|---|---|
| Version | 5.0.3 |
| Published | 2025-04-22 |
| First published | 2021-05-05 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Node | >=12 |
| Dependencies | 1 |
| Unpacked size | 43.9 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 7 |
| Author | Jiří Čermák |
| Maintainers | ackeecz, horaklukas, borecekbaji, davidbilik, grissius, hofp37, pivl |
| Keywords | http-client, fetch, javascript, ackee |

## Links

- npm: https://www.npmjs.com/package/@ackee/antonio-utils
- Repository: https://github.com/AckeeCZ/antonio
- Homepage: https://github.com/AckeeCZ/antonio#readme
- Issues: https://github.com/AckeeCZ/antonio/issues
- npm.io page: https://npm.io/package/@ackee/antonio-utils

## Dependencies (1)

- [abortcontroller-polyfill](https://npm.io/package/abortcontroller-polyfill.md) 1.7.8

## Alternatives

- [launchdarkly-js-client-sdk](https://npm.io/package/launchdarkly-js-client-sdk.md) — 2.5M weekly downloads
- [@elastic/elasticsearch](https://npm.io/package/@elastic/elasticsearch.md) — 2.1M weekly downloads
- [@c8y/client](https://npm.io/package/@c8y/client.md) — 15.3K weekly downloads
- [@signaldb/maverickjs](https://npm.io/package/@signaldb/maverickjs.md) — 1.7K weekly downloads
- [@bbc/http-transport-cache](https://npm.io/package/@bbc/http-transport-cache.md) — 1.2K weekly downloads

## Recent versions

- 5.0.3 (latest) — 2025-04-22
- 4.0.2 (@ackee/antonio-utils) — 2021-09-10
- 4.0.0-beta.39 (beta) — 2021-09-10
- 5.0.2 — 2025-04-22
- 5.0.1 — 2025-04-04
- 5.0.0 — 2024-03-08
- 4.1.1 — 2023-09-29
- 4.0.14 — 2023-02-22
- 4.0.13 — 2023-02-22
- 4.0.12 — 2022-06-28
- 4.0.11 — 2021-11-25
- 4.0.10 — 2021-10-25
- 4.0.9 — 2021-10-20
- 4.0.8 — 2021-10-19
- 4.0.7 — 2021-10-19
- … 21 more at https://npm.io/package/@ackee/antonio-utils/versions

## README

![ackee|Antonio](/assets/ackee_git_frontend_antonio.png)

# [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/AckeeCZ/antonio/blob/master/LICENSE) [![CI Status](https://img.shields.io/travis/com/AckeeCZ/antonio.svg?style=flat)](https://travis-ci.com/AckeeCZ/antonio) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://reactjs.org/docs/how-to-contribute.html#your-first-pull-request) [![Dependency Status](https://img.shields.io/david/AckeeCZ/antonio.svg?style=flat-square)](https://david-dm.org/AckeeCZ/antonio) [![bundlephobia](https://flat.badgen.net/bundlephobia/min/@ackee/antonio-utils)](https://bundlephobia.com/result?p=@ackee/antonio-utils) [![bundlephobia](https://flat.badgen.net/bundlephobia/minzip/@ackee/antonio-utils)](https://bundlephobia.com/result?p=@ackee/antonio-utils) ![node version](https://img.shields.io/node/v/@ackee/antonio-utils)

# `@ackee/antonio-utils`

Custom Saga effects with built-in cancelation of API requests.

## Table of contents

-   [Install](#install)
-   [API](#api)

    -   Effect creators

        -   [`takeRequest`](#api-takeRequest)
        -   [`takeLatestRequest`](#api-takeLatestRequest)

    -   Auth utils
        -   [`setAuthHeader`](#setAuthHeader)

-   [API (TypeDoc)](./docs)

---

## <a name="install"></a>Install

```bash
yarn add @ackee/antonio-utils -S
```

---

## <a name="api"></a>API Reference

### <a name="api-takeRequest"></a>`takeRequest(actionTypes: TakeRequest, saga: Function)`

#### Parameters

-   `actionTypes: TakeRequest`
    -   `REQUEST: ActionPattern` - action type that launches the saga
    -   `CANCEL: ActionPattern` - action type that aborts the running saga
-   `saga(requestAction, signal: Signal): Function` - the actual API request is made here

#### Example

```js
import { takeRequest } from '@ackee/antonio-utils';

export default function* () {
    // Works same as the Redux saga take effect, but on top of that, it cancels the API request.
    yield takeRequest(
        {
            REQUEST: 'FETCH_TODO_ITEM_REQUEST',
            CANCEL: 'FETCH_TODO_ITEM_INVALIDATE',
        },
        fetchTodoItem,
    );
}
```

---

### <a name="api-takeLatestRequest"></a>`takeLatestRequest(params: TakeLatestRequest, saga: Function)`

#### Parameters

-   `params: TakeLatestRequest<RequestAction extends AnyAction, CancelAction extends AnyAction>`
    -   `REQUEST: RequestAction['type']` - action type that launches the saga
    -   `cancelTask<A extends AnyAction = AnyAction>(requestId: RequestId, action: A): A;` - Redux action that will cancel the
        running saga
    -   `requestIdSelector?(action: RequestAction): RequestId;` - A function that receives request action as 1st arg. and returns unique ID of this action, e.g. user ID.
-   `saga(requestAction, signal: Signal): Function` - the actual API request is made here

#### Example

```js
import { takeLatestRequest } from '@ackee/antonio-utils';

// The 'signal' must be passed to the request config object:
function* fetchTodoItem(requestAction, signal) {
    const response = yield* api.get(`todos/1`, {
        signal,
    });

    return response.data;
}

const fetchTodoItemInvalidate = () => ({
    type: 'FETCH_TODO_ITEM_INVALIDATE',
});

export default function* () {
    // Works same as the Redux saga takeLatest effect, but on top of that, it cancels the API request.
    yield takeLatestRequest(
        {
            REQUEST: 'FETCH_TODO_ITEM_REQUEST',
            cancelTask: fetchTodoItemInvalidate,
        },
        fetchTodoItem,
    );
}
```

### Example - take latest request for certain user

If `requestIdSelector` function provided, instead of cancelling of all previous requests and taking only the last one for certain action type, take the lastest request for certain user, i.e. **identify the request by action type and by an ID**.

```js
import { takeLatestRequest } from '@ackee/antonio-utils';

// The 'signal' must be passed to the request config object:
function* fetchUser(requestAction, signal) {
    const { userId } = requestAction;
    const response = yield* api.get(`users/${userId}`, {
        signal,
    });

    return response.data;
}

const fetchUserInvalidate = userId => ({
    type: 'FETCH_USER_INVALIDATE',
    userId,
});

export default function* () {
    // Works same as the Redux saga takeLatest effect, but on top of that, it cancels the API request.
    yield takeLatestRequest(
        {
            REQUEST: 'FETCH_USER_REQUEST',
            cancelTask: fetchUserInvalidate,
            requestIdSelector: action => action.userId,
        },
        fetchUser,
    );
}
```

---

### <a name="setAuthHeader"></a>`setAuthHeader(headers: Headers, tokenValue?: string, tokenType: TokenType | string = TokenType.Bearer): void`

Sets or deletes the `Authorization` header with provided `tokenType` and `tokenValue`:

```js
const accessToken = 'eqwo123490ewqj123njir43';
const headers = new Headers();

setAuthHeader(headers, accessToken);

console.assert(headers.get('Authorization') === `Bearer eqwo123490ewqj123njir43`);
```

---
_Source: https://npm.io/package/@ackee/antonio-utils · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
