huxy-server 1.0.0 → 1.0.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/README.md CHANGED
@@ -52,6 +52,8 @@ startApp(config, (huxyConfig, app, httpServer) => {
52
52
  });
53
53
  ```
54
54
 
55
+ `authToken` 默认值 '1234',如不需要鉴权可以设置环境变量 `AUTH_TOKEN=false` 或设置 `config = {authToken: false}`。
56
+
55
57
  ### 直接使用 `appProxy`
56
58
 
57
59
  也可直接使用 `appProxy`,只需传入你的服务 `app` 和代理 `config` 即可。
@@ -79,7 +81,7 @@ JWT_EXPIRES_IN=30d
79
81
  JWT_ISSUER=huxyApp
80
82
 
81
83
  # 认证
82
- AUTH_TOKEN=your-email@example.com
84
+ AUTH_TOKEN=your-auth-token
83
85
  ```
84
86
 
85
87
  ## API 代理
package/example.js CHANGED
@@ -5,6 +5,7 @@ const {startApp, logger} = huxyServer;
5
5
  const config = {
6
6
  port: 1234,
7
7
  apiPrefix: '/example',
8
+ authToken: false,
8
9
  // proxyConfig
9
10
  proxys: [{
10
11
  name: 'ollama',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "huxy-server",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "一个精炼、高性能的 Express.js 服务器模板,为现代 Node.js 应用程序设计,提供灵活的功能和最佳实践。",
5
5
  "type": "module",
6
6
  "module": "./src/index.js",
package/src/index.js CHANGED
@@ -1,142 +1,144 @@
1
1
  import {
2
- startServer as O,
3
- startStatic as W,
4
- logger as Z,
5
- createLogger as q,
6
- dateTime as ee,
7
- localIPs as te,
8
- nodeArgs as re,
9
- getEnvConfig as oe,
10
- checkPort as se,
11
- getDirName as ae,
12
- resolvePath as ne,
2
+ startServer as W,
3
+ startStatic as L,
4
+ logger as q,
5
+ createLogger as ee,
6
+ dateTime as te,
7
+ localIPs as re,
8
+ nodeArgs as oe,
9
+ getEnvConfig as se,
10
+ checkPort as ae,
11
+ getDirName as ne,
12
+ resolvePath as ie,
13
13
  } from 'huxy-node-server';
14
- import {createProxyMiddleware as E} from 'http-proxy-middleware';
15
- import {dateTime as I} from 'huxy-node-server';
14
+ import {createProxyMiddleware as I} from 'http-proxy-middleware';
15
+ import {dateTime as $} from 'huxy-node-server';
16
16
  import j from 'jsonwebtoken';
17
- var d = (r, e = {secret, ...opt}) => j.verify(r, secret, opt);
18
- var f =
17
+ var f = (r, e = {secret, ...opt}) => j.verify(r, secret, opt);
18
+ var x =
19
19
  (r = {}) =>
20
20
  (e, t, o) => {
21
- let s = e.headers.authorization;
22
- if (!s) return (e.log.warn('\u8BA4\u8BC1\u5931\u8D25: \u7F3A\u5C11\u8BA4\u8BC1\u4FE1\u606F'), t.status(401).json({message: '\u7F3A\u5C11\u8BA4\u8BC1\u4FE1\u606F'}));
23
- if (!s.startsWith('Bearer '))
21
+ let n = e.headers.authorization;
22
+ if (!n) return (e.log.warn('\u8BA4\u8BC1\u5931\u8D25: \u7F3A\u5C11\u8BA4\u8BC1\u4FE1\u606F'), t.status(401).json({message: '\u7F3A\u5C11\u8BA4\u8BC1\u4FE1\u606F'}));
23
+ if (!n.startsWith('Bearer '))
24
24
  return (e.log.warn('\u8BA4\u8BC1\u5931\u8D25: \u672A\u63D0\u4F9B\u6709\u6548\u8BA4\u8BC1\u4FE1\u606F'), t.status(401).json({message: '\u672A\u63D0\u4F9B\u6709\u6548\u8BA4\u8BC1\u4FE1\u606F'}));
25
- let a = s.split(' ')[1];
25
+ let a = n.split(' ')[1];
26
26
  if (!a) 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 n = d(a, r);
29
- (e.log.info(n, '\u8BA4\u8BC1\u6210\u529F'), (e.user = n), o());
30
- } catch (n) {
31
- return n.name === 'TokenExpiredError'
28
+ let s = f(a, r);
29
+ (e.log.info(s, '\u8BA4\u8BC1\u6210\u529F'), (e.user = s), o());
30
+ } catch (s) {
31
+ return s.name === 'TokenExpiredError'
32
32
  ? (e.log.warn({ip: e.ip}, '\u8BA4\u8BC1\u5931\u8D25: \u4EE4\u724C\u5DF2\u8FC7\u671F'), t.status(401).json({message: '\u4EE4\u724C\u5DF2\u8FC7\u671F'}))
33
- : n.name === 'JsonWebTokenError'
33
+ : s.name === 'JsonWebTokenError'
34
34
  ? (e.log.warn({ip: e.ip}, '\u8BA4\u8BC1\u5931\u8D25: \u65E0\u6548\u7684\u4EE4\u724C'), t.status(403).json({message: '\u65E0\u6548\u7684\u4EE4\u724C'}))
35
- : n instanceof AuthorizationError
36
- ? (e.log.warn({ip: e.ip}, `\u8BA4\u8BC1\u5931\u8D25: ${n.message}`), t.status(n.status).json({message: n.message}))
37
- : (e.log.warn({err: n, 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'}));
35
+ : s instanceof AuthorizationError
36
+ ? (e.log.warn({ip: e.ip}, `\u8BA4\u8BC1\u5931\u8D25: ${s.message}`), t.status(s.status).json({message: s.message}))
37
+ : (e.log.warn({err: s, 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 T =
40
+ var v =
41
41
  ({whiteAuthKeys: r = [], whiteAuthPaths: e = [], config: t = {}}) =>
42
- (o, s, a) => {
42
+ (o, n, a) => {
43
43
  if (o.method === 'OPTIONS' || e.includes(o.path)) return a();
44
- let n = o.headers['x-huxy-auth'] || o.headers['x-api-key'];
45
- if (r.includes(n)) return a();
46
- let {secret: c, expiresIn: p, algorithm: h, issuer: i} = t;
47
- f({secret: c, expiresIn: p, algorithm: h, issuer: i})(o, s, a);
44
+ let {authToken: s} = t;
45
+ if (s === !1 || s === 'false') return a();
46
+ let i = o.headers['x-huxy-auth'] || o.headers['x-api-key'];
47
+ if ((i && i === s) || r.includes(i)) return a();
48
+ let {secret: c, expiresIn: l, algorithm: p, issuer: h} = t;
49
+ x({secret: c, expiresIn: l, algorithm: p, issuer: h})(o, n, a);
48
50
  },
49
- x = T;
50
- var v = ['x-powered-by', 'server'],
51
- y = (r, e) => {
51
+ y = v;
52
+ var H = ['x-powered-by', 'server'],
53
+ w = (r, e) => {
52
54
  let t = new Headers(r);
53
55
  return (headersToRemove.forEach(o => t.delete(o)), t.set('Host', e), t.set('User-Agent', 'IHUXY-API/1.0'), t);
54
56
  },
55
- w = r => {
57
+ g = r => {
56
58
  let e = new Headers(r);
57
59
  return (
58
- v.forEach(t => e.delete(t)),
60
+ H.forEach(t => e.delete(t)),
59
61
  e.set('Access-Control-Allow-Origin', '*'),
60
62
  e.set('X-Content-Type-Options', 'nosniff'),
61
63
  e.get('content-type')?.includes('text/event-stream') && ((e['Cache-Control'] = 'no-cache, no-transform'), (e.Connection = 'keep-alive'), (e['X-Accel-Buffering'] = 'no')),
62
64
  e
63
65
  );
64
66
  };
65
- var H = r => Object.prototype.toString.call(r).slice(8, -1).toLowerCase(),
66
- R = r => (H(r) === 'object' ? [r] : Array.isArray(r) ? r : []),
67
- g = (r, e) => R(r).map(t => ((t.prefix = `${e}${t.prefix ?? `/${t.name}`}`.replace('//', '/')), t)),
68
- P = (r, e) => ['/', '/health', e, ...r].map(t => `${e}${t}`.replace('//', '/'));
69
- var $ = ({target: r = 'http://localhost:11434', prefix: e = '/api', ...t} = {}, o = !1) => ({
67
+ var R = r => Object.prototype.toString.call(r).slice(8, -1).toLowerCase(),
68
+ E = r => (R(r) === 'object' ? [r] : Array.isArray(r) ? r : []),
69
+ A = (r, e) => E(r).map(t => ((t.prefix = `${e}${t.prefix ?? `/${t.name}`}`.replace('//', '/')), t)),
70
+ u = r => (Array.isArray(r) ? r : []).filter(Boolean),
71
+ P = (r, e) => ['/', '/health', e, ...u(r)].map(t => `${e}${t}`.replace('//', '/'));
72
+ var S = ({target: r = 'http://localhost:11434', prefix: e = '/api', ...t} = {}, o = !1) => ({
70
73
  target: r,
71
74
  pathRewrite: {[`^${e}`]: ''},
72
75
  changeOrigin: !0,
73
76
  selfHandleResponse: !1,
74
- onProxyReq: (s, a, n) => {
75
- !o && y(s.headers, r);
77
+ onProxyReq: (n, a, s) => {
78
+ !o && w(n.headers, r);
76
79
  },
77
- onProxyRes: (s, a, n) => {
78
- !o && w(s.headers);
80
+ onProxyRes: (n, a, s) => {
81
+ !o && g(n.headers);
79
82
  },
80
- onError: (s, a, n) => {
81
- (a.log.error({err: s}, '\u4EE3\u7406\u9519\u8BEF'), n.headersSent || n.status(502).json({error: '\u7F51\u5173\u9519\u8BEF'}));
83
+ onError: (n, a, s) => {
84
+ (a.log.error({err: n}, '\u4EE3\u7406\u9519\u8BEF'), s.headersSent || s.status(502).json({error: '\u7F51\u5173\u9519\u8BEF'}));
82
85
  },
83
86
  ...t,
84
87
  }),
85
- S = (r, e) => {
86
- let t = {status: 'OK', message: `API \u670D\u52A1\u5668\u8FD0\u884C\u4E2D -> ${e}`, timestamp: I(), uptime: process.uptime(), memoryUsage: process.memoryUsage()};
87
- r.get(`${e}/health`.replace('//', '/'), (o, s) => {
88
- s.status(200).json(t);
88
+ k = (r, e) => {
89
+ let t = {status: 'OK', message: `API \u670D\u52A1\u5668\u8FD0\u884C\u4E2D -> ${e}`, timestamp: $(), uptime: process.uptime(), memoryUsage: process.memoryUsage()};
90
+ r.get(`${e}/health`.replace('//', '/'), (o, n) => {
91
+ n.status(200).json(t);
89
92
  });
90
93
  },
91
94
  C = (r, e = {}, t) => {
92
- let {apiPrefix: o, proxys: s = [], whiteAuthKeys: a = [], whitePathList: n = [], preserve: c = !1} = e,
93
- p = g(s, o);
94
- if (!p.length) return;
95
- (t.info(`\u{1F4DD} API \u63A5\u53E3\u5730\u5740: http://${e.host}:${e.port}${o}`), S(r, o));
96
- let h = x({whiteAuthKeys: a, whitePathList: P(n, o), config: e});
97
- p.map(({prefix: i, target: m}) => {
98
- let A = $({prefix: i, target: m}, c);
99
- (r.use(i, h, E(A)), t.info(`\u2705 \u4EE3\u7406\u4E2D ${i} -> ${m}`));
95
+ let {apiPrefix: o, proxys: n = [], whiteAuthKeys: a = [], whitePathList: s = [], preserve: i = !1} = e,
96
+ c = A(n, o);
97
+ if (!c.length) return;
98
+ (t.info(`\u{1F4DD} API \u63A5\u53E3\u5730\u5740: http://${e.host}:${e.port}${o}`), k(r, o));
99
+ let l = y({whiteAuthKeys: u(a), whitePathList: P(s, o), config: e});
100
+ c.map(({prefix: p, target: h}) => {
101
+ let T = S({prefix: p, target: h}, i);
102
+ (r.use(p, l, I(T)), t.info(`\u2705 \u4EE3\u7406\u4E2D ${p} -> ${h}`));
100
103
  });
101
104
  },
102
- u = C;
103
- var k = {
105
+ d = C;
106
+ var O = {
104
107
  port: parseInt(process.env.PORT || '8080', 10),
105
108
  host: process.env.HOST || 'localhost',
106
109
  apiPrefix: process.env.API_PREFIX || '/api',
107
- authToken: 'ah.yiru@gmail.com',
110
+ authToken: '1234',
108
111
  proxys: [],
109
- whiteAuthKeys: ['ihuxy'],
110
112
  whitePathList: ['/health'],
111
113
  algorithm: 'HS256',
112
114
  secret: process.env.JWT_SECRET || 'ah.yiru@gmail.com',
113
115
  expiresIn: process.env.JWT_EXPIRES_IN || '30d',
114
116
  issuer: process.env.JWT_ISSUER || 'huxyApp',
115
117
  },
116
- l = k;
117
- var L = (r, e) =>
118
- O({...l, ...r}, async (t, o, s, a) => {
119
- (await e?.(t, o, s, a), u(o, t, a));
118
+ m = O;
119
+ var M = (r, e) =>
120
+ W({...m, ...r}, async (t, o, n, a) => {
121
+ (await e?.(t, o, n, a), d(o, t, a));
120
122
  }),
121
- ce = L,
122
- he = (r, e) =>
123
- W({...l, ...r}, async (t, o, s, a) => {
124
- (await e?.(t, o, s, a), u(o, t, a));
123
+ he = M,
124
+ le = (r, e) =>
125
+ L({...m, ...r}, async (t, o, n, a) => {
126
+ (await e?.(t, o, n, a), d(o, t, a));
125
127
  });
126
128
  export {
127
- u as appProxy,
128
- se as checkPort,
129
- q as createLogger,
130
- ee as dateTime,
131
- ce as default,
132
- ae as getDirName,
133
- oe as getEnvConfig,
134
- te as localIPs,
135
- Z as logger,
136
- re as nodeArgs,
137
- ne as resolvePath,
138
- L as startApp,
139
- O as startServer,
140
- W as startStatic,
141
- he as startStaticApp,
129
+ d as appProxy,
130
+ ae as checkPort,
131
+ ee as createLogger,
132
+ te as dateTime,
133
+ he as default,
134
+ ne as getDirName,
135
+ se as getEnvConfig,
136
+ re as localIPs,
137
+ q as logger,
138
+ oe as nodeArgs,
139
+ ie as resolvePath,
140
+ M as startApp,
141
+ W as startServer,
142
+ L as startStatic,
143
+ le as startStaticApp,
142
144
  };