Skip to main content

Defining Router Logic

Sometimes a simple status-to-status transition isn't enough.
You may want to route actions conditionally based on context, payload, or shared state.


๐Ÿง  What is Router Logic?โ€‹

Router logic lets you override or extend transitions using:

  • Contextual conditions (ctx.state, ctx.sv, etc.)
  • Action payloads
  • Runtime data

๐Ÿ”€ Example: Conditional Transitionโ€‹

const transitionSelectors = {
idle: {
increment: ({ ctx, payload }) => {
return ctx.state.count >= 5 ? 'cooldown' : 'incrementing';
},
},
};

This overrides the static transition and dynamically decides where to go.


๐Ÿงช Use Case Scenariosโ€‹

Use CaseExample
Form validationGo to error if ctx.state.valid === false
API throttlingGo to cooldown if call limit exceeded
Dynamic branchingRoute based on payload flag

โš ๏ธ Things to Watch Out Forโ€‹

  • Avoid side effects inside routing logic
  • Always return a valid status string
  • Consider fallback/default transitions

This logic is usually passed to createMachineConfig() as:

createMachineConfig({
...transitionSelectors,
});