logs.js 4.26 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 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 Promise */

define('screens/player/command/logs', [
    'jquery',
    'underscore',
    'screens/player/command/command',
    'screens/player/shared/serviceadmin',
    'screens/player/store/store',
    'screens/player/firmware/log/logger',
    'screens/player/shared/csrf',
    'module'
], function($, _, PlayerCommand, ServiceAdmin, Store, Logger, CSRFSupport, mod) {
    'use strict';

    function sendLogsToServer(csrf, path, logs) {
        var formData = new FormData();
        logs.forEach(function(log) {
            formData.append('logfile', log.blob, log.name);
        });

        csrf.$ajax($, {
            url: path,
            type: 'POST',
            cache: false,
            contentType: false,
            processData: false,
            data: formData,
            beforeSend: function() {
                console.log('Sending logs to ' + path);
            }
        });
    }

    function retrieveLogs(logger) {
        function loadBlob(logFile) {
            return logger.getLogBlob(logFile).then(function(blob) {
                return {
                    name: logFile,
                    blob: blob
                };
            });
        }

        return function(logFiles) {
            return Promise.all(logFiles.map(loadBlob));
        };
    }

    /**
     * This command handler is able to process the following commands:
     * - "logs" sends the device's log file to the server
     *
     * @class LogsCommand
     * @implements {PlayerCommand}
     */
    var LogsCommand = _.extend({}, PlayerCommand, {

        serviceId: mod.id,

        /**
         * @function LogsCommand#canHandle
         * @inheritdoc
         */
        canHandle: function(cmd) {
            return cmd === 'logs';
        },

        /**
         * @function LogsCommand#activate
         * @inheritdoc
         */
        activate: function() {
            return new Promise(function(resolve, reject) {
                ServiceAdmin.onServiceHighestRankedStart(Store.serviceName, function(store) {
                    resolve(store);
                });
            }).then(function() {
                return new Promise(function(resolve, reject) {
                    ServiceAdmin.onServiceHighestRankedStart(Logger.serviceName, function(logger) {
                        resolve(logger);
                    });
                });
            });
        },

        /**
         * @function LogsCommand#handleCommand
         * @inheritdoc
         */
        handleCommand: function(command, payload) {
            var store = ServiceAdmin.getService(Store.serviceName);
            var logger = ServiceAdmin.getService(Logger.serviceName);

            var state = store.getState();
            var statusmodel = state.statusmodel;
            var deviceUrl = (statusmodel || {}).devicePostUrl;
            if (!deviceUrl) {
                throw new Error('Unable to send logs. no device url.');
            }
            var csrf = new CSRFSupport({
                serverURL: statusmodel.server
            });

            var restEndpoint = deviceUrl + '.logs.json';
            logger.listLogs()
                .then(retrieveLogs(logger))
                .then(function(logs) {
                    return sendLogsToServer(csrf, restEndpoint, logs);
                })
                .catch(function(e) {
                    console.error('Error sending logs files to server.', e);
                    throw e;
                });
        }
    });

    return LogsCommand;
});

/* istanbul ignore next */
require([
    'screens/player/command/logs',
    'screens/player/shared/serviceadmin'
], function(Service, ServiceAdmin) {
    'use strict';
    ServiceAdmin.register(Service);
});