HOWTO - Using the @quatrain/state-machine Package

This guide details how to implement workflow lifecycles and conformance evaluation rules.


1. Setting up a Workflow (FSM)

Workflow state machines are event-driven and linear. You declare transitions and check results:

import { WorkflowStateMachine } from '@quatrain/state-machine';
 
type States = 'empty' | 'filling' | 'stocked';
type Events = 'FILL' | 'STOCK';
interface Context {
   oxygenLevel: number;
}
 
const context: Context = { oxygenLevel: 4.5 };
const fsm = new WorkflowStateMachine<States, Events, Context>('empty', context);
 
// 1. Declare transitions
fsm
   .addTransition('empty', 'FILL', 'filling')
   .addTransition(
      'filling', 
      'STOCK', 
      'stocked',
      // Guard (anonymous function check)
      (ctx) => ctx.oxygenLevel >= 4.0,
      // Action callback
      () => console.log('Bassin has been stocked!')
   );
 
// 2. Perform transitions
const success = await fsm.transition('FILL'); // true
console.log(fsm.getState()); // 'filling'

2. Setting up a Conformance Evaluator

Conformance machines analyze context attributes continuously to assign status levels:

import { ConformanceStateMachine } from '@quatrain/state-machine';
 
interface Metrics {
   ph: number;
}
 
const metrics: Metrics = { ph: 7.2 };
const sm = new ConformanceStateMachine<Metrics>('conforming', metrics);
 
// Declare priority rules (KO check runs first, then degraded, defaulting to conforming)
sm
   .addRule('ko', (ctx) => ctx.ph < 5.5)
   .addRule('degraded', (ctx) => ctx.ph < 6.5 || ctx.ph > 8.5)
   .addRule('conforming', () => true);
 
// Run evaluation
sm.evaluate(); 
console.log(sm.getState()); // 'conforming'
 
// Update metric values and re-evaluate
sm.updateContext({ ph: 5.2 });
sm.evaluate();
console.log(sm.getState()); // 'ko'