说明:文档简单介绍一下webim sdk的功能以及项目结构。
整体概述
环信imsdk具备完善的即时通讯能力,兼容IE8+、FireFox10+、Chrome54+、Safari6+ 浏览器,可以与Android、IOS SDK的互通,支持文本、表情、图片、音频、地址消息,对外提供简洁易用的API,方便开发者在不关注im本身实现的情况下快速集成,拥有即时通讯能力。
工程设计
基本要素
- 连接管理
- 消息
- 会话
- 好友管理
- 通知
- 实时音视频
- 扩展
工程架构
1.连接管理
文本消息走socket长连接,附件、视频、语音富媒体消息先将文件通过http上传服务器,然后拿到文件url,通过文本消息将url发送给对方,接收方下载完文件后进行ui展示。
2.心跳保活,定时通知服务器连接存在。
3.重连,可配置重连此时,间隔时间。始终保持同一个连接实例。
4.消息
支持多种类型消息text、image、video、file、扩展消息,发送消息有消息回执。对方不在线、没有消息回执、消息体内含有离线标识会当成离线消息存储,客户端可拉取离线消息。
5.好友管理
通过rest接口支持添加好友、删除好友、黑名单管理、群组管理。
6.通知,新消息、已读、已送达通知,好友增减、群组聊天室相关通知。
整体结构
如图展示sdk项目整体结构,dist存放打包后文件,jsdoc存放API文档,node_modules存放项目依赖包,src存放项目源文件,.babelrc、.gitignore、jsdoc.sh为项目配置文件,package.json、package-lock.json 定义项目所需要的各种模块,以及项目的配置信息,index.js为sdk的入口文件。
模块划分及说明
sdk目录下index.js是sdk的入口文件,对外暴露webim对象。src文件下是sdk的源文件,allnode.js是私有协议msync定义的数据格式;status.js是存放的状态码;utils里是封装的一些工具函数;connection.js和chat、muc、roster、statistics模块是负责处理具体业务的。其中connection.js是sdk的主文件,接收服务端消息,解析到meta后判断是什么消息类型,然后分发给chat、muc、roster、statistics去处理,各个模块处理完之后将构建的消息传给监听函数,应用层可以在相应的监听函数内拿到消息,再根据业务需要进行处理。chat模块负责收发消息,muc模块负责处理群组相关的通知,roster负责处理操作好友的通知,statistics负责处理报错信息;
connection.js, 是sdk的主文件,包括功能:登录登出,socket连接以及重连,注册监听事件,分发消息,好友操作、群操作、拉取历史消息等rest接口。sdk在收到服务端消息时按类型分发给不同模块进行处理,其中meta.ns == "CONFERENCE" 时为rtc信令,调用webrtcSDK注册在conn对象上的registerConfrIQHandler方法来处理消息。webrtcSDK在发送信令时拿到全局变量WebIM上的conn,调用conn上的send方法进行发送。
chat模块,chat模块分为handleChatMessage.js和sendChatMessa.js两部分。
1、sendChatMessage.js接收参数
//以文本消息为例
{
ext: {},
fail: function(){},
succsess: function(){},
id: "",
msg: "",
type: "",
to: ""
}
构建消息体并发送。
2、handleChatMessage.js接收聊天消息的meta,解析成json格式
//以文本消息为例
{
id: msgId,
type: type,
from: from,
to: to,
data: text,
ext: ext,
sourceMsg: text,
error: errorBool,
errorText: errorText,
errorCode: errorCode
}
将消息传给不同的消息监听函数。
- muc 模块,接收群组操作通知的meta,解析成json格式
//以禁言通知为例
{
type: 'addMute',
owner: thirdMessage.from.name,
gid: thirdMessage.mucId.name,
from: thirdMessage.from.name,
fromJid: thirdMessage.from,
to: thirdMessage.to.length?thirdMessage.to[0].name:'',
toJid: thirdMessage.to,
chatroom: thirdMessage.isChatroom,
status: thirdMessage.status
}
并根据不同类型构建成不同的消息,最后将消息传递给监听函数onPresence
- roster 模块,有两个函数operatRoster发送操作好友通知,handleMessage处理收到的好友操作通知。
operatRoster接收参数option, type
//以加入黑名单为例
option = {
to: "user"
}
type = "ban"
handleMessage函数接收好用操作的meta,解析并构建成json格式通知
{
// 以加好友为例
type: "subscribe",
to: thirdMessage.to[0].name,
from: thirdMessage.from.name,
status: thirdMessage.reason
}
传给监听函数onPresence。
- statistics 模块接收meta.ns == "STATISTIC"时的meta, 解析并构建json格式通知消息
error = {
type: _code.WEBIM_CONNCTION_USER_REMOVED
};
传给监听函数onError。
对外依赖
- Base64 使在ie9可以使用base64
- long 解决msgId、metaId过长
- protobufjs 用于传输二进制数据
- sockjs-client 为websocket在不同浏览器做兼容