🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@idempotix/express

Package Overview
Dependencies
Maintainers
1
Versions
1
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@idempotix/express

Express middleware for Idempotix idempotency

latest
Source
npmnpm
Version
1.0.3
Version published
Maintainers
1
Created
Source

@idempotix/express

Express middleware for HTTP idempotency.

npm version

Installation

npm install @idempotix/core @idempotix/express

Quick Start

import express from 'express';
import { express as idempotent } from '@idempotix/express';

const app = express();
app.use(express.json());

// Zero-config: memory storage, 24h TTL
app.post('/orders', idempotent(), async (req, res) => {
  const order = await createOrder(req.body);
  res.status(201).json(order);
});

Configuration

app.post(
  '/payments',
  idempotent({
    storage: redis(), // Storage adapter
    ttl: '1h', // Cache duration
    required: true, // Require Idempotency-Key header
    methods: ['POST', 'PUT'], // HTTP methods to protect
    failOpen: true, // Continue if storage fails
    getKey: (req) => req.headers['x-request-id'], // Custom key extraction
    getHash: (req) => hashObject(req.body), // Custom hash function
    onHit: (key, response) => {}, // Cache hit callback
    onMiss: (key) => {}, // Cache miss callback
    onError: (key, error) => {}, // Error callback
  }),
  handler
);

Pre-configured Factory

Share configuration across routes:

import { configure } from '@idempotix/express';
import { redis } from '@idempotix/redis';

const idempotent = configure({
  storage: redis(),
  ttl: '1h',
});

app.post('/orders', idempotent(), orderHandler);
app.post('/payments', idempotent({ required: true }), paymentHandler);

Headers

HeaderDirectionDescription
Idempotency-KeyRequestClient-provided unique key
Idempotency-KeyResponseEcho of the key used
Idempotency-ReplayResponsetrue when returning cached response

Error Responses

All errors follow RFC 7807 Problem Details:

StatusTypeCause
400key-requiredMissing key when required: true
409conflictRequest with same key in progress
422mismatchSame key reused with different body
{
  "type": "https://Idempotix.dev/errors/conflict",
  "title": "Conflict",
  "status": 409,
  "detail": "A request with this idempotency key is already being processed"
}

With Redis

import { redis } from '@idempotix/redis';

app.post('/orders', idempotent({ storage: redis() }), handler);

License

MIT

Keywords

Idempotix

FAQs

Package last updated on 25 Jan 2026

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts