rcs-sdk
v0.1.7
Published
封装客户端与平台间的相互调用功能。
Downloads
6
Readme
封装客户端应用与 5G 消息平台间的相互调用功能。
使用 SDK
完整代码示例请查看单元测试文件test/sdk.test.js
。
初始化
rcs-sdk
默认不安装JsSIP
和WebSocket
,需要由使用 sdk 的应用自己进行安装。浏览器环境中不需要安装WebSocket
。
import * as JsSIP from 'jssip'
import * as WebSocket from 'ws'
import { RcsIMSDK } from 'rcs-sdk'
const rcssdk = await RcsIMSDK.formDM({JsSIP, WebSocket}
//或者
RcsIMSDK.formDM({JsSIP, WebSocket}.then((rcssdk) => { }).catch(e => { })
登录和注册
await rcssdk.login(userid, password)
//或者
rcssdk.login(username, password).then(async (sdkrst) => {
/**
* 获取账户基本信息
*/
let { account } = sdkrst.data
let { userid, nickname, nameAddr } = account
})
/*账号信息*/
expect(rcssdk.account.userid).toBe(userid)
expect(rcssdk.account.nickname).toBe('alice')
expect(rcssdk.account.nameAddr.toString()).toBe('<sip:[email protected]>')
发送消息
发送消息要先新建消息再发送。
发送文本消息
/*新建文本消息对象*/
let sdkrst = await rcssdk.createTextMessage(ConverstionId, recipient, Text)
let rcsmsg = sdkrst.data
expect(rcsmsg.content).toBe(Text)
/*新建的消息处于发送状态*/
expect(rcsmsg.processingNotification).toBe('sending')
sdkrst = await rcssdk.sendMessage(rcsmsg)
rcsmsg = sdkrst.data
/*消息处于已发送状态*/
expect(rcsmsg.processingNotification).toBe('sent')
发送文件消息
/**
* 1 - 新建文件消息对象
*/
let sdkrst = await rcssdk.createFileMessage(ConverstionId, recipient, rawFile)
let rcsmsg = sdkrst.data
let { file, thumbnail } = rcsmsg.content
/*文件消息对象中记录了文件的基本信息*/
expect(file.name).toBe(rawFile.name)
expect(file.size).toBe(rawFile.size)
expect(file.type).toBe(rawFile.type)
//缩略图信息空的,不可用
expect(rcsmsg.thumbnailValid).toBeFalsy()
/*新建的消息处于发送状态*/
expect(rcsmsg.processingNotification).toBe('sending')
/**
* 2 - 上传文本消息对象
*/
/* 文件消息创建后,需要执行上传文件,获得文件存储信息 */
sdkrst = await rcssdk.uploadFile(rcsmsg, rawFile)
rcsmsg = sdkrst.data
expect(file.name).toBe(rawFile.name)
expect(file.size).toBe(rawFile.size)
expect(file.type).toBe(rawFile.type)
expect(file.data).toMatchObject({
url: 'http://files.rcs-sdk.com/file-1.png',
until: '2017-04-25T12:17:07Z',
})
// 文件上传服务不保证对所有类型的文件都提供缩略图,所以需要检查消息中是否包含了有效的缩略图信息
let thumbnailValid = rcsmsg.content.thumbnailValid
expect(thumbnailValid).toBeTruthy()
expect(thumbnail.size).toBe(100)
expect(thumbnail.type).toBe('image/png')
expect(thumbnail.data).toMatchObject({
url: 'http://files.rcs-sdk.com/thumbnail-1.png',
until: '2017-04-25T12:17:07Z',
})
/**
* 3 - 发送文件消息对象
*/
sdkrst = await rcssdk.sendMessage(rcsmsg)
rcsmsg = sdkrst.data
/*消息处于已发送状态*/
expect(rcsmsg.processingNotification).toBe('sent')
发送建议回复
/*新建文本消息对象*/
let sdkrst = await rcssdk.createSugRspMessage(ConverstionId, recipient, Sug)
let rcsmsg = sdkrst.data
/*新建的消息处于发送状态*/
expect(rcsmsg.processingNotification).toBe('sending')
sdkrst = await rcssdk.sendMessage(rcsmsg)
rcsmsg = sdkrst.data
/*消息处于已发送状态*/
expect(rcsmsg.processingNotification).toBe('sent')
接收消息
通过在 sdk 上注册监听事件CbEvents.ONRECVNEWMESSAGE
接收新消息。
rcssdk.on(CbEvents.ONRECVNEWMESSAGE, (sdkrst) => {
let rcsmsg = sdkrst.data
expect(rcsmsg.initialContentType.fulltype).toBe(Message_Content_Type.text)
expect(rcsmsg.content).toBe('hello')
expect(rcsmsg.from.toString()).toBe(from)
expect(rcsmsg.to.toString()).toBe(to)
expect(rcsmsg.conversationId).toBe(conversationId)
expect(rcsmsg.contributionId).toBe(contributionId)
expect(rcsmsg.messageId).toBe(messageId)
expect(rcsmsg.dateTime.value).toBe(dateTimeStr)
resolve()
})
获得会话列表
const sdkrst = await rcssdk.getAllConversationList()
//会话对象的数组
const convarr = sdkrst.data
expect(convarr).toHaveLength(1)
//会话对象
let conv = convarr[0]
expect(conv.id).toBe('1')
expect(conv.viewer.toString()).toBe('<sip:[email protected]>')
expect(conv.peer.toString()).toBe('<tel:+8617928222350>')
expect(conv.content).toBe('hello world')
获得会话消息列表
const ConversationID = '指定的会话ID'
const sdkrst = await rcssdk.getHistoryMessageList(ConversationID)
/* 会话里有5条消息 */
const msgarr = sdkrst.data
expect(msgarr).toHaveLength(5)
/* 依次是:文本,文本加建议,卡片,卡片加建议,文件 */
/* 消息是RcsMsg的实例 */
let [text, textAndSugs, card, cardAndSugs, file] = msgarr
/**
* 1 - 文本消息
*/
expect(text.initialContentType.fulltype).toBe(Message_Content_Type.text)
/*消息内容*/
expect(text.content).toBe('hello world')
/*消息ID*/
expect(text.messageId).toBe('1')
/*发送人*/
expect(text.from.toString()).toBe('<sip:[email protected]>')
/*接收人*/
expect(text.to.toString()).toBe('<sip:[email protected]>')
/*消息生成时间*/
expect(text.dateTime.value).toBe('2012-09-01T11:46:43.350+08:00')
/*递送状态*/
expect(text.deliveryNotification).toBe('delivered')
expect(text.displayNotification).toBe('displayed')
expect(text.processingNotification).toBe('stored')
获得联系人列表
const sdkrst = await rcssdk.getContactList()
获得联系人详情
const sdkrst = await rcssdk.getContactDetail(userid)
获得 Chatbot 应用列表
const sdkrst = await rcssdk.getChatbotList()
获得 Chatbot 应用详情
const sdkrst = await rcssdk.getChatbotDetail(chatbotid)
环境变量
服务地址
| 环境变量 | 用途说明 | 默认值 | | --------------------------- | -------------------------------------------------- | ------ | | RCS_SDK_AUTH_API_SERVER | 提供用户认证服务相关 API 的服务访问地址。 | | | RCS_SDK_AUTH_API_PIN | 认证服务需要的万能验证码 | | | RCS_SDK_AUTH_TYPE | 认证方式 apply(appkey、secret)方式 和 账号密码方式 | | | RCS_SDK_AUTH_API_TIMEOUT | 认证服务 API 超时时间 | | | RCS_SDK_MSG_API_SERVER | 提供消息服务相关 API 的服务访问地址。 | | | RCS_SDK_MSG_API_TIMEOUT | 消息服务 API 访问超时时间。 | | | RCS_SDK_CONTACT_API_SERVER | 提供联系人服务相关 API 的服务访问地址。 | | RCS_SDK_CONTACT_API_TIMEOUT | 联系人服务 API 访问超时时间。 | | | RCS_SDK_CHATBOT_API_SERVER | 提供 Chatbot 获取服务相关 API 的服务访问地址。 | | | RCS_SDK_CHATBOT_API_TIMEOUT | Chatbot 获取服务 API 访问超时时间。 | | | RCS_SDK_UPLOAD_API_SERVER | 提供文件上传服务相关 API 的服务访问地址。 | | | RCS_SDK_UPLOAD_API_TIMEOUT | 文件上传服务 API 访问超时时间。 | | | RCS_SDK_SIP_SERVER | 提供消息收发服务的 SIP 服务访问地址。 | |
模拟数据
支持通过环境变量指定服务接口返回模拟数据的存储位置。
| 环境变量 | 用途说明 | 默认值 | | ---------------------------------------- | ----------------------------------------------------------- | ------ | | RCS_SDK_SKIP_AUTH | 设置 SIP 服务是否检查用户认证状态。 | false | | RCS_SDK_MOCK_FILE_PATH_GET_TOKEN | 指定模拟返回当前用户登录成功后获得的 token 数据的存储位置。 | | | RCS_SDK_MOCK_FILE_PATH_GET_ACCOUNT | 指定模拟返回当前用户账户数据的存储位置。 | | | RCS_SDK_MOCK_FILE_PATH_CONVERSATION_LIST | 指定模拟返回当前用户会话列表数据的存储位置。 | | | RCS_SDK_MOCK_FILE_PATH_CONTACT_LIST | 指定模拟返回当前用户联系人列表数据的存储位置。 | | | RCS_SDK_MOCK_FILE_PATH_UPLOAD_FILE | 指定模拟返回当前用户上传文件接口返回数据的存储位置。 | |
单元测试
可以通过指定环境变量使用模拟测试数据和输出调试日志。
使用模拟数据
通过环境变量MOCK
控制服务接口访问真实服务还是使用指定的模拟数据。模拟数据的获取位置通过RCS_SDK_MOCK_
开通的环变量指定。
MOCK=auth,sip,conversation,message,uploader npm test sdk.test.js
npm test user.test.js
MOCK=message,uploader npm test message
MOCK=conversation npm test conversation
MOCK=contact npm test contact
输出日志
通过环境变量DEBUG
控制输出日志。
DEBUG=rcssdk:* MOCK=auth,sip,conversation,message npm test sdk.test.js