OMC's Blog

xstate-5 by Palahniuk

March 20, 2024

Imagine you're in a world where machines talk to each other, where every line of code is a command, a whisper, a shout in the digital void. This is the realm of customMachine, a beast of logic and state, a creature of conditions and actions, a titan of the TypeScript universe.

export const customMachine = setup({
  // ... (setup configuration)
}).createMachine({
  // ... (machine configuration)
});

This is the heart of the beast, the core where it all begins. The customMachine is not just a machine; it's a setup, a blueprint, a plan for the chaos that's about to unfold. It's a call to setup, a function from the xstate-5 library, a library that's all about state management, about knowing who you are at any given moment.

The setup function is where you define the skeleton of your machine. You tell it about the children it will spawn, the context it will hold, the events it will respond to, and the input it will accept. It's like giving birth to a digital Frankenstein, piece by piece, part by part.

types: {} as {
  children: {
    firstChild: "firstChildMachine";
    secondChild: "secondChildMachine";
  };
  // ... (more types)
},

Here, in the types, you're defining the offspring of your machine. firstChild and secondChild are the names you've given to the children, and they're linked to other machines, other entities with their own logic and purpose. It's a family tree of automation, a lineage of logic.

actions: {
  // ... (actions configuration)
},

Actions are the muscles of the machine, the things it can do. When an event occurs, when something happens in the world of your application, the machine responds with an action. It could be as simple as sending a message to another part of the system, or as complex as transforming the entire context it holds.

actors: {
  // ... (actors configuration)
},

Actors are the characters in this play, the entities that perform the actions. They're not just static pieces of code; they're dynamic, they're alive. They can be other machines, promises of work to be done, or requests for data from the outside world.

guards: {
  // ... (guards configuration)
},

Guards are the gatekeepers, the bouncers at the club door. They decide who gets in and who doesn't, which transitions are allowed and which are forbidden. They look at the context, the event, and they make a call: yes, you may pass, or no, you shall not.

And then, with a flourish, with a command that echoes in the digital ether, the machine is created.

createMachine({
  // ... (machine details)
});

This is where the customMachine truly comes to life. It's no longer just a plan; it's a living, breathing entity in the codebase. It has states, it has transitions, it has an identity.

The customMachine is a complex creature, a system of states and transitions, a web of logic and data. It's a machine that knows who it is, what it's doing, and where it's going. It's a machine that can handle the check-in process, that can manage the flow of users as they navigate through the system.

It's flawed, it's complex, it's beautiful in its intricacy. It's a reflection of the chaos of life, distilled into a TypeScript entity. It's the customMachine, and it's ready to run.


Oguzhan Murat Cakmak, starting his software career in Istanbul and advancing through roles in San Francisco at Uber and Hims&Hers, now does remote work from Kaş, Antalya, balancing his passion for technology with interests in kitesurfing, diving, hiking, and exploring diverse content on podcasts. Follow him on Twitter and Instagram

Webmentions

00
    Loading Webmentions...