@seayoo-web/request 3.4.0 → 3.4.2

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,5 +1,5 @@
1
- import { type SomeRequired } from "@seayoo-web/utils";
2
1
  import type { IRequestGlobalConfig } from "./type";
2
+ import type { SomeRequired } from "@seayoo-web/utils";
3
3
  export declare class RequestGlobalConfig {
4
4
  private config;
5
5
  constructor(config?: IRequestGlobalConfig);
@@ -1,3 +1,3 @@
1
- import { type IResponseResult, type TypeGuardParam } from "./type";
2
1
  import type { RequestGlobalConfig } from "./config";
2
+ import type { IResponseResult, TypeGuardParam } from "./type";
3
3
  export declare function checkTypedDataResult<T>(url: string, result: IResponseResult, config: RequestGlobalConfig, typeGard: TypeGuardParam<T> | null): IResponseResult<T | null | unknown>;
@@ -1,4 +1,4 @@
1
- import { type TypeGuardFn } from "@seayoo-web/utils";
1
+ import type { TypeGuardFn } from "@seayoo-web/utils";
2
2
  /**
3
3
  * 以 script 方式加载远程资源,资源通过回调函数接收,强制进行类型校验
4
4
  */
@@ -1,4 +1,4 @@
1
- import { type TypeGuardParam, type IRequestOptions, type IRequestGlobalConfig, type IResponseResult, type NetRequestAgent, type ResponseWithType, type ResponseWithoutType } from "./type";
1
+ import type { TypeGuardParam, IRequestOptions, IRequestGlobalConfig, IResponseResult, NetRequestAgent, ResponseWithType, ResponseWithoutType } from "./type";
2
2
  type RequestBody = NonNullable<IRequestOptions["body"]>;
3
3
  /** 工具函数主类 */
4
4
  export declare class NetRequestHandler {
@@ -1,4 +1,4 @@
1
- import { type NetRequestAgent } from "./type";
1
+ import type { NetRequestAgent } from "./type";
2
2
  /**
3
3
  * 基于 fetch 的网络请求包装函数,文件上传不支持进度,需要进度请使用 upload 方法
4
4
  *
@@ -1,4 +1,4 @@
1
- import { type NetRequestAgent } from "./type";
1
+ import type { NetRequestAgent } from "./type";
2
2
  /**
3
3
  * 基于 nodejs 的 http/https 包的网络请求包装函数,url 必须是一个完整 url
4
4
  *
@@ -1,4 +1,4 @@
1
- import { type NetRequestAgent } from "./type";
1
+ import type { NetRequestAgent } from "./type";
2
2
  /**
3
3
  * 基于 wx.request 的网络请求包装函数,该方法必定 resolve,限制在微信小程序环境中使用
4
4
  */
@@ -1,4 +1,4 @@
1
- import { type NetRequestAgent, type IRequestGlobalConfig, type IRequestOptions, type IResponseResult, type IRetryRequestOptions, type IBaseRequestOptions } from "./type";
1
+ import type { NetRequestAgent, IRequestGlobalConfig, IRequestOptions, IResponseResult, IRetryRequestOptions, IBaseRequestOptions } from "./type";
2
2
  /** 进度回调函数配置 */
3
3
  interface XHRequestOptions extends IBaseRequestOptions {
4
4
  onUploadProgress?: (progress: {
@@ -2,3 +2,8 @@
2
2
  * 简版 Object.fromEntries 以处理某些低版本浏览器和 webview 的问题
3
3
  */
4
4
  export declare function fromEntries(kv: [string, string | undefined][]): Record<string, string>;
5
+ /**
6
+ * 安全解析 JSON
7
+ * 防止原型污染和原型链攻击
8
+ */
9
+ export declare function safeJSONParse<T = unknown>(text: string): T | null;
@@ -1,606 +0,0 @@
1
- const l = typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : typeof window < "u" ? window : Function("return this")();
2
- function x() {
3
- return l;
4
- }
5
- function p(t) {
6
- return typeof t == "function";
7
- }
8
- function v(t) {
9
- return typeof t == "object" && t !== null;
10
- }
11
- function P() {
12
- return "wx" in l && v(l.wx) && "getSystemInfo" in l.wx && p(l.wx.getSystemInfo);
13
- }
14
- function fe() {
15
- return "fetch" in l && p(l.fetch);
16
- }
17
- function de() {
18
- return "window" in l && v(l.window) && !P();
19
- }
20
- function F() {
21
- return "Blob" in l && p(l.Blob);
22
- }
23
- function C() {
24
- return "FormData" in l && p(l.FormData);
25
- }
26
- function ge() {
27
- return "TextDecoder" in l && p(l.TextDecoder);
28
- }
29
- function me() {
30
- return "AbortController" in l && p(l.AbortController);
31
- }
32
- function D() {
33
- return "URLSearchParams" in l && p(l.URLSearchParams);
34
- }
35
- function S(t) {
36
- return new Promise((e) => setTimeout(e, Math.min(Number.MAX_SAFE_INTEGER, Math.max(0, t))));
37
- }
38
- function q(t) {
39
- const e = t || "CustomError";
40
- return class extends Error {
41
- constructor(n) {
42
- super(n), Object.defineProperty(this, "name", {
43
- value: e,
44
- enumerable: !1,
45
- configurable: !0
46
- }), "setPrototypeOf" in Object && Object.setPrototypeOf(this, new.target.prototype), "captureStackTrace" in Error && typeof Error.captureStackTrace == "function" && Error.captureStackTrace(this, this.constructor);
47
- }
48
- };
49
- }
50
- const B = /^(?:https?:)?\/\/.+$/i, I = /^https?:\/\/.+$/i, H = /^\{[\d\D]*\}$/, N = /^\[[\d\D]*\]$/;
51
- function k(t, e = !1) {
52
- return e ? B.test(t) : I.test(t);
53
- }
54
- function G(t) {
55
- return t == null;
56
- }
57
- function M(t, ...e) {
58
- if (!t || typeof t != "object") return !1;
59
- const n = Object.getPrototypeOf(t);
60
- return n !== Object.prototype && n !== null ? !1 : e.every((s) => s in t);
61
- }
62
- function U(t) {
63
- return H.test(t) || N.test(t);
64
- }
65
- function w(t, e) {
66
- try {
67
- const n = JSON.parse(t);
68
- return e ? e(n) ? n : null : n;
69
- } catch {
70
- return null;
71
- }
72
- }
73
- async function pe(t) {
74
- return await new Promise(function(e) {
75
- const n = document.getElementsByTagName("head")[0], s = document.createElement("script");
76
- s.setAttribute("type", "text/javascript"), s.setAttribute("charset", "utf-8"), s.onload = function() {
77
- n.removeChild(s), e(!0);
78
- }, s.onerror = function() {
79
- n.removeChild(s), e(!1);
80
- }, s.setAttribute("src", t), n.appendChild(s);
81
- });
82
- }
83
- function K(t, e = "数据未能正确识别") {
84
- return typeof t == "function" ? {
85
- guard: t,
86
- message: e
87
- } : {
88
- guard: t.guard,
89
- message: t.message || e
90
- };
91
- }
92
- function _(t, e = "") {
93
- return !e || k(t, !0) ? $(t) : ($(e) + "/" + t).replace(/\/{2,}/g, "/").replace(/:\//, "://");
94
- }
95
- function $(t) {
96
- const e = x();
97
- return k(t, !0) ? t.startsWith("http") ? t : ("location" in e ? location.protocol : "https:") + t : ("location" in e ? location.origin : "http://127.0.0.1") + "/" + t.replace(/^\/+/, "");
98
- }
99
- function V(t, e) {
100
- const n = {};
101
- return (t.match(/([^=&#?]+)=[^&#]*/g) || []).forEach(function(s) {
102
- const r = s.split("="), o = r[0], a = decodeURIComponent(r[1] || "");
103
- n[o] !== void 0 ? n[o] += "," + a : n[o] = a;
104
- }), e !== !0 ? n[e] || "" : n;
105
- }
106
- function W(t, e) {
107
- if (e) {
108
- if (e === !0)
109
- return t.replace(/\?[^#]*/, "");
110
- } else return t;
111
- const n = t.split("#"), s = n[0].split("?"), r = s[0], o = s.length > 1 ? s[1] : "", a = n.length > 1 ? "#" + n[1] : "", c = typeof e == "string" ? [e] : Array.isArray(e) ? e : [];
112
- return !c.length || !o ? n[0] + a : (c.map((u) => u.replace(/([\\(){}[\]^$+\-*?|])/g, "\\$1")), (r + "?" + o.replace(new RegExp("(?:^|&)(?:" + c.join("|") + ")=[^&$]+", "g"), "").replace(/^&/, "")).replace(/\?$/, "") + a);
113
- }
114
- function ye(t, e, n = !1) {
115
- const s = typeof e == "string" ? e : Object.keys(e).map((a) => `${a}=${encodeURIComponent(e[a])}`).join("&");
116
- if (!s)
117
- return t;
118
- const r = t.split("#");
119
- n && (r[0] = W(
120
- r[0],
121
- (s.match(/([^=&#?]+)=[^&#]+/g) || []).map((a) => a.replace(/=.+$/, ""))
122
- ));
123
- const o = r[0].indexOf("?") + 1 ? "&" : "?";
124
- return (r[0] + o + s + (r.length > 1 ? "#" + r[1] : "")).replace(/\?&/, "?");
125
- }
126
- function J(t) {
127
- const e = t.match(/(?:\?|&)([^=]+)(?:&|$)/g);
128
- return e ? e.join("").replace(/(?:\?|^&+|&+$)/g, "").replace(/&{2}/g, "&").split("&").sort() : [];
129
- }
130
- class Q {
131
- ttl;
132
- cache;
133
- timer = null;
134
- // 定时循环以清理缓存
135
- loopCheck() {
136
- if (Object.keys(this.cache).forEach((n) => {
137
- this.cache[n].ttl < Date.now() && delete this.cache[n];
138
- }), Object.keys(this.cache).length === 0) {
139
- this.timer = null;
140
- return;
141
- }
142
- this.timer = setTimeout(this.loopCheck, 5e3);
143
- }
144
- constructor(e = 500) {
145
- this.cache = {}, this.ttl = Math.max(e, 0), this.loopCheck = this.loopCheck.bind(this);
146
- }
147
- getKey(e, n, s, r) {
148
- if (e.toLowerCase() !== "get" && !r)
149
- return "";
150
- const o = e.toLowerCase(), a = n.replace(/#.+/, ""), c = a.replace(/\?.+/g, "");
151
- if (r)
152
- try {
153
- const i = r() || "";
154
- return i ? `${c}_${o}_${i}` : "";
155
- } catch (i) {
156
- return console.warn("[RequestCache] cacheResolve error", n, s, i), "";
157
- }
158
- const u = Object.assign(V(a, !0), s), f = J(a), h = Object.keys(u).sort().map((i) => `${i}#${u[i]}`);
159
- return `${c}_${o}_${h.join(",")}_${f.join(",")}`;
160
- }
161
- updateTTL(e) {
162
- this.ttl = Math.max(e, 0);
163
- }
164
- get(e, n) {
165
- if (Math.max(n ?? this.ttl, 0) === 0)
166
- return null;
167
- const r = this.cache[e];
168
- return r ? r.ttl < Date.now() ? (delete this.cache[e], null) : r.res : null;
169
- }
170
- set(e, n, s) {
171
- const r = Math.max(s ?? this.ttl, 0);
172
- r !== 0 && (this.cache[e] = {
173
- ttl: Date.now() + r,
174
- res: n
175
- }, this.timer === null && (this.timer = setTimeout(this.loopCheck, 5e3)));
176
- }
177
- del(e) {
178
- this.cache[e] && delete this.cache[e];
179
- }
180
- }
181
- class z {
182
- // 保存的配置需要部分字段强制设置默认值
183
- config = {
184
- baseURL: "/",
185
- maxRetry: 0,
186
- retryInterval: 100,
187
- retryResolve: "network",
188
- timeout: 1e4,
189
- cacheTTL: 500,
190
- credentials: "same-origin",
191
- defaultTypeGuardMessage: "响应数据未能正确识别",
192
- responseRule: {
193
- ok: {
194
- resolve: "body"
195
- },
196
- failed: {
197
- resolve: "json",
198
- messageField: "message"
199
- }
200
- }
201
- };
202
- constructor(e) {
203
- e && this.set(e);
204
- }
205
- set(e) {
206
- if (e.baseURL && !/^\/.+/.test(e.baseURL) && !k(e.baseURL))
207
- throw console.warn("baseURL 需要以 / 开头,或者是完整的 url 地址"), new Error("BaseURLError");
208
- Object.assign(this.config, e);
209
- }
210
- get(e) {
211
- return this.config[e];
212
- }
213
- /** 基于 baseURL 返回完整的 url 地址 */
214
- getFullUrl(e) {
215
- return _(e, this.config.baseURL);
216
- }
217
- /** 提示消息 */
218
- showMessage(e, n, s, r) {
219
- this.config.messageHandler && n && this.config.messageHandler(e, n, s, r);
220
- }
221
- }
222
- const A = {
223
- /** 响应数据校验失败 */
224
- UnexpectResponse: "UnexpectResponse",
225
- /** 请求被取消 */
226
- Aborted: "Aborted",
227
- /** 未知错误 */
228
- Unknown: "Unknown",
229
- /** 网络错误 */
230
- NetworkError: "NetworkError",
231
- /** 超时 */
232
- Timeout: "Timeout",
233
- /** 请求方法不被支持,在微信小程序环境下有效 */
234
- NotSupport: "NotSupport",
235
- /** url 格式错误 */
236
- URLFormatError: "URLFormatError"
237
- };
238
- function X(t, e, n, s) {
239
- if (e.ok && !G(e.data) && s) {
240
- const r = K(s, n.get("defaultTypeGuardMessage"));
241
- return r.guard(e.data) || (e.code = A.UnexpectResponse, n.showMessage(!0, `${t} ${r.message}`, e.code, e.status), console.error(e.code, t, e.data), e.data = null, e.message = r.message), e;
242
- }
243
- return e;
244
- }
245
- class be {
246
- agent;
247
- config;
248
- cache;
249
- constructor(e, n) {
250
- this.config = new z(n), this.agent = e, this.cache = new Q(this.config.get("cacheTTL")), this.setConfig = this.setConfig.bind(this), this.getConfig = this.getConfig.bind(this), this.request = this.request.bind(this), this.get = this.get.bind(this), this.post = this.post.bind(this), this.del = this.del.bind(this), this.patch = this.patch.bind(this), this.put = this.put.bind(this), this.head = this.head.bind(this);
251
- }
252
- /**
253
- * 执行网络请求
254
- */
255
- async request(e, n) {
256
- const s = this.cache.getKey(n?.method || "GET", e, n?.params, n?.cacheResolve);
257
- if (s) {
258
- const r = this.cache.get(s, n?.cacheTTL);
259
- if (r)
260
- return await r;
261
- }
262
- try {
263
- const r = this.agent(e, this.config, n);
264
- s && this.cache.set(s, r, n?.cacheTTL);
265
- const o = await r;
266
- return (!o.ok || o.status < 0) && this.cache.del(s), o;
267
- } catch (r) {
268
- return console.error("RequestError", r), {
269
- ok: !1,
270
- status: -9,
271
- code: A.Unknown,
272
- message: r instanceof Error ? `${r.message}
273
- ${r.stack || ""}` : String(r),
274
- headers: {},
275
- data: null
276
- };
277
- }
278
- }
279
- /**
280
- * 检查响应的数据类型
281
- */
282
- async guard(e, n, s) {
283
- return X(e, n, this.config, s);
284
- }
285
- /**
286
- * 修改默认请求配置: baseURL / timeout / credentials / errorHandler / messageHandler / responseHandler / logHandler / responseRule
287
- */
288
- setConfig(e) {
289
- this.config.set(e), this.cache.updateTTL(this.config.get("cacheTTL"));
290
- }
291
- /**
292
- * 读取默认的请求配置
293
- */
294
- getConfig(e) {
295
- return this.config.get(e);
296
- }
297
- /**
298
- * 发送一个 HEAD 请求,并且不处理响应 body
299
- */
300
- async head(e, n) {
301
- const s = Object.assign({}, n || null);
302
- return s.method = "HEAD", this.guard(e, await this.request(e, s), null);
303
- }
304
- async get(e, n, s) {
305
- const r = Object.assign({}, s || null);
306
- r.method = "GET";
307
- const o = this.request(e, r);
308
- return this.guard(e, await o, n || null);
309
- }
310
- async post(e, n, s, r) {
311
- const o = Object.assign({}, r || null);
312
- return o.method = "POST", o.body = n || {}, this.guard(e, await this.request(e, o), s || null);
313
- }
314
- async del(e, n, s) {
315
- const r = Object.assign({}, s || null);
316
- return r.method = "DELETE", this.guard(e, await this.request(e, r), n || null);
317
- }
318
- async put(e, n, s, r) {
319
- const o = Object.assign({}, r || null);
320
- return o.method = "PUT", o.body = n || {}, this.guard(e, await this.request(e, o), s || null);
321
- }
322
- async patch(e, n, s, r) {
323
- const o = Object.assign({}, r || null);
324
- return o.method = "PATCH", o.body = n || {}, this.guard(e, await this.request(e, o), s || null);
325
- }
326
- }
327
- async function we(t, e, n) {
328
- const s = Object.assign({ method: "GET" }, n), r = C() ? s.body instanceof FormData : !1, o = r && s.method !== "POST" && s.method !== "PUT" ? "POST" : s.method, a = o === "GET" || o === "HEAD" || o === "DELETE";
329
- a && s.body !== void 0 && (console.warn("request body is invalid with method get, head, delete"), delete s.body);
330
- const c = Object.assign(
331
- r || a ? {} : {
332
- "Content-Type": F() && s.body instanceof Blob ? s.body.type || "application/octet-stream" : "application/json;charset=utf-8"
333
- },
334
- s.headers
335
- ), u = s.params || {}, f = {};
336
- Object.keys(u).forEach((d) => {
337
- u[d] !== void 0 && (f[d] = Y(u[d]));
338
- });
339
- const h = e.getFullUrl(t), i = Z(s.body), g = s.timeout || e.get("timeout"), m = await async function() {
340
- const d = e.get("requestTransformer");
341
- if (d)
342
- return await d({ headers: c, params: f, method: o, url: h, body: i });
343
- }(), y = typeof m == "string" && m ? m : h;
344
- return e.get("logHandler")?.({ type: "ready", url: y, method: o, headers: c, timeout: g, body: i }), {
345
- url: y,
346
- method: o,
347
- body: i,
348
- params: f,
349
- headers: c,
350
- timeout: g,
351
- abort: s.abort,
352
- credentials: s.credentials || e.get("credentials")
353
- };
354
- }
355
- function Y(t) {
356
- return typeof t == "string" ? t : Array.isArray(t) ? t.join(",") : t + "";
357
- }
358
- function Z(t) {
359
- if (t)
360
- return typeof t == "string" || D() && t instanceof URLSearchParams || t instanceof ArrayBuffer || F() && t instanceof Blob || C() && t instanceof FormData ? t : JSON.stringify(t);
361
- }
362
- const L = "data", b = "message";
363
- function ee(t, e, n, s, r) {
364
- const o = r || s;
365
- return j(t) ? ae(o.ok || s.ok, t, e, n) : te(o.failed || s.failed, e, n);
366
- }
367
- const Re = function(t) {
368
- const e = [], n = t.failed || { resolve: "json" };
369
- switch (e.push("- 当http状态码 <200 或者 >=400 时"), n.resolve) {
370
- case "body":
371
- e.push(" 将响应内容格式化为字符串并作为错误消息");
372
- break;
373
- case "json":
374
- e.push(" 将响应解析为json,并读取 " + (n.messageField || b) + " 作为错误消息");
375
- break;
376
- }
377
- const s = t.ok || { resolve: "body" };
378
- switch (e.push("- 当http状态码 >=200 并且 <400 时"), s.resolve) {
379
- case "body":
380
- e.push(" 将响应尝试解析为 json,并作为数据内容返回");
381
- break;
382
- case "json":
383
- e.push(
384
- " 将响应解析为 json,读取 " + (s.dataField || L) + " 作为响应数据,读取 " + (s.messageField || b) + " 作为提示消息"
385
- ), s.statusField && e.push(
386
- " 当 " + s.statusField + " 为 " + (s.statusOKValue || "空值") + " 时是成功提示,否则是错误消息"
387
- ), s.ignoreMessage && e.push(" 并忽略以下消息:" + s.ignoreMessage);
388
- break;
389
- }
390
- return e.join(`
391
- `);
392
- };
393
- function te(t, e, n) {
394
- const s = t || { resolve: "json", messageField: b }, r = {
395
- ok: !1,
396
- code: e,
397
- message: n,
398
- data: null
399
- };
400
- switch (s.resolve) {
401
- case "body":
402
- r.message = T(n) || n;
403
- break;
404
- case "json":
405
- const { code: o, message: a } = se(n, s.converter, s.statusField, s.messageField);
406
- r.code = o || e, r.message = T(n) || a;
407
- break;
408
- }
409
- return r;
410
- }
411
- function se(t, e, n, s = b) {
412
- if (!U(t))
413
- return { message: "" };
414
- const r = E(w(t), e);
415
- return !r || !M(r) ? { message: t } : {
416
- code: n ? R(r, n) : "",
417
- message: R(r, s) || t
418
- };
419
- }
420
- function R(t, e) {
421
- const n = Array.isArray(e) ? e : [e];
422
- for (const s of n)
423
- if (s in t)
424
- return ne(t[s]);
425
- return "";
426
- }
427
- function ne(t) {
428
- return t ? typeof t == "string" ? t : JSON.stringify(t) : "";
429
- }
430
- const re = /<title>([^<]+)<\/title>/i, oe = /<message>([^<]+)<\/message>/i;
431
- function T(t) {
432
- const e = t.match(re);
433
- if (e)
434
- return e[1];
435
- const n = t.match(oe);
436
- return n ? n[1] : "";
437
- }
438
- function ae(t, e, n, s) {
439
- const r = t || { resolve: "body" }, o = {
440
- ok: !0,
441
- code: n,
442
- message: "",
443
- data: null
444
- };
445
- if (e === 204 || !s)
446
- return o;
447
- if (r.resolve === "body")
448
- return o.data = U(s) ? E(w(s), t.converter) : s, o;
449
- const a = E(w(s), t.converter);
450
- if (!a || !M(a))
451
- return o.ok = !1, o.code = "ResponseFormatError", o.message = "响应内容无法格式化为 Object", o;
452
- const c = r.statusField, u = r.statusOKValue || "", f = r.dataField || L, h = r.messageField || b, i = r.ignoreMessage || "";
453
- if (c && !(c in a))
454
- return o.ok = !1, o.code = "ResponseFieldMissing", o.message = "响应内容找不到状态字段 " + c, o;
455
- const g = c ? a[c] + "" : "";
456
- return o.ok = c ? g === u : !0, o.code = g || n, o.data = f === !0 ? a : f in a ? a[f] : null, o.message = R(a, h), i && o.message && (Array.isArray(i) && i.includes(o.message) || typeof i == "string" && o.message === i) && (o.message = ""), o;
457
- }
458
- function j(t) {
459
- return t >= 200 && t < 400;
460
- }
461
- function E(t, e) {
462
- return e ? typeof e == "function" ? e(t) : (console.warn('工具不再支持 "camelize", "snakify" 参数,请自行提供函数来转化 body 内容'), t) : t;
463
- }
464
- const ce = q("APIError");
465
- function ie(t) {
466
- const e = {};
467
- for (const r in t.headers)
468
- (r.startsWith("x-") || r.includes("trace") || r.includes("server") || /\b(?:id|uuid)\b/.test(r)) && (e[r] = t.headers[r]);
469
- const n = t.url.replace(/^(?:https?:)?\/*/i, "").replace(/\?.+/, ""), s = t.status < 0 ? "unknown" : t.status;
470
- return {
471
- sentryError: new ce(`${n} | ${s}${t.code ? ` | ${t.code}` : ""}`),
472
- sentryTags: {
473
- ...e,
474
- status: s,
475
- method: t.method,
476
- code: t.code || "unknown",
477
- message: t.message || "empty"
478
- },
479
- sentryExtra: {
480
- url: t.url,
481
- responseBody: t.body || "empty",
482
- responseHeaders: t.headers,
483
- rawError: t.error
484
- }
485
- };
486
- }
487
- function ue(t) {
488
- return t.reduce(
489
- (e, [n, s]) => (n && (e[n] = s || ""), e),
490
- {}
491
- );
492
- }
493
- function Ee(t, e, n, s) {
494
- const r = t.status, o = t.method, a = ue(
495
- Object.entries(t.headers || {}).map(([m, y]) => [m.toLowerCase(), y])
496
- ), { ok: c, code: u, data: f, message: h } = ee(
497
- r,
498
- t.statusText,
499
- t.body,
500
- n.get("responseRule"),
501
- s?.responseRule
502
- );
503
- if (!j(r)) {
504
- const m = ie({
505
- url: t.url,
506
- method: t.method,
507
- status: r,
508
- code: u,
509
- message: h,
510
- body: t.body,
511
- headers: a,
512
- error: t.rawError
513
- });
514
- (n.get("errorHandler") || he)({
515
- url: e,
516
- method: o,
517
- status: r,
518
- code: u,
519
- message: h,
520
- headers: a,
521
- rawError: t.rawError,
522
- responseBody: t.body,
523
- ...m
524
- });
525
- }
526
- if (r < 0)
527
- return O(
528
- { ok: !1, status: r, code: t.statusText, headers: {}, message: "", data: null },
529
- `${o} ${e} ${t.statusText}`,
530
- o,
531
- e,
532
- n,
533
- s
534
- );
535
- const i = { ok: c, data: f, code: u, message: h, status: r, headers: a };
536
- n.get("responseHandler")?.({ ...i }, o, e);
537
- const g = c ? h : h || t.statusText;
538
- return O(i, g, o, e, n, s);
539
- }
540
- function O(t, e, n, s, r, o) {
541
- const a = r.get("message"), c = a === !1 || o?.message === !1 ? !1 : o?.message || a;
542
- if (c !== !1) {
543
- const u = typeof c == "function" ? c(t, n, s, e) : e;
544
- u instanceof Error ? r.showMessage(!0, u.message, t.code, t.status) : u && typeof u == "object" && "message" in u ? r.showMessage(!1, u.message, t.code, t.status) : r.showMessage(!t.ok, u, t.code, t.status);
545
- }
546
- return t;
547
- }
548
- function he(t) {
549
- const e = {};
550
- for (const n in t)
551
- n.startsWith("sentry") || (e[n] = t[n]);
552
- console.error("RequestError", e);
553
- }
554
- async function le(t, e, n, s, r) {
555
- const o = r || 0, a = Math.max(0, Math.min(10, s?.maxRetry ?? n.get("maxRetry") ?? 0)), c = s?.retryResolve ?? n.get("retryResolve"), u = n.get("logHandler");
556
- u?.({
557
- type: "prepare",
558
- url: e,
559
- method: s?.method || "GET",
560
- retry: o,
561
- maxRetry: a,
562
- message: o === 0 ? "start" : `retry ${o}/${a} start`,
563
- headers: s?.headers,
564
- options: s
565
- });
566
- const f = Date.now(), h = await t(e, n, s), i = h.status, g = Date.now() - f, m = `[cost ${g}][${i}] ${i < 0 ? h.body : ""}`;
567
- u?.({
568
- type: "finished",
569
- url: e,
570
- method: h.method,
571
- retry: o,
572
- maxRetry: a,
573
- message: o === 0 ? `finish ${m}` : `retry ${o}/${a} finish ${m}`,
574
- response: h,
575
- headers: h.headers,
576
- cost: g
577
- });
578
- const y = j(i);
579
- if (!a || o >= a || c === "network" && i > 0 || c === "status" && y || Array.isArray(c) && !c.includes(i) || typeof c == "function" && c(h, o) !== !0)
580
- return h;
581
- const d = s?.retryInterval ?? n.get("retryInterval") ?? 100;
582
- return await S(
583
- Math.max(
584
- 100,
585
- d === "2EB" ? Math.pow(2, o) * 100 : typeof d == "function" ? d(o + 1, { url: e, status: i, method: h.method }) || 0 : d
586
- )
587
- ), await le(t, e, n, s, o + 1);
588
- }
589
- export {
590
- be as N,
591
- pe as P,
592
- fe as Q,
593
- z as R,
594
- de as V,
595
- ye as W,
596
- A as a,
597
- P as b,
598
- we as c,
599
- k as e,
600
- ue as f,
601
- Re as g,
602
- Ee as h,
603
- ge as n,
604
- me as o,
605
- le as r
606
- };