request-logs.js 3.15 KB
/*
 * ADOBE CONFIDENTIAL
 *
 * Copyright 2016 Adobe Systems Incorporated
 * All Rights Reserved.
 *
 * NOTICE:  All information contained herein is, and remains
 * the property of Adobe Systems Incorporated and its suppliers,
 * if any.  The intellectual and technical concepts contained
 * herein are proprietary to Adobe Systems Incorporated and its
 * suppliers and may be covered by U.S. and Foreign Patents,
 * patents in process, and are protected by trade secret or copyright law.
 * Dissemination of this information or reproduction of this material
 * is strictly forbidden unless prior written permission is obtained
 * from Adobe Systems Incorporated.
 */

/* globals Granite */

(function(window, document, $, i18n, dcc) {
    'use strict';

    var POLLING_INTERVAL = 1000; // ms

    var LOGS_ACTIVATOR = '.screens-dcc-actions-Device-logs-activator';

    var LOGS_SELECTOR = '.screens-dashboard-DeviceActivityTile';

    var LOGS_CLASS = 'screens-DeviceLogs';

    var ui = $(window).adaptTo('foundation-ui');

    function reloadUI() {
        var foundationContent = $('.foundation-content').adaptTo('foundation-content');
        return foundationContent.refresh();
    }

    function getTimestamp(html) {
        var timestamp = $('.' + LOGS_CLASS + ' time', html).attr('datetime');
        return timestamp ? new Date(parseInt(timestamp, 10)) : null;
    }

    function readLogs(deviceProfilePath) {
        var url = Granite.HTTP.externalize(deviceProfilePath + '/logs/error.log/_jcr_content.json');
        return $.ajax(url);
    }

    function pollLogs(deviceProfilePath, timestamp) {
        var logsPollTimeout;

        var deferred = $.Deferred();  // eslint-disable-line new-cap
        var handleLogs = function() {

            var checkLogs = function(data) {
                var newTimestamp = data['jcr:lastModified'] ? new Date(data['jcr:lastModified']) : null;
                if (newTimestamp && (timestamp ? timestamp.getTime() : 0) < newTimestamp.getTime()) {
                    deferred.resolve(newTimestamp);
                }
                else {
                    handleLogs();
                }
            };

            window.clearTimeout(logsPollTimeout);
            logsPollTimeout = window.setTimeout(function() {
                readLogs(deviceProfilePath)
                    .then(checkLogs)
                    .fail(handleLogs);
            }, POLLING_INTERVAL);
        };
        handleLogs();

        return deferred.promise();
    }

    function requestLogs(deviceId) {
        ui.wait($(LOGS_SELECTOR).get(0));

        dcc.playerCommands.sendCommandToDevice(deviceId, dcc.playerCommands.COMMANDS.REQUEST_LOGS)
            .then(function(deviceData) {
                return pollLogs(deviceData.deviceProfilePath, getTimestamp());
            })
            .then(reloadUI);
    }

    $(document).on('click', LOGS_ACTIVATOR, function(ev) {
        var $device = $(ev.currentTarget).closest('.screens-Device');
        var deviceId = $device.find('[data-device-id]').data('deviceId');

        if (!deviceId) {
            return;
        }

        requestLogs(deviceId);
    });

}(window, document, Granite.$, Granite.I18n, window.CQ.screens.dcc));