网易云信即时通讯 IM Elite SDK，为 web sdk 的下一代版本，提供完善的即时通信功能开发框架，屏蔽其内部复杂细节，对外提供较为简洁的 API 接口，方便第三方应用快速集成即时通信功能。

IM Elite SDK 分为 V1 和 V2 两个版本。V2 对 V1 的 API 接口做了大幅调整，并与其它客户端对齐。其中 V1 版本号 < 1，V2 版本号 >= 10。

## 安装

如果你是新用户，推荐使用 V2 API 的 SDK，安装方式为:

```
npm install nim-web-sdk-ng@">=10"
```

如果你是现有 V1 增强版用户，可使用下面命令安装 SDK。或者使用固定版本号安装

```
npm install nim-web-sdk-ng@"<1"
```

## IM V2

### sdk 选择

sdk 默认提供以下几种形式。其中 sdk 默认入口为 dist/v2/NIM_BROWSER_SDK.js。
注意，v2 暂未提供 QCHAT SDK。v2 IM SDK 接口兼容 v1 IM SDK。所以 v1 文件夹中没有构建 IM SDK。

```
dist/
  |── v2
    ├── NIM_BROWSER_SDK.js       v2 IM 浏览器适配版 UMD 格式
    ├── NIM_MINIAPP_SDK.js       v2 IM 小程序适配版 UMD 格式
    ├── NIM_UNIAPP_SDK.js        v2 IM UNIAPP 适配版 UMD 格式
    ├── NIM_RN_SDK.js            v2 IM RN 适配版 UMD 格式
    ├── CHATROOM_BROWSER_SDK.js  v2 聊天室浏览器适配版 UMD 格式
    ├── CHATROOM_MINIAPP_SDK.js  v2 聊天室小程序适配版 UMD 格式
    ├── CHATROOM_UNIAPP_SDK.js   v2 聊天室 UNIAPP 适配版 UMD 格式
    ├── CHATROOM_RN_SDK.js       v2 聊天室 RN 适配版 UMD 格式
  |── nodejs
    ├── nim.js                   v2 IM Node.js 适配版 ESM 格式
    ├── nim.d.ts                 TypeScript 类型定义入口
    ├── nim/                     TypeScript 类型定义目录
  |── v1
    ├── CHATROOM_BROWSER_SDK.js  v1 聊天室浏览器适配版 UMD 格式
    ├── CHATROOM_MINIAPP_SDK.js  v1 聊天室小程序适配版 UMD 格式
    ├── CHATROOM_UNIAPP_SDK.js   v1 聊天室 UNIAPP 适配版 UMD 格式
    ├── QCHAT_BROWSER_SDK.js     v1 圈组浏览器适配版 UMD 格式
    ├── QCHAT_UNIAPP_SDK.js      v1 圈组浏览器适配版 UMD 格式
```

#### 基础引入例子

```js
// 若使用 IM 能力则引入
import NIM from 'nim-web-sdk-ng'
// 等效于
import NIM from 'nim-web-sdk-ng/dist/v2/NIM_BROWSER_SDK'

// 0.11.0 版开始支持单例模式获取实例, 在此之前通过 new 创建实例
const nim = NIM.getInstance(
  {
    appkey: 'YOUR_APPKEY',
    debugLevel: 'debug',
    apiVersion: 'v2'
  },
  {}
)

nim.V2NIMLoginService.on('onLoginStatus', function (arg1) {
  console.log('收到 V2NIMLoginService 模块的 onLoginStatus 事件', arg1)
})

async function init() {
  try {
    await nim.V2NIMLoginService.login('YOUR_ACCOUNT', 'YOUR_TOKEN', {
      authType: 0
    })
  } catch (err) {
    console.error('login failed cause', err)
  }
}

init()
```

### Node.js 环境

Node.js 版本专为服务端场景设计，支持在 Node.js 环境中使用 NIM SDK 的核心功能。

#### 环境要求

- **Node.js 版本**: >= 20.0.0（使用原生 `fetch`、`FormData`、`Blob` API）
- **模块格式**: ESM（ES Modules）
- **依赖**: `ws`（WebSocket 库，已包含在 SDK 依赖中）

#### 安装

```bash
npm install nim-web-sdk-ng@">=10"
```

#### 引入方式

```js
// Node.js 环境专用入口
import NIM from 'nim-web-sdk-ng/dist/nodejs/nim.js'
```

#### 支持的服务模块

| 服务模块                        | 描述                             |
| ------------------------------- | -------------------------------- |
| `V2NIMLoginService`             | 登录服务                         |
| `V2NIMMessageService`           | 消息服务（发送/接收消息）        |
| `V2NIMMessageLogUtil`           | 消息日志工具（查询历史消息）     |
| `V2NIMMessageExtendUtil`        | 消息扩展工具（快捷评论、PIN 等） |
| `V2NIMLocalConversationService` | 本地会话服务                     |
| `V2NIMConversationService`      | 会话服务                         |
| `V2NIMConversationGroupService` | 会话分组服务                     |
| `V2NIMUserService`              | 用户服务                         |
| `V2NIMFriendService`            | 好友服务                         |
| `V2NIMTeamService`              | 群组服务                         |
| `V2NIMNotificationService`      | 通知服务                         |
| `V2NIMStorageService`           | 存储服务（文件上传下载）         |
| `V2NIMSettingService`           | 设置服务                         |
| `V2NIMSyncService`              | 同步服务                         |
| `V2NIMAIService`                | AI 服务                          |
| `V2NIMSignallingService`        | 信令服务                         |
| `V2NIMPassthroughService`       | 透传服务                         |

