質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

WebRTC

WebRTC(Web Real-Time Communication)とは、プラグイン無しでウェブブラウザ間の音声通話・ビデオチャットなどリアルタイムコミュニケーションができるオープンフレームワークです。W3CがAPIレベルで、IETFがプロトコルレベルでそれぞれ標準化が進められています。

Q&A

0回答

465閲覧

Firebaseでのリアルタイムwebアプリについて

koyaGX

総合スコア7

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

WebRTC

WebRTC(Web Real-Time Communication)とは、プラグイン無しでウェブブラウザ間の音声通話・ビデオチャットなどリアルタイムコミュニケーションができるオープンフレームワークです。W3CがAPIレベルで、IETFがプロトコルレベルでそれぞれ標準化が進められています。

1グッド

2クリップ

投稿2019/10/22 07:48

編集2019/10/23 04:57

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 &nbsp; 18 <button type="button" onclick="connect();">Connect</button> 19 <button type="button" onclick="hangUp();">Hang Up</button> 20 &nbsp; 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:&nbsp; 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/ツールのバージョンなど)

同じようなアプリを作っている、または作ったことがある方がいらっしゃいましたら、ぜひ情報交換させて頂きたいです。
こちらのコメントか、ツイッターにて連絡よろしくお願い致します。

退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/22 08:09

まずはコードはMarkdownを使ってください。(使ってくださいというかそっちの方が見やすいです。) 質問をする時に、<code>というのが上の方にあると思います。 宜しくお願いしますm(_ _)m
退会済みユーザー

退会済みユーザー

2019/10/22 08:12

コードを```で囲めばいいんですよ。(^^)
koyaGX

2019/10/22 08:13

すみません。初めて利用したので至らないところがほかにも多数あるかと思います。ご指摘感謝いたします。
退会済みユーザー

退会済みユーザー

2019/10/22 08:13

いえいえ、今後も頑張ってください。
koyaGX

2019/10/22 08:19

文字数制限で全ては公開できませんでしたが、修正しました。ありがとうございます。
退会済みユーザー

退会済みユーザー

2019/10/22 08:21

そうですか。ありがとうございますm(_ _)m
koyaGX

2019/10/22 08:26

大量のソースを公開する方法はありますか?
退会済みユーザー

退会済みユーザー

2019/10/22 08:37

それはないですね。ソース以外の文字数を減らすぐらいしか・・・
koyaGX

2019/10/22 08:38

ありがとうございます。
nakasho_dev

2019/10/22 12:36

全ソースをさらしてよいのであれば、GitHubにリポジトリを作って登録して公開し、そのリンクをここで提示すると良いと思います。その場合はFirebaseの認証キーなどはGitHubへ登録しないように気をつけましょう。
koyaGX

2019/10/23 04:58

ありがとうございます。githabにて、全ソースを公開しました。もしよければご指摘願います...
退会済みユーザー

退会済みユーザー

2019/10/23 05:46

ローカルでsocket.ioで動かしていたものをfirebaseにそのまま移植はできないと思います。 realtime dbを使うのであればそれを利用するコードに書き直さないと動作しません。
退会済みユーザー

退会済みユーザー

2019/10/23 05:47

そのまま移植したいのであればfirebaseのようなBaaSではなくVPSやIaaSの利用が第一選択肢となります。
koyaGX

2019/10/23 05:49

一応コードは書き直しました!しかし、データベースへのパスが通っていないのか、データベースからの返答がありません。databaseRoot変数の中身はどのようにすればよいのでしょうか。
退会済みユーザー

退会済みユーザー

2019/10/23 05:52

返答がないとか動きませんというのはエンジニアの報告ではありません。 具体的な症状・エラーメッセージを発見してそれを記載して下さい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問