���� JFIF �� � ( %"1"%)+...383,7(-.-
![]() Server : Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.4.20 System : Linux st2.domain.com 3.10.0-1127.10.1.el7.x86_64 #1 SMP Wed Jun 3 14:28:03 UTC 2020 x86_64 User : apache ( 48) PHP Version : 7.4.20 Disable Function : NONE Directory : /proc/self/root/usr/local/FlashphonerWebCallServer/client2/doc/ |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>JSDoc: Source: room-module.js</title> <script src="scripts/prettify/prettify.js"> </script> <script src="scripts/prettify/lang-css.js"> </script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> </head> <body> <div id="main"> <h1 class="page-title">Source: room-module.js</h1> <section> <article> <pre class="prettyprint source linenums"><code>'use strict'; var SESSION_STATUS = require('./constants').SESSION_STATUS; var STREAM_STATUS = require('./constants').STREAM_STATUS; var Promise = require('promise-polyfill'); var util = require('./util'); var uuid_v1 = require('uuid/v1'); var ROOM_REST_APP = "roomApp"; /** * Room api based on core api * * @namespace roomApi */ /** * Initialize connection * * @param {Object} options session options * @param {String} options.urlServer Server address in form of [ws,wss]://host.domain:port * @param {String} options.username Username to login with * @returns {roomApi.Session} * @memberof roomApi * @method connect */ var appSession = function (options) { /** * Represents connection to room api app * * @namespace roomApi.Session */ var callbacks = {}; var rooms = {}; var username_ = options.username; var exports; var roomHandlers = {}; var session = Flashphoner.createSession({ urlServer: options.urlServer, mediaOptions: options.mediaOptions, appKey: (options.appKey && options.appKey.length != 0) ? options.appKey : ROOM_REST_APP, custom: { login: options.username, token: options.token } }).on(SESSION_STATUS.ESTABLISHED, function (session) { if (callbacks[session.status()]) { callbacks[session.status()](exports); } }).on(SESSION_STATUS.APP_DATA, function (data) { var payload = data.payload; if (!payload || !payload.roomName) { console.error("Received app data does not contain 'payload' or 'payload.roomName' field. Received data: " + JSON.stringify(data)); return; } var roomName = payload.roomName; if (roomHandlers[roomName]) { roomHandlers[roomName](payload); } else { console.warn("Failed to find room with name " + roomName); } }).on(SESSION_STATUS.DISCONNECTED, sessionDied).on(SESSION_STATUS.FAILED, sessionDied); //teardown helper function sessionDied(session) { if (callbacks[session.status()]) { callbacks[session.status()](exports); } } /** * Disconnect session * * @memberof roomApi.Session * @inner */ var disconnect = function () { session.disconnect(); }; /** * Get session status * * @returns {string} One of {@link Flashphoner.constants.SESSION_STATUS} * @memberof roomApi.Session * @inner */ var status = function () { return session.status(); }; /** * Get session id * * @returns {string} session id * @memberof roomApi.Session * @inner */ var id = function () { return session.id(); }; /** * Get server address * * @returns {string} Server url * @memberof roomApi.Session * @inner */ var getServerUrl = function () { return session.getServerUrl(); }; /** * Get session username * * @returns {string} username * @memberof roomApi.Session * @inner */ var username = function () { return username_; }; /** * Get rooms * * @returns {roomApi.Room[]} * @memberof roomApi.Session * @inner */ var getRooms = function () { return util.copyObjectToArray(rooms); }; /** * Add session event callback. * * @param {string} event One of {@link Flashphoner.constants.SESSION_STATUS} events * @param {Session~eventCallback} callback Callback function * @returns {roomApi.Session} Session * @throws {TypeError} Error if event is not specified * @throws {Error} Error if callback is not a valid function * @memberof roomApi.Session * @inner */ var on = function (event, callback) { if (!event) { throw new Error("Event can't be null", "TypeError"); } if (!callback || typeof callback !== 'function') { throw new Error("Callback needs to be a valid function"); } callbacks[event] = callback; return exports; }; /** * Join room * * @param {Object} options Room options * @param {String} options.name Room name * @returns {roomApi.Room} * @memberof roomApi.Session * @inner */ var join = function (options) { /** * Room * * @namespace roomApi.Room */ var room = {}; var name_ = options.name; var participants = {}; var callbacks = {}; var stateStreams = {}; roomHandlers[name_] = function (data) { /** * Room participant * * @namespace roomApi.Room.Participant */ var participant; if (data.name == "STATE") { if (data.info) { for (var i = 0; i < data.info.length; i++) { participantFromState(data.info[i]); } stateStreams = {}; } if (callbacks["STATE"]) { callbacks["STATE"](room); } } else if (data.name == "JOINED") { participants[data.info] = { streams: {}, name: function () { return data.info; }, sendMessage: attachSendMessage(data.info), getStreams: function () { return util.copyObjectToArray(this.streams); } }; if (callbacks["JOINED"]) { callbacks["JOINED"](participants[data.info]); } } else if (data.name == "LEFT") { participant = participants[data.info]; delete participants[data.info]; if (callbacks["LEFT"]) { callbacks["LEFT"](participant); } } else if (data.name == "PUBLISHED") { participant = participants[data.info.login]; participant.streams[data.info.name] = { play: play(data.info.name), stop: stop(data.info.name), id: id(data.info.name), streamName: function () { return data.info.name } }; if (callbacks["PUBLISHED"]) { callbacks["PUBLISHED"](participant); } } else if (data.name == "FAILED" || data.name == "UNPUBLISHED") { participant = participants[data.info.login]; if (participant != null) delete participant.streams[data.info.name]; } else if (data.name == "MESSAGE") { if (callbacks["MESSAGE"]) { callbacks["MESSAGE"]({ from: participants[data.info.from], text: data.info.text }); } } }; //participant creation helper function participantFromState(state) { var participant = {}; if (state.hasOwnProperty("login")) { var login = state.login; var streamName = state.name; stateStreams[streamName] = { /** * Play participant stream * * @param {HTMLElement} display Div element stream should be displayed in * @returns {Stream} Local stream object * @memberof roomApi.Room.Participant.Stream * @inner */ play: play(streamName), /** * Stop participant stream * * @memberof roomApi.Room.Participant.Stream * @inner */ stop: stop(streamName), /** * Get participant stream id * * @returns {String} Stream id * @memberof roomApi.Room.Participant.Stream * @inner */ id: id(streamName), /** * Get participant stream name * * @returns {String} Stream name * @memberof roomApi.Room.Participant.Stream * @inner */ streamName: function () { return streamName } }; if (participants[login] != null) { participant = participants[login]; } else { participant = { streams: {}, /** * Get participant name * * @returns {String} Participant name * @memberof roomApi.Room.Participant * @inner */ name: function () { return login; }, /** * Send message to participant * * @param {String} message Message to send * @param {Function} error Error callback * @memberof roomApi.Room.Participant * @inner */ sendMessage: attachSendMessage(login), /** * Get participant streams * * @returns {Array<roomApi.Room.Participant.Stream>} Streams * @memberof roomApi.Room.Participant * @inner */ getStreams: function () { return util.copyObjectToArray(this.streams); } }; participants[participant.name()] = participant; } /** * Room participant * * @namespace roomApi.Room.Participant.Stream */ } else { participant = { streams: {}, name: function () { return state; }, sendMessage: attachSendMessage(state), getStreams: function () { return util.copyObjectToArray(this.streams); } } } if (Object.keys(stateStreams).length != 0) { for (var k in stateStreams) { if (stateStreams.hasOwnProperty(k)) { participant.streams[k] = stateStreams[k]; delete stateStreams[k]; } } } participants[participant.name()] = participant; return participant; } /** * Get room name * * @returns {String} Room name * @memberof roomApi.Room * @inner */ var name = function () { return name_; }; /** * Leave room * * @returns {Promise<room>} * @memberof roomApi.Room * @inner */ var leave = function () { return new Promise(function (resolve, reject) { sendAppCommand("leave", {name: name_}).then(function () { cleanUp(); resolve(room); }, function () { cleanUp(); reject(room); }); function cleanUp() { //clear streams var streams = session.getStreams(); for (var i = 0; i < streams.length; i++) { if (streams[i].name().indexOf(name_ + "-" + username_) !== -1 && streams[i].status() != STREAM_STATUS.UNPUBLISHED) { streams[i].stop(); } else if (streams[i].name().indexOf(name_) !== -1 && streams[i].status() != STREAM_STATUS.STOPPED) { streams[i].stop(); } } delete roomHandlers[name_]; delete rooms[name_]; } }); }; /** * Publish stream inside room * * @param {Object} options Stream options * @param {string=} options.name Stream name * @param {Object=} options.constraints Stream constraints * @param {Boolean=} options.record Enable stream recording * @param {Boolean=} options.cacheLocalResources Display will contain local video after stream release * @param {HTMLElement} options.display Div element stream should be displayed in * @returns {Stream} * @memberof roomApi.Room * @inner */ var publish = function (options) { options.name = (options.name) ? (name_ + "-" + username_ + "-" + uuid_v1().substr(0, 4) + "-" + options.name) : (name_ + "-" + username_ + "-" + uuid_v1().substr(0, 4)); options.cacheLocalResources = (typeof options.cacheLocalResources === "boolean") ? options.cacheLocalResources : true; options.custom = {name: name_}; var stream = session.createStream(options); stream.publish(); return stream; }; /** * Add room event callback. * * @param {string} event One of {@link roomApi.events} events * @param {roomApi.Room~eventCallback} callback Callback function * @returns {roomApi.Room} room * @throws {TypeError} Error if event is not specified * @throws {Error} Error if callback is not a valid function * @memberof roomApi.Room * @inner */ var on = function (event, callback) { if (!event) { throw new Error("Event can't be null", "TypeError"); } if (!callback || typeof callback !== 'function') { throw new Error("Callback needs to be a valid function"); } callbacks[event] = callback; return room; }; /** * Get participants * * @returns {roomApi.Room.Participant} * @memberof roomApi.Room * @inner */ var getParticipants = function () { return util.copyObjectToArray(participants); }; //participant helpers function play(streamName) { return function (display) { var stream = session.createStream({name: streamName, display: display, custom: {name: name_}}); stream.play(); return stream; } } function stop(streamName) { return function () { var streams = session.getStreams(); for (var i = 0; i < streams.length; i++) { if (streams[i].name() == streamName && streams[i].status() != STREAM_STATUS.UNPUBLISHED) { streams[i].stop(); } } } } function id(streamName) { return function () { var streams = session.getStreams(); for (var i = 0; i < streams.length; i++) { if (streams[i].name() == streamName) return streams[i].id(); } } } function attachSendMessage(recipientName) { return function (text, error) { var message = { roomConfig: { name: name_ }, to: recipientName, text: text }; sendAppCommand("sendMessage", message).then(function () { }, function () { if (error) { error(); } }); } } //sendData helper function sendAppCommand(commandName, data) { var command = { command: commandName, options: data }; return session.sendData(command); } sendAppCommand("join", {name: name_}).then(function () { }, function (info) { if (callbacks["FAILED"]) { callbacks["FAILED"](room, info.info); } }); room.name = name; room.leave = leave; room.publish = publish; room.getParticipants = getParticipants; room.on = on; rooms[name_] = room; return room; }; exports = { disconnect: disconnect, id: id, getServerUrl: getServerUrl, username: username, status: status, getRooms: getRooms, join: join, on: on }; return exports; }; var events = { STATE: "STATE", JOINED: "JOINED", LEFT: "LEFT", PUBLISHED: "PUBLISHED", MESSAGE: "MESSAGE", FAILED: "FAILED" }; module.exports = { connect: appSession, events: events }; </code></pre> </article> </section> </div> <nav> <h2><a href="index.html">Web SDK</a></h2><h3>Events</h3><ul><li><a href="Flashphoner.constants.CALL_STATUS_INFO.html#.event:FAILED_BY_DTLS_ERROR">FAILED_BY_DTLS_ERROR</a></li><li><a href="Flashphoner.constants.CALL_STATUS_INFO.html#.event:FAILED_BY_DTLS_FINGERPRINT_ERROR">FAILED_BY_DTLS_FINGERPRINT_ERROR</a></li><li><a href="Flashphoner.constants.CALL_STATUS_INFO.html#.event:FAILED_BY_ERROR">FAILED_BY_ERROR</a></li><li><a href="Flashphoner.constants.CALL_STATUS_INFO.html#.event:FAILED_BY_ICE_ERROR">FAILED_BY_ICE_ERROR</a></li><li><a href="Flashphoner.constants.CALL_STATUS_INFO.html#.event:FAILED_BY_REQUEST_TIMEOUT">FAILED_BY_REQUEST_TIMEOUT</a></li><li><a href="Flashphoner.constants.CALL_STATUS_INFO.html#.event:FAILED_BY_RTMP_WRITER_ERROR">FAILED_BY_RTMP_WRITER_ERROR</a></li><li><a href="Flashphoner.constants.CALL_STATUS_INFO.html#.event:FAILED_BY_RTP_ACTIVITY">FAILED_BY_RTP_ACTIVITY</a></li><li><a href="Flashphoner.constants.CALL_STATUS_INFO.html#.event:FAILED_BY_SESSION_CREATION">FAILED_BY_SESSION_CREATION</a></li><li><a href="Flashphoner.constants.CALL_STATUS_INFO.html#.event:NO_COMMON_CODECS">NO_COMMON_CODECS</a></li><li><a href="Flashphoner.constants.CALL_STATUS_INFO.html#.event:NORMAL_CALL_CLEARING">NORMAL_CALL_CLEARING</a></li><li><a href="Flashphoner.constants.CALL_STATUS_INFO.html#.event:TRANSCODING_REQUIRED_BUT_DISABLED">TRANSCODING_REQUIRED_BUT_DISABLED</a></li><li><a href="Flashphoner.constants.ERROR_INFO.html#.event:CALLBACK_NEEDS_TO_BE_A_VALID_FUNCTION">CALLBACK_NEEDS_TO_BE_A_VALID_FUNCTION</a></li><li><a href="Flashphoner.constants.ERROR_INFO.html#.event:CAN_NOT_SWITCH_CAM">CAN_NOT_SWITCH_CAM</a></li><li><a href="Flashphoner.constants.ERROR_INFO.html#.event:CAN_NOT_SWITCH_MIC">CAN_NOT_SWITCH_MIC</a></li><li><a href="Flashphoner.constants.ERROR_INFO.html#.event:EVENT_CANT_BE_NULL">EVENT_CANT_BE_NULL</a></li><li><a href="Flashphoner.constants.ERROR_INFO.html#.event:FLASHPHONER_API_NOT_INITIALIZED">FLASHPHONER_API_NOT_INITIALIZED</a></li><li><a href="Flashphoner.constants.ERROR_INFO.html#.event:INVALID_CALL_STATE">INVALID_CALL_STATE</a></li><li><a href="Flashphoner.constants.ERROR_INFO.html#.event:INVALID_SESSION_STATE">INVALID_SESSION_STATE</a></li><li><a href="Flashphoner.constants.ERROR_INFO.html#.event:NONE_OF_MEDIAPROVIDERS_AVAILABLE">NONE_OF_MEDIAPROVIDERS_AVAILABLE</a></li><li><a href="Flashphoner.constants.ERROR_INFO.html#.event:NONE_OF_PREFERRED_MEDIAPROVIDERS_AVAILABLE">NONE_OF_PREFERRED_MEDIAPROVIDERS_AVAILABLE</a></li><li><a href="Flashphoner.constants.ERROR_INFO.html#.event:OPTIONS_MUST_BE_PROVIDED">OPTIONS_MUST_BE_PROVIDED</a></li><li><a href="Flashphoner.constants.ERROR_INFO.html#.event:OPTIONS_NAME_MUST_BE_PROVIDED">OPTIONS_NAME_MUST_BE_PROVIDED</a></li><li><a href="Flashphoner.constants.ERROR_INFO.html#.event:OPTIONS_URLSERVER_MUST_BE_PROVIDED">OPTIONS_URLSERVER_MUST_BE_PROVIDED</a></li><li><a href="Flashphoner.constants.NOT_ENOUGH_BANDWIDTH.html#.event:NOT_ENOUGH_BANDWIDTH">NOT_ENOUGH_BANDWIDTH</a></li><li><a href="Flashphoner.constants.SESSION_STATUS.html#.event:APP_DATA">APP_DATA</a></li><li><a href="Flashphoner.constants.SESSION_STATUS.html#.event:CONNECTED">CONNECTED</a></li><li><a href="Flashphoner.constants.SESSION_STATUS.html#.event:DEBUG">DEBUG</a></li><li><a href="Flashphoner.constants.SESSION_STATUS.html#.event:DISCONNECTED">DISCONNECTED</a></li><li><a href="Flashphoner.constants.SESSION_STATUS.html#.event:ESTABLISHED">ESTABLISHED</a></li><li><a href="Flashphoner.constants.SESSION_STATUS.html#.event:FAILED">FAILED</a></li><li><a href="Flashphoner.constants.SESSION_STATUS.html#.event:SEND_DATA_STATUS">SEND_DATA_STATUS</a></li><li><a href="Flashphoner.constants.SESSION_STATUS.html#.event:WARN">WARN</a></li><li><a href="Flashphoner.constants.STREAM_STATUS.html#.event:FAILED">FAILED</a></li><li><a href="Flashphoner.constants.STREAM_STATUS.html#.event:PAUSED">PAUSED</a></li><li><a href="Flashphoner.constants.STREAM_STATUS.html#.event:PLAYBACK_PROBLEM">PLAYBACK_PROBLEM</a></li><li><a href="Flashphoner.constants.STREAM_STATUS.html#.event:PLAYING">PLAYING</a></li><li><a href="Flashphoner.constants.STREAM_STATUS.html#.event:PUBLISHING">PUBLISHING</a></li><li><a href="Flashphoner.constants.STREAM_STATUS.html#.event:RESIZE">RESIZE</a></li><li><a href="Flashphoner.constants.STREAM_STATUS.html#.event:SNAPSHOT_COMPLETE">SNAPSHOT_COMPLETE</a></li><li><a href="Flashphoner.constants.STREAM_STATUS.html#.event:STOPPED">STOPPED</a></li><li><a href="Flashphoner.constants.STREAM_STATUS.html#.event:UNPUBLISHING">UNPUBLISHING</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:AGENT_SERVICING_ORIGIN_STREAM_IS_SHUTTING_DOWN">AGENT_SERVICING_ORIGIN_STREAM_IS_SHUTTING_DOWN</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:BAD_URI">BAD_URI</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:CDN_STREAM_NOT_FOUND">CDN_STREAM_NOT_FOUND</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:DISTRIBUTOR_STOPPED">DISTRIBUTOR_STOPPED</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:FAILED_BY_DTLS_ERROR">FAILED_BY_DTLS_ERROR</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:FAILED_BY_DTLS_FINGERPRINT_ERROR">FAILED_BY_DTLS_FINGERPRINT_ERROR</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:FAILED_BY_ERROR">FAILED_BY_ERROR</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:FAILED_BY_HLS_WRITER_ERROR">FAILED_BY_HLS_WRITER_ERROR</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:FAILED_BY_ICE_ERROR">FAILED_BY_ICE_ERROR</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:FAILED_BY_ICE_TIMEOUT">FAILED_BY_ICE_TIMEOUT</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:FAILED_BY_KEEP_ALIVE">FAILED_BY_KEEP_ALIVE</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:FAILED_BY_RTMP_WRITER_ERROR">FAILED_BY_RTMP_WRITER_ERROR</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:FAILED_BY_RTP_ACTIVITY">FAILED_BY_RTP_ACTIVITY</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:FAILED_TO_ADD_STREAM_TO_PROXY">FAILED_TO_ADD_STREAM_TO_PROXY</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:FAILED_TO_CONNECT_TO_ORIGIN_STREAM">FAILED_TO_CONNECT_TO_ORIGIN_STREAM</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:FAILED_TO_CONNECT_TO_RTSP_STREAM">FAILED_TO_CONNECT_TO_RTSP_STREAM</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:FAILED_TO_GET_AGENT_STORAGE">FAILED_TO_GET_AGENT_STORAGE</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:FAILED_TO_READ_FILE">FAILED_TO_READ_FILE</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:FILE_HAS_WRONG_FORMAT">FILE_HAS_WRONG_FORMAT</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:FILE_NOT_FOUND">FILE_NOT_FOUND</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:GOT_EXCEPTION_WHILE_STREAMING_FILE">GOT_EXCEPTION_WHILE_STREAMING_FILE</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:MEDIASESSION_ID_ALREADY_IN_USE">MEDIASESSION_ID_ALREADY_IN_USE</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:MEDIASESSION_ID_NULL">MEDIASESSION_ID_NULL</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:NO_COMMON_CODECS">NO_COMMON_CODECS</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:PUBLISH_STREAM_IS_NOT_READY">PUBLISH_STREAM_IS_NOT_READY</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:REQUESTED_STREAM_SHUTDOWN">REQUESTED_STREAM_SHUTDOWN</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:RESTRICTED_ACCESS">RESTRICTED_ACCESS</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:RTSP_HAS_WRONG_FORMAT">RTSP_HAS_WRONG_FORMAT</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:RTSP_STREAM_NOT_FOUND">RTSP_STREAM_NOT_FOUND</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:RTSPAGENT_SHUTDOWN">RTSPAGENT_SHUTDOWN</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:SESSION_DOES_NOT_EXIST">SESSION_DOES_NOT_EXIST</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:SESSION_NOT_READY">SESSION_NOT_READY</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:STOPPED_BY_PUBLISHER_STOP">STOPPED_BY_PUBLISHER_STOP</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:STOPPED_BY_REST_TERMINATE">STOPPED_BY_REST_TERMINATE</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:STOPPED_BY_SESSION_DISCONNECT">STOPPED_BY_SESSION_DISCONNECT</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:STOPPED_BY_USER">STOPPED_BY_USER</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:STREAM_FAILED">STREAM_FAILED</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:STREAM_NAME_ALREADY_IN_USE">STREAM_NAME_ALREADY_IN_USE</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:STREAM_NOT_FOUND">STREAM_NOT_FOUND</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:TERMINATED_BY_KEEP_ALIVE">TERMINATED_BY_KEEP_ALIVE</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html#.event:TRANSCODING_REQUIRED_BUT_DISABLED">TRANSCODING_REQUIRED_BUT_DISABLED</a></li></ul><h3>Namespaces</h3><ul><li><a href="Call.html">Call</a></li><li><a href="Flashphoner.html">Flashphoner</a></li><li><a href="Flashphoner.constants.CALL_STATUS.html">CALL_STATUS</a></li><li><a href="Flashphoner.constants.CALL_STATUS_INFO.html">CALL_STATUS_INFO</a></li><li><a href="Flashphoner.constants.ERROR_INFO.html">ERROR_INFO</a></li><li><a href="Flashphoner.constants.SESSION_STATUS.html">SESSION_STATUS</a></li><li><a href="Flashphoner.constants.STREAM_STATUS.html">STREAM_STATUS</a></li><li><a href="Flashphoner.constants.STREAM_STATUS_INFO.html">STREAM_STATUS_INFO</a></li><li><a href="roomApi.html">roomApi</a></li><li><a href="roomApi.Room.html">Room</a></li><li><a href="roomApi.Room.Participant.html">Participant</a></li><li><a href="roomApi.Session.html">Session</a></li><li><a href="Session.html">Session</a></li><li><a href="Stream.html">Stream</a></li></ul><h3><a href="global.html">Global</a></h3> </nav> <br class="clear"> <footer> Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.7</a> on Mon May 24 2021 14:25:08 GMT+0700 (+07) </footer> <script> prettyPrint(); </script> <script src="scripts/linenumber.js"> </script> </body> </html>