mirror of
				https://github.com/ossrs/srs.git
				synced 2025-03-09 15:49:59 +00:00 
			
		
		
		
	String.prototype.substr() is deprecated (see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr) so we replace it with slice() or substring() which work similarily but aren't deprecated. Signed-off-by: Tobias Speicher <rootcommander@gmail.com>
		
			
				
	
	
		
			148 lines
		
	
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			148 lines
		
	
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
 | |
| /**
 | |
|  * The MIT License (MIT)
 | |
|  *
 | |
|  * Copyright (c) 2013-2021 Winlin
 | |
|  *
 | |
|  * Permission is hereby granted, free of charge, to any person obtaining a copy of
 | |
|  * this software and associated documentation files (the "Software"), to deal in
 | |
|  * the Software without restriction, including without limitation the rights to
 | |
|  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 | |
|  * the Software, and to permit persons to whom the Software is furnished to do so,
 | |
|  * subject to the following conditions:
 | |
|  *
 | |
|  * The above copyright notice and this permission notice shall be included in all
 | |
|  * copies or substantial portions of the Software.
 | |
|  *
 | |
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | |
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 | |
|  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 | |
|  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 | |
|  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | |
|  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | |
|  */
 | |
| 
 | |
| 'use strict';
 | |
| 
 | |
| // Async-await-promise based SRS RTC Signaling.
 | |
| function SrsRtcSignalingAsync() {
 | |
|     var self = {};
 | |
| 
 | |
|     // The schema is ws or wss, host is ip or ip:port, display is nickname
 | |
|     // of user to join the room.
 | |
|     self.connect = async function (schema, host, room, display) {
 | |
|         var url = schema + '://' + host + '/sig/v1/rtc';
 | |
|         self.ws = new WebSocket(url + '?room=' + room + '&display=' + display);
 | |
| 
 | |
|         self.ws.onmessage = function(event) {
 | |
|             var r = JSON.parse(event.data);
 | |
|             var promise = self._internals.msgs[r.tid];
 | |
|             if (promise) {
 | |
|                 promise.resolve(r.msg);
 | |
|                 delete self._internals.msgs[r.tid];
 | |
|             } else {
 | |
|                 self.onmessage(r.msg);
 | |
|             }
 | |
|         };
 | |
| 
 | |
|         return new Promise(function (resolve, reject) {
 | |
|             self.ws.onopen = function (event) {
 | |
|                 resolve(event);
 | |
|             };
 | |
| 
 | |
|             self.ws.onerror = function (event) {
 | |
|                 reject(event);
 | |
|             };
 | |
|         });
 | |
|     };
 | |
| 
 | |
|     // The message is a json object.
 | |
|     self.send = async function (message) {
 | |
|         return new Promise(function (resolve, reject) {
 | |
|             var r = {tid: Number(parseInt(new Date().getTime()*Math.random()*100)).toString(16).slice(0, 7), msg: message};
 | |
|             self._internals.msgs[r.tid] = {resolve: resolve, reject: reject};
 | |
|             self.ws.send(JSON.stringify(r));
 | |
|         });
 | |
|     };
 | |
| 
 | |
|     self.close = function () {
 | |
|         self.ws && self.ws.close();
 | |
|         self.ws = null;
 | |
| 
 | |
|         for (const tid in self._internals.msgs) {
 | |
|             var promise = self._internals.msgs[tid];
 | |
|             promise.reject('close');
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     // The callback when got messages from signaling server.
 | |
|     self.onmessage = function (msg) {
 | |
|     };
 | |
| 
 | |
|     self._internals = {
 | |
|         // Key is tid, value is object {resolve, reject, response}.
 | |
|         msgs: {}
 | |
|     };
 | |
| 
 | |
|     return self;
 | |
| }
 | |
| 
 | |
| // Parse params in query string.
 | |
| function SrsRtcSignalingParse(location) {
 | |
|     let query = location.href.split('?')[1];
 | |
|     query = query? '?' + query : null;
 | |
| 
 | |
|     let wsSchema = location.href.split('wss=')[1];
 | |
|     wsSchema = wsSchema? wsSchema.split('&')[0] : (location.protocol === 'http:'? 'ws' : 'wss');
 | |
| 
 | |
|     let wsHost = location.href.split('wsh=')[1];
 | |
|     wsHost = wsHost? wsHost.split('&')[0] : location.hostname;
 | |
| 
 | |
|     let wsPort = location.href.split('wsp=')[1];
 | |
|     wsPort = wsPort? wsPort.split('&')[0] : location.host.split(':')[1];
 | |
| 
 | |
|     let host = location.href.split('host=')[1];
 | |
|     host = host? host.split('&')[0] : location.hostname;
 | |
| 
 | |
|     let room = location.href.split('room=')[1];
 | |
|     room = room? room.split('&')[0] : null;
 | |
| 
 | |
|     let display = location.href.split('display=')[1];
 | |
|     display = display? display.split('&')[0] : Number(parseInt(new Date().getTime()*Math.random()*100)).toString(16).toString(16).slice(0, 7);
 | |
| 
 | |
|     let autostart = location.href.split('autostart=')[1];
 | |
|     autostart = autostart && autostart.split('&')[0] === 'true';
 | |
| 
 | |
|     // Remove data in query.
 | |
|     let rawQuery = query;
 | |
|     if (query) {
 | |
|         query = query.replace('wss=' + wsSchema, '');
 | |
|         query = query.replace('wsh=' + wsHost, '');
 | |
|         query = query.replace('wsp=' + wsPort, '');
 | |
|         query = query.replace('host=' + host, '');
 | |
|         if (room) {
 | |
|             query = query.replace('room=' + room, '');
 | |
|         }
 | |
|         query = query.replace('display=' + display, '');
 | |
|         query = query.replace('autostart=' + autostart, '');
 | |
| 
 | |
|         while (query.indexOf('&&') >= 0) {
 | |
|             query = query.replace('&&', '&');
 | |
|         }
 | |
|         query = query.replace('?&', '?');
 | |
|         if (query.lastIndexOf('?') === query.length - 1) {
 | |
|             query = query.slice(0, query.length - 1);
 | |
|         }
 | |
|         if (query.lastIndexOf('&') === query.length - 1) {
 | |
|             query = query.slice(0, query.length - 1);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // Regenerate the host of websocket.
 | |
|     wsHost = wsPort? wsHost.split(':')[0] + ':' + wsPort : wsHost;
 | |
| 
 | |
|     return {
 | |
|         query: query, rawQuery: rawQuery, wsSchema: wsSchema, wsHost: wsHost, host: host,
 | |
|         room: room, display: display, autostart: autostart,
 | |
|     };
 | |
| }
 |