X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/e2eca205db4e40de582117790b1e48dbf3e5bf3a..6346a7c4c0cb5d7e8c5f01392b6cc64d329b68ec:/apps/workbench/app/assets/javascripts/event_log.js diff --git a/apps/workbench/app/assets/javascripts/event_log.js b/apps/workbench/app/assets/javascripts/event_log.js index 243f733619..e576ba97a3 100644 --- a/apps/workbench/app/assets/javascripts/event_log.js +++ b/apps/workbench/app/assets/javascripts/event_log.js @@ -1,87 +1,62 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: AGPL-3.0 + /* - * 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; - -function subscribeToEventLog (url, uuid, elementId) { - // if websockets are not supported by browser, do not attempt to subscribe for events - websocketsSupported = ('WebSocket' in window); - if (websocketsSupported == false) { - return; - } - - // 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) }; +/* Subscribe to websockets event log. Do nothing if already connected. */ +function subscribeToEventLog () { + // if websockets are not supported by browser, do not subscribe for events + websocketsSupported = ('WebSocket' in window); + if (websocketsSupported == false) { + return; + } - // store websocket in window to allow reuse when multiple divs subscribe for events - $(window).data("arv-websocket", event_log_disp); + // check if websocket connection is already stored on the window + event_log_disp = $(window).data("arv-websocket"); + if (event_log_disp == null) { + // need to create new websocket and event log dispatcher + websocket_url = $('meta[name=arv-websocket-url]').attr("content"); + if (websocket_url == null) + return; - // detach elementId when user leaves this window - window.onbeforeunload = function (event) {detachElement(event, elementId);} - } + 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. Without any filters + arguments, this subscribes to all events */ function onEventLogDispatcherOpen(event) { - event_log_disp.send('{"method":"subscribe"}'); + this.send('{"method":"subscribe"}'); } -// Check each of the entries in the listener map. If any are waiting for -// an event of this event's object, append to their registered element +/* 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")); - - for (var key in event_log_listener_map) { - value = event_log_listener_map[key]; + parsedData = JSON.parse(event.data); + object_uuid = parsedData.object_uuid; - new_properties = ""; - eventData = JSON.parse(event.data); - if (value === eventData.object_uuid) { - properties = eventData.properties; - if (properties !== null) { - new_attributes = properties.new_attributes; - if (new_attributes !== null) { - new_properties = JSON.stringify(properties.new_attributes); - } - } - - // append to the registered element - $('#'+key).append(eventData.summary + " " + new_properties + " "); + if (!object_uuid) { + return; } - } -} - -/** - * 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(); - } + // 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\"],.arv-log-event-listener[data-object-kind=\"" + parsedData.object_kind + "\"]"; + $(matches).trigger('arv-log-event', parsedData); } + +/* Automatically connect if there are any elements on the page that want to + receive event log events. */ +$(document).on('ajax:complete ready', function() { + var a = $('.arv-log-event-listener'); + if (a.length > 0) { + subscribeToEventLog(); + } +});