npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

redux-action-listeners

v1.0.2

Published

Listen for actions in Redux

Readme

Synopsis

Redux middleware for listening to actions.

Installation

npm install --save redux-action-listeners

Description

Redux Action Listeners allows you to listen to Redux actions. You also have the option of altering the return value of dispatch for that action.

How it works

Create an object that defines the listener interface.

Listener Interface (my-listener.js)

export default {

  // types can be an array of action types, or the string 'all'
  types: [ 'ACTION_TYPE' ],

  // setStore (optional)
  // in case you want a reference to store in your listener object
  setStore (store) {
    this.store = store;
  },

  // handleAction is called when an action from types is dispatched
  handleAction ( action, dispatched, store ) {

  }
}

handleAction arguments

  1. action * the original action dispatched * must be a plain object with a type (thunk actions not supported)
  2. dispatched * the action is intercepted by handleAction after it has been passed to the next middleware * dispatched is the result of having called next(action) * for more information on how middleware is composed, see the redux middleware docs
  3. store * a reference to the store

handleAction return value

If handleAction is called, whatever you return from it will be the return value of dispatching the action.

store.js (where you configure your redux store)

import { createStore, applyMiddleware } from 'redux'
import listen from 'redux-action-listeners'
import MyListener from './my-listener'

const store = createStore(
  reducer,
  applyMiddleware(
    listen(MyListener)
  )
)

If you have multiple listeners, use the middleware multiple times.

const store = createStore(
  reducer,
  applyMiddleware(
    listen(ListenerA), listen(ListenerB)
  )
)

Listener Examples

Async listener

You can return a promise from the handleAction method.

// fetch-listener.js

export default {
  types: [ 'FETCH' ],

  handleAction (action) {
    return fetch(action.url, action.init).then(response => response.json())
  }
}

Usage

// actions.js
export function fetchCurrentUser(userId) {
  const action = {
    type: 'FETCH',
    url: `https://mydomain.com/api/users/${userId}`
  }
  return dispatch => dispatch(action).then(user => {
    console.log(user.displayName)
  })
}

Event Emitter

// action-emitter.js

// node's EventEmitter class
import EventEmitter from 'events';

export default class ActionEmitter extends EventEmitter {
  constructor(...args) {
    super(...args);
    this.types = 'all';
  }
  handleAction(action, dispatched, store) {
    this.emit(action.type, action, store);
    return dispatched;
  }
}

Usage

import ActionEmitter from '../action-emitter';

ActionEmitter.on('MY_REDUX_ACTION', (action, store) => {
  // do something
  // store.dispatch({ type: 'ANOTHER_ACTION' });
})

Disclaimer

I made this redux middleware a long time ago, and I'm not currently using it. I've never used or tested the event emitter example.

Contributors

If you would like to contribute, please first open a new issue for discussing.