TypeScript icon, indicating that this package has built-in type declarations

1.0.1 • Public • Published


Simple streaming state manager. Inspired by meiosis pattern. Browser must support new Map, new Set, and Symbol.

npm install -S strom


const { Strom } = require('strom');

// or

import Strom from 'strom';

const stream = new Strom({ ...initialState }, { ...opts });

// Add a modifier
stream.modify((value, state) => {

    // Perform modifications here and return modified state
    return {

// Simple actions object store that pushes states to stream
const actions = {
    getThings: () => {
        stream.update({ things: [1,2,3] });
    breakThings: () => {
        stream.update({ broken: true });

export default (props) => {

    const [appState, setAppState] = useState(props.appState);

    useEffect(() => {

        const listener = (nextState) => {



        return () => stream.unlisten(listener);
    }, [])

    useEffect(() => {


    return <>
        <My2ndComponent { ...props, state } />
        <My3rdComponent { ...props, state } />


update(value: any): this;

Push an update

modify(func: Function): this;

Function that modifies state. Pass a function declaration for ability to return this.IGNORE

returns Strom instance

stream.modify((value, state, ignore) => {

    if (value.dontModify) {
        return ignore;

    return merge(state, value);

unmodify(func: Function): this;

Removes a modifier when passed existing function reference

returns Strom instance

listen(func: Function): this;

Adds a listener that runs when stream update is executed

returns Strom instance

unlisten(func: Function): this;

Removes a listener when passed existing function reference

returns Strom instance

states(): any[];

Returns an array of all states

state(): any;

Returns current state

flushStates(): void;

Cleans all stored states, except current state. State is reset if it wasn't on the current state

resetState(): void;

Sets the current state back to whatever it was. Useful for where stepping forward and backwards between states and then returning to your original state.

prevState(): void;

Go back 1 state. Does not work if flushOnRead is true.

nextState(): void;

Go forward 1 state. Does not work if flushOnRead is true.

clone(): Strom;

Creates a child instance of Strom. Receives parent's modifiers and will update whever parent is updated. Adding modifiers and listeners will not affect parent Strom instance.

returns `{Strom} Strom instance


type StromOptions = {
    /** Immediately execute state modifiers when added */
    execNewModifiers?: boolean;
    /** Immediately execute listeners when added */
    execNewListeners?: boolean;
    /** How many states changes to keep in memory */
    statesToKeep?: number;
    /** Removes states after reading */
    flushOnRead?: boolean;
    /** Parent stream. Only used for cloning. */
    parent?: Strom;
type ModifierFunction = (value: any, state?: any, ignore?: symbol) => any;
class Strom {
    _options: StromOptions | null;
    _sid: number;
    stateId(): number;
    _state: any;
    _modifiers: Set<ModifierFunction> | null;
    _listeners: Set<Function> | null;
    _states: Map<number, any> | null;
    _currentState: number | null;
    _latestState: number | null;
    _parent: Strom | null;
    constructor(state?: any, options?: StromOptions);
    private _addState;
    private _notifyListeners;
    update(value: any): this;
    modify(func: Function): this;
    unmodify(func: Function): this;
    listen(func: Function): this;
    unlisten(func: Function): this;
    states(): any[];
    state(): any;
    flushStates(): void;
    resetState(): void;
    private _stateStepper;
    prevState(): void;
    nextState(): void;
    clone(): Strom;

Package Sidebar


npm i strom

Weekly Downloads






Unpacked Size

28.3 kB

Total Files


Last publish


  • damusix