# rcs-sdk

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

Latest version **0.1.7** (published 2022-04-19) · MIT license · 0 weekly downloads

## Install

```sh
npm install rcs-sdk
pnpm add rcs-sdk
yarn add rcs-sdk
bun add rcs-sdk
```

## Health

**Score 25/100 (F)** — status: abandoned.

Positive: has types; no vulnerabilities; high quality score.

Warnings: low downloads; no esm support; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.1.7 |
| Published | 2022-04-19 |
| First published | 2022-03-24 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | CommonJS |
| Dependencies | 4 |
| Unpacked size | 120 KB |
| Known vulnerabilities | 0 (+23 in 1 direct dependencies) |
| Install scripts | no |
| Author | jasony62 |
| Maintainers | jasony62 |
| Keywords | RCS, IM |

## Links

- npm: https://www.npmjs.com/package/rcs-sdk
- npm.io page: https://npm.io/package/rcs-sdk

## Dependencies (4)

- [axios](https://npm.io/package/axios.md) ^0.26.0
- [debug](https://npm.io/package/debug.md) ^4.3.3
- [nanoid](https://npm.io/package/nanoid.md) ^3.3.1
- [rcs-data](https://npm.io/package/rcs-data.md) 0.1.7

## Alternatives

- [@js-joda/timezone](https://npm.io/package/@js-joda/timezone.md) — 383.4K weekly downloads
- [chartjs-adapter-moment](https://npm.io/package/chartjs-adapter-moment.md) — 210.8K weekly downloads
- [strftime](https://npm.io/package/strftime.md) — 171.2K weekly downloads
- [vue-flatpickr-component](https://npm.io/package/vue-flatpickr-component.md) — 115.8K weekly downloads
- [timepicker](https://npm.io/package/timepicker.md) — 51.0K weekly downloads

## Recent versions

- 0.1.7 (latest) — 2022-04-19
- 0.1.6 — 2022-04-14
- 0.1.5 — 2022-04-07
- 0.1.4 — 2022-04-06
- 0.1.3 — 2022-03-30
- 0.1.2 — 2022-03-29
- 0.1.1 — 2022-03-27
- 0.1.0 — 2022-03-24

## README

封装客户端应用与 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`

---
_Source: https://npm.io/package/rcs-sdk · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
