reduxio
Treat actions as they were events.

Lightweight Redux middleware that simplifies creating real-time apps with socket.io.
Getting started
npm i @art4/reduxio
import { createStore, applyMiddleware } from 'redux';
import io from 'socket.io-client';
import { createIoMiddleware } from '@art4/reduxio';
const socket = io('localhost');
const ioMiddleware = createIoMiddleware({
socket,
listenTo: ['MESSAGE_RECEIVE']
});
const store = createStore(
reducers,
applyMiddleware(ioMiddleware)
);
How it works

Example
Client
import { createStore, applyMiddleware } from 'redux';
import io from 'socket.io-client';
import { createIoMiddleware } from '@art4/reduxio';
const socket = io('localhost');
const ioMiddleware = createIoMiddleware({
socket,
listenTo: ['$_MESSAGE_RECEIVE']
});
const store = createStore(
reducers,
applyMiddleware(ioMiddleware)
);
store.dispatch({
type: 'MESSAGE_SEND',
payload: 'Message sent from client'
});
Server
socket.on('MESSAGE_SEND', (action, dispatchOnce) => {
socket.emit('$_MESSAGE_RECEIVE', {
type: '$_MESSAGE_RECEIVE',
payload: action.payload
});
dispatchOnce({ type: '$_MESSAGE_SUCCESS' });
});
API
createIoMiddleware (options: object)
Creates redux middleware with options.
Options:
socket | Object | | yes | Socket.io client instance. |
autoEmit | Boolean | true | | Automatically emit dispatched actions. Can be overwritten for specific action with meta io: false option. |
listenTo | Array | [] | | Action types (event names) that are going to be automatically dispatched to the store. |
io: boolean | object
Options that are passed to action's meta as io
property.
io: boolean
Determines if the action has to be emitted or not.
io: object
Allows to pass options when emitting specific action.
withState | Boolean | false | Emits action with current store state (after this action has been dispatched). |
More examples
Emit with client's state
Client
store.dispatch({
type: 'MESSAGE_SEND',
payload: 'Hello',
meta: { io: { withState: true }}
});
Server
socket.on('MESSAGE_SEND', (action, state, dispatchOnce) => {
});
Disable/enable emitting specific action
const ioMiddleware = createIoMiddleware({
socket,
autoEmit: true
});
const store = createStore(
reducers,
applyMiddleware(ioMiddleware)
);
store.dispatch({
type: 'MESSAGE_SEND',
payload: 'Hello',
meta: {
io: false
}
});