client.js 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801
  1. /*
  2. Date: Mon Sep 20 13:24:37 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) {
  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);
  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) {
  33. console.log("Main constructor");
  34. this.uiState = uiState;
  35. this.connected = false;
  36. };
  37. Main.prototype.userDefinedDestructor = function() {
  38. };
  39. // builds Statechart structure
  40. Main.prototype.buildStatechartStructure = function() {
  41. // state <root>
  42. this.states[""] = new State(0, "", this);
  43. // state /p
  44. this.states["/p"] = new ParallelState(1, "/p", this);
  45. // state /p/response_handler
  46. this.states["/p/response_handler"] = new State(2, "/p/response_handler", this);
  47. this.states["/p/response_handler"].setEnter(this.PResponseHandlerEnter);
  48. // state /p/response_handler/default
  49. this.states["/p/response_handler/default"] = new State(3, "/p/response_handler/default", this);
  50. // state /p/mode
  51. this.states["/p/mode"] = new State(4, "/p/mode", this);
  52. // state /p/mode/uninitialized
  53. this.states["/p/mode/uninitialized"] = new State(5, "/p/mode/uninitialized", this);
  54. // state /p/mode/async_disconnected
  55. this.states["/p/mode/async_disconnected"] = new State(6, "/p/mode/async_disconnected", this);
  56. this.states["/p/mode/async_disconnected"].setEnter(this.PModeAsyncDisconnectedEnter);
  57. // state /p/mode/async_connected
  58. this.states["/p/mode/async_connected"] = new State(7, "/p/mode/async_connected", this);
  59. this.states["/p/mode/async_connected"].setEnter(this.PModeAsyncConnectedEnter);
  60. // state /p/mode/can_leave
  61. this.states["/p/mode/can_leave"] = new State(8, "/p/mode/can_leave", this);
  62. this.states["/p/mode/can_leave"].setExit(this.PModeCanLeaveExit);
  63. // state /p/mode/can_leave/waiting_for_new_share_ack
  64. this.states["/p/mode/can_leave/waiting_for_new_share_ack"] = new State(9, "/p/mode/can_leave/waiting_for_new_share_ack", this);
  65. this.states["/p/mode/can_leave/waiting_for_new_share_ack"].setEnter(this.PModeCanLeaveWaitingForNewShareAckEnter);
  66. this.states["/p/mode/can_leave/waiting_for_new_share_ack"].setExit(this.PModeCanLeaveWaitingForNewShareAckExit);
  67. // state /p/mode/can_leave/reshare_when_online
  68. this.states["/p/mode/can_leave/reshare_when_online"] = new State(10, "/p/mode/can_leave/reshare_when_online", this);
  69. this.states["/p/mode/can_leave/reshare_when_online"].setEnter(this.PModeCanLeaveReshareWhenOnlineEnter);
  70. // state /p/mode/can_leave/session_set
  71. this.states["/p/mode/can_leave/session_set"] = new State(11, "/p/mode/can_leave/session_set", this);
  72. this.states["/p/mode/can_leave/session_set"].setEnter(this.PModeCanLeaveSessionSetEnter);
  73. this.states["/p/mode/can_leave/session_set"].setExit(this.PModeCanLeaveSessionSetExit);
  74. // state /p/mode/can_leave/session_set/waiting_for_join_ack
  75. 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);
  76. this.states["/p/mode/can_leave/session_set/waiting_for_join_ack"].setEnter(this.PModeCanLeaveSessionSetWaitingForJoinAckEnter);
  77. this.states["/p/mode/can_leave/session_set/waiting_for_join_ack"].setExit(this.PModeCanLeaveSessionSetWaitingForJoinAckExit);
  78. // state /p/mode/can_leave/session_set/joined
  79. this.states["/p/mode/can_leave/session_set/joined"] = new ParallelState(13, "/p/mode/can_leave/session_set/joined", this);
  80. // state /p/mode/can_leave/session_set/joined/region_sendreceive
  81. this.states["/p/mode/can_leave/session_set/joined/region_sendreceive"] = new State(14, "/p/mode/can_leave/session_set/joined/region_sendreceive", this);
  82. // state /p/mode/can_leave/session_set/joined/region_sendreceive/default
  83. 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);
  84. this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"].setEnter(this.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefaultEnter);
  85. this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"].setExit(this.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefaultExit);
  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("received", null));
  255. PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_2.setGuard(this.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_2Guard);
  256. this.states["/p/mode/can_leave/session_set/joined/region_sendreceive/default"].addTransition(PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_2);
  257. // transition /p/mode/can_leave/session_set/joined/region_cursor/nodelay
  258. 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"]]);
  259. PModeCanLeaveSessionSetJoinedRegionCursorNodelay_0.setAction(this.PModeCanLeaveSessionSetJoinedRegionCursorNodelay_0Exec);
  260. PModeCanLeaveSessionSetJoinedRegionCursorNodelay_0.setTrigger(new Event("update_cursor", this.getInPortName("in")));
  261. this.states["/p/mode/can_leave/session_set/joined/region_cursor/nodelay"].addTransition(PModeCanLeaveSessionSetJoinedRegionCursorNodelay_0);
  262. // transition /p/mode/can_leave/session_set/joined/region_cursor/delay/inner
  263. 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"]]);
  264. PModeCanLeaveSessionSetJoinedRegionCursorDelayInner_0.setAction(this.PModeCanLeaveSessionSetJoinedRegionCursorDelayInner_0Exec);
  265. PModeCanLeaveSessionSetJoinedRegionCursorDelayInner_0.setTrigger(new Event("update_cursor", this.getInPortName("in")));
  266. this.states["/p/mode/can_leave/session_set/joined/region_cursor/delay/inner"].addTransition(PModeCanLeaveSessionSetJoinedRegionCursorDelayInner_0);
  267. // transition /p/mode/can_leave/session_set/rejoin_when_online
  268. 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"]]);
  269. PModeCanLeaveSessionSetRejoinWhenOnline_0.setTrigger(new Event("connected", null));
  270. this.states["/p/mode/can_leave/session_set/rejoin_when_online"].addTransition(PModeCanLeaveSessionSetRejoinWhenOnline_0);
  271. // transition /p/socket_region/disconnected
  272. var PSocketRegionDisconnected_0 = new Transition(this, this.states["/p/socket_region/disconnected"], [this.states["/p/socket_region/connecting_or_connected"]]);
  273. PSocketRegionDisconnected_0.setAction(this.PSocketRegionDisconnected_0Exec);
  274. PSocketRegionDisconnected_0.setTrigger(new Event("connect", this.getInPortName("in")));
  275. this.states["/p/socket_region/disconnected"].addTransition(PSocketRegionDisconnected_0);
  276. // transition /p/socket_region/connecting_or_connected/connecting
  277. var PSocketRegionConnectingOrConnectedConnecting_0 = new Transition(this, this.states["/p/socket_region/connecting_or_connected/connecting"], [this.states["/p/socket_region/connecting_or_connected/connected"]]);
  278. PSocketRegionConnectingOrConnectedConnecting_0.setTrigger(new Event("open", this.getInPortName("socket")));
  279. this.states["/p/socket_region/connecting_or_connected/connecting"].addTransition(PSocketRegionConnectingOrConnectedConnecting_0);
  280. 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"]]);
  281. PSocketRegionConnectingOrConnectedConnecting_1.setAction(this.PSocketRegionConnectingOrConnectedConnecting_1Exec);
  282. PSocketRegionConnectingOrConnectedConnecting_1.setTrigger(new Event("error", this.getInPortName("socket")));
  283. this.states["/p/socket_region/connecting_or_connected/connecting"].addTransition(PSocketRegionConnectingOrConnectedConnecting_1);
  284. // transition /p/socket_region/connecting_or_connected/connected/send_receive_region/ready
  285. 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"]]);
  286. PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_0.setAction(this.PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_0Exec);
  287. PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_0.setTrigger(new Event("send", null));
  288. this.states["/p/socket_region/connecting_or_connected/connected/send_receive_region/ready"].addTransition(PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_0);
  289. 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"]]);
  290. PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_1.setAction(this.PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_1Exec);
  291. PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_1.setTrigger(new Event("message", this.getInPortName("socket")));
  292. PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_1.setGuard(this.PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_1Guard);
  293. this.states["/p/socket_region/connecting_or_connected/connected/send_receive_region/ready"].addTransition(PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_1);
  294. // transition /p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings/waiting
  295. 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"]]);
  296. PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodSendPingsWaiting_0.setTrigger(new Event("send", this.getInPortName("in")));
  297. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings/waiting"].addTransition(PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodSendPingsWaiting_0);
  298. 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"]]);
  299. PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodSendPingsWaiting_1.setAction(this.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodSendPingsWaiting_1Exec);
  300. PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodSendPingsWaiting_1.setTrigger(new Event("event2After"));
  301. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/send_pings/waiting"].addTransition(PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodSendPingsWaiting_1);
  302. // transition /p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs/waiting
  303. 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"]]);
  304. PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodReceivePongsWaiting_0.setTrigger(new Event("message", this.getInPortName("socket")));
  305. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs/waiting"].addTransition(PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodReceivePongsWaiting_0);
  306. 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"]]);
  307. PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodReceivePongsWaiting_1.setAction(this.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodReceivePongsWaiting_1Exec);
  308. PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodReceivePongsWaiting_1.setTrigger(new Event("event3After"));
  309. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good/receive_pongs/waiting"].addTransition(PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodReceivePongsWaiting_1);
  310. // transition /p/socket_region/connecting_or_connected/connected/connection_monitor_region/timeout
  311. 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"]]);
  312. PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionTimeout_0.setAction(this.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionTimeout_0Exec);
  313. PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionTimeout_0.setTrigger(new Event("message", this.getInPortName("socket")));
  314. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/timeout"].addTransition(PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionTimeout_0);
  315. // transition /p/socket_region/connecting_or_connected/wait_reconnect
  316. 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"]]);
  317. PSocketRegionConnectingOrConnectedWaitReconnect_0.setTrigger(new Event("event4After"));
  318. this.states["/p/socket_region/connecting_or_connected/wait_reconnect"].addTransition(PSocketRegionConnectingOrConnectedWaitReconnect_0);
  319. // transition /p/mode/can_leave
  320. var PModeCanLeave_0 = new Transition(this, this.states["/p/mode/can_leave"], [this.states["/p/mode/async_connected"]]);
  321. PModeCanLeave_0.setTrigger(new Event("leave", this.getInPortName("in")));
  322. PModeCanLeave_0.setGuard(this.PModeCanLeave_0Guard);
  323. this.states["/p/mode/can_leave"].addTransition(PModeCanLeave_0);
  324. var PModeCanLeave_1 = new Transition(this, this.states["/p/mode/can_leave"], [this.states["/p/mode/async_disconnected"]]);
  325. PModeCanLeave_1.setTrigger(new Event("leave", this.getInPortName("in")));
  326. PModeCanLeave_1.setGuard(this.PModeCanLeave_1Guard);
  327. this.states["/p/mode/can_leave"].addTransition(PModeCanLeave_1);
  328. // transition /p/mode/can_leave/session_set/joined
  329. 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"]]);
  330. PModeCanLeaveSessionSetJoined_0.setTrigger(new Event("disconnected", null));
  331. this.states["/p/mode/can_leave/session_set/joined"].addTransition(PModeCanLeaveSessionSetJoined_0);
  332. // transition /p/mode/can_leave/session_set/joined/region_cursor/delay
  333. 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"]]);
  334. PModeCanLeaveSessionSetJoinedRegionCursorDelay_0.setAction(this.PModeCanLeaveSessionSetJoinedRegionCursorDelay_0Exec);
  335. PModeCanLeaveSessionSetJoinedRegionCursorDelay_0.setTrigger(new Event("event0After"));
  336. PModeCanLeaveSessionSetJoinedRegionCursorDelay_0.setGuard(this.PModeCanLeaveSessionSetJoinedRegionCursorDelay_0Guard);
  337. this.states["/p/mode/can_leave/session_set/joined/region_cursor/delay"].addTransition(PModeCanLeaveSessionSetJoinedRegionCursorDelay_0);
  338. var PModeCanLeaveSessionSetJoinedRegionCursorDelay_1 = 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"]]);
  339. PModeCanLeaveSessionSetJoinedRegionCursorDelay_1.setTrigger(new Event("event1After"));
  340. PModeCanLeaveSessionSetJoinedRegionCursorDelay_1.setGuard(this.PModeCanLeaveSessionSetJoinedRegionCursorDelay_1Guard);
  341. this.states["/p/mode/can_leave/session_set/joined/region_cursor/delay"].addTransition(PModeCanLeaveSessionSetJoinedRegionCursorDelay_1);
  342. // transition /p/socket_region/connecting_or_connected
  343. var PSocketRegionConnectingOrConnected_0 = new Transition(this, this.states["/p/socket_region/connecting_or_connected"], [this.states["/p/socket_region/disconnected"]]);
  344. PSocketRegionConnectingOrConnected_0.setAction(this.PSocketRegionConnectingOrConnected_0Exec);
  345. PSocketRegionConnectingOrConnected_0.setTrigger(new Event("disconnect", this.getInPortName("in")));
  346. this.states["/p/socket_region/connecting_or_connected"].addTransition(PSocketRegionConnectingOrConnected_0);
  347. // transition /p/socket_region/connecting_or_connected/connected
  348. 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"]]);
  349. PSocketRegionConnectingOrConnectedConnected_0.setTrigger(new Event("close", this.getInPortName("socket")));
  350. this.states["/p/socket_region/connecting_or_connected/connected"].addTransition(PSocketRegionConnectingOrConnectedConnected_0);
  351. // transition /p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good
  352. 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"]]);
  353. PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGood_0.setAction(this.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGood_0Exec);
  354. PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGood_0.setTrigger(new Event("timeout", null));
  355. this.states["/p/socket_region/connecting_or_connected/connected/connection_monitor_region/all_good"].addTransition(PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGood_0);
  356. };
  357. Main.prototype.PResponseHandlerEnter = function() {
  358. this.reqHandlers = new Map();
  359. this.reqCounter = 0;
  360. this.sendReq = (obj, handler) => {
  361. const reqId = this.reqCounter++;
  362. const req = {
  363. reqId,
  364. ...obj,
  365. };
  366. console.log("Sending req", req);
  367. this.reqHandlers.set(reqId, handler);
  368. this.addEvent(new Event("send", null, [req]));
  369. // allow to cancel the request handler
  370. return () => {
  371. this.reqHandlers.delete(reqId);
  372. };
  373. }
  374. };
  375. Main.prototype.PModeCanLeaveExit = function() {
  376. this.sendReq({type:"leave"});
  377. };
  378. Main.prototype.PModeCanLeaveSessionSetEnter = function() {
  379. if (!this.sessionId) {
  380. throw new Error("DEBUG: no session id");
  381. }
  382. this.uiState.setSession(this.sessionId);
  383. };
  384. Main.prototype.PModeCanLeaveSessionSetExit = function() {
  385. this.uiState.unsetSession();
  386. };
  387. Main.prototype.PModeCanLeaveSessionSetJoinedRegionCursorDelayEnter = function() {
  388. this.cursorMsg = null;
  389. this.addTimer(0, 0.1);
  390. this.addTimer(1, 0.1);
  391. };
  392. Main.prototype.PModeCanLeaveSessionSetJoinedRegionCursorDelayExit = function() {
  393. this.removeTimer(0);
  394. this.removeTimer(1);
  395. };
  396. Main.prototype.PSocketRegionConnectingOrConnectedConnectedEnter = function() {
  397. this.raiseInternalEvent(new Event("connected", null, []));
  398. this.connected = true;
  399. };
  400. Main.prototype.PSocketRegionConnectingOrConnectedConnectedExit = function() {
  401. this.raiseInternalEvent(new Event("disconnected", null, []));
  402. this.connected = false;
  403. };
  404. Main.prototype.PModeAsyncDisconnectedEnter = function() {
  405. this.uiState.setOfflineDisconnected();
  406. };
  407. Main.prototype.PModeAsyncConnectedEnter = function() {
  408. this.uiState.setOfflineConnected();
  409. };
  410. Main.prototype.PModeCanLeaveWaitingForNewShareAckEnter = function() {
  411. this.uiState.setCreatingShare();
  412. this.deleteNewShareHandler = this.sendReq(
  413. {type: "new_share", ops: this.ops},
  414. res => {
  415. // called during transition (as action code), so no need to 'wake up' the controller like we do with 'addInput':
  416. this.addEvent(new Event("ack_new_share", "ack", [res.sessionId]));
  417. });
  418. };
  419. Main.prototype.PModeCanLeaveWaitingForNewShareAckExit = function() {
  420. this.deleteNewShareHandler();
  421. };
  422. Main.prototype.PModeCanLeaveReshareWhenOnlineEnter = function() {
  423. this.uiState.setReconnecting();
  424. };
  425. Main.prototype.PModeCanLeaveSessionSetWaitingForJoinAckEnter = function() {
  426. this.uiState.setJoining();
  427. this.deleteJoinHandler = this.sendReq(
  428. {type: "join", sessionId: this.sessionId},
  429. res => {
  430. // called during transition (as action code), so no need to 'wake up' the controller like we do with 'addInput':
  431. this.addEvent(new Event("ack_join", "ack", [res.ops]));
  432. });
  433. };
  434. Main.prototype.PModeCanLeaveSessionSetWaitingForJoinAckExit = function() {
  435. this.deleteJoinHandler();
  436. };
  437. Main.prototype.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefaultEnter = function() {
  438. this.uiState.setOnline();
  439. this.bigStep.outputEvent(new Event("joined", this.getOutPortName("out"), []));
  440. };
  441. Main.prototype.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefaultExit = function() {
  442. this.bigStep.outputEvent(new Event("left", this.getOutPortName("out"), []));
  443. };
  444. Main.prototype.PModeCanLeaveSessionSetRejoinWhenOnlineEnter = function() {
  445. this.uiState.setReconnecting();
  446. };
  447. Main.prototype.PSocketRegionConnectingOrConnectedConnectingEnter = function() {
  448. this.socket = new WebSocket(this.addr);
  449. // Translate socket events to statechart events:
  450. this.socket.onopen = event => {
  451. this.controller.addInput("open", this.inports["socket"], []);
  452. };
  453. this.socket.onmessage = event => {
  454. let parsed;
  455. try {
  456. parsed = JSON.parse(event.data);
  457. } catch (e) {
  458. console.log("received unparsable message", e);
  459. return;
  460. }
  461. this.controller.addInput("message", this.inports["socket"], [parsed]);
  462. };
  463. this.socket.onerror = event => {
  464. // From what I see, this event only happens when the socket could not connect.
  465. // An 'error' happening after the connection is established, will be indicated by a close event.
  466. this.controller.addInput("error", this.inports["socket"], []);
  467. };
  468. this.socket.onclose = event => {
  469. this.controller.addInput("close", this.inports["socket"], []);
  470. };
  471. };
  472. Main.prototype.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodSendPingsWaitingEnter = function() {
  473. this.addTimer(2, 500);
  474. };
  475. Main.prototype.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodSendPingsWaitingExit = function() {
  476. this.removeTimer(2);
  477. };
  478. Main.prototype.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodReceivePongsWaitingEnter = function() {
  479. this.addTimer(3, 7000);
  480. };
  481. Main.prototype.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodReceivePongsWaitingExit = function() {
  482. this.removeTimer(3);
  483. };
  484. Main.prototype.PSocketRegionConnectingOrConnectedWaitReconnectEnter = function() {
  485. this.addTimer(4, 1);
  486. };
  487. Main.prototype.PSocketRegionConnectingOrConnectedWaitReconnectExit = function() {
  488. this.removeTimer(4);
  489. };
  490. Main.prototype.PModeCanLeave_0Guard = function(parameters) {
  491. return this.connected;
  492. };
  493. Main.prototype.PModeCanLeave_1Guard = function(parameters) {
  494. return this.disconnected;
  495. };
  496. Main.prototype.PModeCanLeaveSessionSetJoinedRegionCursorDelay_0Exec = function(parameters) {
  497. this.raiseInternalEvent(new Event("send", null, [this.cursorMsg]));
  498. };
  499. Main.prototype.PModeCanLeaveSessionSetJoinedRegionCursorDelay_0Guard = function(parameters) {
  500. return this.cursorMsg !== null;
  501. };
  502. Main.prototype.PModeCanLeaveSessionSetJoinedRegionCursorDelay_1Guard = function(parameters) {
  503. return this.cursorMsg === null;
  504. };
  505. Main.prototype.PSocketRegionConnectingOrConnected_0Exec = function(parameters) {
  506. this.socket.close();
  507. };
  508. Main.prototype.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGood_0Exec = function(parameters) {
  509. this.raiseInternalEvent(new Event("timeout", null, []));
  510. };
  511. Main.prototype.PResponseHandlerDefault_0Exec = function(parameters) {
  512. var parsed = parameters[0];
  513. if (parsed.type === 'ack') {
  514. const handler = this.reqHandlers.get(parsed.reqId);
  515. if (handler) {
  516. handler(parsed);
  517. }
  518. }
  519. };
  520. Main.prototype.PResponseHandlerDefault_1Exec = function(parameters) {
  521. // no way we will get a response for our pending requests
  522. this.reqHandlers.clear();
  523. this.reqCounter = 0;
  524. };
  525. Main.prototype.PModeUninitialized_1Exec = function(parameters) {
  526. var sessionId = parameters[0];
  527. this.sessionId = sessionId;
  528. };
  529. Main.prototype.PModeAsyncConnected_1Exec = function(parameters) {
  530. var sessionId = parameters[0];
  531. this.sessionId = sessionId;
  532. };
  533. Main.prototype.PModeAsyncConnected_2Exec = function(parameters) {
  534. var ops = parameters[0];
  535. // console.log("new share event, ops=", ops);
  536. this.ops = ops;
  537. };
  538. Main.prototype.PModeCanLeaveWaitingForNewShareAck_1Exec = function(parameters) {
  539. var sessionId = parameters[0];
  540. this.sessionId = sessionId;
  541. this.bigStep.outputEvent(new Event("ack_new_share", this.getOutPortName("out"), [sessionId]));
  542. };
  543. Main.prototype.PModeCanLeaveSessionSetWaitingForJoinAck_0Exec = function(parameters) {
  544. var ops = parameters[0];
  545. this.bigStep.outputEvent(new Event("ack_join", this.getOutPortName("out"), [ops]));
  546. };
  547. Main.prototype.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_0Exec = function(parameters) {
  548. var parsed = parameters[0];
  549. if (parsed.sessionId !== this.sessionId) {
  550. throw new Error("Unexpected: received edit for another session:" + parsed.sessionId);
  551. }
  552. this.bigStep.outputEvent(new Event("received_op", this.getOutPortName("out"), [parsed.op]));
  553. };
  554. Main.prototype.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_0Guard = function(parameters) {
  555. var parsed = parameters[0];
  556. return parsed.type === 'pub_edit';
  557. };
  558. Main.prototype.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_1Exec = function(parameters) {
  559. var serialized = parameters[0];
  560. // console.log("sending sessionId", this.sessionId);
  561. this.sendReq(
  562. {type:"new_edit", sessionId: this.sessionId, op: serialized},
  563. res => {
  564. // this.unacknowledged.delete(serialized.id);
  565. });
  566. // this.unacknowledged.set(serialized.id, serialized);
  567. };
  568. Main.prototype.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_2Exec = function(parameters) {
  569. var parsed = parameters[0];
  570. this.bigStep.outputEvent(new Event("update_cursor", this.getOutPortName("out"), [parsed]));
  571. };
  572. Main.prototype.PModeCanLeaveSessionSetJoinedRegionSendreceiveDefault_2Guard = function(parameters) {
  573. var parsed = parameters[0];
  574. return parsed.type === 'update_cursor';
  575. };
  576. Main.prototype.PModeCanLeaveSessionSetJoinedRegionCursorNodelay_0Exec = function(parameters) {
  577. var msg = parameters[0];
  578. this.raiseInternalEvent(new Event("send", null, [msg]));
  579. };
  580. Main.prototype.PModeCanLeaveSessionSetJoinedRegionCursorDelayInner_0Exec = function(parameters) {
  581. var msg = parameters[0];
  582. this.cursorMsg = msg;
  583. };
  584. Main.prototype.PSocketRegionDisconnected_0Exec = function(parameters) {
  585. var addr = parameters[0];
  586. console.log("received connect", addr)
  587. this.addr = addr;
  588. };
  589. Main.prototype.PSocketRegionConnectingOrConnectedConnecting_1Exec = function(parameters) {
  590. this.raiseInternalEvent(new Event("error", null, []));
  591. };
  592. Main.prototype.PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_0Exec = function(parameters) {
  593. var json = parameters[0];
  594. this.socket.send(JSON.stringify(json));
  595. };
  596. Main.prototype.PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_1Exec = function(parameters) {
  597. var parsed = parameters[0];
  598. this.raiseInternalEvent(new Event("received", null, [parsed]));
  599. };
  600. Main.prototype.PSocketRegionConnectingOrConnectedConnectedSendReceiveRegionReady_1Guard = function(parameters) {
  601. var parsed = parameters[0];
  602. return parsed.type !== 'pong';
  603. };
  604. Main.prototype.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodSendPingsWaiting_1Exec = function(parameters) {
  605. this.socket.send(JSON.stringify({type:"ping"}));
  606. };
  607. Main.prototype.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionAllGoodReceivePongsWaiting_1Exec = function(parameters) {
  608. this.raiseInternalEvent(new Event("timeout", null, []));
  609. };
  610. Main.prototype.PSocketRegionConnectingOrConnectedConnectedConnectionMonitorRegionTimeout_0Exec = function(parameters) {
  611. this.raiseInternalEvent(new Event("timeout_recovered", null, []));
  612. };
  613. Main.prototype.initializeStatechart = function() {
  614. // enter default state
  615. this.defaultTargets = this.states["/p"].getEffectiveTargetStates();
  616. RuntimeClassBase.prototype.initializeStatechart.call(this);
  617. };
  618. // Add symbol 'Main' to package 'client'
  619. client.Main = Main;
  620. let ObjectManager = function(controller) {
  621. ObjectManagerBase.call(this, controller);
  622. };
  623. ObjectManager.prototype = new Object();
  624. (function() {
  625. var proto = new ObjectManagerBase();
  626. for (let prop in proto) {
  627. ObjectManager.prototype[prop] = proto[prop];
  628. }
  629. })();
  630. ObjectManager.prototype.instantiate = function(className, constructParams) {
  631. if (className === "Main") {
  632. var instance = new Main(this.controller, constructParams[0]);
  633. instance.associations = {};
  634. instance.associations["socket"] = new Association("Socket", 1, 1);
  635. } else {
  636. throw new Error("Cannot instantiate class " + className);
  637. }
  638. return instance;
  639. };
  640. // Add symbol 'ObjectManager' to package 'client'
  641. client.ObjectManager = ObjectManager;
  642. let Controller = function(uiState, eventLoopCallbacks, finishedCallback, behindScheduleCallback) {
  643. if (finishedCallback === undefined) finishedCallback = null;
  644. if (behindScheduleCallback === undefined) behindScheduleCallback = null;
  645. EventLoopControllerBase.call(this, new ObjectManager(this), eventLoopCallbacks, finishedCallback, behindScheduleCallback);
  646. this.addInputPort("in");
  647. this.addOutputPort("out");
  648. this.objectManager.createInstance("Main", [uiState]);
  649. };
  650. Controller.prototype = new Object();
  651. (function() {
  652. var proto = new EventLoopControllerBase();
  653. for (let prop in proto) {
  654. Controller.prototype[prop] = proto[prop];
  655. }
  656. })();
  657. // Add symbol 'Controller' to package 'client'
  658. client.Controller = Controller;
  659. })();