2756: store websocket in window to facilitate reuse within page. also, remove element...
authorradhika <radhika@curoverse.com>
Thu, 15 May 2014 19:52:15 +0000 (15:52 -0400)
committerradhika <radhika@curoverse.com>
Thu, 15 May 2014 19:52:15 +0000 (15:52 -0400)
apps/workbench/app/assets/javascripts/event_log.js
apps/workbench/app/views/pipeline_instances/_show_event_log.html.erb

index c65574fedec0472cb923d43c796cd9c10afe9f41..243f733619525840fa2772e161b7cc87e1ca6e24 100644 (file)
@@ -14,11 +14,21 @@ function subscribeToEventLog (url, uuid, elementId) {
     return;  
   }
 
-  // create the event log dispatcher
-  event_log_disp = new WebSocket(url);
+  // grab websocket connection from window, if one exists
+  event_log_disp = $(window).data("arv-websocket");
+  if (event_log_disp == null) {
+    // create the event log dispatcher
+    event_log_disp = new WebSocket(url);
 
-  event_log_disp.onopen = function(event) { onEventLogDispatcherOpen(event) };
-  event_log_disp.onmessage = function(event) { onEventLogDispatcherMessage(event) };
+    event_log_disp.onopen = function(event) { onEventLogDispatcherOpen(event) };
+    event_log_disp.onmessage = function(event) { onEventLogDispatcherMessage(event) };
+
+    // store websocket in window to allow reuse when multiple divs subscribe for events
+    $(window).data("arv-websocket", event_log_disp);
+
+    // detach elementId when user leaves this window
+    window.onbeforeunload = function (event) {detachElement(event, elementId);}
+  }
 
   // Add the elementId to listener map
   event_log_listener_map = JSON.parse(sessionStorage.getItem("event_log_listener_map"));
@@ -59,3 +69,19 @@ function onEventLogDispatcherMessage(event) {
     }
   }
 }
+
+/**
+ * When leaving this window, remove elementId from map
+ */
+function detachElement(event, elementId) {
+  event_log_listener_map = JSON.parse(sessionStorage.getItem("event_log_listener_map"));
+  if (event_log_listener_map !== null) {
+    delete event_log_listener_map[elementId];
+  }
+
+  // According to documenation, browser will close the connection when page is left.
+  // However, there are suggestions of inconsistency; so to be safe, close explicitly.
+  if (event_log_disp !== null) {
+    event_log_disp.close();
+  }
+}
index f4061f0fc67f5c2e9ab26e8aaecf024f1ab83775..c35562befd474ab2f5031eacbd24c344579fbafb 100644 (file)
@@ -1,5 +1,8 @@
-<span>
-  <h3>Log for pipeline</h3>
-  <image hidden=true id="pipeline_event_log_img" src="/favicon.ico" onclick="sendToDispatcher();" onload="subscribeToEventLog('<%=$arvados_api_client.discovery[:websocketUrl]%>?api_token=<%=Thread.current[:arvados_api_token]%>', '<%=@object.uuid%>', 'pipeline_event_log_area')";></image>
-  <textarea row="10" cols="80" id="pipeline_event_log_area"></textarea>
-</span>
+<% if !@object.state.in? ['Complete', 'Failed'] %>
+  <span>
+    <h3>Log for pipeline</h3>
+    <image hidden=true id="pipeline_event_log_img" src="/favicon.ico" onclick="sendToDispatcher();" onload="subscribeToEventLog('<%=$arvados_api_client.discovery[:websocketUrl]%>?api_token=<%=Thread.current[:arvados_api_token]%>', '<%=@object.uuid%>', 'pipeline_event_log_area')";></image>
+
+    <textarea row="10" cols="80" id="pipeline_event_log_area"></textarea>
+  </span>
+<% end %>