/*
- * This file establishes a websockets connection with the API Server.
- *
- * The subscribe method takes a window element id and object id. Any log
- * events for that particular object id are added to that window element.
+ * This js establishes a websockets connection with the API Server.
*/
-var event_log_disp;
+/* The subscribe method takes a window element id and object id.
+ Any log events for that particular object id are sent to that window element. */
+function subscribeToEventLog (elementId) {
+ // if websockets are not supported by browser, do not subscribe for events
+ websocketsSupported = ('WebSocket' in window);
+ if (websocketsSupported == false) {
+ return;
+ }
-function subscribeToEventLog (url, uuid, elementId) {
- // 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
+ websocket_url = $('meta[name=arv-websocket-url]').attr("content");
+ if (websocket_url == null)
+ return;
- event_log_disp.onopen = function(event) { onEventLogDispatcherOpen(event) };
- event_log_disp.onmessage = function(event) { onEventLogDispatcherMessage(event) };
+ event_log_disp = new WebSocket(websocket_url);
- // Add the elementId to listener map
- event_log_listener_map = JSON.parse(sessionStorage.getItem("event_log_listener_map"));
- if (event_log_listener_map == null)
- event_log_listener_map = {};
- delete event_log_listener_map[elementId];
- event_log_listener_map[elementId] = uuid;
+ event_log_disp.onopen = onEventLogDispatcherOpen;
+ event_log_disp.onmessage = onEventLogDispatcherMessage;
- sessionStorage.removeItem("event_log_listener_map");
- sessionStorage.setItem("event_log_listener_map", JSON.stringify(event_log_listener_map));
+ // store websocket in window to allow reuse when multiple divs subscribe for events
+ $(window).data("arv-websocket", event_log_disp);
+ }
}
+/* send subscribe message to the websockets server */
function onEventLogDispatcherOpen(event) {
- event_log_disp.send('{"method":"subscribe"}');
+ this.send('{"method":"subscribe"}');
}
+/* trigger event for all applicable elements waiting for this event */
function onEventLogDispatcherMessage(event) {
- event_log_listener_map = JSON.parse(sessionStorage.getItem("event_log_listener_map"));
+ parsedData = JSON.parse(event.data);
+ object_uuid = parsedData.object_uuid;
- for (var key in event_log_listener_map) {
- value = event_log_listener_map[key];
-
- eventData = JSON.parse(event.data);
- if (value === eventData.object_uuid) {
- $('#'+key).append(eventData.summary + " ");
- }
- }
+ // if there are any listeners for this object uuid or "all", trigger the event
+ matches = ".arv-log-event-listener[data-object-uuid=\"" + object_uuid + "\"],.arv-log-event-listener[data-object-uuids~=\"" + object_uuid + "\"],.arv-log-event-listener[data-object-uuid=\"all\"]";
+ $(matches).trigger('arv-log-event', event.data);
}