{
  "Comment": "Session State Machine",
  "StartAt": "Init",
  "States": {
    "Init": {
      "Type": "Task",
      "Resource": "Hello",
      "TransitionEvent": ":hello_sent",
      "Next": "Handshake",
      "Catch": [
        {
          "ErrorEquals": [":abort"],
          "Next": "Abort"
        }
        
      ]
    },
    "Handshake": {
      "Type": "Choice",
      "Resource": "HandleHandshake",
      "Choices": [
        {
          "StringEquals": ":message_received",
          "Next": "Message"
        },
        {
          "StringEquals": ":abort",
          "Next": "Abort"
        }
      ]
    },
    "Established": {
      "Type": "Choice",
      "Resource": "HandleEstablished",
      "Choices": [
        {
          "StringEquals": ":message_received",
          "Next": "Message"
        },
        {
          "StringEquals": ":goodbye",
          "Next": "GoodBye"
        },
        {
          "StringEquals": ":abort",
          "Next": "Abort"
        }
      ]
    },
    "Message": {
      "Type": "Choice",
      "Resource": "HandleMessage",
      "Choices": [
        {
          "StringEquals": ":established",
          "Next": "Established"
        },
        {
          "StringEquals": ":welcome",
          "Next": "Welcome"
        },
        {
          "StringEquals": ":event",
          "Next": "Event"
        },
        {
          "StringEquals": ":invocation",
          "Next": "Invocation"
        },
        {
          "StringEquals": ":abort",
          "Next": "Abort"
        },
        {
          "StringEquals": ":goodbye",
          "Next": "GoodBye"
        },
        {
          "StringEquals": ":challenge",
          "Next": "Challenge"
        },
        {
          "StringEquals": ":interrupt",
          "Next": "Interrupt"
        }
      ]
    },
    "Welcome": {
      "Type": "Task",
      "Resource": "HandleWelcome",
      "TransitionEvent": ":established",
      "Next": "Established"
    },
    "Interrupt": {
      "Type": "Task",
      "Resource": "HandleInterrupt",
      "Next": "Established"
    },
    "Challenge": {
      "Type": "Task",
      "Resource": "HandleChallenge",
      "Next": "Handshake",
      "TransitionEvent": ":challenged"
    },
    "Event": {
      "Type": "Task",
      "Resource": "HandleEvent",
      "Next": "Established"
    },
    "Invocation": {
      "Type": "Task",
      "Resource": "HandleInvocation",
      "Next": "Established"
    },
    "GoodBye": {
      "Type": "Task",
      "Resource": "GoodBye",
      "End": true
    },
    "Abort": {
      "Type": "Task",
      "Resource": "HandleAbort",
      "End": true
    }
  }
}
