utils-uniapp 1.2.12 → 1.2.14

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.
@@ -1,22 +1,27 @@
1
1
  // WebSocketClient.d.ts
2
- // 统一版类型声明(浏览器 / uni-app 共用一份 JS 实现),文件请与统一后的
3
- // WebSocketClient.js 同目录同名放置(原 WebSocketClient.uni.d.ts 更名而来)。
2
+ // 统一版类型声明(浏览器 / uni-app 共用一份 JS 实现),与 WebSocketClient.js
3
+ // 同目录同名放置(原 WebSocketClient.uni.d.ts 已更名删除)。
4
4
  //
5
- // 设计:类通过泛型参数 P("平台档案")描述底层传输类型与各事件的原生载荷类型。
6
- // 默认 P = UniAppProfile(依赖 @dcloudio/types 的全局 UniApp 命名空间),
7
- // 即 uni 工程中 new WebSocketClient(url, opts) 不写泛型即可获得完整 uni 类型,
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 的变更(配合 JS 终版):
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. 新增导出:UniWebSocketAdapter / BrowserWebSocketAdapter / UniWebSocketClient 及适配器契约类型
17
- /** 可发送的数据类型(心跳消息与 send 的载荷) */
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
- /** uni-app 档案(默认) */
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 = UniAppProfile> {
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 = UniAppProfile> =
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 = UniAppProfile> =
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
- export interface WebSocketClientOptions<P extends WebSocketPlatformProfile = any> {
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
- /** 连接存活超过该时长(ms)视为"稳定",掉线计数清零,默认 60000 */
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
- export interface WebSocketClientEventMap<P extends WebSocketPlatformProfile = UniAppProfile> {
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
- export declare class WebSocketClient<P extends WebSocketPlatformProfile = UniAppProfile> {
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 适配器;缺省时按平台自动探测(uni → UniWebSocketAdapter,浏览器 → BrowserWebSocketAdapter),
156
- * uni 工程也可直接使用 UniWebSocketClient 子类
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
- /** 当前底层连接:uni 默认适配器下为 SocketTask,自定义适配器时为 create() 返回值;未连接为 null */
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
- // 1. 浏览器(启用 DOM lib 的工程):自定义档案获得精确事件类型——
289
- // interface BrowserProfile extends WebSocketPlatformProfile {
290
- // transport: WebSocket;
291
- // open: Event;
292
- // message: MessageEvent;
293
- // close: CloseEvent;
294
- // error: Event;
295
- // errorEvent: Event | Error;
296
- // }
297
- // const ws = new WebSocketClient<BrowserProfile>(url, { adapter: BrowserWebSocketAdapter });
298
- // 2. Node(ws 包)等自定义平台:定义档案 + 实现 WebSocketAdapter 五方法,
299
- // 然后 new WebSocketClient<MyProfile>(url, { adapter: myAdapter })。
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 h={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});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({})}},d=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:h),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 l=e.reconnectCount>0;e.isConnected=!0,e.connectedAt=Date.now(),e.reconnectCount=0,console.log("Connection established"),e.emit("open",a),l&&(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(l){}}}})}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}}}])}(),m=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)}(d);exports.BrowserWebSocketAdapter=h;exports.UniWebSocketAdapter=u;exports.UniWebSocketClient=m;exports.default=d;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const c=require("../_rollupPluginBabelHelpers-3cc6d021.js");var d={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=wx.connectSocket({url:t});if(!e||typeof e.onOpen!="function")throw new Error("wx.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 wx!="undefined"?u:d),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}}}])}(),m=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=d;exports.UniWebSocketAdapter=u;exports.UniWebSocketClient=m;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"),n=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"),s=require("./object/index.js"),t=require("./pageStack/index.js"),i=require("./validate/index.js"),c=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=n.StorageCache;exports.localCache=n.localCache;exports.sessionCache=n.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=s.cloneDeepWithDescriptors;exports.getRawType=s.getRawType;exports.hasOwnProperty=s.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=c.BrowserWebSocketAdapter;exports.UniWebSocketAdapter=c.UniWebSocketAdapter;exports.UniWebSocketClient=c.UniWebSocketClient;exports.wx=P.index;
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "utils-uniapp",
3
- "version": "1.2.12",
3
+ "version": "1.2.14",
4
4
  "description": "aubyn's utils for uniapp",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",