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.
- package/dist/iboot-http-client.cjs.js +1 -1
- package/dist/iboot-http-client.cjs.js.map +1 -1
- package/dist/iboot-http-client.es.js +76 -80
- package/dist/iboot-http-client.es.js.map +1 -1
- package/dist/iboot-http-client.umd.js +1 -1
- package/dist/iboot-http-client.umd.js.map +1 -1
- package/package.json +13 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import N from "pino";
|
|
2
|
-
import A from "
|
|
3
|
-
import
|
|
4
|
-
|
|
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
|
-
},
|
|
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
|
-
},
|
|
21
|
+
}, H = {
|
|
21
22
|
unknown: 0,
|
|
22
23
|
male: 1,
|
|
23
24
|
female: 2
|
|
24
|
-
}
|
|
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
|
|
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: !
|
|
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
|
-
},
|
|
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"),
|
|
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
|
-
},
|
|
66
|
-
const n = localStorage.getItem(S) ?? "", t = localStorage.getItem(
|
|
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(
|
|
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 =
|
|
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
|
-
},
|
|
106
|
+
}, v = async (n, t) => {
|
|
104
107
|
const e = t?.data ?? {}, s = t?.headers;
|
|
105
108
|
let r;
|
|
106
|
-
const o = new Headers(
|
|
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
|
-
},
|
|
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
|
-
},
|
|
144
|
-
const e = await
|
|
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
|
-
},
|
|
153
|
-
const e = await
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
|
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 ??
|
|
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 =
|
|
182
|
-
return
|
|
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 =
|
|
186
|
-
return
|
|
187
|
-
mode:
|
|
188
|
-
}).toString(
|
|
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
|
|
216
|
-
e.push(s +
|
|
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 =
|
|
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 =
|
|
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(
|
|
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(
|
|
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,
|
|
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 (
|
|
360
|
-
const E = await
|
|
361
|
-
return h.debug(
|
|
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:
|
|
361
|
+
code: p.status,
|
|
365
362
|
success: !1,
|
|
366
|
-
msg:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
485
|
-
|
|
486
|
-
|
|
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
|
-
|
|
489
|
-
|
|
490
|
-
|
|
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
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
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
|
-
|
|
496
|
+
v as post,
|
|
501
497
|
w as randomString,
|
|
502
498
|
x as setDefaultRequestHeader,
|
|
503
499
|
b as urlEncode,
|
|
504
|
-
|
|
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":"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"}
|