iboot-http-client 1.0.8 → 1.1.0

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,7 +1,8 @@
1
1
  import N from "pino";
2
- import A from "js-md5";
3
- import p from "crypto-js";
4
- const $ = {
2
+ import A from "koffi";
3
+ import U from "js-md5";
4
+ import m from "crypto-js";
5
+ const F = {
5
6
  GENERAL: 0,
6
7
  PHONE: 1,
7
8
  EMAIL: 2
@@ -9,7 +10,7 @@ const $ = {
9
10
  TYPE_MGT: 0,
10
11
  TYPE_C: 1,
11
12
  TYPE_B: 2
12
- }, W = {
13
+ }, j = {
13
14
  FROM_WEB: 1,
14
15
  FROM_PC: 2,
15
16
  FROM_WX_MINI_PRO: 3,
@@ -17,17 +18,22 @@ const $ = {
17
18
  FROM_WX_E: 5,
18
19
  FROM_APP: 6,
19
20
  FROM_DEVICE: 7
20
- }, j = {
21
+ }, H = {
21
22
  unknown: 0,
22
23
  male: 1,
23
24
  female: 2
24
- }, h = N({
25
+ };
26
+ if (typeof window > "u" && process.platform === "win32")
27
+ try {
28
+ const t = A.load("Kernel32"), e = t.func("SetConsoleOutputCP", "bool", ["int"]), s = t.func("SetConsoleCP", "bool", ["int"]);
29
+ e(65001), s(65001);
30
+ } catch (n) {
31
+ console.log(n);
32
+ }
33
+ const h = N({
25
34
  name: process.env.APP_NAME ?? "iBoot",
26
- level: process.env.NODE_ENV != "production" ? "debug" : "info",
35
+ level: process.env.NODE_ENV !== "production" ? "debug" : "info",
27
36
  nestedKey: "payload",
28
- formatters: {
29
- level: (n) => ({ level: n })
30
- },
31
37
  transport: {
32
38
  target: "pino-pretty",
33
39
  options: {
@@ -35,7 +41,7 @@ const $ = {
35
41
  translateTime: "SYS:yyyy-mm-dd HH:MM:ss",
36
42
  ignore: "pid,hostname",
37
43
  messageFormat: "{msg}",
38
- singleLine: !1
44
+ singleLine: !0
39
45
  }
40
46
  }
41
47
  }), _ = (n) => Array.isArray(n) || typeof n == "object" && Object.prototype.toString.call(n) === "[object Array]", w = (n) => {
@@ -44,13 +50,13 @@ const $ = {
44
50
  for (let o = 0; o < t; o++)
45
51
  r += e.charAt(Math.floor(Math.random() * s));
46
52
  return r;
47
- }, U = (n, t) => {
53
+ }, k = (n, t) => {
48
54
  const e = {};
49
55
  return n.split("&").forEach((r) => {
50
56
  const o = r.split("=");
51
57
  o[1] && (!t || t.indexOf(o[0]) == -1) && (e[o[0]] = o[1]);
52
58
  }), e;
53
- }, b = (n) => !n || n == "" || n.length == 0 ? "" : encodeURIComponent(n).replace(/\(/g, "%28").replace(/\)/g, "%29").replace(/\'/g, "%27").replace(/\!/g, "%21").replace(/\~/g, "%7E"), k = "zh-CN", S = "_device_id_key", v = "_current_website_key", O = "Get request error!", I = "Post request error!", T = {
59
+ }, b = (n) => !n || n == "" || n.length == 0 ? "" : encodeURIComponent(n).replace(/\(/g, "%28").replace(/\)/g, "%29").replace(/\'/g, "%27").replace(/\!/g, "%21").replace(/\~/g, "%7E"), L = "zh-CN", S = "_device_id_key", P = "_current_website_key", O = "Get request error!", I = "Post request error!", T = {
54
60
  "Device-Id": "Device-Id",
55
61
  Lang: "Lang",
56
62
  "Website-Id": "Website-Id",
@@ -62,27 +68,26 @@ const $ = {
62
68
  IBOOT_WEBSITE_NO: "IBOOT_WEBSITE_NO",
63
69
  token: "token",
64
70
  user: "user"
65
- }, P = () => {
66
- const n = localStorage.getItem(S) ?? "", t = localStorage.getItem(v), e = t != null ? JSON.parse(t) : null, s = {};
71
+ }, C = () => {
72
+ const n = localStorage.getItem(S) ?? "", t = localStorage.getItem(P), e = t != null ? JSON.parse(t) : null, s = {};
67
73
  return n.length > 0 && (s["Device-Id"] = n), e && (s.Lang = e.language, e.websiteId && (s["Website-Id"] = e.websiteId), e.websiteNo && (s["Website-No"] = e.websiteNo)), s;
68
74
  }, x = (n, t) => {
69
- localStorage.setItem(S, n), t && localStorage.setItem(v, JSON.stringify(t));
75
+ localStorage.setItem(S, n), t && localStorage.setItem(P, JSON.stringify(t));
70
76
  }, D = async (n, t) => {
71
77
  if (t?.data) {
72
78
  const i = new URLSearchParams(t.data);
73
79
  n.indexOf("?") != -1 ? n += `&${i}` : n += `?${i}`;
74
80
  }
75
- const e = P(), s = t?.headers;
81
+ const e = C(), s = t?.headers;
76
82
  if (s)
77
83
  for (const i in s) {
78
84
  const l = s[i];
79
85
  l && (e[i] = l);
80
86
  }
81
87
  h.debug({
82
- method: "GET",
83
88
  url: n,
84
89
  headers: e
85
- });
90
+ }, "GET");
86
91
  const r = await fetch(n, {
87
92
  method: "GET",
88
93
  headers: e,
@@ -90,9 +95,7 @@ const $ = {
90
95
  });
91
96
  if (r.ok) {
92
97
  const i = await r.json();
93
- return h.debug({
94
- GET_RESULT: i
95
- }), i;
98
+ return h.debug(i, "GET_RESULT"), i;
96
99
  }
97
100
  const o = {
98
101
  code: r.status,
@@ -100,20 +103,19 @@ const $ = {
100
103
  msg: r.statusText
101
104
  };
102
105
  return h.error(o), o;
103
- }, C = async (n, t) => {
106
+ }, v = async (n, t) => {
104
107
  const e = t?.data ?? {}, s = t?.headers;
105
108
  let r;
106
- const o = new Headers(P());
109
+ const o = new Headers(C());
107
110
  if (e instanceof FormData ? r = e : (r = JSON.stringify(e), o.set("Content-Type", "application/json")), s)
108
111
  for (let a in s) {
109
112
  const c = s[a];
110
113
  c && o.set(a, c);
111
114
  }
112
115
  h.debug({
113
- method: "GET",
114
116
  url: n,
115
117
  headers: o
116
- });
118
+ }, "POST");
117
119
  const i = await fetch(n, {
118
120
  method: "POST",
119
121
  headers: o,
@@ -121,9 +123,7 @@ const $ = {
121
123
  });
122
124
  if (i.ok) {
123
125
  const a = await i.json();
124
- return h.debug({
125
- POST_RESULT: a
126
- }), a;
126
+ return h.debug(a, "POST_RESULT"), a;
127
127
  }
128
128
  const l = {
129
129
  code: i.status,
@@ -131,7 +131,7 @@ const $ = {
131
131
  msg: i.statusText
132
132
  };
133
133
  return h.error(l), l;
134
- }, F = async (n, t) => {
134
+ }, K = async (n, t) => {
135
135
  const e = await D(n, t);
136
136
  if (e.success)
137
137
  return e.data;
@@ -140,8 +140,8 @@ const $ = {
140
140
  return;
141
141
  }
142
142
  throw Error(e.msg ?? O);
143
- }, H = async (n, t) => {
144
- const e = await C(n, t);
143
+ }, G = async (n, t) => {
144
+ const e = await v(n, t);
145
145
  if (e.success)
146
146
  return e.data;
147
147
  if (t?.showError) {
@@ -149,17 +149,17 @@ const $ = {
149
149
  return;
150
150
  }
151
151
  throw Error(e.msg ?? I);
152
- }, K = async (n, t) => {
153
- const e = await C(n, t);
152
+ }, J = async (n, t) => {
153
+ const e = await v(n, t);
154
154
  return e.success ? (t?.showSuccess && t.showSuccess(e.msg ?? "SUCCESS"), !0) : (t?.showError && t.showError(e.msg ?? I), !1);
155
- }, G = (n) => {
155
+ }, Y = (n) => {
156
156
  const t = n.headers.get(T["Device-Id"]), e = n.headers.get(T.Lang), s = n.headers.get(T["Website-Id"]), r = n.headers.get(T["Website-No"]), o = {};
157
157
  return t && t.length > 0 && (o.deviceId = t), e && e.length > 0 && (o.lang = e), s && s.length > 0 && (o.websiteId = s), r && r.length > 0 && (o.websiteNo = r), o;
158
- }, J = (n) => {
158
+ }, V = (n) => {
159
159
  const t = {}, e = n.get(f.IBOOT_DEVICE_ID)?.value, s = n.get(f.IBOOT_LOCALE)?.value, r = n.get(f.IBOOT_WEBSITE_ID)?.value, o = n.get(f.IBOOT_WEBSITE_NO)?.value;
160
160
  return e && e.length > 0 && (t.deviceId = e), s && s.length > 0 && (t.lang = s), r && r.length > 0 && (t.websiteId = r), o && o.length > 0 && (t.websiteNo = o), t;
161
161
  };
162
- class Y {
162
+ class X {
163
163
  baseUrl;
164
164
  helloMethod;
165
165
  apiKey;
@@ -172,20 +172,20 @@ class Y {
172
172
  websiteNo;
173
173
  _isDebug;
174
174
  constructor({ deviceId: t, lang: e, websiteId: s, websiteNo: r, userType: o, helloURL: i }) {
175
- this.baseUrl = process.env.BASE_URL ?? "", this.helloMethod = i ?? "", this.apiKey = process.env.API_KEY ?? "", this.userType = o ?? R.TYPE_MGT, this.userFrom = process.env.USER_FROM || "1", this.deviceId = t ?? w(10), this.lang = e ?? k, this.websiteId = s, this.websiteNo = r, this._isDebug = process.env.NODE_ENV != "production";
175
+ this.baseUrl = process.env.BASE_URL ?? "", this.helloMethod = i ?? "", this.apiKey = process.env.API_KEY ?? "", this.userType = o ?? R.TYPE_MGT, this.userFrom = process.env.USER_FROM || "1", this.deviceId = t ?? w(10), this.lang = e ?? L, this.websiteId = s, this.websiteNo = r, this._isDebug = process.env.NODE_ENV != "production";
176
176
  }
177
177
  isDebug() {
178
178
  return this._isDebug;
179
179
  }
180
180
  encrypt(t) {
181
- const e = p.enc.Utf8.parse(this.apiKey);
182
- return p.AES.encrypt(t, e).toString();
181
+ const e = m.enc.Utf8.parse(this.apiKey);
182
+ return m.AES.encrypt(t, e).toString();
183
183
  }
184
184
  decrypt(t) {
185
- const e = p.enc.Utf8.parse(this.apiKey);
186
- return p.AES.decrypt(t, e, {
187
- mode: p.mode.ECB
188
- }).toString(p.enc.Utf8);
185
+ const e = m.enc.Utf8.parse(this.apiKey);
186
+ return m.AES.decrypt(t, e, {
187
+ mode: m.mode.ECB
188
+ }).toString(m.enc.Utf8);
189
189
  }
190
190
  getDeviceId() {
191
191
  return this.deviceId;
@@ -212,8 +212,8 @@ class Y {
212
212
  for (const g in c) {
213
213
  const d = c[g];
214
214
  if (d && d.toString().length > 0) {
215
- const m = `[${o.toString()}].${l + `[${u.toString()}].${g}`}=${b(d)}`;
216
- e.push(s + m);
215
+ const p = `[${o.toString()}].${l + `[${u.toString()}].${g}`}=${b(d)}`;
216
+ e.push(s + p);
217
217
  }
218
218
  }
219
219
  });
@@ -248,12 +248,11 @@ class Y {
248
248
  let c = t[a];
249
249
  typeof c == "object" && (c = JSON.stringify(c)), r.push(a + "=" + c);
250
250
  });
251
- const o = r.join("&"), i = A.md5((o + e).toLocaleUpperCase()), l = {
252
- name: "sort",
251
+ const o = r.join("&"), i = U.md5((o + e).toLocaleUpperCase()), l = {
253
252
  params: o,
254
253
  md5: i
255
254
  };
256
- return h.debug(l), i;
255
+ return h.debug(l, "API_SIGN"), i;
257
256
  }
258
257
  //eslint-disable-next-line @typescript-eslint/no-explicit-any
259
258
  assemblyParameter(t, e) {
@@ -270,7 +269,7 @@ class Y {
270
269
  "Api-Key": this.apiKey
271
270
  };
272
271
  this.lang && this.lang.length > 0 && (s.Lang = this.lang), this.websiteId && this.websiteId.length > 0 && (s["Web-Id"] = this.websiteId), this.websiteNo && this.websiteNo.length > 0 && (s["Web-No"] = this.websiteNo), e && (e.token && e.token.length > 0 && e.username && e.username.length > 0 && (s.Authorization = e.token, s.Username = e.username), e.xcsrf && (s[e.xcsrf.csrfHeader] = e.xcsrf.csrfToken));
273
- const r = U(t), o = await this.sign(r);
272
+ const r = k(t), o = await this.sign(r);
274
273
  return s.Sign = o, s;
275
274
  }
276
275
  async helloIboot() {
@@ -284,7 +283,7 @@ class Y {
284
283
  url: t,
285
284
  headers: e
286
285
  };
287
- h.debug(s);
286
+ h.debug(s, "HELLO");
288
287
  const r = await fetch(t, {
289
288
  method: "GET",
290
289
  headers: e,
@@ -293,7 +292,7 @@ class Y {
293
292
  });
294
293
  if (r.ok) {
295
294
  const o = await r.json();
296
- return h.debug({ result: o.data }), o.data;
295
+ return h.debug(o.data, "HELLO RESULT"), o.data;
297
296
  }
298
297
  throw new Error("hello iBoot error!");
299
298
  }
@@ -313,11 +312,10 @@ class Y {
313
312
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
314
313
  async get({ url: t, data: e, token: s, cache: r = "default" }) {
315
314
  const o = this.assemblyParameter(e), i = this.convertUrlParameter(o), l = await this.assemblyHeader({ urlParams: i, token: s }), a = `${this.getApiUrl(t)}?${i.toString()}`, c = {
316
- method: "GET",
317
315
  url: a,
318
316
  headers: l
319
317
  };
320
- h.info(c);
318
+ h.info(c, "GET");
321
319
  const u = await fetch(a, {
322
320
  method: "GET",
323
321
  headers: l,
@@ -326,7 +324,7 @@ class Y {
326
324
  });
327
325
  if (u.ok) {
328
326
  const d = await u.json();
329
- return h.debug({ GET_RESULT: d }), d;
327
+ return h.debug(d, "GET_RESULT"), d;
330
328
  }
331
329
  const g = {
332
330
  code: u.status,
@@ -343,27 +341,26 @@ class Y {
343
341
  const l = this.assemblyParameter(e), a = this.convertUrlParameter(l), c = await this.assemblyHeader({ urlParams: a, token: s });
344
342
  o && i && (c["Content-Type"] = `multipart/form-data; boundary=${i}`);
345
343
  const u = this.getApiUrl(t), g = {
346
- method: "POST",
347
344
  url: u,
348
345
  headers: c,
349
346
  params: l
350
347
  };
351
- h.info(g);
352
- const d = o ? `${u}?${a}` : u, m = await fetch(d, {
348
+ h.info(g, "POST");
349
+ const d = o ? `${u}?${a}` : u, p = await fetch(d, {
353
350
  method: "POST",
354
351
  headers: c,
355
352
  body: o || a.toString(),
356
353
  credentials: "include",
357
354
  cache: r
358
355
  });
359
- if (m.ok) {
360
- const E = await m.json();
361
- return h.debug({ POST_RESULT: E }), E;
356
+ if (p.ok) {
357
+ const E = await p.json();
358
+ return h.debug(E, "POST_RESULT"), E;
362
359
  }
363
360
  const y = {
364
- code: m.status,
361
+ code: p.status,
365
362
  success: !1,
366
- msg: m.statusText
363
+ msg: p.statusText
367
364
  };
368
365
  return h.error(y), y;
369
366
  }
@@ -377,12 +374,11 @@ class Y {
377
374
  const c = this.getApiUrl(t);
378
375
  try {
379
376
  const u = r ? `${c}?${l}` : c, g = {
380
- method: "STREAM",
381
377
  url: c,
382
378
  headers: a,
383
379
  params: i
384
380
  };
385
- h.info(g);
381
+ h.info(g, "STREAM");
386
382
  const d = await fetch(u, {
387
383
  method: "POST",
388
384
  headers: a,
@@ -436,7 +432,7 @@ class Y {
436
432
  };
437
433
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
438
434
  setToken(t, e) {
439
- const { id: s, name: r, username: o, nickname: i, sex: l, headImg: a, token: c, lastLoginTime: u, tokenExpired: g, deviceId: d, userType: m, mustChangePwd: y } = t, E = {
435
+ const { id: s, name: r, username: o, nickname: i, sex: l, headImg: a, token: c, lastLoginTime: u, tokenExpired: g, deviceId: d, userType: p, mustChangePwd: y } = t, E = {
440
436
  id: s,
441
437
  name: r,
442
438
  username: o,
@@ -446,7 +442,7 @@ class Y {
446
442
  lastLoginTime: u,
447
443
  tokenExpired: g,
448
444
  deviceId: d,
449
- userType: m,
445
+ userType: p,
450
446
  status: 0,
451
447
  accountType: 0,
452
448
  enabled: !1,
@@ -481,26 +477,26 @@ class Y {
481
477
  }
482
478
  }
483
479
  export {
484
- $ as ACCOUNT_TYPE_MAP,
485
- v as CURRENT_WEBSITE_KEY,
486
- k as DEFAULT_LOCALE,
480
+ F as ACCOUNT_TYPE_MAP,
481
+ P as CURRENT_WEBSITE_KEY,
482
+ L as DEFAULT_LOCALE,
487
483
  S as DEVICE_ID_KEY,
488
- Y as HttpClient,
489
- W as USER_FORM_MAP,
490
- j as USER_SEX_MAP,
484
+ X as HttpClient,
485
+ j as USER_FORM_MAP,
486
+ H as USER_SEX_MAP,
491
487
  R as USER_TYPE_MAP,
492
488
  D as get,
493
- G as getHttpClientOpts,
494
- J as getHttpClientOptsByCookie,
495
- F as iGet,
496
- H as iPost,
497
- K as iPostSuccess,
489
+ Y as getHttpClientOpts,
490
+ V as getHttpClientOptsByCookie,
491
+ K as iGet,
492
+ G as iPost,
493
+ J as iPostSuccess,
498
494
  _ as isArray,
499
495
  h as logger,
500
- C as post,
496
+ v as post,
501
497
  w as randomString,
502
498
  x as setDefaultRequestHeader,
503
499
  b as urlEncode,
504
- U as urlParamToJson
500
+ k as urlParamToJson
505
501
  };
506
502
  //# sourceMappingURL=iboot-http-client.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"iboot-http-client.es.js","sources":["../src/types/user.ts","../src/logger.ts","../src/utils.ts","../src/http-client.ts"],"sourcesContent":["export const ACCOUNT_TYPE_MAP = {\r\n GENERAL : 0,\r\n PHONE : 1,\r\n EMAIL : 2\r\n}\r\n\r\nexport const USER_TYPE_MAP = {\r\n TYPE_MGT : 0,\r\n TYPE_C : 1,\r\n TYPE_B : 2\r\n}\r\n\r\nexport const USER_FORM_MAP = {\r\n FROM_WEB : 1,\r\n FROM_PC : 2,\r\n FROM_WX_MINI_PRO : 3,\r\n FROM_WX_PLU : 4,\r\n FROM_WX_E : 5,\r\n FROM_APP : 6,\r\n FROM_DEVICE : 7\r\n}\r\n\r\nexport const USER_SEX_MAP = {\r\n unknown:0,\r\n male:1,\r\n female:2,\r\n}\r\n\r\nexport type ACCOUNT_TYPE = typeof ACCOUNT_TYPE_MAP[keyof typeof ACCOUNT_TYPE_MAP];\r\nexport type USER_TYPE = typeof USER_TYPE_MAP[keyof typeof USER_TYPE_MAP];\r\nexport type USER_FORM = typeof USER_FORM_MAP[keyof typeof USER_FORM_MAP];\r\nexport type USER_SEX = typeof USER_SEX_MAP[keyof typeof USER_SEX_MAP];\r\n\r\n// User interface\r\nexport interface User {\r\n id: string;\r\n name: string;\r\n username: string;\r\n nickname: string;\r\n sex: USER_SEX;\r\n headImg: string;\r\n lastLoginTime: string;\r\n tokenExpired: string;\r\n deviceId: string;\r\n userType: USER_TYPE;\r\n status: number;\r\n accountType: number;\r\n enabled: boolean;\r\n userFrom: USER_FORM;\r\n needToReview: boolean;\r\n socketOnline: boolean;\r\n createTime: string;\r\n mustChangePwd: boolean;\r\n}","import pino from \"pino\";\r\n\r\nexport const logger = pino({\r\n name: process.env.APP_NAME ?? 'iBoot',\r\n level: process.env.NODE_ENV != 'production' ? 'debug' : 'info',\r\n nestedKey: 'payload',\r\n formatters: {\r\n level: (label) => {\r\n return { level: label };\r\n }\r\n },\r\n transport: {\r\n target: 'pino-pretty',\r\n options: {\r\n colorize: true,\r\n translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n ignore: 'pid,hostname',\r\n messageFormat: '{msg}',\r\n singleLine: false\r\n }\r\n }\r\n});\r\n","export const isArray = (obj: unknown) => {\r\n return (\r\n Array.isArray(obj) ||\r\n (typeof obj === \"object\" &&\r\n Object.prototype.toString.call(obj) === \"[object Array]\")\r\n );\r\n};\r\n\r\n/**\r\n * 生成指定长度的随机串\r\n * @param {Object} len\r\n */\r\nexport const randomString = (len: number) => {\r\n const l = len || 32;\r\n const $chars = \"ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678\";\r\n const maxPos = $chars.length;\r\n let pwd = \"\";\r\n for (let i = 0; i < l; i++) {\r\n pwd += $chars.charAt(Math.floor(Math.random() * maxPos));\r\n }\r\n return pwd;\r\n};\r\n\r\nexport const urlParamToJson = (urlQueryParams: string, exclude?: string[]): Record<string, string> => {\r\n const result: Record<string, string> = {};\r\n const strs = urlQueryParams.split(\"&\");\r\n strs.forEach((item) => {\r\n const arr = item.split(\"=\");\r\n if (arr[1]) {\r\n if (!exclude || exclude.indexOf(arr[0]) == -1) {\r\n result[arr[0]] = arr[1];\r\n }\r\n }\r\n });\r\n return result;\r\n};\r\n\r\nexport const urlEncode = (value: string | null | undefined): string => {\r\n if (!value || value == \"\" || value.length == 0) {\r\n return \"\";\r\n }\r\n return (\r\n encodeURIComponent(value)\r\n // .replace(/%20/g, '+')\r\n // .replace(/%2B/g, '\\\\+')\r\n .replace(/\\(/g, \"%28\")\r\n .replace(/\\)/g, \"%29\")\r\n .replace(/\\'/g, \"%27\")\r\n .replace(/\\!/g, \"%21\")\r\n .replace(/\\~/g, \"%7E\")\r\n );\r\n};\r\n","import md5 from \"js-md5\";\r\nimport CryptoJS from 'crypto-js';\r\nimport { isArray, randomString, urlEncode, urlParamToJson } from \"./utils\";\r\nimport {\r\n ClientGetParams,\r\n ClientPostParams,\r\n CookieNames,\r\n CSRFToken,\r\n CurWebsite,\r\n HttpClientOpts,\r\n HttpHeaderNames,\r\n HttpHeaders,\r\n HttpToken,\r\n IbootCookieStore,\r\n IbootReadonlyCookies,\r\n IbootWritableCookie,\r\n ResultModel,\r\n ServerRequestOptions\r\n} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\r\nimport { logger } from \"./logger\";\r\n\r\nexport const DEFAULT_LOCALE = 'zh-CN';\r\nexport const DEVICE_ID_KEY = \"_device_id_key\";\r\nexport const CURRENT_WEBSITE_KEY = \"_current_website_key\"\r\n\r\nconst _GET_ERROR = \"Get request error!\"\r\nconst _POST_ERROR = \"Post request error!\";\r\n\r\nconst HEADER_NAMES: Record<HttpHeaderNames, HttpHeaderNames> = {\r\n \"Device-Id\": \"Device-Id\",\r\n \"Lang\": \"Lang\",\r\n \"Website-Id\": \"Website-Id\",\r\n \"Website-No\": \"Website-No\",\r\n}\r\n\r\nconst COOKIE_NAMES: Record<CookieNames, CookieNames> = {\r\n \"IBOOT_DEVICE_ID\": \"IBOOT_DEVICE_ID\",\r\n \"IBOOT_LOCALE\": \"IBOOT_LOCALE\",\r\n \"IBOOT_WEBSITE_ID\": \"IBOOT_WEBSITE_ID\",\r\n \"IBOOT_WEBSITE_NO\": \"IBOOT_WEBSITE_NO\",\r\n \"token\": \"token\",\r\n \"user\": \"user\"\r\n}\r\n\r\nconst getDefaultRequestHeader = (): HttpHeaders => {\r\n const devideId = localStorage.getItem(DEVICE_ID_KEY) ?? ''\r\n const json = localStorage.getItem(CURRENT_WEBSITE_KEY);\r\n const curWebsite: CurWebsite | null = json != null ? JSON.parse(json) : null;\r\n const header: HttpHeaders = {}\r\n if (devideId.length > 0) {\r\n header['Device-Id'] = devideId\r\n }\r\n if (curWebsite) {\r\n header['Lang'] = curWebsite.language;\r\n if (curWebsite.websiteId) {\r\n header['Website-Id'] = curWebsite.websiteId;\r\n }\r\n if (curWebsite.websiteNo) {\r\n header['Website-No'] = curWebsite.websiteNo\r\n }\r\n }\r\n return header;\r\n};\r\n\r\n\r\nexport const setDefaultRequestHeader = (deviceId: string, website?: CurWebsite): void => {\r\n localStorage.setItem(DEVICE_ID_KEY, deviceId);\r\n if (website) {\r\n localStorage.setItem(CURRENT_WEBSITE_KEY, JSON.stringify(website));\r\n }\r\n}\r\n\r\nexport const get = async <T>(url: string, opts?: ClientGetParams): Promise<ResultModel<T>> => {\r\n if (opts?.data) {\r\n const params = new URLSearchParams(opts.data);\r\n if (url.indexOf(\"?\") != -1) {\r\n url += `&${params}`\r\n } else {\r\n url += `?${params}`\r\n }\r\n }\r\n const headers: Record<string, string> = getDefaultRequestHeader();\r\n const heads = opts?.headers;\r\n if (heads) {\r\n for (const field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n headers[field] = value;\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"method\": \"GET\",\r\n \"url\": url,\r\n \"headers\": headers,\r\n })\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n cache: opts?.useCache ? 'force-cache' : 'default'\r\n });\r\n\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug({\r\n \"GET_RESULT\": result,\r\n })\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const post = async <T>(url: string, opts?: ClientPostParams): Promise<ResultModel<T>> => {\r\n const data = opts?.data ?? {};\r\n const heads = opts?.headers;\r\n let body: string | FormData;\r\n const proxyHeaders = new Headers(getDefaultRequestHeader());\r\n if (!(data instanceof FormData)) {\r\n body = JSON.stringify(data);\r\n proxyHeaders.set('Content-Type', 'application/json');\r\n } else {\r\n body = data;\r\n }\r\n if (heads) {\r\n for (let field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n proxyHeaders.set(field, value);\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"method\": \"GET\",\r\n \"url\": url,\r\n \"headers\": proxyHeaders,\r\n })\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: proxyHeaders,\r\n body: body,\r\n });\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug({\r\n \"POST_RESULT\": result,\r\n })\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText,\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const iGet = async <T>(url: string, opts?: ClientGetParams): Promise<T | undefined> => {\r\n const res = await get<T>(url, opts);\r\n if (res.success) {\r\n return res.data as T;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _GET_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _GET_ERROR)\r\n}\r\n\r\nexport const iPost = async <T>(url: string, opts?: ClientPostParams): Promise<T | undefined> => {\r\n const res = await post<T>(url, opts);\r\n if (res.success) {\r\n return res.data;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _POST_ERROR)\r\n}\r\n\r\nexport const iPostSuccess = async (url: string, opts?: ClientPostParams): Promise<boolean> => {\r\n const res = await post(url, opts);\r\n if (res.success) {\r\n if (opts?.showSuccess) {\r\n opts.showSuccess(res.msg ?? 'SUCCESS')\r\n }\r\n return true;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n }\r\n return false;\r\n}\r\n\r\n\r\nexport const getHttpClientOpts = (request: Request): HttpClientOpts => {\r\n const deviceId = request.headers.get(HEADER_NAMES[\"Device-Id\"]);\r\n const lang = request.headers.get(HEADER_NAMES.Lang);\r\n const websiteId = request.headers.get(HEADER_NAMES[\"Website-Id\"]);\r\n const websiteNo = request.headers.get(HEADER_NAMES[\"Website-No\"]);\r\n const result: HttpClientOpts = {}\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport const getHttpClientOptsByCookie = (cookie: IbootReadonlyCookies): HttpClientOpts => {\r\n const result: HttpClientOpts = {}\r\n const deviceId = cookie.get(COOKIE_NAMES.IBOOT_DEVICE_ID)?.value;\r\n const lang = cookie.get(COOKIE_NAMES.IBOOT_LOCALE)?.value;\r\n const websiteId = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_ID)?.value;\r\n const websiteNo = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_NO)?.value;\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport class HttpClient {\r\n private readonly baseUrl: string;\r\n private readonly helloMethod: string;\r\n private readonly apiKey: string;\r\n private readonly userType: USER_TYPE;\r\n private readonly userFrom: string;\r\n private readonly deviceId: string;\r\n private readonly version: string = '1';\r\n private readonly lang: string;\r\n private readonly websiteId?: string;\r\n private readonly websiteNo?: string;\r\n private readonly _isDebug: boolean;\r\n constructor({ deviceId, lang, websiteId, websiteNo, userType, helloURL }: Readonly<HttpClientOpts>) {\r\n this.baseUrl = process.env.BASE_URL ?? '';\r\n this.helloMethod = helloURL ?? ''\r\n this.apiKey = process.env.API_KEY ?? '';\r\n this.userType = userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.userFrom = process.env.USER_FROM || '1';\r\n this.deviceId = deviceId ?? randomString(10);\r\n this.lang = lang ?? DEFAULT_LOCALE;\r\n this.websiteId = websiteId\r\n this.websiteNo = websiteNo\r\n this._isDebug = process.env.NODE_ENV != 'production';\r\n }\r\n\r\n isDebug() {\r\n return this._isDebug;\r\n }\r\n\r\n encrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.encrypt(data, key).toString();\r\n }\r\n\r\n decrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.decrypt(data, key, {\r\n mode: CryptoJS.mode.ECB,\r\n }).toString(CryptoJS.enc.Utf8);\r\n }\r\n\r\n getDeviceId() {\r\n return this.deviceId;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private convertUrlParameter(data: Record<string, any>): string {\r\n const p: string[] = [];\r\n for (const o in data) {\r\n let v = data[o];\r\n if (v && typeof v === \"string\") {\r\n v = v.trim();\r\n } else if (v && typeof v === \"object\") {\r\n if (isArray(v)) {\r\n if (v.length === 0) {\r\n continue;\r\n }\r\n for (let i = 0; i < v.length; i++) {\r\n const arr_item = v[i];\r\n for (const item_field in arr_item) {\r\n const item_field_value = arr_item[item_field] ?? undefined;\r\n if (item_field_value) {\r\n if (typeof item_field_value === \"object\") {\r\n if (isArray(item_field_value)) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n item_field_value.forEach((item1: any, index: number) => {\r\n if (item1) {\r\n for (const f in item1) {\r\n const v = item1[f];\r\n if (v && v.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field + `[${index.toString()}].${f}`}=${urlEncode(v)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n } else if (item_field_value.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field}=${urlEncode(item_field_value.toString())}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n for (const obj in v) {\r\n const oValue = v[obj];\r\n if (oValue != null && oValue != \"\" && oValue.length != 0) {\r\n const s = `.${obj}=${urlEncode(oValue)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n continue;\r\n } else if (v && typeof v === \"function\") {\r\n v = null;\r\n }\r\n\r\n if (v != null && v != \"\" && v.length != 0) {\r\n p.push(o + \"=\" + urlEncode(v));\r\n }\r\n }\r\n return (p && p.join(\"&\"));\r\n }\r\n\r\n private async sign(data: Record<string, object | string>): Promise<string> {\r\n //由后台分配\r\n const _apiKey = \"&key=\" + (await this.helloIboot());\r\n const arr: string[] = [];\r\n for (const o in data) {\r\n arr.push(o);\r\n }\r\n arr.sort((a: string, b: string) => {\r\n return a.toLowerCase().localeCompare(b.toLowerCase());\r\n });\r\n const res: string[] = [];\r\n arr.forEach((v: string) => {\r\n let value: object | string = data[v];\r\n if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n res.push(v + \"=\" + value);\r\n });\r\n const paramsStr: string = res.join(\"&\");\r\n const str = md5.md5((paramsStr + _apiKey).toLocaleUpperCase());\r\n const logInfo = {\r\n name: \"sort\",\r\n params: paramsStr,\r\n md5: str\r\n }\r\n logger.debug(logInfo)\r\n return str;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private assemblyParameter(data?: Record<string, any>, username?: string): Record<string, any> {\r\n const params = data ?? {};\r\n params['timestamp'] = Date.now() + '';\r\n params['echostr'] = randomString(10);\r\n params['version'] = this.version;\r\n params['deviceId'] = this.deviceId;\r\n params['webid'] = this.websiteId;\r\n params['apiKey'] = this.apiKey;\r\n if (username && username.length > 0) {\r\n params['username'] = username;\r\n }\r\n return params;\r\n }\r\n\r\n private async assemblyHeader({ urlParams, token }: Readonly<{ urlParams: string, token?: Readonly<HttpToken> }>) {\r\n const h: Record<string, string> = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Device-Id': this.deviceId,\r\n 'User-Type': token?.utype.toString() ?? this.userType.toString(),\r\n 'User-From': this.userFrom,\r\n 'Api-Key': this.apiKey\r\n }\r\n if (this.lang && this.lang.length > 0) {\r\n h['Lang'] = this.lang\r\n }\r\n if (this.websiteId && this.websiteId.length > 0) {\r\n h['Web-Id'] = this.websiteId\r\n }\r\n if (this.websiteNo && this.websiteNo.length > 0) {\r\n h['Web-No'] = this.websiteNo\r\n }\r\n if (token) {\r\n if (token.token && token.token.length > 0 && token.username && token.username.length > 0) {\r\n h['Authorization'] = token.token;\r\n h['Username'] = token.username;\r\n }\r\n if (token.xcsrf) {\r\n h[token.xcsrf.csrfHeader] = token.xcsrf.csrfToken;\r\n }\r\n }\r\n const data = urlParamToJson(urlParams);\r\n const sign = await this.sign(data);\r\n h['Sign'] = sign\r\n return h;\r\n }\r\n\r\n private async helloIboot(): Promise<string> {\r\n if (this.helloMethod.length <= 0) {\r\n return this.apiKey;\r\n }\r\n const api = this.getApiUrl(this.helloMethod);\r\n const h = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Api-Key': this.apiKey\r\n }\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": h\r\n }\r\n logger.debug(logInfo);\r\n const res = await fetch(api, {\r\n method: 'GET',\r\n headers: h,\r\n credentials: 'include',\r\n cache: 'force-cache'\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug({ result: result.data })\r\n return result.data;\r\n }\r\n throw new Error('hello iBoot error!')\r\n }\r\n\r\n private getApiUrl(url: string): string {\r\n return `${this.baseUrl}/${url}`;\r\n }\r\n\r\n async csrf(): Promise<string | undefined> {\r\n const res = await this.get<CSRFToken>({\r\n url: 'guest/csrf'\r\n });\r\n if (res.success) {\r\n const data = res.data;\r\n if (data) {\r\n return data[\"csrfToken\"].toString();\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async get<T>({ url, data, token, cache = 'default' }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n const api = `${this.getApiUrl(url)}?${urlParams.toString()}`\r\n const logInfo = {\r\n \"method\": \"GET\",\r\n \"url\": api,\r\n \"headers\": headers\r\n }\r\n logger.info(logInfo);\r\n const res = await fetch(api, {\r\n \"method\": 'GET',\r\n \"headers\": headers,\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug({ \"GET_RESULT\": result })\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async post<T>({ url, data, token, cache = \"default\" }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n const api = this.getApiUrl(url);\r\n const logInfo = {\r\n \"method\": \"POST\",\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo);\r\n const urls = buffer ? `${api}?${urlParams}` : api;\r\n const res = await fetch(urls, {\r\n \"method\": 'POST',\r\n \"headers\": headers,\r\n \"body\": buffer ? buffer : urlParams.toString(),\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug({ \"POST_RESULT\": result })\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async stream({ url, data, token }: Readonly<Omit<ServerRequestOptions, 'cache'>>): Promise<Response> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params); //new URLSearchParams(params);\r\n\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n headers['Connection'] = 'keep-alive';\r\n headers['X-Accel-Buffering'] = 'no'; //防止 Nginx 缓存\r\n headers['Cache-Control'] = 'no-cache';\r\n const api = this.getApiUrl(url)\r\n try {\r\n const url = buffer ? `${api}?${urlParams}` : api;\r\n const logInfo = {\r\n \"method\": \"STREAM\",\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo);\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: buffer ? buffer : urlParams.toString(),\r\n credentials: 'include'\r\n });\r\n\r\n if (!res.ok) {\r\n throw new Error(`HTTP error! status: ${res.status}`);\r\n }\r\n if (!res.body) {\r\n throw new Error('No response body');\r\n }\r\n return new Response(res.body, {\r\n headers: {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive'\r\n }\r\n });\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n\r\n getUserInfo(cookies: IbootCookieStore): User | null {\r\n const userjson = cookies.get(COOKIE_NAMES.user)?.value;\r\n if (userjson && userjson.length > 0) {\r\n return JSON.parse(userjson);\r\n }\r\n return null;\r\n }\r\n\r\n getToken(cookies: IbootCookieStore): HttpToken {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n getTokenByCookies = (cookies: IbootReadonlyCookies): HttpToken => {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n setToken(data: User & { token: string, extFields: Record<string, any> }, response: { cookies: IbootWritableCookie }) {\r\n const { id, name, username, nickname, sex, headImg, token, lastLoginTime, tokenExpired, deviceId, userType, mustChangePwd } = data;\r\n const loginUser: User = {\r\n id: id,\r\n name: name,\r\n username: username,\r\n nickname: nickname,\r\n sex: sex,\r\n headImg: headImg,\r\n lastLoginTime: lastLoginTime,\r\n tokenExpired: tokenExpired,\r\n deviceId: deviceId,\r\n userType: userType,\r\n status: 0,\r\n accountType: 0,\r\n enabled: false,\r\n userFrom: 1,\r\n needToReview: false,\r\n socketOnline: false,\r\n createTime: \"\",\r\n mustChangePwd: mustChangePwd\r\n };\r\n response.cookies.set(COOKIE_NAMES.token, token, {\r\n httpOnly: true,\r\n secure: !this._isDebug, // 在生产环境中启用Secure\r\n sameSite: 'strict', // 防止 CSRF 攻击\r\n path: '/', // Cookie 的路径\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, JSON.stringify(loginUser));\r\n return response;\r\n }\r\n\r\n cleanToken(response: { cookies: IbootWritableCookie }) {\r\n response.cookies.set(COOKIE_NAMES.token, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.delete(COOKIE_NAMES.token);\r\n response.cookies.delete(COOKIE_NAMES.user)\r\n return response;\r\n }\r\n}"],"names":["ACCOUNT_TYPE_MAP","USER_TYPE_MAP","USER_FORM_MAP","USER_SEX_MAP","logger","pino","label","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","DEFAULT_LOCALE","DEVICE_ID_KEY","CURRENT_WEBSITE_KEY","_GET_ERROR","_POST_ERROR","HEADER_NAMES","COOKIE_NAMES","getDefaultRequestHeader","devideId","json","curWebsite","header","setDefaultRequestHeader","deviceId","website","get","url","opts","params","headers","heads","field","response","msg","post","data","body","proxyHeaders","iGet","res","iPost","iPostSuccess","getHttpClientOpts","request","lang","websiteId","websiteNo","getHttpClientOptsByCookie","cookie","HttpClient","userType","helloURL","key","CryptoJS","p","o","v","arr_item","item_field","item_field_value","item1","index","f","s","oValue","_apiKey","b","paramsStr","str","md5","logInfo","username","urlParams","token","h","sign","api","cache","buffer","boundary","urls","e","cookies","userjson","utype","user","id","name","nickname","sex","headImg","lastLoginTime","tokenExpired","mustChangePwd","loginUser"],"mappings":"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"}
1
+ {"version":3,"file":"iboot-http-client.es.js","sources":["../src/types/user.ts","../src/logger.ts","../src/utils.ts","../src/http-client.ts"],"sourcesContent":["export const ACCOUNT_TYPE_MAP = {\r\n GENERAL : 0,\r\n PHONE : 1,\r\n EMAIL : 2\r\n}\r\n\r\nexport const USER_TYPE_MAP = {\r\n TYPE_MGT : 0,\r\n TYPE_C : 1,\r\n TYPE_B : 2\r\n}\r\n\r\nexport const USER_FORM_MAP = {\r\n FROM_WEB : 1,\r\n FROM_PC : 2,\r\n FROM_WX_MINI_PRO : 3,\r\n FROM_WX_PLU : 4,\r\n FROM_WX_E : 5,\r\n FROM_APP : 6,\r\n FROM_DEVICE : 7\r\n}\r\n\r\nexport const USER_SEX_MAP = {\r\n unknown:0,\r\n male:1,\r\n female:2,\r\n}\r\n\r\nexport type ACCOUNT_TYPE = typeof ACCOUNT_TYPE_MAP[keyof typeof ACCOUNT_TYPE_MAP];\r\nexport type USER_TYPE = typeof USER_TYPE_MAP[keyof typeof USER_TYPE_MAP];\r\nexport type USER_FORM = typeof USER_FORM_MAP[keyof typeof USER_FORM_MAP];\r\nexport type USER_SEX = typeof USER_SEX_MAP[keyof typeof USER_SEX_MAP];\r\n\r\n// User interface\r\nexport interface User {\r\n id: string;\r\n name: string;\r\n username: string;\r\n nickname: string;\r\n sex: USER_SEX;\r\n headImg: string;\r\n lastLoginTime: string;\r\n tokenExpired: string;\r\n deviceId: string;\r\n userType: USER_TYPE;\r\n status: number;\r\n accountType: number;\r\n enabled: boolean;\r\n userFrom: USER_FORM;\r\n needToReview: boolean;\r\n socketOnline: boolean;\r\n createTime: string;\r\n mustChangePwd: boolean;\r\n}","import pino from \"pino\";\r\nimport koffi from 'koffi';\r\n\r\nif (typeof window === 'undefined' && process.platform === 'win32') {\r\n try {\r\n const CP_UTF8 = 65001;\r\n const kernel32 = koffi.load('Kernel32');\r\n const setConsoleOutputCP = kernel32.func('SetConsoleOutputCP', 'bool', ['int']);\r\n const setConsoleCP = kernel32.func('SetConsoleCP', 'bool', ['int']);\r\n setConsoleOutputCP(CP_UTF8);\r\n setConsoleCP(CP_UTF8);\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n}\r\n\r\nexport const logger = pino({\r\n name: process.env.APP_NAME ?? 'iBoot',\r\n level: process.env.NODE_ENV !== 'production' ? 'debug' : 'info',\r\n nestedKey: 'payload',\r\n transport: {\r\n target: 'pino-pretty',\r\n options: {\r\n colorize: true,\r\n translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n ignore: 'pid,hostname',\r\n messageFormat: '{msg}',\r\n singleLine: true,\r\n },\r\n }\r\n});","export const isArray = (obj: unknown) => {\r\n return (\r\n Array.isArray(obj) ||\r\n (typeof obj === \"object\" &&\r\n Object.prototype.toString.call(obj) === \"[object Array]\")\r\n );\r\n};\r\n\r\n/**\r\n * 生成指定长度的随机串\r\n * @param {Object} len\r\n */\r\nexport const randomString = (len: number) => {\r\n const l = len || 32;\r\n const $chars = \"ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678\";\r\n const maxPos = $chars.length;\r\n let pwd = \"\";\r\n for (let i = 0; i < l; i++) {\r\n pwd += $chars.charAt(Math.floor(Math.random() * maxPos));\r\n }\r\n return pwd;\r\n};\r\n\r\nexport const urlParamToJson = (urlQueryParams: string, exclude?: string[]): Record<string, string> => {\r\n const result: Record<string, string> = {};\r\n const strs = urlQueryParams.split(\"&\");\r\n strs.forEach((item) => {\r\n const arr = item.split(\"=\");\r\n if (arr[1]) {\r\n if (!exclude || exclude.indexOf(arr[0]) == -1) {\r\n result[arr[0]] = arr[1];\r\n }\r\n }\r\n });\r\n return result;\r\n};\r\n\r\nexport const urlEncode = (value: string | null | undefined): string => {\r\n if (!value || value == \"\" || value.length == 0) {\r\n return \"\";\r\n }\r\n return (\r\n encodeURIComponent(value)\r\n // .replace(/%20/g, '+')\r\n // .replace(/%2B/g, '\\\\+')\r\n .replace(/\\(/g, \"%28\")\r\n .replace(/\\)/g, \"%29\")\r\n .replace(/\\'/g, \"%27\")\r\n .replace(/\\!/g, \"%21\")\r\n .replace(/\\~/g, \"%7E\")\r\n );\r\n};\r\n","import md5 from \"js-md5\";\r\nimport CryptoJS from 'crypto-js';\r\nimport { isArray, randomString, urlEncode, urlParamToJson } from \"./utils\";\r\nimport {\r\n ClientGetParams,\r\n ClientPostParams,\r\n CookieNames,\r\n CSRFToken,\r\n CurWebsite,\r\n HttpClientOpts,\r\n HttpHeaderNames,\r\n HttpHeaders,\r\n HttpToken,\r\n IbootCookieStore,\r\n IbootReadonlyCookies,\r\n IbootWritableCookie,\r\n ResultModel,\r\n ServerRequestOptions\r\n} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\r\nimport { logger } from \"./logger\";\r\n\r\nexport const DEFAULT_LOCALE = 'zh-CN';\r\nexport const DEVICE_ID_KEY = \"_device_id_key\";\r\nexport const CURRENT_WEBSITE_KEY = \"_current_website_key\"\r\n\r\nconst _GET_ERROR = \"Get request error!\"\r\nconst _POST_ERROR = \"Post request error!\";\r\n\r\nconst HEADER_NAMES: Record<HttpHeaderNames, HttpHeaderNames> = {\r\n \"Device-Id\": \"Device-Id\",\r\n \"Lang\": \"Lang\",\r\n \"Website-Id\": \"Website-Id\",\r\n \"Website-No\": \"Website-No\",\r\n}\r\n\r\nconst COOKIE_NAMES: Record<CookieNames, CookieNames> = {\r\n \"IBOOT_DEVICE_ID\": \"IBOOT_DEVICE_ID\",\r\n \"IBOOT_LOCALE\": \"IBOOT_LOCALE\",\r\n \"IBOOT_WEBSITE_ID\": \"IBOOT_WEBSITE_ID\",\r\n \"IBOOT_WEBSITE_NO\": \"IBOOT_WEBSITE_NO\",\r\n \"token\": \"token\",\r\n \"user\": \"user\"\r\n}\r\n\r\nconst getDefaultRequestHeader = (): HttpHeaders => {\r\n const devideId = localStorage.getItem(DEVICE_ID_KEY) ?? ''\r\n const json = localStorage.getItem(CURRENT_WEBSITE_KEY);\r\n const curWebsite: CurWebsite | null = json != null ? JSON.parse(json) : null;\r\n const header: HttpHeaders = {}\r\n if (devideId.length > 0) {\r\n header['Device-Id'] = devideId\r\n }\r\n if (curWebsite) {\r\n header['Lang'] = curWebsite.language;\r\n if (curWebsite.websiteId) {\r\n header['Website-Id'] = curWebsite.websiteId;\r\n }\r\n if (curWebsite.websiteNo) {\r\n header['Website-No'] = curWebsite.websiteNo\r\n }\r\n }\r\n return header;\r\n};\r\n\r\n\r\nexport const setDefaultRequestHeader = (deviceId: string, website?: CurWebsite): void => {\r\n localStorage.setItem(DEVICE_ID_KEY, deviceId);\r\n if (website) {\r\n localStorage.setItem(CURRENT_WEBSITE_KEY, JSON.stringify(website));\r\n }\r\n}\r\n\r\nexport const get = async <T>(url: string, opts?: ClientGetParams): Promise<ResultModel<T>> => {\r\n if (opts?.data) {\r\n const params = new URLSearchParams(opts.data);\r\n if (url.indexOf(\"?\") != -1) {\r\n url += `&${params}`\r\n } else {\r\n url += `?${params}`\r\n }\r\n }\r\n const headers: Record<string, string> = getDefaultRequestHeader();\r\n const heads = opts?.headers;\r\n if (heads) {\r\n for (const field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n headers[field] = value;\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": headers,\r\n }, \"GET\")\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n cache: opts?.useCache ? 'force-cache' : 'default'\r\n });\r\n\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const post = async <T>(url: string, opts?: ClientPostParams): Promise<ResultModel<T>> => {\r\n const data = opts?.data ?? {};\r\n const heads = opts?.headers;\r\n let body: string | FormData;\r\n const proxyHeaders = new Headers(getDefaultRequestHeader());\r\n if (!(data instanceof FormData)) {\r\n body = JSON.stringify(data);\r\n proxyHeaders.set('Content-Type', 'application/json');\r\n } else {\r\n body = data;\r\n }\r\n if (heads) {\r\n for (let field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n proxyHeaders.set(field, value);\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": proxyHeaders,\r\n }, \"POST\")\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: proxyHeaders,\r\n body: body,\r\n });\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"POST_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText,\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const iGet = async <T>(url: string, opts?: ClientGetParams): Promise<T | undefined> => {\r\n const res = await get<T>(url, opts);\r\n if (res.success) {\r\n return res.data as T;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _GET_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _GET_ERROR)\r\n}\r\n\r\nexport const iPost = async <T>(url: string, opts?: ClientPostParams): Promise<T | undefined> => {\r\n const res = await post<T>(url, opts);\r\n if (res.success) {\r\n return res.data;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _POST_ERROR)\r\n}\r\n\r\nexport const iPostSuccess = async (url: string, opts?: ClientPostParams): Promise<boolean> => {\r\n const res = await post(url, opts);\r\n if (res.success) {\r\n if (opts?.showSuccess) {\r\n opts.showSuccess(res.msg ?? 'SUCCESS')\r\n }\r\n return true;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n }\r\n return false;\r\n}\r\n\r\n\r\nexport const getHttpClientOpts = (request: Request): HttpClientOpts => {\r\n const deviceId = request.headers.get(HEADER_NAMES[\"Device-Id\"]);\r\n const lang = request.headers.get(HEADER_NAMES.Lang);\r\n const websiteId = request.headers.get(HEADER_NAMES[\"Website-Id\"]);\r\n const websiteNo = request.headers.get(HEADER_NAMES[\"Website-No\"]);\r\n const result: HttpClientOpts = {}\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport const getHttpClientOptsByCookie = (cookie: IbootReadonlyCookies): HttpClientOpts => {\r\n const result: HttpClientOpts = {}\r\n const deviceId = cookie.get(COOKIE_NAMES.IBOOT_DEVICE_ID)?.value;\r\n const lang = cookie.get(COOKIE_NAMES.IBOOT_LOCALE)?.value;\r\n const websiteId = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_ID)?.value;\r\n const websiteNo = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_NO)?.value;\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport class HttpClient {\r\n private readonly baseUrl: string;\r\n private readonly helloMethod: string;\r\n private readonly apiKey: string;\r\n private readonly userType: USER_TYPE;\r\n private readonly userFrom: string;\r\n private readonly deviceId: string;\r\n private readonly version: string = '1';\r\n private readonly lang: string;\r\n private readonly websiteId?: string;\r\n private readonly websiteNo?: string;\r\n private readonly _isDebug: boolean;\r\n constructor({ deviceId, lang, websiteId, websiteNo, userType, helloURL }: Readonly<HttpClientOpts>) {\r\n this.baseUrl = process.env.BASE_URL ?? '';\r\n this.helloMethod = helloURL ?? ''\r\n this.apiKey = process.env.API_KEY ?? '';\r\n this.userType = userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.userFrom = process.env.USER_FROM || '1';\r\n this.deviceId = deviceId ?? randomString(10);\r\n this.lang = lang ?? DEFAULT_LOCALE;\r\n this.websiteId = websiteId\r\n this.websiteNo = websiteNo\r\n this._isDebug = process.env.NODE_ENV != 'production';\r\n }\r\n\r\n isDebug() {\r\n return this._isDebug;\r\n }\r\n\r\n encrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.encrypt(data, key).toString();\r\n }\r\n\r\n decrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.decrypt(data, key, {\r\n mode: CryptoJS.mode.ECB,\r\n }).toString(CryptoJS.enc.Utf8);\r\n }\r\n\r\n getDeviceId() {\r\n return this.deviceId;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private convertUrlParameter(data: Record<string, any>): string {\r\n const p: string[] = [];\r\n for (const o in data) {\r\n let v = data[o];\r\n if (v && typeof v === \"string\") {\r\n v = v.trim();\r\n } else if (v && typeof v === \"object\") {\r\n if (isArray(v)) {\r\n if (v.length === 0) {\r\n continue;\r\n }\r\n for (let i = 0; i < v.length; i++) {\r\n const arr_item = v[i];\r\n for (const item_field in arr_item) {\r\n const item_field_value = arr_item[item_field] ?? undefined;\r\n if (item_field_value) {\r\n if (typeof item_field_value === \"object\") {\r\n if (isArray(item_field_value)) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n item_field_value.forEach((item1: any, index: number) => {\r\n if (item1) {\r\n for (const f in item1) {\r\n const v = item1[f];\r\n if (v && v.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field + `[${index.toString()}].${f}`}=${urlEncode(v)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n } else if (item_field_value.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field}=${urlEncode(item_field_value.toString())}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n for (const obj in v) {\r\n const oValue = v[obj];\r\n if (oValue != null && oValue != \"\" && oValue.length != 0) {\r\n const s = `.${obj}=${urlEncode(oValue)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n continue;\r\n } else if (v && typeof v === \"function\") {\r\n v = null;\r\n }\r\n\r\n if (v != null && v != \"\" && v.length != 0) {\r\n p.push(o + \"=\" + urlEncode(v));\r\n }\r\n }\r\n return (p && p.join(\"&\"));\r\n }\r\n\r\n private async sign(data: Record<string, object | string>): Promise<string> {\r\n //由后台分配\r\n const _apiKey = \"&key=\" + (await this.helloIboot());\r\n const arr: string[] = [];\r\n for (const o in data) {\r\n arr.push(o);\r\n }\r\n arr.sort((a: string, b: string) => {\r\n return a.toLowerCase().localeCompare(b.toLowerCase());\r\n });\r\n const res: string[] = [];\r\n arr.forEach((v: string) => {\r\n let value: object | string = data[v];\r\n if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n res.push(v + \"=\" + value);\r\n });\r\n const paramsStr: string = res.join(\"&\");\r\n const str = md5.md5((paramsStr + _apiKey).toLocaleUpperCase());\r\n const logInfo = {\r\n params: paramsStr,\r\n md5: str\r\n }\r\n logger.debug(logInfo, \"API_SIGN\")\r\n return str;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private assemblyParameter(data?: Record<string, any>, username?: string): Record<string, any> {\r\n const params = data ?? {};\r\n params['timestamp'] = Date.now() + '';\r\n params['echostr'] = randomString(10);\r\n params['version'] = this.version;\r\n params['deviceId'] = this.deviceId;\r\n params['webid'] = this.websiteId;\r\n params['apiKey'] = this.apiKey;\r\n if (username && username.length > 0) {\r\n params['username'] = username;\r\n }\r\n return params;\r\n }\r\n\r\n private async assemblyHeader({ urlParams, token }: Readonly<{ urlParams: string, token?: Readonly<HttpToken> }>) {\r\n const h: Record<string, string> = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Device-Id': this.deviceId,\r\n 'User-Type': token?.utype.toString() ?? this.userType.toString(),\r\n 'User-From': this.userFrom,\r\n 'Api-Key': this.apiKey\r\n }\r\n if (this.lang && this.lang.length > 0) {\r\n h['Lang'] = this.lang\r\n }\r\n if (this.websiteId && this.websiteId.length > 0) {\r\n h['Web-Id'] = this.websiteId\r\n }\r\n if (this.websiteNo && this.websiteNo.length > 0) {\r\n h['Web-No'] = this.websiteNo\r\n }\r\n if (token) {\r\n if (token.token && token.token.length > 0 && token.username && token.username.length > 0) {\r\n h['Authorization'] = token.token;\r\n h['Username'] = token.username;\r\n }\r\n if (token.xcsrf) {\r\n h[token.xcsrf.csrfHeader] = token.xcsrf.csrfToken;\r\n }\r\n }\r\n const data = urlParamToJson(urlParams);\r\n const sign = await this.sign(data);\r\n h['Sign'] = sign\r\n return h;\r\n }\r\n\r\n private async helloIboot(): Promise<string> {\r\n if (this.helloMethod.length <= 0) {\r\n return this.apiKey;\r\n }\r\n const api = this.getApiUrl(this.helloMethod);\r\n const h = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Api-Key': this.apiKey\r\n }\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": h\r\n }\r\n logger.debug(logInfo, \"HELLO\");\r\n const res = await fetch(api, {\r\n method: 'GET',\r\n headers: h,\r\n credentials: 'include',\r\n cache: 'force-cache'\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result.data, 'HELLO RESULT')\r\n return result.data;\r\n }\r\n throw new Error('hello iBoot error!')\r\n }\r\n\r\n private getApiUrl(url: string): string {\r\n return `${this.baseUrl}/${url}`;\r\n }\r\n\r\n async csrf(): Promise<string | undefined> {\r\n const res = await this.get<CSRFToken>({\r\n url: 'guest/csrf'\r\n });\r\n if (res.success) {\r\n const data = res.data;\r\n if (data) {\r\n return data[\"csrfToken\"].toString();\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async get<T>({ url, data, token, cache = 'default' }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n const api = `${this.getApiUrl(url)}?${urlParams.toString()}`\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers\r\n }\r\n logger.info(logInfo, \"GET\");\r\n const res = await fetch(api, {\r\n \"method\": 'GET',\r\n \"headers\": headers,\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async post<T>({ url, data, token, cache = \"default\" }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n const api = this.getApiUrl(url);\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"POST\");\r\n const urls = buffer ? `${api}?${urlParams}` : api;\r\n const res = await fetch(urls, {\r\n \"method\": 'POST',\r\n \"headers\": headers,\r\n \"body\": buffer ? buffer : urlParams.toString(),\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"POST_RESULT\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async stream({ url, data, token }: Readonly<Omit<ServerRequestOptions, 'cache'>>): Promise<Response> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params); //new URLSearchParams(params);\r\n\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n headers['Connection'] = 'keep-alive';\r\n headers['X-Accel-Buffering'] = 'no'; //防止 Nginx 缓存\r\n headers['Cache-Control'] = 'no-cache';\r\n const api = this.getApiUrl(url)\r\n try {\r\n const url = buffer ? `${api}?${urlParams}` : api;\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"STREAM\");\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: buffer ? buffer : urlParams.toString(),\r\n credentials: 'include'\r\n });\r\n\r\n if (!res.ok) {\r\n throw new Error(`HTTP error! status: ${res.status}`);\r\n }\r\n if (!res.body) {\r\n throw new Error('No response body');\r\n }\r\n return new Response(res.body, {\r\n headers: {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive'\r\n }\r\n });\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n\r\n getUserInfo(cookies: IbootCookieStore): User | null {\r\n const userjson = cookies.get(COOKIE_NAMES.user)?.value;\r\n if (userjson && userjson.length > 0) {\r\n return JSON.parse(userjson);\r\n }\r\n return null;\r\n }\r\n\r\n getToken(cookies: IbootCookieStore): HttpToken {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n getTokenByCookies = (cookies: IbootReadonlyCookies): HttpToken => {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n setToken(data: User & { token: string, extFields: Record<string, any> }, response: { cookies: IbootWritableCookie }) {\r\n const { id, name, username, nickname, sex, headImg, token, lastLoginTime, tokenExpired, deviceId, userType, mustChangePwd } = data;\r\n const loginUser: User = {\r\n id: id,\r\n name: name,\r\n username: username,\r\n nickname: nickname,\r\n sex: sex,\r\n headImg: headImg,\r\n lastLoginTime: lastLoginTime,\r\n tokenExpired: tokenExpired,\r\n deviceId: deviceId,\r\n userType: userType,\r\n status: 0,\r\n accountType: 0,\r\n enabled: false,\r\n userFrom: 1,\r\n needToReview: false,\r\n socketOnline: false,\r\n createTime: \"\",\r\n mustChangePwd: mustChangePwd\r\n };\r\n response.cookies.set(COOKIE_NAMES.token, token, {\r\n httpOnly: true,\r\n secure: !this._isDebug, // 在生产环境中启用Secure\r\n sameSite: 'strict', // 防止 CSRF 攻击\r\n path: '/', // Cookie 的路径\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, JSON.stringify(loginUser));\r\n return response;\r\n }\r\n\r\n cleanToken(response: { cookies: IbootWritableCookie }) {\r\n response.cookies.set(COOKIE_NAMES.token, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.delete(COOKIE_NAMES.token);\r\n response.cookies.delete(COOKIE_NAMES.user)\r\n return response;\r\n }\r\n}"],"names":["ACCOUNT_TYPE_MAP","USER_TYPE_MAP","USER_FORM_MAP","USER_SEX_MAP","kernel32","koffi","setConsoleOutputCP","setConsoleCP","e","logger","pino","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","DEFAULT_LOCALE","DEVICE_ID_KEY","CURRENT_WEBSITE_KEY","_GET_ERROR","_POST_ERROR","HEADER_NAMES","COOKIE_NAMES","getDefaultRequestHeader","devideId","json","curWebsite","header","setDefaultRequestHeader","deviceId","website","get","url","opts","params","headers","heads","field","response","msg","post","data","body","proxyHeaders","iGet","res","iPost","iPostSuccess","getHttpClientOpts","request","lang","websiteId","websiteNo","getHttpClientOptsByCookie","cookie","HttpClient","userType","helloURL","key","CryptoJS","p","o","v","arr_item","item_field","item_field_value","item1","index","f","s","oValue","_apiKey","b","paramsStr","str","md5","logInfo","username","urlParams","token","h","sign","api","cache","buffer","boundary","urls","cookies","userjson","utype","user","id","name","nickname","sex","headImg","lastLoginTime","tokenExpired","mustChangePwd","loginUser"],"mappings":";;;;AAAO,MAAMA,IAAmB;AAAA,EAC5B,SAAU;AAAA,EACV,OAAQ;AAAA,EACR,OAAQ;AACZ,GAEaC,IAAgB;AAAA,EACzB,UAAW;AAAA,EACX,QAAS;AAAA,EACT,QAAS;AACb,GAEaC,IAAgB;AAAA,EACzB,UAAW;AAAA,EACX,SAAU;AAAA,EACV,kBAAmB;AAAA,EACnB,aAAc;AAAA,EACd,WAAY;AAAA,EACZ,UAAW;AAAA,EACX,aAAc;AAClB,GAEaC,IAAe;AAAA,EACxB,SAAQ;AAAA,EACR,MAAK;AAAA,EACL,QAAO;AACX;ACvBA,IAAI,OAAO,SAAW,OAAe,QAAQ,aAAa;AACtD,MAAI;AAEA,UAAMC,IAAWC,EAAM,KAAK,UAAU,GAChCC,IAAqBF,EAAS,KAAK,sBAAsB,QAAQ,CAAC,KAAK,CAAC,GACxEG,IAAeH,EAAS,KAAK,gBAAgB,QAAQ,CAAC,KAAK,CAAC;AAClE,IAAAE,EAAmB,KAAO,GAC1BC,EAAa,KAAO;AAAA,EACxB,SAASC,GAAG;AACR,YAAQ,IAAIA,CAAC;AAAA,EACjB;AAGG,MAAMC,IAASC,EAAK;AAAA,EACvB,MAAM,QAAQ,IAAI,YAAY;AAAA,EAC9B,OAAO,QAAQ,IAAI,aAAa,eAAe,UAAU;AAAA,EACzD,WAAW;AAAA,EACX,WAAW;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,UAAU;AAAA,MACV,eAAe;AAAA,MACf,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,YAAY;AAAA,IAAA;AAAA,EAChB;AAER,CAAC,GC9BYC,IAAU,CAACC,MAEpB,MAAM,QAAQA,CAAG,KAChB,OAAOA,KAAQ,YACd,OAAO,UAAU,SAAS,KAAKA,CAAG,MAAM,kBAQjCC,IAAe,CAACC,MAAgB;AAC3C,QAAMC,IAAID,KAAO,IACXE,IAAS,oDACTC,IAASD,EAAO;AACtB,MAAIE,IAAM;AACV,WAASC,IAAI,GAAGA,IAAIJ,GAAGI;AACrB,IAAAD,KAAOF,EAAO,OAAO,KAAK,MAAM,KAAK,WAAWC,CAAM,CAAC;AAEzD,SAAOC;AACT,GAEaE,IAAiB,CAACC,GAAwBC,MAA+C;AACpG,QAAMC,IAAiC,CAAA;AAEvC,SADaF,EAAe,MAAM,GAAG,EAChC,QAAQ,CAACG,MAAS;AACrB,UAAMC,IAAMD,EAAK,MAAM,GAAG;AAC1B,IAAIC,EAAI,CAAC,MACH,CAACH,KAAWA,EAAQ,QAAQG,EAAI,CAAC,CAAC,KAAK,QACzCF,EAAOE,EAAI,CAAC,CAAC,IAAIA,EAAI,CAAC;AAAA,EAG5B,CAAC,GACMF;AACT,GAEaG,IAAY,CAACC,MACpB,CAACA,KAASA,KAAS,MAAMA,EAAM,UAAU,IACpC,KAGP,mBAAmBA,CAAK,EAGrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,GC3BdC,IAAiB,SACjBC,IAAgB,kBAChBC,IAAsB,wBAE7BC,IAAa,sBACbC,IAAc,uBAEdC,IAAyD;AAAA,EAC3D,aAAa;AAAA,EACb,MAAQ;AAAA,EACR,cAAc;AAAA,EACd,cAAc;AAClB,GAEMC,IAAiD;AAAA,EACnD,iBAAmB;AAAA,EACnB,cAAgB;AAAA,EAChB,kBAAoB;AAAA,EACpB,kBAAoB;AAAA,EACpB,OAAS;AAAA,EACT,MAAQ;AACZ,GAEMC,IAA0B,MAAmB;AAC/C,QAAMC,IAAW,aAAa,QAAQP,CAAa,KAAK,IAClDQ,IAAO,aAAa,QAAQP,CAAmB,GAC/CQ,IAAgCD,KAAQ,OAAO,KAAK,MAAMA,CAAI,IAAI,MAClEE,IAAsB,CAAA;AAC5B,SAAIH,EAAS,SAAS,MAClBG,EAAO,WAAW,IAAIH,IAEtBE,MACAC,EAAO,OAAUD,EAAW,UACxBA,EAAW,cACXC,EAAO,YAAY,IAAID,EAAW,YAElCA,EAAW,cACXC,EAAO,YAAY,IAAID,EAAW,aAGnCC;AACX,GAGaC,IAA0B,CAACC,GAAkBC,MAA+B;AACrF,eAAa,QAAQb,GAAeY,CAAQ,GACxCC,KACA,aAAa,QAAQZ,GAAqB,KAAK,UAAUY,CAAO,CAAC;AAEzE,GAEaC,IAAM,OAAUC,GAAaC,MAAoD;AAC1F,MAAIA,GAAM,MAAM;AACZ,UAAMC,IAAS,IAAI,gBAAgBD,EAAK,IAAI;AAC5C,IAAID,EAAI,QAAQ,GAAG,KAAK,KACpBA,KAAO,IAAIE,CAAM,KAEjBF,KAAO,IAAIE,CAAM;AAAA,EAEzB;AACA,QAAMC,IAAkCZ,EAAA,GAClCa,IAAQH,GAAM;AACpB,MAAIG;AACA,eAAWC,KAASD,GAAO;AACvB,YAAMrB,IAAQqB,EAAMC,CAAK;AACzB,MAAItB,MACAoB,EAAQE,CAAK,IAAItB;AAAA,IAEzB;AAEJ,EAAAlB,EAAO,MAAM;AAAA,IACT,KAAOmC;AAAA,IACP,SAAWG;AAAA,EAAA,GACZ,KAAK;AACR,QAAMG,IAAW,MAAM,MAAMN,GAAK;AAAA,IAC9B,QAAQ;AAAA,IACR,SAAAG;AAAA,IACA,OAAOF,GAAM,WAAW,gBAAgB;AAAA,EAAA,CAC3C;AAED,MAAIK,EAAS,IAAI;AACb,UAAM3B,IAAS,MAAM2B,EAAS,KAAA;AAC9B,WAAAzC,EAAO,MAAMc,GAAQ,YAAY,GAC1BA;AAAA,EACX;AACA,QAAM4B,IAAM;AAAA,IACR,MAAMD,EAAS;AAAA,IACf,SAAS;AAAA,IACT,KAAKA,EAAS;AAAA,EAAA;AAElB,SAAAzC,EAAO,MAAM0C,CAAG,GACTA;AACX,GAEaC,IAAO,OAAUR,GAAaC,MAAqD;AAC5F,QAAMQ,IAAOR,GAAM,QAAQ,CAAA,GACrBG,IAAQH,GAAM;AACpB,MAAIS;AACJ,QAAMC,IAAe,IAAI,QAAQpB,GAAyB;AAO1D,MANMkB,aAAgB,WAIlBC,IAAOD,KAHPC,IAAO,KAAK,UAAUD,CAAI,GAC1BE,EAAa,IAAI,gBAAgB,kBAAkB,IAInDP;AACA,aAASC,KAASD,GAAO;AACrB,YAAMrB,IAAQqB,EAAMC,CAAK;AACzB,MAAItB,KACA4B,EAAa,IAAIN,GAAOtB,CAAK;AAAA,IAErC;AAEJ,EAAAlB,EAAO,MAAM;AAAA,IACT,KAAOmC;AAAA,IACP,SAAWW;AAAA,EAAA,GACZ,MAAM;AACT,QAAML,IAAW,MAAM,MAAMN,GAAK;AAAA,IAC9B,QAAQ;AAAA,IACR,SAASW;AAAA,IACT,MAAAD;AAAA,EAAA,CACH;AACD,MAAIJ,EAAS,IAAI;AACb,UAAM3B,IAAS,MAAM2B,EAAS,KAAA;AAC9B,WAAAzC,EAAO,MAAMc,GAAQ,aAAa,GAC3BA;AAAA,EACX;AACA,QAAM4B,IAAM;AAAA,IACR,MAAMD,EAAS;AAAA,IACf,SAAS;AAAA,IACT,KAAKA,EAAS;AAAA,EAAA;AAElB,SAAAzC,EAAO,MAAM0C,CAAG,GACTA;AACX,GAEaK,IAAO,OAAUZ,GAAaC,MAAmD;AAC1F,QAAMY,IAAM,MAAMd,EAAOC,GAAKC,CAAI;AAClC,MAAIY,EAAI;AACJ,WAAOA,EAAI;AAEf,MAAIZ,GAAM,WAAW;AACjB,IAAAA,EAAK,UAAUY,EAAI,OAAO1B,CAAU;AACpC;AAAA,EACJ;AACA,QAAM,MAAM0B,EAAI,OAAO1B,CAAU;AACrC,GAEa2B,IAAQ,OAAUd,GAAaC,MAAoD;AAC5F,QAAMY,IAAM,MAAML,EAAQR,GAAKC,CAAI;AACnC,MAAIY,EAAI;AACJ,WAAOA,EAAI;AAEf,MAAIZ,GAAM,WAAW;AACjB,IAAAA,EAAK,UAAUY,EAAI,OAAOzB,CAAW;AACrC;AAAA,EACJ;AACA,QAAM,MAAMyB,EAAI,OAAOzB,CAAW;AACtC,GAEa2B,IAAe,OAAOf,GAAaC,MAA8C;AAC1F,QAAMY,IAAM,MAAML,EAAKR,GAAKC,CAAI;AAChC,SAAIY,EAAI,WACAZ,GAAM,eACNA,EAAK,YAAYY,EAAI,OAAO,SAAS,GAElC,OAEPZ,GAAM,aACNA,EAAK,UAAUY,EAAI,OAAOzB,CAAW,GAElC;AACX,GAGa4B,IAAoB,CAACC,MAAqC;AACnE,QAAMpB,IAAWoB,EAAQ,QAAQ,IAAI5B,EAAa,WAAW,CAAC,GACxD6B,IAAOD,EAAQ,QAAQ,IAAI5B,EAAa,IAAI,GAC5C8B,IAAYF,EAAQ,QAAQ,IAAI5B,EAAa,YAAY,CAAC,GAC1D+B,IAAYH,EAAQ,QAAQ,IAAI5B,EAAa,YAAY,CAAC,GAC1DV,IAAyB,CAAA;AAC/B,SAAIkB,KAAYA,EAAS,SAAS,MAC9BlB,EAAO,WAAWkB,IAElBqB,KAAQA,EAAK,SAAS,MACtBvC,EAAO,OAAOuC,IAEdC,KAAaA,EAAU,SAAS,MAChCxC,EAAO,YAAYwC,IAEnBC,KAAaA,EAAU,SAAS,MAChCzC,EAAO,YAAYyC,IAEhBzC;AACX,GAEa0C,IAA4B,CAACC,MAAiD;AACvF,QAAM3C,IAAyB,CAAA,GACzBkB,IAAWyB,EAAO,IAAIhC,EAAa,eAAe,GAAG,OACrD4B,IAAOI,EAAO,IAAIhC,EAAa,YAAY,GAAG,OAC9C6B,IAAYG,EAAO,IAAIhC,EAAa,gBAAgB,GAAG,OACvD8B,IAAYE,EAAO,IAAIhC,EAAa,gBAAgB,GAAG;AAC7D,SAAIO,KAAYA,EAAS,SAAS,MAC9BlB,EAAO,WAAWkB,IAElBqB,KAAQA,EAAK,SAAS,MACtBvC,EAAO,OAAOuC,IAEdC,KAAaA,EAAU,SAAS,MAChCxC,EAAO,YAAYwC,IAEnBC,KAAaA,EAAU,SAAS,MAChCzC,EAAO,YAAYyC,IAEhBzC;AACX;AAEO,MAAM4C,EAAW;AAAA,EACH;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACjB,YAAY,EAAE,UAAA1B,GAAU,MAAAqB,GAAM,WAAAC,GAAW,WAAAC,GAAW,UAAAI,GAAU,UAAAC,KAAsC;AAChG,SAAK,UAAU,QAAQ,IAAI,YAAY,IACvC,KAAK,cAAcA,KAAY,IAC/B,KAAK,SAAS,QAAQ,IAAI,WAAW,IACrC,KAAK,WAAWD,KAAYnE,EAAc,UAC1C,KAAK,WAAW,QAAQ,IAAI,aAAa,KACzC,KAAK,WAAWwC,KAAY5B,EAAa,EAAE,GAC3C,KAAK,OAAOiD,KAAQlC,GACpB,KAAK,YAAYmC,GACjB,KAAK,YAAYC,GACjB,KAAK,WAAW,QAAQ,IAAI,YAAY;AAAA,EAC5C;AAAA,EAEA,UAAU;AACN,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,QAAQX,GAAc;AAClB,UAAMiB,IAAMC,EAAS,IAAI,KAAK,MAAM,KAAK,MAAM;AAC/C,WAAOA,EAAS,IAAI,QAAQlB,GAAMiB,CAAG,EAAE,SAAA;AAAA,EAC3C;AAAA,EAEA,QAAQjB,GAAc;AAClB,UAAMiB,IAAMC,EAAS,IAAI,KAAK,MAAM,KAAK,MAAM;AAC/C,WAAOA,EAAS,IAAI,QAAQlB,GAAMiB,GAAK;AAAA,MACnC,MAAMC,EAAS,KAAK;AAAA,IAAA,CACvB,EAAE,SAASA,EAAS,IAAI,IAAI;AAAA,EACjC;AAAA,EAEA,cAAc;AACV,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGQ,oBAAoBlB,GAAmC;AAC3D,UAAMmB,IAAc,CAAA;AACpB,eAAWC,KAAKpB,GAAM;AAClB,UAAIqB,IAAIrB,EAAKoB,CAAC;AACd,UAAIC,KAAK,OAAOA,KAAM;AAClB,QAAAA,IAAIA,EAAE,KAAA;AAAA,eACCA,KAAK,OAAOA,KAAM,UAAU;AACnC,YAAI/D,EAAQ+D,CAAC,GAAG;AACZ,cAAIA,EAAE,WAAW;AACb;AAEJ,mBAASvD,IAAI,GAAGA,IAAIuD,EAAE,QAAQvD,KAAK;AAC/B,kBAAMwD,IAAWD,EAAEvD,CAAC;AACpB,uBAAWyD,KAAcD,GAAU;AAC/B,oBAAME,IAAmBF,EAASC,CAAU,KAAK;AACjD,kBAAIC;AACA,oBAAI,OAAOA,KAAqB;AAC5B,kBAAIlE,EAAQkE,CAAgB,KAExBA,EAAiB,QAAQ,CAACC,GAAYC,MAAkB;AACpD,wBAAID;AACA,iCAAWE,KAAKF,GAAO;AACnB,8BAAMJ,IAAII,EAAME,CAAC;AACjB,4BAAIN,KAAKA,EAAE,SAAA,EAAW,SAAS,GAAG;AAC9B,gCAAMO,IAAI,IAAI9D,EAAE,SAAA,CAAU,KAAKyD,IAAa,IAAIG,EAAM,SAAA,CAAU,KAAKC,CAAC,EAAE,IAAItD,EAAUgD,CAAC,CAAC;AACxF,0BAAAF,EAAE,KAAKC,IAAIQ,CAAC;AAAA,wBAChB;AAAA,sBACJ;AAAA,kBAER,CAAC;AAAA,yBAEEJ,EAAiB,SAAA,EAAW,SAAS,GAAG;AAC/C,wBAAMI,IAAI,IAAI9D,EAAE,SAAA,CAAU,KAAKyD,CAAU,IAAIlD,EAAUmD,EAAiB,SAAA,CAAU,CAAC;AACnF,kBAAAL,EAAE,KAAKC,IAAIQ,CAAC;AAAA,gBAChB;AAAA;AAAA,YAER;AAAA,UACJ;AAAA,QACJ;AACI,qBAAWrE,KAAO8D,GAAG;AACjB,kBAAMQ,IAASR,EAAE9D,CAAG;AACpB,gBAAIsE,KAAU,QAAQA,KAAU,MAAMA,EAAO,UAAU,GAAG;AACtD,oBAAMD,IAAI,IAAIrE,CAAG,IAAIc,EAAUwD,CAAM,CAAC;AACtC,cAAAV,EAAE,KAAKC,IAAIQ,CAAC;AAAA,YAChB;AAAA,UACJ;AAEJ;AAAA,MACJ,MAAA,CAAWP,KAAK,OAAOA,KAAM,eACzBA,IAAI;AAGR,MAAIA,KAAK,QAAQA,KAAK,MAAMA,EAAE,UAAU,KACpCF,EAAE,KAAKC,IAAI,MAAM/C,EAAUgD,CAAC,CAAC;AAAA,IAErC;AACA,WAAQF,KAAKA,EAAE,KAAK,GAAG;AAAA,EAC3B;AAAA,EAEA,MAAc,KAAKnB,GAAwD;AAEvE,UAAM8B,IAAU,UAAW,MAAM,KAAK,WAAA,GAChC1D,IAAgB,CAAA;AACtB,eAAWgD,KAAKpB;AACZ,MAAA5B,EAAI,KAAKgD,CAAC;AAEd,IAAAhD,EAAI,KAAK,CAAC,GAAW2D,MACV,EAAE,YAAA,EAAc,cAAcA,EAAE,aAAa,CACvD;AACD,UAAM3B,IAAgB,CAAA;AACtB,IAAAhC,EAAI,QAAQ,CAACiD,MAAc;AACvB,UAAI/C,IAAyB0B,EAAKqB,CAAC;AACnC,MAAI,OAAO/C,KAAU,aACjBA,IAAQ,KAAK,UAAUA,CAAK,IAEhC8B,EAAI,KAAKiB,IAAI,MAAM/C,CAAK;AAAA,IAC5B,CAAC;AACD,UAAM0D,IAAoB5B,EAAI,KAAK,GAAG,GAChC6B,IAAMC,EAAI,KAAKF,IAAYF,GAAS,mBAAmB,GACvDK,IAAU;AAAA,MACZ,QAAQH;AAAA,MACR,KAAKC;AAAA,IAAA;AAET,WAAA7E,EAAO,MAAM+E,GAAS,UAAU,GACzBF;AAAA,EACX;AAAA;AAAA,EAGQ,kBAAkBjC,GAA4BoC,GAAwC;AAC1F,UAAM3C,IAASO,KAAQ,CAAA;AACvB,WAAAP,EAAO,YAAe,KAAK,IAAA,IAAQ,IACnCA,EAAO,UAAajC,EAAa,EAAE,GACnCiC,EAAO,UAAa,KAAK,SACzBA,EAAO,WAAc,KAAK,UAC1BA,EAAO,QAAW,KAAK,WACvBA,EAAO,SAAY,KAAK,QACpB2C,KAAYA,EAAS,SAAS,MAC9B3C,EAAO,WAAc2C,IAElB3C;AAAA,EACX;AAAA,EAEA,MAAc,eAAe,EAAE,WAAA4C,GAAW,OAAAC,KAAuE;AAC7G,UAAMC,IAA4B;AAAA,MAC9B,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,aAAa,KAAK;AAAA,MAClB,aAAaD,GAAO,MAAM,cAAc,KAAK,SAAS,SAAA;AAAA,MACtD,aAAa,KAAK;AAAA,MAClB,WAAW,KAAK;AAAA,IAAA;AAEpB,IAAI,KAAK,QAAQ,KAAK,KAAK,SAAS,MAChCC,EAAE,OAAU,KAAK,OAEjB,KAAK,aAAa,KAAK,UAAU,SAAS,MAC1CA,EAAE,QAAQ,IAAI,KAAK,YAEnB,KAAK,aAAa,KAAK,UAAU,SAAS,MAC1CA,EAAE,QAAQ,IAAI,KAAK,YAEnBD,MACIA,EAAM,SAASA,EAAM,MAAM,SAAS,KAAKA,EAAM,YAAYA,EAAM,SAAS,SAAS,MACnFC,EAAE,gBAAmBD,EAAM,OAC3BC,EAAE,WAAcD,EAAM,WAEtBA,EAAM,UACNC,EAAED,EAAM,MAAM,UAAU,IAAIA,EAAM,MAAM;AAGhD,UAAMtC,IAAOjC,EAAesE,CAAS,GAC/BG,IAAO,MAAM,KAAK,KAAKxC,CAAI;AACjC,WAAAuC,EAAE,OAAUC,GACLD;AAAA,EACX;AAAA,EAEA,MAAc,aAA8B;AACxC,QAAI,KAAK,YAAY,UAAU;AAC3B,aAAO,KAAK;AAEhB,UAAME,IAAM,KAAK,UAAU,KAAK,WAAW,GACrCF,IAAI;AAAA,MACN,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,WAAW,KAAK;AAAA,IAAA,GAEdJ,IAAU;AAAA,MACZ,KAAOM;AAAA,MACP,SAAWF;AAAA,IAAA;AAEf,IAAAnF,EAAO,MAAM+E,GAAS,OAAO;AAC7B,UAAM/B,IAAM,MAAM,MAAMqC,GAAK;AAAA,MACzB,QAAQ;AAAA,MACR,SAASF;AAAA,MACT,aAAa;AAAA,MACb,OAAO;AAAA,IAAA,CACV;AACD,QAAInC,EAAI,IAAI;AACR,YAAMlC,IAAS,MAAMkC,EAAI,KAAA;AACzB,aAAAhD,EAAO,MAAMc,EAAO,MAAM,cAAc,GACjCA,EAAO;AAAA,IAClB;AACA,UAAM,IAAI,MAAM,oBAAoB;AAAA,EACxC;AAAA,EAEQ,UAAUqB,GAAqB;AACnC,WAAO,GAAG,KAAK,OAAO,IAAIA,CAAG;AAAA,EACjC;AAAA,EAEA,MAAM,OAAoC;AACtC,UAAMa,IAAM,MAAM,KAAK,IAAe;AAAA,MAClC,KAAK;AAAA,IAAA,CACR;AACD,QAAIA,EAAI,SAAS;AACb,YAAMJ,IAAOI,EAAI;AACjB,UAAIJ;AACA,eAAOA,EAAK,UAAa,SAAA;AAAA,IAEjC;AAAA,EAEJ;AAAA;AAAA,EAGA,MAAM,IAAO,EAAE,KAAAT,GAAK,MAAAS,GAAM,OAAAsC,GAAO,OAAAI,IAAQ,aAAsE;AAC3G,UAAMjD,IAAS,KAAK,kBAAkBO,CAAI,GACpCqC,IAAY,KAAK,oBAAoB5C,CAAM,GAC3CC,IAAU,MAAM,KAAK,eAAe,EAAE,WAAa2C,GAAW,OAASC,GAAO,GAC9EG,IAAM,GAAG,KAAK,UAAUlD,CAAG,CAAC,IAAI8C,EAAU,SAAA,CAAU,IACpDF,IAAU;AAAA,MACZ,KAAOM;AAAA,MACP,SAAW/C;AAAA,IAAA;AAEf,IAAAtC,EAAO,KAAK+E,GAAS,KAAK;AAC1B,UAAM/B,IAAM,MAAM,MAAMqC,GAAK;AAAA,MACzB,QAAU;AAAA,MACV,SAAW/C;AAAA,MACX,aAAe;AAAA,MACf,OAASgD;AAAA,IAAA,CACZ;AACD,QAAItC,EAAI,IAAI;AACR,YAAMlC,IAAS,MAAMkC,EAAI,KAAA;AACzB,aAAAhD,EAAO,MAAMc,GAAQ,YAAY,GAC1BA;AAAA,IACX;AACA,UAAM4B,IAAM;AAAA,MACR,MAAMM,EAAI;AAAA,MACV,SAAS;AAAA,MACT,KAAKA,EAAI;AAAA,IAAA;AAEb,WAAAhD,EAAO,MAAM0C,CAAG,GACTA;AAAA,EACX;AAAA;AAAA,EAGA,MAAM,KAAQ,EAAE,KAAAP,GAAK,MAAAS,GAAM,OAAAsC,GAAO,OAAAI,IAAQ,aAAsE;AAC5G,IAAA1C,IAAOA,IAAO,EAAE,GAAGA,EAAA,IAAS,CAAA;AAC5B,UAAM2C,IAAS3C,EAAK,UAAU,QACxB4C,IAAW5C,EAAK,YAAY;AAClC,IAAI2C,KACA,OAAO3C,EAAK,QAEZ4C,KACA,OAAO5C,EAAK;AAEhB,UAAMP,IAAS,KAAK,kBAAkBO,CAAI,GACpCqC,IAAY,KAAK,oBAAoB5C,CAAM,GAC3CC,IAAU,MAAM,KAAK,eAAe,EAAE,WAAa2C,GAAW,OAASC,GAAO;AACpF,IAAIK,KAAUC,MACVlD,EAAQ,cAAc,IAAI,iCAAiCkD,CAAQ;AAEvE,UAAMH,IAAM,KAAK,UAAUlD,CAAG,GACxB4C,IAAU;AAAA,MACZ,KAAOM;AAAA,MACP,SAAW/C;AAAA,MACX,QAAUD;AAAA,IAAA;AAEd,IAAArC,EAAO,KAAK+E,GAAS,MAAM;AAC3B,UAAMU,IAAOF,IAAS,GAAGF,CAAG,IAAIJ,CAAS,KAAKI,GACxCrC,IAAM,MAAM,MAAMyC,GAAM;AAAA,MAC1B,QAAU;AAAA,MACV,SAAWnD;AAAA,MACX,MAAQiD,KAAkBN,EAAU,SAAA;AAAA,MACpC,aAAe;AAAA,MACf,OAASK;AAAA,IAAA,CACZ;AACD,QAAItC,EAAI,IAAI;AACR,YAAMlC,IAAS,MAAMkC,EAAI,KAAA;AACzB,aAAAhD,EAAO,MAAMc,GAAQ,aAAa,GAC3BA;AAAA,IACX;AACA,UAAM4B,IAAM;AAAA,MACR,MAAMM,EAAI;AAAA,MACV,SAAS;AAAA,MACT,KAAKA,EAAI;AAAA,IAAA;AAEb,WAAAhD,EAAO,MAAM0C,CAAG,GACTA;AAAA,EACX;AAAA;AAAA,EAGA,MAAM,OAAO,EAAE,KAAAP,GAAK,MAAAS,GAAM,OAAAsC,KAA2E;AACjG,IAAAtC,IAAOA,IAAO,EAAE,GAAGA,EAAA,IAAS,CAAA;AAC5B,UAAM2C,IAAS3C,EAAK,UAAU,QACxB4C,IAAW5C,EAAK,YAAY;AAClC,IAAI2C,KACA,OAAO3C,EAAK,QAEZ4C,KACA,OAAO5C,EAAK;AAEhB,UAAMP,IAAS,KAAK,kBAAkBO,CAAI,GACpCqC,IAAY,KAAK,oBAAoB5C,CAAM,GAE3CC,IAAU,MAAM,KAAK,eAAe,EAAE,WAAa2C,GAAW,OAASC,GAAO;AACpF,IAAIK,KAAUC,MACVlD,EAAQ,cAAc,IAAI,iCAAiCkD,CAAQ,KAEvElD,EAAQ,aAAgB,cACxBA,EAAQ,mBAAmB,IAAI,MAC/BA,EAAQ,eAAe,IAAI;AAC3B,UAAM+C,IAAM,KAAK,UAAUlD,CAAG;AAC9B,QAAI;AACA,YAAMA,IAAMoD,IAAS,GAAGF,CAAG,IAAIJ,CAAS,KAAKI,GACvCN,IAAU;AAAA,QACZ,KAAOM;AAAA,QACP,SAAW/C;AAAA,QACX,QAAUD;AAAA,MAAA;AAEd,MAAArC,EAAO,KAAK+E,GAAS,QAAQ;AAC7B,YAAM/B,IAAM,MAAM,MAAMb,GAAK;AAAA,QACzB,QAAQ;AAAA,QACR,SAAAG;AAAA,QACA,MAAMiD,KAAkBN,EAAU,SAAA;AAAA,QAClC,aAAa;AAAA,MAAA,CAChB;AAED,UAAI,CAACjC,EAAI;AACL,cAAM,IAAI,MAAM,uBAAuBA,EAAI,MAAM,EAAE;AAEvD,UAAI,CAACA,EAAI;AACL,cAAM,IAAI,MAAM,kBAAkB;AAEtC,aAAO,IAAI,SAASA,EAAI,MAAM;AAAA,QAC1B,SAAS;AAAA,UACL,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,YAAc;AAAA,QAAA;AAAA,MAClB,CACH;AAAA,IACL,SAASjD,GAAG;AACR,YAAMA;AAAA,IACV;AAAA,EACJ;AAAA,EAEA,YAAY2F,GAAwC;AAChD,UAAMC,IAAWD,EAAQ,IAAIjE,EAAa,IAAI,GAAG;AACjD,WAAIkE,KAAYA,EAAS,SAAS,IACvB,KAAK,MAAMA,CAAQ,IAEvB;AAAA,EACX;AAAA,EAEA,SAASD,GAAsC;AAC3C,UAAMC,IAAWD,EAAQ,IAAI,MAAM,GAAG;AACtC,QAAIV,IAAW,IACXY,IAAQ,KAAK;AACjB,QAAID,KAAYA,EAAS,SAAS,GAAG;AACjC,YAAME,IAAO,KAAK,MAAMF,CAAQ;AAChC,MAAAX,IAAWa,EAAK,UAChBD,IAAQC,EAAK,SAAS,SAAA;AAAA,IAC1B;AACA,WAAO;AAAA,MACH,UAAAb;AAAA,MACA,OAAAY;AAAA,MACA,OAAOF,EAAQ,IAAIjE,EAAa,KAAK,GAAG,SAAS;AAAA,IAAA;AAAA,EAEzD;AAAA,EAEA,oBAAoB,CAACiE,MAA6C;AAC9D,UAAMC,IAAWD,EAAQ,IAAI,MAAM,GAAG;AACtC,QAAIV,IAAW,IACXY,IAAQ,KAAK;AACjB,QAAID,KAAYA,EAAS,SAAS,GAAG;AACjC,YAAME,IAAO,KAAK,MAAMF,CAAQ;AAChC,MAAAX,IAAWa,EAAK,UAChBD,IAAQC,EAAK,SAAS,SAAA;AAAA,IAC1B;AACA,WAAO;AAAA,MACH,UAAAb;AAAA,MACA,OAAAY;AAAA,MACA,OAAOF,EAAQ,IAAIjE,EAAa,KAAK,GAAG,SAAS;AAAA,IAAA;AAAA,EAEzD;AAAA;AAAA,EAGA,SAASmB,GAAgEH,GAA4C;AACjH,UAAM,EAAE,IAAAqD,GAAI,MAAAC,GAAM,UAAAf,GAAU,UAAAgB,GAAU,KAAAC,GAAK,SAAAC,GAAS,OAAAhB,GAAO,eAAAiB,GAAe,cAAAC,GAAc,UAAApE,GAAU,UAAA2B,GAAU,eAAA0C,MAAkBzD,GACxH0D,IAAkB;AAAA,MACpB,IAAAR;AAAA,MACA,MAAAC;AAAA,MACA,UAAAf;AAAA,MACA,UAAAgB;AAAA,MACA,KAAAC;AAAA,MACA,SAAAC;AAAA,MACA,eAAAC;AAAA,MACA,cAAAC;AAAA,MACA,UAAApE;AAAA,MACA,UAAA2B;AAAA,MACA,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,SAAS;AAAA,MACT,UAAU;AAAA,MACV,cAAc;AAAA,MACd,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,eAAA0C;AAAA,IAAA;AAEJ,WAAA5D,EAAS,QAAQ,IAAIhB,EAAa,OAAOyD,GAAO;AAAA,MAC5C,UAAU;AAAA,MACV,QAAQ,CAAC,KAAK;AAAA;AAAA,MACd,UAAU;AAAA;AAAA,MACV,MAAM;AAAA;AAAA,IAAA,CACT,GACDzC,EAAS,QAAQ,IAAIhB,EAAa,MAAM,KAAK,UAAU6E,CAAS,CAAC,GAC1D7D;AAAA,EACX;AAAA,EAEA,WAAWA,GAA4C;AACnD,WAAAA,EAAS,QAAQ,IAAIhB,EAAa,OAAO,IAAI;AAAA,MACzC,QAAQ;AAAA;AAAA,MACR,UAAU;AAAA,MACV,MAAM;AAAA,IAAA,CACT,GACDgB,EAAS,QAAQ,IAAIhB,EAAa,MAAM,IAAI;AAAA,MACxC,QAAQ;AAAA;AAAA,MACR,UAAU;AAAA,MACV,MAAM;AAAA,IAAA,CACT,GACDgB,EAAS,QAAQ,OAAOhB,EAAa,KAAK,GAC1CgB,EAAS,QAAQ,OAAOhB,EAAa,IAAI,GAClCgB;AAAA,EACX;AACJ;"}