| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| /* |
| * Pipe viewer manager is used to load and get an instance of a pipe viewer |
| * given its name. |
| * |
| * Manager handles on-demand loading and caching of pipe viewers. |
| * @fileoverview |
| */ |
| |
| import { isAbsoulteUrl } from 'libs/utils/url' |
| import { Logger } from 'libs/logs/logger' |
| |
| /* |
| * Preload certain common builtin plugins. |
| * Plugins are normally loaded on demand and this makes the initial bundle larger |
| * but common plugins should be preloaded for better performance. |
| * This is kind of a hack as it simply exposes a path to these |
| * plugins so that build bundler finds them and bundles them with the reset of the app |
| */ |
| import { default as vlogPlugin } from './builtin/vlog/plugin' |
| import { default as imagePlugin } from './builtin/image/plugin' |
| import { default as consolePlugin } from './builtin/console/plugin' |
| |
| var log = new Logger('pipe-viewer/manager'); |
| |
| // cache loaded viewers |
| var loadedPipeViewers = {}; |
| |
| /* |
| * Asynchronously loads and returns a PipeViewer plugin instance given its name. |
| * @param {string} name Unique name of the viewer. |
| * @return {Promise<PipeViewer>} pipe viewer for the given name |
| */ |
| export function get(name) { |
| if(isLoaded(name)) { |
| return Promise.resolve(new loadedPipeViewers[name]()); |
| } |
| |
| return loadViewer(name).then((viewerClass) => { |
| return new viewerClass(); |
| }).catch((e) => { return Promise.reject(e); }); |
| } |
| |
| /* |
| * Tests whether the viewer plugin is already loaded or not. |
| * @param {string} name Unique name of the viewer. |
| * @return {string} Whether the viewer plugin is already loaded or not. |
| * |
| * @private |
| */ |
| function isLoaded(name) { |
| return loadedPipeViewers[name] !== undefined |
| } |
| |
| /* |
| * Registers a pipeViewer under a unique name and make it available to be called |
| * @param {string} name Unique name of the viewer. |
| * @return {Promise} when import completes. |
| * |
| * @private |
| */ |
| function loadViewer(name) { |
| log.debug('loading viewer:', name); |
| |
| var path = getPath(name); |
| return System.import(path).then((module) => { |
| var pipeViewerClass = module.default; |
| loadedPipeViewers[name] = pipeViewerClass; |
| return pipeViewerClass; |
| }).catch((e) => { |
| var errMessage = 'could not load viewer for: ' + name; |
| log.debug(errMessage, e); |
| return Promise.reject(new Error(errMessage)); |
| }) |
| } |
| |
| /* |
| * Returns the path to a pipe viewer module location based on its name. |
| * @param {string} name Unique name of the viewer. |
| * @return {string} path to a pipe viewer module location. |
| * |
| * @private |
| */ |
| function getPath(name) { |
| if(isAbsoulteUrl(name)) { |
| var encodedName = encodeURIComponent(name); |
| System.paths[encodedName] = name; |
| return encodedName; |
| } else { |
| return 'pipe-viewers/builtin/' + name + '/plugin'; |
| } |
| } |