Skip to content

Instantly share code, notes, and snippets.

@sylvanaar
Last active December 31, 2020 15:04
Show Gist options
  • Save sylvanaar/df89f3774f56c0bfe7498852d12a4bad to your computer and use it in GitHub Desktop.
Save sylvanaar/df89f3774f56c0bfe7498852d12a4bad to your computer and use it in GitHub Desktop.
Generated by XState Viz: https://xstate.js.org/viz
const machine = Machine(
{
id: "auth",
initial: "startup",
context: {
token: null,
promise: null,
expiresAt: 0,
},
states: {
startup: {
on: {
"": [
{ target: "loggedIn", cond: "loggedIn" },
{ target: "loggedOut", cond: "loggedOut" },
],
},
},
requesting: {
invoke: {
id: "refreshToken",
src: "refreshToken",
onError: [
{ target: "loggedIn", cond: "loggedIn" },
{ target: "loggedOut", cond: "loggedOut" },
],
onDone: {
actions: "tokenRefreshed",
target: "loggedIn",
},
},
},
loggedIn: {
entry: "startTimer",
exit: "clearTimer",
on: {
LOGOUT: "loggedOut",
TICK: [
{ target: "requesting", cond: "expired" },
{
target: "loggedIn",
actions: actions.assign({
expiresAt: (context) => context.expiresAt -1
}),
},
],
},
},
loggedOut: {
entry: "clearData",
on: {
LOGIN: "requesting",
},
},
},
},
{
guards: {
loggedIn: (context, _event) => context.token !== null && context.promise !== null,
loggedOut: (context, _event) => context.token === null,
requesting: (context, _event) => context.promise !== null,
expired: (context, _event) => context.expiresAt <= 0,
},
actions: {
// saveToken: (context, event) => {
// context.token = event.data;
// context.expiresAt = "10";
// },
// savePromise: (context, event) => (context.promise = event.data),
startTimer: () =>
send("TICK", {
delay: 1000,
id: "mainTimer",
}),
clearTimer: () => actions.cancel("mainTimer"),
clearData: () =>
actions.assign({
token: null,
promise: null,
}),
tokenRefreshed: () =>
actions.assign({
expiresAt: 10,
token: (c, e) => e.data,
}),
},
services: {
refreshToken: (_context, _event) =>
new Promise((res, _rej) => {
setTimeout(() => res("test-token"), 10000);
}),
},
},
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment