@plolink/sdk 0.0.4

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 (76) hide show
  1. package/README.md +259 -0
  2. package/dist/chunk-4H4RACSE.js +335 -0
  3. package/dist/chunk-4H4RACSE.js.map +1 -0
  4. package/dist/chunk-IHAAKFEJ.js +219 -0
  5. package/dist/chunk-IHAAKFEJ.js.map +1 -0
  6. package/dist/chunk-JR4HYYQI.cjs +221 -0
  7. package/dist/chunk-JR4HYYQI.cjs.map +1 -0
  8. package/dist/chunk-MD4O7FWT.js +46 -0
  9. package/dist/chunk-MD4O7FWT.js.map +1 -0
  10. package/dist/chunk-NS3DJP2O.cjs +349 -0
  11. package/dist/chunk-NS3DJP2O.cjs.map +1 -0
  12. package/dist/chunk-Y3UJVC2L.cjs +48 -0
  13. package/dist/chunk-Y3UJVC2L.cjs.map +1 -0
  14. package/dist/client-CAjIQKPm.d.cts +193 -0
  15. package/dist/client-CwNikk7i.d.ts +193 -0
  16. package/dist/common/index.cjs +65 -0
  17. package/dist/common/index.cjs.map +1 -0
  18. package/dist/common/index.d.cts +422 -0
  19. package/dist/common/index.d.ts +422 -0
  20. package/dist/common/index.js +4 -0
  21. package/dist/common/index.js.map +1 -0
  22. package/dist/core-77EbLgbp.d.cts +97 -0
  23. package/dist/core-77EbLgbp.d.ts +97 -0
  24. package/dist/index.cjs +350 -0
  25. package/dist/index.cjs.map +1 -0
  26. package/dist/index.d.cts +98 -0
  27. package/dist/index.d.ts +98 -0
  28. package/dist/index.js +306 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/modules/agent/index.cjs +21 -0
  31. package/dist/modules/agent/index.cjs.map +1 -0
  32. package/dist/modules/agent/index.d.cts +71 -0
  33. package/dist/modules/agent/index.d.ts +71 -0
  34. package/dist/modules/agent/index.js +19 -0
  35. package/dist/modules/agent/index.js.map +1 -0
  36. package/dist/modules/billing/index.cjs +413 -0
  37. package/dist/modules/billing/index.cjs.map +1 -0
  38. package/dist/modules/billing/index.d.cts +538 -0
  39. package/dist/modules/billing/index.d.ts +538 -0
  40. package/dist/modules/billing/index.js +411 -0
  41. package/dist/modules/billing/index.js.map +1 -0
  42. package/dist/modules/chat/index.cjs +20 -0
  43. package/dist/modules/chat/index.cjs.map +1 -0
  44. package/dist/modules/chat/index.d.cts +68 -0
  45. package/dist/modules/chat/index.d.ts +68 -0
  46. package/dist/modules/chat/index.js +18 -0
  47. package/dist/modules/chat/index.js.map +1 -0
  48. package/dist/modules/psych/index.cjs +20 -0
  49. package/dist/modules/psych/index.cjs.map +1 -0
  50. package/dist/modules/psych/index.d.cts +69 -0
  51. package/dist/modules/psych/index.d.ts +69 -0
  52. package/dist/modules/psych/index.js +18 -0
  53. package/dist/modules/psych/index.js.map +1 -0
  54. package/dist/modules/rbac/index.cjs +197 -0
  55. package/dist/modules/rbac/index.cjs.map +1 -0
  56. package/dist/modules/rbac/index.d.cts +293 -0
  57. package/dist/modules/rbac/index.d.ts +293 -0
  58. package/dist/modules/rbac/index.js +195 -0
  59. package/dist/modules/rbac/index.js.map +1 -0
  60. package/dist/modules/team/index.cjs +54 -0
  61. package/dist/modules/team/index.cjs.map +1 -0
  62. package/dist/modules/team/index.d.cts +91 -0
  63. package/dist/modules/team/index.d.ts +91 -0
  64. package/dist/modules/team/index.js +52 -0
  65. package/dist/modules/team/index.js.map +1 -0
  66. package/dist/modules/virtual-account/index.cjs +293 -0
  67. package/dist/modules/virtual-account/index.cjs.map +1 -0
  68. package/dist/modules/virtual-account/index.d.cts +366 -0
  69. package/dist/modules/virtual-account/index.d.ts +366 -0
  70. package/dist/modules/virtual-account/index.js +291 -0
  71. package/dist/modules/virtual-account/index.js.map +1 -0
  72. package/dist/poller-BlIRbwL4.d.cts +201 -0
  73. package/dist/poller-DWKZjuSw.d.ts +201 -0
  74. package/dist/shared-6ZepUSPW.d.cts +31 -0
  75. package/dist/shared-6ZepUSPW.d.ts +31 -0
  76. package/package.json +96 -0
