跳到主要内容

SDK 事件与后台监听对照

@scooper/meeting-sdk 不直接重写后端 CometD/SSE 订阅逻辑。底层仍由 scooper.dispatch.js 完成后端监听,SDK 做三件事:

  1. 初始化并登录 scooper.dispatch
  2. scooper.dispatch.event_const 中的事件逐项 listen
  3. 转换成稳定的 SDK 事件名,通过 sdk.on(...)callbacks.onEvent(...) 和具名 callback 对外通知。

这样第三方不用直接关心 CometD channel,但不会丢后端通知。

如果第三方页面不能直连 dispatch-web,也可以启用 backendListener。此时第三方后台通过 server/ adapter 订阅同一批 channel,再通过 SSE/WebSocket 推给前端 SDK。前端收到后仍按本文档中的 SDK 事件名触发业务 callback。

监听链路

后台 CometD/SSE channel
-> scooper.sse.subscribe(...)
-> scooper.dispatch fireListen(event_const.X, payload)
-> ScooperMeetingSDK DISPATCH_EVENT_MAP
-> sdk.on(SDK.EVENT.X, handler) / callbacks.onX(payload)

后台桥接模式:

dispatch-web CometD channel
-> @scooper/meeting-sdk/server
-> 第三方 SSE/WebSocket
-> backendListener
-> sdk.on(SDK.EVENT.X, handler) / callbacks.onX(payload)

通用监听方式

const sdk = ScooperMeetingSDK.create({
callbacks: {
onEvent(event, payload) {
console.log("[all]", event, payload);
},
onMeetingStatus(meet) {
console.log("会场状态", meet);
},
onCallStatus(status) {
console.log("号码状态", status);
},
onDispatchReAuth(info) {
console.warn("需要重新鉴权", info);
},
},
});

sdk.on(ScooperMeetingSDK.EVENT.MEETING_MEMBER, (member) => {
console.log("成员变化", member);
});

后台桥接事件

启用 backendListener 时,SDK 会额外触发以下桥接状态事件:

SDK 事件具名 callback含义
backend:connectedonBackendListenerConnected已连接第三方后台 SSE/WebSocket 或自定义 transport
backend:messageonBackendListenerMessage收到后台桥接原始 envelope,随后会继续触发 envelope.event 对应的业务事件
backend:erroronBackendListenerError后台桥接连接或解析异常
backend:disconnectedonBackendListenerDisconnected后台桥接断开

示例:

const sdk = ScooperMeetingSDK.create({
backendListener: {
enabled: true,
transport: "sse",
url: "/scooper-events"
},
callbacks: {
onBackendListenerMessage(message) {
console.log(message.channel, message.event);
},
onMeetingStatus(meet) {
console.log("会场状态", meet);
}
}
});

后台 channel 对照表

{accId} 表示 scooper.dispatch 登录后按账号追加的主题前缀,例如 /123/meet/status

