103 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			HTML
		
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			HTML
		
	
	
	
<link rel="import" href="binaryjs.html">
 | 
						|
<dom-module id="web-socket">
 | 
						|
    <template>
 | 
						|
        <style>
 | 
						|
        :host {
 | 
						|
            display: block;
 | 
						|
        }
 | 
						|
        </style>
 | 
						|
    </template>
 | 
						|
    <script>
 | 
						|
    'use strict';
 | 
						|
    window.isActive = true;
 | 
						|
 | 
						|
    window.onfocus = function() {
 | 
						|
        window.isActive = true;
 | 
						|
    };
 | 
						|
 | 
						|
    window.onblur = function() {
 | 
						|
        window.isActive = false;
 | 
						|
    };
 | 
						|
 | 
						|
    Polymer({
 | 
						|
        is: 'web-socket',
 | 
						|
        attached: function() {
 | 
						|
            this.init();
 | 
						|
        },
 | 
						|
        init: function() {
 | 
						|
            if (window.isActive) {
 | 
						|
                clearInterval(this.reconnectTimer);
 | 
						|
                this.reconnectTimer = undefined;
 | 
						|
                var websocketUrl = (window.debug ? 'ws://' + window.location.hostname + ':3002' : 'wss://snapdrop.net') + '/binary';
 | 
						|
                this.client = new BinaryClient(websocketUrl);
 | 
						|
                this.client.on('stream', function(stream, meta) {
 | 
						|
                    // collect stream data
 | 
						|
                    var parts = [];
 | 
						|
                    stream.on('data', function(data) {
 | 
						|
                        //console.log('part received', meta, data);
 | 
						|
                        if (data.isSystemEvent) {
 | 
						|
                            if (meta) {
 | 
						|
                                data.from = meta.from;
 | 
						|
                            }
 | 
						|
                            this.fire('system-event', data);
 | 
						|
                        } else {
 | 
						|
                            parts.push(data);
 | 
						|
                        }
 | 
						|
                    }.bind(this));
 | 
						|
                    // when finished, set it as the background image
 | 
						|
                    stream.on('end', function() {
 | 
						|
                        var blob = new Blob(parts, {
 | 
						|
                            type: meta.type
 | 
						|
                        });
 | 
						|
                        console.log('file received', blob, meta);
 | 
						|
                        this.fire('file-received', {
 | 
						|
                            blob: blob,
 | 
						|
                            name: meta.name,
 | 
						|
                            from: meta.from
 | 
						|
                        });
 | 
						|
                    }.bind(this));
 | 
						|
                }.bind(this));
 | 
						|
                this.client.on('open', function(e) {
 | 
						|
                    console.log(e);
 | 
						|
                    this.client.send({}, {
 | 
						|
                        serverMsg: 'rtc-support',
 | 
						|
                        rtc: window.webRTCSupported
 | 
						|
                    });
 | 
						|
                }.bind(this));
 | 
						|
                this.client.on('error', function(e) {
 | 
						|
                    this._reconnect(e);
 | 
						|
                }.bind(this));
 | 
						|
                this.client.on('close', function(e) {
 | 
						|
                    this._reconnect(e);
 | 
						|
                }.bind(this));
 | 
						|
            }
 | 
						|
        },
 | 
						|
        _sendFile: function(toPeer, file) {
 | 
						|
            console.log('send file via WebSocket', file);
 | 
						|
            this.client.send(file.file, {
 | 
						|
                name: file.file.name,
 | 
						|
                type: file.file.type,
 | 
						|
                toPeer: toPeer
 | 
						|
            });
 | 
						|
        },
 | 
						|
        connectToPeer: function(peer, callback) {
 | 
						|
            callback();
 | 
						|
        },
 | 
						|
        _sendSystemEvent: function(toPeer, event) {
 | 
						|
            console.log('system event', toPeer, event);
 | 
						|
            event.isSystemEvent = true;
 | 
						|
            this.client.send(event, {
 | 
						|
                toPeer: toPeer
 | 
						|
            });
 | 
						|
        },
 | 
						|
        _reconnect: function(e) {
 | 
						|
            console.log('disconnected', e);
 | 
						|
            //try to reconnect after 3s 
 | 
						|
            if (!this.reconnectTimer) {
 | 
						|
                this.reconnectTimer = setInterval(this.init.bind(this), 3000);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    });
 | 
						|
    </script>
 | 
						|
</dom-module>
 |