UNPKG

rcs-sdk

Version:

封装客户端与平台间的相互调用功能。

286 lines (225 loc) 9.35 kB
封装客户端应用与 5G 消息平台间的相互调用功能。 # 使用 SDK 完整代码示例请查看单元测试文件`test/sdk.test.js`。 ## 初始化 `rcs-sdk`默认不安装`JsSIP`和`WebSocket`,需要由使用 sdk 的应用自己进行安装。浏览器环境中不需要安装`WebSocket`。 ```js 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 => { }) ``` ## 登录和注册 ```ts 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:alice@rcs-sdk.com>') ``` ## 发送消息 发送消息要先新建消息再发送。 ### 发送文本消息 ```ts /*新建文本消息对象*/ 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') ``` ### 发送文件消息 ```ts /** * 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') ``` ### 发送建议回复 ```ts /*新建文本消息对象*/ 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`接收新消息。 ```ts 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() }) ``` ## 获得会话列表 ```ts 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:alice@rcs-sdk.com>') expect(conv.peer.toString()).toBe('<tel:+8617928222350>') expect(conv.content).toBe('hello world') ``` ## 获得会话消息列表 ```ts 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:alice@rcs-sdk.com>') /*接收人*/ expect(text.to.toString()).toBe('<sip:bob@rcs-sdk.com>') /*消息生成时间*/ 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') ``` ## 获得联系人列表 ```ts const sdkrst = await rcssdk.getContactList() ``` ## 获得联系人详情 ```ts const sdkrst = await rcssdk.getContactDetail(userid) ``` ## 获得 Chatbot 应用列表 ```ts const sdkrst = await rcssdk.getChatbotList() ``` ## 获得 Chatbot 应用详情 ```ts 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`