statusinfo-service.js 4.45 KB
/*
 * ADOBE CONFIDENTIAL
 *
 * Copyright 2015 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 Promise */
define('screens/player/firmware/statusinfo/impl/statusinfo-service', [
    'jquery',
    'screens/player/shared/util',
    'screens/player/shared/serviceadmin',
    'screens/player/firmware/statusinfo/statusinfo',
    'screens/player/shared/csrf',
    'screens/player/firmware/storage/storage',
    'screens/player/store/store',
    'module'
], function($, Util, ServiceAdmin, StatusInfo, CSRFSupport, Storage, Store, mod) {
    'use strict';

    var URL_EXTENSION = '.statusinfo.json';

    /**
     * Implements the StatusInfoService
     *
     * @class StatusInfoService
     * @implements {StatusInfo}
     */
    return {

        serviceId: mod.id,

        /**
         * @memberof StatusInfoService
         * @inheritdoc
         */
        serviceName: StatusInfo.serviceName,

        /**
         * @memberof StatusInfoService
         * @inheritdoc
         */
        activate: function() {
            return new Promise(function(resolve, reject) {
                ServiceAdmin.onServiceHighestRankedStart(Store.serviceName, function() {
                    resolve();
                });
            }).then(function() {
                return new Promise(function(resolve, reject) {
                    ServiceAdmin.onServiceHighestRankedStart(Storage.serviceName, function() {
                        resolve();
                    });
                });
            });
        },

        /**
         * @memberof StatusInfoService
         * @inheritdoc
         */
        deactivate: function() {
        },

        /**
         * @memberof StatusInfoService
         * @inheritdoc
         */
        send: function() {

            var store = ServiceAdmin.getService(Store.serviceName);
            var storage = ServiceAdmin.getService(Storage.serviceName);

            var state = store.getState();
            var statusmodel = state.statusmodel || {};
            var deviceUrl = statusmodel.devicePostUrl;

            if (!deviceUrl) {
                return Promise.reject(new Error('unable to send status information. no device url.'));
            }

            return new Promise(function(resolve, reject) {

                // Currently, 'refresh' stores the data into the store synchronously. so when its promise
                // resolves, the new info should be in the store.
                storage.refresh().then(function() { // eslint-disable-line max-nested-callbacks

                    state = store.getState();
                    var data = {
                        usage: Util.get(state, 'storage.status.usage', {}),
                        timestamp: Date.now(),
                        startTimestamp: Util.get(state, 'statusmodel.startTimestamp', 0),
                        firmwareVersion: statusmodel.version
                    };

                    var csrf = new CSRFSupport({
                        serverURL: statusmodel.server
                    });

                    csrf.$ajax($, {
                        type: 'POST',
                        url: deviceUrl + URL_EXTENSION,
                        data: {
                            data: JSON.stringify(data)
                        },
                        success: resolve,
                        error: function(one, two, errorMessage) {
                            reject(errorMessage);
                        },
                        beforeSend: function() { // eslint-disable-line max-nested-callbacks
                            console.log('Sending status info to ' + statusmodel.deviceId);
                        }

                    });

                });

            });

        }
    };
});

require([
    'screens/player/firmware/statusinfo/impl/statusinfo-service',
    'screens/player/shared/serviceadmin'
], function(Service, ServiceAdmin) {
    'use strict';
    ServiceAdmin.register(Service);
});