client.js 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847
  1. /*
  2. Date: Wed Sep 22 19:32:59 2021
  3. Model author: Joeri Exelmans
  4. Model name: client
  5. Model description:
  6. Example of a browser-based WebSocket client with heartbeats
  7. */
  8. // package client
  9. let client = {};
  10. (function() {
  11. let Main = function(controller, uiState, myId, getMyName) {
  12. RuntimeClassBase.call(this, controller);
  13. this.inports["ack"] = controller.addInputPort("ack", this);
  14. this.inports["socket"] = controller.addInputPort("socket", this);
  15. this.semantics.bigStepMaximality = StatechartSemantics.TakeMany;
  16. this.semantics.internalEventLifeline = StatechartSemantics.NextComboStep;
  17. this.semantics.inputEventLifeline = StatechartSemantics.FirstComboStep;
  18. this.semantics.priority = StatechartSemantics.SourceParent;
  19. this.semantics.concurrency = StatechartSemantics.Single;
  20. // build Statechart structure
  21. this.buildStatechartStructure();
  22. // call user defined constructor
  23. Main.prototype.userDefinedConstructor.call(this, uiState, myId, getMyName);
  24. };
  25. Main.prototype = new Object();
  26. (function() {
  27. var proto = new RuntimeClassBase();
  28. for (let prop in proto) {
  29. Main.prototype[prop] = proto[prop];
  30. }
  31. })();
  32. Main.prototype.userDefinedConstructor = function(uiState, myId, getMyName) {
  33. this.uiState = uiState;
  34. this.myId = myId;
  35. this.getMyName = getMyName;
  36. this.connected = false;
  37. };
  38. Main.prototype.userDefinedDestructor = function() {
  39. };
  40. // builds Statechart structure
  41. Main.prototype.buildStatechartStructure = function() {
  42. // state <root>
  43. this.states[""] = new State(0, "", this);
  44. // state /p
  45. this.states["/p"] = new ParallelState(1, "/p", this);
  46. // state /p/response_handler
  47. this.states["/p/response_handler"] = new State(2, "/p/response_handler", this);
  48. this.states["/p/response_handler"].setEnter(this.PResponseHandlerEnter);
  49. // state /p/response_handler/default
  50. this.states["/p/response_handler/default"] = new State(3, "/p/response_handler/default", this);
  51. // state /p/mode
  52. this.states["/p/mode"] = new State(4, "/p/mode", this);
  53. // state /p/mode/uninitialized
  54. this.states["/p/mode/uninitialized"] = new State(5, "/p/mode/uninitialized", this);
  55. // state /p/mode/async_disconnected
  56. this.states["/p/mode/async_disconnected"] = new State(6, "/p/mode/async_disconnected", this);
  57. this.states["/p/mode/async_disconnected"].setEnter(this.PModeAsyncDisconnectedEnter);
  58. // state /p/mode/async_connected
  59. this.states["/p/mode/async_connected"] = new State(7, "/p/mode/async_connected", this);
  60. this.states["/p/mode/async_connected"].setEnter(this.PModeAsyncConnectedEnter);
  61. // state /p/mode/can_leave
  62. this.states["/p/mode/can_leave"] = new State(8, "/p/mode/can_leave", this);
  63. this.states["/p/mode/can_leave"].setExit(this.PModeCanLeaveExit);
  64. // state /p/mode/can_leave/waiting_for_new_share_ack
  65. this.states["/p/mode/can_leave/waiting_for_new_share_ack"] = new State(9, "/p/mode/can_leave/waiting_for_new_share_ack", this);
  66. this.states["/p/mode/can_leave/waiting_for_new_share_ack"].setEnter(this.PModeCanLeaveWaitingForNewShareAckEnter);
  67. this.states["/p/mode/can_leave/waiting_for_new_share_ack"].setExit(this.PModeCanLeaveWaitingForNewShareAckExit);
  68. // state /p/mode/can_leave/reshare_when_online
  69. this.states["/p/mode/can_leave/reshare_when_online"] = new State(10, "/p/mode/can_leave/reshare_when_online", this);
  70. this.states["/p/mode/can_leave/reshare_when_online"].setEnter(this.PModeCanLeaveReshareWhenOnlineEnter);
  71. // state /p/mode/can_leave/session_set
  72. this.states["/p/mode/can_leave/session_set"] = new State(11, "/p/mode/can_leave/session_set", this);
  73. this.states["/p/mode/can_leave/session_set"].setEnter(this.PModeCanLeaveSessionSetEnter);
  74. this.states["/p/mode/can_leave/session_set"].setExit(this.PModeCanLeaveSessionSetExit);
  75. // state /p/mode/can_leave/session_set/waiting_for_join_ack
  76. this.states["/p/mode/can_leave/session_set/waiting_for_join_ack"] = new State(12, "/p/mode/can_leave/session_set/waiting_for_join_ack", this);
  77. this.states["/p/mode/can_leave/session_set/waiting_for_join_ack"].setEnter(this.PModeCanLeaveSessionSetWaitingForJoinAckEnter);
  78. this.states["/p/mode/can_leave/session_set/waiting_for_join_ack"].setExit(this.PModeCanLeaveSessionSetWaitingForJoinAckExit);
  79. // state /p/mode/can_leave/session_set/joined
  80. this.states["/p/mode/can_leave/session_set/joined"] = new ParallelState(13, "/p/mode/can_leave/session_set/joined", this);
  81. // state /p/mode/can_leave/session_set/joined/region_sendreceive
  82. this.states["/p/mode/can_leave/session_set/joined/region_sendreceive"] = new State(14, "/p/mode/can_leave/session_set/joined/region_sendreceive", this);
  83. // state /p/mode/can_leave/session_set/joined/region_sendreceive/default
  84. this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"] = new State(15, "/p/mode/can_leave/session_set/joined/region_sendreceive/default", this);
  85. this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"].setEnter(this.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefaultEnter);
  86. // state /p/mode/can_leave/session_set/joined/region_cursor
  87. this.states["/p/mode/can_leave/session_set/joined/region_cursor"] = new State(16, "/p/mode/can_leave/session_set/joined/region_cursor", this);
  88. // state /p/mode/can_leave/session_set/joined/region_cursor/nodelay
  89. this.states["/p/mode/can_leave/session_set/joined/region_cursor/nodelay"] = new State(17, "/p/mode/can_leave/session_set/joined/region_cursor/nodelay", this);
  90. // state /p/mode/can_leave/session_set/joined/region_cursor/delay
  91. this.states["/p/mode/can_leave/session_set/joined/region_cursor/delay"] = new State(18, "/p/mode/can_leave/session_set/joined/region_cursor/delay", this);
  92. this.states["/p/mode/can_leave/session_set/joined/region_cursor/delay"].setEnter(this.PModeCanLeaveSessionSetJoinedRegionCursorDelayEnter);
  93. this.states["/p/mode/can_leave/session_set/joined/region_cursor/delay"].setExit(this.PModeCanLeaveSessionSetJoinedRegionCursorDelayExit);
  94. // state /p/mode/can_leave/session_set/joined/region_cursor/delay/inner
  95. this.states["/p/mode/can_leave/session_set/joined/region_cursor/delay/inner"] = new State(19, "/p/mode/can_leave/session_set/joined/region_cursor/delay/inner", this);
  96. // state /p/mode/can_leave/session_set/rejoin_when_online
  97. this.states["/p/mode/can_leave/session_set/rejoin_when_online"] = new State(20, "/p/mode/can_leave/session_set/rejoin_when_online", this);
  98. this.states["/p/mode/can_leave/session_set/rejoin_when_online"].setEnter(this.PModeCanLeaveSessionSetRejoinWhenOnlineEnter);
  99. // state /p/socket_region
  100. this.states["/p/socket_region"] = new State(21, "/p/socket_region", this);
  101. // state /p/socket_region/disconnected
  102. this.states["/p/socket_region/disconnected"] = new State(22, "/p/socket_region/disconnected", this);
  103. // state /p/socket_region/connecting_or_connected
  104. this.states["/p/socket_region/connecting_or_connected"] = new State(23, "/p/socket_region/connecting_or_connected", this);
  105. // state /p/socket_region/connecting_or_connected/connecting
  106. this.states["/p/socket_region/connecting_or_connected/connecting"] = new State(24, "/p/socket_region/connecting_or_connected/connecting", this);
  107. this.states["/p/socket_region/connecting_or_connected/connecting"].setEnter(this.PSocketRegionConnectingOrConnectedConnectingEnter);
  108. // state /p/socket_region/connecting_or_connected/connected
  109. this.states["/p/socket_region/connecting_or_connected/connected"] = new ParallelState(25, "/p/socket_region/connecting_or_connected/connected", this);
  110. this.states["/p/socket_region/connecting_or_connected/connected"].setEnter(this.PSocketRegionConnectingOrConnectedConnectedEnter);
  111. this.states["/p/socket_region/connecting_or_connected/connected"].setExit(this.PSocketRegionConnectingOrConnectedConnectedExit);
  112. // state /p/socket_region/connecting_or_connected/connected/send_receive_region
  113. this.states["/p/socket_region/connecting_or_connected/connected/send_receive_region"] = new State(26, "/p/socket_region/connecting_or_connected/connected/send_receive_region", this);
  114. // state /p/socket_region/connecting_or_connected/connected/send_receive_region/ready
  115. this.states["/p/socket_region/connecting_or_connected/connected/send_receive_region/ready"] = new State(27, "/p/socket_region/connecting_or_connected/connected/send_receive_region/ready", this);
  116. // state /p/socket_region/connecting_or_connected/connected/connection_monitor_region
  117. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region"] = new State(28, "/p/socket_region/connecting_or_connected/connected/connection_monitor_region", this);
  118. // state /p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good
  119. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good"] = new ParallelState(29, "/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good", this);
  120. // state /p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings
  121. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings"] = new State(30, "/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings", this);
  122. // state /p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings/waiting
  123. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings/waiting"] = new State(31, "/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings/waiting", this);
  124. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings/waiting"].setEnter(this.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodSendPingsWaitingEnter);
  125. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings/waiting"].setExit(this.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodSendPingsWaitingExit);
  126. // state /p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs
  127. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs"] = new State(32, "/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs", this);
  128. // state /p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs/waiting
  129. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs/waiting"] = new State(33, "/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs/waiting", this);
  130. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs/waiting"].setEnter(this.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodReceivePongsWaitingEnter);
  131. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs/waiting"].setExit(this.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodReceivePongsWaitingExit);
  132. // state /p/socket_region/connecting_or_connected/connected/connection_monitor_region/timeout
  133. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/timeout"] = new State(34, "/p/socket_region/connecting_or_connected/connected/connection_monitor_region/timeout", this);
  134. // state /p/socket_region/connecting_or_connected/wait_reconnect
  135. this.states["/p/socket_region/connecting_or_connected/wait_reconnect"] = new State(35, "/p/socket_region/connecting_or_connected/wait_reconnect", this);
  136. this.states["/p/socket_region/connecting_or_connected/wait_reconnect"].setEnter(this.PSocketRegionConnectingOrConnectedWaitReconnectEnter);
  137. this.states["/p/socket_region/connecting_or_connected/wait_reconnect"].setExit(this.PSocketRegionConnectingOrConnectedWaitReconnectExit);
  138. // add children
  139. this.states[""].addChild(this.states["/p"]);
  140. this.states["/p"].addChild(this.states["/p/response_handler"]);
  141. this.states["/p"].addChild(this.states["/p/mode"]);
  142. this.states["/p"].addChild(this.states["/p/socket_region"]);
  143. this.states["/p/response_handler"].addChild(this.states["/p/response_handler/default"]);
  144. this.states["/p/mode"].addChild(this.states["/p/mode/uninitialized"]);
  145. this.states["/p/mode"].addChild(this.states["/p/mode/async_disconnected"]);
  146. this.states["/p/mode"].addChild(this.states["/p/mode/async_connected"]);
  147. this.states["/p/mode"].addChild(this.states["/p/mode/can_leave"]);
  148. this.states["/p/mode/can_leave"].addChild(this.states["/p/mode/can_leave/waiting_for_new_share_ack"]);
  149. this.states["/p/mode/can_leave"].addChild(this.states["/p/mode/can_leave/reshare_when_online"]);
  150. this.states["/p/mode/can_leave"].addChild(this.states["/p/mode/can_leave/session_set"]);
  151. this.states["/p/mode/can_leave/session_set"].addChild(this.states["/p/mode/can_leave/session_set/waiting_for_join_ack"]);
  152. this.states["/p/mode/can_leave/session_set"].addChild(this.states["/p/mode/can_leave/session_set/joined"]);
  153. this.states["/p/mode/can_leave/session_set"].addChild(this.states["/p/mode/can_leave/session_set/rejoin_when_online"]);
  154. this.states["/p/mode/can_leave/session_set/joined"].addChild(this.states["/p/mode/can_leave/session_set/joined/region_sendreceive"]);
  155. this.states["/p/mode/can_leave/session_set/joined"].addChild(this.states["/p/mode/can_leave/session_set/joined/region_cursor"]);
  156. this.states["/p/mode/can_leave/session_set/joined/region_sendreceive"].addChild(this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"]);
  157. this.states["/p/mode/can_leave/session_set/joined/region_cursor"].addChild(this.states["/p/mode/can_leave/session_set/joined/region_cursor/nodelay"]);
  158. this.states["/p/mode/can_leave/session_set/joined/region_cursor"].addChild(this.states["/p/mode/can_leave/session_set/joined/region_cursor/delay"]);
  159. this.states["/p/mode/can_leave/session_set/joined/region_cursor/delay"].addChild(this.states["/p/mode/can_leave/session_set/joined/region_cursor/delay/inner"]);
  160. this.states["/p/socket_region"].addChild(this.states["/p/socket_region/disconnected"]);
  161. this.states["/p/socket_region"].addChild(this.states["/p/socket_region/connecting_or_connected"]);
  162. this.states["/p/socket_region/connecting_or_connected"].addChild(this.states["/p/socket_region/connecting_or_connected/connecting"]);
  163. this.states["/p/socket_region/connecting_or_connected"].addChild(this.states["/p/socket_region/connecting_or_connected/connected"]);
  164. this.states["/p/socket_region/connecting_or_connected"].addChild(this.states["/p/socket_region/connecting_or_connected/wait_reconnect"]);
  165. this.states["/p/socket_region/connecting_or_connected/connected"].addChild(this.states["/p/socket_region/connecting_or_connected/connected/send_receive_region"]);
  166. this.states["/p/socket_region/connecting_or_connected/connected"].addChild(this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region"]);
  167. this.states["/p/socket_region/connecting_or_connected/connected/send_receive_region"].addChild(this.states["/p/socket_region/connecting_or_connected/connected/send_receive_region/ready"]);
  168. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region"].addChild(this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good"]);
  169. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region"].addChild(this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/timeout"]);
  170. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good"].addChild(this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings"]);
  171. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good"].addChild(this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs"]);
  172. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings"].addChild(this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings/waiting"]);
  173. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs"].addChild(this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs/waiting"]);
  174. this.states[""].fixTree();
  175. this.states[""].defaultState = this.states["/p"];
  176. this.states["/p/response_handler"].defaultState = this.states["/p/response_handler/default"];
  177. this.states["/p/mode"].defaultState = this.states["/p/mode/uninitialized"];
  178. this.states["/p/mode/can_leave"].defaultState = this.states["/p/mode/can_leave/session_set"];
  179. this.states["/p/mode/can_leave/session_set"].defaultState = this.states["/p/mode/can_leave/session_set/waiting_for_join_ack"];
  180. this.states["/p/mode/can_leave/session_set/joined/region_sendreceive"].defaultState = this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"];
  181. this.states["/p/mode/can_leave/session_set/joined/region_cursor"].defaultState = this.states["/p/mode/can_leave/session_set/joined/region_cursor/nodelay"];
  182. this.states["/p/mode/can_leave/session_set/joined/region_cursor/delay"].defaultState = this.states["/p/mode/can_leave/session_set/joined/region_cursor/delay/inner"];
  183. this.states["/p/socket_region"].defaultState = this.states["/p/socket_region/disconnected"];
  184. this.states["/p/socket_region/connecting_or_connected"].defaultState = this.states["/p/socket_region/connecting_or_connected/connecting"];
  185. this.states["/p/socket_region/connecting_or_connected/connected/send_receive_region"].defaultState = this.states["/p/socket_region/connecting_or_connected/connected/send_receive_region/ready"];
  186. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region"].defaultState = this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good"];
  187. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings"].defaultState = this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings/waiting"];
  188. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs"].defaultState = this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs/waiting"];
  189. // transition /p/response_handler/default
  190. var PResponseHandlerDefault_0 = new Transition(this, this.states["/p/response_handler/default"], [this.states["/p/response_handler/default"]]);
  191. PResponseHandlerDefault_0.setAction(this.PResponseHandlerDefault_0Exec);
  192. PResponseHandlerDefault_0.setTrigger(new Event("received", null));
  193. this.states["/p/response_handler/default"].addTransition(PResponseHandlerDefault_0);
  194. var PResponseHandlerDefault_1 = new Transition(this, this.states["/p/response_handler/default"], [this.states["/p/response_handler/default"]]);
  195. PResponseHandlerDefault_1.setAction(this.PResponseHandlerDefault_1Exec);
  196. PResponseHandlerDefault_1.setTrigger(new Event("disconnected", null));
  197. this.states["/p/response_handler/default"].addTransition(PResponseHandlerDefault_1);
  198. // transition /p/mode/uninitialized
  199. var PModeUninitialized_0 = new Transition(this, this.states["/p/mode/uninitialized"], [this.states["/p/mode/async_disconnected"]]);
  200. PModeUninitialized_0.setTrigger(new Event("init_offline", this.getInPortName("in")));
  201. this.states["/p/mode/uninitialized"].addTransition(PModeUninitialized_0);
  202. var PModeUninitialized_1 = new Transition(this, this.states["/p/mode/uninitialized"], [this.states["/p/mode/can_leave/session_set/rejoin_when_online"]]);
  203. PModeUninitialized_1.setAction(this.PModeUninitialized_1Exec);
  204. PModeUninitialized_1.setTrigger(new Event("init_join", this.getInPortName("in")));
  205. this.states["/p/mode/uninitialized"].addTransition(PModeUninitialized_1);
  206. // transition /p/mode/async_disconnected
  207. var PModeAsyncDisconnected_0 = new Transition(this, this.states["/p/mode/async_disconnected"], [this.states["/p/mode/async_connected"]]);
  208. PModeAsyncDisconnected_0.setTrigger(new Event("connected", null));
  209. this.states["/p/mode/async_disconnected"].addTransition(PModeAsyncDisconnected_0);
  210. // transition /p/mode/async_connected
  211. var PModeAsyncConnected_0 = new Transition(this, this.states["/p/mode/async_connected"], [this.states["/p/mode/async_disconnected"]]);
  212. PModeAsyncConnected_0.setTrigger(new Event("disconnected", null));
  213. this.states["/p/mode/async_connected"].addTransition(PModeAsyncConnected_0);
  214. var PModeAsyncConnected_1 = new Transition(this, this.states["/p/mode/async_connected"], [this.states["/p/mode/can_leave/session_set/waiting_for_join_ack"]]);
  215. PModeAsyncConnected_1.setAction(this.PModeAsyncConnected_1Exec);
  216. PModeAsyncConnected_1.setTrigger(new Event("join", this.getInPortName("in")));
  217. this.states["/p/mode/async_connected"].addTransition(PModeAsyncConnected_1);
  218. var PModeAsyncConnected_2 = new Transition(this, this.states["/p/mode/async_connected"], [this.states["/p/mode/can_leave/waiting_for_new_share_ack"]]);
  219. PModeAsyncConnected_2.setAction(this.PModeAsyncConnected_2Exec);
  220. PModeAsyncConnected_2.setTrigger(new Event("new_share", this.getInPortName("in")));
  221. this.states["/p/mode/async_connected"].addTransition(PModeAsyncConnected_2);
  222. // transition /p/mode/can_leave/waiting_for_new_share_ack
  223. var PModeCanLeaveWaitingForNewShareAck_0 = new Transition(this, this.states["/p/mode/can_leave/waiting_for_new_share_ack"], [this.states["/p/mode/can_leave/reshare_when_online"]]);
  224. PModeCanLeaveWaitingForNewShareAck_0.setTrigger(new Event("disconnected", null));
  225. this.states["/p/mode/can_leave/waiting_for_new_share_ack"].addTransition(PModeCanLeaveWaitingForNewShareAck_0);
  226. var PModeCanLeaveWaitingForNewShareAck_1 = new Transition(this, this.states["/p/mode/can_leave/waiting_for_new_share_ack"], [this.states["/p/mode/can_leave/session_set/joined"]]);
  227. PModeCanLeaveWaitingForNewShareAck_1.setAction(this.PModeCanLeaveWaitingForNewShareAck_1Exec);
  228. PModeCanLeaveWaitingForNewShareAck_1.setTrigger(new Event("ack_new_share", this.getInPortName("ack")));
  229. this.states["/p/mode/can_leave/waiting_for_new_share_ack"].addTransition(PModeCanLeaveWaitingForNewShareAck_1);
  230. // transition /p/mode/can_leave/reshare_when_online
  231. var PModeCanLeaveReshareWhenOnline_0 = new Transition(this, this.states["/p/mode/can_leave/reshare_when_online"], [this.states["/p/mode/can_leave/waiting_for_new_share_ack"]]);
  232. PModeCanLeaveReshareWhenOnline_0.setTrigger(new Event("connected", null));
  233. this.states["/p/mode/can_leave/reshare_when_online"].addTransition(PModeCanLeaveReshareWhenOnline_0);
  234. // transition /p/mode/can_leave/session_set/waiting_for_join_ack
  235. var PModeCanLeaveSessionSetWaitingForJoinAck_0 = new Transition(this, this.states["/p/mode/can_leave/session_set/waiting_for_join_ack"], [this.states["/p/mode/can_leave/session_set/joined"]]);
  236. PModeCanLeaveSessionSetWaitingForJoinAck_0.setAction(this.PModeCanLeaveSessionSetWaitingForJoinAck_0Exec);
  237. PModeCanLeaveSessionSetWaitingForJoinAck_0.setTrigger(new Event("ack_join", this.getInPortName("ack")));
  238. this.states["/p/mode/can_leave/session_set/waiting_for_join_ack"].addTransition(PModeCanLeaveSessionSetWaitingForJoinAck_0);
  239. var PModeCanLeaveSessionSetWaitingForJoinAck_1 = new Transition(this, this.states["/p/mode/can_leave/session_set/waiting_for_join_ack"], [this.states["/p/mode/can_leave/session_set/rejoin_when_online"]]);
  240. PModeCanLeaveSessionSetWaitingForJoinAck_1.setTrigger(new Event("disconnected", null));
  241. this.states["/p/mode/can_leave/session_set/waiting_for_join_ack"].addTransition(PModeCanLeaveSessionSetWaitingForJoinAck_1);
  242. // transition /p/mode/can_leave/session_set/joined/region_sendreceive/default
  243. var PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_0 = new Transition(this, this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"], [this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"]]);
  244. PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_0.setAction(this.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_0Exec);
  245. PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_0.setTrigger(new Event("received", null));
  246. PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_0.setGuard(this.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_0Guard);
  247. this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"].addTransition(PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_0);
  248. var PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_1 = new Transition(this, this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"], [this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"]]);
  249. PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_1.setAction(this.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_1Exec);
  250. PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_1.setTrigger(new Event("new_edit", this.getInPortName("in")));
  251. this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"].addTransition(PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_1);
  252. var PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_2 = new Transition(this, this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"], [this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"]]);
  253. PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_2.setAction(this.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_2Exec);
  254. PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_2.setTrigger(new Event("request_lock", this.getInPortName("in")));
  255. this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"].addTransition(PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_2);
  256. var PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_3 = new Transition(this, this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"], [this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"]]);
  257. PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_3.setAction(this.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_3Exec);
  258. PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_3.setTrigger(new Event("release_lock", this.getInPortName("in")));
  259. this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"].addTransition(PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_3);
  260. var PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_4 = new Transition(this, this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"], [this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"]]);
  261. PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_4.setAction(this.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_4Exec);
  262. PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_4.setTrigger(new Event("received", null));
  263. PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_4.setGuard(this.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_4Guard);
  264. this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"].addTransition(PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_4);
  265. var PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_5 = new Transition(this, this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"], [this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"]]);
  266. PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_5.setAction(this.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_5Exec);
  267. PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_5.setTrigger(new Event("broadcast_selection", null));
  268. this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"].addTransition(PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_5);
  269. // transition /p/mode/can_leave/session_set/joined/region_cursor/nodelay
  270. var PModeCanLeaveSessionSetJoinedRegionCursorNodelay_0 = new Transition(this, this.states["/p/mode/can_leave/session_set/joined/region_cursor/nodelay"], [this.states["/p/mode/can_leave/session_set/joined/region_cursor/delay"]]);
  271. PModeCanLeaveSessionSetJoinedRegionCursorNodelay_0.setAction(this.PModeCanLeaveSessionSetJoinedRegionCursorNodelay_0Exec);
  272. PModeCanLeaveSessionSetJoinedRegionCursorNodelay_0.setTrigger(new Event("broadcast_cursor", this.getInPortName("in")));
  273. this.states["/p/mode/can_leave/session_set/joined/region_cursor/nodelay"].addTransition(PModeCanLeaveSessionSetJoinedRegionCursorNodelay_0);
  274. // transition /p/mode/can_leave/session_set/joined/region_cursor/delay/inner
  275. var PModeCanLeaveSessionSetJoinedRegionCursorDelayInner_0 = new Transition(this, this.states["/p/mode/can_leave/session_set/joined/region_cursor/delay/inner"], [this.states["/p/mode/can_leave/session_set/joined/region_cursor/delay/inner"]]);
  276. PModeCanLeaveSessionSetJoinedRegionCursorDelayInner_0.setAction(this.PModeCanLeaveSessionSetJoinedRegionCursorDelayInner_0Exec);
  277. PModeCanLeaveSessionSetJoinedRegionCursorDelayInner_0.setTrigger(new Event("broadcast_cursor", this.getInPortName("in")));
  278. this.states["/p/mode/can_leave/session_set/joined/region_cursor/delay/inner"].addTransition(PModeCanLeaveSessionSetJoinedRegionCursorDelayInner_0);
  279. // transition /p/mode/can_leave/session_set/rejoin_when_online
  280. var PModeCanLeaveSessionSetRejoinWhenOnline_0 = new Transition(this, this.states["/p/mode/can_leave/session_set/rejoin_when_online"], [this.states["/p/mode/can_leave/session_set/waiting_for_join_ack"]]);
  281. PModeCanLeaveSessionSetRejoinWhenOnline_0.setTrigger(new Event("connected", null));
  282. this.states["/p/mode/can_leave/session_set/rejoin_when_online"].addTransition(PModeCanLeaveSessionSetRejoinWhenOnline_0);
  283. // transition /p/socket_region/disconnected
  284. var PSocketRegionDisconnected_0 = new Transition(this, this.states["/p/socket_region/disconnected"], [this.states["/p/socket_region/connecting_or_connected"]]);
  285. PSocketRegionDisconnected_0.setAction(this.PSocketRegionDisconnected_0Exec);
  286. PSocketRegionDisconnected_0.setTrigger(new Event("connect", this.getInPortName("in")));
  287. this.states["/p/socket_region/disconnected"].addTransition(PSocketRegionDisconnected_0);
  288. // transition /p/socket_region/connecting_or_connected/connecting
  289. var PSocketRegionConnectingOrConnectedConnecting_0 = new Transition(this, this.states["/p/socket_region/connecting_or_connected/connecting"], [this.states["/p/socket_region/connecting_or_connected/connected"]]);
  290. PSocketRegionConnectingOrConnectedConnecting_0.setTrigger(new Event("open", this.getInPortName("socket")));
  291. this.states["/p/socket_region/connecting_or_connected/connecting"].addTransition(PSocketRegionConnectingOrConnectedConnecting_0);
  292. var PSocketRegionConnectingOrConnectedConnecting_1 = new Transition(this, this.states["/p/socket_region/connecting_or_connected/connecting"], [this.states["/p/socket_region/connecting_or_connected/wait_reconnect"]]);
  293. PSocketRegionConnectingOrConnectedConnecting_1.setAction(this.PSocketRegionConnectingOrConnectedConnecting_1Exec);
  294. PSocketRegionConnectingOrConnectedConnecting_1.setTrigger(new Event("error", this.getInPortName("socket")));
  295. this.states["/p/socket_region/connecting_or_connected/connecting"].addTransition(PSocketRegionConnectingOrConnectedConnecting_1);
  296. // transition /p/socket_region/connecting_or_connected/connected/send_receive_region/ready
  297. var PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_0 = new Transition(this, this.states["/p/socket_region/connecting_or_connected/connected/send_receive_region/ready"], [this.states["/p/socket_region/connecting_or_connected/connected/send_receive_region/ready"]]);
  298. PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_0.setAction(this.PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_0Exec);
  299. PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_0.setTrigger(new Event("send", null));
  300. this.states["/p/socket_region/connecting_or_connected/connected/send_receive_region/ready"].addTransition(PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_0);
  301. var PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_1 = new Transition(this, this.states["/p/socket_region/connecting_or_connected/connected/send_receive_region/ready"], [this.states["/p/socket_region/connecting_or_connected/connected/send_receive_region/ready"]]);
  302. PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_1.setAction(this.PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_1Exec);
  303. PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_1.setTrigger(new Event("message", this.getInPortName("socket")));
  304. PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_1.setGuard(this.PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_1Guard);
  305. this.states["/p/socket_region/connecting_or_connected/connected/send_receive_region/ready"].addTransition(PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_1);
  306. // transition /p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings/waiting
  307. var PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodSendPingsWaiting_0 = new Transition(this, this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings/waiting"], [this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings/waiting"]]);
  308. PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodSendPingsWaiting_0.setTrigger(new Event("send", this.getInPortName("in")));
  309. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings/waiting"].addTransition(PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodSendPingsWaiting_0);
  310. var PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodSendPingsWaiting_1 = new Transition(this, this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings/waiting"], [this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings/waiting"]]);
  311. PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodSendPingsWaiting_1.setAction(this.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodSendPingsWaiting_1Exec);
  312. PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodSendPingsWaiting_1.setTrigger(new Event("event1After"));
  313. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings/waiting"].addTransition(PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodSendPingsWaiting_1);
  314. // transition /p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs/waiting
  315. var PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodReceivePongsWaiting_0 = new Transition(this, this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs/waiting"], [this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs/waiting"]]);
  316. PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodReceivePongsWaiting_0.setTrigger(new Event("message", this.getInPortName("socket")));
  317. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs/waiting"].addTransition(PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodReceivePongsWaiting_0);
  318. var PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodReceivePongsWaiting_1 = new Transition(this, this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs/waiting"], [this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs/waiting"]]);
  319. PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodReceivePongsWaiting_1.setAction(this.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodReceivePongsWaiting_1Exec);
  320. PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodReceivePongsWaiting_1.setTrigger(new Event("event2After"));
  321. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs/waiting"].addTransition(PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodReceivePongsWaiting_1);
  322. // transition /p/socket_region/connecting_or_connected/connected/connection_monitor_region/timeout
  323. var PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionTimeout_0 = new Transition(this, this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/timeout"], [this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good"]]);
  324. PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionTimeout_0.setAction(this.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionTimeout_0Exec);
  325. PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionTimeout_0.setTrigger(new Event("message", this.getInPortName("socket")));
  326. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/timeout"].addTransition(PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionTimeout_0);
  327. // transition /p/socket_region/connecting_or_connected/wait_reconnect
  328. var PSocketRegionConnectingOrConnectedWaitReconnect_0 = new Transition(this, this.states["/p/socket_region/connecting_or_connected/wait_reconnect"], [this.states["/p/socket_region/connecting_or_connected/connecting"]]);
  329. PSocketRegionConnectingOrConnectedWaitReconnect_0.setTrigger(new Event("event3After"));
  330. this.states["/p/socket_region/connecting_or_connected/wait_reconnect"].addTransition(PSocketRegionConnectingOrConnectedWaitReconnect_0);
  331. // transition /p/mode/can_leave
  332. var PModeCanLeave_0 = new Transition(this, this.states["/p/mode/can_leave"], [this.states["/p/mode/async_connected"]]);
  333. PModeCanLeave_0.setTrigger(new Event("leave", this.getInPortName("in")));
  334. PModeCanLeave_0.setGuard(this.PModeCanLeave_0Guard);
  335. this.states["/p/mode/can_leave"].addTransition(PModeCanLeave_0);
  336. var PModeCanLeave_1 = new Transition(this, this.states["/p/mode/can_leave"], [this.states["/p/mode/async_disconnected"]]);
  337. PModeCanLeave_1.setTrigger(new Event("leave", this.getInPortName("in")));
  338. PModeCanLeave_1.setGuard(this.PModeCanLeave_1Guard);
  339. this.states["/p/mode/can_leave"].addTransition(PModeCanLeave_1);
  340. // transition /p/mode/can_leave/session_set/joined
  341. var PModeCanLeaveSessionSetJoined_0 = new Transition(this, this.states["/p/mode/can_leave/session_set/joined"], [this.states["/p/mode/can_leave/session_set/rejoin_when_online"]]);
  342. PModeCanLeaveSessionSetJoined_0.setTrigger(new Event("disconnected", null));
  343. this.states["/p/mode/can_leave/session_set/joined"].addTransition(PModeCanLeaveSessionSetJoined_0);
  344. // transition /p/mode/can_leave/session_set/joined/region_cursor/delay
  345. var PModeCanLeaveSessionSetJoinedRegionCursorDelay_0 = new Transition(this, this.states["/p/mode/can_leave/session_set/joined/region_cursor/delay"], [this.states["/p/mode/can_leave/session_set/joined/region_cursor/nodelay"]]);
  346. PModeCanLeaveSessionSetJoinedRegionCursorDelay_0.setAction(this.PModeCanLeaveSessionSetJoinedRegionCursorDelay_0Exec);
  347. PModeCanLeaveSessionSetJoinedRegionCursorDelay_0.setTrigger(new Event("event0After"));
  348. this.states["/p/mode/can_leave/session_set/joined/region_cursor/delay"].addTransition(PModeCanLeaveSessionSetJoinedRegionCursorDelay_0);
  349. // transition /p/socket_region/connecting_or_connected
  350. var PSocketRegionConnectingOrConnected_0 = new Transition(this, this.states["/p/socket_region/connecting_or_connected"], [this.states["/p/socket_region/disconnected"]]);
  351. PSocketRegionConnectingOrConnected_0.setAction(this.PSocketRegionConnectingOrConnected_0Exec);
  352. PSocketRegionConnectingOrConnected_0.setTrigger(new Event("disconnect", this.getInPortName("in")));
  353. this.states["/p/socket_region/connecting_or_connected"].addTransition(PSocketRegionConnectingOrConnected_0);
  354. // transition /p/socket_region/connecting_or_connected/connected
  355. var PSocketRegionConnectingOrConnectedConnected_0 = new Transition(this, this.states["/p/socket_region/connecting_or_connected/connected"], [this.states["/p/socket_region/connecting_or_connected/wait_reconnect"]]);
  356. PSocketRegionConnectingOrConnectedConnected_0.setTrigger(new Event("close", this.getInPortName("socket")));
  357. this.states["/p/socket_region/connecting_or_connected/connected"].addTransition(PSocketRegionConnectingOrConnectedConnected_0);
  358. // transition /p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good
  359. var PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGood_0 = new Transition(this, this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good"], [this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/timeout"]]);
  360. PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGood_0.setAction(this.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGood_0Exec);
  361. PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGood_0.setTrigger(new Event("timeout", null));
  362. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good"].addTransition(PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGood_0);
  363. };
  364. Main.prototype.PResponseHandlerEnter = function() {
  365. this.reqHandlers = new Map();
  366. this.reqCounter = 0;
  367. this.sendReq = (obj, handler) => {
  368. const reqId = this.reqCounter++;
  369. const req = {
  370. reqId,
  371. ...obj,
  372. };
  373. if (handler !== undefined) {
  374. this.reqHandlers.set(reqId, handler);
  375. }
  376. console.log("Sending req", req);
  377. this.addEvent(new Event("send", null, [req]));
  378. // allow to cancel the request handler
  379. return () => {
  380. this.reqHandlers.delete(reqId);
  381. };
  382. }
  383. };
  384. Main.prototype.PModeCanLeaveExit = function() {
  385. this.sendReq({type:"leave"});
  386. };
  387. Main.prototype.PModeCanLeaveSessionSetEnter = function() {
  388. if (!this.sessionId) {
  389. throw new Error("DEBUG: no session id");
  390. }
  391. this.uiState.setSession(this.sessionId);
  392. };
  393. Main.prototype.PModeCanLeaveSessionSetExit = function() {
  394. this.uiState.unsetSession();
  395. };
  396. Main.prototype.PModeCanLeaveSessionSetJoinedRegionCursorDelayEnter = function() {
  397. this.cursorState = null;
  398. this.addTimer(0, 0.1);
  399. };
  400. Main.prototype.PModeCanLeaveSessionSetJoinedRegionCursorDelayExit = function() {
  401. this.removeTimer(0);
  402. };
  403. Main.prototype.PSocketRegionConnectingOrConnectedConnectedEnter = function() {
  404. this.raiseInternalEvent(new Event("connected", null, []));
  405. this.connected = true;
  406. };
  407. Main.prototype.PSocketRegionConnectingOrConnectedConnectedExit = function() {
  408. this.raiseInternalEvent(new Event("disconnected", null, []));
  409. this.connected = false;
  410. };
  411. Main.prototype.PModeAsyncDisconnectedEnter = function() {
  412. this.uiState.setOfflineDisconnected();
  413. };
  414. Main.prototype.PModeAsyncConnectedEnter = function() {
  415. this.uiState.setOfflineConnected();
  416. };
  417. Main.prototype.PModeCanLeaveWaitingForNewShareAckEnter = function() {
  418. this.uiState.setCreatingShare();
  419. this.deleteNewShareHandler = this.sendReq(
  420. {type: "new_share", ops: this.ops},
  421. res => {
  422. // called during transition (as action code), so no need to 'wake up' the controller like we do with 'addInput':
  423. this.addEvent(new Event("ack_new_share", "ack", [res.sessionId]));
  424. });
  425. };
  426. Main.prototype.PModeCanLeaveWaitingForNewShareAckExit = function() {
  427. this.deleteNewShareHandler();
  428. };
  429. Main.prototype.PModeCanLeaveReshareWhenOnlineEnter = function() {
  430. this.uiState.setReconnecting();
  431. };
  432. Main.prototype.PModeCanLeaveSessionSetWaitingForJoinAckEnter = function() {
  433. this.uiState.setJoining();
  434. this.deleteJoinHandler = this.sendReq(
  435. {type: "join", sessionId: this.sessionId},
  436. res => {
  437. // called during transition (as action code), so no need to 'wake up' the controller like we do with 'addInput':
  438. this.addEvent(new Event("ack_join", "ack", [res.ops]));
  439. });
  440. };
  441. Main.prototype.PModeCanLeaveSessionSetWaitingForJoinAckExit = function() {
  442. this.deleteJoinHandler();
  443. };
  444. Main.prototype.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefaultEnter = function() {
  445. this.uiState.setOnline();
  446. };
  447. Main.prototype.PModeCanLeaveSessionSetRejoinWhenOnlineEnter = function() {
  448. this.uiState.setReconnecting();
  449. };
  450. Main.prototype.PSocketRegionConnectingOrConnectedConnectingEnter = function() {
  451. console.log("connecting...");
  452. this.socket = new WebSocket(this.addr);
  453. // Translate socket events to statechart events:
  454. this.socket.onopen = event => {
  455. this.controller.addInput("open", this.inports["socket"], [], this.controller.wallclockToSimtime());
  456. };
  457. this.socket.onmessage = event => {
  458. let parsed;
  459. try {
  460. parsed = JSON.parse(event.data);
  461. } catch (e) {
  462. console.log("received unparsable message", e);
  463. return;
  464. }
  465. this.controller.addInput("message", this.inports["socket"], [parsed], this.controller.wallclockToSimtime());
  466. };
  467. this.socket.onerror = event => {
  468. // From what I see, this event only happens when the socket could not connect.
  469. // An 'error' happening after the connection is established, will be indicated by a close event.
  470. this.controller.addInput("error", this.inports["socket"], [], this.controller.wallclockToSimtime());
  471. };
  472. this.socket.onclose = event => {
  473. this.controller.addInput("close", this.inports["socket"], [], this.controller.wallclockToSimtime());
  474. };
  475. };
  476. Main.prototype.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodSendPingsWaitingEnter = function() {
  477. this.addTimer(1, 500);
  478. };
  479. Main.prototype.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodSendPingsWaitingExit = function() {
  480. this.removeTimer(1);
  481. };
  482. Main.prototype.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodReceivePongsWaitingEnter = function() {
  483. this.addTimer(2, 7000);
  484. };
  485. Main.prototype.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodReceivePongsWaitingExit = function() {
  486. this.removeTimer(2);
  487. };
  488. Main.prototype.PSocketRegionConnectingOrConnectedWaitReconnectEnter = function() {
  489. this.addTimer(3, 1);
  490. };
  491. Main.prototype.PSocketRegionConnectingOrConnectedWaitReconnectExit = function() {
  492. this.removeTimer(3);
  493. };
  494. Main.prototype.PModeCanLeave_0Guard = function(parameters) {
  495. return this.connected;
  496. };
  497. Main.prototype.PModeCanLeave_1Guard = function(parameters) {
  498. return !this.connected;
  499. };
  500. Main.prototype.PModeCanLeaveSessionSetJoinedRegionCursorDelay_0Exec = function(parameters) {
  501. if (this.cursorState !== null) {
  502. this.addEvent(new Event("send", null, [{
  503. type:"broadcast",
  504. msg: {
  505. type:"update_cursor",
  506. userId: this.myId,
  507. name: this.getMyName(),
  508. ...this.cursorState,
  509. },
  510. }]));
  511. }
  512. };
  513. Main.prototype.PSocketRegionConnectingOrConnected_0Exec = function(parameters) {
  514. this.socket.close();
  515. };
  516. Main.prototype.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGood_0Exec = function(parameters) {
  517. this.raiseInternalEvent(new Event("timeout", null, []));
  518. };
  519. Main.prototype.PResponseHandlerDefault_0Exec = function(parameters) {
  520. var parsed = parameters[0];
  521. if (parsed.type === 'ack' && parsed.reqId !== undefined) {
  522. const handler = this.reqHandlers.get(parsed.reqId);
  523. if (handler) {
  524. handler(parsed);
  525. }
  526. }
  527. };
  528. Main.prototype.PResponseHandlerDefault_1Exec = function(parameters) {
  529. // no way we will get a response for our pending requests
  530. this.reqHandlers.clear();
  531. this.reqCounter = 0;
  532. };
  533. Main.prototype.PModeUninitialized_1Exec = function(parameters) {
  534. var sessionId = parameters[0];
  535. this.sessionId = sessionId;
  536. };
  537. Main.prototype.PModeAsyncConnected_1Exec = function(parameters) {
  538. var sessionId = parameters[0];
  539. this.sessionId = sessionId;
  540. };
  541. Main.prototype.PModeAsyncConnected_2Exec = function(parameters) {
  542. var ops = parameters[0];
  543. // console.log("new share event, ops=", ops);
  544. this.ops = ops;
  545. };
  546. Main.prototype.PModeCanLeaveWaitingForNewShareAck_1Exec = function(parameters) {
  547. var sessionId = parameters[0];
  548. this.sessionId = sessionId;
  549. this.bigStep.outputEvent(new Event("ack_new_share", this.getOutPortName("out"), [sessionId]));
  550. };
  551. Main.prototype.PModeCanLeaveSessionSetWaitingForJoinAck_0Exec = function(parameters) {
  552. var ops = parameters[0];
  553. this.bigStep.outputEvent(new Event("ack_join", this.getOutPortName("out"), [ops]));
  554. };
  555. Main.prototype.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_0Exec = function(parameters) {
  556. var parsed = parameters[0];
  557. if (parsed.sessionId !== this.sessionId) {
  558. throw new Error("Unexpected: received edit for another session:" + parsed.sessionId);
  559. }
  560. this.bigStep.outputEvent(new Event("received_op", this.getOutPortName("out"), [parsed.op]));
  561. };
  562. Main.prototype.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_0Guard = function(parameters) {
  563. var parsed = parameters[0];
  564. return parsed.type === 'pub_edit';
  565. };
  566. Main.prototype.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_1Exec = function(parameters) {
  567. var serialized = parameters[0];
  568. this.sendReq(
  569. {type:"new_edit", sessionId: this.sessionId, op: serialized},
  570. res => {
  571. // this.unacknowledged.delete(serialized.id);
  572. });
  573. // this.unacknowledged.set(serialized.id, serialized);
  574. };
  575. Main.prototype.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_2Exec = function(parameters) {
  576. var cellIds = parameters[0];
  577. var acquiredCallback = parameters[1];
  578. var deniedCallback = parameters[2];
  579. this.sendReq(
  580. {type:"request_lock", sessionId: this.sessionId, cellIds},
  581. res => {
  582. if (res.success) {
  583. acquiredCallback();
  584. } else {
  585. deniedCallback();
  586. }
  587. });
  588. };
  589. Main.prototype.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_3Exec = function(parameters) {
  590. var cellIds = parameters[0];
  591. this.sendReq(
  592. {type:"release_lock", sessionId: this.sessionId, cellIds},
  593. res => {},
  594. );
  595. };
  596. Main.prototype.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_4Exec = function(parameters) {
  597. var parsed = parameters[0];
  598. this.bigStep.outputEvent(new Event("broadcast", this.getOutPortName("out"), [parsed.sessionId, parsed.msg]));
  599. };
  600. Main.prototype.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_4Guard = function(parameters) {
  601. var parsed = parameters[0];
  602. return parsed.type === 'broadcast';
  603. };
  604. Main.prototype.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_5Exec = function(parameters) {
  605. var selectedIds = parameters[0];
  606. if (this.cursorState !== null) {
  607. this.addEvent(new Event("send", null, [{
  608. type:"broadcast",
  609. msg: {
  610. type:"update_selection",
  611. userId: this.myId,
  612. selectedIds,
  613. ...this.cursorState,
  614. },
  615. }]));
  616. }
  617. };
  618. Main.prototype.PModeCanLeaveSessionSetJoinedRegionCursorNodelay_0Exec = function(parameters) {
  619. var x = parameters[0];
  620. var y = parameters[1];
  621. this.raiseInternalEvent(new Event("send", null, [{type:"broadcast", msg: {type:"update_cursor", name: this.getMyName(), x, y, userId: this.myId}}]));
  622. };
  623. Main.prototype.PModeCanLeaveSessionSetJoinedRegionCursorDelayInner_0Exec = function(parameters) {
  624. var x = parameters[0];
  625. var y = parameters[1];
  626. this.cursorState = {x,y};
  627. };
  628. Main.prototype.PSocketRegionDisconnected_0Exec = function(parameters) {
  629. var addr = parameters[0];
  630. console.log("received connect", addr)
  631. this.addr = addr;
  632. };
  633. Main.prototype.PSocketRegionConnectingOrConnectedConnecting_1Exec = function(parameters) {
  634. this.raiseInternalEvent(new Event("error", null, []));
  635. };
  636. Main.prototype.PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_0Exec = function(parameters) {
  637. var json = parameters[0];
  638. this.socket.send(JSON.stringify(json));
  639. };
  640. Main.prototype.PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_1Exec = function(parameters) {
  641. var parsed = parameters[0];
  642. this.raiseInternalEvent(new Event("received", null, [parsed]));
  643. };
  644. Main.prototype.PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_1Guard = function(parameters) {
  645. var parsed = parameters[0];
  646. return parsed.type !== 'pong';
  647. };
  648. Main.prototype.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodSendPingsWaiting_1Exec = function(parameters) {
  649. this.socket.send(JSON.stringify({type:"ping"}));
  650. };
  651. Main.prototype.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodReceivePongsWaiting_1Exec = function(parameters) {
  652. this.raiseInternalEvent(new Event("timeout", null, []));
  653. };
  654. Main.prototype.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionTimeout_0Exec = function(parameters) {
  655. this.raiseInternalEvent(new Event("timeout_recovered", null, []));
  656. };
  657. Main.prototype.initializeStatechart = function() {
  658. // enter default state
  659. this.defaultTargets = this.states["/p"].getEffectiveTargetStates();
  660. RuntimeClassBase.prototype.initializeStatechart.call(this);
  661. };
  662. // Add symbol 'Main' to package 'client'
  663. client.Main = Main;
  664. let ObjectManager = function(controller) {
  665. ObjectManagerBase.call(this, controller);
  666. };
  667. ObjectManager.prototype = new Object();
  668. (function() {
  669. var proto = new ObjectManagerBase();
  670. for (let prop in proto) {
  671. ObjectManager.prototype[prop] = proto[prop];
  672. }
  673. })();
  674. ObjectManager.prototype.instantiate = function(className, constructParams) {
  675. if (className === "Main") {
  676. var instance = new Main(this.controller, constructParams[0], constructParams[1], constructParams[2]);
  677. instance.associations = {};
  678. instance.associations["socket"] = new Association("Socket", 1, 1);
  679. } else {
  680. throw new Error("Cannot instantiate class " + className);
  681. }
  682. return instance;
  683. };
  684. // Add symbol 'ObjectManager' to package 'client'
  685. client.ObjectManager = ObjectManager;
  686. let Controller = function(uiState, myId, getMyName, eventLoopCallbacks, finishedCallback, behindScheduleCallback) {
  687. if (finishedCallback === undefined) finishedCallback = null;
  688. if (behindScheduleCallback === undefined) behindScheduleCallback = null;
  689. EventLoopControllerBase.call(this, new ObjectManager(this), eventLoopCallbacks, finishedCallback, behindScheduleCallback);
  690. this.addInputPort("in");
  691. this.addOutputPort("out");
  692. this.objectManager.createInstance("Main", [uiState, myId, getMyName]);
  693. };
  694. Controller.prototype = new Object();
  695. (function() {
  696. var proto = new EventLoopControllerBase();
  697. for (let prop in proto) {
  698. Controller.prototype[prop] = proto[prop];
  699. }
  700. })();
  701. // Add symbol 'Controller' to package 'client'
  702. client.Controller = Controller;
  703. })();