Janus网关的现代JavaScript客户端。基于WebSocket。原始客户端可以在此处找到:https://janus.conf.meetecho.com/docs/rest.html。
此示例假设Janus服务器在本地运行,并在其默认端口8188上启用了WebSocket支持
var janus = new Janus.Client('ws://localhost:8188', { token: 'token', apisecret: 'apisecret', keepalive: 'true' }); janus.createConnection('id').then(function(connection) { connection.createSession().then(function(session) { session.attachPlugin('bla').then(function(plugin) { plugin.send({}).then(function(response){}); plugin.on('message', function(message) {}); plugin.detach(); }); }); });
npm i janus-gateway-js
项目有一个简单的构建过程。默认情况下,npm run-script build会构建单个文件janus.js,其中包含Janus库及其所有依赖项。
默认构建。用于集成测试。
$(npm bin)/gulp
bluebird和webrtc-adapter被外部化到vendor.js
$(npm bin)/gulp external
该库可用于Node和浏览器环境。在浏览器中,它通过window.Janus声明。导出的类有:
用于创建连接的类。如果您想使用相同的选项创建多个连接到相同地址,请使用它。
new Client(address, [options])
创建Client的新实例。
address {string}。Janus服务器的WebSocket地址。options {Object} 选项。可选。在new Connection中查看其规格。此客户端创建的每个新连接都将使用options对象。client.createConnection(id)
返回一个promise,该promise解析为已经打开的Connection的新实例。
id {string} id表示到Janus的WebSocket连接。EventEmitter2的实例。
new Connection(id, address, [options])
创建Connection的新实例。在Node环境中,为创建的实例附加错误监听器非常重要。更多详情请查看https://nodejs.org/api/events.html#events_error_events。
id {string}。address {string}。Janus服务器的WebSocket地址。options {Object} 选项。可选。options.token {string}。可选。Janus令牌。options.apisecret {string}。可选。Janus API密钥。options.keepalive {boolean|number}。可选。如果为true,则每30秒向Janus服务器发送一次保活消息。如果是正整数,则每[number]毫秒发送一次保活消息。Connection.create(id, address, [options])
委托给上述构造函数。重写它以创建自定义Connection。
connection.getId()
返回连接的id。
connection.getAddress()
返回连接的地址。
connection.getOptions()
返回连接的选项。
connection.open()
返回一个promise,当到options.address的WebSocket连接打开时,该promise解析。
connection.close()
返回一个promise,当连接关闭时,该promise解析。
connection.send(message)
发送消息。返回一个promise,在消息发送后立即解析。
message {Object}。connection.sendSync(message)
发送消息。返回一个promise。如果连接有一个id等于message['transaction']的事务,则该promise在事务完成后解析。否则与connection.send相同。
message {Object}。connection.addTransaction(transaction)
向连接添加事务。
transaction {Transaction}。connection.executeTransaction(message)
执行id等于message['transaction']的事务。返回一个promise,在事务执行后解析。
message {Object}。connection.createSession()
返回一个promise,该promise解析为Session的新实例。
connection.hasSession(sessionId)
连接是否有sessionId的会话。
sessionId {string}connection.getSession(sessionId)
从连接 返回会话,如果找不到会话则返回undefined。
sessionId {string}。connection.getSessionList()
返回当前会话的数组。如果没有会话,则为空。
connection.addSession(session)
向连接添加会话。
session {Session}。connection.removeSession(sessionId)
从连接中移除会话。
sessionId {string}。表示Janus会话。EventEmitter2的实例。
new Session(connection, id)
创建Session的新实例。
connection {Connection} 已打开的Connection实例id {string}Session.create(connection, id)
委托给上述构造函数。重写它以创建自定义Session。
session.getId()
返回会话的id。
session.send(message)
将会话id添加到消息中,并将其委托给连接的send方法。返回连接的send的promise。
message {Object}session.attachPlugin(name)
附加插件。返回一个promise,该promise解析为Plugin的新实例。会话可能有多个同名插件。
name {string} 插件名称session.destroy()
销毁会话。返回一个promise,当会话成功销毁时,该promise解析。
session.cleanup()
清理会话资源。使用此方法时要非常小心。不要在活动会话上调用它。返回一个promise,当会话清理完成时,该promise解析。
session.hasPlugin(pluginId)
会话是否有该id的插件。
pluginId {string}session.getPlugin(pluginId)
从会话返回插件,如果找不到插件则返回undefined。
pluginId {string}session.getPluginList()
返回已附加插件的数组。如果没有插件,则为空。
session.addPlugin(plugin)
向会话添加插件。
plugin {Plugin}。session.removePlugin(pluginId)
从会话中移除插件。
pluginId {string}。session.sendSync(message)
发送消息。返回一个promise。如果会话有一个id等于message['transaction']的事务,则该promise在事务完成后解析。否则与session.send相同。
message {Object}。session.addTransaction(transaction)
向会话添加事务。
transaction {Transaction}。session.executeTransaction(message)
执行id等于message['transaction']的事务。返回一个promise,在事务执行后解析。
message {Object}。表示Janus插件。EventEmitter2的实例。
new Plugin(session, name, id)
创建Plugin的新实例。
session {Session} Session的实例name {string} 插件名称id {string}Plugin.create(session, id)
委托给上述构造函数。重写它以创建自定义Plugin。
Plugin.register(name, aClass)
为名称name注册插件类aClass,这样当使用name调用Plugin.create时,会创建aClass的实例。
plugin.getId()
返回插件的id。
plugin.getName()
返回插件的名称。
plugin.getResponseAlias()
返回插件在response['plugindata']['data']中的别名。通常是插件名称的最后一部分。
plugin.send(message)
将插件id添加到消息中,并将其委托给会话的send方法。返回会话的send的promise。
message {Object}plugin.detach()
分离插件。返回一个promise,当插件成功分离时,该promise解析。
plugin.cleanup()
清理插件资源。使用此方法时要非常小心。不要在已附加的插件上调用它。返回一个promise,当插件清理完成时,该promise解析。
plugin.sendSync(message)
发送消息。返回一个promise。如果插件有一个id等于message['transaction']的事务,则该promise在事务完成后解析。否则与plugin.send相同。
message {Object}。plugin.addTransaction(transaction)
向插件添加交易。
transaction {Transaction}。plugin.executeTransaction(message)
执行id等于message['transaction']的交易。返回一个在交易执行后解决的promise。
message {Object}。持有通用媒体方法和数据的抽象插件类。继承自Plugin。
重要 MediaPlugin有一些方法需要可用的WebRTC,这在Node环境中是不存在的。所以在使用Node或不提供WebRTC的浏览器中使用此库时要小心。这个警告对所有继承自MediaPlugin 的插件都适用。
除Plugin外的其他方法有:
plugin.createPeerConnection([options])
创建并返回创建的RTCPeerConnection。同时也将其存储在插件实例上。
options RTCConfigurationplugin.getPeerConnection()
返回已创建的RTCPeerConnection实例,如果未创建则返回null。
plugin.addTrack(track, [...stream])
向已创建的PeerConnection添加轨道。
track MediaStreamTrackstream MediaStream。包含轨道的流。可重复参数。plugin.getUserMedia(constraints)
封装MediaDevices.getUserMedia,并为屏幕捕获添加额外约束。返回promise。
constraints MediaStreamConstraintsplugin.createOffer([options])
返回一个promise,解决为创建的offer SDP。
options RTCOfferOptionsplugin.createAnswer(jsep, [options])
返回一个promise,解决为创建的answer SDP。
jsep RTCSessionDescription offer SDPoptions RTCAnswerOptionsplugin.setRemoteSDP(jsep)
在存储的PeerConnection实例上设置远程SDP。返回promise。
jsep RTCSessionDescriptionplugin.hangup()
发送挂断请求。返回一个promise,在插件成功挂断时解决。
对应'janus.plugin.audiobridge'。继承自MediaPlugin。下面方法参数的更多详细信息可以在 @see https://janus.conf.meetecho.com/docs/janus__audiobridge_8c.html#details 找到。除MediaPlugin外的其 他方法有:
plugin.create(roomId, [options])
请求创建一个音频房间。返回一个promise,在房间创建时解决。
roomId intoptions Object。见JSDocu。plugin.destroy(roomId, [options])
请求销毁音频房间。返回一个promise,在房间销毁时解决。
roomId intoptions Object。见JSDocu。plugin.list()
请求当前房间列表。返回一个promise,解决为插件响应。
plugin.listParticipants(roomId)
请求房间的参与者列表。返回一个promise,解决为插件响应。
roomId intplugin.join(roomId, [options])
请求加入音频房间。返回一个promise,在加入房间时解决。
roomId intoptions Object。见JSDocu。plugin.leave()
请求离开当前房间。返回一个promise,在离开房间时解决。
plugin.change(roomId, [options])
请求更换房间。返回一个promise,在房间更换时解决。
roomId intoptions Object。见JSDocu。plugin.configure([options], [jsep])
配置当前房间的设置。返回一个promise,在房间配置完成时解决。
options Object。见JSDocu。jsep RTCSessionDescriptionplugin.offerStream(stream, [offerOptions], [configureOptions])
使用流创建一个对等连接并发送offer。返回一个promise,解决为sendSDP promise。
stream MediaStream。offerOptions Object。offer的选项。configureOptions Object。offer发送后配置房间的选项。plugin.sendSDP(jsep, [configureOptions])
发送带有jsep和配置选项的offer。返回一个promise,在offer被接受后解决。
jsep RTCSessionDescriptionconfigureOptions Object。配置房间的选项。对应'janus.plugin.cm.audioroom'。文档页面是 https://github.com/cargomedia/janus-gateway-audioroom。它提供与`AudiobridgePlugin`相同的功能,只有一些小的差异: https://github.com/cargomedia/janus-gateway-audioroom#overview。
对应'janus.plugin.streaming'。继承自MediaPlugin。下面方法参数的更多详细信息可以在 @see https://janus.conf.meetecho.com/docs/janus__streaming_8c.html#details 找到。除MediaPlugin外的其他方法有:
plugin.create(mountpointId, [options])
请求创建一个挂载点。返回一个promise,在挂载点创建时解决。
mountpointId intoptions Object。见JSDocu。plugin.destroy(mountpointId, [options])
请求销毁挂载点。返回一个promise,在挂载点销毁时解决。
mountpointId intoptions Object。见JSDocu。plugin.list()
请求当前流的列表。返回一个promise,解决为插件响应。
plugin.watch(mountpointId, [options])
请求观看挂载点。返回一个promise,在挂载点被观看时解决。
mountpointId intoptions Object。见JSDocu。plugin.start([jsep])
请求启动挂载点。返回一个promise,解决为来自janus的SDP。
jsep RTCSessionDescriptionplugin.stop()
请求停止当前挂载点。返回一个promise,在挂载点停止时解决。
plugin.pause()
请求暂停当前挂载点。返回一个promise,在挂载点暂停时解决。
plugin.switch(mountpointId, [options])
请求切换挂载点。返回一个promise,在挂载点切换时解决。
mountpointId intoptions Object。见JSDocu。plugin.connect(mountpointId, [options])
切换方法。如果插件没有当前挂载点,则此方法调用watch,否则调用switch。
mountpointId intoptions Object。见JSDocu。plugin.enable(mountpointId, [options])
请求启用挂载点。返回一个promise,在挂载点启用时解决。
mountpointId intoptions Object。见JSDocu。plugin.disable(mountpointId, [options])
请求禁用挂载点。返回一个promise,在挂载点禁用时解决。
mountpointId intoptions Object。见JSDocu。plugin.recording(mountpointId, [options])
请求在挂载点开始或停止录制。
mountpointId intoptions Object。见JSDocu。对应'janus.plugin.cm.rtpbroadcast'。继承自MediaPlugin。文档页面是 https://github.com/cargomedia/janus-gateway-rtpbroadcast。除`MediaPlugin`外的其他方法有:
plugin.create(id, [options])
请求创建一个挂载点。返回一个promise,在挂载点创建时解决。
id stringoptions Object。见JSDocu。plugin.destroy(id)
请求销毁挂载点。返回一个promise,在挂载点销毁时解决。
id stringplugin.list([id])
请求id的流定义。如果省略id,则请求当前流的流定义。返回一个promise,解决为结果。
id stringplugin.watch(id)
请求观看挂载点。返回一个promise,在挂载点被观看时解决。
id stringplugin.watchUDP(id, streams)
将数据包从UDP服务器转发到UDP客户端。返回一个promise,在操作完成时解决。
id stringstreams Arrayplugin.start()
请求启动挂载点。返回一个promise,解决为来自janus的SDP。
plugin.stop()
请求停止当前挂载点。返回一个promise,在挂载点停止时解决。
plugin.pause()
请求暂停当前挂载点。返回一个promise,在挂载点暂停时解决。
plugin.switch(id)
请求切换挂载点。返回一个promise,在挂载点切换时解决。
id stringplugin.switchSource(index)
请求为当前会话挂载点调度切换索引为index的流。返回一个promise,在janus接受请求时解决。
index numberplugin.superuser(enabled)
将当前会话升级为超级用户会话,或降级为普通会话。
enabled booleanWebSocket的Promise化API。EventEmitter2的实例。
new WebsocketConnection([websocket])
创建一个新的WebsocketConnection实例。
websocket {WebSocket} websocket。可选。可以是W3C或Node WebSocket实例。
websocketConnection.open(address, [protocol])
通过protocol创建一个到address的新websocket连接。返回一个在websocket连接打开时解决的promise。
address {string} 地址。要连接的Websocket服务器地址。protocol {string} 协议。Websocket协议。websocketConnection.close()
返回一个在websocketConnection关闭时解决的promise。
websocketConnection.isOpened()
websocketConnection是否已打开。
websocketConnection.send(message)
发送消息。返回一个在消息发送后立即解决的promise。
message {Object}。websocketConnection.onMessage(message)
接收消息的监听器。如果需要模拟接收消息,可以调用它。
message {Object}。自定义Janus错误。用于处理Janus消息中发生的受控错误。
new JanusError(janusMessage)
创建一个新的JanusError实例。
janusMessage {JanusMessage} 导致错误的消息。error.code
Janus错误代码
error.janusMessage
错误的Janus消息
测试位于test/目录下。使用npm test运行它们。
这些测试位于test/unit/下。使用$(npm bin)/mocha运行它们。
这些测试位于test/integration/下。要运行它们,你需要:
test/integration/config.json$(npm bin)/karma start test/karma.conf.js运行测试。请注意,karma应该能够看到必要版本的Chrome。之后,npm发布应该会自动完成。如果没有自动完成,则手动发布:
npm publish https://github.com/sjkummer/janus-gateway-js/archive/<GitTagWithUpdatedPackageJson>.tar.gz
目前该项目有四个已实现的插件:audiobridge、videostreaming、rtpbroadcast和audioroom。这是暂时的。一旦项目稳定,这些插件将被移到它们自己的仓库中。如果你需要一个未实现的插件,那么你需要自己编写它。
为简单起见,让我们编写一个只做audio的EchoTest插件。
function EchoTest() { Janus.MediaPlugin.apply(this, arguments); } EchoTest.NAME = 'janus.plugin.echotest'; EchoTest.prototype = Object.create(Janus.MediaPlugin.prototype); EchoTest.prototype.constructor = EchoTest; Janus.Plugin.register(EchoTest.NAME, EchoTest); /** * @param {boolean} state * @returns {Promise} * @fulfilled {RTCSessionDescription} jsep */ EchoTest.prototype.audio = function(state) { var self = this; return Promise .try(function() { return self.getUserMedia({audio: true, video: false}); }) .then(function(stream) { self.createPeerConnection(); stream.getTracks().forEach(function(track) { self.addTrack(track, stream); }); }) .then(function() { return self.createOffer(); }) .then(function(jsep) { var message = {body: {audio: state}, jsep: jsep}; return self.sendWithTransaction(message); }) .then(function(response) { var jsep = response.get('jsep'); if (jsep) { self.setRemoteSDP(jsep); return jsep; } }); };
然后我们可以这样使用它
var janus = new Janus.Client(config.url, config); janus.createConnection('client') .then(function(connection) { return connection.createSession(); }) .then(function(session) { return session.attachPlugin(EchoTest.NAME); }) .then(function(echotestPlugin) { return echotestPlugin.audio(true); })


AI一键生成PPT,就用博思AIPPT!
博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。


AI赋能电商视觉革命,一站式智能商拍平台
潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。


企业专属的AI法律顾问
iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。


稳定高效的流量提升解决方案,助力品牌曝光
稳定高效的流量提升解决方案,助力品牌曝光


最新版Sora2模型免费使用,一键生成无水印视频
最新版Sora2模型免费使用,一键生成无水印视频


实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。


选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。


AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。


最强AI数据分析助手
小浣熊家族Raccoon,您的AI智能助手,致力于通过先进的人工智能技术,为用户提供高效、便捷的智能服务。无论是日常咨询还是专业问题解答,小浣熊都能以快速、准确的响应满足您的需求,让您的生活更加智能便捷。


像人一样思考的AI智能体
imini 是一款超级AI智能体,能根据人类指令,自主思考、自主完成、并且交付结果的AI智能体。
最新AI工具、AI资讯
独家AI资源、AI项目落地

微信扫一扫关注公众号