huxy-server 1.0.0 → 1.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/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.1",
4
4
  "description": "一个精炼、高性能的 Express.js 服务器模板,为现代 Node.js 应用程序设计,提供灵活的功能和最佳实践。",
5
5
  "type": "module",
6
6
  "module": "./src/index.js",
package/src/index.js CHANGED
@@ -6,51 +6,53 @@ import {
6
6
  dateTime as ee,
7
7
  localIPs as te,
8
8
  nodeArgs as re,
9
- getEnvConfig as oe,
10
- checkPort as se,
9
+ getEnvConfig as se,
10
+ checkPort as oe,
11
11
  getDirName as ae,
12
12
  resolvePath as ne,
13
13
  } from 'huxy-node-server';
14
14
  import {createProxyMiddleware as E} from 'http-proxy-middleware';
15
15
  import {dateTime as I} from 'huxy-node-server';
16
- import j from 'jsonwebtoken';
17
- var d = (r, e = {secret, ...opt}) => j.verify(r, secret, opt);
16
+ import T from 'jsonwebtoken';
17
+ var m = (r, e = {secret, ...opt}) => T.verify(r, secret, opt);
18
18
  var f =
19
19
  (r = {}) =>
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 '))
20
+ (e, t, s) => {
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 o = m(a, r);
29
+ (e.log.info(o, '\u8BA4\u8BC1\u6210\u529F'), (e.user = o), s());
30
+ } catch (o) {
31
+ return o.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
+ : o.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
+ : o instanceof AuthorizationError
36
+ ? (e.log.warn({ip: e.ip}, `\u8BA4\u8BC1\u5931\u8D25: ${o.message}`), t.status(o.status).json({message: o.message}))
37
+ : (e.log.warn({err: o, 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 j =
41
41
  ({whiteAuthKeys: r = [], whiteAuthPaths: e = [], config: t = {}}) =>
42
- (o, s, a) => {
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);
42
+ (s, n, a) => {
43
+ if (s.method === 'OPTIONS' || e.includes(s.path)) return a();
44
+ let {authToken: o} = t;
45
+ if (o === !1 || o === 'false') return a();
46
+ let p = s.headers['x-huxy-auth'] || s.headers['x-api-key'];
47
+ if (p === o || r.includes(p)) return a();
48
+ let {secret: c, expiresIn: u, algorithm: i, issuer: h} = t;
49
+ f({secret: c, expiresIn: u, algorithm: i, issuer: h})(s, n, a);
48
50
  },
49
- x = T;
51
+ x = j;
50
52
  var v = ['x-powered-by', 'server'],
51
53
  y = (r, e) => {
52
54
  let t = new Headers(r);
53
- return (headersToRemove.forEach(o => t.delete(o)), t.set('Host', e), t.set('User-Agent', 'IHUXY-API/1.0'), t);
55
+ return (headersToRemove.forEach(s => t.delete(s)), t.set('Host', e), t.set('User-Agent', 'IHUXY-API/1.0'), t);
54
56
  },
55
57
  w = r => {
56
58
  let e = new Headers(r);
@@ -66,45 +68,45 @@ var H = r => Object.prototype.toString.call(r).slice(8, -1).toLowerCase(),
66
68
  R = r => (H(r) === 'object' ? [r] : Array.isArray(r) ? r : []),
67
69
  g = (r, e) => R(r).map(t => ((t.prefix = `${e}${t.prefix ?? `/${t.name}`}`.replace('//', '/')), t)),
68
70
  P = (r, e) => ['/', '/health', e, ...r].map(t => `${e}${t}`.replace('//', '/'));
69
- var $ = ({target: r = 'http://localhost:11434', prefix: e = '/api', ...t} = {}, o = !1) => ({
71
+ var $ = ({target: r = 'http://localhost:11434', prefix: e = '/api', ...t} = {}, s = !1) => ({
70
72
  target: r,
71
73
  pathRewrite: {[`^${e}`]: ''},
72
74
  changeOrigin: !0,
73
75
  selfHandleResponse: !1,
74
- onProxyReq: (s, a, n) => {
75
- !o && y(s.headers, r);
76
+ onProxyReq: (n, a, o) => {
77
+ !s && y(n.headers, r);
76
78
  },
77
- onProxyRes: (s, a, n) => {
78
- !o && w(s.headers);
79
+ onProxyRes: (n, a, o) => {
80
+ !s && w(n.headers);
79
81
  },
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'}));
82
+ onError: (n, a, o) => {
83
+ (a.log.error({err: n}, '\u4EE3\u7406\u9519\u8BEF'), o.headersSent || o.status(502).json({error: '\u7F51\u5173\u9519\u8BEF'}));
82
84
  },
83
85
  ...t,
84
86
  }),
85
87
  S = (r, e) => {
86
88
  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);
89
+ r.get(`${e}/health`.replace('//', '/'), (s, n) => {
90
+ n.status(200).json(t);
89
91
  });
90
92
  },
91
- 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}`));
93
+ k = (r, e = {}, t) => {
94
+ let {apiPrefix: s, proxys: n = [], whiteAuthKeys: a = [], whitePathList: o = [], preserve: p = !1} = e,
95
+ c = g(n, s);
96
+ if (!c.length) return;
97
+ (t.info(`\u{1F4DD} API \u63A5\u53E3\u5730\u5740: http://${e.host}:${e.port}${s}`), S(r, s));
98
+ let u = x({whiteAuthKeys: a, whitePathList: P(o, s), config: e});
99
+ c.map(({prefix: i, target: h}) => {
100
+ let A = $({prefix: i, target: h}, p);
101
+ (r.use(i, u, E(A)), t.info(`\u2705 \u4EE3\u7406\u4E2D ${i} -> ${h}`));
100
102
  });
101
103
  },
102
- u = C;
103
- var k = {
104
+ l = k;
105
+ var C = {
104
106
  port: parseInt(process.env.PORT || '8080', 10),
105
107
  host: process.env.HOST || 'localhost',
106
108
  apiPrefix: process.env.API_PREFIX || '/api',
107
- authToken: 'ah.yiru@gmail.com',
109
+ authToken: '1234',
108
110
  proxys: [],
109
111
  whiteAuthKeys: ['ihuxy'],
110
112
  whitePathList: ['/health'],
@@ -113,24 +115,24 @@ var k = {
113
115
  expiresIn: process.env.JWT_EXPIRES_IN || '30d',
114
116
  issuer: process.env.JWT_ISSUER || 'huxyApp',
115
117
  },
116
- l = k;
118
+ d = C;
117
119
  var L = (r, e) =>
118
- O({...l, ...r}, async (t, o, s, a) => {
119
- (await e?.(t, o, s, a), u(o, t, a));
120
+ O({...d, ...r}, async (t, s, n, a) => {
121
+ (await e?.(t, s, n, a), l(s, t, a));
120
122
  }),
121
123
  ce = L,
122
124
  he = (r, e) =>
123
- W({...l, ...r}, async (t, o, s, a) => {
124
- (await e?.(t, o, s, a), u(o, t, a));
125
+ W({...d, ...r}, async (t, s, n, a) => {
126
+ (await e?.(t, s, n, a), l(s, t, a));
125
127
  });
126
128
  export {
127
- u as appProxy,
128
- se as checkPort,
129
+ l as appProxy,
130
+ oe as checkPort,
129
131
  q as createLogger,
130
132
  ee as dateTime,
131
133
  ce as default,
132
134
  ae as getDirName,
133
- oe as getEnvConfig,
135
+ se as getEnvConfig,
134
136
  te as localIPs,
135
137
  Z as logger,
136
138
  re as nodeArgs,