utils-uniapp 1.2.13 → 1.2.15
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/lib/WebSocketClient/index.d.ts +82 -43
- package/lib/WebSocketClient/index.js +1 -1
- package/lib/index.js +1 -1
- package/package.json +1 -1
|
@@ -1,22 +1,27 @@
|
|
|
1
1
|
// WebSocketClient.d.ts
|
|
2
|
-
// 统一版类型声明(浏览器 / uni-app 共用一份 JS
|
|
3
|
-
//
|
|
2
|
+
// 统一版类型声明(浏览器 / uni-app 共用一份 JS 实现),与 WebSocketClient.js
|
|
3
|
+
// 同目录同名放置(原 WebSocketClient.uni.d.ts 已更名删除)。
|
|
4
4
|
//
|
|
5
|
-
// 设计:类通过泛型参数 P("平台档案"
|
|
6
|
-
// 默认 P =
|
|
7
|
-
//
|
|
8
|
-
// 与旧版 d.ts 用法完全一致。浏览器 / Node 等平台见文末「自定义平台类型指引」。
|
|
5
|
+
// 设计:类通过泛型参数 P("平台档案")描述底层传输类型与各事件原生载荷类型。
|
|
6
|
+
// 默认 P = BrowserWebSocketProfile(依赖 DOM lib 的 Event/MessageEvent/CloseEvent/WebSocket):
|
|
7
|
+
// 裸用基类即浏览器语义;uni 工程用 UniWebSocketClient(或显式 WebSocketClient<UniAppProfile>)。
|
|
9
8
|
//
|
|
10
|
-
// 相对旧版 WebSocketClient.uni.d.ts
|
|
9
|
+
// 相对旧版 WebSocketClient.uni.d.ts 的变更:
|
|
11
10
|
// 1. 字段 socketTask → transport(类型随 P);新增 adapter 字段、构造器第三参、options.adapter
|
|
12
11
|
// 2. 'reconnect' 事件载荷从 { event } 改为直接透传原生事件(与 'open' 同形);WebSocketReconnectedInfo 已删除
|
|
13
|
-
// 3. 'fail' / WebSocketDropReason 新增 { type: 'heartbeatTimeout' }
|
|
12
|
+
// 3. 'fail' / WebSocketDropReason 新增 { type: 'heartbeatTimeout' } 变体
|
|
14
13
|
// 4. 方法 resetHeartbeatTimeout 已删除(改用 clearHeartbeatTimeout)
|
|
15
|
-
// 5. 补充声明 addEventListener / removeEventListener
|
|
16
|
-
// 6.
|
|
17
|
-
|
|
14
|
+
// 5. 补充声明 addEventListener / removeEventListener
|
|
15
|
+
// 6. 新增导出:两个适配器、UniWebSocketClient、档案 / 契约类型
|
|
16
|
+
// 7. 【本版】默认档案 UniAppProfile → BrowserWebSocketProfile(裸用基类的回调提示改为 DOM 事件类型);
|
|
17
|
+
// 新增 BrowserWebSocketProfile 导出,BrowserWebSocketAdapter 收紧为精确类型;
|
|
18
|
+
// 文件因此要求 DOM lib(uni 官方模板 tsconfig 默认已含;无 DOM lib 的工程见文末可选方案)
|
|
19
|
+
|
|
20
|
+
/** 可发送的数据类型(心跳消息与 send 的载荷)。取两端交集:浏览器实际还接受 Blob/TypedArray,uni 仅支持此二者 */
|
|
18
21
|
export type WebSocketData = string | ArrayBuffer;
|
|
22
|
+
|
|
19
23
|
// ============ 平台档案(泛型参数 P) ============
|
|
24
|
+
|
|
20
25
|
/** 平台档案:底层传输类型 + 四类原生事件载荷 + 失败详情携带的 event 类型 */
|
|
21
26
|
export interface WebSocketPlatformProfile {
|
|
22
27
|
/** 底层传输对象(uni: SocketTask;浏览器: WebSocket;自定义适配器: create 返回值) */
|
|
@@ -32,7 +37,22 @@ export interface WebSocketPlatformProfile {
|
|
|
32
37
|
/** fail(type: 'connectError') 中携带的 event:onError 载荷或同步抛出的 Error */
|
|
33
38
|
errorEvent: unknown;
|
|
34
39
|
}
|
|
35
|
-
|
|
40
|
+
|
|
41
|
+
/** 浏览器档案(默认):依赖 DOM lib */
|
|
42
|
+
export interface BrowserWebSocketProfile extends WebSocketPlatformProfile {
|
|
43
|
+
transport: WebSocket;
|
|
44
|
+
/** onopen / 'reconnect' 载荷:原生 open 事件 */
|
|
45
|
+
open: Event;
|
|
46
|
+
/** onmessage 载荷:res.data 为消息内容 */
|
|
47
|
+
message: MessageEvent;
|
|
48
|
+
/** onclose 载荷:res.code / res.reason */
|
|
49
|
+
close: CloseEvent;
|
|
50
|
+
/** onerror 载荷:原生 error 事件(通常无错误细节) */
|
|
51
|
+
error: Event;
|
|
52
|
+
errorEvent: Event | Error;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** uni-app 档案:依赖 @dcloudio/types 的全局 UniApp 命名空间 */
|
|
36
56
|
export interface UniAppProfile extends WebSocketPlatformProfile {
|
|
37
57
|
transport: UniApp.SocketTask;
|
|
38
58
|
open: UniApp.OnSocketOpenCallbackResult;
|
|
@@ -41,14 +61,17 @@ export interface UniAppProfile extends WebSocketPlatformProfile {
|
|
|
41
61
|
error: UniApp.GeneralCallbackResult;
|
|
42
62
|
errorEvent: UniApp.GeneralCallbackResult | Error;
|
|
43
63
|
}
|
|
64
|
+
|
|
44
65
|
// ============ 适配器契约(对应 JS 终版导出的两个适配器;自定义平台实现同契约) ============
|
|
66
|
+
|
|
45
67
|
/** bind 绑定的四个回调:载荷类型由档案 P 决定 */
|
|
46
|
-
export interface WebSocketTransportHandlers<P extends WebSocketPlatformProfile =
|
|
68
|
+
export interface WebSocketTransportHandlers<P extends WebSocketPlatformProfile = BrowserWebSocketProfile> {
|
|
47
69
|
open(res: P['open']): void;
|
|
48
70
|
message(res: P['message']): void;
|
|
49
71
|
close(res: P['close']): void;
|
|
50
72
|
error(err: P['error']): void;
|
|
51
73
|
}
|
|
74
|
+
|
|
52
75
|
/** 适配器五方法契约 */
|
|
53
76
|
export interface WebSocketAdapter<P extends WebSocketPlatformProfile = any> {
|
|
54
77
|
/** 创建传输对象;失败/返回无效对象必须 throw(核心只接同步异常) */
|
|
@@ -62,23 +85,27 @@ export interface WebSocketAdapter<P extends WebSocketPlatformProfile = any> {
|
|
|
62
85
|
/** 关闭;code 缺省时走平台默认关闭 */
|
|
63
86
|
close(transport: P['transport'], code?: number, reason?: string): void;
|
|
64
87
|
}
|
|
88
|
+
|
|
65
89
|
// ============ 事件 / 失败载荷 ============
|
|
90
|
+
|
|
66
91
|
/** handleDrop 的入参:连接阶段失败原因(willRetry 由内部补上后再对外 emit fail) */
|
|
67
|
-
export type WebSocketDropReason<P extends WebSocketPlatformProfile =
|
|
92
|
+
export type WebSocketDropReason<P extends WebSocketPlatformProfile = BrowserWebSocketProfile> =
|
|
68
93
|
| { type: 'connectTimeout'; url: string }
|
|
69
94
|
| { type: 'connectError'; url: string; event: P['errorEvent'] }
|
|
70
95
|
| { type: 'heartbeatTimeout' };
|
|
96
|
+
|
|
71
97
|
/**
|
|
72
98
|
* fail 事件载荷:
|
|
73
99
|
* - connectTimeout / connectError / heartbeatTimeout:本轮失败,是否还会重连看 willRetry
|
|
74
100
|
* - tooManyDrops / maxReconnect:终态,不再重连,willRetry 恒为 false
|
|
75
101
|
*/
|
|
76
|
-
export type WebSocketFailInfo<P extends WebSocketPlatformProfile =
|
|
102
|
+
export type WebSocketFailInfo<P extends WebSocketPlatformProfile = BrowserWebSocketProfile> =
|
|
77
103
|
| { type: 'connectTimeout'; url: string; willRetry: boolean }
|
|
78
104
|
| { type: 'connectError'; url: string; willRetry: boolean; event: P['errorEvent'] }
|
|
79
105
|
| { type: 'heartbeatTimeout'; willRetry: boolean }
|
|
80
106
|
| { type: 'tooManyDrops'; dropCount: number; stablePeriod: number; willRetry: false }
|
|
81
107
|
| { type: 'maxReconnect'; maxReconnect: number; url: string; willRetry: false };
|
|
108
|
+
|
|
82
109
|
/** reconnecting 事件载荷:即将发起第 count 次重连,延迟 delay ms */
|
|
83
110
|
export interface WebSocketReconnectingInfo {
|
|
84
111
|
/** 本次重连延迟 ms(已含指数退避与抖动) */
|
|
@@ -86,6 +113,7 @@ export interface WebSocketReconnectingInfo {
|
|
|
86
113
|
/** 本轮连续重连序号(连接成功后清零) */
|
|
87
114
|
count: number;
|
|
88
115
|
}
|
|
116
|
+
|
|
89
117
|
/** getStats() 返回的运行状态快照 */
|
|
90
118
|
export interface WebSocketClientStats {
|
|
91
119
|
/** 当前是否已连接 */
|
|
@@ -99,7 +127,8 @@ export interface WebSocketClientStats {
|
|
|
99
127
|
/** 本次连接已存活时长 ms,未连接为 0 */
|
|
100
128
|
uptime: number;
|
|
101
129
|
}
|
|
102
|
-
|
|
130
|
+
|
|
131
|
+
export interface WebSocketClientOptions<P extends WebSocketPlatformProfile = BrowserWebSocketProfile> {
|
|
103
132
|
/** 初始重连间隔 ms,默认 1000 */
|
|
104
133
|
reconnectDelay?: number;
|
|
105
134
|
/** 重连间隔上限 ms,默认 30000 */
|
|
@@ -110,7 +139,7 @@ export interface WebSocketClientOptions<P extends WebSocketPlatformProfile = any
|
|
|
110
139
|
jitter?: number;
|
|
111
140
|
/** 最大重连次数,-1 为无限重连,默认 -1 */
|
|
112
141
|
maxReconnect?: number;
|
|
113
|
-
/**
|
|
142
|
+
/** 连接存活超过该时长视为"稳定",掉线计数清零,默认 60000 */
|
|
114
143
|
stablePeriod?: number;
|
|
115
144
|
/** 一个不稳定窗口内容忍的掉线次数,默认 5(第 maxDrops+1 次终止) */
|
|
116
145
|
maxDrops?: number;
|
|
@@ -124,13 +153,17 @@ export interface WebSocketClientOptions<P extends WebSocketPlatformProfile = any
|
|
|
124
153
|
connectTimeout?: number;
|
|
125
154
|
/**
|
|
126
155
|
* 传输适配器:实例级注入,优先级最高(高于构造器第三参与平台自动探测)。
|
|
127
|
-
* Node
|
|
156
|
+
* Node 等无内置适配器的环境必传。注意:默认档案为浏览器,
|
|
157
|
+
* 注入 uni 适配器请配合 WebSocketClient<UniAppProfile> 或直接用 UniWebSocketClient
|
|
128
158
|
*/
|
|
129
159
|
adapter?: WebSocketAdapter<P>;
|
|
130
160
|
}
|
|
161
|
+
|
|
131
162
|
// ============ 事件映射 ============
|
|
163
|
+
|
|
132
164
|
export type WebSocketEventName = 'open' | 'message' | 'close' | 'error' | 'reconnect' | 'reconnecting' | 'fail';
|
|
133
|
-
|
|
165
|
+
|
|
166
|
+
export interface WebSocketClientEventMap<P extends WebSocketPlatformProfile = BrowserWebSocketProfile> {
|
|
134
167
|
/** 连接建立(首次与重连都会触发) */
|
|
135
168
|
open: (res: P['open']) => void;
|
|
136
169
|
/** 收到服务端消息 */
|
|
@@ -146,14 +179,17 @@ export interface WebSocketClientEventMap<P extends WebSocketPlatformProfile = Un
|
|
|
146
179
|
/** 连接失败,注意区分 willRetry(可重试)与终态失败 */
|
|
147
180
|
fail: (info: WebSocketFailInfo<P>) => void;
|
|
148
181
|
}
|
|
182
|
+
|
|
149
183
|
export type WebSocketEventHandler<P extends WebSocketPlatformProfile, K extends WebSocketEventName> = WebSocketClientEventMap<P>[K];
|
|
184
|
+
|
|
150
185
|
// ============ 客户端 ============
|
|
151
|
-
|
|
186
|
+
|
|
187
|
+
export declare class WebSocketClient<P extends WebSocketPlatformProfile = BrowserWebSocketProfile> {
|
|
152
188
|
/**
|
|
153
189
|
* @param url WebSocket 地址
|
|
154
190
|
* @param options 配置项,全部可选,均有默认值;options.adapter 可注入适配器(优先级最高)
|
|
155
|
-
* @param adapter
|
|
156
|
-
* uni
|
|
191
|
+
* @param adapter 适配器;缺省时运行时按平台自动探测(有 uni 全局 → UniWebSocketAdapter,
|
|
192
|
+
* 否则 → BrowserWebSocketAdapter);uni 工程建议直接使用 UniWebSocketClient 子类
|
|
157
193
|
*/
|
|
158
194
|
constructor(url: string, options?: WebSocketClientOptions<P>, adapter?: WebSocketAdapter<P>);
|
|
159
195
|
// ============ 配置 ============
|
|
@@ -184,7 +220,7 @@ export declare class WebSocketClient<P extends WebSocketPlatformProfile = UniApp
|
|
|
184
220
|
/** 连接超时兜底 ms */
|
|
185
221
|
connectTimeout: number;
|
|
186
222
|
// ============ 运行时状态 ============
|
|
187
|
-
/**
|
|
223
|
+
/** 当前底层连接:默认(浏览器)为 WebSocket,UniAppProfile 下为 SocketTask;未连接为 null */
|
|
188
224
|
transport: P['transport'] | null;
|
|
189
225
|
/** 是否已连接 */
|
|
190
226
|
isConnected: boolean;
|
|
@@ -269,31 +305,34 @@ export declare class WebSocketClient<P extends WebSocketPlatformProfile = UniApp
|
|
|
269
305
|
/** 获取当前运行状态快照 */
|
|
270
306
|
getStats(): WebSocketClientStats;
|
|
271
307
|
}
|
|
308
|
+
|
|
272
309
|
// ============ 内置适配器与平台子类(对应 JS 终版的具名导出) ============
|
|
310
|
+
|
|
311
|
+
/** 浏览器原生 WebSocket 适配器(档案为 BrowserWebSocketProfile,精确类型) */
|
|
312
|
+
export declare const BrowserWebSocketAdapter: WebSocketAdapter<BrowserWebSocketProfile>;
|
|
313
|
+
|
|
273
314
|
/** uni-app SocketTask 适配器 */
|
|
274
315
|
export declare const UniWebSocketAdapter: WebSocketAdapter<UniAppProfile>;
|
|
275
|
-
|
|
276
|
-
* 浏览器原生 WebSocket 适配器。
|
|
277
|
-
* 载荷实为 DOM 事件(open: Event / message: MessageEvent / close: CloseEvent / error: Event),
|
|
278
|
-
* 因纯小程序工程可能未启用 DOM lib,此处以宽松类型导出;
|
|
279
|
-
* 启用 DOM lib 的浏览器工程可按文末指引自定义 BrowserProfile 获得精确类型。
|
|
280
|
-
*/
|
|
281
|
-
export declare const BrowserWebSocketAdapter: WebSocketAdapter<any>;
|
|
316
|
+
|
|
282
317
|
/** uni-app 版:显式换用 SocketTask 适配器,其余逻辑完全复用核心 */
|
|
283
318
|
export declare class UniWebSocketClient extends WebSocketClient<UniAppProfile> {
|
|
284
319
|
constructor(url: string, options?: WebSocketClientOptions<UniAppProfile>);
|
|
285
320
|
}
|
|
321
|
+
|
|
286
322
|
export default WebSocketClient;
|
|
287
|
-
|
|
288
|
-
//
|
|
289
|
-
//
|
|
290
|
-
//
|
|
291
|
-
//
|
|
292
|
-
//
|
|
293
|
-
//
|
|
294
|
-
//
|
|
295
|
-
//
|
|
296
|
-
//
|
|
297
|
-
//
|
|
298
|
-
//
|
|
299
|
-
//
|
|
323
|
+
|
|
324
|
+
// ============ 平台选择 / 自定义平台指引 ============
|
|
325
|
+
// 1. 浏览器:直接 new WebSocketClient(url)(默认档案即浏览器类型)
|
|
326
|
+
// 2. uni-app:new UniWebSocketClient(url),或
|
|
327
|
+
// new WebSocketClient<UniAppProfile>(url, opts, UniWebSocketAdapter)。
|
|
328
|
+
// 不要在 uni 工程裸用基类 —— 类型是浏览器档案,而运行时探测到 uni 全局会走
|
|
329
|
+
// UniWebSocketAdapter,二者载荷形状不一致
|
|
330
|
+
// 3. Node(ws 包)等自定义平台:定义档案 + 实现 WebSocketAdapter 五方法,
|
|
331
|
+
// 然后 new WebSocketClient<MyProfile>(url, { adapter: myAdapter })
|
|
332
|
+
//
|
|
333
|
+
// 可选:若需兼容未启用 DOM lib 的纯小程序 TS 工程(默认档案引用了 DOM 类型会编译报错),
|
|
334
|
+
// 把类及各类型默认值中的 BrowserWebSocketProfile 换成:
|
|
335
|
+
// type DefaultProfile = 'MessageEvent' extends keyof typeof globalThis
|
|
336
|
+
// ? BrowserWebSocketProfile : any;
|
|
337
|
+
// (以 MessageEvent 探测 DOM lib:Node 与小程序全局都没有这个名字,不会误判;
|
|
338
|
+
// 无 DOM lib 时退化为宽松 any,不阻断编译)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const c=require("../_rollupPluginBabelHelpers-3cc6d021.js");var
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const c=require("../_rollupPluginBabelHelpers-3cc6d021.js");var m={create:function(t){return new WebSocket(t)},bind:function(t,e){t.onopen=e.open,t.onmessage=e.message,t.onclose=e.close,t.onerror=e.error},unbind:function(t){t.onopen=t.onmessage=t.onclose=t.onerror=null},send:function(t,e){t.send(e)},close:function(t,e,n){t.close(e,n)}},u={create:function(t){var e=uni.connectSocket({url:t,complete:function(){}});if(!e||typeof e.onOpen!="function")throw new Error("uni.connectSocket did not return a valid SocketTask");return e},bind:function(t,e){t.onOpen(e.open),t.onMessage(e.message),t.onClose(e.close),t.onError(e.error)},unbind:function(){},send:function(t,e){t.send({data:e})},close:function(t,e,n){e!=null?t.close({code:e,reason:n||""}):t.close({})}},l=function(){function s(t){var e,n,r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},o=arguments.length>2?arguments[2]:void 0;c._classCallCheck(this,s),this.url=t,this.adapter=r.adapter||o||(typeof uni!="undefined"?u:m),this.reconnectDelay=r.reconnectDelay||1e3,this.maxReconnectDelay=r.maxReconnectDelay||3e4,this.backoffFactor=r.backoffFactor||2,this.jitter=(e=r.jitter)!==null&&e!==void 0?e:.3,this.maxReconnect=(n=r.maxReconnect)!==null&&n!==void 0?n:-1,this.stablePeriod=r.stablePeriod||60*1e3,this.maxDrops=r.maxDrops||5,this.heartbeatInterval=r.heartbeatInterval||3e4,this.heartbeatTimeout=r.heartbeatTimeout||1e4,this.heartbeatMsg=r.heartbeatMsg||"ping",this.connectTimeout=r.connectTimeout||15e3,this.transport=null,this.isConnected=!1,this.manualClose=!1,this.heartbeatTimer=null,this.heartbeatTimeoutTimer=null,this.reconnectTimer=null,this.connectTimeoutTimer=null,this.reconnectCount=0,this.dropCount=0,this.lastDropTime=0,this.connectedAt=0,this.dropCycle=0,this.handledCycle=0,this.events={open:[],message:[],close:[],error:[],reconnect:[],reconnecting:[],fail:[]}}return c._createClass(s,[{key:"on",value:function(e,n){return this.events[e]&&this.events[e].push(n),this}},{key:"off",value:function(e,n){if(!this.events[e])return this;var r=this.events[e],o=r.findIndex(function(i){return i===n||i._origin===n});return o>-1&&r.splice(o,1),this}},{key:"once",value:function(e,n){var r,o=this;if(!((r=this.events[e])!==null&&r!==void 0&&r.some(function(a){return a===n||a._origin===n}))){var i=function(){o.off(e,i),n.apply(void 0,arguments)};i._origin=n,this.on(e,i)}return this}},{key:"emit",value:function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];this.events[e]&&this.events[e].forEach(function(i){try{i.apply(void 0,r)}catch(a){console.error("[".concat(e,"] callback error:"),a)}})}},{key:"addEventListener",value:function(e,n){return this.on(e,n)}},{key:"removeEventListener",value:function(e,n){return this.off(e,n)}},{key:"connect",value:function(){var e=this;if(this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.clearConnectTimeout(),this.transport){var n=this.transport;this.transport=null,this.isConnected=!1,this.stopHeartbeat(),this.adapter.unbind(n);try{this.adapter.close(n,1e3,"reconnect")}catch(i){}}this.manualClose=!1;var r=this.dropCycle=this.dropCycle+1,o;try{o=this.adapter.create(this.url)}catch(i){return this.handleDrop(r,{type:"connectError",url:this.url,event:i}),this}if(o==null)return this.handleDrop(r,{type:"connectError",url:this.url,event:new Error("adapter.create returned no transport")}),this;this.transport=o,this.connectTimeoutTimer=setTimeout(function(){if(!(o!==e.transport||e.isConnected||e.manualClose)){console.warn("Connect timeout"),e.handleDrop(r,{type:"connectTimeout",url:e.url});try{e.adapter.close(o)}catch(i){}}},this.connectTimeout);try{this.adapter.bind(o,{open:function(a){if(o===e.transport&&!e.manualClose){e.clearConnectTimeout(),e.reconnectTimer&&(clearTimeout(e.reconnectTimer),e.reconnectTimer=null),e.handledCycle===r&&(e.handledCycle=0);var h=e.reconnectCount>0;e.isConnected=!0,e.connectedAt=Date.now(),e.reconnectCount=0,console.log("Connection established"),e.emit("open",a),h&&(console.log("Reconnected successfully"),e.emit("reconnect",a)),e.startHeartbeat()}},message:function(a){o===e.transport&&(e.clearHeartbeatTimeout(),e.emit("message",a))},close:function(a){o===e.transport&&(e.clearConnectTimeout(),e.isConnected=!1,e.stopHeartbeat(),e.transport=null,console.log("Connection closed"),e.emit("close",a),!e.manualClose&&e.handleDrop(r))},error:function(a){if(o===e.transport){e.clearConnectTimeout(),console.error("WebSocket error:",a),e.emit("error",a),e.isConnected=!1,e.stopHeartbeat(),e.manualClose||e.handleDrop(r,{type:"connectError",url:e.url,event:a});try{e.adapter.close(o,1e3,"error")}catch(h){}}}})}catch(i){this.clearConnectTimeout(),this.transport=null;try{this.adapter.close(o)}catch(a){}return this.handleDrop(r,{type:"connectError",url:this.url,event:i}),this}return this}},{key:"handleDrop",value:function(e,n){if(!this.manualClose&&e===this.dropCycle&&this.handledCycle!==e){this.handledCycle=e;var r=this.connectedAt>0,o=r?Date.now()-this.connectedAt:0;if(this.connectedAt=0,r&&(o>=this.stablePeriod&&(this.dropCount=0),this.dropCount++,this.lastDropTime=Date.now(),console.warn("Drop #".concat(this.dropCount," (uptime ").concat((o/1e3).toFixed(1),"s)")),this.dropCount>this.maxDrops)){this.emit("fail",{type:"tooManyDrops",dropCount:this.dropCount,stablePeriod:this.stablePeriod,willRetry:!1}),this.dropCount=0;return}var i=this.reconnect();n&&this.emit("fail",c._objectSpread2(c._objectSpread2({},n),{},{willRetry:i}))}}},{key:"reconnect",value:function(){var e=this;if(this.isConnected||this.reconnectTimer)return!1;if(this.maxReconnect!==-1&&this.reconnectCount>=this.maxReconnect)return console.log("已到达最大重连次数(".concat(this.maxReconnect,"),停止重连")),this.emit("fail",{type:"maxReconnect",maxReconnect:this.maxReconnect,url:this.url,willRetry:!1}),!1;var n=this.getBackoffDelay();return this.reconnectCount+=1,console.log("Reconnecting in ".concat((n/1e3).toFixed(1),"s... count:").concat(this.reconnectCount)),this.emit("reconnecting",{delay:n,count:this.reconnectCount}),this.reconnectTimer=setTimeout(function(){e.reconnectTimer=null,e.connect()},n),!0}},{key:"getBackoffDelay",value:function(){var e=Math.max(this.reconnectCount,0),n=this.reconnectDelay*Math.pow(this.backoffFactor,e);return n=Math.min(n,this.maxReconnectDelay),this.jitter>0&&(n+=(Math.random()*2-1)*n*this.jitter),Math.max(Math.round(n),100)}},{key:"send",value:function(e){return this.isConnected&&this.transport?this.adapter.send(this.transport,e):console.error("WebSocket is not connected"),this}},{key:"startHeartbeat",value:function(){var e=this;this.stopHeartbeat(),this.heartbeatTimer=setInterval(function(){e.isConnected&&(e.send(e.heartbeatMsg),e.startHeartbeatTimeout())},this.heartbeatInterval)}},{key:"stopHeartbeat",value:function(){this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null),this.clearHeartbeatTimeout()}},{key:"startHeartbeatTimeout",value:function(){var e=this;this.clearHeartbeatTimeout();var n=this.transport;this.heartbeatTimeoutTimer=setTimeout(function(){if(!(n!==e.transport||!e.isConnected)){console.warn("Heartbeat timeout, connection dead"),e.isConnected=!1,e.stopHeartbeat(),e.handleDrop(e.dropCycle,{type:"heartbeatTimeout"});try{e.adapter.close(n,1e3,"heartbeat")}catch(r){}}},this.heartbeatTimeout)}},{key:"clearHeartbeatTimeout",value:function(){this.heartbeatTimeoutTimer&&(clearTimeout(this.heartbeatTimeoutTimer),this.heartbeatTimeoutTimer=null)}},{key:"clearConnectTimeout",value:function(){this.connectTimeoutTimer&&(clearTimeout(this.connectTimeoutTimer),this.connectTimeoutTimer=null)}},{key:"close",value:function(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:1e3,n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"";if(this.manualClose=!0,this.isConnected=!1,this.stopHeartbeat(),this.clearConnectTimeout(),this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.reconnectCount=0,this.dropCount=0,this.connectedAt=0,this.dropCycle=this.dropCycle+1,this.transport)try{this.adapter.close(this.transport,e,n)}catch(r){try{this.adapter.close(this.transport)}catch(o){}}}},{key:"getStats",value:function(){return{connected:this.isConnected,reconnectCount:this.reconnectCount,dropCount:this.dropCount,lastDropTime:this.lastDropTime,uptime:this.isConnected?Date.now()-this.connectedAt:0}}}])}(),d=function(s){function t(e){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};return c._classCallCheck(this,t),c._callSuper(this,t,[e,n,u])}return c._inherits(t,s),c._createClass(t)}(l);exports.BrowserWebSocketAdapter=m;exports.UniWebSocketAdapter=u;exports.UniWebSocketClient=d;exports.WebSocketClient=l;exports.default=l;
|
package/lib/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("./aliPay/index.js"),r=require("./array/index.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("./aliPay/index.js"),r=require("./array/index.js"),s=require("./cache/index.js"),g=require("./date/index.js"),d=require("./EventBus/index.js"),a=require("./fs/index.js"),u=require("./getLocation/index.js"),o=require("./http/index.js"),e=require("./magic/index.js"),c=require("./object/index.js"),t=require("./pageStack/index.js"),i=require("./validate/index.js"),n=require("./WebSocketClient/index.js"),P=require("./index-0114bbbf.js");require("./_rollupPluginBabelHelpers-3cc6d021.js");var m=require("./lodash");Object.assign(exports,m);exports.alipaySubmit=l.alipaySubmit;exports.exchangeArrP=r.exchangeArrP;exports.filterTree=r.filterTree;exports.findTreeItem=r.findTreeItem;exports.flatWithKey=r.flatWithKey;exports.getTreePath=r.getTreePath;exports.groupBy=r.groupBy;exports.reverseForEach=r.reverseForEach;exports.treeItemSetParent=r.treeItemSetParent;exports.StorageCache=s.StorageCache;exports.localCache=s.localCache;exports.sessionCache=s.sessionCache;exports.dateFormat=g.dateFormat;exports.getDate=g.getDate;exports.EventBus=d.EventBus;exports.eventBus=d.eventBus;exports.$fs=a.$fs;exports.chooseImg=a.chooseImg;exports.getArraybufferTempPath=a.getArraybufferTempPath;exports.getImgBase64Prefix=a.getImgBase64Prefix;exports.readFile=a.readFile;exports.saveImageToPhotosAlbum=a.saveImageToPhotosAlbum;exports.writeFile=a.writeFile;exports.getLocation=u.getLocation;exports.openLocation=u.openLocation;exports.CONTENT_TYPES=o.CONTENT_TYPES;exports.CancelToken=o.CancelToken;exports.createDownloadFile=o.createDownloadFile;exports.createRequest=o.createRequest;exports.createUploadFile=o.createUploadFile;exports.promisifyRequest=o.promisifyRequest;exports.compareVersion=e.compareVersion;exports.compose=e.compose;exports.composeAsync=e.composeAsync;exports.debounce=e.debounce;exports.debouncePromise=e.debouncePromise;exports.decodeURIParams=e.decodeURIParams;exports.encodeURIParams=e.encodeURIParams;exports.getOnLoadParams=e.getOnLoadParams;exports.getPascalCase=e.getPascalCase;exports.getQueryParams=e.getQueryParams;exports.getQueryParamsFromHash=e.getQueryParamsFromHash;exports.getQueryParamsFromSearch=e.getQueryParamsFromSearch;exports.getRandom=e.getRandom;exports.getRandomStr=e.getRandomStr;exports.pipe=e.pipe;exports.pipeAsync=e.pipeAsync;exports.randomColor=e.randomColor;exports.throttle=e.throttle;exports.toQueryString=e.toQueryString;exports.cloneDeepWithDescriptors=c.cloneDeepWithDescriptors;exports.getRawType=c.getRawType;exports.hasOwnProperty=c.hasOwnProperty;exports.backToRoute=t.backToRoute;exports.findPageByFullPath=t.findPageByFullPath;exports.findPageByRoute=t.findPageByRoute;exports.getCurrentPage=t.getCurrentPage;exports.getCurrentPageOptions=t.getCurrentPageOptions;exports.getCurrentRoute=t.getCurrentRoute;exports.getPageStack=t.getPageStack;exports.getPageVm=t.getPageVm;exports.getPrevPage=t.getPrevPage;exports.getPrevRoute=t.getPrevRoute;exports.isExternal=i.isExternal;exports.validDate=i.validDate;exports.validIDCard=i.validIDCard;exports.validPhone=i.validPhone;exports.validPostalCode=i.validPostalCode;exports.validURL=i.validURL;exports.BrowserWebSocketAdapter=n.BrowserWebSocketAdapter;exports.UniWebSocketAdapter=n.UniWebSocketAdapter;exports.UniWebSocketClient=n.UniWebSocketClient;exports.WebSocketClient=n.WebSocketClient;exports.wx=P.index;
|