Skip to content

Instantly share code, notes, and snippets.

@drmikecrowe
Created November 21, 2019 18:47
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save drmikecrowe/e1a613a09c1da7956b112e021f74130f to your computer and use it in GitHub Desktop.
Save drmikecrowe/e1a613a09c1da7956b112e021f74130f to your computer and use it in GitHub Desktop.
Generated by XState Viz: https://xstate.js.org/viz
const RETRY_INTERVAL = 2000;
const MAX_RETRIES = 3;
const initHardwareState = "initHardware";
const connectNetworkState = "connectNetwork";
const provisionState = "provision";
const retryState = "retry";
const fatalState = "fatal";
const connectedState = "connected";
const SHUTDOWN = "SHUTDOWN";
const T_SHUTDOWN = { type: SHUTDOWN };
const INIT_HARDWARE_COMPLETE = "INIT_HARDWARE_COMPLETE";
const T_INIT_HARDWARE_COMPLETE = { type: INIT_HARDWARE_COMPLETE };
const WIFI_CONNECTED = "WIFI_CONNECTED";
const T_WIFI_CONNECTED = { type: WIFI_CONNECTED };
const IOT_CONNECTED = "IOT_CONNECTED";
const T_IOT_CONNECTED = { type: IOT_CONNECTED };
const READY = "READY";
const T_READY = { type: READY };
const ERROR = "ERROR";
const T_ERROR = { type: ERROR };
const NETWORK_DISCONNECTED = "NETWORK_DISCONNECTED";
const T_NETWORK_DISCONNECTED = { type: NETWORK_DISCONNECTED };
const incrementRetries =
assign({
retries: ctx => ctx.retries + 1,
});
const resetRetries = assign({ retries: ctx => (ctx.retries = 0) });
const condHaveRetries = (ctx, _) => ctx.retries < MAX_RETRIES;
const condHaveNoRetries = (ctx, _) => ctx.retries >= MAX_RETRIES;
const defaultContext = {
retries: 0,
};
const hardwareMachineDef = {
id: "Hardware",
initial: initHardwareState,
context: {
retries: 0,
},
states: {
[initHardwareState]: {
on: {
[INIT_HARDWARE_COMPLETE]: { target: connectNetworkState, actions: "resetRetries" },
[ERROR]: { target: retryState, actions: "incrementRetries" },
},
},
[connectNetworkState]: {
on: {
[WIFI_CONNECTED]: { target: provisionState, actions: "resetRetries" },
[ERROR]: { target: retryState, actions: "incrementRetries" },
},
},
[provisionState]: {
on: {
[IOT_CONNECTED]: { target: connectedState, actions: "resetRetries" },
[ERROR]: { target: retryState, actions: "incrementRetries" },
},
},
[retryState]: {
after: {
[RETRY_INTERVAL]: { target: initHardwareState, cond: "condHaveRetries" },
0: { target: fatalState, cond: "condHaveNoRetries" },
},
},
[fatalState]: {
type: "final",
data: { error: "Hardware Failure" },
},
[connectedState]: {
// activities: [activities.monitorNetwork.name],
on: {
[NETWORK_DISCONNECTED]: { target: initHardwareState },
},
},
},
};
const hardwareMachineOpts = {
actions: {
incrementRetries,
resetRetries,
},
guards: {
condHaveNoRetries,
condHaveRetries,
},
};
const hardwareMachine = Machine(hardwareMachineDef, hardwareMachineOpts);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment