@anjianshi/utils 3.0.0 → 3.0.1
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/env-browser/device.d.ts +24 -0
- package/env-browser/device.js +50 -0
- package/env-browser/global.d.ts +10 -0
- package/env-browser/global.js +15 -0
- package/env-browser/load-script.d.ts +5 -0
- package/env-browser/load-script.js +13 -0
- package/env-browser/logging.d.ts +18 -0
- package/env-browser/logging.js +49 -0
- package/env-browser/manage-vconsole.d.ts +16 -0
- package/env-browser/manage-vconsole.js +38 -0
- package/env-node/crypto-random.d.ts +13 -0
- package/env-node/crypto-random.js +28 -0
- package/env-node/fs.d.ts +19 -0
- package/env-node/fs.js +48 -0
- package/env-node/index.d.ts +5 -0
- package/env-node/index.js +5 -0
- package/env-node/logging/handlers.d.ts +58 -0
- package/env-node/logging/handlers.js +154 -0
- package/env-node/logging/index.d.ts +11 -0
- package/env-node/logging/index.js +14 -0
- package/{src/env-react/emotion-register-globals.ts → env-react/emotion-register-globals.d.ts} +2 -5
- package/env-react/emotion-register-globals.js +5 -0
- package/env-react/emotion.d.ts +20 -0
- package/env-react/emotion.jsx +34 -0
- package/env-react/hooks.d.ts +23 -0
- package/env-react/hooks.js +47 -0
- package/env-react/index.d.ts +1 -0
- package/env-react/index.js +1 -0
- package/env-react/react-register-globals.d.ts +21 -0
- package/env-react/react-register-globals.js +19 -0
- package/env-service/controllers.d.ts +30 -0
- package/env-service/controllers.js +41 -0
- package/env-service/env-reader.d.ts +55 -0
- package/env-service/env-reader.js +79 -0
- package/env-service/index.d.ts +6 -0
- package/env-service/index.js +6 -0
- package/env-service/prisma/adapt-logging.d.ts +21 -0
- package/env-service/prisma/adapt-logging.js +30 -0
- package/env-service/prisma/extensions/exist.d.ts +10 -0
- package/env-service/prisma/extensions/exist.js +16 -0
- package/env-service/prisma/extensions/find-and-count.d.ts +7 -0
- package/env-service/prisma/extensions/find-and-count.js +19 -0
- package/env-service/prisma/extensions/soft-delete.d.ts +52 -0
- package/env-service/prisma/extensions/soft-delete.js +123 -0
- package/env-service/prisma/extensions/with-transaction.d.ts +9 -0
- package/env-service/prisma/extensions/with-transaction.js +54 -0
- package/env-service/prisma/index.d.ts +6 -0
- package/env-service/prisma/index.js +6 -0
- package/env-service/prisma/transaction-contexted.d.ts +11 -0
- package/env-service/prisma/transaction-contexted.js +52 -0
- package/env-service/redis-cache.d.ts +39 -0
- package/env-service/redis-cache.js +116 -0
- package/env-service/tasks.d.ts +12 -0
- package/env-service/tasks.js +37 -0
- package/index.d.ts +4 -0
- package/index.js +4 -0
- package/init-dayjs.d.ts +2 -0
- package/init-dayjs.js +7 -0
- package/lang/async.d.ts +19 -0
- package/lang/async.js +34 -0
- package/lang/color.d.ts +37 -0
- package/lang/color.js +111 -0
- package/lang/index.d.ts +8 -0
- package/lang/index.js +8 -0
- package/lang/object.d.ts +12 -0
- package/lang/object.js +41 -0
- package/lang/random.d.ts +13 -0
- package/lang/random.js +24 -0
- package/lang/result.d.ts +47 -0
- package/lang/result.js +45 -0
- package/lang/string.d.ts +29 -0
- package/lang/string.js +92 -0
- package/lang/time.d.ts +10 -0
- package/lang/time.js +18 -0
- package/{src/lang/types.ts → lang/types.d.ts} +23 -43
- package/lang/types.js +28 -0
- package/logging/adapt.d.ts +10 -0
- package/logging/adapt.js +43 -0
- package/logging/formatters.d.ts +10 -0
- package/logging/formatters.js +22 -0
- package/logging/index.d.ts +45 -0
- package/logging/index.js +90 -0
- package/md5.d.ts +30 -0
- package/md5.js +308 -0
- package/package.json +10 -19
- package/safe-request.d.ts +53 -0
- package/safe-request.js +140 -0
- package/url.d.ts +77 -0
- package/url.js +149 -0
- package/validators/array.d.ts +30 -0
- package/validators/array.js +47 -0
- package/validators/base.d.ts +82 -0
- package/validators/base.js +42 -0
- package/validators/boolean.d.ts +3 -0
- package/validators/boolean.js +22 -0
- package/validators/datetime.d.ts +12 -0
- package/validators/datetime.js +30 -0
- package/validators/factory.d.ts +70 -0
- package/validators/factory.js +121 -0
- package/validators/index.d.ts +9 -0
- package/validators/index.js +9 -0
- package/validators/number.d.ts +19 -0
- package/validators/number.js +26 -0
- package/validators/object.d.ts +28 -0
- package/validators/object.js +49 -0
- package/validators/one-of.d.ts +10 -0
- package/validators/one-of.js +15 -0
- package/validators/string.d.ts +22 -0
- package/validators/string.js +35 -0
- package/README.md +0 -10
- package/eslint.config.cjs +0 -33
- package/publish-prepare.cjs +0 -16
- package/src/env-browser/device.ts +0 -62
- package/src/env-browser/global.ts +0 -21
- package/src/env-browser/load-script.ts +0 -13
- package/src/env-browser/logging.ts +0 -58
- package/src/env-browser/manage-vconsole.ts +0 -54
- package/src/env-node/crypto-random.ts +0 -30
- package/src/env-node/fs.ts +0 -50
- package/src/env-node/index.ts +0 -5
- package/src/env-node/logging/handlers.ts +0 -190
- package/src/env-node/logging/index.ts +0 -16
- package/src/env-react/emotion.tsx +0 -42
- package/src/env-react/hooks.ts +0 -59
- package/src/env-react/index.ts +0 -1
- package/src/env-react/react-register-globals.ts +0 -53
- package/src/env-service/controllers.ts +0 -93
- package/src/env-service/env-reader.ts +0 -141
- package/src/env-service/index.ts +0 -6
- package/src/env-service/prisma/adapt-logging.ts +0 -39
- package/src/env-service/prisma/extensions/exist.ts +0 -21
- package/src/env-service/prisma/extensions/find-and-count.ts +0 -24
- package/src/env-service/prisma/extensions/soft-delete.ts +0 -162
- package/src/env-service/prisma/extensions/with-transaction.ts +0 -65
- package/src/env-service/prisma/index.ts +0 -6
- package/src/env-service/prisma/transaction-contexted.ts +0 -80
- package/src/env-service/redis-cache.ts +0 -142
- package/src/env-service/tasks.ts +0 -45
- package/src/index.ts +0 -4
- package/src/init-dayjs.ts +0 -8
- package/src/lang/async.ts +0 -47
- package/src/lang/color.ts +0 -119
- package/src/lang/index.ts +0 -8
- package/src/lang/object.ts +0 -39
- package/src/lang/random.ts +0 -25
- package/src/lang/result.ts +0 -78
- package/src/lang/string.ts +0 -95
- package/src/lang/time.ts +0 -19
- package/src/logging/adapt.ts +0 -49
- package/src/logging/formatters.ts +0 -23
- package/src/logging/index.ts +0 -106
- package/src/md5.ts +0 -318
- package/src/safe-request.ts +0 -193
- package/src/url.ts +0 -185
- package/src/validators/array.ts +0 -97
- package/src/validators/base.ts +0 -145
- package/src/validators/boolean.ts +0 -21
- package/src/validators/datetime.ts +0 -39
- package/src/validators/factory.ts +0 -244
- package/src/validators/index.ts +0 -9
- package/src/validators/number.ts +0 -54
- package/src/validators/object.ts +0 -101
- package/src/validators/one-of.ts +0 -33
- package/src/validators/string.ts +0 -72
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 日志常用数据的格式化函数
|
|
3
|
-
*/
|
|
4
|
-
import { type LogInfo, LogLevel } from './index.js'
|
|
5
|
-
|
|
6
|
-
const formatters = {
|
|
7
|
-
time(info: LogInfo) {
|
|
8
|
-
return info.time.format('HH:mm:ss.SSS')
|
|
9
|
-
},
|
|
10
|
-
datetime(info: LogInfo) {
|
|
11
|
-
return info.time.format('YY-MM-DD HH:mm:ss.SSS')
|
|
12
|
-
},
|
|
13
|
-
level(info: LogInfo) {
|
|
14
|
-
const map = {
|
|
15
|
-
[LogLevel.Debug]: 'debug',
|
|
16
|
-
[LogLevel.Info]: 'info',
|
|
17
|
-
[LogLevel.Warning]: 'warn',
|
|
18
|
-
[LogLevel.Error]: 'error',
|
|
19
|
-
}
|
|
20
|
-
return map[info.level]
|
|
21
|
-
},
|
|
22
|
-
}
|
|
23
|
-
export default formatters
|
package/src/logging/index.ts
DELETED
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import dayjs, { type Dayjs } from 'dayjs'
|
|
2
|
-
export { default as formatters } from './formatters.js'
|
|
3
|
-
export * from './adapt.js'
|
|
4
|
-
import { initDayJs } from '../init-dayjs.js'
|
|
5
|
-
|
|
6
|
-
// 引入 logging 库会自动初始化 dayjs
|
|
7
|
-
initDayJs()
|
|
8
|
-
|
|
9
|
-
export enum LogLevel {
|
|
10
|
-
Debug = 1,
|
|
11
|
-
Info = 2,
|
|
12
|
-
Warning = 3,
|
|
13
|
-
Error = 4,
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export const logLevelMap: Record<string, LogLevel> = {
|
|
17
|
-
debug: LogLevel.Debug,
|
|
18
|
-
info: LogLevel.Info,
|
|
19
|
-
warn: LogLevel.Warning,
|
|
20
|
-
warning: LogLevel.Warning,
|
|
21
|
-
err: LogLevel.Error,
|
|
22
|
-
error: LogLevel.Error,
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export interface LogInfo {
|
|
26
|
-
logger: string // logger name;有多级 logger 的情况下,这是最初的 logger 名称
|
|
27
|
-
level: LogLevel
|
|
28
|
-
time: Dayjs
|
|
29
|
-
args: unknown[] // log content
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export class LogHandler {
|
|
33
|
-
log(info: LogInfo) {} // eslint-disable-line @typescript-eslint/no-unused-vars
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export class Logger {
|
|
37
|
-
level = LogLevel.Info
|
|
38
|
-
handlers = new Set<LogHandler>()
|
|
39
|
-
|
|
40
|
-
constructor(
|
|
41
|
-
public name = '',
|
|
42
|
-
public base: Logger | null = null, // 指定上级 logger,当前 logger 记录的日志也会传递给上级
|
|
43
|
-
) {}
|
|
44
|
-
|
|
45
|
-
static getRealLevel(raw: LogLevel | string) {
|
|
46
|
-
if (typeof raw === 'string') {
|
|
47
|
-
raw = raw.toLowerCase()
|
|
48
|
-
if (logLevelMap[raw] === undefined) throw new Error('Not supported log level: ' + raw)
|
|
49
|
-
return logLevelMap[raw]!
|
|
50
|
-
}
|
|
51
|
-
return raw
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
setLevel(level: LogLevel | string) {
|
|
55
|
-
this.level = Logger.getRealLevel(level)
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
addHandler(handler: LogHandler) {
|
|
59
|
-
this.handlers.add(handler)
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* 创建一个以当前 logger 为 base 的 child logger
|
|
64
|
-
*/
|
|
65
|
-
getChild(name: string) {
|
|
66
|
-
const fullname = this.name ? `${this.name}/${name}` : name
|
|
67
|
-
type Constructor = new (...args: ConstructorParameters<typeof Logger>) => Logger
|
|
68
|
-
// 这里加上 `as this` 才能让 TypeScript 判定,对继承了 Logger 的类调用此方法时,返回的是那个类而不是原始的 Logger 类的实例
|
|
69
|
-
return new (this.constructor as Constructor)(fullname, this) as this
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
log(level: LogLevel | string, args: unknown[]) {
|
|
73
|
-
level = Logger.getRealLevel(level)
|
|
74
|
-
this.logByInfo({ logger: this.name, level, time: dayjs(), args })
|
|
75
|
-
}
|
|
76
|
-
protected logByInfo(info: LogInfo) {
|
|
77
|
-
if (this.base) this.base.logByInfo(info)
|
|
78
|
-
if (this.level > info.level) return
|
|
79
|
-
for (const handler of this.handlers) {
|
|
80
|
-
handler.log(info)
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
debug(...args: any[]) {
|
|
85
|
-
this.log(LogLevel.Debug, args)
|
|
86
|
-
}
|
|
87
|
-
info(...args: any[]) {
|
|
88
|
-
this.log(LogLevel.Info, args)
|
|
89
|
-
}
|
|
90
|
-
warn(...args: any[]) {
|
|
91
|
-
this.log(LogLevel.Warning, args)
|
|
92
|
-
}
|
|
93
|
-
error(...args: any[]) {
|
|
94
|
-
this.log(LogLevel.Error, args)
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* 提供一套默认配置好的 logger
|
|
100
|
-
*/
|
|
101
|
-
const defaultLogger = new Logger()
|
|
102
|
-
export { defaultLogger as logger }
|
|
103
|
-
|
|
104
|
-
export function getLogger(name: string) {
|
|
105
|
-
return defaultLogger.getChild(name)
|
|
106
|
-
}
|
package/src/md5.ts
DELETED
|
@@ -1,318 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-multi-assign */
|
|
2
|
-
/**
|
|
3
|
-
* MD5 算法来自:https://github.com/emn178/js-md5
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
export function md5(content: string | ArrayBuffer) {
|
|
7
|
-
const md5 = new MD5()
|
|
8
|
-
md5.update(content)
|
|
9
|
-
return md5.hex()
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
// -------------------------------------------------------------------
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* 使用方法:
|
|
16
|
-
* const md5 = new MD5()
|
|
17
|
-
* md5.update(xxx) // 对于大文件,可以拆分开,多次调用 md5.update()
|
|
18
|
-
* const hash = md5.hex()
|
|
19
|
-
*/
|
|
20
|
-
export class MD5 {
|
|
21
|
-
private readonly buffer8: Uint8Array
|
|
22
|
-
private readonly blocks: Uint32Array
|
|
23
|
-
|
|
24
|
-
private h0 = 0
|
|
25
|
-
private h1 = 0
|
|
26
|
-
private h2 = 0
|
|
27
|
-
private h3 = 0
|
|
28
|
-
private start = 0
|
|
29
|
-
private bytes = 0
|
|
30
|
-
private hBytes = 0
|
|
31
|
-
private lastByteIndex = 0
|
|
32
|
-
|
|
33
|
-
private finalized = false
|
|
34
|
-
private hashed = false
|
|
35
|
-
private first = true
|
|
36
|
-
|
|
37
|
-
constructor() {
|
|
38
|
-
const buffer = new ArrayBuffer(68)
|
|
39
|
-
this.buffer8 = new Uint8Array(buffer)
|
|
40
|
-
this.blocks = new Uint32Array(buffer)
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
update(message: string | number[] | Uint8Array | ArrayBuffer) {
|
|
44
|
-
if (this.finalized) return
|
|
45
|
-
|
|
46
|
-
if (message instanceof ArrayBuffer) {
|
|
47
|
-
message = new Uint8Array(message)
|
|
48
|
-
}
|
|
49
|
-
if (typeof message !== 'string' && !Array.isArray(message) && !ArrayBuffer.isView(message)) {
|
|
50
|
-
throw new Error('input is invalid type')
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const length = message.length
|
|
54
|
-
const { blocks, buffer8 } = this
|
|
55
|
-
|
|
56
|
-
let code: number
|
|
57
|
-
let index = 0
|
|
58
|
-
let i: number
|
|
59
|
-
|
|
60
|
-
while (index < length) {
|
|
61
|
-
if (this.hashed) {
|
|
62
|
-
this.hashed = false
|
|
63
|
-
blocks[0] = blocks[16]!
|
|
64
|
-
// prettier-ignore
|
|
65
|
-
blocks[16] = blocks[1] = blocks[2] = blocks[3] = blocks[4] = blocks[5] =
|
|
66
|
-
blocks[6] = blocks[7] = blocks[8] = blocks[9] = blocks[10] =
|
|
67
|
-
blocks[11] = blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
if (typeof message !== 'string') {
|
|
71
|
-
for (i = this.start; index < length && i < 64; ++index) {
|
|
72
|
-
buffer8[i++] = message[index]!
|
|
73
|
-
}
|
|
74
|
-
} else {
|
|
75
|
-
for (i = this.start; index < length && i < 64; ++index) {
|
|
76
|
-
code = message.charCodeAt(index)
|
|
77
|
-
if (code < 0x80) {
|
|
78
|
-
buffer8[i++] = code
|
|
79
|
-
} else if (code < 0x800) {
|
|
80
|
-
buffer8[i++] = 0xc0 | (code >> 6)
|
|
81
|
-
buffer8[i++] = 0x80 | (code & 0x3f)
|
|
82
|
-
} else if (code < 0xd800 || code >= 0xe000) {
|
|
83
|
-
buffer8[i++] = 0xe0 | (code >> 12)
|
|
84
|
-
buffer8[i++] = 0x80 | ((code >> 6) & 0x3f)
|
|
85
|
-
buffer8[i++] = 0x80 | (code & 0x3f)
|
|
86
|
-
} else {
|
|
87
|
-
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff))
|
|
88
|
-
buffer8[i++] = 0xf0 | (code >> 18)
|
|
89
|
-
buffer8[i++] = 0x80 | ((code >> 12) & 0x3f)
|
|
90
|
-
buffer8[i++] = 0x80 | ((code >> 6) & 0x3f)
|
|
91
|
-
buffer8[i++] = 0x80 | (code & 0x3f)
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
this.lastByteIndex = i
|
|
96
|
-
this.bytes += i - this.start
|
|
97
|
-
if (i >= 64) {
|
|
98
|
-
this.start = i - 64
|
|
99
|
-
this.hash()
|
|
100
|
-
this.hashed = true
|
|
101
|
-
} else {
|
|
102
|
-
this.start = i
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
if (this.bytes > 4294967295) {
|
|
106
|
-
this.hBytes += (this.bytes / 4294967296) << 0
|
|
107
|
-
this.bytes = this.bytes % 4294967296
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
private finalize() {
|
|
112
|
-
if (this.finalized) return
|
|
113
|
-
this.finalized = true
|
|
114
|
-
const { blocks } = this
|
|
115
|
-
const i = this.lastByteIndex
|
|
116
|
-
const EXTRA = [128, 32768, 8388608, -2147483648]
|
|
117
|
-
blocks[i >> 2]! |= EXTRA[i & 3]!
|
|
118
|
-
if (i >= 56) {
|
|
119
|
-
if (!this.hashed) this.hash()
|
|
120
|
-
blocks[0] = blocks[16]!
|
|
121
|
-
// prettier-ignore
|
|
122
|
-
blocks[16] = blocks[1] = blocks[2] = blocks[3] = blocks[4] = blocks[5] =
|
|
123
|
-
blocks[6] = blocks[7] = blocks[8] = blocks[9] = blocks[10] =
|
|
124
|
-
blocks[11] = blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0
|
|
125
|
-
}
|
|
126
|
-
blocks[14] = this.bytes << 3
|
|
127
|
-
blocks[15] = (this.hBytes << 3) | (this.bytes >>> 29)
|
|
128
|
-
this.hash()
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
private hash() {
|
|
132
|
-
let a: number, b: number, c: number, d: number, bc: number, da: number
|
|
133
|
-
const { blocks } = this
|
|
134
|
-
|
|
135
|
-
if (this.first) {
|
|
136
|
-
a = blocks[0]! - 680876937
|
|
137
|
-
a = (((a << 7) | (a >>> 25)) - 271733879) << 0
|
|
138
|
-
d = (-1732584194 ^ (a & 2004318071)) + blocks[1]! - 117830708
|
|
139
|
-
d = (((d << 12) | (d >>> 20)) + a) << 0
|
|
140
|
-
c = (-271733879 ^ (d & (a ^ -271733879))) + blocks[2]! - 1126478375
|
|
141
|
-
c = (((c << 17) | (c >>> 15)) + d) << 0
|
|
142
|
-
b = (a ^ (c & (d ^ a))) + blocks[3]! - 1316259209
|
|
143
|
-
b = (((b << 22) | (b >>> 10)) + c) << 0
|
|
144
|
-
} else {
|
|
145
|
-
a = this.h0
|
|
146
|
-
b = this.h1
|
|
147
|
-
c = this.h2
|
|
148
|
-
d = this.h3
|
|
149
|
-
a += (d ^ (b & (c ^ d))) + blocks[0]! - 680876936
|
|
150
|
-
a = (((a << 7) | (a >>> 25)) + b) << 0
|
|
151
|
-
d += (c ^ (a & (b ^ c))) + blocks[1]! - 389564586
|
|
152
|
-
d = (((d << 12) | (d >>> 20)) + a) << 0
|
|
153
|
-
c += (b ^ (d & (a ^ b))) + blocks[2]! + 606105819
|
|
154
|
-
c = (((c << 17) | (c >>> 15)) + d) << 0
|
|
155
|
-
b += (a ^ (c & (d ^ a))) + blocks[3]! - 1044525330
|
|
156
|
-
b = (((b << 22) | (b >>> 10)) + c) << 0
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
a += (d ^ (b & (c ^ d))) + blocks[4]! - 176418897
|
|
160
|
-
a = (((a << 7) | (a >>> 25)) + b) << 0
|
|
161
|
-
d += (c ^ (a & (b ^ c))) + blocks[5]! + 1200080426
|
|
162
|
-
d = (((d << 12) | (d >>> 20)) + a) << 0
|
|
163
|
-
c += (b ^ (d & (a ^ b))) + blocks[6]! - 1473231341
|
|
164
|
-
c = (((c << 17) | (c >>> 15)) + d) << 0
|
|
165
|
-
b += (a ^ (c & (d ^ a))) + blocks[7]! - 45705983
|
|
166
|
-
b = (((b << 22) | (b >>> 10)) + c) << 0
|
|
167
|
-
a += (d ^ (b & (c ^ d))) + blocks[8]! + 1770035416
|
|
168
|
-
a = (((a << 7) | (a >>> 25)) + b) << 0
|
|
169
|
-
d += (c ^ (a & (b ^ c))) + blocks[9]! - 1958414417
|
|
170
|
-
d = (((d << 12) | (d >>> 20)) + a) << 0
|
|
171
|
-
c += (b ^ (d & (a ^ b))) + blocks[10]! - 42063
|
|
172
|
-
c = (((c << 17) | (c >>> 15)) + d) << 0
|
|
173
|
-
b += (a ^ (c & (d ^ a))) + blocks[11]! - 1990404162
|
|
174
|
-
b = (((b << 22) | (b >>> 10)) + c) << 0
|
|
175
|
-
a += (d ^ (b & (c ^ d))) + blocks[12]! + 1804603682
|
|
176
|
-
a = (((a << 7) | (a >>> 25)) + b) << 0
|
|
177
|
-
d += (c ^ (a & (b ^ c))) + blocks[13]! - 40341101
|
|
178
|
-
d = (((d << 12) | (d >>> 20)) + a) << 0
|
|
179
|
-
c += (b ^ (d & (a ^ b))) + blocks[14]! - 1502002290
|
|
180
|
-
c = (((c << 17) | (c >>> 15)) + d) << 0
|
|
181
|
-
b += (a ^ (c & (d ^ a))) + blocks[15]! + 1236535329
|
|
182
|
-
b = (((b << 22) | (b >>> 10)) + c) << 0
|
|
183
|
-
a += (c ^ (d & (b ^ c))) + blocks[1]! - 165796510
|
|
184
|
-
a = (((a << 5) | (a >>> 27)) + b) << 0
|
|
185
|
-
d += (b ^ (c & (a ^ b))) + blocks[6]! - 1069501632
|
|
186
|
-
d = (((d << 9) | (d >>> 23)) + a) << 0
|
|
187
|
-
c += (a ^ (b & (d ^ a))) + blocks[11]! + 643717713
|
|
188
|
-
c = (((c << 14) | (c >>> 18)) + d) << 0
|
|
189
|
-
b += (d ^ (a & (c ^ d))) + blocks[0]! - 373897302
|
|
190
|
-
b = (((b << 20) | (b >>> 12)) + c) << 0
|
|
191
|
-
a += (c ^ (d & (b ^ c))) + blocks[5]! - 701558691
|
|
192
|
-
a = (((a << 5) | (a >>> 27)) + b) << 0
|
|
193
|
-
d += (b ^ (c & (a ^ b))) + blocks[10]! + 38016083
|
|
194
|
-
d = (((d << 9) | (d >>> 23)) + a) << 0
|
|
195
|
-
c += (a ^ (b & (d ^ a))) + blocks[15]! - 660478335
|
|
196
|
-
c = (((c << 14) | (c >>> 18)) + d) << 0
|
|
197
|
-
b += (d ^ (a & (c ^ d))) + blocks[4]! - 405537848
|
|
198
|
-
b = (((b << 20) | (b >>> 12)) + c) << 0
|
|
199
|
-
a += (c ^ (d & (b ^ c))) + blocks[9]! + 568446438
|
|
200
|
-
a = (((a << 5) | (a >>> 27)) + b) << 0
|
|
201
|
-
d += (b ^ (c & (a ^ b))) + blocks[14]! - 1019803690
|
|
202
|
-
d = (((d << 9) | (d >>> 23)) + a) << 0
|
|
203
|
-
c += (a ^ (b & (d ^ a))) + blocks[3]! - 187363961
|
|
204
|
-
c = (((c << 14) | (c >>> 18)) + d) << 0
|
|
205
|
-
b += (d ^ (a & (c ^ d))) + blocks[8]! + 1163531501
|
|
206
|
-
b = (((b << 20) | (b >>> 12)) + c) << 0
|
|
207
|
-
a += (c ^ (d & (b ^ c))) + blocks[13]! - 1444681467
|
|
208
|
-
a = (((a << 5) | (a >>> 27)) + b) << 0
|
|
209
|
-
d += (b ^ (c & (a ^ b))) + blocks[2]! - 51403784
|
|
210
|
-
d = (((d << 9) | (d >>> 23)) + a) << 0
|
|
211
|
-
c += (a ^ (b & (d ^ a))) + blocks[7]! + 1735328473
|
|
212
|
-
c = (((c << 14) | (c >>> 18)) + d) << 0
|
|
213
|
-
b += (d ^ (a & (c ^ d))) + blocks[12]! - 1926607734
|
|
214
|
-
b = (((b << 20) | (b >>> 12)) + c) << 0
|
|
215
|
-
bc = b ^ c
|
|
216
|
-
a += (bc ^ d) + blocks[5]! - 378558
|
|
217
|
-
a = (((a << 4) | (a >>> 28)) + b) << 0
|
|
218
|
-
d += (bc ^ a) + blocks[8]! - 2022574463
|
|
219
|
-
d = (((d << 11) | (d >>> 21)) + a) << 0
|
|
220
|
-
da = d ^ a
|
|
221
|
-
c += (da ^ b) + blocks[11]! + 1839030562
|
|
222
|
-
c = (((c << 16) | (c >>> 16)) + d) << 0
|
|
223
|
-
b += (da ^ c) + blocks[14]! - 35309556
|
|
224
|
-
b = (((b << 23) | (b >>> 9)) + c) << 0
|
|
225
|
-
bc = b ^ c
|
|
226
|
-
a += (bc ^ d) + blocks[1]! - 1530992060
|
|
227
|
-
a = (((a << 4) | (a >>> 28)) + b) << 0
|
|
228
|
-
d += (bc ^ a) + blocks[4]! + 1272893353
|
|
229
|
-
d = (((d << 11) | (d >>> 21)) + a) << 0
|
|
230
|
-
da = d ^ a
|
|
231
|
-
c += (da ^ b) + blocks[7]! - 155497632
|
|
232
|
-
c = (((c << 16) | (c >>> 16)) + d) << 0
|
|
233
|
-
b += (da ^ c) + blocks[10]! - 1094730640
|
|
234
|
-
b = (((b << 23) | (b >>> 9)) + c) << 0
|
|
235
|
-
bc = b ^ c
|
|
236
|
-
a += (bc ^ d) + blocks[13]! + 681279174
|
|
237
|
-
a = (((a << 4) | (a >>> 28)) + b) << 0
|
|
238
|
-
d += (bc ^ a) + blocks[0]! - 358537222
|
|
239
|
-
d = (((d << 11) | (d >>> 21)) + a) << 0
|
|
240
|
-
da = d ^ a
|
|
241
|
-
c += (da ^ b) + blocks[3]! - 722521979
|
|
242
|
-
c = (((c << 16) | (c >>> 16)) + d) << 0
|
|
243
|
-
b += (da ^ c) + blocks[6]! + 76029189
|
|
244
|
-
b = (((b << 23) | (b >>> 9)) + c) << 0
|
|
245
|
-
bc = b ^ c
|
|
246
|
-
a += (bc ^ d) + blocks[9]! - 640364487
|
|
247
|
-
a = (((a << 4) | (a >>> 28)) + b) << 0
|
|
248
|
-
d += (bc ^ a) + blocks[12]! - 421815835
|
|
249
|
-
d = (((d << 11) | (d >>> 21)) + a) << 0
|
|
250
|
-
da = d ^ a
|
|
251
|
-
c += (da ^ b) + blocks[15]! + 530742520
|
|
252
|
-
c = (((c << 16) | (c >>> 16)) + d) << 0
|
|
253
|
-
b += (da ^ c) + blocks[2]! - 995338651
|
|
254
|
-
b = (((b << 23) | (b >>> 9)) + c) << 0
|
|
255
|
-
a += (c ^ (b | ~d)) + blocks[0]! - 198630844
|
|
256
|
-
a = (((a << 6) | (a >>> 26)) + b) << 0
|
|
257
|
-
d += (b ^ (a | ~c)) + blocks[7]! + 1126891415
|
|
258
|
-
d = (((d << 10) | (d >>> 22)) + a) << 0
|
|
259
|
-
c += (a ^ (d | ~b)) + blocks[14]! - 1416354905
|
|
260
|
-
c = (((c << 15) | (c >>> 17)) + d) << 0
|
|
261
|
-
b += (d ^ (c | ~a)) + blocks[5]! - 57434055
|
|
262
|
-
b = (((b << 21) | (b >>> 11)) + c) << 0
|
|
263
|
-
a += (c ^ (b | ~d)) + blocks[12]! + 1700485571
|
|
264
|
-
a = (((a << 6) | (a >>> 26)) + b) << 0
|
|
265
|
-
d += (b ^ (a | ~c)) + blocks[3]! - 1894986606
|
|
266
|
-
d = (((d << 10) | (d >>> 22)) + a) << 0
|
|
267
|
-
c += (a ^ (d | ~b)) + blocks[10]! - 1051523
|
|
268
|
-
c = (((c << 15) | (c >>> 17)) + d) << 0
|
|
269
|
-
b += (d ^ (c | ~a)) + blocks[1]! - 2054922799
|
|
270
|
-
b = (((b << 21) | (b >>> 11)) + c) << 0
|
|
271
|
-
a += (c ^ (b | ~d)) + blocks[8]! + 1873313359
|
|
272
|
-
a = (((a << 6) | (a >>> 26)) + b) << 0
|
|
273
|
-
d += (b ^ (a | ~c)) + blocks[15]! - 30611744
|
|
274
|
-
d = (((d << 10) | (d >>> 22)) + a) << 0
|
|
275
|
-
c += (a ^ (d | ~b)) + blocks[6]! - 1560198380
|
|
276
|
-
c = (((c << 15) | (c >>> 17)) + d) << 0
|
|
277
|
-
b += (d ^ (c | ~a)) + blocks[13]! + 1309151649
|
|
278
|
-
b = (((b << 21) | (b >>> 11)) + c) << 0
|
|
279
|
-
a += (c ^ (b | ~d)) + blocks[4]! - 145523070
|
|
280
|
-
a = (((a << 6) | (a >>> 26)) + b) << 0
|
|
281
|
-
d += (b ^ (a | ~c)) + blocks[11]! - 1120210379
|
|
282
|
-
d = (((d << 10) | (d >>> 22)) + a) << 0
|
|
283
|
-
c += (a ^ (d | ~b)) + blocks[2]! + 718787259
|
|
284
|
-
c = (((c << 15) | (c >>> 17)) + d) << 0
|
|
285
|
-
b += (d ^ (c | ~a)) + blocks[9]! - 343485551
|
|
286
|
-
b = (((b << 21) | (b >>> 11)) + c) << 0
|
|
287
|
-
|
|
288
|
-
if (this.first) {
|
|
289
|
-
this.h0 = (a + 1732584193) << 0
|
|
290
|
-
this.h1 = (b - 271733879) << 0
|
|
291
|
-
this.h2 = (c - 1732584194) << 0
|
|
292
|
-
this.h3 = (d + 271733878) << 0
|
|
293
|
-
this.first = false
|
|
294
|
-
} else {
|
|
295
|
-
this.h0 = (this.h0 + a) << 0
|
|
296
|
-
this.h1 = (this.h1 + b) << 0
|
|
297
|
-
this.h2 = (this.h2 + c) << 0
|
|
298
|
-
this.h3 = (this.h3 + d) << 0
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
hex() {
|
|
303
|
-
this.finalize()
|
|
304
|
-
|
|
305
|
-
const { h0, h1, h2, h3 } = this
|
|
306
|
-
const HEX_CHARS = '0123456789abcdef'.split('')
|
|
307
|
-
return (
|
|
308
|
-
// prettier-ignore
|
|
309
|
-
HEX_CHARS[(h0 >> 4) & 0x0f]! + HEX_CHARS[h0 & 0x0f]! + HEX_CHARS[(h0 >> 12) & 0x0f]! + HEX_CHARS[(h0 >> 8) & 0x0f]! + HEX_CHARS[(h0 >> 20) & 0x0f]! +
|
|
310
|
-
HEX_CHARS[(h0 >> 16) & 0x0f]! + HEX_CHARS[(h0 >> 28) & 0x0f]! + HEX_CHARS[(h0 >> 24) & 0x0f]! + HEX_CHARS[(h1 >> 4) & 0x0f]! + HEX_CHARS[h1 & 0x0f]! +
|
|
311
|
-
HEX_CHARS[(h1 >> 12) & 0x0f]! + HEX_CHARS[(h1 >> 8) & 0x0f]! + HEX_CHARS[(h1 >> 20) & 0x0f]! + HEX_CHARS[(h1 >> 16) & 0x0f]! + HEX_CHARS[(h1 >> 28) & 0x0f]! +
|
|
312
|
-
HEX_CHARS[(h1 >> 24) & 0x0f]! + HEX_CHARS[(h2 >> 4) & 0x0f]! + HEX_CHARS[h2 & 0x0f]! + HEX_CHARS[(h2 >> 12) & 0x0f]! + HEX_CHARS[(h2 >> 8) & 0x0f]! +
|
|
313
|
-
HEX_CHARS[(h2 >> 20) & 0x0f]! + HEX_CHARS[(h2 >> 16) & 0x0f]! + HEX_CHARS[(h2 >> 28) & 0x0f]! + HEX_CHARS[(h2 >> 24) & 0x0f]! + HEX_CHARS[(h3 >> 4) & 0x0f]! +
|
|
314
|
-
HEX_CHARS[h3 & 0x0f]! + HEX_CHARS[(h3 >> 12) & 0x0f]! + HEX_CHARS[(h3 >> 8) & 0x0f]! + HEX_CHARS[(h3 >> 20) & 0x0f]! + HEX_CHARS[(h3 >> 16) & 0x0f]! +
|
|
315
|
-
HEX_CHARS[(h3 >> 28) & 0x0f]! + HEX_CHARS[(h3 >> 24) & 0x0f]!
|
|
316
|
-
)
|
|
317
|
-
}
|
|
318
|
-
}
|
package/src/safe-request.ts
DELETED
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
import { sleep } from './lang/async.js'
|
|
2
|
-
import { failed, handleException, type Result } from './lang/result.js'
|
|
3
|
-
import { getLogger, type Logger } from './logging/index.js'
|
|
4
|
-
import { combineUrl } from './url.js'
|
|
5
|
-
|
|
6
|
-
export type { Options as RequestOptions, FormattedOptions as RequestFormattedOptions }
|
|
7
|
-
|
|
8
|
-
interface Options {
|
|
9
|
-
urlPrefix?: string
|
|
10
|
-
url?: string
|
|
11
|
-
query?: Record<string, string | number | undefined>
|
|
12
|
-
method?: string
|
|
13
|
-
headers?: Record<string, string>
|
|
14
|
-
body?: string | FormData | null
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* 向后端传递的数据。对于 GET 请求,会合并到 query 中;对于 POST 请求,会作为 POST body,代替 body 参数
|
|
18
|
-
* 注意:为了支持传入 interface 类型的值,Record 只能定义成 Record<string, any>
|
|
19
|
-
*/
|
|
20
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
21
|
-
data?: FormData | Record<string, any>
|
|
22
|
-
|
|
23
|
-
/** 超时时间,不指定或设为 0 代表不限 */
|
|
24
|
-
timeout?: number
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
type FormattedOptions = Required<Pick<Options, 'url' | 'method' | 'headers' | 'body' | 'timeout'>>
|
|
28
|
-
|
|
29
|
-
type PredefinedOptions = Pick<Options, 'urlPrefix' | 'method' | 'headers' | 'timeout'>
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* 建立一个请求发起器,并可预设部分选项。
|
|
33
|
-
* 可以继承此类来自定义默认的错误处理逻辑。
|
|
34
|
-
*
|
|
35
|
-
* 请求失败时的 Failed 对象,其 code 为 HTTP status,没有 status 时为 0
|
|
36
|
-
* data 为解析出的响应内容,没有或解析失败则为 undefined
|
|
37
|
-
*/
|
|
38
|
-
export class SafeRequestClient {
|
|
39
|
-
readonly logger: Logger
|
|
40
|
-
readonly prefefinedOptions: PredefinedOptions
|
|
41
|
-
|
|
42
|
-
constructor(options: PredefinedOptions & { loggerName?: string } = {}) {
|
|
43
|
-
this.logger = getLogger(options.loggerName ?? 'request')
|
|
44
|
-
this.prefefinedOptions = options
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/** 生成一个快捷方式函数,调用它相当于调用 client.request() */
|
|
48
|
-
asFunction() {
|
|
49
|
-
return async <T>(inputUrl: string, inputOptions?: Options) =>
|
|
50
|
-
this.request<T>(inputUrl, inputOptions)
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
async request<T>(inputUrl: string, inputOptions?: Options): Promise<Result<T>> {
|
|
54
|
-
const options = await this.formatOptions({
|
|
55
|
-
url: inputUrl,
|
|
56
|
-
...(inputOptions ?? {}),
|
|
57
|
-
})
|
|
58
|
-
const { url, method, headers, body, timeout } = options
|
|
59
|
-
|
|
60
|
-
try {
|
|
61
|
-
// 发起请求
|
|
62
|
-
const request = fetch(url, { method, headers, body })
|
|
63
|
-
let response: Response | undefined
|
|
64
|
-
try {
|
|
65
|
-
response = await (typeof timeout === 'number'
|
|
66
|
-
? Promise.race([request, sleep(timeout)])
|
|
67
|
-
: request)
|
|
68
|
-
} catch (error) {
|
|
69
|
-
// 处理“请求发起失败”
|
|
70
|
-
return this.onRequestError(error as Error, url)
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// 处理超时
|
|
74
|
-
if (response === undefined) {
|
|
75
|
-
return this.onTimeout(url)
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// 处理“服务端返回失败状态”
|
|
79
|
-
if (!response.status.toString().startsWith('2')) {
|
|
80
|
-
// 此时服务端仍可能输出一些内容,试着解析出来
|
|
81
|
-
const responseDataRes = await this.parseResponse<T>(options, response)
|
|
82
|
-
const responseData = responseDataRes.success ? responseDataRes.data : undefined
|
|
83
|
-
return await this.onResponseError(url, response, responseData)
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// 解析响应内容
|
|
87
|
-
return await this.parseResponse<T>(options, response)
|
|
88
|
-
} catch (error) {
|
|
89
|
-
this.logger.error('Unexpected error', error)
|
|
90
|
-
return failed('Request handle failed.')
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
async formatOptions(input: Options): Promise<FormattedOptions> {
|
|
95
|
-
const predefined = this.prefefinedOptions
|
|
96
|
-
const {
|
|
97
|
-
urlPrefix = predefined.urlPrefix ?? '',
|
|
98
|
-
url: rawUrl,
|
|
99
|
-
query = {},
|
|
100
|
-
method = predefined.method ?? 'GET',
|
|
101
|
-
headers: rawHeaders = {},
|
|
102
|
-
body: rawBody = null,
|
|
103
|
-
data,
|
|
104
|
-
timeout = predefined.timeout ?? 0,
|
|
105
|
-
} = input
|
|
106
|
-
|
|
107
|
-
const headers = {
|
|
108
|
-
...(predefined.headers ?? {}),
|
|
109
|
-
...rawHeaders,
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
let body: string | FormData | null = rawBody
|
|
113
|
-
if (data !== undefined) {
|
|
114
|
-
if (method === 'GET') {
|
|
115
|
-
Object.assign(query, data)
|
|
116
|
-
} else {
|
|
117
|
-
body = data instanceof FormData ? data : JSON.stringify(data)
|
|
118
|
-
headers['Content-Type'] = 'application/json; charset=utf-8'
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
const url = combineUrl(urlPrefix + (rawUrl ?? ''), query)
|
|
123
|
-
|
|
124
|
-
const options = {
|
|
125
|
-
method,
|
|
126
|
-
url,
|
|
127
|
-
headers,
|
|
128
|
-
body,
|
|
129
|
-
timeout,
|
|
130
|
-
}
|
|
131
|
-
Object.assign(options.headers, await this.getHeaders(options, input))
|
|
132
|
-
return options
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/** 请求发起前调用此方法补充 Headers 内容 */
|
|
136
|
-
protected getHeaders(
|
|
137
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
138
|
-
options: FormattedOptions,
|
|
139
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
140
|
-
inputOptions: Options,
|
|
141
|
-
): Record<string, string> | undefined | Promise<Record<string, string> | undefined> {
|
|
142
|
-
return undefined
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
protected async parseResponse<T>(options: FormattedOptions, response: Response) {
|
|
146
|
-
let result: Result<T>
|
|
147
|
-
result = await handleException(response.json())
|
|
148
|
-
if (result.success) return result
|
|
149
|
-
|
|
150
|
-
const contentType = (response.headers.get('Content-Type') ?? '').toLowerCase().trim()
|
|
151
|
-
if (contentType.startsWith('text/') || contentType === '') {
|
|
152
|
-
result = (await handleException(response.text())) as Result<T>
|
|
153
|
-
if (result.success) return result
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
result = (await handleException(response.arrayBuffer())) as Result<T>
|
|
157
|
-
return result
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/** 若请求未成功发起,会触发此回调来生成失败信息 */
|
|
161
|
-
protected onRequestError(error: Error, url: string) {
|
|
162
|
-
this.logger.error('Request Failed', { url, error })
|
|
163
|
-
return failed('Request Failed', 0, undefined)
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/** 请求成功发起,但服务端返回失败状态(如 500),会触发此回调来生成失败信息 */
|
|
167
|
-
// eslint-disable-next-line @typescript-eslint/require-await
|
|
168
|
-
protected async onResponseError(url: string, response: Response, responseData: unknown) {
|
|
169
|
-
this.logger.error('Response Error Status', {
|
|
170
|
-
url,
|
|
171
|
-
status: response.status,
|
|
172
|
-
data: responseData,
|
|
173
|
-
})
|
|
174
|
-
return failed(`Response Error Status - ${response.status}`, response.status, responseData)
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/** 服务端返回内容解析失败时,会触发此回调来生成失败信息 */
|
|
178
|
-
protected onParseFailed(error: Error, response: Response, url: string) {
|
|
179
|
-
this.logger.error('Response Parse Failed', { url, response, error })
|
|
180
|
-
return failed('Response Parse Failed', response.status, undefined)
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/** 处理超时 */
|
|
184
|
-
protected onTimeout(url: string) {
|
|
185
|
-
this.logger.warn('Request Timeout', url)
|
|
186
|
-
return failed('Request Timeout', 0, undefined)
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* 模块自带一个可直接调用发起请求的函数,跳过初始化实例
|
|
192
|
-
*/
|
|
193
|
-
export const safeRequest = new SafeRequestClient().asFunction()
|