HTML
1 <script> 2 function _assert(desc, v) { 3 if (v) { 4 return; 5 } 6 else { 7 let caller = _assert.caller || 'Top level'; 8 console.error('ASSERT in %s, %s is :', caller, desc, v); 9 } 10 } 11 </script> 12</head> 13<body> 14 firebase signaling for multi-party (trickle ICE)<br /> 15 <button type="button" onclick="startVideo();">Start Video</button> 16 <button type="button" onclick="stopVideo();">Stop Video</button> 17 18 <button type="button" onclick="connect();">Connect</button> 19 <button type="button" onclick="hangUp();">Hang Up</button> 20 21 <a id="room_link" href="" target="_blank">Open another window (link to this room)</a> 22 <a id="mail_link" href="" target="_blank">Mail link of this room</a> 23 <div> 24 <video id="local_video" autoplay style="width: 160px; height: 120px; border: 1px solid black;"></video> 25 </div> 26 <div id="container"> 27 </div> 28 <!-- 29 <p>SDP to send:<br /> 30 <textarea id="text_for_send_sdp" rows="5" cols="60" readonly="readonly">SDP to send</textarea> 31 </p> 32 <p>SDP received: 33 <button type="button" onclick="onSdpText();">Receive remote SDP</button> 34 <br /> 35 <textarea id="text_for_receive_sdp" rows="5" cols="60"></textarea> 36 </p> 37 --> 38</body> 39<script type="text/javascript"> 40 let localVideo = document.getElementById('local_video'); 41 //let remoteVideo = document.getElementById('remote_video'); 42 let localStream = null; 43 //let peerConnection = null; 44 //let textForSendSdp = document.getElementById('text_for_send_sdp'); 45 //let textToReceiveSdp = document.getElementById('text_for_receive_sdp'); 46 47 // ---- for multi party ----- 48 let peerConnections = []; 49 let remoteStreams = []; 50 let remoteVideos = []; 51 const MAX_CONNECTION_COUNT = 3; 52 53 // --- multi video --- 54 let container = document.getElementById('container'); 55 _assert('container', container); 56 57 // --- prefix ----- 58 navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || 59 navigator.mozGetUserMedia || navigator.msGetUserMedia; 60 RTCPeerConnection = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection; 61 RTCSessionDescription = window.RTCSessionDescription || window.webkitRTCSessionDescription || window.mozRTCSessionDescription; 62 63 64 /*--- 65 // ----- use socket.io --- 66 let port = 3002; 67 let socket = io.connect('http://localhost:' + port + '/'); 68 let room = getRoomName(); 69 socket.on('connect', function(evt) { 70 console.log('socket.io connected. enter room=' + room ); 71 socket.emit('enter', room); 72 }); 73 socket.on('message', function(message) { 74 console.log('message:', message); 75 let fromId = message.from; 76 77 if (message.type === 'offer') { 78 // -- got offer --- 79 console.log('Received offer ...'); 80 //let offer = message.sessionDescription; 81 let offer = new RTCSessionDescription(message); 82 setOffer(fromId, offer); 83 } 84 else if (message.type === 'answer') { 85 // --- got answer --- 86 console.log('Received answer ...'); 87 //let answer = message.sessionDescription; 88 let answer = new RTCSessionDescription(message); 89 setAnswer(fromId, answer); 90 } 91 else if (message.type === 'candidate') { 92 // --- got ICE candidate --- 93 console.log('Received ICE candidate ...'); 94 let candidate = new RTCIceCandidate(message.ice); 95 console.log(candidate); 96 addIceCandidate(fromId, candidate); 97 } 98 else if (message.type === 'call me') { 99 if (! isReadyToConnect()) { 100 console.log('Not ready to connect, so ignore'); 101 return; 102 } 103 else if (! canConnectMore()) { 104 console.warn('TOO MANY connections, so ignore'); 105 } 106 107 if (isConnectedWith(fromId)) { 108 // already connnected, so skip 109 console.log('already connected, so ignore'); 110 } 111 else { 112 // connect new party 113 makeOffer(fromId); 114 } 115 } 116 else if (message.type === 'bye') { 117 if (isConnectedWith(fromId)) { 118 stopConnection(fromId); 119 } 120 } 121 }); 122 socket.on('user disconnected', function(evt) { 123 console.log('====user disconnected==== evt:', evt); 124 let id = evt.id; 125 if (isConnectedWith(id)) { 126 stopConnection(id); 127 } 128 }); 129 ---*/ 130 131 // ----- use firebase.io ---- 132 const dataDebugFlag = false; 133 let room = getRoomName(); 134 // Initialize Firebase 135 let config = { 136 apiKey: "AIzaSyByIlgG450k2OlUr9QQhgCIdZudK_NJHb8", // <-- please set your API key 137 databaseURL: "https://test-1f1b0.firebaseio.com/", // <-- please set your database URL 138 }; 139 let databaseRoot = ''; // <--- plaase set your database root for signaling 140 firebase.initializeApp(config); 141 let database = firebase.database(); 142 let roomBroadcastRef; 143 let clientRef; 144 let clientId; 145 146 joinRoom(room); 147 setRoomLink(room); 148 149 function joinRoom(room) { 150 console.log('join room name = ' + room); 151 152 let key = database.ref(databaseRoot + room + '/_join_').push({ joined : 'unknown'}).key 153 clientId = 'member_' + key; 154 console.log('joined to room=' + room + ' as clientId=' + clientId); 155 database.ref(databaseRoot + room + '/_join_/' + key).update({ joined : clientId}); 156 157 158 // remove join object 159 if (! dataDebugFlag) { 160 let jooinRef = database.ref(databaseRoot + room + '/_join_/' + key); 161 jooinRef.remove(); 162 } 163 164 roomBroadcastRef = database.ref(databaseRoot + room + '/_broadcast_'); 165 roomBroadcastRef.on('child_added', function(data) { 166 console.log('roomBroadcastRef.on(data) data.key=' + data.key + ', data.val():', data.val()); 167 let message = data.val(); 168 let fromId = message.from; 169 if (fromId === clientId) { 170 // ignore self message 171 return; 172 } 173 174 if (message.type === 'call me') { 175 if (! isReadyToConnect()) { 176 console.log('Not ready to connect, so ignore'); 177 return; 178 } 179 else if (! canConnectMore()) { 180 console.warn('TOO MANY connections, so ignore'); 181 } 182 183 if (isConnectedWith(fromId)) { 184 // already connnected, so skip 185 console.log('already connected, so ignore'); 186 } 187 else { 188 // connect new party 189 makeOffer(fromId); 190 } 191 } 192 else if (message.type === 'bye') { 193 if (isConnectedWith(fromId)) { 194 stopConnection(fromId); 195 } 196 } 197 }); 198 199 clientRef = database.ref(databaseRoot + room + '/_direct_/' + clientId); 200 clientRef.on('child_added', function(data) { 201 console.log('clientRef.on(data) data.key=' + data.key + ', data.val():', data.val()); 202 let message = data.val(); 203 let fromId = message.from; 204 205 if (message.type === 'offer') { 206 // -- got offer --- 207 console.log('Received offer ... fromId=' + fromId); 208 //let offer = message.sessionDescription; 209 let offer = new RTCSessionDescription(message); 210 setOffer(fromId, offer); 211 } 212 else if (message.type === 'answer') { 213 // --- got answer --- 214 console.log('Received answer ... fromId=' + fromId); 215 //let answer = message.sessionDescription; 216 let answer = new RTCSessionDescription(message); 217 setAnswer(fromId, answer); 218 } 219 else if (message.type === 'candidate') { 220 // --- got ICE candidate --- 221 console.log('Received ICE candidate ... fromId=' + fromId); 222 //let candidate = new RTCIceCandidate(message.ice); 223 let candidate = new RTCIceCandidate(JSON.parse(message.ice)); // <---- JSON 224 console.log(candidate); 225 addIceCandidate(fromId, candidate); 226 } 227 228 if (! dataDebugFlag) { 229 // remove direct message 230 let messageRef = database.ref(databaseRoot + room + '/_direct_/' + clientId + '/' + data.key); 231 messageRef.remove(); 232 } 233 }); 234 } 235 236 function setRoomLink(room) { 237 let url = document.location.href; 238 let anchorLink = document.getElementById('room_link'); 239 anchorLink.href = url; 240 let anchorMail = document.getElementById('mail_link'); 241 let mailtoUrl = 'mailto:?subject=invitation-of-multi-party-videochat&body=' + url; 242 anchorMail.href = mailtoUrl; 243 } 244 // ----- use firebase.io ---- // 245 246 247 // --- broadcast message to all members in room 248 function emitRoom(msg) { 249 //socket.emit('message', msg); 250 msg.from = clientId; 251 roomBroadcastRef.push(msg); 252 } 253 254 function emitTo(id, msg) { 255 //msg.sendto = id; 256 //socket.emit('message', msg); 257 258 console.log('===== sending from=' + clientId + ' , to=' + id); 259 msg.from = clientId; 260 database.ref(databaseRoot + room + '/_direct_/' + id).push(msg); 261 } 262
前提・実現したいこと
firebaseというサービスのhosting機能とリアルタイムデータベースを用いて、webアプリを作成しています。
リアルタイムのチャットとビデオチャットを同一のサイト内で行えるようなアプリを作ることを目的としています。
発生している問題・エラーメッセージ
以前はnode.jsのsocket.ioを使用してローカルでのリアルタイムビデオチャットは作成できたのですが、firebaseのサービスを利用し始めてからはオンラインで成功したことがありません。
まずfirebaseにおいてコマンドプロンプトでinitというコマンドを実行したときにできるpublicフォルダ内のindex.htmlのプログラムの書き換えができなくて困っています。
また、プログラム内でデータベースへのパスをしてもデータベース内にツリーが表示されず、データベースに接続できません。
以上の問題が現在起こっています。
該当のソースコード
HTML JavaSript
現在のソース
試したこと
他のファイルの名前をindex.htmlに書き換え、public内に置いた→自動的に昔のindex内のプログラムに書き換わっていた
データベースに関してはわかりませんでした、、、
補足情報(FW/ツールのバージョンなど)
同じようなアプリを作っている、または作ったことがある方がいらっしゃいましたら、ぜひ情報交換させて頂きたいです。
こちらのコメントか、ツイッターにて連絡よろしくお願い致します。
あなたの回答
tips
プレビュー