# rongcloud-node-im-sdk-lite

> NodeJS 通过 ws 协议模拟 IM 客户端

Latest version **0.1.1** (published 2016-03-23) · ISC license · 0 weekly downloads

## Install

```sh
npm install rongcloud-node-im-sdk-lite
pnpm add rongcloud-node-im-sdk-lite
yarn add rongcloud-node-im-sdk-lite
bun add rongcloud-node-im-sdk-lite
```

## Health

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

Positive: no vulnerabilities.

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

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.1.1 |
| Published | 2016-03-23 |
| First published | 2016-03-22 |
| Weekly downloads | 0 |
| License | ISC |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 5 |
| Known vulnerabilities | 0 (+13 in 3 direct dependencies) |
| Install scripts | no |
| Author | plusmancn@gmail.com |
| Maintainers | plusman |
| Keywords | NodeJS, WebSocket, RongCloud |

## Links

- npm: https://www.npmjs.com/package/rongcloud-node-im-sdk-lite
- Repository: https://github.com/plusmancn/rongcloud-node-im-sdk-lite
- Homepage: https://github.com/plusmancn/rongcloud-node-im-sdk-lite#readme
- Issues: https://github.com/plusmancn/rongcloud-node-im-sdk-lite/issues
- npm.io page: https://npm.io/package/rongcloud-node-im-sdk-lite

## Dependencies (5)