后台 channeldispatch event_constSDK 事件具名 callback含义
/connCONN_CNGdispatch:connectionChangedonDispatchConnectionChanged调度登录与 CometD/SSE 连接状态变化
{accId}/server/configCHANGE_CFGdispatch:configChangedonDispatchConfigChanged后台配置变化
内部数据加载完成DATA_INITdispatch:dataInitializedonDispatchDataInitialized调度初始数据加载完成
API 调用内部响应METHOD_RTdispatch:methodResponseonDispatchMethodResponse调度 API 统一响应,SDK 的部分 Promise 会等待它
{accId}/respDataPACK_RES_DATAdispatch:responseDataonDispatchResponseData后端调度协议响应包
/cdispatch/disconnectDISPATCH_DISCONNECTdispatch:disconnectonDispatchDisconnect调度连接断开
402/session 失效处理REAUTH_NOTIFYdispatch:reAuthonDispatchReAuth需要重新鉴权
{accId}/call/inCALL_INcall:incomingQueueonCallIncomingQueue呼入队列新增/移除
{accId}/call/holdCALL_HOLDcall:holdonCallHold保持队列变化
{accId}/call/statusCALL_STScall:statusonCallStatus号码状态变化
{accId}/call/status, {accId}/call/record/statusCALL_RECORDcall:recordStatusChangedonCallRecordStatusChanged兼容旧录音状态事件
{accId}/call/recordRECORD_NOTIFYcall:recordNotifyonCallRecordNotify通话记录、通话录音/录像记录
{accId}/call/recordStatusRECORD_STATUS_NOTIFYcall:recordStatusNotifyonCallRecordStatusNotify通话录音 ON/OFF 状态
{accId}/meet/statusMEET_STSmeeting:statusonMeetingStatus会场状态:新增、销毁、锁定、录音、编辑等
{accId}/meet/join, {accId}/meet/leave, {accId}/meet/memstsMEET_MEMmeeting:memberonMeetingMember成员入会、离会、角色等级变化
{accId}/meet/statusMEET_LSTmeeting:listonMeetingList会场列表新增/移除
{accId}/meet/recordMEET_RECORD_NOTIFYmeeting:recordonMeetingRecord会议记录、会议录音/录像记录
{accId}/meet/memRecordMEET_MEM_RECORD_NOTIFYmeeting:memberRecordonMeetingMemberRecord会场历史成员记录
{accId}/meet/memRecordDelALLMEET_MEM_RECORD_DEL_ALL_NOTIFYmeeting:memberRecordClearonMeetingMemberRecordClear会场历史成员记录清空
/meetScreenSetIndexMEET_SCREEN_SET_INDEXmeeting:screenSetIndexonMeetingScreenSetIndex混屏画面布局
/meetMixScreenMEET_MIX_SCREENmeeting:mixScreenonMeetingMixScreen混屏开关
/meet/meetOperMEET_OPER_NOTIFYmeeting:memberOperationonMeetingMemberOperation成员操作,例如等候室
{accId}/meet/handsUpMEET_HANDS_UP_NOTIFYmeeting:handsUponMeetingHandsUp举手发言
/meetSplitScreenSetIndexMEET_SPLIT_SCREEN_SET_INDEXmeeting:splitScreenSetIndexonMeetingSplitScreenSetIndex分屏画面布局
/meetSplitScreenMEET_SPLIT_SCREENmeeting:splitScreenonMeetingSplitScreen分屏开关
/meetShareTelMEET_SHARE_TELmeeting:shareTelonMeetingShareTel共享桌面号码
dispatch 内部软手柄事件SHANDLE_CALL_NOTIFYdispatch:softHandlerCallonDispatchSoftHandlerCall内置软手柄呼叫通知
dispatch 内部软手柄事件SHANDLE_HANGUP_NOTIFYdispatch:softHandlerHanguponDispatchSoftHandlerHangup内置软手柄挂断通知
/shandlePreemptRegister 与内部软手柄事件SHANDLE_REGISTER_NOTIFYdispatch:softHandlerRegisteronDispatchSoftHandlerRegister内置软手柄注册、抢注册

独立 sc-soft-handler 事件

如果 SDK 配置了 softHandler.enabled = true,还会创建独立 ScSoftHandler 实例并桥接以下事件:

sc-soft-handler 事件SDK 事件具名 callback
register/autoRegistersoftHandler:autoRegisteronEvent
registerResultsoftHandler:registerResultonSoftHandlerRegisterResult
unregisterResultsoftHandler:unregisterResultonSoftHandlerUnregisterResult
errorsoftHandler:erroronSoftHandlerError
incomingcallsoftHandler:incomingCallonSoftHandlerIncomingCall
incomingcall/autoAnswer / SoftHandlerEvent.IN_CALL_ANSWERsoftHandler:incomingCallAutoAnsweronSoftHandlerIncomingCallAutoAnswer
ringingsoftHandler:ringingonEvent
acceptedsoftHandler:acceptedonSoftHandlerAccepted
hangupsoftHandler:hanguponSoftHandlerHangup
hangupResultsoftHandler:hangupResultonEvent
callingResultsoftHandler:callingResultonEvent
answerResultsoftHandler:answerResultonEvent

SDK 会把独立 ScSoftHandler 的关键事件同步成 dispatch 兼容事件:registerResult 会触发 dispatch:softHandlerRegisterhangup 会触发 dispatch:softHandlerHangup,非 call_dispatch 的普通来电会触发 dispatch:softHandlerCall

