# panorama/CameraPanorama.js

    import { Panorama } from './Panorama';
    import { Media } from '../media/Media';
    import * as THREE from 'three';

    /**
     * @classdesc Camera panorama
     * @description See {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints|MediaStreamConstraints} for constraints
     * @param {object} - camera constraints
     * @constructor
     */
    function CameraPanorama ( constraints ) {

        const radius = 5000;
        const geometry = new THREE.SphereBufferGeometry( radius, 60, 40 );
        const material = new THREE.MeshBasicMaterial( { visible: false });

        Panorama.call( this, geometry, material );

        this.media = new Media( constraints );
        this.radius = radius;

        this.addEventListener( 'enter', this.start.bind( this ) );
        this.addEventListener( 'leave', this.stop.bind( this ) );
        this.addEventListener( 'panolens-container', this.onPanolensContainer.bind( this ) );
        this.addEventListener( 'panolens-scene', this.onPanolensScene.bind( this ) );

    }

    CameraPanorama.prototype = Object.assign( Object.create( Panorama.prototype ), {

        constructor: CameraPanorama,

        /**
         * On container event
         * @param {object} event
         * @memberOf CameraPanorama
         * @instance
         */
        onPanolensContainer: function ( { container } ) {

            this.media.setContainer( container );

        },

        /**
         * On scene event
         * @param {object} event
         * @memberOf CameraPanorama
         * @instance
         */
        onPanolensScene: function ( { scene } ) {

            this.media.setScene( scene );

        },

        /**
         * Start camera streaming
         * @memberOf CameraPanorama
         * @instance
         * @returns {Promise}
         */
        start: function () {

            return this.media.start();

        },

        /**
         * Stop camera streaming
         * @memberOf CameraPanorama
         * @instance
         */
        stop: function () {

            this.media.stop();

        },

    } );

    export { CameraPanorama };