跳到主要内容

SDK API Reference

本文档面向第三方前端接入方,说明 @scooper/meeting-sdk 封装了哪些底层能力,以及每类方法的返回策略。

初始化

SDK 方法底层依赖说明
ScooperMeetingSDK.create(config)创建 SDK 实例,不立即连接后台。
ScooperMeetingSDK.loadDependencies(options)动态 <script>可选:按顺序加载 jquery/dispatch/video/soft-handler。
sdk.init(config?)scooper.dispatch.initializeloginByTokenVideoWebRtcScSoftHandler按配置初始化调度信令长连接、视频视窗和软手柄。
sdk.login(token?)scooper.dispatch.loginByToken手动登录调度后台。
sdk.destroy(options?)destroy / closeAll / unregister解绑监听、关闭视频和软手柄。

dispatch.token 可以是字符串,也可以是返回 Token 的函数:

const sdk = ScooperMeetingSDK.create({
dispatch: {
remoteBaseUrl: "https://host/dispatch-web/",
token: () => sessionStorage.getItem("Sc-Token"),
},
});

会议 API

SDK 方法底层方法功能与后台接口语义
createMeeting(options)meets.createMeetDetail / meets.createMeet创建多方视频/音频会商(POST /meet/createMeet
editMeeting(options)meets.editMeet编辑会议名称、成员权限或访问码(POST /meet/editMeet
listMeetings({ mine })meets.listMyMeets / meets.listMeets查询当前操作员创建的会议或平台全部会议列表
getMeeting(meetId)meets.getMeet查询指定单个会议的详细信息(GET /meet/getMeet
requestMeeting(meetId)meets.requestMeet向后台请求并刷新本地缓存的会场详情
requestMeetingMembers(meetId)meets.requestMeetMembers向后台请求并刷新本地缓存的参会成员列表
getMeetingScreenState(meetId)meets.requestMeet读取缓存中的混屏/分屏布局及主看/屏幕共享人状态
listMeetingRecords()meets.listMeetsRecord查询历史会议记录列表(GET /meet/listMeetsRecord
getMeetingRecord(meetId, tel?)meets.getMeetRecord查询指定会场或指定成员的历史会议记录(GET /meet/getMeetRecord
joinMeeting(options)meets.joinVideoMember / joinAudioMember / joinMember邀请指定成员以视频或纯音频方式加入会商(/meet/joinMember
playMeetingVideo(options) / playVideo({ meetId, tel })joinVideoMember + softHandler.answer + meeting:member + video.play一键邀请成员视频入会并在本端空闲视窗自动拉流上屏播放
joinMembers(options)meets.joinMembers批量邀请多位成员同时加入会商(/meet/joinMembers
kickMember(meetId, tel)meets.kickMember将指定参会成员移出/剔出会场(POST /meet/kickMember
endMeeting(meetId, { destroy })meets.endMeet / destroyMeet结束会议或彻底解散销毁会议(POST /meet/endMeet/meet/destroyMeet
lockMeeting / unlockMeetingmeets.lock / unlock锁定会议(禁止新成员呼入)与解除锁定(POST /meet/lock/meet/unlock
startRecord / stopRecordmeets.startRecord / stopRecord开启或停止全场会议视讯录制(POST /meet/startRecord/meet/stopRecord
startPlayVoice / stopPlayVoicemeets.startPlayVoice / stopPlayVoice开启或停止会场背景放音/广播音频(POST /meet/startPlayVoice/meet/stopPlayVoice
changeMemberLevelmeets.changeMemberLevel动态修改指定成员的席位级别与权限(POST /meet/changeMemberLevel
changeMemberToSpeaker/Audience/Chairman同名 meets 方法快捷将成员角色切换为发言人、听众或主席
changeMemberToControllermeets.changeMemberToController将指定成员设为会商主控者(POST /meet/changeMemberToController

members 支持底层字符串,也支持对象数组:

await sdk.createMeeting({
name: "第三方视频会商",
businessId: "biz-001",
members: [
{ tel: "1001", level: "chairman" },
{ tel: "1002", level: "speak" },
],
mediaType: "video",
});

创建会议后播放会场成员视频时,第三方不需要再单独调用 joinMeetingsoftAnswer 或监听入会通知:

await sdk.playVideo({
meetId: "meet-001",
tel: "1002",
index: 0,
autoAnswer: true,
joinNotifyTimeout: 15000
});

成员与当前会议

SDK 方法说明
getCurrentMeet() / getCurrentMeetId()读取最近一次创建或加入的会议。
setCurrentMeet(meet)手动指定当前会议;传 null 清空。
getMeetingMembers(meetId?)异步获取成员列表,省略 meetId 时用当前会议。
getMeetingMembersSync(meetId?)同步读成员缓存。
getMeetingMember(meetId, tel)获取单个成员,不存在返回 null
isMemberInMeeting(meetId, tel)该号码是否已在会中(读缓存,同步)。
muteMember / unmuteMember(meetId, tel)禁言 / 解除禁言,等价于设为听众 / 发言人。
setMemberRole(meetId, tel, role)设置角色:speak / audience / chairman
muteAllMembers(meetId?) / unmuteAllMembers(meetId?)全员禁言 / 解除。返回 { total, succeeded, failed },单个成员失败不中断整体流程。

joinMeeting() 若发现该号码已在会中,会跳过重复请求,直接返回 { code: 0, alreadyInMeeting: true } 并派发 meeting:alreadyInMeeting 事件。

错误处理

所有返回 Promise 的方法在依赖未就绪(dispatch / video / softHandler 未初始化)时也会 reject,可以用 .catch() 统一接住:

try {
await sdk.makeVideoCall({ tel: "1002" });
} catch (error) {
// error instanceof ScooperMeetingSDK.SDKError
console.error(error.code, error.message);
}

同步方法仍然是同步 throw,需要 try/catchplayVideoplayVideosinitVideocloseVideocloseAllVideossetVideoWindowsstartVideoPollstopVideoPollrequestMeetingrequestMeetingMembersrequestMeetingMembergetMeetingScreenStatefindIncomingCallByTelisPlayingisMemberInMeeting

错误对象统一为 ScooperMeetingSDK.SDKError,通过 error.code 区分原因(如 DISPATCH_NOT_FOUNDREQUEST_TIMEOUTREQUEST_FAILEDVIDEO_CONTAINER_NOT_FOUNDJOIN_NOTIFY_TIMEOUT)。每次产生错误时也会派发 sdk:error 事件。

呼叫 API

这些方法封装 scooper.dispatch.calls,默认等待 dispatch:methodResponse。如果调用方只想发送请求,不等待后台统一响应,可传 { waitResponse: false }

rollCallgroupNotify/selectNotify 还会默认继续等待 dispatch-web 使用的 dispatch:responseData 终态包(group_roll_call / group_notify)。返回对象保留请求响应字段,并在 finalResult 字段中附带终态包;不需要等待终态时传 { waitFinalResult: false }。终态包在后台没有返回时会以 FINAL_RESULT_TIMEOUT reject,超时时间可用 finalResultTimeout 覆盖。

注意:

  • 底层 methodResponse 没有 requestId。SDK 会把 waitResponse: true 的调用串行化,避免并发时响应错配。
  • 业务失败(code0 / "0")会 reject,不再静默 resolve。
  • createMeeting 优先走底层 callback,不依赖 methodResponse
SDK 方法底层方法功能与后台接口语义
requestCallStatus()calls.requestCallStatus向后台请求并刷新操作员当前的全量呼叫/通话状态
requestTelStatus(tel)calls.requestTelStatus向后台请求并查询指定单号码的在线与通话状态
requestCallIns()calls.requestCallIns向后台请求并刷新当前呼入队列数据
listCallStatus()calls.listStatus查询当前全量呼叫/通话状态列表(GET /call/listStatus
listHoldCalls()calls.listHold查询当前处于保持状态的通话列表(GET /call/listHold
listIncomingCalls()calls.listCallIn查询当前等待接听的呼入队列列表(GET /call/listCallIn
findIncomingCallByTel(tel)calls.findCallInByTel从本地缓存队列中按号码查找对应的呼入来电信息
makeCall / makeAudioCall / makeVideoCallcalls.makeCall / makeAudioCall / makeVideoCall发起单点语音呼叫或视频呼叫(POST /call/makeCall/makeAudioCall/makeVideoCall
answerCall(tel)calls.answer接听/应答指定号码的来电呼叫(POST /call/answer
hangupCall(tel)calls.hungUp挂断指定号码的通话(POST /call/hungup
answerAllCalls()calls.answerAll一键应答当前队列中的所有呼入来电(POST /call/answerAll
holdCall / unholdCallcalls.hold / unhold通话保持(将通话置于等待)与恢复通话(POST /call/hold/call/unhold
transferCall({ from, to })calls.transfer通话转接(将正在通话的号码转接至第三方目标,POST /call/transfer
retrieveCall(tel)calls.retrieve强拉/恢复指定被转接的通话(POST /call/retrieve
tripleMonitor / tripleBreakin / tripleHungup同名底层方法调度三方控制:监听通话、强插通话、强拆通话
startCallRecord / stopCallRecordcalls.callRecord / callRecordEnd开启或停止当前单路通话录音(POST /call/callRecord/call/callRecordEnd
rollCall / stopRollCallcalls.rollCall / stopRollCall发起多号码语音点名(按序轮流连通)与停止点名
groupTurn / stopGroupTurncalls.groupTurn / stopGroupTurn发起多号码轮询调度呼叫与停止轮询
selectCall / cancelSelectCallcalls.selectCall / selectCancel多人选呼/组呼(GET /dispatch-web/api/call/selectCall?meetId=...&tels=...)与取消选呼(GET /dispatch-web/api/call/selectCancel
groupNotify / selectNotifycalls.selectNotify / calls.groupNotify组呼通知(POST /dispatch-web/api/call/groupNotify),支持文字转语音 (TTS, type: "text") 与音频文件 (type: "voice"),标准载荷为 tels, files, type, times, notifyId
groupCall / cancelGroupCallcalls.groupCall / groupCancel传统群组 ID 组呼与取消(GET /dispatch-web/api/call/groupCall
groupSame / makeCallSamecalls.groupSame / makeCallSame一键组呼同振(多个被叫同时振铃,底层兼容)
notifyRecordOperationcalls.notifyRecordOP通知语音录制、试听、删除等管理操作(/call/notifyRecordOP
dispatchSoftAnswer / dispatchSoftHangup / preemptSoftHandlerRegistercalls.shandleAnswer / shandleHungUp / shandlePreemptRegister使用 dispatch 内置软手柄能力执行应答、挂断或抢占注册

示例:

// 1. 点对点呼叫与转接
await sdk.makeVideoCall({ tel: "1002", businessId: "case-001" });
await sdk.transferCall({ from: "1002", to: "1003", businessId: "case-001" });

// 2. 多人选呼/组呼 (GET /dispatch-web/api/call/selectCall)
await sdk.selectCall({
tels: ["142001", "1000021"],
meetId: "yangyue1",
autoAnswer: "",
allAudience: ""
});

// 取消多人呼叫 (GET /dispatch-web/api/call/selectCancel?meetId=yangyue1)
await sdk.cancelSelectCall("yangyue1");

// 3. 组呼通知 (文字转语音 TTS 模式)
await sdk.groupNotify({
tels: ["142001", "1000021"],
files: "紧急调度通知:请全体参会人员迅速就位!",
type: "text",
times: 1
});

// 4. 组呼通知 (音频文件播报模式)
await sdk.groupNotify({
tels: ["142001"],
files: "notice.wav",
type: "voice",
times: 3
});

视频 API

SDK 方法底层方法说明
initVideo(container, options)new VideoWebRtc(container, options)初始化视频窗口。
playVideo({ video })video.play(index, video, id, options)播放一路普通视频。
playVideo({ meetId, tel })joinVideoMember + video.play视频会商入会播放;SDK 内部等待 meeting:member 后再播放。
playVideos(items)video.playAll 或循环 play批量播放。
closeVideo(idOrIndex)close / closeByVideo按窗口或视频 ID 关闭。
closeAllVideos(isSave)closeAll关闭全部视频。
startVideoPoll / stopVideoPollstartPoll / stopPoll视频轮巡控制。
playByOrderExpandWindow(video, id?, options?)video.play按空闲窗口顺序播放,满格时自动扩屏(1→4→6→9→16)。
isPlaying(video)返回该视频所在窗口编号,未播放返回 -1
isPlayingByIndex(index)指定窗口当前是否在播放。
getPlayingWindows()返回所有窗口的占用快照。
setVideoWindows(n) / setWindowsNum(n)setWindowsNum设置分屏数量。

playVideo 未显式传 index 时会自动分配空闲窗口;传了数字 index 则定点播放。

视频相关配置

配置项默认值说明
video.syncTokentrue是否把鉴权 token 写入 sessionStorage 供 scooper.video 读取。
video.syncTokenKeys["sc-auth","meetWebToken","videoWebToken"]同步写入的 key。默认不含裸 token,避免覆盖宿主应用登录态。
meeting.autoPlayMemberVideotrue收到成员入会通知时自动上屏;显式调用 playMeetingVideo 的成员不会重复上屏。
meeting.autoCloseMemberVideotrue收到成员离会通知时自动关闭其窗口。

软手柄 API

SDK 方法底层方法说明
initSoftHandler(options)ScSoftHandler.createSoftHandler创建独立软手柄。
registerSoftHandler(info?)softHandler.register注册 SIP/Janus 软手柄。
unregisterSoftHandler()softHandler.unregister注销软手柄。
softCall / softNewCallcall / newcall发起软手柄呼叫。
softAnswer(media?)answer应答软手柄呼入。
softHangup()hangup挂断软手柄呼叫。
setSoftHandlerVideoContainer({ remoteVideo, localVideo })softHandler.setVideoContainer绑定本地/远端 video 元素。
enableCamera(enabled?) / disableCamera()deviceControl.enableCamera开关本地摄像头。
toggleCamera(enabled?)deviceControl.enableCamera切换摄像头;省略参数时基于当前状态取反。
isCameraEnabled()摄像头当前是否开启。
muteMicrophone(isMute?)softHandler.audioInputMuted麦克风静音开关,返回实际生效状态。
isMicrophoneMuted()麦克风当前是否静音。

软手柄自应答配置:

配置项默认值说明
softHandler.autoAnswerSelfCalltrue收到 incomingcall/autoAnswer,也就是 SoftHandlerEvent.IN_CALL_ANSWER 时,SDK 自动调用 softHandler.answer(...)
softHandler.autoAnswerDispatchCalltrueanswerCalljoinMeeting({ controllerTel, tel }) 后,在应答窗口内收到 notifyType=call_dispatch 的软手柄呼入时自动应答。
softHandler.dispatchAnswerTimeout5000调度应答号码的有效窗口,单位毫秒。

事件 API

SDK 方法说明
sdk.on(event, handler)监听单个 SDK 事件,返回取消监听函数。
sdk.once(event, handler)监听一次。
sdk.onAny((event, payload) => {})监听所有 SDK 事件。
callbacks.onEvent(event, payload)初始化时配置全局回调。
callbacks.onMeetingStatus(payload) 等具名回调ScooperMeetingSDK.EVENT 一一对应。

后台 channel、dispatch.event_const、SDK 事件和具名 callback 的完整对照见 docs/event-listeners.md