@wanpong007/request-dedup
v1.0.0
Published
Request de-duplication utilities with idempotency key support
Maintainers
Readme
@5zx/request-dedup
Request de-duplication utilities with idempotency key support.
Install
npm install @5zx/request-dedupUsage (Axios example)
import {
buildIdempotencyKey,
isDedupCandidate,
tryAcquireKey,
releaseRequest,
markCooldown,
resolveIdempotencyHeader,
resolveWindowMs,
DuplicateRequestError,
} from '@5zx/request-dedup';
axios.interceptors.request.use((config) => {
const options = config.requestOptions || {};
if (isDedupCandidate(config, options)) {
const key = buildIdempotencyKey(config, options);
if (!tryAcquireKey(key)) {
throw new DuplicateRequestError();
}
const headerName = resolveIdempotencyHeader(options);
const windowMs = resolveWindowMs(options);
config.__dedupKey = key;
config.__dedupWindowMs = windowMs;
config.headers = config.headers || {};
config.headers[headerName] = key;
}
return config;
});
axios.interceptors.response.use(
(response) => {
releaseRequest(response.config.__dedupKey);
markCooldown(response.config.__dedupKey, response.config.__dedupWindowMs);
return response;
},
(error) => {
releaseRequest(error?.config?.__dedupKey);
markCooldown(error?.config?.__dedupKey, error?.config?.__dedupWindowMs);
return Promise.reject(error);
},
);Options
repeatRequest.enabled: enable/disable de-dup.repeatRequest.windowMs: cooldown window in ms.idempotencyKey: override key generation.idempotencyHeader: override header name.
