DEV Community

rxliuli
rxliuli

Posted on

Introduction to @rxliuli/vista: A unified request interceptor library for both Fetch and XHR with middleware support.

npm version
License: MIT

@rxliuli/vista is a powerful homogeneous request interceptor library that supports unified interception of Fetch/XHR requests. It allows you to intervene at different stages of the request lifecycle, enabling various functions such as request monitoring, modification, and mocking.

Characteristics

  • 🚀 Supports both Fetch and XHR request interception
  • 🎯 Use middleware pattern, flexible and easy to expand
  • 💫 Support interventions before and after requests
  • 🔄 Modifiable request and response data
  • 📦 Zero dependency, compact size
  • 🌐 Supports browser environment only

Installation

npm install @rxliuli/vista
# Or
yarn add @rxliuli/vista
# Or
pnpm add @rxliuli/vista
Enter fullscreen mode Exit fullscreen mode

Basic Usage

import { Vista } from '@rxliuli/vista'

new Vista()
  .use(async (c, next) => {
    console.log('Request started:', c.req.url)
    await next()
  })
  .use(async (c, next) => {
    await next()
    console.log('Response data:', await c.res.clone().text())
  })
  .intercept()
Enter fullscreen mode Exit fullscreen mode

Advanced Use Cases

Add global request headers

new Vista()
  .use(async (c, next) => {
    c.req.headers.set('Authorization', 'Bearer token')
    await next()
  })
  .intercept()
Enter fullscreen mode Exit fullscreen mode

Request Result Cache

const cache = new Map()

new Vista()
  .use(async (c, next) => {
    const key = c.req.url
    if (cache.has(key)) {
      c.res = cache.get(key).clone()
      return
    }
    await next()
    cache.set(key, c.res.clone())
  })
  .intercept()
Enter fullscreen mode Exit fullscreen mode

Request failed, please retry

new Vista()
  .use(async (c, next) => {
    const maxRetries = 3
    let retries = 0

    while (retries < maxRetries) {
      try {
        await next()
        break
      } catch (err) {
        retries++
        if (retries === maxRetries) throw err
      }
    }
  })
  .intercept()
Enter fullscreen mode Exit fullscreen mode

Dynamic modify response

new Vista()
  .use(async (c, next) => {
    await next()
    if (c.req.url === 'https://example.com/example') {
      const json = await c.res.json()
      json.id = 2
      c.res = new Response(JSON.stringify(json), c.res)
    }
  })
  .intercept()
Enter fullscreen mode Exit fullscreen mode

API Reference

Vista Class

Main interceptor class, providing the following methods:

  • use(middleware): Add middleware
  • intercept(): Start intercepting requests
  • destroy(): Stop intercepting requests

Middleware Context

The middleware function receives two parameters:

  • context: Contains request and response information
    • req: Request object res: Response object
    • type: Request type, fetch or xhr
  • next: Call the function of the next middleware or original request

FAQ

  1. How to stop interception?
   const vista = new Vista()
   vista.intercept()
   // When not needed
   vista.destroy()
Enter fullscreen mode Exit fullscreen mode
  1. Does it support asynchronous operations?
    Yes, the middleware supports async/await syntax.

  2. Does it support intercepting requests in Node.js?

No, it only supports intercepting requests in the browser.

Thanks

  • xhook: A library that implements xhr interception, helpful for the implementation of some features.
  • hono: An excellent web server framework that provides a lot of inspiration in its API.

Contribution Guidelines

Welcome to submit Issues and Pull Requests!

License

MIT License

Try it and tell me your experience, welcome any error or feature feedback.

Top comments (0)