@das-fed/upf-utils 6.4.0-dev.287 → 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.
Files changed (78) hide show
  1. package/api-services/es5.js +1672 -1660
  2. package/api-services/index.js +1362 -1344
  3. package/api-services/index.js.gz +0 -0
  4. package/api-services/modules/app-manage/es5.js +1110 -1122
  5. package/api-services/modules/app-manage/index.js +918 -936
  6. package/api-services/modules/app-manage/index.js.gz +0 -0
  7. package/api-services/modules/authentication/es5.js +1122 -1134
  8. package/api-services/modules/authentication/index.js +930 -948
  9. package/api-services/modules/authentication/index.js.gz +0 -0
  10. package/api-services/modules/bems/es5.js +1137 -1128
  11. package/api-services/modules/bems/index.js +950 -936
  12. package/api-services/modules/bems/index.js.gz +0 -0
  13. package/api-services/modules/contract/es5.js +1122 -1134
  14. package/api-services/modules/contract/index.js +930 -948
  15. package/api-services/modules/contract/index.js.gz +0 -0
  16. package/api-services/modules/duty-manage/es5.js +848 -850
  17. package/api-services/modules/duty-manage/index.js +666 -670
  18. package/api-services/modules/duty-manage/index.js.gz +0 -0
  19. package/api-services/modules/es5.js +1355 -1367
  20. package/api-services/modules/file/es5.js +1224 -1221
  21. package/api-services/modules/file/index.js +997 -993
  22. package/api-services/modules/file/index.js.gz +0 -0
  23. package/api-services/modules/gateway-edge/es5.js +1122 -1134
  24. package/api-services/modules/gateway-edge/index.js +930 -948
  25. package/api-services/modules/gateway-edge/index.js.gz +0 -0
  26. package/api-services/modules/index.js +1068 -1086
  27. package/api-services/modules/index.js.gz +0 -0
  28. package/api-services/modules/justauth/es5.js +873 -876
  29. package/api-services/modules/justauth/index.js +684 -688
  30. package/api-services/modules/justauth/index.js.gz +0 -0
  31. package/api-services/modules/knowledge/es5.js +1132 -1122
  32. package/api-services/modules/knowledge/index.js +944 -930
  33. package/api-services/modules/knowledge/index.js.gz +0 -0
  34. package/api-services/modules/link/es5.js +860 -857
  35. package/api-services/modules/link/index.js +674 -670
  36. package/api-services/modules/link/index.js.gz +0 -0
  37. package/api-services/modules/platformManage/es5.js +1238 -1226
  38. package/api-services/modules/platformManage/index.js +1032 -1014
  39. package/api-services/modules/platformManage/index.js.gz +0 -0
  40. package/api-services/modules/portal/es5.js +1124 -1133
  41. package/api-services/modules/portal/index.js +933 -947
  42. package/api-services/modules/portal/index.js.gz +0 -0
  43. package/api-services/modules/space-manage/es5.js +860 -857
  44. package/api-services/modules/space-manage/index.js +674 -670
  45. package/api-services/modules/space-manage/index.js.gz +0 -0
  46. package/api-services/modules/supplier/es5.js +1126 -1114
  47. package/api-services/modules/supplier/index.js +938 -920
  48. package/api-services/modules/supplier/index.js.gz +0 -0
  49. package/api-services/modules/systemConfiguration/es5.js +1122 -1134
  50. package/api-services/modules/systemConfiguration/index.js +930 -948
  51. package/api-services/modules/systemConfiguration/index.js.gz +0 -0
  52. package/api-services/src/create-service/es5.js +1132 -1120
  53. package/api-services/src/create-service/index.js +947 -929
  54. package/api-services/src/create-service/index.js.gz +0 -0
  55. package/common-info/getPermissionMethod/es5.js +1388 -1376
  56. package/common-info/getPermissionMethod/index.js +1155 -1137
  57. package/common-info/getPermissionMethod/index.js.gz +0 -0
  58. package/common-tools/timezone-format/es5.d.ts +1 -0
  59. package/common-tools/timezone-format/es5.js +159 -146
  60. package/common-tools/timezone-format/index.d.ts +1 -0
  61. package/common-tools/timezone-format/index.js +127 -111
  62. package/common-tools/timezone-format/index.js.gz +0 -0
  63. package/config/es5.js +12 -8
  64. package/config/index.js +7 -4
  65. package/create-api-service/es5.js +1133 -1121
  66. package/create-api-service/index.js +948 -930
  67. package/create-api-service/index.js.gz +0 -0
  68. package/esm-map.json +4 -1
  69. package/package.json +7 -7
  70. package/realtime-connection/es5.d.ts +70 -0
  71. package/realtime-connection/es5.js +340 -0
  72. package/realtime-connection/index.d.ts +70 -0
  73. package/realtime-connection/index.js +168 -0
  74. package/realtime-connection/index.js.gz +0 -0
  75. package/release-meta.json +4 -4
  76. package/theme/es5.js +41 -41
  77. package/theme/index.js +35 -35
  78. package/theme/index.js.gz +0 -0
Binary file
package/esm-map.json CHANGED
@@ -275,5 +275,8 @@
275
275
  "toTimeZonePickerValue": "/common-tools/timezone-format/index",
276
276
  "fromTimeZonePickerValue": "/common-tools/timezone-format/index",
277
277
  "toTimestampAtZoneStartOfDay": "/common-tools/timezone-format/index",
278
- "toTimestampAtZoneEndOfDay": "/common-tools/timezone-format/index"
278
+ "toTimestampAtZoneEndOfDay": "/common-tools/timezone-format/index",
279
+ "readInjectedParentIanaTimeZoneDataSnapshot": "/common-tools/timezone-format/index",
280
+ "RealtimeSocketClient": "/realtime-connection/index",
281
+ "createRealtimeSocketClient": "/realtime-connection/index"
279
282
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@das-fed/upf-utils",
3
- "version": "6.4.0-dev.287",
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.287",
26
- "@das-fed/upf-web": "6.4.0-dev.287",
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.287",
54
+ "releaseVersion": "6.4.0-dev.289",
55
55
  "distTag": "dev",
56
56
  "releaseType": "publish",
57
- "publishedAt": "2026-07-02T08:16:28.342Z",
57
+ "publishedAt": "2026-07-08T01:52:46.305Z",
58
58
  "sourceBranch": "dev",
59
- "sourceCommit": "fb153b1322fdc8e810df04fae22870b88403fb22",
60
- "gitTag": "upf-release/v6.4.0-dev.287",
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>;