{
  "Comment": "Router Session State Machine",
  "StartAt": "Init",
  "States": {
    "Init": {
      "Type": "Task",
      "Resource": "HandleInit",
      "Next": "Established"
    },
    "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": ":hello",
          "Next": "Hello"
        },
        {
          "StringEquals": ":authenticate",
          "Next": "Authenticate"
        },
        {
          "StringEquals": ":call",
          "Next": "Call"
        },
        {
          "StringEquals": ":yield",
          "Next": "Yield"
        },
        {
          "StringEquals": ":register",
          "Next": "Register"
        },
        {
          "StringEquals": ":unregister",
          "Next": "Unregister"
        },
        {
          "StringEquals": ":subscribe",
          "Next": "Subscribe"
        },
        {
          "StringEquals": ":unsubscribe",
          "Next": "Unsubscribe"
        },
        {
          "StringEquals": ":publish",
          "Next": "Publish"
        },
        {
          "StringEquals": ":invocation_error",
          "Next": "InvocationError"
        },
        {
          "StringEquals": ":abort",
          "Next": "Abort"
        },
        {
          "StringEquals": ":goodbye",
          "Next": "GoodBye"
        },
        {
          "StringEquals": ":cancel",
          "Next": "Cancel"
        }
      ]
    },
    "Hello": {
      "Type": "Task",
      "Resource": "HandleHello",
      "Next": "Established"
    },
    "Authenticate": {
      "Type": "Task",
      "Resource": "HandleAuthenticate",
      "Next": "Established"
    },
    "Call": {
      "Type": "Task",
      "Resource": "HandleCall",
      "Next": "Established",
      "Catch": [
        {
          "ErrorEquals": ["{:error, :no_live_callees}"],
          "Next": "Error"
        }
      ]
    },
    "Yield": {
      "Type": "Task",
      "Resource": "HandleYield",
      "Next": "Established"
    },
    "Register":{
      "Type": "Task",
      "Resource": "HandleRegister",
      "Next": "Established"
    },
    "Unregister":{
      "Type": "Task",
      "Resource": "HandleUnregister",
      "Next": "Established"
    },
    "Subscribe":{
      "Type": "Task",
      "Resource": "HandleSubscribe",
      "Next": "Established"
    },
    "Unsubscribe":{
      "Type": "Task",
      "Resource": "HandleUnsubscribe",
      "Next": "Established"
    },
    "Publish":{
      "Type": "Task",
      "Resource": "HandlePublish",
      "Next": "Established"
    },
    "InvocationError":{
      "Type": "Task",
      "Resource": "HandleInvocationError",
      "Next": "Established"
    },
    "GoodBye": {
      "Type": "Task",
      "Resource": "HandleGoodbye",
      "End": true
    },
    "Abort": {
      "Type": "Task",
      "Resource": "HandleAbort",
      "End": true
    }
  }
}