@@ -0,0 +1,219 @@
1
+ // src/common/poller.ts
2
+ var Poller = class {
3
+ /**
4
+ * 创建一个 Poller 实例
5
+ *
6
+ * @param options - 轮询器配置选项
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * const poller = new Poller({
11
+ * task: async () => {
12
+ * const response = await fetch('/api/status');
13
+ * return response.json();
14
+ * },
15
+ * onResult: (data) => console.log(data),
16
+ * shouldStop: (data) => data.completed === true
17
+ * });
18
+ * ```
19
+ */
20
+ constructor(options) {
21
+ /**
22
+ * 定时器引用
23
+ */
24
+ this.timer = null;
25
+ /**
26
+ * 当前重试次数
27
+ */
28
+ this.retryCount = 0;
29
+ /**
30
+ * 是否正在运行
31
+ */
32
+ this.isRunning = false;
33
+ /**
34
+ * 是否正在执行任务
35
+ */
36
+ this.isExecuting = false;
37
+ this.options = {
38
+ task: options.task,
39
+ onResult: options.onResult,
40
+ shouldStop: options.shouldStop,
41
+ initialInterval: options.initialInterval ?? 1e3,
42
+ maxInterval: options.maxInterval ?? 3e4,
43
+ backoffFactor: options.backoffFactor ?? 1.5,
44
+ onError: options.onError ?? (() => {
45
+ })
46
+ };
47
+ this.currentInterval = this.options.initialInterval;
48
+ }
49
+ /**
50
+ * 启动或恢复轮询
51
+ *
52
+ * @description
53
+ * 如果轮询器已经在运行,此方法不会有任何效果。
54
+ * 首次调用会立即执行一次任务。
55
+ *
56
+ * @returns Promise,在首次任务执行完成后 resolve
57
+ *
58
+ * @example
59
+ * ```typescript
60
+ * await poller.start();
61
+ * console.log('Polling started');
62
+ * ```
63
+ */
64
+ async start() {
65
+ if (this.isRunning) {
66
+ return;
67
+ }
68
+ this.isRunning = true;
69
+ await this.execute();
70
+ }
71
+ /**
72
+ * 停止轮询
73
+ *
74
+ * @description
75
+ * 停止后可以通过再次调用 start() 恢复轮询。
76
+ * 如果有正在执行的任务,会等待其完成。
77
+ *
78
+ * @example
79
+ * ```typescript
80
+ * poller.stop();
81
+ * console.log('Polling stopped');
82
+ * ```
83
+ */
84
+ stop() {
85
+ this.isRunning = false;
86
+ if (this.timer) {
87
+ clearTimeout(this.timer);
88
+ this.timer = null;
89
+ }
90
+ }
91
+ /**
92
+ * 执行轮询任务
93
+ *
94
+ * @private
95
+ */
96
+ async execute() {
97
+ if (!this.isRunning || this.isExecuting) {
98
+ return;
99
+ }
100
+ this.isExecuting = true;
101
+ try {
102
+ const result = await this.options.task();
103
+ this.options.onResult(result);
104
+ if (this.options.shouldStop(result)) {
105
+ this.stop();
106
+ return;
107
+ }
108
+ this.currentInterval = this.options.initialInterval;
109
+ this.retryCount = 0;
110
+ } catch (error) {
111
+ this.retryCount++;
112
+ this.currentInterval = Math.min(
113
+ this.options.initialInterval * Math.pow(this.options.backoffFactor, this.retryCount),
114
+ this.options.maxInterval
115
+ );
116
+ this.options.onError(error);
117
+ } finally {
118
+ this.isExecuting = false;
119
+ }
120
+ if (this.isRunning) {
121
+ this.timer = setTimeout(() => {
122
+ void this.execute();
123
+ }, this.currentInterval);
124
+ }
125
+ }
126
+ /**
127
+ * 获取当前状态快照
128
+ *
129
+ * @description
130
+ * 用于保存轮询器的当前状态,以便后续恢复。
131
+ * 这在组件卸载/重新挂载场景中非常有用。
132
+ *
133
+ * @returns 状态快照对象
134
+ *
135
+ * @example
136
+ * ```typescript
137
+ * const snapshot = poller.getSnapshot();
138
+ * localStorage.setItem('poller-state', JSON.stringify(snapshot));
139
+ *
140
+ * // 恢复时
141
+ * const snapshot = JSON.parse(localStorage.getItem('poller-state'));
142
+ * poller.restoreFromSnapshot(snapshot);
143
+ * ```
144
+ */
145
+ getSnapshot() {
146
+ return {
147
+ retryCount: this.retryCount,
148
+ currentInterval: this.currentInterval,
149
+ isRunning: this.isRunning
150
+ };
151
+ }
152
+ /**
153
+ * 从状态快照恢复
154
+ *
155
+ * @description
156
+ * 从之前保存的快照中恢复轮询器状态。
157
+ * 注意:此方法不会自动启动轮询,需要手动调用 start()。
158
+ *
159
+ * @param snapshot - 状态快照对象
160
+ *
161
+ * @example
162
+ * ```typescript
163
+ * const snapshot = {
164
+ * retryCount: 3,
165
+ * currentInterval: 3375,
166
+ * isRunning: false
167
+ * };
168
+ * poller.restoreFromSnapshot(snapshot);
169
+ *
170
+ * // 如果需要继续轮询
171
+ * if (snapshot.isRunning) {
172
+ * poller.start();
173
+ * }
174
+ * ```
175
+ */
176
+ restoreFromSnapshot(snapshot) {
177
+ this.retryCount = snapshot.retryCount;
178
+ this.currentInterval = snapshot.currentInterval;
179
+ }
180
+ /**
181
+ * 重置轮询器状态
182
+ *
183
+ * @description
184
+ * 将轮询器重置到初始状态(重试次数归零,间隔重置)。
185
+ * 不会停止正在运行的轮询。
186
+ *
187
+ * @example
188
+ * ```typescript
189
+ * poller.reset();
190
+ * ```
191
+ */
192
+ reset() {
193
+ this.retryCount = 0;
194
+ this.currentInterval = this.options.initialInterval;
195
+ }
196
+ /**
197
+ * 获取当前状态信息
198
+ *
199
+ * @returns 包含当前状态的对象
200
+ *
201
+ * @example
202
+ * ```typescript
203
+ * const status = poller.getStatus();
204
+ * console.log(`Running: ${status.isRunning}, Retry: ${status.retryCount}`);
205
+ * ```
206
+ */
207
+ getStatus() {
208
+ return {
209
+ isRunning: this.isRunning,
210
+ isExecuting: this.isExecuting,
211
+ retryCount: this.retryCount,
212
+ currentInterval: this.currentInterval
213
+ };
214
+ }
215
+ };
216
+
217
+ export { Poller };
218
+ //# sourceMappingURL=chunk-IHAAKFEJ.js.map
219
+ //# sourceMappingURL=chunk-IHAAKFEJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/common/poller.ts"],"names":[],"mappings":"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","file":"chunk-IHAAKFEJ.js","sourcesContent":["import type { PollerOptions, PollerSnapshot } from '../types';\n\n/**\n * 指数退避轮询器\n * \n * @description\n * 实现了智能轮询机制,具有以下特性:\n * - **指数退避**:失败时按配置的退避因子增加轮询间隔\n * - **自动停止**:通过 shouldStop 判断终态自动停止\n * - **状态快照**:支持导出和恢复轮询状态\n * - **挂载恢复**:适用于组件卸载后重新挂载的场景\n * \n * @template T - 轮询任务返回值的类型\n * \n * @example\n * ```typescript\n * // 创建轮询器\n * const poller = new Poller({\n * task: () => fetch('/api/order/123').then(r => r.json()),\n * onResult: (data) => {\n * console.log('Order status:', data.status);\n * },\n * shouldStop: (data) => data.status === 'success' || data.status === 'failed',\n * initialInterval: 1000,\n * maxInterval: 30000,\n * backoffFactor: 1.5,\n * onError: (error) => {\n * console.error('Polling error:', error);\n * }\n * });\n * \n * // 启动轮询\n * poller.start();\n * \n * // 停止轮询\n * poller.stop();\n * \n * // 导出状态快照(用于恢复)\n * const snapshot = poller.getSnapshot();\n * \n * // 从快照恢复\n * poller.restoreFromSnapshot(snapshot);\n * ```\n */\nexport class Poller<T> {\n /**\n * 轮询配置选项\n */\n private readonly options: Required<PollerOptions<T>>;\n\n /**\n * 定时器引用\n */\n private timer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * 当前轮询间隔(毫秒)\n */\n private currentInterval: number;\n\n /**\n * 当前重试次数\n */\n private retryCount: number = 0;\n\n /**\n * 是否正在运行\n */\n private isRunning: boolean = false;\n\n /**\n * 是否正在执行任务\n */\n private isExecuting: boolean = false;\n\n /**\n * 创建一个 Poller 实例\n * \n * @param options - 轮询器配置选项\n * \n * @example\n * ```typescript\n * const poller = new Poller({\n * task: async () => {\n * const response = await fetch('/api/status');\n * return response.json();\n * },\n * onResult: (data) => console.log(data),\n * shouldStop: (data) => data.completed === true\n * });\n * ```\n */\n constructor(options: PollerOptions<T>) {\n // 填充默认配置\n this.options = {\n task: options.task,\n onResult: options.onResult,\n shouldStop: options.shouldStop,\n initialInterval: options.initialInterval ?? 1000,\n maxInterval: options.maxInterval ?? 30000,\n backoffFactor: options.backoffFactor ?? 1.5,\n onError: options.onError ?? (() => {}),\n };\n\n this.currentInterval = this.options.initialInterval;\n }\n\n /**\n * 启动或恢复轮询\n * \n * @description\n * 如果轮询器已经在运行,此方法不会有任何效果。\n * 首次调用会立即执行一次任务。\n * \n * @returns Promise,在首次任务执行完成后 resolve\n * \n * @example\n * ```typescript\n * await poller.start();\n * console.log('Polling started');\n * ```\n */\n public async start(): Promise<void> {\n if (this.isRunning) {\n return;\n }\n\n this.isRunning = true;\n await this.execute();\n }\n\n /**\n * 停止轮询\n * \n * @description\n * 停止后可以通过再次调用 start() 恢复轮询。\n * 如果有正在执行的任务,会等待其完成。\n * \n * @example\n * ```typescript\n * poller.stop();\n * console.log('Polling stopped');\n * ```\n */\n public stop(): void {\n this.isRunning = false;\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n\n /**\n * 执行轮询任务\n * \n * @private\n */\n private async execute(): Promise<void> {\n if (!this.isRunning || this.isExecuting) {\n return;\n }\n\n this.isExecuting = true;\n\n try {\n // 执行任务\n const result = await this.options.task();\n\n // 调用结果回调\n this.options.onResult(result);\n\n // 检查是否应该停止\n if (this.options.shouldStop(result)) {\n this.stop();\n return;\n }\n\n // 任务成功,重置退避参数\n this.currentInterval = this.options.initialInterval;\n this.retryCount = 0;\n } catch (error) {\n // 任务失败,应用指数退避\n this.retryCount++;\n this.currentInterval = Math.min(\n this.options.initialInterval * Math.pow(this.options.backoffFactor, this.retryCount),\n this.options.maxInterval\n );\n\n // 调用错误回调\n this.options.onError(error);\n } finally {\n this.isExecuting = false;\n }\n\n // 如果仍在运行,安排下一次执行\n if (this.isRunning) {\n this.timer = setTimeout(() => {\n void this.execute();\n }, this.currentInterval);\n }\n }\n\n /**\n * 获取当前状态快照\n * \n * @description\n * 用于保存轮询器的当前状态,以便后续恢复。\n * 这在组件卸载/重新挂载场景中非常有用。\n * \n * @returns 状态快照对象\n * \n * @example\n * ```typescript\n * const snapshot = poller.getSnapshot();\n * localStorage.setItem('poller-state', JSON.stringify(snapshot));\n * \n * // 恢复时\n * const snapshot = JSON.parse(localStorage.getItem('poller-state'));\n * poller.restoreFromSnapshot(snapshot);\n * ```\n */\n public getSnapshot(): PollerSnapshot {\n return {\n retryCount: this.retryCount,\n currentInterval: this.currentInterval,\n isRunning: this.isRunning,\n };\n }\n\n /**\n * 从状态快照恢复\n * \n * @description\n * 从之前保存的快照中恢复轮询器状态。\n * 注意:此方法不会自动启动轮询,需要手动调用 start()。\n * \n * @param snapshot - 状态快照对象\n * \n * @example\n * ```typescript\n * const snapshot = {\n * retryCount: 3,\n * currentInterval: 3375,\n * isRunning: false\n * };\n * poller.restoreFromSnapshot(snapshot);\n * \n * // 如果需要继续轮询\n * if (snapshot.isRunning) {\n * poller.start();\n * }\n * ```\n */\n public restoreFromSnapshot(snapshot: PollerSnapshot): void {\n this.retryCount = snapshot.retryCount;\n this.currentInterval = snapshot.currentInterval;\n // 注意:不自动恢复 isRunning 状态,由调用方决定是否启动\n }\n\n /**\n * 重置轮询器状态\n * \n * @description\n * 将轮询器重置到初始状态(重试次数归零,间隔重置)。\n * 不会停止正在运行的轮询。\n * \n * @example\n * ```typescript\n * poller.reset();\n * ```\n */\n public reset(): void {\n this.retryCount = 0;\n this.currentInterval = this.options.initialInterval;\n }\n\n /**\n * 获取当前状态信息\n * \n * @returns 包含当前状态的对象\n * \n * @example\n * ```typescript\n * const status = poller.getStatus();\n * console.log(`Running: ${status.isRunning}, Retry: ${status.retryCount}`);\n * ```\n */\n public getStatus(): {\n isRunning: boolean;\n isExecuting: boolean;\n retryCount: number;\n currentInterval: number;\n } {\n return {\n isRunning: this.isRunning,\n isExecuting: this.isExecuting,\n retryCount: this.retryCount,\n currentInterval: this.currentInterval,\n };\n }\n}\n\n"]}
@@ -0,0 +1,221 @@
1
+ 'use strict';
2
+
3
+ // src/common/poller.ts
4
+ var Poller = class {
5
+ /**
6
+ * 创建一个 Poller 实例
7
+ *
8
+ * @param options - 轮询器配置选项
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * const poller = new Poller({
13
+ * task: async () => {
14
+ * const response = await fetch('/api/status');
15
+ * return response.json();
16
+ * },
17
+ * onResult: (data) => console.log(data),
18
+ * shouldStop: (data) => data.completed === true
19
+ * });
20
+ * ```
21
+ */
22
+ constructor(options) {
23
+ /**
24
+ * 定时器引用
25
+ */
26
+ this.timer = null;
27
+ /**
28
+ * 当前重试次数
29
+ */
30
+ this.retryCount = 0;
31
+ /**
32
+ * 是否正在运行
33
+ */
34
+ this.isRunning = false;
35
+ /**
36
+ * 是否正在执行任务
37
+ */
38
+ this.isExecuting = false;
39
+ this.options = {
40
+ task: options.task,
41
+ onResult: options.onResult,
42
+ shouldStop: options.shouldStop,
43
+ initialInterval: options.initialInterval ?? 1e3,
44
+ maxInterval: options.maxInterval ?? 3e4,
45
+ backoffFactor: options.backoffFactor ?? 1.5,
46
+ onError: options.onError ?? (() => {
47
+ })
48
+ };
49
+ this.currentInterval = this.options.initialInterval;
50
+ }
51
+ /**
52
+ * 启动或恢复轮询
53
+ *
54
+ * @description
55
+ * 如果轮询器已经在运行,此方法不会有任何效果。
56
+ * 首次调用会立即执行一次任务。
57
+ *
58
+ * @returns Promise,在首次任务执行完成后 resolve
59
+ *
60
+ * @example
61
+ * ```typescript
62
+ * await poller.start();
63
+ * console.log('Polling started');
64
+ * ```
65
+ */
66
+ async start() {
67
+ if (this.isRunning) {
68
+ return;
69
+ }
70
+ this.isRunning = true;
71
+ await this.execute();
72
+ }
73
+ /**
74
+ * 停止轮询
75
+ *
76
+ * @description
77
+ * 停止后可以通过再次调用 start() 恢复轮询。
78
+ * 如果有正在执行的任务,会等待其完成。
79
+ *
80
+ * @example
81
+ * ```typescript
82
+ * poller.stop();
83
+ * console.log('Polling stopped');
84
+ * ```
85
+ */
86
+ stop() {
87
+ this.isRunning = false;
88
+ if (this.timer) {
89
+ clearTimeout(this.timer);
90
+ this.timer = null;
91
+ }
92
+ }
93
+ /**
94
+ * 执行轮询任务
95
+ *
96
+ * @private
97
+ */
98
+ async execute() {
99
+ if (!this.isRunning || this.isExecuting) {
100
+ return;
101
+ }
102
+ this.isExecuting = true;
103
+ try {
104
+ const result = await this.options.task();
105
+ this.options.onResult(result);
106
+ if (this.options.shouldStop(result)) {
107
+ this.stop();
108
+ return;
109
+ }
110
+ this.currentInterval = this.options.initialInterval;
111
+ this.retryCount = 0;
112
+ } catch (error) {
113
+ this.retryCount++;
114
+ this.currentInterval = Math.min(
115
+ this.options.initialInterval * Math.pow(this.options.backoffFactor, this.retryCount),
116
+ this.options.maxInterval
117
+ );
118
+ this.options.onError(error);
119
+ } finally {
120
+ this.isExecuting = false;
121
+ }
122
+ if (this.isRunning) {
123
+ this.timer = setTimeout(() => {
124
+ void this.execute();
125
+ }, this.currentInterval);
126
+ }
127
+ }
128
+ /**
129
+ * 获取当前状态快照
130
+ *
131
+ * @description
132
+ * 用于保存轮询器的当前状态,以便后续恢复。
133
+ * 这在组件卸载/重新挂载场景中非常有用。
134
+ *
135
+ * @returns 状态快照对象
136
+ *
137
+ * @example
138
+ * ```typescript
139
+ * const snapshot = poller.getSnapshot();
140
+ * localStorage.setItem('poller-state', JSON.stringify(snapshot));
141
+ *
142
+ * // 恢复时
143
+ * const snapshot = JSON.parse(localStorage.getItem('poller-state'));
144
+ * poller.restoreFromSnapshot(snapshot);
145
+ * ```
146
+ */
147
+ getSnapshot() {
148
+ return {
149
+ retryCount: this.retryCount,
150
+ currentInterval: this.currentInterval,
151
+ isRunning: this.isRunning
152
+ };
153
+ }
154
+ /**
155
+ * 从状态快照恢复
156
+ *
157
+ * @description
158
+ * 从之前保存的快照中恢复轮询器状态。
159
+ * 注意:此方法不会自动启动轮询,需要手动调用 start()。
160
+ *
161
+ * @param snapshot - 状态快照对象
162
+ *
163
+ * @example
164
+ * ```typescript
165
+ * const snapshot = {
166
+ * retryCount: 3,
167
+ * currentInterval: 3375,
168
+ * isRunning: false
169
+ * };
170
+ * poller.restoreFromSnapshot(snapshot);
171
+ *
172
+ * // 如果需要继续轮询
173
+ * if (snapshot.isRunning) {
174
+ * poller.start();
175
+ * }
176
+ * ```
177
+ */
178
+ restoreFromSnapshot(snapshot) {
179
+ this.retryCount = snapshot.retryCount;
180
+ this.currentInterval = snapshot.currentInterval;
181
+ }
182
+ /**
183
+ * 重置轮询器状态
184
+ *
185
+ * @description
186
+ * 将轮询器重置到初始状态(重试次数归零,间隔重置)。
187
+ * 不会停止正在运行的轮询。
188
+ *
189
+ * @example
190
+ * ```typescript
191
+ * poller.reset();
192
+ * ```
193
+ */
194
+ reset() {
195
+ this.retryCount = 0;
196
+ this.currentInterval = this.options.initialInterval;
197
+ }
198
+ /**
199
+ * 获取当前状态信息
200
+ *
201
+ * @returns 包含当前状态的对象
202
+ *
203
+ * @example
204
+ * ```typescript
205
+ * const status = poller.getStatus();
206
+ * console.log(`Running: ${status.isRunning}, Retry: ${status.retryCount}`);
207
+ * ```
208
+ */
209
+ getStatus() {
210
+ return {
211
+ isRunning: this.isRunning,
212
+ isExecuting: this.isExecuting,
213
+ retryCount: this.retryCount,
214
+ currentInterval: this.currentInterval
215
+ };
216
+ }
217
+ };
218
+
219
+ exports.Poller = Poller;
220
+ //# sourceMappingURL=chunk-JR4HYYQI.cjs.map
221
+ //# sourceMappingURL=chunk-JR4HYYQI.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/common/poller.ts"],"names":[],"mappings":"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","file":"chunk-JR4HYYQI.cjs","sourcesContent":["import type { PollerOptions, PollerSnapshot } from '../types';\n\n/**\n * 指数退避轮询器\n * \n * @description\n * 实现了智能轮询机制,具有以下特性:\n * - **指数退避**:失败时按配置的退避因子增加轮询间隔\n * - **自动停止**:通过 shouldStop 判断终态自动停止\n * - **状态快照**:支持导出和恢复轮询状态\n * - **挂载恢复**:适用于组件卸载后重新挂载的场景\n * \n * @template T - 轮询任务返回值的类型\n * \n * @example\n * ```typescript\n * // 创建轮询器\n * const poller = new Poller({\n * task: () => fetch('/api/order/123').then(r => r.json()),\n * onResult: (data) => {\n * console.log('Order status:', data.status);\n * },\n * shouldStop: (data) => data.status === 'success' || data.status === 'failed',\n * initialInterval: 1000,\n * maxInterval: 30000,\n * backoffFactor: 1.5,\n * onError: (error) => {\n * console.error('Polling error:', error);\n * }\n * });\n * \n * // 启动轮询\n * poller.start();\n * \n * // 停止轮询\n * poller.stop();\n * \n * // 导出状态快照(用于恢复)\n * const snapshot = poller.getSnapshot();\n * \n * // 从快照恢复\n * poller.restoreFromSnapshot(snapshot);\n * ```\n */\nexport class Poller<T> {\n /**\n * 轮询配置选项\n */\n private readonly options: Required<PollerOptions<T>>;\n\n /**\n * 定时器引用\n */\n private timer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * 当前轮询间隔(毫秒)\n */\n private currentInterval: number;\n\n /**\n * 当前重试次数\n */\n private retryCount: number = 0;\n\n /**\n * 是否正在运行\n */\n private isRunning: boolean = false;\n\n /**\n * 是否正在执行任务\n */\n private isExecuting: boolean = false;\n\n /**\n * 创建一个 Poller 实例\n * \n * @param options - 轮询器配置选项\n * \n * @example\n * ```typescript\n * const poller = new Poller({\n * task: async () => {\n * const response = await fetch('/api/status');\n * return response.json();\n * },\n * onResult: (data) => console.log(data),\n * shouldStop: (data) => data.completed === true\n * });\n * ```\n */\n constructor(options: PollerOptions<T>) {\n // 填充默认配置\n this.options = {\n task: options.task,\n onResult: options.onResult,\n shouldStop: options.shouldStop,\n initialInterval: options.initialInterval ?? 1000,\n maxInterval: options.maxInterval ?? 30000,\n backoffFactor: options.backoffFactor ?? 1.5,\n onError: options.onError ?? (() => {}),\n };\n\n this.currentInterval = this.options.initialInterval;\n }\n\n /**\n * 启动或恢复轮询\n * \n * @description\n * 如果轮询器已经在运行,此方法不会有任何效果。\n * 首次调用会立即执行一次任务。\n * \n * @returns Promise,在首次任务执行完成后 resolve\n * \n * @example\n * ```typescript\n * await poller.start();\n * console.log('Polling started');\n * ```\n */\n public async start(): Promise<void> {\n if (this.isRunning) {\n return;\n }\n\n this.isRunning = true;\n await this.execute();\n }\n\n /**\n * 停止轮询\n * \n * @description\n * 停止后可以通过再次调用 start() 恢复轮询。\n * 如果有正在执行的任务,会等待其完成。\n * \n * @example\n * ```typescript\n * poller.stop();\n * console.log('Polling stopped');\n * ```\n */\n public stop(): void {\n this.isRunning = false;\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n\n /**\n * 执行轮询任务\n * \n * @private\n */\n private async execute(): Promise<void> {\n if (!this.isRunning || this.isExecuting) {\n return;\n }\n\n this.isExecuting = true;\n\n try {\n // 执行任务\n const result = await this.options.task();\n\n // 调用结果回调\n this.options.onResult(result);\n\n // 检查是否应该停止\n if (this.options.shouldStop(result)) {\n this.stop();\n return;\n }\n\n // 任务成功,重置退避参数\n this.currentInterval = this.options.initialInterval;\n this.retryCount = 0;\n } catch (error) {\n // 任务失败,应用指数退避\n this.retryCount++;\n this.currentInterval = Math.min(\n this.options.initialInterval * Math.pow(this.options.backoffFactor, this.retryCount),\n this.options.maxInterval\n );\n\n // 调用错误回调\n this.options.onError(error);\n } finally {\n this.isExecuting = false;\n }\n\n // 如果仍在运行,安排下一次执行\n if (this.isRunning) {\n this.timer = setTimeout(() => {\n void this.execute();\n }, this.currentInterval);\n }\n }\n\n /**\n * 获取当前状态快照\n * \n * @description\n * 用于保存轮询器的当前状态,以便后续恢复。\n * 这在组件卸载/重新挂载场景中非常有用。\n * \n * @returns 状态快照对象\n * \n * @example\n * ```typescript\n * const snapshot = poller.getSnapshot();\n * localStorage.setItem('poller-state', JSON.stringify(snapshot));\n * \n * // 恢复时\n * const snapshot = JSON.parse(localStorage.getItem('poller-state'));\n * poller.restoreFromSnapshot(snapshot);\n * ```\n */\n public getSnapshot(): PollerSnapshot {\n return {\n retryCount: this.retryCount,\n currentInterval: this.currentInterval,\n isRunning: this.isRunning,\n };\n }\n\n /**\n * 从状态快照恢复\n * \n * @description\n * 从之前保存的快照中恢复轮询器状态。\n * 注意:此方法不会自动启动轮询,需要手动调用 start()。\n * \n * @param snapshot - 状态快照对象\n * \n * @example\n * ```typescript\n * const snapshot = {\n * retryCount: 3,\n * currentInterval: 3375,\n * isRunning: false\n * };\n * poller.restoreFromSnapshot(snapshot);\n * \n * // 如果需要继续轮询\n * if (snapshot.isRunning) {\n * poller.start();\n * }\n * ```\n */\n public restoreFromSnapshot(snapshot: PollerSnapshot): void {\n this.retryCount = snapshot.retryCount;\n this.currentInterval = snapshot.currentInterval;\n // 注意:不自动恢复 isRunning 状态,由调用方决定是否启动\n }\n\n /**\n * 重置轮询器状态\n * \n * @description\n * 将轮询器重置到初始状态(重试次数归零,间隔重置)。\n * 不会停止正在运行的轮询。\n * \n * @example\n * ```typescript\n * poller.reset();\n * ```\n */\n public reset(): void {\n this.retryCount = 0;\n this.currentInterval = this.options.initialInterval;\n }\n\n /**\n * 获取当前状态信息\n * \n * @returns 包含当前状态的对象\n * \n * @example\n * ```typescript\n * const status = poller.getStatus();\n * console.log(`Running: ${status.isRunning}, Retry: ${status.retryCount}`);\n * ```\n */\n public getStatus(): {\n isRunning: boolean;\n isExecuting: boolean;\n retryCount: number;\n currentInterval: number;\n } {\n return {\n isRunning: this.isRunning,\n isExecuting: this.isExecuting,\n retryCount: this.retryCount,\n currentInterval: this.currentInterval,\n };\n }\n}\n\n"]}
@@ -0,0 +1,46 @@
1
+ // src/core/error.ts
2
+ var PlolinkError = class _PlolinkError extends Error {
3
+ /**
4
+ * 创建一个 PlolinkError 实例
5
+ *
6
+ * @param message - 错误消息
7
+ * @param code - 错误代码
8
+ * @param data - 附加错误数据
9
+ */
10
+ constructor(message, code, data) {
11
+ super(message);
12
+ this.name = "PlolinkError";
13
+ this.code = code;
14
+ this.data = data;
15
+ Object.setPrototypeOf(this, _PlolinkError.prototype);
16
+ if (Error.captureStackTrace) {
17
+ Error.captureStackTrace(this, _PlolinkError);
18
+ }
19
+ }
20
+ /**
21
+ * 将错误转换为 JSON 格式
22
+ *
23
+ * @returns 包含错误信息的对象
24
+ */
25
+ toJSON() {
26
+ return {
27
+ name: this.name,
28
+ message: this.message,
29
+ code: this.code,
30
+ data: this.data,
31
+ stack: this.stack
32
+ };
33
+ }
34
+ /**
35
+ * 将错误转换为字符串
36
+ *
37
+ * @returns 错误的字符串表示
38
+ */
39
+ toString() {
40
+ return `${this.name} [${this.code}]: ${this.message}`;
41
+ }
42
+ };
43
+
44
+ export { PlolinkError };
45
+ //# sourceMappingURL=chunk-MD4O7FWT.js.map
46
+ //# sourceMappingURL=chunk-MD4O7FWT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/error.ts"],"names":[],"mappings":";AAmBO,IAAM,YAAA,GAAN,MAAM,aAAA,SAAqB,KAAA,CAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBtC,WAAA,CAAY,OAAA,EAAiB,IAAA,EAAuB,IAAA,EAAgB;AAClE,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAGZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,aAAA,CAAa,SAAS,CAAA;AAGlD,IAAA,IAAI,MAAM,iBAAA,EAAmB;AAC3B,MAAA,KAAA,CAAM,iBAAA,CAAkB,MAAM,aAAY,CAAA;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,MAAA,GAAkC;AACvC,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAO,IAAA,CAAK;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOgB,QAAA,GAAmB;AACjC,IAAA,OAAO,CAAA,EAAG,KAAK,IAAI,CAAA,EAAA,EAAK,KAAK,IAAI,CAAA,GAAA,EAAM,KAAK,OAAO,CAAA,CAAA;AAAA,EACrD;AACF","file":"chunk-MD4O7FWT.js","sourcesContent":["/**\n * Plolink SDK 统一错误类\n * \n * @description\n * 所有 SDK 内部的业务错误和网络错误都会被转换为 PlolinkError。\n * 调用方可以通过捕获此错误来统一处理异常情况。\n * \n * @example\n * ```typescript\n * try {\n * await client.someMethod();\n * } catch (error) {\n * if (error instanceof PlolinkError) {\n * console.error(`Error ${error.code}: ${error.message}`);\n * console.error('Additional data:', error.data);\n * }\n * }\n * ```\n */\nexport class PlolinkError extends Error {\n /**\n * 错误代码\n * 可以是 HTTP 状态码(数字)或业务错误码(字符串)\n */\n public readonly code: number | string;\n\n /**\n * 附加错误数据\n * 包含后端返回的详细错误信息\n */\n public readonly data?: unknown;\n\n /**\n * 创建一个 PlolinkError 实例\n * \n * @param message - 错误消息\n * @param code - 错误代码\n * @param data - 附加错误数据\n */\n constructor(message: string, code: number | string, data?: unknown) {\n super(message);\n this.name = 'PlolinkError';\n this.code = code;\n this.data = data;\n\n // 确保 instanceof 检查正常工作\n Object.setPrototypeOf(this, PlolinkError.prototype);\n\n // 捕获堆栈跟踪(V8 引擎)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, PlolinkError);\n }\n }\n\n /**\n * 将错误转换为 JSON 格式\n * \n * @returns 包含错误信息的对象\n */\n public toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n data: this.data,\n stack: this.stack,\n };\n }\n\n /**\n * 将错误转换为字符串\n * \n * @returns 错误的字符串表示\n */\n public override toString(): string {\n return `${this.name} [${this.code}]: ${this.message}`;\n }\n}\n\n"]}