SCXML
XState is compatible with the SCXML (State Chart XML: State Machine Notation for Control Abstraction) specification. This page contains details on where our API relates to the SCXML specification.
Events​
Events in SCXML contain information relevant to the source of the event and have a different schema than event objects in XState. Internally, event objects are converted to SCXML events for compatibility.
SCXML events include:
name, a character string giving the name of the event.nameis equivalent to the.typeproperty of an XState event.type, the event type:'platform','external', or'internal'.platformevents are raised by the platform itself, such as error events.internalevents are raised byraise(...)actions or bysend(...)actions withtarget: '_internal'.externalevents describe all other events.
sendid, the send ID of the triggeringsend(...)action.origin, a string that allows the receiver of this event tosend(...)a response event back to the origin.origintype, used withorigin.invokeid, the invoke ID of the invocation that triggered the child actor.data, any data that the sending entity included with this event.datais equivalent to an XState event object.
The SCXML event form of all XState events is present in the _event property of action and guard meta objects as the third argument:
// ...
{
actions: {
someAction: (context, event, { _event }) => {
console.log(_event); // SCXML event
};
},
guards: {
someGuard: (context, event, { _event }) => {
console.log(_event); // SCXML event
}
}
}
// ..
Transitions​
The event-target mappings defined on the on: { ... } property of state nodes is synonymous to the SCXML <transition> element:
{
green: {
on: {
TIMER: {
target: '#yellow',
cond: context => context.timeElapsed > 5000
},
POWER_OUTAGE: { target: '#red.flashing' }
}
},
// ...
}
<state id="green">
<transition
event="TIMER"
target="yellow"
cond="timeElapsed > 5000"
/>
<transition
event="POWER_OUTAGE"
target="red.flashing"
/>
</state>
- https://www.w3.org/TR/scxml/#transition - the definition of
<transition>
Guards​
The cond property is equivalent to the cond attribute on the SCXML <transition> element:
{
on: {
e: {
target: 'foo',
cond: context => context.x === 1
}
}
}
<transition event="e" cond="x == 1" target="foo" />
Similarly, the in property is equivalent to the In() predicate:
{
on: {
e: {
target: 'cooking',
in: '#closed'
}
}
}
<transition cond="In('closed')" target="cooking"/>
cond and In() in the SCXML specification​
- SCXML definition of the
condattribute - SCXML conditional expressions and the requirement of supporting the
In()predicate - How transitions are selected given an event in SCXML
State IDs​
IDs correspond to the definition of IDs in the SCXML spec:
{
green: {
id: 'lightGreen';
}
}
<state id="lightGreen">
<!-- ...-->
</state>
IDs in the SCXML specification​
- SCXML specification that all
idattributes must be unique - SCXML definition of the
idattribute in<state>
Actions​
Executable actions in transitions are equivalent to the SCXML <script> element. The entry and exit properties are equivalent to the <onentry> and <onexit> elements, respectively.
{
start: {
entry: 'showStartScreen',
exit: 'logScreenChange',
on: {
STOP: {
target: 'stop',
actions: ['logStop', 'stopEverything']
}
}
}
}
<state id="start">
<onentry>
<script>showStartScreen();</script>
</onentry>
<onexit>
<script>logScreenChange();</script>
</onexit>sc
<transition event="STOP" target="stop">
<script>logStop();</script>
<script>stopEverything();</script>
</transition>
</state>
script, onentry and onexit in the SCXML specification​
- SCXML definition of the
<script>element - SCXML definition of the
<onentry>element - SCXML definition of the
<onexit>element
Invoke​
The invoke property is synonymous with the SCXML <invoke> element:
// XState
{
loading: {
invoke: {
src: 'someSource',
id: 'someID',
autoForward: true, // currently for machines only!
onDone: 'success',
onError: 'failure'
}
}
}
<!-- SCXML-->
<state id="loading">
<invoke id="someID" src="someSource" autoforward />
<transition event="done.invoke.someID" target="success" />
<transition event="error.platform" cond="_event.src === 'someID'" target="failure" />
</state>