Skip to content

Instantly share code, notes, and snippets.

@thedom85
Created May 31, 2022 21:46
Show Gist options
  • Save thedom85/5a5be8f9eb56a5b86b047230c65774f9 to your computer and use it in GitHub Desktop.
Save thedom85/5a5be8f9eb56a5b86b047230c65774f9 to your computer and use it in GitHub Desktop.
// https://www.codewars.com/kata/54acc128329e634e9a000362/train/javascript
function traverseTCPStates(eventList){
var state = "CLOSED";
var states = {
CLOSED : { APP_PASSIVE_OPEN : "LISTEN", APP_ACTIVE_OPEN : "SYN_SENT" },
LISTEN: { RCV_SYN : "SYN_RCVD", APP_SEND : "SYN_SENT", APP_CLOSE : "CLOSED" },
SYN_RCVD: { APP_CLOSE : "FIN_WAIT_1", RCV_ACK : "ESTABLISHED" },
SYN_SENT: { RCV_SYN : "SYN_RCVD", RCV_SYN_ACK : "ESTABLISHED", APP_CLOSE : "CLOSED" },
ESTABLISHED: { APP_CLOSE : "FIN_WAIT_1", RCV_FIN : "CLOSE_WAIT" },
FIN_WAIT_1: { RCV_FIN : "CLOSING", RCV_FIN_ACK : "TIME_WAIT", RCV_ACK : "FIN_WAIT_2" },
CLOSING: { RCV_ACK : "TIME_WAIT" },
FIN_WAIT_2: { RCV_FIN : "TIME_WAIT" },
TIME_WAIT: { APP_TIMEOUT : "CLOSED" },
CLOSE_WAIT: { APP_CLOSE : "LAST_ACK" },
LAST_ACK: { RCV_ACK : "CLOSED" },
ERROR: {}
};
return eventList.reduce(function(state, input) { return states[state][input] || "ERROR"; }, state);
}
console.log(traverseTCPStates(["APP_ACTIVE_OPEN","RCV_SYN_ACK","RCV_FIN"]), "- CLOSE_WAIT")
console.log(traverseTCPStates(["APP_PASSIVE_OPEN", "RCV_SYN","RCV_ACK"]), "- ESTABLISHED")
console.log(traverseTCPStates(["APP_ACTIVE_OPEN","RCV_SYN_ACK","RCV_FIN","APP_CLOSE"]), "- LAST_ACK")
console.log(traverseTCPStates(["APP_ACTIVE_OPEN"]), "- SYN_SENT")
console.log(traverseTCPStates(["APP_PASSIVE_OPEN","RCV_SYN","RCV_ACK","APP_CLOSE","APP_SEND"]), "- ERROR")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment