From fbe7a341972f92ab72cf3054e8b95ac41453c1d1 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Wed, 23 Apr 2014 21:20:44 -0300 Subject: [PATCH 1/6] starting with video sync --- css/main.css | 6 ++ img/satoshi.gif | Bin 0 -> 1465 bytes index.html | 14 +-- js/app.js | 2 + js/models/core/Wallet.js | 11 ++- js/models/network/WebRTC.js | 39 ++++---- js/services/controllerUtils.js | 161 ++++++++++++++++++--------------- js/services/video.js | 52 +++++++++++ 8 files changed, 184 insertions(+), 101 deletions(-) create mode 100644 img/satoshi.gif create mode 100644 js/services/video.js diff --git a/css/main.css b/css/main.css index 6ab5b4587..85da6dc5f 100644 --- a/css/main.css +++ b/css/main.css @@ -277,3 +277,9 @@ button.secondary:hover { background-color: #FFDF00 !important;} border: 2px red solid; } +.video-small { + width: 100px; + height: 100px; + border: 1px solid black; +} + diff --git a/img/satoshi.gif b/img/satoshi.gif new file mode 100644 index 0000000000000000000000000000000000000000..0e5292df5c6de1a0aeeb7efbf056dcaff360ff21 GIT binary patch literal 1465 zcmV;q1xETuNk%v~VPpVg0E7SloSK}(!o;kutkl-jq^6|I&dj{JyyW8Kq@twE%FML3 zwA|j@oSvM-#>BL;wA|XvGJ(yYb1F?*m$l$+m&59qu9h#HDwEG(>?~?*Ux~;#{3r~o==gE|u6Ng= zfNFwwgE)kThKWszT8)KYV~K%Of;NtX0|gP91)2#8ohyioq?eX7eN|6SM{})5n+gE4 zw6(Jg0Ru(5yuG`2bzUXIFT-CX4-F8u%*_Y}5(5jzYt&sluSHREt*Z#l;Nb`bY;V~~ z+fu7jjE`Ci0parC0uRE~_glq_l!5t81?C9^H$dMt6APTA>!uLUxi}04N~Fc0fUk?L zP$VQ|Y>P25A{t1LFtOw;1^@o6>9c~d<*o?dOv*&*vZlIp?g~W^5L2d12_QS}>*(xcMovAmUP`3?A6bhzIJ^5)H0iC71G_79?AH$r7tnKw4j=Rv9F; zjIGkM!oGfV8ka-@t9E5td^(g^8>!|_5D2UkXj-&*d01-!n6b%e2aTq9`>V3$i3%=4 z=2b~NxvWj)UVS z9lHsB>82^q(C10Wd^@jZECaHa-0uDM)Q7*sPc*PqI6hO01gIZKUiqWZ)KQR}Kd%Aj zIfLA^+!71a#UDXkbpBV=fE=N~+kwpJ;$305A%++c;X%mEZ|(i^UQQ-p2O&@iX5qzu zETyI)0J?BRU4XW^^WcgJac3T1j*t-6in9^LyZ%F>LGe= z%w}W)85u&VLX%aRA&&(lDgvknblRz+l9)mV3@RSTnr;0|h?ADN?nq-0qAud6q>#+Y z=ut3KwIWJo{;04lAvKCRs*t=G>#Gvxlp}|dm8uYcnY~4TMoN)HLhQ3>AS)k#5`x-k zs4^^jXrPTUJAtX4M7 zE%$N$gsUByz1Hq?bHBqzecX0<=v#2mb@Uz7-(*sJK;?lwd@0+^X}+1$E+)?SXBGjW z?Z)B)DEY@PBw*##1@RO1*Po@t$|vyK9a70rSqsKvPE08mAhtV?lew zFci?MdIY$>+^sPt&Mgs|8d*O>_>xoPT1Bh|U`#yd>(iF(W3xvrAOQxL--=>&xF)2n zflG>C$lTNn0ida7{%V%O8W8~8agZ4bh+b(XRIwjKfB*+PVJ!$SnAZ`3P9G}3qhu%% z5B_Xjx_ZD4c~}w#C_r7#s$R;5NJNv2EEo|Z1QVMG8c5hLW*gZc6@5au)3s@fOHo5W zvd+M#185P9C2>m#{WV22%AtZd{_kF_vV8iGbL75ov9 TvryyX1SNw*A`*^+2mt^)Czzi5 literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 5da820527..14af669ea 100644 --- a/index.html +++ b/index.html @@ -210,14 +210,13 @@

{{$root.wallet.publicKeyRing.requiredCopayers}} copayers needed for signing transactions -

    -
  • - You - {{copayer}} - - - +
  • + +
@@ -511,6 +510,7 @@ + diff --git a/js/app.js b/js/app.js index 37da74393..f2b50d521 100644 --- a/js/app.js +++ b/js/app.js @@ -15,6 +15,7 @@ var copayApp = window.copayApp = angular.module('copay',[ 'copay.controllerUtils', 'copay.setup', 'copay.directives' + 'copay.video' ]); angular.module('copay.header', []); @@ -28,4 +29,5 @@ angular.module('copay.signin', []); angular.module('copay.setup', []); angular.module('copay.socket', []); angular.module('copay.directives', []); +angular.module('copay.video', []); diff --git a/js/models/core/Wallet.js b/js/models/core/Wallet.js index 95d0c0f98..291c7d36c 100644 --- a/js/models/core/Wallet.js +++ b/js/models/core/Wallet.js @@ -128,6 +128,7 @@ Wallet.prototype._handleNetworkChange = function(newCopayerId) { this.log('#### Setting new PEER:', newCopayerId); this.sendWalletId(newCopayerId); } + this.emit('peer', newPeerId); this.emit('refresh'); }; @@ -175,8 +176,8 @@ Wallet.prototype.netStart = function() { signingKeyHex: self.privateKey.getSigningKey(), }; - net.start(startOpts, function() { - self.emit('created'); + net.start(function() { + self.emit('created', net.getPeer()); for (var i=0; i Date: Wed, 23 Apr 2014 21:26:41 -0300 Subject: [PATCH 2/6] fix ANGULAR JS PROBLEMMMAADKSKDLALS:DKA:LSDA --- js/services/controllerUtils.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/services/controllerUtils.js b/js/services/controllerUtils.js index da3c224dc..ddb106182 100644 --- a/js/services/controllerUtils.js +++ b/js/services/controllerUtils.js @@ -5,7 +5,7 @@ angular.module('copay.controllerUtils') var root = {}; $rootScope.videoSrc = {}; $rootScope.getVideoURL = function(copayer) { - return decodeURIComponent($rootScope.videoSrc[copayer]); + return $sce.trustAsResourceUrl(decodeURI($rootScope.videoSrc[copayer])); }; root.logout = function() { @@ -36,7 +36,7 @@ angular.module('copay.controllerUtils') root.onErrorDigest(err); } $sce.trustAsResourceUrl(url); - $rootScope.videoSrc[peerID] = encodeURIComponent(url); + $rootScope.videoSrc[peerID] = encodeURI(url); $rootScope.$apply(); }; w.on('badMessage', function(peerId) { From f5b8aa7c6131eb65bed0b3b87d551bb623c15908 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Thu, 24 Apr 2014 16:07:49 -0300 Subject: [PATCH 3/6] self video working --- js/models/core/Wallet.js | 23 +++++++++++---- js/models/network/WebRTC.js | 7 +++++ js/services/controllerUtils.js | 9 +++--- js/services/video.js | 51 +++++++++++++++++++++++----------- 4 files changed, 64 insertions(+), 26 deletions(-) diff --git a/js/models/core/Wallet.js b/js/models/core/Wallet.js index 291c7d36c..4615666f3 100644 --- a/js/models/core/Wallet.js +++ b/js/models/core/Wallet.js @@ -127,8 +127,8 @@ Wallet.prototype._handleNetworkChange = function(newCopayerId) { if (newCopayerId) { this.log('#### Setting new PEER:', newCopayerId); this.sendWalletId(newCopayerId); + this.emit('peer', newCopayerId); } - this.emit('peer', newPeerId); this.emit('refresh'); }; @@ -178,10 +178,11 @@ Wallet.prototype.netStart = function() { net.start(function() { self.emit('created', net.getPeer()); - for (var i=0; i Date: Thu, 24 Apr 2014 18:24:03 -0300 Subject: [PATCH 4/6] video works both ways!! --- js/services/controllerUtils.js | 8 ++++++-- js/services/video.js | 16 ++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/js/services/controllerUtils.js b/js/services/controllerUtils.js index 8ca9836eb..45920abc7 100644 --- a/js/services/controllerUtils.js +++ b/js/services/controllerUtils.js @@ -5,7 +5,11 @@ angular.module('copay.controllerUtils') var root = {}; $rootScope.videoSrc = {}; $rootScope.getVideoURL = function(copayer) { - return $sce.trustAsResourceUrl(decodeURI($rootScope.videoSrc[copayer])); + var encoded = $rootScope.videoSrc[copayer]; + if (!encoded) return; + var url = decodeURI(encoded); + var trusted = $sce.trustAsResourceUrl(url); + return trusted; }; root.logout = function() { @@ -34,8 +38,8 @@ angular.module('copay.controllerUtils') var handlePeerVideo = function(err, peerID, url) { if (err) { root.onErrorDigest(err); + return; } - alert('add this video url='+url+' for peer '+peerID); $rootScope.videoSrc[peerID] = encodeURI(url); $rootScope.$apply(); }; diff --git a/js/services/video.js b/js/services/video.js index d70ce87bf..532dc9a1e 100644 --- a/js/services/video.js +++ b/js/services/video.js @@ -4,6 +4,8 @@ var Video = function() { navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia; + + this.mediaConnections = {}; }; Video.prototype.setOwnPeer = function(peer, wallet, cb) { @@ -16,12 +18,13 @@ Video.prototype.setOwnPeer = function(peer, wallet, cb) { // This is called when user accepts using webcam self.localStream = stream; var online = wallet.getOnlinePeerIDs(); - for (var i=0; i Date: Thu, 24 Apr 2014 18:59:24 -0300 Subject: [PATCH 5/6] fix merge --- js/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/app.js b/js/app.js index f2b50d521..bcfce8f2c 100644 --- a/js/app.js +++ b/js/app.js @@ -14,7 +14,7 @@ var copayApp = window.copayApp = angular.module('copay',[ 'copay.socket', 'copay.controllerUtils', 'copay.setup', - 'copay.directives' + 'copay.directives', 'copay.video' ]); From aa021125a04af82fb2f23ce27a29e30b065e15c6 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Thu, 24 Apr 2014 20:56:36 -0300 Subject: [PATCH 6/6] fix style issues --- css/main.css | 15 ++- index.html | 33 ++++-- js/models/core/Wallet.js | 193 +++++++++++++++++---------------- js/services/controllerUtils.js | 1 - js/services/video.js | 1 + 5 files changed, 133 insertions(+), 110 deletions(-) diff --git a/css/main.css b/css/main.css index 85da6dc5f..63daa034c 100644 --- a/css/main.css +++ b/css/main.css @@ -278,8 +278,17 @@ button.secondary:hover { background-color: #FFDF00 !important;} } .video-small { - width: 100px; - height: 100px; - border: 1px solid black; + width: 120px; + height: 120px; + margin: 20px; + display: inline; + float:left; +} +.online { + border: 10px solid green; +} +.offline { + border: 10px solid gray; } + diff --git a/index.html b/index.html index 14af669ea..d40fd375a 100644 --- a/index.html +++ b/index.html @@ -205,20 +205,29 @@ diff --git a/js/models/core/Wallet.js b/js/models/core/Wallet.js index 4615666f3..9a6586840 100644 --- a/js/models/core/Wallet.js +++ b/js/models/core/Wallet.js @@ -1,14 +1,14 @@ 'use strict'; -var imports = require('soop').imports(); +var imports = require('soop').imports(); -var bitcore = require('bitcore'); -var coinUtil = bitcore.util; +var bitcore = require('bitcore'); +var coinUtil = bitcore.util; var buffertools = bitcore.buffertools; -var Builder = bitcore.TransactionBuilder; -var http = require('http'); -var EventEmitter= imports.EventEmitter || require('events').EventEmitter; -var copay = copay || require('../../../copay'); +var Builder = bitcore.TransactionBuilder; +var http = require('http'); +var EventEmitter = imports.EventEmitter || require('events').EventEmitter; +var copay = copay || require('../../../copay'); function Wallet(opts) { var self = this; @@ -17,12 +17,12 @@ function Wallet(opts) { ['storage', 'network', 'blockchain', 'requiredCopayers', 'totalCopayers', 'spendUnconfirmed', 'publicKeyRing', 'txProposals', 'privateKey' - ].forEach( function(k){ + ].forEach(function(k) { if (typeof opts[k] === 'undefined') throw new Error('missing key:' + k); self[k] = opts[k]; }); - this.log('creating '+opts.requiredCopayers+' of '+opts.totalCopayers+' wallet'); + this.log('creating ' + opts.requiredCopayers + ' of ' + opts.totalCopayers + ' wallet'); this.id = opts.id || Wallet.getRandomId(); this.name = opts.name; @@ -32,11 +32,11 @@ function Wallet(opts) { } -Wallet.parent=EventEmitter; -Wallet.prototype.log = function(){ +Wallet.parent = EventEmitter; +Wallet.prototype.log = function() { if (!this.verbose) return; if (console) - console.log.apply(console, arguments); + console.log.apply(console, arguments); }; Wallet.getRandomId = function() { @@ -45,14 +45,14 @@ Wallet.getRandomId = function() { }; Wallet.prototype._handlePublicKeyRing = function(senderId, data, isInbound) { - this.log('RECV PUBLICKEYRING:',data); + this.log('RECV PUBLICKEYRING:', data); var shouldSend = false; var recipients, pkr = this.publicKeyRing; var inPKR = copay.PublicKeyRing.fromObj(data.publicKeyRing); var hasChanged = pkr.merge(inPKR, true); - if (hasChanged) { + if (hasChanged) { this.log('### BROADCASTING PKR'); recipients = null; shouldSend = true; @@ -72,15 +72,15 @@ Wallet.prototype._handlePublicKeyRing = function(senderId, data, isInbound) { Wallet.prototype._handleTxProposals = function(senderId, data, isInbound) { - this.log('RECV TXPROPOSAL:',data); //TODO + this.log('RECV TXPROPOSAL:', data); //TODO var shouldSend = false; var recipients; var inTxp = copay.TxProposals.fromObj(data.txProposals); var mergeInfo = this.txProposals.merge(inTxp, true); var addSeen = this.addSeenToTxProposals(); - if (mergeInfo.hasChanged || addSeen) { - this.log('### BROADCASTING txProposals. ' ); + if (mergeInfo.hasChanged || addSeen) { + this.log('### BROADCASTING txProposals. '); recipients = null; shouldSend = true; } @@ -91,21 +91,21 @@ Wallet.prototype._handleTxProposals = function(senderId, data, isInbound) { // shouldSend = true; // } - if (shouldSend) + if (shouldSend) this.sendTxProposals(recipients); - + this.store(); }; Wallet.prototype._handleData = function(senderId, data, isInbound) { // TODO check message signature if (this.id !== data.walletId) { - this.emit('badMessage',senderId); + this.emit('badMessage', senderId); this.log('badMessage FROM:', senderId); //TODO return; } - this.log('[Wallet.js.98]' , data.type); //TODO - switch(data.type) { + this.log('[Wallet.js.98]', data.type); //TODO + switch (data.type) { // This handler is repeaded on WalletFactory (#join). TODO case 'walletId': this.sendWalletReady(senderId); @@ -116,10 +116,10 @@ Wallet.prototype._handleData = function(senderId, data, isInbound) { break; case 'publicKeyRing': this._handlePublicKeyRing(senderId, data, isInbound); - break; + break; case 'txProposals': this._handleTxProposals(senderId, data, isInbound); - break; + break; } }; @@ -127,13 +127,13 @@ Wallet.prototype._handleNetworkChange = function(newCopayerId) { if (newCopayerId) { this.log('#### Setting new PEER:', newCopayerId); this.sendWalletId(newCopayerId); - this.emit('peer', newCopayerId); + this.emit('peer', this.network.peerFromCopayer(newCopayerId)); } this.emit('refresh'); }; -Wallet.prototype._optsToObj = function () { +Wallet.prototype._optsToObj = function() { var obj = { id: this.id, spendUnconfirmed: this.spendUnconfirmed, @@ -159,9 +159,9 @@ Wallet.prototype.netStart = function() { var self = this; var net = this.network; net.removeAllListeners(); - net.on('networkChange', self._handleNetworkChange.bind(self) ); - net.on('data', self._handleData.bind(self) ); - net.on('open', function() {}); // TODO + net.on('networkChange', self._handleNetworkChange.bind(self)); + net.on('data', self._handleData.bind(self)); + net.on('open', function() {}); // TODO net.on('openError', function() { self.log('[Wallet.js.132:openError:] GOT openError'); //TODO self.emit('openError'); @@ -171,24 +171,24 @@ Wallet.prototype.netStart = function() { }); var myId = self.getMyCopayerId(); - var startOpts = { + var startOpts = { copayerId: myId, signingKeyHex: self.privateKey.getSigningKey(), }; - net.start(function() { + net.start(startOpts, function() { self.emit('created', net.getPeer()); var registered = self.getRegisteredPeerIds(); - for (var i=0; i before) { + if (b.signaturesAdded > before) { txp.signedBy[myId] = Date.now(); this.sendTxProposals(); this.store(true); @@ -353,12 +354,12 @@ Wallet.prototype.sendTx = function(ntxid, cb) { this.log('[Wallet.js.231] BROADCASTING TX!!!'); //TODO var txHex = tx.serialize().toString('hex'); - this.log('[Wallet.js.261:txHex:]',txHex); //TODO + this.log('[Wallet.js.261:txHex:]', txHex); //TODO var self = this; this.blockchain.sendRawTransaction(txHex, function(txid) { - self.log('BITCOND txid:',txid); //TODO + self.log('BITCOND txid:', txid); //TODO if (txid) { self.txProposals.setSent(ntxid, txid); } @@ -369,10 +370,10 @@ Wallet.prototype.sendTx = function(ntxid, cb) { }; Wallet.prototype.addSeenToTxProposals = function() { - var ret=false; - var myId=this.getMyCopayerId(); + var ret = false; + var myId = this.getMyCopayerId(); - for(var k in this.txProposals.txps) { + for (var k in this.txProposals.txps) { var txp = this.txProposals.txps[k]; if (!txp.seenBy[myId]) { @@ -400,9 +401,9 @@ Wallet.prototype.addressIsOwn = function(addrStr) { var l = addrList.length; var ret = false; - for(var i=0; i