import { Interpreter , Machine , StateMachine } from "xstate" ; import type { ZWaveNode } from "./Node" ; import { NodeStatus } from "./Types" ; export interface NodeStatusStateSchema { states : { unknown : { } ; dead : { } ; alive : { } ; asleep : { } ; awake : { } ; } ; } const statusDict = { unknown : NodeStatus . Unknown , dead : NodeStatus . Dead , alive : NodeStatus . Alive , asleep : NodeStatus . Asleep , awake : NodeStatus . Awake } as const ; export function nodeStatusMachineStateToNodeStatus ( state ) { return statusDict [ state ] ?? NodeStatus . Unknown ; } export type NodeStatusEvent = { type : "DEAD" ; } | { type : "ALIVE" ; } | { type : "ASLEEP" ; } | { type : "AWAKE" ; } ; export type NodeStatusMachine = StateMachine < any , NodeStatusStateSchema , NodeStatusEvent > ; export type NodeStatusInterpreter = Interpreter < any , NodeStatusStateSchema , NodeStatusEvent > ; export function createNodeStatusMachine ( node ) { return Machine < any , NodeStatusStateSchema , NodeStatusEvent > ( { id : "nodeStatus" , initial : "unknown" , states : { unknown : { on : { DEAD : { target : "dead" , cond : "cannotSleep" } , ALIVE : { target : "alive" , cond : "cannotSleep" } , ASLEEP : { target : "asleep" , cond : "canSleep" } , AWAKE : { target : "awake" , cond : "canSleep" } } } , dead : { on : { ALIVE : "alive" } } , alive : { on : { DEAD : "dead" , ASLEEP : { target : "asleep" , cond : "canSleep" } , AWAKE : { target : "awake" , cond : "canSleep" } } } , asleep : { on : { AWAKE : "awake" } } , awake : { on : { ASLEEP : "asleep" } } } } , { guards : { canSleep : ( ) => ! ! node . canSleep , cannotSleep : ( ) => ! node . canSleep } } ) ; }