#### 基础示例

```js
import NIM from 'nim-web-sdk-ng/dist/nodejs/nim.js'

// 创建实例
const nim = NIM.getInstance({
  appkey: 'YOUR_APPKEY',
  account: 'YOUR_ACCOUNT',
  token: 'YOUR_TOKEN',
  debugLevel: 'debug',
  apiVersion: 'v2'
})

// 监听登录状态
nim.V2NIMLoginService.on('onLoginStatus', (status) => {
  console.log('登录状态:', status)
})

nim.V2NIMLoginService.on('onConnectStatus', (status) => {
  console.log('连接状态:', status)
})

// 登录
async function main() {
  try {
    await nim.V2NIMLoginService.login('YOUR_ACCOUNT', 'YOUR_TOKEN')
    console.log('登录成功')

    // 发送文本消息
    const message = nim.V2NIMMessageCreator.createTextMessage('Hello from Node.js!')
    const conversationId = nim.V2NIMConversationIdUtil.p2pConversationId('TARGET_ACCOUNT')
    await nim.V2NIMMessageService.sendMessage(message, conversationId)
    console.log('消息发送成功')
  } catch (err) {
    console.error('操作失败:', err)
  }
}

main()
```

#### 发送图片消息

```js
import NIM from 'nim-web-sdk-ng/dist/nodejs/nim.js'
import path from 'path'

const nim = NIM.getInstance({
  appkey: 'YOUR_APPKEY',
  account: 'YOUR_ACCOUNT',
  token: 'YOUR_TOKEN',
  apiVersion: 'v2'
})

async function sendImage() {
  await nim.V2NIMLoginService.login('YOUR_ACCOUNT', 'YOUR_TOKEN')

  // 使用文件路径创建图片消息
  const imagePath = path.join(process.cwd(), 'image.png')
  const message = nim.V2NIMMessageCreator.createImageMessage(imagePath, 'image.png')

  const conversationId = nim.V2NIMConversationIdUtil.p2pConversationId('TARGET_ACCOUNT')

  // 发送消息，支持上传进度回调
  const result = await nim.V2NIMMessageService.sendMessage(message, conversationId, {}, (progress) => {
    console.log(`上传进度: ${Math.round(progress * 100)}%`)
  })

  console.log('图片发送成功:', result.attachment?.url)
}

sendImage()
```

#### 查询历史消息

```js
async function getHistory() {
  const conversationId = nim.V2NIMConversationIdUtil.p2pConversationId('TARGET_ACCOUNT')

  const messages = await nim.V2NIMMessageLogUtil.getMessageList({
    conversationId,
    limit: 50
  })

  messages.forEach((msg) => {
    console.log(`[${msg.senderId}]: ${msg.text || msg.messageType}`)
  })
}
```

#### TypeScript 支持

Node.js 版本提供完整的 TypeScript 类型定义：

```typescript
import NIM from 'nim-web-sdk-ng/dist/nodejs/nim.js'
import type V2NIM from 'nim-web-sdk-ng/dist/nodejs/nim'

const nim: V2NIM = NIM.getInstance({
  appkey: 'YOUR_APPKEY',
  account: 'YOUR_ACCOUNT',
  token: 'YOUR_TOKEN',
  apiVersion: 'v2'
})
```

#### 注意事项

1. **内存存储**: Node.js 版本使用内存实现 localStorage，数据不会持久化。进程重启后会话和消息缓存将丢失。

2. **网络状态**: 网络状态检测返回固定的"已连接"状态，不支持实时网络状态变化监听。

3. **电源状态**: 电源状态相关 API 为存根实现，不提供实际功能。

4. **文件上传**: 支持通过文件路径上传本地文件，使用原生 `FormData` 和 `fetch` API。

5. **WebSocket**: 使用 `ws` 库实现 WebSocket 连接，需确保网络环境允许 WebSocket 连接。

6. **长连接管理**: 服务端场景建议实现心跳检测和断线重连逻辑，确保连接稳定性。

## IM V1

### sdk 选择

sdk 默认提供以下几种形式

```
dist/
├── CHATROOM_BROWSER_SDK.js  聊天室浏览器适配版 UMD 格式
├── CHATROOM_MINIAPP_SDK.js  聊天室小程序适配版 UMD 格式
├── CHATROOM_UNIAPP_SDK.js   聊天室 UNIAPP 适配版 UMD 格式
├── NIM_BROWSER_SDK.js       IM 浏览器适配版 UMD 格式
├── NIM_MINIAPP_SDK.js       IM 小程序适配版 UMD 格式
├── NIM_UNIAPP_SDK.js        IM UNIAPP 适配版 UMD 格式
├── QCHAT_BROWSER_SDK.js     圈组浏览器适配版 UMD 格式
```

#### 基础引入例子

```js
// 若使用 IM 能力则引入
import NIM from 'nim-web-sdk-ng'
// 等效于
import NIM from 'nim-web-sdk-ng/dist/NIM_BROWSER_SDK'

// 0.11.0 版开始支持单例模式获取实例, 在此之前通过 new 创建实例
const nim = NIM.getInstance(
  {
    debugLevel: 'debug',
    appkey: 'YOUR_APPKEY',
    account: 'YOUR_ACCOUNT',
    token: 'YOUR_TOKEN'
  },
  {}
)

async function init() {
  try {
    if (nim.status === 'unconnected' || nim.status === 'waitReconnect') {
      await nim.connect()
    }
  } catch (err) {
    console.error('login failed cause', err)
  }
}

init()
```
