magic-chat-im 2.9.2 → 2.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/common.d.ts +86 -0
- package/es/common.js +92 -0
- package/es/connection-manager.d.ts +83 -0
- package/es/connection-manager.js +434 -0
- package/es/error-handler.d.ts +45 -0
- package/es/error-handler.js +111 -0
- package/es/event-handler.d.ts +14 -0
- package/es/event-handler.js +215 -0
- package/es/heartbeat-manager.d.ts +37 -0
- package/es/heartbeat-manager.js +93 -0
- package/es/im.d.ts +162 -0
- package/es/im.interface.d.ts +234 -0
- package/es/im.interface.js +1 -0
- package/es/im.js +444 -0
- package/es/index.d.ts +7 -0
- package/es/index.js +8 -0
- package/es/logger.d.ts +98 -0
- package/es/logger.js +238 -0
- package/es/message-queue-manager.d.ts +45 -0
- package/es/message-queue-manager.js +128 -0
- package/es/message-sender.d.ts +26 -0
- package/es/message-sender.js +113 -0
- package/es/monitoring-manager.d.ts +48 -0
- package/es/monitoring-manager.js +161 -0
- package/es/reconnect.d.ts +19 -0
- package/es/reconnect.js +279 -0
- package/es/socket.d.ts +29 -0
- package/es/socket.js +163 -0
- package/es/types.d.ts +82 -0
- package/es/types.js +1 -0
- package/es/util.d.ts +11 -0
- package/es/util.js +44 -0
- package/package.json +1 -1
package/es/logger.d.ts
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IM SDK 日志管理器
|
|
3
|
+
* 统一管理日志输出,支持日志级别控制、格式化输出等
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* 日志级别
|
|
7
|
+
*/
|
|
8
|
+
export declare enum LogLevel {
|
|
9
|
+
DEBUG = 0,// 调试信息(最详细)
|
|
10
|
+
INFO = 1,// 一般信息
|
|
11
|
+
WARN = 2,// 警告信息
|
|
12
|
+
ERROR = 3,// 错误信息
|
|
13
|
+
NONE = 4
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 日志配置
|
|
17
|
+
*/
|
|
18
|
+
export interface LoggerConfig {
|
|
19
|
+
/**
|
|
20
|
+
* 日志级别
|
|
21
|
+
* @default 生产环境: LogLevel.WARN, 开发环境: LogLevel.DEBUG
|
|
22
|
+
*/
|
|
23
|
+
level?: LogLevel;
|
|
24
|
+
/**
|
|
25
|
+
* 是否启用日志
|
|
26
|
+
* @default 生产环境: false (除了 ERROR), 开发环境: true
|
|
27
|
+
*/
|
|
28
|
+
enabled?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* 日志前缀
|
|
31
|
+
* @default '[IM SDK]'
|
|
32
|
+
*/
|
|
33
|
+
prefix?: string;
|
|
34
|
+
/**
|
|
35
|
+
* 是否显示时间戳
|
|
36
|
+
* @default true
|
|
37
|
+
*/
|
|
38
|
+
timestamp?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* 自定义日志处理器(可用于上报日志到服务器)
|
|
41
|
+
*/
|
|
42
|
+
handler?: (level: LogLevel, message: string, ...args: any[]) => void;
|
|
43
|
+
}
|
|
44
|
+
declare class Logger {
|
|
45
|
+
private config;
|
|
46
|
+
constructor(config?: LoggerConfig);
|
|
47
|
+
/**
|
|
48
|
+
* 更新日志配置
|
|
49
|
+
*/
|
|
50
|
+
setConfig(config: Partial<LoggerConfig>): void;
|
|
51
|
+
/**
|
|
52
|
+
* 设置日志级别
|
|
53
|
+
*/
|
|
54
|
+
setLevel(level: LogLevel): void;
|
|
55
|
+
/**
|
|
56
|
+
* 启用/禁用日志
|
|
57
|
+
*/
|
|
58
|
+
setEnabled(enabled: boolean): void;
|
|
59
|
+
/**
|
|
60
|
+
* 格式化日志消息
|
|
61
|
+
*/
|
|
62
|
+
private format;
|
|
63
|
+
/**
|
|
64
|
+
* 内部日志输出方法
|
|
65
|
+
*/
|
|
66
|
+
private log;
|
|
67
|
+
/**
|
|
68
|
+
* 调试日志
|
|
69
|
+
* 用于详细的调试信息,生产环境默认不输出
|
|
70
|
+
*/
|
|
71
|
+
debug(message: string, ...args: any[]): void;
|
|
72
|
+
/**
|
|
73
|
+
* 信息日志
|
|
74
|
+
* 用于一般的信息输出
|
|
75
|
+
*/
|
|
76
|
+
info(message: string, ...args: any[]): void;
|
|
77
|
+
/**
|
|
78
|
+
* 警告日志
|
|
79
|
+
* 用于潜在问题的警告
|
|
80
|
+
*/
|
|
81
|
+
warn(message: string, ...args: any[]): void;
|
|
82
|
+
/**
|
|
83
|
+
* 错误日志
|
|
84
|
+
* 用于错误信息,生产环境也会输出
|
|
85
|
+
*/
|
|
86
|
+
error(message: string, ...args: any[]): void;
|
|
87
|
+
/**
|
|
88
|
+
* 带上下文的错误日志
|
|
89
|
+
* 用于记录带有详细上下文信息的错误
|
|
90
|
+
*/
|
|
91
|
+
errorWithContext(message: string, context?: Record<string, any>, ...args: any[]): void;
|
|
92
|
+
/**
|
|
93
|
+
* 创建子 Logger(带命名空间)
|
|
94
|
+
*/
|
|
95
|
+
createChild(namespace: string): Logger;
|
|
96
|
+
}
|
|
97
|
+
export declare const logger: Logger;
|
|
98
|
+
export default Logger;
|
package/es/logger.js
ADDED
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
5
|
+
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
|
6
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
7
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
8
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
9
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
10
|
+
/**
|
|
11
|
+
* IM SDK 日志管理器
|
|
12
|
+
* 统一管理日志输出,支持日志级别控制、格式化输出等
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* 日志级别
|
|
17
|
+
*/
|
|
18
|
+
export var LogLevel = /*#__PURE__*/function (LogLevel) {
|
|
19
|
+
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
20
|
+
LogLevel[LogLevel["INFO"] = 1] = "INFO";
|
|
21
|
+
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
22
|
+
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
23
|
+
LogLevel[LogLevel["NONE"] = 4] = "NONE";
|
|
24
|
+
return LogLevel;
|
|
25
|
+
}({}); // 不输出日志
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 日志配置
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* 默认配置
|
|
33
|
+
*/
|
|
34
|
+
var DEFAULT_CONFIG = {
|
|
35
|
+
level: process.env.NODE_ENV === 'production' ? LogLevel.WARN : LogLevel.DEBUG,
|
|
36
|
+
enabled: process.env.NODE_ENV !== 'production',
|
|
37
|
+
prefix: '[IM SDK]',
|
|
38
|
+
timestamp: true,
|
|
39
|
+
handler: function handler() {}
|
|
40
|
+
};
|
|
41
|
+
var Logger = /*#__PURE__*/function () {
|
|
42
|
+
function Logger() {
|
|
43
|
+
var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
44
|
+
_classCallCheck(this, Logger);
|
|
45
|
+
_defineProperty(this, "config", void 0);
|
|
46
|
+
this.config = _objectSpread(_objectSpread({}, DEFAULT_CONFIG), config);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* 更新日志配置
|
|
51
|
+
*/
|
|
52
|
+
_createClass(Logger, [{
|
|
53
|
+
key: "setConfig",
|
|
54
|
+
value: function setConfig(config) {
|
|
55
|
+
this.config = _objectSpread(_objectSpread({}, this.config), config);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* 设置日志级别
|
|
60
|
+
*/
|
|
61
|
+
}, {
|
|
62
|
+
key: "setLevel",
|
|
63
|
+
value: function setLevel(level) {
|
|
64
|
+
this.config.level = level;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* 启用/禁用日志
|
|
69
|
+
*/
|
|
70
|
+
}, {
|
|
71
|
+
key: "setEnabled",
|
|
72
|
+
value: function setEnabled(enabled) {
|
|
73
|
+
this.config.enabled = enabled;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* 格式化日志消息
|
|
78
|
+
*/
|
|
79
|
+
}, {
|
|
80
|
+
key: "format",
|
|
81
|
+
value: function format(level, message) {
|
|
82
|
+
var parts = [this.config.prefix];
|
|
83
|
+
|
|
84
|
+
// 添加时间戳
|
|
85
|
+
if (this.config.timestamp) {
|
|
86
|
+
var now = new Date();
|
|
87
|
+
var time = now.toLocaleTimeString('zh-CN', {
|
|
88
|
+
hour12: false,
|
|
89
|
+
hour: '2-digit',
|
|
90
|
+
minute: '2-digit',
|
|
91
|
+
second: '2-digit',
|
|
92
|
+
fractionalSecondDigits: 3
|
|
93
|
+
});
|
|
94
|
+
parts.push("[".concat(time, "]"));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// 添加日志级别
|
|
98
|
+
var levelName = LogLevel[level];
|
|
99
|
+
parts.push("[".concat(levelName, "]"));
|
|
100
|
+
|
|
101
|
+
// 添加消息
|
|
102
|
+
parts.push(message);
|
|
103
|
+
return parts.join(' ');
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* 内部日志输出方法
|
|
108
|
+
*/
|
|
109
|
+
}, {
|
|
110
|
+
key: "log",
|
|
111
|
+
value: function log(level, message) {
|
|
112
|
+
var _console, _console2, _console3;
|
|
113
|
+
// 检查是否启用日志
|
|
114
|
+
if (!this.config.enabled && level < LogLevel.ERROR) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// 检查日志级别
|
|
119
|
+
if (level < this.config.level) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
var formattedMessage = this.format(level, message);
|
|
123
|
+
|
|
124
|
+
// 调用自定义处理器
|
|
125
|
+
for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
|
|
126
|
+
args[_key - 2] = arguments[_key];
|
|
127
|
+
}
|
|
128
|
+
if (this.config.handler) {
|
|
129
|
+
try {
|
|
130
|
+
var _this$config;
|
|
131
|
+
(_this$config = this.config).handler.apply(_this$config, [level, formattedMessage].concat(args));
|
|
132
|
+
} catch (error) {
|
|
133
|
+
// 防止自定义处理器出错影响主流程
|
|
134
|
+
console.error('[Logger] Custom handler error:', error);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// 输出到控制台
|
|
139
|
+
switch (level) {
|
|
140
|
+
case LogLevel.DEBUG:
|
|
141
|
+
case LogLevel.INFO:
|
|
142
|
+
(_console = console).log.apply(_console, [formattedMessage].concat(args));
|
|
143
|
+
break;
|
|
144
|
+
case LogLevel.WARN:
|
|
145
|
+
(_console2 = console).warn.apply(_console2, [formattedMessage].concat(args));
|
|
146
|
+
break;
|
|
147
|
+
case LogLevel.ERROR:
|
|
148
|
+
(_console3 = console).error.apply(_console3, [formattedMessage].concat(args));
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* 调试日志
|
|
155
|
+
* 用于详细的调试信息,生产环境默认不输出
|
|
156
|
+
*/
|
|
157
|
+
}, {
|
|
158
|
+
key: "debug",
|
|
159
|
+
value: function debug(message) {
|
|
160
|
+
for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
|
|
161
|
+
args[_key2 - 1] = arguments[_key2];
|
|
162
|
+
}
|
|
163
|
+
this.log.apply(this, [LogLevel.DEBUG, message].concat(args));
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* 信息日志
|
|
168
|
+
* 用于一般的信息输出
|
|
169
|
+
*/
|
|
170
|
+
}, {
|
|
171
|
+
key: "info",
|
|
172
|
+
value: function info(message) {
|
|
173
|
+
for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
|
|
174
|
+
args[_key3 - 1] = arguments[_key3];
|
|
175
|
+
}
|
|
176
|
+
this.log.apply(this, [LogLevel.INFO, message].concat(args));
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* 警告日志
|
|
181
|
+
* 用于潜在问题的警告
|
|
182
|
+
*/
|
|
183
|
+
}, {
|
|
184
|
+
key: "warn",
|
|
185
|
+
value: function warn(message) {
|
|
186
|
+
for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
|
|
187
|
+
args[_key4 - 1] = arguments[_key4];
|
|
188
|
+
}
|
|
189
|
+
this.log.apply(this, [LogLevel.WARN, message].concat(args));
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* 错误日志
|
|
194
|
+
* 用于错误信息,生产环境也会输出
|
|
195
|
+
*/
|
|
196
|
+
}, {
|
|
197
|
+
key: "error",
|
|
198
|
+
value: function error(message) {
|
|
199
|
+
for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {
|
|
200
|
+
args[_key5 - 1] = arguments[_key5];
|
|
201
|
+
}
|
|
202
|
+
this.log.apply(this, [LogLevel.ERROR, message].concat(args));
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* 带上下文的错误日志
|
|
207
|
+
* 用于记录带有详细上下文信息的错误
|
|
208
|
+
*/
|
|
209
|
+
}, {
|
|
210
|
+
key: "errorWithContext",
|
|
211
|
+
value: function errorWithContext(message, context) {
|
|
212
|
+
for (var _len6 = arguments.length, args = new Array(_len6 > 2 ? _len6 - 2 : 0), _key6 = 2; _key6 < _len6; _key6++) {
|
|
213
|
+
args[_key6 - 2] = arguments[_key6];
|
|
214
|
+
}
|
|
215
|
+
if (context) {
|
|
216
|
+
this.log.apply(this, [LogLevel.ERROR, message, context].concat(args));
|
|
217
|
+
} else {
|
|
218
|
+
this.log.apply(this, [LogLevel.ERROR, message].concat(args));
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* 创建子 Logger(带命名空间)
|
|
224
|
+
*/
|
|
225
|
+
}, {
|
|
226
|
+
key: "createChild",
|
|
227
|
+
value: function createChild(namespace) {
|
|
228
|
+
return new Logger(_objectSpread(_objectSpread({}, this.config), {}, {
|
|
229
|
+
prefix: "".concat(this.config.prefix, ":").concat(namespace)
|
|
230
|
+
}));
|
|
231
|
+
}
|
|
232
|
+
}]);
|
|
233
|
+
return Logger;
|
|
234
|
+
}(); // 导出单例实例
|
|
235
|
+
export var logger = new Logger();
|
|
236
|
+
|
|
237
|
+
// 导出 Logger 类,供自定义使用
|
|
238
|
+
export default Logger;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface QueuedMessage {
|
|
2
|
+
message: string;
|
|
3
|
+
resolve: () => void;
|
|
4
|
+
reject: (error: Error) => void;
|
|
5
|
+
}
|
|
6
|
+
export declare class MessageQueueManager {
|
|
7
|
+
private sendQueue;
|
|
8
|
+
private messageQueue;
|
|
9
|
+
/**
|
|
10
|
+
* 将待发送的消息加入队列
|
|
11
|
+
* @param task 发送消息的任务函数
|
|
12
|
+
*/
|
|
13
|
+
enqueueSendTask(task: () => void): void;
|
|
14
|
+
/**
|
|
15
|
+
* 将消息加入队列(用于离线消息缓存)
|
|
16
|
+
* @param message 消息内容
|
|
17
|
+
* @param resolve 成功回调
|
|
18
|
+
* @param reject 失败回调
|
|
19
|
+
*/
|
|
20
|
+
enqueueMessage(message: string, resolve: () => void, reject: (error: Error) => void): void;
|
|
21
|
+
/**
|
|
22
|
+
* 从队列中取出消息(用于离线消息缓存)
|
|
23
|
+
*/
|
|
24
|
+
dequeueMessage(): QueuedMessage | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* 执行所有待发送的任务
|
|
27
|
+
*/
|
|
28
|
+
executeAllSendTasks(): void;
|
|
29
|
+
/**
|
|
30
|
+
* 获取待发送任务队列大小
|
|
31
|
+
*/
|
|
32
|
+
getSendQueueSize(): number;
|
|
33
|
+
/**
|
|
34
|
+
* 获取消息队列大小
|
|
35
|
+
*/
|
|
36
|
+
getMessageQueueSize(): number;
|
|
37
|
+
/**
|
|
38
|
+
* 清空所有队列
|
|
39
|
+
*/
|
|
40
|
+
clear(): void;
|
|
41
|
+
/**
|
|
42
|
+
* 检查队列是否为空
|
|
43
|
+
*/
|
|
44
|
+
isEmpty(): boolean;
|
|
45
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
3
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
4
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
5
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
6
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
7
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
8
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
9
|
+
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
|
10
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
11
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
12
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
13
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
14
|
+
import { logger } from "./logger";
|
|
15
|
+
export var MessageQueueManager = /*#__PURE__*/function () {
|
|
16
|
+
function MessageQueueManager() {
|
|
17
|
+
_classCallCheck(this, MessageQueueManager);
|
|
18
|
+
_defineProperty(this, "sendQueue", []);
|
|
19
|
+
_defineProperty(this, "messageQueue", []);
|
|
20
|
+
}
|
|
21
|
+
_createClass(MessageQueueManager, [{
|
|
22
|
+
key: "enqueueSendTask",
|
|
23
|
+
value:
|
|
24
|
+
/**
|
|
25
|
+
* 将待发送的消息加入队列
|
|
26
|
+
* @param task 发送消息的任务函数
|
|
27
|
+
*/
|
|
28
|
+
function enqueueSendTask(task) {
|
|
29
|
+
this.sendQueue.push(task);
|
|
30
|
+
logger.debug("[MessageQueueManager] Send task enqueued, queue size: ".concat(this.sendQueue.length));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* 将消息加入队列(用于离线消息缓存)
|
|
35
|
+
* @param message 消息内容
|
|
36
|
+
* @param resolve 成功回调
|
|
37
|
+
* @param reject 失败回调
|
|
38
|
+
*/
|
|
39
|
+
}, {
|
|
40
|
+
key: "enqueueMessage",
|
|
41
|
+
value: function enqueueMessage(message, resolve, reject) {
|
|
42
|
+
this.messageQueue.push({
|
|
43
|
+
message: message,
|
|
44
|
+
resolve: resolve,
|
|
45
|
+
reject: reject
|
|
46
|
+
});
|
|
47
|
+
logger.debug("[MessageQueueManager] Message enqueued, queue size: ".concat(this.messageQueue.length));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* 从队列中取出消息(用于离线消息缓存)
|
|
52
|
+
*/
|
|
53
|
+
}, {
|
|
54
|
+
key: "dequeueMessage",
|
|
55
|
+
value: function dequeueMessage() {
|
|
56
|
+
var message = this.messageQueue.shift();
|
|
57
|
+
logger.debug("[MessageQueueManager] Message dequeued, queue size: ".concat(this.messageQueue.length));
|
|
58
|
+
return message;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* 执行所有待发送的任务
|
|
63
|
+
*/
|
|
64
|
+
}, {
|
|
65
|
+
key: "executeAllSendTasks",
|
|
66
|
+
value: function executeAllSendTasks() {
|
|
67
|
+
if (this.sendQueue.length === 0) {
|
|
68
|
+
logger.debug('[MessageQueueManager] No send tasks to execute');
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
logger.debug("[MessageQueueManager] Executing ".concat(this.sendQueue.length, " send tasks"));
|
|
72
|
+
|
|
73
|
+
// 创建队列副本并清空原队列,防止在执行过程中有新任务加入
|
|
74
|
+
var tasksToExecute = _toConsumableArray(this.sendQueue);
|
|
75
|
+
this.sendQueue = [];
|
|
76
|
+
|
|
77
|
+
// 执行所有任务
|
|
78
|
+
tasksToExecute.forEach(function (task, index) {
|
|
79
|
+
try {
|
|
80
|
+
logger.debug("[MessageQueueManager] Executing send task ".concat(index + 1, "/").concat(tasksToExecute.length));
|
|
81
|
+
task();
|
|
82
|
+
} catch (error) {
|
|
83
|
+
logger.error("[MessageQueueManager] Error executing send task ".concat(index + 1, ":"), error);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
logger.debug('[MessageQueueManager] All send tasks executed');
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* 获取待发送任务队列大小
|
|
91
|
+
*/
|
|
92
|
+
}, {
|
|
93
|
+
key: "getSendQueueSize",
|
|
94
|
+
value: function getSendQueueSize() {
|
|
95
|
+
return this.sendQueue.length;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* 获取消息队列大小
|
|
100
|
+
*/
|
|
101
|
+
}, {
|
|
102
|
+
key: "getMessageQueueSize",
|
|
103
|
+
value: function getMessageQueueSize() {
|
|
104
|
+
return this.messageQueue.length;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* 清空所有队列
|
|
109
|
+
*/
|
|
110
|
+
}, {
|
|
111
|
+
key: "clear",
|
|
112
|
+
value: function clear() {
|
|
113
|
+
this.sendQueue = [];
|
|
114
|
+
this.messageQueue = [];
|
|
115
|
+
logger.debug('[MessageQueueManager] All queues cleared');
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* 检查队列是否为空
|
|
120
|
+
*/
|
|
121
|
+
}, {
|
|
122
|
+
key: "isEmpty",
|
|
123
|
+
value: function isEmpty() {
|
|
124
|
+
return this.sendQueue.length === 0 && this.messageQueue.length === 0;
|
|
125
|
+
}
|
|
126
|
+
}]);
|
|
127
|
+
return MessageQueueManager;
|
|
128
|
+
}();
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { MessageBody } from './types';
|
|
2
|
+
import type { IMInstance } from './im.interface';
|
|
3
|
+
export declare class MessageSender {
|
|
4
|
+
private im;
|
|
5
|
+
constructor(im: IMInstance);
|
|
6
|
+
/**
|
|
7
|
+
* 发送消息
|
|
8
|
+
*/
|
|
9
|
+
sendMessage(msgBody?: Partial<MessageBody>): void;
|
|
10
|
+
/**
|
|
11
|
+
* 发送hb消息
|
|
12
|
+
*/
|
|
13
|
+
ping(): void;
|
|
14
|
+
/**
|
|
15
|
+
* 发送事件消息
|
|
16
|
+
*/
|
|
17
|
+
sendEvent(data: Record<string, any>): void;
|
|
18
|
+
/**
|
|
19
|
+
* 收到后端业务消息的ack
|
|
20
|
+
*/
|
|
21
|
+
ack(messageKey: string): void;
|
|
22
|
+
/**
|
|
23
|
+
* 生成消息key
|
|
24
|
+
*/
|
|
25
|
+
messageKey(): string;
|
|
26
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
5
|
+
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
|
6
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
7
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
8
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
9
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
10
|
+
import { SEND_MSG_TYPE, WS_READYSTATE, WS_STATUS } from "./common";
|
|
11
|
+
import { makeMsgBody } from "./util";
|
|
12
|
+
export var MessageSender = /*#__PURE__*/function () {
|
|
13
|
+
function MessageSender(im) {
|
|
14
|
+
_classCallCheck(this, MessageSender);
|
|
15
|
+
_defineProperty(this, "im", void 0);
|
|
16
|
+
this.im = im;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 发送消息
|
|
21
|
+
*/
|
|
22
|
+
_createClass(MessageSender, [{
|
|
23
|
+
key: "sendMessage",
|
|
24
|
+
value: function sendMessage() {
|
|
25
|
+
var _this$im$im,
|
|
26
|
+
_this = this;
|
|
27
|
+
var msgBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
28
|
+
var _this$im$_commonParam = this.im._commonParams,
|
|
29
|
+
appId = _this$im$_commonParam.appId,
|
|
30
|
+
userId = _this$im$_commonParam.userId;
|
|
31
|
+
var fd = {
|
|
32
|
+
appId: appId,
|
|
33
|
+
userId: userId,
|
|
34
|
+
messageKey: this.im._messageKey(),
|
|
35
|
+
msgType: (msgBody === null || msgBody === void 0 ? void 0 : msgBody.msgType) || SEND_MSG_TYPE.MESSAGE,
|
|
36
|
+
msgBody: _objectSpread({
|
|
37
|
+
version: '2.0.0'
|
|
38
|
+
}, msgBody)
|
|
39
|
+
};
|
|
40
|
+
// 加上协议码
|
|
41
|
+
var msg = makeMsgBody(fd);
|
|
42
|
+
|
|
43
|
+
// status 现在是 getter,会自动从 ws.readyState 计算,无需手动调用 updateStatus()
|
|
44
|
+
|
|
45
|
+
// 检查连接状态
|
|
46
|
+
if (this.im.readyState() === WS_READYSTATE.OPEN && ((_this$im$im = this.im.im) === null || _this$im$im === void 0 ? void 0 : _this$im$im.status) === WS_STATUS.ONLINE) {
|
|
47
|
+
this.im._send(msg);
|
|
48
|
+
// 更新发送消息统计
|
|
49
|
+
this.im._monitoringManager.updateMessageSentStats();
|
|
50
|
+
} else {
|
|
51
|
+
// 消息待重连后重发
|
|
52
|
+
// 使用新的消息队列管理器
|
|
53
|
+
this.im._messageQueueManager.enqueueSendTask(function () {
|
|
54
|
+
_this.sendMessage(msgBody);
|
|
55
|
+
});
|
|
56
|
+
// 非连接中状态都重连
|
|
57
|
+
if (this.im.readyState() !== WS_READYSTATE.CONNECTING) {
|
|
58
|
+
this.im.reconnect('POSTMESSAGE');
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* 发送hb消息
|
|
65
|
+
*/
|
|
66
|
+
}, {
|
|
67
|
+
key: "ping",
|
|
68
|
+
value: function ping() {
|
|
69
|
+
this.im._send(SEND_MSG_TYPE.HB);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* 发送事件消息
|
|
74
|
+
*/
|
|
75
|
+
}, {
|
|
76
|
+
key: "sendEvent",
|
|
77
|
+
value: function sendEvent(data) {
|
|
78
|
+
this.im._send(makeMsgBody(data));
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* 收到后端业务消息的ack
|
|
83
|
+
*/
|
|
84
|
+
}, {
|
|
85
|
+
key: "ack",
|
|
86
|
+
value: function ack(messageKey) {
|
|
87
|
+
var _this$im$_commonParam2 = this.im._commonParams,
|
|
88
|
+
appId = _this$im$_commonParam2.appId,
|
|
89
|
+
userId = _this$im$_commonParam2.userId;
|
|
90
|
+
var ackMsg = {
|
|
91
|
+
messageKey: messageKey,
|
|
92
|
+
appId: appId,
|
|
93
|
+
userId: userId,
|
|
94
|
+
msgType: SEND_MSG_TYPE.CLIENT_ACK
|
|
95
|
+
};
|
|
96
|
+
this.im._send(makeMsgBody(ackMsg));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* 生成消息key
|
|
101
|
+
*/
|
|
102
|
+
}, {
|
|
103
|
+
key: "messageKey",
|
|
104
|
+
value: function messageKey() {
|
|
105
|
+
// 时间戳 + 随机字符串 + 计数器,确保唯一性
|
|
106
|
+
var timestamp = Date.now();
|
|
107
|
+
var random = Math.random().toString(36).substring(2, 9);
|
|
108
|
+
var counter = this.im._msgCounter = (this.im._msgCounter + 1) % 10000;
|
|
109
|
+
return "".concat(timestamp, "-").concat(random, "-").concat(counter);
|
|
110
|
+
}
|
|
111
|
+
}]);
|
|
112
|
+
return MessageSender;
|
|
113
|
+
}();
|