huxy-server 1.0.5 → 1.0.7
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/package.json +2 -2
- package/src/index.js +71 -70
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "huxy-server",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "一个精炼、高性能的 Express.js 服务器模板,为现代 Node.js 应用程序设计,提供灵活的功能和最佳实践。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"module": "./src/index.js",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"http-proxy-middleware": "^3.0.5",
|
|
39
|
-
"huxy-node-server": "^1.0.
|
|
39
|
+
"huxy-node-server": "^1.0.5",
|
|
40
40
|
"jsonwebtoken": "^9.0.3"
|
|
41
41
|
},
|
|
42
42
|
"engines": {
|
package/src/index.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import {
|
|
2
|
-
startServer as
|
|
2
|
+
startServer as M,
|
|
3
3
|
startStatic as L,
|
|
4
|
-
logger as
|
|
5
|
-
createLogger as
|
|
6
|
-
dateTime as
|
|
7
|
-
localIPs as
|
|
8
|
-
nodeArgs as
|
|
9
|
-
getEnvConfig as
|
|
10
|
-
checkPort as
|
|
11
|
-
getDirName as
|
|
12
|
-
resolvePath as
|
|
4
|
+
logger as te,
|
|
5
|
+
createLogger as re,
|
|
6
|
+
dateTime as se,
|
|
7
|
+
localIPs as oe,
|
|
8
|
+
nodeArgs as ae,
|
|
9
|
+
getEnvConfig as ne,
|
|
10
|
+
checkPort as ie,
|
|
11
|
+
getDirName as pe,
|
|
12
|
+
resolvePath as ce,
|
|
13
13
|
} from 'huxy-node-server';
|
|
14
|
-
import {createProxyMiddleware as
|
|
15
|
-
import {dateTime as
|
|
14
|
+
import {createProxyMiddleware as E, fixRequestBody as S} from 'http-proxy-middleware';
|
|
15
|
+
import {dateTime as C} from 'huxy-node-server';
|
|
16
16
|
import T from 'jsonwebtoken';
|
|
17
|
-
var
|
|
17
|
+
var m = (r, e = {secret, ...opt}) => T.verify(r, secret, opt);
|
|
18
18
|
var x =
|
|
19
19
|
(r = {}) =>
|
|
20
20
|
(e, t, s) => {
|
|
@@ -25,7 +25,7 @@ var x =
|
|
|
25
25
|
let n = o.split(' ')[1];
|
|
26
26
|
if (!n) return (e.log.warn('\u8BA4\u8BC1\u5931\u8D25: \u8BBF\u95EE\u4EE4\u724C\u7F3A\u5931'), t.status(401).json({message: '\u8BBF\u95EE\u4EE4\u724C\u7F3A\u5931'}));
|
|
27
27
|
try {
|
|
28
|
-
let a =
|
|
28
|
+
let a = m(n, r);
|
|
29
29
|
(e.log.info(a, '\u8BA4\u8BC1\u6210\u529F'), (e.user = a), s());
|
|
30
30
|
} catch (a) {
|
|
31
31
|
return a.name === 'TokenExpiredError'
|
|
@@ -37,56 +37,58 @@ var x =
|
|
|
37
37
|
: (e.log.warn({err: a, ip: e.ip}, '\u8BA4\u8BC1\u5931\u8D25: \u5185\u90E8\u670D\u52A1\u5668\u9519\u8BEF'), t.status(500).json({message: '\u5185\u90E8\u670D\u52A1\u5668\u9519\u8BEF'}));
|
|
38
38
|
}
|
|
39
39
|
};
|
|
40
|
-
var
|
|
40
|
+
var H =
|
|
41
41
|
({whiteAuthKeys: r = [], whiteAuthPaths: e = [], config: t = {}}) =>
|
|
42
42
|
(s, o, n) => {
|
|
43
43
|
if (s.method === 'OPTIONS' || e.includes(s.path)) return n();
|
|
44
44
|
let {authToken: a} = t;
|
|
45
45
|
if (a === !1 || a === 'false') return n();
|
|
46
|
-
let
|
|
46
|
+
let p = s.headers,
|
|
47
|
+
i = p['x-huxy-auth'] || p['x-api-key'] || p.authorization?.split('Bearer ')[1];
|
|
47
48
|
if ((i && i === a) || r.includes(i)) return n();
|
|
48
|
-
let {secret:
|
|
49
|
-
x({secret:
|
|
49
|
+
let {secret: u, expiresIn: c, algorithm: l, issuer: h} = t;
|
|
50
|
+
x({secret: u, expiresIn: c, algorithm: l, issuer: h})(s, o, n);
|
|
50
51
|
},
|
|
51
|
-
y =
|
|
52
|
-
var
|
|
52
|
+
y = H;
|
|
53
|
+
var v = ['origin', 'referer', 'x-forwarded-for', 'x-real-ip', 'cf-connecting-ip', 'cf-ipcountry', 'cf-ray', 'x-huxy-auth'],
|
|
54
|
+
$ = ['x-powered-by', 'server'],
|
|
53
55
|
w = (r, e) => {
|
|
54
56
|
let t = new Headers(r);
|
|
55
|
-
return (
|
|
57
|
+
return (v.forEach(s => t.delete(s)), t.set('Host', e), t.set('User-Agent', 'IHUXY-API/1.0'), t);
|
|
56
58
|
},
|
|
57
59
|
g = r => {
|
|
58
60
|
let e = new Headers(r);
|
|
59
61
|
return (
|
|
60
|
-
|
|
62
|
+
$.forEach(t => e.delete(t)),
|
|
61
63
|
e.set('Access-Control-Allow-Origin', '*'),
|
|
62
64
|
e.set('X-Content-Type-Options', 'nosniff'),
|
|
63
65
|
e.get('content-type')?.includes('text/event-stream') && ((e['Cache-Control'] = 'no-cache, no-transform'), (e.Connection = 'keep-alive'), (e['X-Accel-Buffering'] = 'no')),
|
|
64
66
|
e
|
|
65
67
|
);
|
|
66
68
|
};
|
|
67
|
-
var
|
|
68
|
-
|
|
69
|
-
A = (r, e) =>
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
var
|
|
69
|
+
var I = r => Object.prototype.toString.call(r).slice(8, -1).toLowerCase(),
|
|
70
|
+
R = r => (I(r) === 'object' ? [r] : Array.isArray(r) ? r : []),
|
|
71
|
+
A = (r, e) => R(r).map(t => ((t.prefix = `${e}${(t.prefix ?? t.name) ? `/${t.name}` : ''}`.replace('//', '/')), t)),
|
|
72
|
+
P = r => (Array.isArray(r) ? r : []).filter(Boolean),
|
|
73
|
+
j = (r, e) => [...new Set(['/', '/health', e, ...(Array.isArray(r) ? r : [])])].filter(Boolean).map(t => `${e}${t}`.replace('//', '/'));
|
|
74
|
+
var k = ({target: r = 'http://', prefix: e, ...t} = {}, s = !1) => ({
|
|
73
75
|
target: r,
|
|
74
|
-
pathRewrite: {[`^${e}`]: ''},
|
|
76
|
+
pathRewrite: e?.length > 1 ? {[`^${e}`]: ''} : void 0,
|
|
75
77
|
changeOrigin: !0,
|
|
76
78
|
selfHandleResponse: !1,
|
|
77
|
-
|
|
78
|
-
!s && w(o.headers, r)
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
79
|
+
on: {
|
|
80
|
+
proxyReq: (o, n, a) => (!s && w(o.headers, r), S(o, n, a)),
|
|
81
|
+
proxyRes: (o, n, a) => {
|
|
82
|
+
!s && g(o.headers);
|
|
83
|
+
},
|
|
84
|
+
error: (o, n, a) => {
|
|
85
|
+
(n.log.error({err: o}, '\u4EE3\u7406\u9519\u8BEF'), a.headersSent || a.status(502).json({error: '\u7F51\u5173\u9519\u8BEF'}));
|
|
86
|
+
},
|
|
85
87
|
},
|
|
86
88
|
...t,
|
|
87
89
|
}),
|
|
88
|
-
|
|
89
|
-
let t = {status: 'OK', message: `API \u670D\u52A1\u5668\u8FD0\u884C\u4E2D \u{1F449} ${e}`, timestamp:
|
|
90
|
+
O = (r, e) => {
|
|
91
|
+
let t = {status: 'OK', message: `API \u670D\u52A1\u5668\u8FD0\u884C\u4E2D \u{1F449} ${e}`, timestamp: C(), uptime: process.uptime(), memoryUsage: process.memoryUsage()};
|
|
90
92
|
(r.get(e, (s, o) => {
|
|
91
93
|
o.status(200).json(t);
|
|
92
94
|
}),
|
|
@@ -94,54 +96,53 @@ var S = ({target: r = 'http://localhost:11434', prefix: e = '/api', ...t} = {},
|
|
|
94
96
|
o.status(200).json(t);
|
|
95
97
|
}));
|
|
96
98
|
},
|
|
97
|
-
|
|
98
|
-
let {apiPrefix: s, proxys: o = [], whiteAuthKeys: n = [], whitePathList: a = [], preserve:
|
|
99
|
-
|
|
100
|
-
if (!
|
|
101
|
-
(t.info(`\u{1F4DD} API \u63A5\u53E3\u5730\u5740:
|
|
102
|
-
let
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
(r.use(p, l, I(j)), t.info(`\u2705 \u4EE3\u7406\u4E2D ${p} \u{1F449} ${h}`));
|
|
99
|
+
W = (r, e = {}, t) => {
|
|
100
|
+
let {apiPrefix: s = '/', proxys: o = [], whiteAuthKeys: n = [], whitePathList: a = [], preserve: p = !1} = e,
|
|
101
|
+
i = A(o, s);
|
|
102
|
+
if (!i.length) return;
|
|
103
|
+
(t.info(`\u{1F4DD} API \u63A5\u53E3\u5730\u5740: ${e.protocol}://${e.host}:${e.port}${s}`), O(r, s));
|
|
104
|
+
let u = y({whiteAuthKeys: P(n), whitePathList: j(a, s), config: e});
|
|
105
|
+
i.map(({prefix: c, target: l, ...h}) => {
|
|
106
|
+
(r.use(c, u, E(k({prefix: c, target: l, ...h}, p))), t.info(`\u2705 \u4EE3\u7406\u4E2D ${c} \u{1F449} ${l}`));
|
|
106
107
|
});
|
|
107
108
|
},
|
|
108
|
-
d =
|
|
109
|
-
var
|
|
109
|
+
d = W;
|
|
110
|
+
var B = {
|
|
110
111
|
port: parseInt(process.env.PORT || '8080', 10),
|
|
111
112
|
host: process.env.HOST || 'localhost',
|
|
112
|
-
apiPrefix: process.env.API_PREFIX || '/
|
|
113
|
+
apiPrefix: process.env.API_PREFIX || '/',
|
|
113
114
|
authToken: !1,
|
|
114
115
|
proxys: [],
|
|
115
116
|
whitePathList: ['/health'],
|
|
116
117
|
algorithm: 'HS256',
|
|
117
|
-
secret: process.env.JWT_SECRET || '
|
|
118
|
+
secret: process.env.JWT_SECRET || 'hy123',
|
|
118
119
|
expiresIn: process.env.JWT_EXPIRES_IN || '30d',
|
|
119
120
|
issuer: process.env.JWT_ISSUER || 'huxyApp',
|
|
120
121
|
},
|
|
121
|
-
|
|
122
|
-
var
|
|
123
|
-
|
|
122
|
+
f = B;
|
|
123
|
+
var U = (r, e) =>
|
|
124
|
+
M({...f, ...r}, async (t, s, o, n) => {
|
|
124
125
|
(await e?.(t, s, o, n), d(s, t, n));
|
|
125
126
|
}),
|
|
126
|
-
he =
|
|
127
|
-
|
|
128
|
-
L({...
|
|
127
|
+
he = U,
|
|
128
|
+
de = (r, e) =>
|
|
129
|
+
L({...f, ...r}, async (t, s, o, n) => {
|
|
129
130
|
(await e?.(t, s, o, n), d(s, t, n));
|
|
130
131
|
});
|
|
131
132
|
export {
|
|
132
133
|
d as appProxy,
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
134
|
+
ie as checkPort,
|
|
135
|
+
re as createLogger,
|
|
136
|
+
se as dateTime,
|
|
136
137
|
he as default,
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
138
|
+
pe as getDirName,
|
|
139
|
+
ne as getEnvConfig,
|
|
140
|
+
oe as localIPs,
|
|
141
|
+
te as logger,
|
|
142
|
+
ae as nodeArgs,
|
|
143
|
+
ce as resolvePath,
|
|
144
|
+
U as startApp,
|
|
145
|
+
M as startServer,
|
|
145
146
|
L as startStatic,
|
|
146
|
-
|
|
147
|
+
de as startStaticApp,
|
|
147
148
|
};
|