//=================================================================
|
// API说明
|
//
|
// Function:
|
//
|
// - session_event_state_cb: 设置全局会话状态回调
|
// - session_event_media_cb: 设置全局话权控制回调
|
//
|
// - session_channel_enter: 进入频道会话
|
// - session_channel_exit: 退出频道会话
|
//
|
// - session_id_generate(uids): 给定用户ID的数组,通过cbSessionIdGenerated事件返回临时会话的唯一SessionId
|
//
|
// - session_call_make(sessionId): 发起一个临时会话
|
// - session_call_bye(sessionId): 挂断一个临时会话
|
// - session_call_incoming_accept(sessionId): 当有临时会呼叫来电时,选择接听此来电
|
// - session_call_incoming_reject(sessionId): 当有临时会呼叫来电时,选择拒接此来电
|
//
|
// - session_talk_request: 申请话语权
|
// - session_talk_release: 释放话语权
|
//
|
// Event:
|
//
|
// - cbSessionIdGenerated: 生成唯一SessionId
|
//
|
// - cbSessionConnecting: 会话建立中
|
// - cbSessionEstablished: 会话已建立
|
// - cbSessionReleased: 会话已结束
|
// - cbSessionIncomingAlert: 临时会话来电
|
//
|
// - cbSessionMediaTalkPrepare: 话语权申请中
|
// - cbSessionMediaTalkBegin: 我开始讲话
|
// - cbSessionMediaTalkEnd: 我结束讲话
|
// - cbSessionMediaListenBegin: 别人开始讲话
|
// - cbSessionMediaListenEnd: 别人结束讲话
|
//
|
// - cbSessionPresence: 会话Presence
|
//
|
//=================================================================
|
|
|
|
//============================================
|
//
|
// 会话列表管理
|
//
|
//============================================
|
|
var gSessionArray = new Array();
|
var gSessionTalkIndex = -1;
|
|
var gSessionListenerRefresh = new Array();
|
|
|
function sessionGetPresenceOnLine(sessionId) {
|
var precense = null;
|
if (gSessionArray != null)
|
{
|
for (var i = 0; i < gSessionArray.length; i++) {
|
if (gSessionArray[i].sessionId == sessionId) {
|
precense = gSessionArray[i].precense;
|
if (precense == undefined) {
|
precense = null;
|
}
|
break;
|
}
|
}
|
}
|
return precense;
|
}
|
|
function sessionArrayPut(session, sessionId) {
|
var oldsession = sessionGetById(sessionId);
|
if (oldsession == null) {
|
gSessionArray.unshift(session);
|
}
|
}
|
|
function sessionArrayRemove(sessionId) {
|
if (gSessionArray != null) {
|
for (var i = 0; i < gSessionArray.length; i++) {
|
if (gSessionArray[i].sessionId == sessionId) {
|
gSessionArray.splice(i, 1);
|
break;
|
}
|
}
|
}
|
}
|
|
function sessionGetByIndex(sessionIndex) {
|
var session = null;
|
for (var i = 0; i < gSessionArray.length; i++) {
|
if (gSessionArray[i].sessionIndex == sessionIndex) {
|
session = gSessionArray[i];
|
break;
|
}
|
}
|
return session;
|
}
|
|
function sessionGetById(sessionId) {
|
var session = null;
|
for (var i = 0; i < gSessionArray.length; i++) {
|
if (gSessionArray[i].sessionId == sessionId) {
|
session = gSessionArray[i];
|
break;
|
}
|
}
|
|
return session;
|
}
|
|
//============================================
|
//
|
// 设置全局会话状态事件
|
//
|
//============================================
|
|
|
var cbSessionConnecting = null;
|
var cbSessionEstablished = null;
|
var cbSessionReleased = null;
|
|
var cbSessionIncomingAlert = null;
|
|
var cbSessionPresence = null;
|
|
var cbSessionMediaTalkPrepare = null;
|
var cbSessionMediaTalkBegin = null;
|
var cbSessionMediaTalkEnd = null;
|
var cbSessionMediaListenBegin = null;
|
var cbSessionMediaListenEnd = null;
|
|
var cbSessionIdGenerated = null;
|
|
//-------------------------------
|
// 设置全局会话状态回调
|
//-------------------------------
|
// cbSessionConnecting(sessionId)
|
// cbSessionEstablished(sessionId)
|
// cbSessionReleased(sessionId, result) result参考:SESSION_RELEASE_REASON_*
|
// cbSessionIncomingAlert(sessionId, callerName)
|
|
function session_event_state_cb(cbSesConnecting, cbSesEstablished, cbSesReleased, cbSesIncomingAlert, cbSesPresence) {
|
cbSessionConnecting = cbSesConnecting;
|
cbSessionEstablished = cbSesEstablished;
|
cbSessionReleased = cbSesReleased;
|
cbSessionIncomingAlert = cbSesIncomingAlert;
|
cbSessionPresence = cbSesPresence;
|
}
|
|
function session_event_refresh_register(cbSesRefresh) {
|
gSessionListenerRefresh.push(cbSesRefresh);
|
}
|
|
function session_event_refresh_unregister(cbSesRefresh) {
|
gSessionListenerRefresh.remove(cbSesRefresh);
|
}
|
|
//-------------------------------
|
// 设置全局话权控制回调
|
//-------------------------------
|
// cbSessionMediaTalkPrepare(sessionId)
|
// cbSessionMediaTalkBegin(sessionId)
|
// cbSessionMediaTalkEnd(sessionId, reason) reason参考:MEDIA_TALK_FINISH_REASON_*
|
// cbSessionMediaListenBegin(sessionId, speaker)
|
// cbSessionMediaListenEnd(sessionId)
|
|
function session_event_media_cb(cbMediaTalkPrepare, cbMediaTalkBegin, cbMediaTalkEnd, cbMediaListenBegin, cbMediaListenEnd) {
|
cbSessionMediaTalkPrepare = cbMediaTalkPrepare;
|
cbSessionMediaTalkBegin = cbMediaTalkBegin;
|
cbSessionMediaTalkEnd = cbMediaTalkEnd;
|
cbSessionMediaListenBegin = cbMediaListenBegin;
|
cbSessionMediaListenEnd = cbMediaListenEnd;
|
}
|
|
//-------------------------------
|
// 设置全局生成SessionId的回调
|
//-------------------------------
|
// cbSessionIdGenerated(sessionId)
|
|
function session_event_session_id_generate(cbSesSessionIdGenerated)
|
{
|
cbSessionIdGenerated = cbSesSessionIdGenerated;
|
}
|
|
|
|
//============================================
|
//
|
// 频道会话进入
|
//
|
//============================================
|
|
|
//-------------------------------
|
// API - 进入频道会话
|
//-------------------------------
|
|
function session_channel_enter(sessionId) {
|
var session = sessionGetById(sessionId);
|
if (session != null) {
|
if (cbSessionEstablished != null)
|
cbSessionEstablished(sessionId);
|
if (session.mediaState == MEDIA_STATE_LISTENING) {
|
if (cbSessionMediaListenBegin != null)
|
cbSessionMediaListenBegin(session.sessionId, session.mediaSpeaker);
|
}
|
} else {
|
if (cbSessionConnecting != null)
|
cbSessionConnecting(sessionId);
|
doChannelEnter(sessionId, function(sessionIndex) {
|
var session = new AirSession();
|
session.sessionId = sessionId;
|
session.sessionIndex = sessionIndex;
|
session.sessionState = SESSION_STATE_CONNECTING;
|
sessionArrayPut(session, sessionId);
|
});
|
}
|
}
|
|
|
|
/**
|
* @param replyOk 0成功
|
* @param sessionIndex
|
*/
|
function onChatRoomEnter(replyOk, sessionIndex) {
|
var session = null;
|
session = sessionGetByIndex(sessionIndex);
|
|
if (session != null) {
|
if (replyOk == 0) {
|
session.sessionState = SESSION_STATE_DIALOG;
|
if (cbSessionEstablished != null)
|
cbSessionEstablished(session.sessionId);
|
} else {
|
session.sessionState = SESSION_STATE_IDLE;
|
if (cbSessionReleased != null)
|
cbSessionReleased(session.sessionId, SESSION_RELEASE_ERROR);
|
sessionArrayRemove(session.sessionId);
|
}
|
}
|
}
|
|
|
//============================================
|
//
|
// 频道会话退出
|
//
|
//============================================
|
|
//-------------------------------
|
// API - 退出频道会话
|
//-------------------------------
|
|
function session_channel_exit(sessionId) {
|
var session = sessionGetById(sessionId);
|
if (session != null) {
|
if (session.mediaState == MEDIA_STATE_TALKING) {
|
doTalkRelease(parseInt(session.sessionIndex, 10));
|
session.mediaState = MEDIA_STATE_IDLE;
|
if (cbSessionMediaTalkEnd != null)
|
cbSessionMediaTalkEnd(session.sessionId, MEDIA_TALK_FINISH_RELEASED);
|
if (gSessionTalkIndex == session.sessionIndex)
|
gSessionTalkIndex = -1;
|
} else if (session.mediaState == MEDIA_STATE_LISTENING) {
|
session.mediaState = MEDIA_STATE_IDLE;
|
if (cbSessionMediaListenEnd != null)
|
cbSessionMediaListenEnd(session.sessionId);
|
}
|
|
sessionArrayRemove(sessionId);
|
if (cbSessionReleased != null)
|
cbSessionReleased(session.sessionId, SESSION_RELEASE_GENERAL);
|
|
doChannelExit(sessionId);
|
}
|
}
|
|
function onChatRoomExit(sessionIndex) {
|
var session = sessionGetByIndex(sessionIndex);
|
if (session != null) {
|
if (session.mediaState == MEDIA_STATE_TALKING) {
|
session.mediaState = MEDIA_STATE_IDLE;
|
if (cbSessionMediaTalkEnd != null)
|
cbSessionMediaTalkEnd(session.sessionId, MEDIA_TALK_FINISH_RELEASED);
|
if (gSessionTalkIndex == session.sessionIndex)
|
gSessionTalkIndex = -1;
|
} else if (session.mediaState == MEDIA_STATE_LISTENING) {
|
session.mediaState = MEDIA_STATE_IDLE;
|
if (cbSessionMediaListenEnd != null)
|
cbSessionMediaListenEnd(session.sessionId);
|
}
|
|
sessionArrayRemove(session.sessionId);
|
if (cbSessionReleased != null)
|
cbSessionReleased(session.sessionId, SESSION_RELEASE_GENERAL);
|
}
|
}
|
|
//============================================
|
//
|
// 临时会话
|
//
|
//============================================
|
|
function session_id_generate(userids)
|
{
|
if (userids != null && userids.length > 0)
|
{
|
console.log(userids)
|
//{"userids": ["123312", "3423422", "3434"]}
|
var uids = {"userids": userids};
|
var json = JSON.stringify(uids);
|
doSessionTempMatch(json, "0");
|
}
|
}
|
|
function session_call_make(sessionId)
|
{
|
var session = sessionGetById(sessionId);
|
if (session != null) {
|
if (cbSessionEstablished != null)
|
cbSessionEstablished(sessionId);
|
if (session.mediaState == MEDIA_STATE_LISTENING) {
|
if (cbSessionMediaListenBegin != null)
|
cbSessionMediaListenBegin(session.sessionId, session.mediaSpeaker);
|
}
|
} else {
|
if (cbSessionConnecting != null)
|
cbSessionConnecting(sessionId);
|
doSessionTempCall(null, sessionId, 0, function(sessionIndex) {
|
var session = new AirSession();
|
session.sessionId = sessionId;
|
session.sessionIndex = sessionIndex;
|
session.sessionState = SESSION_STATE_CONNECTING;
|
sessionArrayPut(session);
|
});
|
}
|
}
|
|
function session_call_bye(sessionId) {
|
var session = sessionGetById(sessionId);
|
if (session != null) {
|
if (session.mediaState == MEDIA_STATE_TALKING) {
|
doTalkRelease(session.sessionIndex);
|
session.mediaState = MEDIA_STATE_IDLE;
|
if (cbSessionMediaTalkEnd != null)
|
cbSessionMediaTalkEnd(session.sessionId, MEDIA_TALK_FINISH_RELEASED);
|
if (gSessionTalkIndex == session.sessionIndex)
|
gSessionTalkIndex = -1;
|
} else if (session.mediaState == MEDIA_STATE_LISTENING) {
|
session.mediaState = MEDIA_STATE_IDLE;
|
if (cbSessionMediaListenEnd != null)
|
cbSessionMediaListenEnd(session.sessionId);
|
}
|
|
sessionArrayRemove(sessionId); //回调前清除session(频道也一样)
|
if (cbSessionReleased != null)
|
cbSessionReleased(session.sessionId, SESSION_RELEASE_GENERAL);
|
|
doLeaveCall(parseInt(session.sessionIndex, 10));
|
}
|
}
|
|
function session_call_incoming_accept(sessionId) {
|
var session = sessionGetById(sessionId);
|
if (session != null) {
|
if (session.sessionState == SESSION_STATE_CONNECTING) {
|
doAcceptCall(parseInt(session.sessionIndex, 10));
|
}
|
}
|
}
|
|
function session_call_incoming_reject(sessionId) {
|
var session = sessionGetById(sessionId);
|
if (session != null) {
|
if (session.sessionState == SESSION_STATE_CONNECTING) {
|
doRejectCall(parseInt(session.sessionIndex, 10));
|
if (cbSessionReleased != null)
|
cbSessionReleased(session.sessionId, SESSION_RELEASE_GENERAL);
|
sessionArrayRemove(sessionId);
|
}
|
}
|
}
|
|
|
//-------------------------------
|
// 会话回调事件
|
//-------------------------------
|
|
// Generated SessionId
|
function onSessionDialogMemberChange(json)
|
{
|
if (cbSessionIdGenerated != null && json != null)
|
cbSessionIdGenerated(json.sessionid);
|
}
|
|
function onSessionIncomingAlert(sessionIndex, user, sessionId) {
|
var session = sessionGetById(sessionId);
|
if (session == null) {
|
session = new AirSession();
|
session.sessionId = sessionId;
|
session.sessionIndex = sessionIndex;
|
session.sessionState = SESSION_STATE_CONNECTING;
|
sessionArrayPut(session);
|
}
|
|
session.sessionState = SESSION_STATE_CONNECTING;
|
if (cbSessionIncomingAlert != null)
|
cbSessionIncomingAlert(sessionId, user);
|
}
|
|
function onSessionEstablish(sessionIndex, sessionId) {
|
var session = null;
|
session = sessionGetByIndex(sessionIndex);
|
if (session != null) {
|
session.sessionState = SESSION_STATE_DIALOG;
|
if (cbSessionEstablished != null)
|
cbSessionEstablished(session.sessionId);
|
}
|
}
|
|
function onSessionRelease(sessionIndex, releaseReason) {
|
var session = sessionGetByIndex(sessionIndex);
|
if (session != null) {
|
if (session.mediaState == MEDIA_STATE_TALKING) {
|
session.mediaState = MEDIA_STATE_IDLE;
|
if (cbSessionMediaTalkEnd != null)
|
cbSessionMediaTalkEnd(session.sessionId, MEDIA_TALK_FINISH_RELEASED);
|
if (gSessionTalkIndex == session.sessionIndex)
|
gSessionTalkIndex = -1;
|
} else if (session.mediaState == MEDIA_STATE_LISTENING) {
|
session.mediaState = MEDIA_STATE_IDLE;
|
if (cbSessionMediaListenEnd != null)
|
cbSessionMediaListenEnd(session.sessionId);
|
}
|
|
sessionArrayRemove(session.sessionId);
|
if (cbSessionReleased != null)
|
cbSessionReleased(session.sessionId, releaseReason);
|
}
|
}
|
|
//============================================
|
//
|
// 会话媒体话权
|
//
|
//============================================
|
|
//-------------------------------
|
// API - 申请话语权
|
//-------------------------------
|
|
function session_talk_request(sessionId) {
|
var session = sessionGetById(sessionId);
|
if (session != null) {
|
gSessionTalkIndex = session.sessionIndex;
|
if (cbSessionMediaTalkPrepare != null)
|
cbSessionMediaTalkPrepare(sessionId);
|
doTalkRequest(parseInt(session.sessionIndex, 10));
|
}
|
}
|
|
|
//-------------------------------
|
// API - 释放话语权
|
//-------------------------------
|
|
function session_talk_release() {
|
if (gSessionTalkIndex >= 0) {
|
var session = sessionGetByIndex(gSessionTalkIndex);
|
if (session != null) {
|
doTalkRelease(parseInt(session.sessionIndex, 10));
|
if (session.mediaState != MEDIA_STATE_LISTENING)
|
session.mediaState = MEDIA_STATE_IDLE;
|
if (cbSessionMediaTalkEnd != null)
|
cbSessionMediaTalkEnd(session.sessionId, MEDIA_TALK_FINISH_RELEASED);
|
//if (session.mediaState == MEDIA_STATE_LISTENING && cbSessionMediaListenBegin != null)
|
// cbSessionMediaListenBegin(session.sessionId, session.mediaSpeaker);
|
}
|
gSessionTalkIndex = -1;
|
}
|
}
|
|
//============================================
|
//
|
// 会话媒体状态事件
|
//
|
//============================================
|
|
function onMediaStateTalk(sessionIndex) {
|
var session = sessionGetByIndex(sessionIndex);
|
if (session != null) {
|
session.mediaState = MEDIA_STATE_TALKING;
|
if (cbSessionMediaTalkBegin != null)
|
cbSessionMediaTalkBegin(session.sessionId);
|
}
|
}
|
|
function onMediaStateListern(sessionIndex, speaker) {
|
var session = sessionGetByIndex(sessionIndex);
|
if (session != null) {
|
session.mediaState = MEDIA_STATE_LISTENING;
|
session.mediaSpeaker = speaker;
|
if (cbSessionMediaListenBegin != null)
|
cbSessionMediaListenBegin(session.sessionId, speaker);
|
}
|
}
|
|
function onMediaStateIdle(sessionIndex, reason) {
|
var session = sessionGetByIndex(sessionIndex);
|
if (session != null) {
|
if (reason == -1) // ListenEnd
|
{
|
if (session.mediaState != MEDIA_STATE_TALKING)
|
session.mediaState = MEDIA_STATE_IDLE;
|
if (cbSessionMediaListenEnd != null)
|
cbSessionMediaListenEnd(session.sessionId);
|
} else // TalkEnd
|
{
|
if (session.mediaState != MEDIA_STATE_LISTENING)
|
session.mediaState = MEDIA_STATE_IDLE;
|
if (cbSessionMediaTalkEnd != null)
|
cbSessionMediaTalkEnd(session.sessionId, reason);
|
//if (session.mediaState == MEDIA_STATE_LISTENING && cbSessionMediaListenBegin != null)
|
// cbSessionMediaListenBegin(session.sessionId, session.mediaSpeaker);
|
}
|
}
|
}
|
|
|
//-------------------------------
|
// 会话锁定与解锁 isLock:0:unlock ,1:lock
|
//-------------------------------
|
function session_lock_opt(sessionId, islock) {
|
var session = sessionGetById(sessionId);
|
if (session != null) {
|
isServiceLock(parseInt(session.sessionIndex, 10), islock);
|
if (islock) {
|
for (var i = 0; i < gSessionArray.length; i++) {
|
gSessionArray[i].lock = 0;
|
}
|
}
|
session.lock = islock;
|
for (var i = 0; i < gSessionListenerRefresh.length; i++)
|
gSessionListenerRefresh[i]();
|
}
|
}
|
|
//============================================
|
//
|
// 会场状态通知
|
//
|
// cbSessionPresence(sessionId, presence)
|
//============================================
|
|
function onSessionDialogPresence(json) {
|
if (cbSessionPresence != null) {
|
var session = sessionGetByIndex(json.sessionindex);
|
if (session != null) {
|
session.precense = null;
|
if (session.precense == null) {
|
session.precense = new Array();
|
}
|
for (var i = 0; i < json.sessionmember.length; i++) {
|
session.precense.push(json.sessionmember[i].ipocid);
|
}
|
cbSessionPresence(session.sessionId, session.precense);
|
}
|
}
|
}
|
|
|
function onSessionChannelPresence(json) {
|
if (cbSessionPresence != null) {
|
var session = sessionGetByIndex(json.sessionindex);
|
if (session != null) {
|
if (session.precense == null) {
|
session.precense = new Array();
|
}
|
|
for (var i = 0; i < json.sessionmember.length; i++) {
|
var found = 0;
|
json.sessionmember[i].userstate = USER_SESSION_STATE_ON_LINE;
|
for (var j = 0; j < session.precense.length; j++) {
|
if (session.precense[j] == json.sessionmember[i].ipocid) {
|
found = 1;
|
break;
|
}
|
}
|
|
if (found == 0) {
|
session.precense.push(json.sessionmember[i].ipocid);
|
}
|
}
|
cbSessionPresence(session.sessionId, session.precense);
|
}
|
}
|
}
|
|
function onSessionChannelUserEnter(json) {
|
if (cbSessionPresence != null) {
|
var session = sessionGetByIndex(json.sessionindex);
|
if (session != null) {
|
if (session.precense == null) {
|
session.precense = new Array();
|
}
|
|
for (var i = 0; i < json.sessionmember.length; i++) {
|
var found = 0;
|
for (var j = 0; j < session.precense.length; j++) {
|
if (session.precense[j] == json.sessionmember[i].ipocid) {
|
found = 1;
|
break;
|
}
|
}
|
if (found == 0) {
|
session.precense.push(json.sessionmember[i].ipocid);
|
}
|
}
|
cbSessionPresence(session.sessionId, session.precense);
|
}
|
}
|
}
|
|
function onSessionChannelUserExit(json) {
|
if (cbSessionPresence != null) {
|
var session = sessionGetByIndex(json.sessionindex);
|
if (session != null) {
|
if (session.precense == null) {
|
session.precense = new Array();
|
}
|
var sessionmember = new Array();
|
for (var i = 0; i < json.sessionmember.length; i++) {
|
for (var i = 0; i < json.sessionmember.length; i++) {
|
for (var j = 0; j < session.precense.length; j++) {
|
if (session.precense[j] == json.sessionmember[i].ipocid) {
|
session.precense.splice(j, 1);
|
break;
|
}
|
}
|
}
|
}
|
cbSessionPresence(session.sessionId, session.precense);
|
}
|
}
|
}
|