Lightweight, extensible, JavaScript Instant Messaging.
npm install awesome-imjs
// 静态文件引入 awesome-im
//
// npm 安装、引入
// npm i awesome-im@latest
// import im from "awesome-im"
// websocket 地址
const url = "ws://localhost:8088";
// 初始化
im.init({
pingGap: 6000,
userId: "allenye" // 自定义用户ID
});
// 连接
im.connect(url).then(res => {
console.log("connect ->", res)
})
// 监听连接状态
im.addEventListener("STATUS", evt => {
console.log("连接状态->", evt)
})
// 监听消息
im.addEventListener("MESSAGE", evt => {
console.log("监听消息->", evt)
})
// 发送信令消息
im.send(new im.Message.SignalMessage({
signalName: "start", // 信令名称自定义,与服务端约定。
// signalName: "end",
to: "server"
})).then(res => {
console.log("发送SignalMessage成功", res)
})
// 发送文字消息
im.send(new im.Message.TextMessage({
// message: "message 可以扩展"
message: {
test: 123,
array: [123, 456],
object: {
name: "allen"
}
},
from: "allen",
to: "server"
})).then(res => {
console.log("发送TextMessage成功 ->", res)
})
// 修改会话类型(需要设置 conversationType),需要注意需要服务处理 user1、user2 之间的通信。
// 默认时server会话(im.Message.ConversationType.SERVER)
im.send(new im.Message.TextMessage({
conversationType: im.Message.ConversationType.PRIVATE, // 单聊会话
message: "发送一条单聊会话消息",
from: "user1",
to: "user2"
})).then(res => {
console.log("发送TextMessage成功 ->", res)
})
`
$3
参见集成服务端nodejs demo ({your app path}/node_modules/awesome-im/src/example/server.js).
`js
// nodejs
const WebSocket = require('ws');
const { encode, decode } = require("@msgpack/msgpack");
const server = new WebSocket.Server({ port: 8088 });
server.on('connection', (socket) => {
console.log('Client connected');
// setInterval(() => {
// server.clients.forEach((client) => {
// client.send(encode({
// code: ErrorCode.SUCCESS,
// data: {
// messageType: MessageType.SIGNAL,
// sentTime: new Date().getTime(),
// messageUId: 'CBE5-1922-F8C9-730B',
// conversationType: ConversationType.SERVER,
// to: 'allen',
// signalName: 'end',
// from: 'server',
// content: {
// message: "一条服务端发送的消息"
// },
// },
// errMsg: "success!"
// }));
// })
// }, 2000);
// 当接收到消息时,向所有连接的客户端广播消息
socket.on('message', (message) => {
// console.log(Received message: ${message});
const _data = decode(message)
server.clients.forEach((client) => {
if (client.readyState === WebSocket.OPEN) {
const data = {
..._data,
time: new Date().getTime()
}
console.log(data)
client.send(encode({
code: ErrorCode.SUCCESS,
data: data
}));
}
});
});
// 当连接关闭时,向所有连接的客户端广播消息
socket.on('close', () => {
console.log('Client disconnected');
server.clients.forEach((client) => {
if (client.readyState === WebSocket.OPEN) {
client.send(encode({ errMsg: "close", code: 4 }));
}
});
});
});
`
#### 服务返回数据格式
服务端主动发送消息,不用携带 messageId。
`json
{
"code": 0,
"data": {
"messageType": "SignalMsg",
"sentTime": 1681900543414,
"messageUId": "CBE5-1922-F8C9-730B",
"conversationType": 0,
"to": "allen",
"signalName": "login", // 可扩展
"from": "server",
"messageDirection": 2
},
"errMsg": "success!"
}
`
服务端收到客户端发送的消息后(服务端发送闭环消息),需要携带messageId
`json
{
"code": 0,
"data": {
"messageType": "TextMsg",
"sentTime": 1681900543414,
"messageId": "需要携带客户端发送消息的messageId,从而达到闭环。",
"messageUId": "CBE5-1922-F8C9-730B",
"conversationType": 0,
"to": "allen",
"signalName": "end", // 可扩展
"from": "server",
"content": {
// 可以扩展
"message": "客户端发送消息后,服务端需要返回一条消息(闭环)。证明客户端发送的消息成功了。"
},
"messageDirection": 2
},
"errMsg": "success!"
}
`
$3
`js
// 消息类型
export const MessageType = {
TEXT: "TxtMsg",
IMAGE: "ImgMsg",
FILE: "FileMsg",
PING: "PingMsg",
SIGNAL: "SignalMsg"
}
// 会话类型
export const ConversationType = {
/**
* 客户端与服务端的会话
*/
SERVER: 0,
/**
* 单聊
*/
PRIVATE: 1,
/**
* 讨论组
*/
DISCUSSION: 2,
/**
* 群组聊天
*/
GROUP: 3,
/**
* 聊天室会话
*/
CHATROOM: 4,
/**
* 系统消息
*/
SYSTEM: 5,
}
// 消息方向
export const MessageDirection = {
/**
* 发送消息。
*/
SEND: 1,
/**
* 接收消息。
*/
RECEIVE: 2
}
// 事件监听
const event = {
STATUS: "STATUS",
MESSAGE: "MESSAGE",
TEST: "TEST",
}
``