awesome-im
Version:
Lightweight, extensible, JavaScript Instant Messaging.
210 lines (195 loc) • 4.93 kB
JavaScript
// {
// "code": 0,
// "data": {
// "messageDirection": 1,
// "messageType": "TxtMsg",
// "sentTime": 1681902270566,
// "messageUId": "D00D-4DBA-B592-C849",
// "messageId": 34,
// "conversationType": 0,
// "content": {
// "message": {
// "test": 123,
// "array": [
// 123,
// 456
// ],
// "object": {
// "name": "allen"
// }
// },
// "extra": null
// },
// "from": "allenye",
// "to": "server",
// "uid": 1681902270567,
// "receivedTime": 1681902270570
// },
// "messageDirection": 2
// }
const MessageType = {
TEXT: "TxtMsg",
IMAGE: "ImgMsg",
FILE: "FileMsg",
PING: "PingMsg",
SIGNAL: "SignalMsg"
}
const ConversationType = {
/**
* 客户端与服务端的会话
*/
SERVER: 0,
/**
* 单聊
*/
PRIVATE: 1,
/**
* 讨论组
*/
DISCUSSION: 2,
/**
* 群组聊天
*/
GROUP: 3,
/**
* 聊天室会话
*/
CHATROOM: 4,
/**
* 系统消息
*/
SYSTEM: 5,
}
const MessageDirection = {
/**
* 发送消息。
*/
SEND: 1,
/**
* 接收消息。
*/
RECEIVE: 2
}
const ErrorCode = {
/**
* 请求超时
*/
TIMEOUT: {
code: -1,
msg: 'Network timeout'
},
SUCCESS: {
code: 0,
errMsg: "success"
},
/**
* 未连接
*/
NOT_CONNECTED: {
code: 10001,
errMsg: "not connect"
},
/**
* 服务端返回数据错误或者格式不正确
*/
SERVER_SEND_DATA_NOT_RIGHT: {
code: 10002,
errMsg: "SERVER SEND DATA NOT RIGHT"
},
CONNECTION_EXIST: {
code: 10003,
errMsg: "Connection already exists"
},
}
const ConnectionStatus = {
/**
* 请求超时。
*/
TIMEOUT: -1,
/**
* 连接成功。
*/
CONNECTED: 0,
/**
* 连接中。
*/
CONNECTING: 1,
/**
* 正常断开连接。
*/
DISCONNECTED: 2,
/**
* 网络不可用。
*/
NETWORK_UNAVAILABLE: 3,
/**
* 连接关闭。
*/
CONNECTION_CLOSED: 4,
/**
* 用户账户在其他设备登录,本机会被踢掉线。
*/
KICKED_OFFLINE_BY_OTHER_CLIENT: 6,
/**
* websocket 连接失败
*/
WEBSOCKET_UNAVAILABLE: 7,
/**
* websocket 报错
*/
WEBSOCKET_ERROR: 8,
}
const WebSocket = require('ws');
const { encode, decode } = require("@msgpack/msgpack");
const server = new WebSocket.Server({ port: 8090 });
server.on('connection', (socket) => {
console.log('Client connected');
// setInterval(() => {
// server.clients.forEach((client) => {
// client.send(encode({
// code: ErrorCode.SUCCESS.code,
// data: {
// messageType: MessageType.SIGNAL,
// // messageId: "xxx",
// 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,
uid: new Date().getTime()
}
console.log(data)
client.send(encode({
code: ErrorCode.SUCCESS.code,
data: data
}));
}
});
});
// 当连接关闭时,向所有连接的客户端广播消息
socket.on('close', () => {
console.log('Client disconnected');
server.clients.forEach((client) => {
if (client.readyState === WebSocket.OPEN) {
client.send(encode({ errMsg: "websocket close", code: ConnectionStatus.CONNECTION_CLOSED }));
}
});
});
});