iboot-http-client 1.1.1 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +65 -65
- 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/dist/types/http-client.d.ts +2 -2
- package/dist/types/types/http.d.ts +5 -0
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import N from "pino";
|
|
2
2
|
import R from "pino-pretty";
|
|
3
3
|
import A from "js-md5";
|
|
4
|
-
import
|
|
4
|
+
import p from "crypto-js";
|
|
5
5
|
const H = {
|
|
6
6
|
GENERAL: 0,
|
|
7
7
|
PHONE: 1,
|
|
@@ -22,24 +22,24 @@ const H = {
|
|
|
22
22
|
unknown: 0,
|
|
23
23
|
male: 1,
|
|
24
24
|
female: 2
|
|
25
|
-
},
|
|
25
|
+
}, D = R({
|
|
26
26
|
colorize: !0,
|
|
27
27
|
destination: process.stdout,
|
|
28
28
|
translateTime: "SYS:yyyy-mm-dd HH:MM:ss",
|
|
29
29
|
ignore: "pid,hostname",
|
|
30
30
|
messageFormat: "{msg}",
|
|
31
31
|
singleLine: !0
|
|
32
|
-
}),
|
|
32
|
+
}), u = N({
|
|
33
33
|
name: process.env.APP_NAME ?? "iBoot",
|
|
34
|
-
level: process.env.NODE_ENV
|
|
34
|
+
level: process.env.NODE_ENV === "production" ? "info" : "debug",
|
|
35
35
|
nestedKey: "payload"
|
|
36
|
-
},
|
|
36
|
+
}, D), w = (o) => Array.isArray(o) || typeof o == "object" && Object.prototype.toString.call(o) === "[object Array]", _ = (o) => {
|
|
37
37
|
const t = o || 32, e = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678", s = e.length;
|
|
38
38
|
let r = "";
|
|
39
39
|
for (let n = 0; n < t; n++)
|
|
40
40
|
r += e.charAt(Math.floor(Math.random() * s));
|
|
41
41
|
return r;
|
|
42
|
-
},
|
|
42
|
+
}, M = (o, t) => {
|
|
43
43
|
const e = {};
|
|
44
44
|
return o.split("&").forEach((r) => {
|
|
45
45
|
const n = r.split("=");
|
|
@@ -76,7 +76,7 @@ const H = {
|
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
return t;
|
|
79
|
-
},
|
|
79
|
+
}, k = "zh-CN", O = "_device_id_key", v = "_current_website_key", S = "Get request error!", I = "Post request error!", T = {
|
|
80
80
|
"Device-Id": "Device-Id",
|
|
81
81
|
Lang: "Lang",
|
|
82
82
|
"Website-Id": "Website-Id",
|
|
@@ -104,7 +104,7 @@ const H = {
|
|
|
104
104
|
const c = s[i];
|
|
105
105
|
c && (e[i] = c);
|
|
106
106
|
}
|
|
107
|
-
|
|
107
|
+
u.debug({
|
|
108
108
|
url: o,
|
|
109
109
|
headers: e
|
|
110
110
|
}, "GET");
|
|
@@ -115,14 +115,14 @@ const H = {
|
|
|
115
115
|
});
|
|
116
116
|
if (r.ok) {
|
|
117
117
|
const i = await r.json();
|
|
118
|
-
return
|
|
118
|
+
return u.debug(i, "GET_RESULT"), i;
|
|
119
119
|
}
|
|
120
120
|
const n = {
|
|
121
121
|
code: r.status,
|
|
122
122
|
success: !1,
|
|
123
123
|
msg: r.statusText
|
|
124
124
|
};
|
|
125
|
-
return
|
|
125
|
+
return u.error(n), n;
|
|
126
126
|
}, C = async (o, t) => {
|
|
127
127
|
const e = t?.data ?? {}, s = t?.headers;
|
|
128
128
|
let r;
|
|
@@ -132,7 +132,7 @@ const H = {
|
|
|
132
132
|
const l = s[a];
|
|
133
133
|
l && n.set(a, l);
|
|
134
134
|
}
|
|
135
|
-
|
|
135
|
+
u.debug({
|
|
136
136
|
url: o,
|
|
137
137
|
headers: n
|
|
138
138
|
}, "POST");
|
|
@@ -143,15 +143,15 @@ const H = {
|
|
|
143
143
|
});
|
|
144
144
|
if (i.ok) {
|
|
145
145
|
const a = await i.json();
|
|
146
|
-
return
|
|
146
|
+
return u.debug(a, "POST_RESULT"), a;
|
|
147
147
|
}
|
|
148
148
|
const c = {
|
|
149
149
|
code: i.status,
|
|
150
150
|
success: !1,
|
|
151
151
|
msg: i.statusText
|
|
152
152
|
};
|
|
153
|
-
return
|
|
154
|
-
},
|
|
153
|
+
return u.error(c), c;
|
|
154
|
+
}, J = async (o, t) => {
|
|
155
155
|
const e = await L(o, t);
|
|
156
156
|
if (e.success)
|
|
157
157
|
return e.data;
|
|
@@ -160,7 +160,7 @@ const H = {
|
|
|
160
160
|
return;
|
|
161
161
|
}
|
|
162
162
|
throw Error(e.msg ?? S);
|
|
163
|
-
},
|
|
163
|
+
}, Y = async (o, t) => {
|
|
164
164
|
const e = await C(o, t);
|
|
165
165
|
if (e.success)
|
|
166
166
|
return e.data;
|
|
@@ -191,21 +191,21 @@ class q {
|
|
|
191
191
|
websiteId;
|
|
192
192
|
websiteNo;
|
|
193
193
|
_isDebug;
|
|
194
|
-
constructor(
|
|
195
|
-
this.
|
|
194
|
+
constructor(t) {
|
|
195
|
+
this._isDebug = process.env.NODE_ENV != "production", u.info(this._isDebug, "isDebug"), this.baseUrl = t.baseUrl, this.apiKey = t.apiKey, this.userFrom = t.userFrom ?? "1", this.helloMethod = t.helloURL ?? "", this.userType = t.userType ?? U.TYPE_MGT, this.deviceId = t.deviceId ?? _(10), this.lang = t.lang ?? k, this.websiteId = t.websiteId, this.websiteNo = t.websiteNo;
|
|
196
196
|
}
|
|
197
197
|
isDebug() {
|
|
198
198
|
return this._isDebug;
|
|
199
199
|
}
|
|
200
200
|
encrypt(t) {
|
|
201
|
-
const e =
|
|
202
|
-
return
|
|
201
|
+
const e = p.enc.Utf8.parse(this.apiKey);
|
|
202
|
+
return p.AES.encrypt(t, e).toString();
|
|
203
203
|
}
|
|
204
204
|
decrypt(t) {
|
|
205
|
-
const e =
|
|
206
|
-
return
|
|
207
|
-
mode:
|
|
208
|
-
}).toString(
|
|
205
|
+
const e = p.enc.Utf8.parse(this.apiKey);
|
|
206
|
+
return p.AES.decrypt(t, e, {
|
|
207
|
+
mode: p.mode.ECB
|
|
208
|
+
}).toString(p.enc.Utf8);
|
|
209
209
|
}
|
|
210
210
|
getDeviceId() {
|
|
211
211
|
return this.deviceId;
|
|
@@ -218,7 +218,7 @@ class q {
|
|
|
218
218
|
if (r && typeof r == "string")
|
|
219
219
|
r = r.trim();
|
|
220
220
|
else if (r && typeof r == "object") {
|
|
221
|
-
if (
|
|
221
|
+
if (w(r)) {
|
|
222
222
|
if (r.length === 0)
|
|
223
223
|
continue;
|
|
224
224
|
for (let n = 0; n < r.length; n++) {
|
|
@@ -227,13 +227,13 @@ class q {
|
|
|
227
227
|
const a = i[c] ?? void 0;
|
|
228
228
|
if (a) {
|
|
229
229
|
if (typeof a == "object")
|
|
230
|
-
|
|
230
|
+
w(a) && a.forEach((l, h) => {
|
|
231
231
|
if (l)
|
|
232
232
|
for (const f in l) {
|
|
233
233
|
const g = l[f];
|
|
234
234
|
if (g && g.toString().length > 0) {
|
|
235
|
-
const
|
|
236
|
-
e.push(s +
|
|
235
|
+
const m = `[${n.toString()}].${c + `[${h.toString()}].${f}`}=${b(g)}`;
|
|
236
|
+
e.push(s + m);
|
|
237
237
|
}
|
|
238
238
|
}
|
|
239
239
|
});
|
|
@@ -272,12 +272,12 @@ class q {
|
|
|
272
272
|
params: n,
|
|
273
273
|
md5: i
|
|
274
274
|
};
|
|
275
|
-
return
|
|
275
|
+
return u.debug(c, "API_SIGN"), i;
|
|
276
276
|
}
|
|
277
277
|
//eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
278
278
|
assemblyParameter(t, e) {
|
|
279
279
|
const s = t ?? {};
|
|
280
|
-
return s.timestamp = Date.now() + "", s.echostr =
|
|
280
|
+
return s.timestamp = Date.now() + "", s.echostr = _(10), s.version = this.version, s.deviceId = this.deviceId, s.webid = this.websiteId, s.apiKey = this.apiKey, e && e.length > 0 && (s.username = e), s;
|
|
281
281
|
}
|
|
282
282
|
async assemblyHeader({ urlParams: t, token: e }) {
|
|
283
283
|
const s = {
|
|
@@ -289,7 +289,7 @@ class q {
|
|
|
289
289
|
"Api-Key": this.apiKey
|
|
290
290
|
};
|
|
291
291
|
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));
|
|
292
|
-
const r =
|
|
292
|
+
const r = M(t), n = await this.sign(r);
|
|
293
293
|
return s.Sign = n, s;
|
|
294
294
|
}
|
|
295
295
|
async helloIboot() {
|
|
@@ -303,7 +303,7 @@ class q {
|
|
|
303
303
|
url: t,
|
|
304
304
|
headers: e
|
|
305
305
|
};
|
|
306
|
-
|
|
306
|
+
u.debug(s, "HELLO");
|
|
307
307
|
const r = await fetch(t, {
|
|
308
308
|
method: "GET",
|
|
309
309
|
headers: e,
|
|
@@ -312,7 +312,7 @@ class q {
|
|
|
312
312
|
});
|
|
313
313
|
if (r.ok) {
|
|
314
314
|
const n = await r.json();
|
|
315
|
-
return
|
|
315
|
+
return u.debug(n.data, "HELLO RESULT"), n.data;
|
|
316
316
|
}
|
|
317
317
|
throw new Error("hello iBoot error!");
|
|
318
318
|
}
|
|
@@ -335,23 +335,23 @@ class q {
|
|
|
335
335
|
url: a,
|
|
336
336
|
headers: c
|
|
337
337
|
};
|
|
338
|
-
|
|
339
|
-
const
|
|
338
|
+
u.info(l, "GET");
|
|
339
|
+
const h = await fetch(a, {
|
|
340
340
|
method: "GET",
|
|
341
341
|
headers: c,
|
|
342
342
|
credentials: "include",
|
|
343
343
|
cache: r
|
|
344
344
|
});
|
|
345
|
-
if (
|
|
346
|
-
const g = await
|
|
347
|
-
return
|
|
345
|
+
if (h.ok) {
|
|
346
|
+
const g = await h.json();
|
|
347
|
+
return u.debug(g, "GET_RESULT"), g;
|
|
348
348
|
}
|
|
349
349
|
const f = {
|
|
350
|
-
code:
|
|
350
|
+
code: h.status,
|
|
351
351
|
success: !1,
|
|
352
|
-
msg:
|
|
352
|
+
msg: h.statusText
|
|
353
353
|
};
|
|
354
|
-
return
|
|
354
|
+
return u.error(f), f;
|
|
355
355
|
}
|
|
356
356
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
357
357
|
async post({ url: t, data: e, token: s, cache: r = "default" }) {
|
|
@@ -360,29 +360,29 @@ class q {
|
|
|
360
360
|
n && delete e.buffer, i && delete e.boundary;
|
|
361
361
|
const c = this.assemblyParameter(e), a = this.convertUrlParameter(c), l = await this.assemblyHeader({ urlParams: a, token: s });
|
|
362
362
|
n && i && (l["Content-Type"] = `multipart/form-data; boundary=${i}`);
|
|
363
|
-
const
|
|
364
|
-
url:
|
|
363
|
+
const h = this.getApiUrl(t), f = {
|
|
364
|
+
url: h,
|
|
365
365
|
headers: l,
|
|
366
366
|
params: c
|
|
367
367
|
};
|
|
368
|
-
|
|
369
|
-
const g = n ? `${
|
|
368
|
+
u.info(f, "POST");
|
|
369
|
+
const g = n ? `${h}?${a}` : h, m = await fetch(g, {
|
|
370
370
|
method: "POST",
|
|
371
371
|
headers: l,
|
|
372
372
|
body: n || a.toString(),
|
|
373
373
|
credentials: "include",
|
|
374
374
|
cache: r
|
|
375
375
|
});
|
|
376
|
-
if (
|
|
377
|
-
const E = await
|
|
378
|
-
return
|
|
376
|
+
if (m.ok) {
|
|
377
|
+
const E = await m.json();
|
|
378
|
+
return u.debug(E, "POST_RESULT"), E;
|
|
379
379
|
}
|
|
380
380
|
const y = {
|
|
381
|
-
code:
|
|
381
|
+
code: m.status,
|
|
382
382
|
success: !1,
|
|
383
|
-
msg:
|
|
383
|
+
msg: m.statusText
|
|
384
384
|
};
|
|
385
|
-
return
|
|
385
|
+
return u.error(y), y;
|
|
386
386
|
}
|
|
387
387
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
388
388
|
async stream({ url: t, data: e, token: s }) {
|
|
@@ -393,13 +393,13 @@ class q {
|
|
|
393
393
|
r && n && (a["Content-Type"] = `multipart/form-data; boundary=${n}`), a.Connection = "keep-alive", a["X-Accel-Buffering"] = "no", a["Cache-Control"] = "no-cache";
|
|
394
394
|
const l = this.getApiUrl(t);
|
|
395
395
|
try {
|
|
396
|
-
const
|
|
396
|
+
const h = r ? `${l}?${c}` : l, f = {
|
|
397
397
|
url: l,
|
|
398
398
|
headers: a,
|
|
399
399
|
params: i
|
|
400
400
|
};
|
|
401
|
-
|
|
402
|
-
const g = await fetch(
|
|
401
|
+
u.info(f, "STREAM");
|
|
402
|
+
const g = await fetch(h, {
|
|
403
403
|
method: "POST",
|
|
404
404
|
headers: a,
|
|
405
405
|
body: r || c.toString(),
|
|
@@ -416,8 +416,8 @@ class q {
|
|
|
416
416
|
Connection: "keep-alive"
|
|
417
417
|
}
|
|
418
418
|
});
|
|
419
|
-
} catch (
|
|
420
|
-
throw
|
|
419
|
+
} catch (h) {
|
|
420
|
+
throw h;
|
|
421
421
|
}
|
|
422
422
|
}
|
|
423
423
|
getUserInfo(t) {
|
|
@@ -452,17 +452,17 @@ class q {
|
|
|
452
452
|
};
|
|
453
453
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
454
454
|
setToken(t, e) {
|
|
455
|
-
const { id: s, name: r, username: n, nickname: i, sex: c, headImg: a, token: l, lastLoginTime:
|
|
455
|
+
const { id: s, name: r, username: n, nickname: i, sex: c, headImg: a, token: l, lastLoginTime: h, tokenExpired: f, deviceId: g, userType: m, mustChangePwd: y } = t, E = {
|
|
456
456
|
id: s,
|
|
457
457
|
name: r,
|
|
458
458
|
username: n,
|
|
459
459
|
nickname: i,
|
|
460
460
|
sex: c,
|
|
461
461
|
headImg: a,
|
|
462
|
-
lastLoginTime:
|
|
462
|
+
lastLoginTime: h,
|
|
463
463
|
tokenExpired: f,
|
|
464
464
|
deviceId: g,
|
|
465
|
-
userType:
|
|
465
|
+
userType: m,
|
|
466
466
|
status: 0,
|
|
467
467
|
accountType: 0,
|
|
468
468
|
enabled: !1,
|
|
@@ -499,7 +499,7 @@ class q {
|
|
|
499
499
|
export {
|
|
500
500
|
H as ACCOUNT_TYPE_MAP,
|
|
501
501
|
v as CURRENT_WEBSITE_KEY,
|
|
502
|
-
|
|
502
|
+
k as DEFAULT_LOCALE,
|
|
503
503
|
O as DEVICE_ID_KEY,
|
|
504
504
|
q as HttpClient,
|
|
505
505
|
j as USER_FORM_MAP,
|
|
@@ -509,15 +509,15 @@ export {
|
|
|
509
509
|
L as get,
|
|
510
510
|
X as getHttpClientOpts,
|
|
511
511
|
z as getHttpClientOptsByCookie,
|
|
512
|
-
|
|
513
|
-
|
|
512
|
+
J as iGet,
|
|
513
|
+
Y as iPost,
|
|
514
514
|
V as iPostSuccess,
|
|
515
|
-
|
|
516
|
-
|
|
515
|
+
w as isArray,
|
|
516
|
+
u as logger,
|
|
517
517
|
C as post,
|
|
518
|
-
|
|
518
|
+
_ as randomString,
|
|
519
519
|
G as setDefaultRequestHeader,
|
|
520
520
|
b as urlEncode,
|
|
521
|
-
|
|
521
|
+
M as urlParamToJson
|
|
522
522
|
};
|
|
523
523
|
//# 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\nimport PinoPretty from \"pino-pretty\";\r\n// import koffi from 'koffi';\r\n\r\n// if (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\n// export 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// });\r\n\r\nconst stream = PinoPretty({\r\n colorize: true,\r\n destination: process.stdout,\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\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}, stream);","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\r\nexport const dateFormat = (dt: Date, fmt: string) => {\r\n const o:Record<string, number> = {\r\n \"M+\": dt.getMonth() + 1, //月份\r\n \"d+\": dt.getDate(), //日\r\n \"h+\": dt.getHours(), //小时\r\n \"m+\": dt.getMinutes(), //分\r\n \"s+\": dt.getSeconds(), //秒\r\n \"q+\": Math.floor((dt.getMonth() + 3) / 3), //季度\r\n S: dt.getMilliseconds(), //毫秒\r\n };\r\n if (/(y+)/.test(fmt)){\r\n const regx = new RegExp(/(y+)/);\r\n const value = regx.exec(fmt);\r\n let len = 0;\r\n if(value && value.length > 0){\r\n len = value[0].length;\r\n }\r\n fmt = fmt.replace(/(y+)/, dt.getFullYear() + \"\").substring(4 - len);\r\n }\r\n\r\n for (const k in o){\r\n const s:string = \"(\" + k + \")\";\r\n const regx = new RegExp(s);\r\n if(regx.test(fmt)){\r\n const value = regx.exec(fmt);\r\n let len = 0;\r\n if(value && value.length > 0){\r\n len = value[0].length;\r\n }\r\n fmt = fmt.replace(regx, len == 1 ? o[k].toString() : (\"00\" + o[k]).substring(o[k].toString().length))\r\n }\r\n }\r\n return fmt;\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","stream","PinoPretty","logger","pino","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","dateFormat","dt","fmt","o","k","s","regx","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","v","arr_item","item_field","item_field_value","item1","index","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 PinoPretty from \"pino-pretty\";\r\n// import koffi from 'koffi';\r\n\r\n// if (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\n// export 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// });\r\n\r\nconst stream = PinoPretty({\r\n colorize: true,\r\n destination: process.stdout,\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\nexport const logger = pino({\r\n name: process.env.APP_NAME ?? 'iBoot',\r\n level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',\r\n nestedKey: 'payload'\r\n}, stream);","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\r\nexport const dateFormat = (dt: Date, fmt: string) => {\r\n const o:Record<string, number> = {\r\n \"M+\": dt.getMonth() + 1, //月份\r\n \"d+\": dt.getDate(), //日\r\n \"h+\": dt.getHours(), //小时\r\n \"m+\": dt.getMinutes(), //分\r\n \"s+\": dt.getSeconds(), //秒\r\n \"q+\": Math.floor((dt.getMonth() + 3) / 3), //季度\r\n S: dt.getMilliseconds(), //毫秒\r\n };\r\n if (/(y+)/.test(fmt)){\r\n const regx = new RegExp(/(y+)/);\r\n const value = regx.exec(fmt);\r\n let len = 0;\r\n if(value && value.length > 0){\r\n len = value[0].length;\r\n }\r\n fmt = fmt.replace(/(y+)/, dt.getFullYear() + \"\").substring(4 - len);\r\n }\r\n\r\n for (const k in o){\r\n const s:string = \"(\" + k + \")\";\r\n const regx = new RegExp(s);\r\n if(regx.test(fmt)){\r\n const value = regx.exec(fmt);\r\n let len = 0;\r\n if(value && value.length > 0){\r\n len = value[0].length;\r\n }\r\n fmt = fmt.replace(regx, len == 1 ? o[k].toString() : (\"00\" + o[k]).substring(o[k].toString().length))\r\n }\r\n }\r\n return fmt;\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 HttpEnvOpts,\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(opts: Readonly<HttpClientOpts & HttpEnvOpts>) {\r\n this._isDebug = process.env.NODE_ENV != 'production';\r\n logger.info(this._isDebug, \"isDebug\");\r\n \r\n this.baseUrl = opts.baseUrl;\r\n this.apiKey = opts.apiKey;\r\n this.userFrom = opts.userFrom ?? '1';\r\n \r\n this.helloMethod = opts.helloURL ?? ''\r\n this.userType = opts.userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.deviceId = opts.deviceId ?? randomString(10);\r\n this.lang = opts.lang ?? DEFAULT_LOCALE;\r\n this.websiteId = opts.websiteId\r\n this.websiteNo = opts.websiteNo\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","stream","PinoPretty","logger","pino","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","dateFormat","dt","fmt","o","k","s","regx","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","key","CryptoJS","p","v","arr_item","item_field","item_field_value","item1","index","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","userType","mustChangePwd","loginUser"],"mappings":"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"}
|