@das-fed/upf-utils 6.4.0-dev.288 → 6.4.0-dev.289
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/api-services/modules/app-manage/es5.js +1110 -1122
- package/api-services/modules/app-manage/index.js +918 -936
- package/api-services/modules/app-manage/index.js.gz +0 -0
- package/api-services/modules/authentication/es5.js +1122 -1134
- package/api-services/modules/authentication/index.js +930 -948
- package/api-services/modules/authentication/index.js.gz +0 -0
- package/api-services/modules/contract/es5.js +1122 -1134
- package/api-services/modules/contract/index.js +930 -948
- package/api-services/modules/contract/index.js.gz +0 -0
- package/api-services/modules/duty-manage/es5.js +1104 -1097
- package/api-services/modules/duty-manage/index.js +920 -910
- package/api-services/modules/duty-manage/index.js.gz +0 -0
- package/api-services/modules/es5.js +972 -975
- package/api-services/modules/file/es5.js +1266 -1275
- package/api-services/modules/file/index.js +1026 -1040
- package/api-services/modules/file/index.js.gz +0 -0
- package/api-services/modules/index.js +729 -733
- package/api-services/modules/index.js.gz +0 -0
- package/api-services/modules/justauth/es5.js +873 -876
- package/api-services/modules/justauth/index.js +684 -688
- package/api-services/modules/justauth/index.js.gz +0 -0
- package/api-services/modules/knowledge/es5.js +1132 -1122
- package/api-services/modules/knowledge/index.js +944 -930
- package/api-services/modules/knowledge/index.js.gz +0 -0
- package/api-services/modules/link/es5.js +860 -857
- package/api-services/modules/link/index.js +674 -670
- package/api-services/modules/link/index.js.gz +0 -0
- package/api-services/modules/permission/es5.js +1134 -1122
- package/api-services/modules/permission/index.js +948 -930
- package/api-services/modules/permission/index.js.gz +0 -0
- package/api-services/modules/platformManage/es5.js +1238 -1226
- package/api-services/modules/platformManage/index.js +1032 -1014
- package/api-services/modules/platformManage/index.js.gz +0 -0
- package/api-services/modules/portal/es5.js +1124 -1133
- package/api-services/modules/portal/index.js +933 -947
- package/api-services/modules/portal/index.js.gz +0 -0
- package/api-services/modules/space-manage/es5.js +860 -857
- package/api-services/modules/space-manage/index.js +674 -670
- package/api-services/modules/space-manage/index.js.gz +0 -0
- package/api-services/modules/supplier/es5.js +856 -854
- package/api-services/modules/supplier/index.js +673 -669
- package/api-services/modules/supplier/index.js.gz +0 -0
- package/api-services/modules/supplychain-manage/es5.js +1122 -1134
- package/api-services/modules/supplychain-manage/index.js +930 -948
- package/api-services/modules/supplychain-manage/index.js.gz +0 -0
- package/api-services/modules/tool/es5.js +1134 -1122
- package/api-services/modules/tool/index.js +948 -930
- package/api-services/modules/tool/index.js.gz +0 -0
- package/api-services/src/create-service/es5.js +1132 -1120
- package/api-services/src/create-service/index.js +947 -929
- package/api-services/src/create-service/index.js.gz +0 -0
- package/common-info/es5.js +1293 -1281
- package/common-info/getPermissionMethod/es5.js +1388 -1376
- package/common-info/getPermissionMethod/index.js +1155 -1137
- package/common-info/getPermissionMethod/index.js.gz +0 -0
- package/common-info/index.js +1073 -1055
- package/common-info/index.js.gz +0 -0
- package/config/es5.js +12 -8
- package/config/index.js +7 -4
- package/create-api-service/es5.js +1133 -1121
- package/create-api-service/index.js +948 -930
- package/create-api-service/index.js.gz +0 -0
- package/esm-map.json +3 -1
- package/package.json +7 -7
- package/realtime-connection/es5.d.ts +70 -0
- package/realtime-connection/es5.js +340 -0
- package/realtime-connection/index.d.ts +70 -0
- package/realtime-connection/index.js +168 -0
- package/realtime-connection/index.js.gz +0 -0
- package/release-meta.json +4 -4
- package/theme/es5.js +41 -41
- package/theme/index.js +35 -35
- package/theme/index.js.gz +0 -0
|
Binary file
|
package/esm-map.json
CHANGED
|
@@ -276,5 +276,7 @@
|
|
|
276
276
|
"fromTimeZonePickerValue": "/common-tools/timezone-format/index",
|
|
277
277
|
"toTimestampAtZoneStartOfDay": "/common-tools/timezone-format/index",
|
|
278
278
|
"toTimestampAtZoneEndOfDay": "/common-tools/timezone-format/index",
|
|
279
|
-
"readInjectedParentIanaTimeZoneDataSnapshot": "/common-tools/timezone-format/index"
|
|
279
|
+
"readInjectedParentIanaTimeZoneDataSnapshot": "/common-tools/timezone-format/index",
|
|
280
|
+
"RealtimeSocketClient": "/realtime-connection/index",
|
|
281
|
+
"createRealtimeSocketClient": "/realtime-connection/index"
|
|
280
282
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@das-fed/upf-utils",
|
|
3
|
-
"version": "6.4.0-dev.
|
|
3
|
+
"version": "6.4.0-dev.289",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./index.js",
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"@babel/preset-env": "7.26.0",
|
|
25
|
-
"@das-fed/upf-cli": "6.4.0-dev.
|
|
26
|
-
"@das-fed/upf-web": "6.4.0-dev.
|
|
25
|
+
"@das-fed/upf-cli": "6.4.0-dev.289",
|
|
26
|
+
"@das-fed/upf-web": "6.4.0-dev.289",
|
|
27
27
|
"@rollup/plugin-babel": "6.0.4",
|
|
28
28
|
"@types/js-cookie": "^3.0.6",
|
|
29
29
|
"@types/lodash-es": "^4.17.12",
|
|
@@ -51,13 +51,13 @@
|
|
|
51
51
|
},
|
|
52
52
|
"upfReleaseMeta": {
|
|
53
53
|
"packageName": "@das-fed/upf-utils",
|
|
54
|
-
"releaseVersion": "6.4.0-dev.
|
|
54
|
+
"releaseVersion": "6.4.0-dev.289",
|
|
55
55
|
"distTag": "dev",
|
|
56
56
|
"releaseType": "publish",
|
|
57
|
-
"publishedAt": "2026-07-
|
|
57
|
+
"publishedAt": "2026-07-08T01:52:46.305Z",
|
|
58
58
|
"sourceBranch": "dev",
|
|
59
|
-
"sourceCommit": "
|
|
60
|
-
"gitTag": "upf-release/v6.4.0-dev.
|
|
59
|
+
"sourceCommit": "78a710c274cfb48feeff4e3e4b5c18d43396202b",
|
|
60
|
+
"gitTag": "upf-release/v6.4.0-dev.289",
|
|
61
61
|
"gitRemote": "origin",
|
|
62
62
|
"gitRemoteUrl": "http://gitlab.dasiot.cn/foundation/frontend/framework.git",
|
|
63
63
|
"releaseStatus": "success"
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export type RealtimeSocketState = 'idle' | 'waiting-token' | 'connecting' | 'open' | 'reconnecting' | 'closed' | 'unsupported';
|
|
2
|
+
export type RealtimeSocketHeartbeatOptions = {
|
|
3
|
+
message: string | (() => string);
|
|
4
|
+
interval: number;
|
|
5
|
+
timeout?: number;
|
|
6
|
+
response?: string | string[];
|
|
7
|
+
};
|
|
8
|
+
export type RealtimeSocketReconnectOptions = {
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
delay?: number;
|
|
11
|
+
maxDelay?: number;
|
|
12
|
+
maxAttempts?: number;
|
|
13
|
+
jitter?: boolean;
|
|
14
|
+
};
|
|
15
|
+
export type RealtimeSocketClientOptions<T = unknown> = {
|
|
16
|
+
url: string;
|
|
17
|
+
params?: Record<string, any>;
|
|
18
|
+
tokenParamName?: string;
|
|
19
|
+
tokenProvider?: () => string | Promise<string>;
|
|
20
|
+
heartbeat?: RealtimeSocketHeartbeatOptions;
|
|
21
|
+
reconnect?: RealtimeSocketReconnectOptions;
|
|
22
|
+
parser?: (event: MessageEvent) => T;
|
|
23
|
+
onOpen?: (event: Event) => void;
|
|
24
|
+
onMessage?: (message: T, event: MessageEvent) => void;
|
|
25
|
+
onClose?: (event: CloseEvent) => void;
|
|
26
|
+
onError?: (event: Event) => void;
|
|
27
|
+
onInvalidMessage?: (error: unknown, event: MessageEvent) => void;
|
|
28
|
+
onStateChange?: (state: RealtimeSocketState) => void;
|
|
29
|
+
};
|
|
30
|
+
export declare class RealtimeSocketClient<T = unknown> {
|
|
31
|
+
private ws;
|
|
32
|
+
private options;
|
|
33
|
+
private state;
|
|
34
|
+
private heartbeatTimer;
|
|
35
|
+
private heartbeatTimeoutTimer;
|
|
36
|
+
private reconnectTimer;
|
|
37
|
+
private reconnectAttempts;
|
|
38
|
+
private manualClosed;
|
|
39
|
+
private started;
|
|
40
|
+
private lastHeartbeatAck;
|
|
41
|
+
constructor(options: RealtimeSocketClientOptions<T>);
|
|
42
|
+
/** 获取当前连接状态,供业务显示或调试兜底使用。 */
|
|
43
|
+
getState(): RealtimeSocketState;
|
|
44
|
+
/** 建立连接;重复调用不会创建多个活动 WebSocket。 */
|
|
45
|
+
connect(): Promise<void>;
|
|
46
|
+
/** 仅在连接已打开时发送消息,失败时返回 false。 */
|
|
47
|
+
send(message: string | ArrayBufferLike | Blob | ArrayBufferView): boolean;
|
|
48
|
+
/** 主动关闭连接,并清理心跳、重连和网络监听。 */
|
|
49
|
+
close(): void;
|
|
50
|
+
private openSocket;
|
|
51
|
+
private resolveToken;
|
|
52
|
+
private handleOpen;
|
|
53
|
+
private handleMessage;
|
|
54
|
+
private handleClose;
|
|
55
|
+
private handleError;
|
|
56
|
+
private startHeartbeat;
|
|
57
|
+
private scheduleReconnect;
|
|
58
|
+
private getReconnectDelay;
|
|
59
|
+
private handleOnline;
|
|
60
|
+
private handleOffline;
|
|
61
|
+
private setState;
|
|
62
|
+
private closeSocket;
|
|
63
|
+
private clearTimers;
|
|
64
|
+
private clearHeartbeatTimers;
|
|
65
|
+
private clearHeartbeatTimeoutTimer;
|
|
66
|
+
private clearReconnectTimer;
|
|
67
|
+
private removeNetworkListeners;
|
|
68
|
+
}
|
|
69
|
+
/** 创建独立实时连接实例,调用方负责在卸载时 close。 */
|
|
70
|
+
export declare const createRealtimeSocketClient: <T = unknown>(options: RealtimeSocketClientOptions<T>) => RealtimeSocketClient<T>;
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
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; }
|
|
4
|
+
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; }
|
|
5
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
6
|
+
function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
|
|
7
|
+
function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
|
|
8
|
+
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); }
|
|
9
|
+
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
|
|
10
|
+
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
|
|
11
|
+
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
|
|
12
|
+
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
|
|
13
|
+
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
|
|
14
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
15
|
+
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); }
|
|
16
|
+
var config = require('@das-fed/upf-utils/config/es5');
|
|
17
|
+
var commonTools = require('@das-fed/upf-utils/common-tools/es5');
|
|
18
|
+
var l = 3e3,
|
|
19
|
+
u = 3e4,
|
|
20
|
+
m = function m() {
|
|
21
|
+
var i = config.getConfig(),
|
|
22
|
+
t = i.wsBaseURL || i.baseURL || location.origin;
|
|
23
|
+
return String(t || "").replace(/^https:/i, "wss:").replace(/^http:/i, "ws:").replace(/\/+$/, "");
|
|
24
|
+
},
|
|
25
|
+
d = function d(i) {
|
|
26
|
+
return /^wss?:\/\//i.test(i);
|
|
27
|
+
},
|
|
28
|
+
f = function f(i) {
|
|
29
|
+
return /^https?:\/\//i.test(i);
|
|
30
|
+
},
|
|
31
|
+
p = function p(i, t) {
|
|
32
|
+
var e = String(i || "").trim(),
|
|
33
|
+
s = d(e) ? e : f(e) ? e.replace(/^https:/i, "wss:").replace(/^http:/i, "ws:") : "".concat(m()).concat(e.startsWith("/") ? e : "/".concat(e)),
|
|
34
|
+
r = commonTools.objectToUrlparams(t);
|
|
35
|
+
return r ? "".concat(s).concat(s.includes("?") ? "&" : "?").concat(r) : s;
|
|
36
|
+
},
|
|
37
|
+
T = function T(i, t) {
|
|
38
|
+
return t ? (Array.isArray(t) ? t : [t]).includes(String(i !== null && i !== void 0 ? i : "")) : false;
|
|
39
|
+
},
|
|
40
|
+
b = function b(i) {
|
|
41
|
+
return typeof i.data == "string" ? JSON.parse(i.data) : i.data;
|
|
42
|
+
};
|
|
43
|
+
var S = /*#__PURE__*/function () {
|
|
44
|
+
function S(t) {
|
|
45
|
+
_classCallCheck(this, S);
|
|
46
|
+
this.ws = null, this.state = "idle", this.heartbeatTimer = null, this.heartbeatTimeoutTimer = null, this.reconnectTimer = null, this.reconnectAttempts = 0, this.manualClosed = false, this.started = false, this.lastHeartbeatAck = true, this.options = t, this.handleOnline = this.handleOnline.bind(this), this.handleOffline = this.handleOffline.bind(this);
|
|
47
|
+
}
|
|
48
|
+
/** 获取当前连接状态,供业务显示或调试兜底使用。 */
|
|
49
|
+
return _createClass(S, [{
|
|
50
|
+
key: "getState",
|
|
51
|
+
value: function getState() {
|
|
52
|
+
return this.state;
|
|
53
|
+
}
|
|
54
|
+
/** 建立连接;重复调用不会创建多个活动 WebSocket。 */
|
|
55
|
+
}, {
|
|
56
|
+
key: "connect",
|
|
57
|
+
value: (function () {
|
|
58
|
+
var _connect = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
|
|
59
|
+
return _regenerator().w(function (_context) {
|
|
60
|
+
while (1) switch (_context.n) {
|
|
61
|
+
case 0:
|
|
62
|
+
if (this.started && (this.state === "connecting" || this.state === "open" || this.state === "reconnecting")) {
|
|
63
|
+
_context.n = 2;
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
if (!(this.started = true, this.manualClosed = false, (typeof WebSocket === "undefined" ? "undefined" : _typeof(WebSocket)) > "u")) {
|
|
67
|
+
_context.n = 1;
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
this.setState("unsupported");
|
|
71
|
+
return _context.a(2);
|
|
72
|
+
case 1:
|
|
73
|
+
(typeof window === "undefined" ? "undefined" : _typeof(window)) < "u" && (window.addEventListener("online", this.handleOnline), window.addEventListener("offline", this.handleOffline));
|
|
74
|
+
_context.n = 2;
|
|
75
|
+
return this.openSocket();
|
|
76
|
+
case 2:
|
|
77
|
+
return _context.a(2);
|
|
78
|
+
}
|
|
79
|
+
}, _callee, this);
|
|
80
|
+
}));
|
|
81
|
+
function connect() {
|
|
82
|
+
return _connect.apply(this, arguments);
|
|
83
|
+
}
|
|
84
|
+
return connect;
|
|
85
|
+
}() /** 仅在连接已打开时发送消息,失败时返回 false。 */)
|
|
86
|
+
}, {
|
|
87
|
+
key: "send",
|
|
88
|
+
value: function send(t) {
|
|
89
|
+
var e;
|
|
90
|
+
return ((e = this.ws) == null ? undefined : e.readyState) !== WebSocket.OPEN ? false : (this.ws.send(t), true);
|
|
91
|
+
}
|
|
92
|
+
/** 主动关闭连接,并清理心跳、重连和网络监听。 */
|
|
93
|
+
}, {
|
|
94
|
+
key: "close",
|
|
95
|
+
value: function close() {
|
|
96
|
+
this.manualClosed = true, this.started = false, this.clearTimers(), this.removeNetworkListeners(), this.closeSocket(), this.setState("closed");
|
|
97
|
+
}
|
|
98
|
+
}, {
|
|
99
|
+
key: "openSocket",
|
|
100
|
+
value: function () {
|
|
101
|
+
var _openSocket = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
|
|
102
|
+
var _this = this;
|
|
103
|
+
var s, r, t, e, n;
|
|
104
|
+
return _regenerator().w(function (_context2) {
|
|
105
|
+
while (1) switch (_context2.n) {
|
|
106
|
+
case 0:
|
|
107
|
+
if (!this.manualClosed) {
|
|
108
|
+
_context2.n = 1;
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
return _context2.a(2);
|
|
112
|
+
case 1:
|
|
113
|
+
this.clearReconnectTimer(), this.closeSocket(), this.setState(this.reconnectAttempts > 0 ? "reconnecting" : "connecting");
|
|
114
|
+
t = _objectSpread({}, this.options.params || {});
|
|
115
|
+
_context2.n = 2;
|
|
116
|
+
return this.resolveToken();
|
|
117
|
+
case 2:
|
|
118
|
+
e = _context2.v;
|
|
119
|
+
if (!(this.options.tokenProvider && !e)) {
|
|
120
|
+
_context2.n = 3;
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
this.scheduleReconnect("waiting-token");
|
|
124
|
+
return _context2.a(2);
|
|
125
|
+
case 3:
|
|
126
|
+
e && (t[this.options.tokenParamName || "access_token"] = e);
|
|
127
|
+
try {
|
|
128
|
+
n = new WebSocket(p(this.options.url, t));
|
|
129
|
+
this.ws = n, n.onopen = function (o) {
|
|
130
|
+
return _this.handleOpen(o);
|
|
131
|
+
}, n.onmessage = function (o) {
|
|
132
|
+
return _this.handleMessage(o);
|
|
133
|
+
}, n.onclose = function (o) {
|
|
134
|
+
return _this.handleClose(o);
|
|
135
|
+
}, n.onerror = function (o) {
|
|
136
|
+
return _this.handleError(o);
|
|
137
|
+
};
|
|
138
|
+
} catch (n) {
|
|
139
|
+
(r = (s = this.options).onInvalidMessage) == null || r.call(s, n, {}), this.scheduleReconnect();
|
|
140
|
+
}
|
|
141
|
+
case 4:
|
|
142
|
+
return _context2.a(2);
|
|
143
|
+
}
|
|
144
|
+
}, _callee2, this);
|
|
145
|
+
}));
|
|
146
|
+
function openSocket() {
|
|
147
|
+
return _openSocket.apply(this, arguments);
|
|
148
|
+
}
|
|
149
|
+
return openSocket;
|
|
150
|
+
}()
|
|
151
|
+
}, {
|
|
152
|
+
key: "resolveToken",
|
|
153
|
+
value: function () {
|
|
154
|
+
var _resolveToken = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
|
|
155
|
+
var _t, _t2, _t3;
|
|
156
|
+
return _regenerator().w(function (_context3) {
|
|
157
|
+
while (1) switch (_context3.p = _context3.n) {
|
|
158
|
+
case 0:
|
|
159
|
+
if (this.options.tokenProvider) {
|
|
160
|
+
_context3.n = 1;
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
return _context3.a(2, "");
|
|
164
|
+
case 1:
|
|
165
|
+
_context3.p = 1;
|
|
166
|
+
_t = String;
|
|
167
|
+
_context3.n = 2;
|
|
168
|
+
return this.options.tokenProvider();
|
|
169
|
+
case 2:
|
|
170
|
+
_t2 = _context3.v;
|
|
171
|
+
if (_t2) {
|
|
172
|
+
_context3.n = 3;
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
_t2 = "";
|
|
176
|
+
case 3:
|
|
177
|
+
return _context3.a(2, _t(_t2).trim());
|
|
178
|
+
case 4:
|
|
179
|
+
_context3.p = 4;
|
|
180
|
+
_t3 = _context3.v;
|
|
181
|
+
return _context3.a(2, "");
|
|
182
|
+
}
|
|
183
|
+
}, _callee3, this, [[1, 4]]);
|
|
184
|
+
}));
|
|
185
|
+
function resolveToken() {
|
|
186
|
+
return _resolveToken.apply(this, arguments);
|
|
187
|
+
}
|
|
188
|
+
return resolveToken;
|
|
189
|
+
}()
|
|
190
|
+
}, {
|
|
191
|
+
key: "handleOpen",
|
|
192
|
+
value: function handleOpen(t) {
|
|
193
|
+
var e, s;
|
|
194
|
+
this.reconnectAttempts = 0, this.lastHeartbeatAck = true, this.setState("open"), (s = (e = this.options).onOpen) == null || s.call(e, t), this.startHeartbeat();
|
|
195
|
+
}
|
|
196
|
+
}, {
|
|
197
|
+
key: "handleMessage",
|
|
198
|
+
value: function handleMessage(t) {
|
|
199
|
+
var e, s, r, n, o;
|
|
200
|
+
if (T(t.data, (e = this.options.heartbeat) == null ? undefined : e.response)) {
|
|
201
|
+
this.lastHeartbeatAck = true, this.clearHeartbeatTimeoutTimer();
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
try {
|
|
205
|
+
var a = this.options.parser || b;
|
|
206
|
+
(r = (s = this.options).onMessage) == null || r.call(s, a(t), t);
|
|
207
|
+
} catch (a) {
|
|
208
|
+
(o = (n = this.options).onInvalidMessage) == null || o.call(n, a, t);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}, {
|
|
212
|
+
key: "handleClose",
|
|
213
|
+
value: function handleClose(t) {
|
|
214
|
+
var e, s;
|
|
215
|
+
if (this.clearHeartbeatTimers(), (s = (e = this.options).onClose) == null || s.call(e, t), this.manualClosed) {
|
|
216
|
+
this.setState("closed");
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
this.scheduleReconnect();
|
|
220
|
+
}
|
|
221
|
+
}, {
|
|
222
|
+
key: "handleError",
|
|
223
|
+
value: function handleError(t) {
|
|
224
|
+
var e, s;
|
|
225
|
+
(s = (e = this.options).onError) == null || s.call(e, t);
|
|
226
|
+
}
|
|
227
|
+
}, {
|
|
228
|
+
key: "startHeartbeat",
|
|
229
|
+
value: function startHeartbeat() {
|
|
230
|
+
var _this2 = this;
|
|
231
|
+
var t = this.options.heartbeat;
|
|
232
|
+
!(t != null && t.message) || !t.interval || (this.clearHeartbeatTimers(), this.heartbeatTimer = setInterval(function () {
|
|
233
|
+
if (!_this2.ws || _this2.ws.readyState !== WebSocket.OPEN) return;
|
|
234
|
+
if (t.timeout && !_this2.lastHeartbeatAck) {
|
|
235
|
+
_this2.closeSocket(), _this2.scheduleReconnect();
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
var e = typeof t.message == "function" ? t.message() : t.message;
|
|
239
|
+
_this2.lastHeartbeatAck = false, _this2.send(e), t.timeout && (_this2.clearHeartbeatTimeoutTimer(), _this2.heartbeatTimeoutTimer = setTimeout(function () {
|
|
240
|
+
_this2.lastHeartbeatAck || _this2.manualClosed || (_this2.closeSocket(), _this2.scheduleReconnect());
|
|
241
|
+
}, t.timeout));
|
|
242
|
+
}, t.interval));
|
|
243
|
+
}
|
|
244
|
+
}, {
|
|
245
|
+
key: "scheduleReconnect",
|
|
246
|
+
value: function scheduleReconnect() {
|
|
247
|
+
var _this3 = this;
|
|
248
|
+
var t = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "reconnecting";
|
|
249
|
+
var n;
|
|
250
|
+
if (this.manualClosed || !((n = this.options.reconnect) != null && n.enabled)) {
|
|
251
|
+
this.setState("closed");
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
if ((typeof navigator === "undefined" ? "undefined" : _typeof(navigator)) < "u" && navigator.onLine === false) {
|
|
255
|
+
this.setState(t);
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
var _this$options$reconne = this.options.reconnect,
|
|
259
|
+
e = _this$options$reconne.maxAttempts,
|
|
260
|
+
s = _this$options$reconne.jitter;
|
|
261
|
+
if (typeof e == "number" && e >= 0 && this.reconnectAttempts >= e) {
|
|
262
|
+
this.setState("closed");
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
this.reconnectAttempts += 1;
|
|
266
|
+
var r = this.getReconnectDelay();
|
|
267
|
+
this.setState(t), this.clearReconnectTimer(), this.reconnectTimer = setTimeout(function () {
|
|
268
|
+
if (s) {
|
|
269
|
+
setTimeout(function () {
|
|
270
|
+
return _this3.openSocket();
|
|
271
|
+
}, Math.floor(Math.random() * 300));
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
_this3.openSocket();
|
|
275
|
+
}, r);
|
|
276
|
+
}
|
|
277
|
+
}, {
|
|
278
|
+
key: "getReconnectDelay",
|
|
279
|
+
value: function getReconnectDelay() {
|
|
280
|
+
var t = this.options.reconnect || {
|
|
281
|
+
enabled: false
|
|
282
|
+
},
|
|
283
|
+
e = t.delay || l,
|
|
284
|
+
s = t.maxDelay || u;
|
|
285
|
+
return Math.min(e * Math.pow(2, Math.max(0, this.reconnectAttempts - 1)), s);
|
|
286
|
+
}
|
|
287
|
+
}, {
|
|
288
|
+
key: "handleOnline",
|
|
289
|
+
value: function handleOnline() {
|
|
290
|
+
!this.started || this.manualClosed || this.state === "open" || this.state === "connecting" || this.openSocket();
|
|
291
|
+
}
|
|
292
|
+
}, {
|
|
293
|
+
key: "handleOffline",
|
|
294
|
+
value: function handleOffline() {
|
|
295
|
+
this.manualClosed || (this.clearReconnectTimer(), this.closeSocket(), this.setState("reconnecting"));
|
|
296
|
+
}
|
|
297
|
+
}, {
|
|
298
|
+
key: "setState",
|
|
299
|
+
value: function setState(t) {
|
|
300
|
+
var e, s;
|
|
301
|
+
this.state !== t && (this.state = t, (s = (e = this.options).onStateChange) == null || s.call(e, t));
|
|
302
|
+
}
|
|
303
|
+
}, {
|
|
304
|
+
key: "closeSocket",
|
|
305
|
+
value: function closeSocket() {
|
|
306
|
+
var t = this.ws;
|
|
307
|
+
t && (t.onopen = null, t.onmessage = null, t.onclose = null, t.onerror = null, (t.readyState === WebSocket.OPEN || t.readyState === WebSocket.CONNECTING) && t.close(), this.ws = null);
|
|
308
|
+
}
|
|
309
|
+
}, {
|
|
310
|
+
key: "clearTimers",
|
|
311
|
+
value: function clearTimers() {
|
|
312
|
+
this.clearHeartbeatTimers(), this.clearReconnectTimer();
|
|
313
|
+
}
|
|
314
|
+
}, {
|
|
315
|
+
key: "clearHeartbeatTimers",
|
|
316
|
+
value: function clearHeartbeatTimers() {
|
|
317
|
+
this.heartbeatTimer && clearInterval(this.heartbeatTimer), this.heartbeatTimer = null, this.clearHeartbeatTimeoutTimer();
|
|
318
|
+
}
|
|
319
|
+
}, {
|
|
320
|
+
key: "clearHeartbeatTimeoutTimer",
|
|
321
|
+
value: function clearHeartbeatTimeoutTimer() {
|
|
322
|
+
this.heartbeatTimeoutTimer && clearTimeout(this.heartbeatTimeoutTimer), this.heartbeatTimeoutTimer = null;
|
|
323
|
+
}
|
|
324
|
+
}, {
|
|
325
|
+
key: "clearReconnectTimer",
|
|
326
|
+
value: function clearReconnectTimer() {
|
|
327
|
+
this.reconnectTimer && clearTimeout(this.reconnectTimer), this.reconnectTimer = null;
|
|
328
|
+
}
|
|
329
|
+
}, {
|
|
330
|
+
key: "removeNetworkListeners",
|
|
331
|
+
value: function removeNetworkListeners() {
|
|
332
|
+
(typeof window === "undefined" ? "undefined" : _typeof(window)) > "u" || (window.removeEventListener("online", this.handleOnline), window.removeEventListener("offline", this.handleOffline));
|
|
333
|
+
}
|
|
334
|
+
}]);
|
|
335
|
+
}();
|
|
336
|
+
var g = function g(i) {
|
|
337
|
+
return new S(i);
|
|
338
|
+
};
|
|
339
|
+
exports.RealtimeSocketClient = S;
|
|
340
|
+
exports.createRealtimeSocketClient = g;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export type RealtimeSocketState = 'idle' | 'waiting-token' | 'connecting' | 'open' | 'reconnecting' | 'closed' | 'unsupported';
|
|
2
|
+
export type RealtimeSocketHeartbeatOptions = {
|
|
3
|
+
message: string | (() => string);
|
|
4
|
+
interval: number;
|
|
5
|
+
timeout?: number;
|
|
6
|
+
response?: string | string[];
|
|
7
|
+
};
|
|
8
|
+
export type RealtimeSocketReconnectOptions = {
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
delay?: number;
|
|
11
|
+
maxDelay?: number;
|
|
12
|
+
maxAttempts?: number;
|
|
13
|
+
jitter?: boolean;
|
|
14
|
+
};
|
|
15
|
+
export type RealtimeSocketClientOptions<T = unknown> = {
|
|
16
|
+
url: string;
|
|
17
|
+
params?: Record<string, any>;
|
|
18
|
+
tokenParamName?: string;
|
|
19
|
+
tokenProvider?: () => string | Promise<string>;
|
|
20
|
+
heartbeat?: RealtimeSocketHeartbeatOptions;
|
|
21
|
+
reconnect?: RealtimeSocketReconnectOptions;
|
|
22
|
+
parser?: (event: MessageEvent) => T;
|
|
23
|
+
onOpen?: (event: Event) => void;
|
|
24
|
+
onMessage?: (message: T, event: MessageEvent) => void;
|
|
25
|
+
onClose?: (event: CloseEvent) => void;
|
|
26
|
+
onError?: (event: Event) => void;
|
|
27
|
+
onInvalidMessage?: (error: unknown, event: MessageEvent) => void;
|
|
28
|
+
onStateChange?: (state: RealtimeSocketState) => void;
|
|
29
|
+
};
|
|
30
|
+
export declare class RealtimeSocketClient<T = unknown> {
|
|
31
|
+
private ws;
|
|
32
|
+
private options;
|
|
33
|
+
private state;
|
|
34
|
+
private heartbeatTimer;
|
|
35
|
+
private heartbeatTimeoutTimer;
|
|
36
|
+
private reconnectTimer;
|
|
37
|
+
private reconnectAttempts;
|
|
38
|
+
private manualClosed;
|
|
39
|
+
private started;
|
|
40
|
+
private lastHeartbeatAck;
|
|
41
|
+
constructor(options: RealtimeSocketClientOptions<T>);
|
|
42
|
+
/** 获取当前连接状态,供业务显示或调试兜底使用。 */
|
|
43
|
+
getState(): RealtimeSocketState;
|
|
44
|
+
/** 建立连接;重复调用不会创建多个活动 WebSocket。 */
|
|
45
|
+
connect(): Promise<void>;
|
|
46
|
+
/** 仅在连接已打开时发送消息,失败时返回 false。 */
|
|
47
|
+
send(message: string | ArrayBufferLike | Blob | ArrayBufferView): boolean;
|
|
48
|
+
/** 主动关闭连接,并清理心跳、重连和网络监听。 */
|
|
49
|
+
close(): void;
|
|
50
|
+
private openSocket;
|
|
51
|
+
private resolveToken;
|
|
52
|
+
private handleOpen;
|
|
53
|
+
private handleMessage;
|
|
54
|
+
private handleClose;
|
|
55
|
+
private handleError;
|
|
56
|
+
private startHeartbeat;
|
|
57
|
+
private scheduleReconnect;
|
|
58
|
+
private getReconnectDelay;
|
|
59
|
+
private handleOnline;
|
|
60
|
+
private handleOffline;
|
|
61
|
+
private setState;
|
|
62
|
+
private closeSocket;
|
|
63
|
+
private clearTimers;
|
|
64
|
+
private clearHeartbeatTimers;
|
|
65
|
+
private clearHeartbeatTimeoutTimer;
|
|
66
|
+
private clearReconnectTimer;
|
|
67
|
+
private removeNetworkListeners;
|
|
68
|
+
}
|
|
69
|
+
/** 创建独立实时连接实例,调用方负责在卸载时 close。 */
|
|
70
|
+
export declare const createRealtimeSocketClient: <T = unknown>(options: RealtimeSocketClientOptions<T>) => RealtimeSocketClient<T>;
|