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 -- callnext()to continue the chain, or return your own resultonStateChange(state, prevState, signalName)fires after state actually changed- Multiple middlewares compose:
onDispatchwraps 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;
};