resolver-offline.js 4.11 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.
 */
require([
    'jquery',
    'screens/player/shared/util',
    'screens/player/runtime/orchestrator',
    'screens/player/firmware/httpserver/httpserver',
    'screens/player/firmware/filesystem/filesystem',
    'screens/player/shared/serviceadmin'
], function($, util, Orchestrator, HttpServer, FilesystemService, ServiceAdmin) {
    'use strict';

    /**
     * Default options for the component.
     *
     * @typedef {Object} OfflineResolver.OfflineResolverOptions
     * @type {Object}
     * @property {String} serverPath The root path to the server.
     */
    var DEFAULTS = {
        serverPath: ''
    };

    /**
     * The normal channels resolver for the orchestrator.
     *
     * @class OfflineResolver
     *
     * @param {OfflineResolver.OfflineResolverOptions} [options] The options for the resolver
     */
    var OfflineResolver = function(options) {
        this.options = $.extend({}, DEFAULTS, options);
    };

    /**
     * Prepare the channel before using it.
     * @memberof OfflineResolver
     *
     * @param  {Object} channel The channel to be prepared
     *
     * @return {Promise} A promise that does the preparation for the specified channel
     */
    OfflineResolver.prototype.prepare = function(channel) {
        if (!channel.offline || !channel.offline.local || !channel.offline.local.destination) {
            return Promise.reject('Do not know how to deal with channel with no valid local offline config ' + channel.path);
        }

        var self = this;
        var local = channel.offline.local;

        var filesystemService = ServiceAdmin.getService(FilesystemService.serviceName);

        return filesystemService.getUserDataPath()
            .then(function(userDataPath) {
                return filesystemService.joinPath([userDataPath, local.destination, local.suffix]);
            }).then(function(wwwPath) {
                var server = ServiceAdmin.getService(HttpServer.serviceName);
                return server.serve(wwwPath).then(function(url) {
                    console.debug('Serving channel ' + channel.path + ' from local folder path ' + wwwPath);
                    self.options.serverPath = url;
                });
            });

    };

    /**
     * Show the iframe for the specified channel.
     * @memberof OfflineResolver
     *
     * @param  {Object} channel The channel to be shown
     *
     * @return {Promise} A promise that resolves the path to the specified channel
     */
    OfflineResolver.prototype.resolve = function(channel) {
        var channelPath = channel.path;
        var self = this;
        var server = ServiceAdmin.getService(HttpServer.serviceName);
        return new Promise(function(resolve, reject) {
            if (server) {
                var url = util.makePath(self.options.serverPath, channelPath + '.html?displayPath=' + self.options.displayPath);
                return resolve(url);
            }
            reject(channelPath);
        });
    };

    /**
     * Destroy the resolver.
     * @memberof OfflineResolver
     * @return {Promise} A promise that resolves as soon as the server is properly destroyed.
     */
    OfflineResolver.prototype.destroy = function() {
        var self = this;
        var server = ServiceAdmin.getService(HttpServer.serviceName);
        if (server) {
            return server.stop().then(function() {
                delete self.options;
            });
        }
        return Promise.resolve();
    };

    Orchestrator.resolvers.Offline = OfflineResolver;

});