incomingcall/autoAnswer 是软手柄 SoftHandlerEvent.IN_CALL_ANSWER 的实际事件值,表示软手柄识别 self_call_handle 后发出的自呼叫通知。SDK 默认会在收到该事件时调用 softHandler.answer({ audioSend: true, audioRecv: true, videoSend, videoRecv: true }) 完成内部自应答;如需完全由业务层接管,可设置 softHandler.autoAnswerSelfCall = falseincomingcall 中的 notifyType=call_dispatch 会按原 dispatch 逻辑处理:如果号码命中最近一次调度应答窗口,SDK 自动应答;否则不再派发 dispatch:softHandlerCall,避免和调度呼入面板重复。可通过 softHandler.autoAnswerDispatchCall = false 关闭这一路自动应答。

运行时查看监听表

SDK 会把监听表公开出来,便于对接方自检:

console.table(ScooperMeetingSDK.DISPATCH_EVENT_MAP);
console.table(sdk.getDispatchEventMap());

扩展自定义后台事件

如果后端或定制版 scooper.dispatch.js 增加了新的 fireListen 事件,SDK 可以通过 dispatch.extraEvents 桥接,不需要改源码。

event_const key 桥接:

const sdk = ScooperMeetingSDK.create({
dispatch: {
extraEvents: [
{
constKey: "CUSTOM_NOTIFY",
event: "custom:notify",
category: "dispatch",
backendChannels: ["/custom/notify"],
description: "定制后台通知",
},
],
},
callbacks: {
onEvent(event, payload) {
console.log(event, payload);
},
},
});

如果底层没有挂在 event_const 上,也可以直接按原始事件名桥接:

const sdk = ScooperMeetingSDK.create({
dispatch: {
extraEvents: [
{
rawEvent: "customNotify",
event: "custom:notify",
category: "dispatch",
backendChannels: ["/custom/notify"],
description: "定制后台通知",
},
],
},
});

SDK 生命周期与本地事件

这些事件不来自后台推送,由 SDK 自身在本地派发,DISPATCH_EVENT_MAP 里没有对应条目。

SDK 事件常量触发时机callback
sdk:readyEVENT.READYinit() 全部子系统初始化完成onReady
sdk:errorEVENT.ERROR任何 SDKError 产生时(含 reject 前)onError
sdk:destroyedEVENT.DESTROYEDdestroy() 完成
dispatch:loginEVENT.DISPATCH_LOGINlogin() 成功onDispatchLogin
video:initEVENT.VIDEO_INITinitVideo() 创建出 VideoWebRtc 实例onVideoInit
video:playSuccessEVENT.VIDEO_PLAY_SUCCESS底层 playsuccessonVideoPlaySuccess
video:playErrorEVENT.VIDEO_PLAY_ERROR底层 playErroronVideoPlayError
video:closeEVENT.VIDEO_CLOSE底层 aftercloseonVideoClose
softHandler:readyEVENT.SOFT_HANDLER_READY软手柄实例创建完成onSoftHandlerReady
meeting:alreadyInMeeting无常量(裸字符串)joinMeeting() 发现该号码已在会中、跳过重复请求

视频控制器透传事件

initVideo() 之后,SDK 会把 VideoWebRtc 的原始事件按下表转发。除上面 4 个有 EVENT 常量外, 其余只能用裸字符串监听(sdk.on("video:click", fn)),ScooperMeetingSDK.EVENT 里取不到。

底层事件SDK 事件是否有 EVENT 常量
initsuccvideo:init
playsuccessvideo:playSuccess
playErrorvideo:playError
afterclosevideo:close
msginfovideo:message
errorMsgvideo:error
remoteStreamvideo:remoteStream
localStreamvideo:localStream
screenchangevideo:screenChange
dragEndvideo:dragEnd
startpollvideo:startPoll
stoppollvideo:stopPoll
clickvideo:click

同理,软手柄侧的 softHandler:autoRegistersoftHandler:ringingsoftHandler:hangupResultsoftHandler:callingResultsoftHandler:answerResult 也是裸字符串事件,没有 EVENT 常量。

注意

  • SDK 只负责前端监听桥接,后台是否实际推送某个 channel 仍取决于 dispatch-web 当前版本、账号权限、调度中心配置和业务操作。
  • 如果使用 dispatch.initialize("sub"),子页面事件由上层主 dispatch 转发;SDK 仍按同一事件表监听。
  • 如果使用 dispatch.useNativeShandle = false,SDK 创建的独立软手柄也会把注册、挂断、普通来电映射到 dispatch:softHandler*,同时保留原始 softHandler:* 事件用于排查底层状态。