- [co](https://npm.io/package/co.md) ^4.6.0
- [ws](https://npm.io/package/ws.md) ^1.0.1
- [lodash](https://npm.io/package/lodash.md) ^4.6.1
- [request](https://npm.io/package/request.md) ^2.69.0
- [protobufjs](https://npm.io/package/protobufjs.md) ^5.0.1

## Alternatives

- [@opentelemetry/exporter-zipkin](https://npm.io/package/@opentelemetry/exporter-zipkin.md) — 14.8M weekly downloads
- [pusher-js](https://npm.io/package/pusher-js.md) — 2.0M weekly downloads
- [browserify](https://npm.io/package/browserify.md) — 1.7M weekly downloads
- [sqs-consumer](https://npm.io/package/sqs-consumer.md) — 1.7M weekly downloads
- [@sanity/eventsource](https://npm.io/package/@sanity/eventsource.md) — 930.8K weekly downloads

## Recent versions

- 0.1.1 (latest) — 2016-03-23
- 0.1.0 — 2016-03-22

## README

# rongcloud-node-im-sdk-lite
[![rongcloud-node-im-sdk-lite](http://img.shields.io/npm/v/rongcloud-node-im-sdk-lite.svg)](https://www.npmjs.org/package/rongcloud-node-im-sdk-lite)

> [rongcloud-web-im-sdk-v2](https://github.com/rongcloud/rongcloud-web-im-sdk-v2) 的 node 部分移植版。

## why
为什么要有这个包？因为有时候它能为你省下好多机器，好多软妹币。  
再则，顺道能学习下 Buffer，TypedArray，WebSocket 还是不错的，蛮能开阔视野的。

## protobuf 解析
`.proto` 位置在 `config/rongcloud.proto`，配合 [protobufjs](https://github.com/dcodeIO/protobuf.js) 解析库，对融云消息体进行解析，详情查看 `lib/protobuf.js`。

## 交互流程
```
                                                                                     
    <---------------------------------Server-------------------------------------->  
      ^         |        ^   |                   ^   |          ^         |          
      |         |        |   |                   |   |          |         |          
      |         |    connect |                   |   |          |         |          
      |         |       ws   |                   |   |        Send        |          
    Req      return   server |            Send   |   |   QueryConMessage  |          
   nav.js  WebSocket     |   |        QueryMessage   |          |         |          
      |     address   +--+   +--+          +-----+   +------+   |         +--+       
      |         |     |      return        |        return  |   |          Send      
      |         |     |  ConnAckMessage    |    QueryAckMessage |     PublishMessage 
      |         |     |         |          |                |   |            |       
      |         |     |         |          |                |   |            |       
      |         |     |         |          |                |   |            |       
      |         v     |         v          |                v   |            v       
    <---------------------------------Client-------------------------------------->  
                                                                                     
                                                                                     
                                                                                     
                                                                                     
     <-----------------------------Server------------------------------------------> 
       ^                 ^            |                                              
       |                 |            |             +----------------------+         
       |                 |            |             |                      |         
   Response            Send           |             |       /\_/\          |         
PublishMessage    PingReqMessage      |             |     =( °w° )=        |         
     With            Interval      Return           |       )   (  //      |         
 PubAckMessage           |     PingRespMessage      |      (__ __)//       |         
       |                 |            |             |                      |         
       |                 |            |             |                      |         
       |                 |            |             +----------------------+         
       |                 |            v                                              
     <---------------------------------Client--------------------------------------> 
                                                                                     
```


## 消息类型
类型转换公式
```
(标识符号 >> 4) & 15
```

### ConnAckMessage
> WebSocket 连接认证通过 server 返回

```
  +---> 类型标识符
[ |
  |          长度
  |          |   |   |   用户聊天ID
  32, 0,  0, 0,  5,  98,  53,  52,
  
      |
  48, 50, 0, 22, 97, 122, 112, 97,
  .... 后面位暂时未用到 .....
]
```
取出的用户ID，在 QueryMessage 里作为输入

### QueryMessage 
> client 请求历史消息报文如下

```
  +---> 类型标识符
  |
  |     长度
  |    |    |   p    u    l    l   M
[ |    |    |   |    |    |    |   |
  82,  0,   7, 112, 117, 108, 108, 77, 
  
                    |    用户ID
  s     g   长度    b    1    0    8
  |     |   |  |    |    |    |    |
  115, 103, 0, 6,   98,  49,  48,  56,
  
       |
  0    6
  |    |
  48,  54,  0, 1,   8,   0,   16,  0, 
  32,  1
]
```
需要变动的是用户ID以及前方长度部分，比如用户为 c1782，则对应 Ascii 码为 `0, 5, 99, 49, 55, 56, 50`

### QueryAckMessage
> QueryMessage 请求的 Server 应答

```
  +---> 类型标识符
  |
[ |         |  unix（秒）  |
  99, 0, 1, 86, 236, 255, 212, 0,
  0,  10, .............protobuf..
  ..消息体.......................
]
```
此处的 protobuf 消息体，需要用 `Modules['DownStreamMessage'].decode` 方法解析。  
此处的时间转换也很有意思
```
                      转换为16进制，长度为2，缺位前方补 0
[86, 236, 255, 212] =======================================> ["56", "ec", "ff", "d4"]
parseInt("56ecffd4", 16) =====> 1458372564 
```
### QueryConMessage
> client 收到 QueryAckMessage 后向服务器做出的应答

```
  +---> 类型标识符
  |       + 本次会话内，第几次发送此类型消息
[ |       |
  112, 0, 1
]
```

### PublishMessage
> server 向 client 递送聊天消息，消息为其他用户发给此 client 登录的用户，topic 为 s_msg，

```
  +---> 类型标识符
  |
  |
[ |    |    unix（秒） |            |
  51,  86,  238, 6,   212, 0,  5,  115, 
  
    Topic         |            |
  95,  109, 115, 103, 0,   8,  99, 49, 
  
    消息来自谁             |
  55,  50,  48,  53,  56,  50, 0,  1,
  ........protobuf 消息体............
]
```
此处的 protobuf 消息体，需要用 `Modules['DownStreamMessage'].decode` 方法来解析，注意 DownStreamMessage 是单数

> server 向 client 递送聊天消息，消息为此 client 登录的用户，在其他端发送的消息，topic 为 ppMsgP。

```
[                       |
  58,  0,  0,   0,   0,  0, 6, 112, 
  
    Topic            |
  112, 77, 115, 103, 80, ...
  ...同 51 类型...
]
```
此处的 protobuf 消息体，需要用 `Modules.UpStreamMessage.decode` 方法来解析

### PubAckMessage 
> 收到 PublishMessage 后 client 的应答.

```
         + 本次会话内，第几次发送此类型消息
[        |
  64, 0, 1
];
```

### PingReqMessage
> client 发送给服务器的 💓 心跳包

```
[
  -64
];
```
此处使用 Typedarray 的时候，记得选择 Int8Array，带符号位数组。

### PingRespMessage
> 服务器  💓  心跳包返回

```
[
  -64
]
```

## Tips
使用 QueryMessage 的时候，注意融云消息24点过期机制

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