Skip to main content

Middleware

import { createStore } from '@sinuxjs/core';

const logger = {
onDispatch({ signalName, args, next, getState }) {
console.log(`[${signalName}]`, args);
return next(getState(), ...args);
},
onStateChange(state, prevState, signalName) {
console.log(`[${signalName}] state changed`, prevState, '->', state);
},
};

const store = createStore({ count: 0 }, { inc: (s) => ({ count: s.count + 1 }) }, [logger]);

Middlewares are objects with onInit, onDispatch, and onStateChange hooks.

  • onInit(store) runs after store creation -- use for setup (subscriptions, hydration)
  • onDispatch({ signalName, args, getState, signal, next }) wraps signal dispatch -- call next() to continue the chain, or return your own result
  • onStateChange(state, prevState, signalName) fires after state actually changed
  • Multiple middlewares compose: onDispatch wraps in reverse order (onion model)

MiddlewareConfig type

type MiddlewareConfig<T> = {
onInit?: (store: Store<T>) => void;
onDispatch?: (context: {
signalName: string;
args: any[];
getState: () => T;
signal: Signal<T, any>;
next: (...args: any[]) => Promise<Partial<T> | void>;
}) => Promise<Partial<T> | void>;
onStateChange?: (state: T, prevState: T, signalName: string) => void;
};

Built-in middlewares: persist, devtools, immer.