All files / core renderer.js

100% Statements 29/29
96.55% Branches 28/29
100% Functions 1/1
100% Lines 25/25
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93                  1x 1x 1x                     6x 1x     5x 5x                     28x   4x   15x   15x   42x   10x 10x   2x                 2x             3x 1x     2x         4x 1x     3x       22x       9x       1x
'use strict';
 
/**
 *
 * Class to manage renderer selection and addition.
 * @class Renderer
 */
class Renderer {
 
	constructor () {
		this.renderers = {};
		this.order = [];
	}
 
	/**
	 * Register a new renderer.
	 *
	 * @param {Object} renderer - An object with all the rendered information (name REQUIRED)
	 * @method add
	 */
	add (renderer) {
 
		if (renderer.name === undefined) {
			throw new Error('renderer must contain at least `name` property');
		}
 
		this.renderers[renderer.name] = renderer;
		this.order.push(renderer.name);
	}
 
	/**
	 * Iterate a list of renderers to determine which one should the player use.
	 *
	 * @param {Object[]} mediaFiles - A list of source and type obtained from video/audio/source tags: [{src:'',type:''}]
	 * @param {?String[]} renderers - Optional list of pre-selected renderers
	 * @return {?Object} The renderer's name and source selected
	 * @method select
	 */
	select (mediaFiles, renderers = []) {
 
		renderers = renderers.length ? renderers: this.order;
 
		for (let key of renderers) {
 
			let renderer = this.renderers[key];
 
			if (renderer !== null && renderer !== undefined) {
 
				for (let file of mediaFiles) {
					if (typeof renderer.canPlayType === 'function' && typeof file.type === 'string' &&
						renderer.canPlayType(file.type)) {
						return {
							rendererName: renderer.name,
							src: file.src
						};
					}
				}
			}
		}
 
		return null;
	}
 
	// Setters/getters
 
	set order(order) {
 
		if (!Array.isArray(order)) {
			throw new Error('order must be an array of strings.');
		}
 
		this._order = order;
	}
 
	set renderers(renderers) {
 
		if (renderers !== null && typeof renderers !== 'object') {
			throw new Error('renderers must be an array of objects.');
		}
 
		this._renderers = renderers;
	}
 
	get renderers() {
		return this._renderers;
	}
 
	get order() {
		return this._order;
	}
}
 
export let renderer = new Renderer();