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,
 | 
						|
    };
 | 
						|
}
 |