123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- <script src="../../../bower_components/peerjs/peer.min.js"></script>
- <dom-module id="p2p-network">
- <template>
- </template>
- <script>
- 'use strict';
- Polymer({
- is: 'p2p-network',
- properties: {
- me: {
- type: String,
- notify: true,
- }
- },
- attached: function() {
- this._connectedPeers = {};
- this._initCallbacks = [];
- this._unsendMsgs = {};
- window.onunload = window.onbeforeunload = function() {
- if (!!this._peer && !this._peer.destroyed) {
- this._peer.destroy();
- }
- }.bind(this);
- this._initialize();
- },
- _initialize: function() {
- var options = {
- host: 'yawim.com',
- port: 443,
- path: 'peerjs',
- secure: true
- };
- this._peer = new Peer(options);
- this._peer.on('open', function(id) {
- console.log('My peer ID is: ' + id);
- this.set('me', id);
- this._peerOpen = true;
- this._initCallbacks.forEach(function(cb) {
- cb();
- });
- }.bind(this));
- this._peer.on('connection', this.connect.bind(this));
- this._peer.on('error', function(err) {
- console.error(err);
- //ugly hack to find out error type
- if (err.message.indexOf('Could not connect to peer') > -1) {
- delete this._connectedPeers[this.peer];
- this.set('peer', 'error');
- return;
- }
- if (err.message.indexOf('Lost connection to server') > -1) {
- this._peer.destroy();
- this.set('me', this.me);
- this._initialize();
- return;
- }
- }.bind(this));
- },
- connect: function(c) {
- var peer = c.peer;
- if (c.label === 'file') {
- c.on('data', function(data) {
- console.log('received!', data);
- this.fire('file-received', {
- peer: peer,
- dataURI: data.dataURI,
- name: data.name,
- });
- }.bind(this));
- }
- },
- connectToPeer: (function() {
- function request(requestedPeer, callback) {
- return function() {
- var f = this._peer.connect(requestedPeer, {
- label: 'file',
- reliable: true
- });
- f.on('open', function() {
- this.connect(f);
- if (callback) {
- callback();
- }
- }.bind(this));
- f.on('error', function(err) {
- console.log(err);
- });
- };
- }
- return function(requestedPeer, callback) {
- if (this._peer.connections[requestedPeer]) {
- callback();
- return;
- }
- this.set('loading', true);
- if (this._peerOpen) {
- request(requestedPeer, callback).bind(this)();
- } else {
- this._initCallbacks.push(request(requestedPeer, callback).bind(this));
- }
- };
- }()),
- sendFile: function(peerId, file) {
- var conns = this._peer.connections[peerId];
- if (conns) {
- conns.forEach(function(conn) {
- if (conn.label === 'file') {
- conn.send(file);
- console.log('file send');
- }
- });
- }
- }
- });
- </script>
- </dom-module>
|