huxy-node-server 1.0.7 → 1.0.8

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.
Files changed (2) hide show
  1. package/package.json +2 -2
  2. package/src/index.js +138 -136
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "huxy-node-server",
3
- "version": "1.0.7",
3
+ "version": "1.0.8",
4
4
  "description": "一个精炼、高性能的 Express.js 服务器模板,为现代 Node.js 应用程序设计,提供灵活的功能和最佳实践。",
5
5
  "type": "module",
6
6
  "module": "./src/index.js",
@@ -40,7 +40,7 @@
40
40
  "express": "^5.2.1",
41
41
  "express-rate-limit": "^8.2.1",
42
42
  "helmet": "^8.1.0",
43
- "pino": "^10.2.0",
43
+ "pino": "^10.2.1",
44
44
  "pino-http": "^11.0.0",
45
45
  "pino-pretty": "^13.1.3"
46
46
  },
package/src/index.js CHANGED
@@ -1,10 +1,10 @@
1
- import P from 'express';
1
+ import L from 'express';
2
2
  import B from 'helmet';
3
3
  import X from 'cors';
4
4
  import {rateLimit as Q, ipKeyGenerator as J} from 'express-rate-limit';
5
5
  import Y from 'compression';
6
6
  import Z from 'pino-http';
7
- import {createServer as D} from 'node:http';
7
+ import {createServer as C} from 'node:http';
8
8
  import q from 'node:https';
9
9
  import b from 'pino';
10
10
  import j from 'node:os';
@@ -12,20 +12,20 @@ import G from 'node:net';
12
12
  var c = (e = new Date()) => e.toLocaleString('zh-CN', {timeZone: 'Asia/Shanghai', hour12: !1}),
13
13
  w = e => Object.prototype.toString.call(e).slice(8, -1).toLowerCase(),
14
14
  g = e => {
15
- let o = e ? 'https' : 'http',
16
- t = j.networkInterfaces(),
17
- r = [];
18
- return (Object.keys(t).map(i => r.push(...t[i])), r.filter(i => i.family === 'IPv4').map(i => i.address));
15
+ let r = e ? 'https' : 'http',
16
+ o = j.networkInterfaces(),
17
+ t = [];
18
+ return (Object.keys(o).map(n => t.push(...o[n])), t.filter(n => n.family === 'IPv4').map(n => n.address));
19
19
  },
20
20
  y = e => {
21
- let o = e ?? process.argv.slice(2) ?? [],
22
- t = {};
21
+ let r = e ?? process.argv.slice(2) ?? [],
22
+ o = {};
23
23
  return (
24
- o.map(r => {
25
- let [s, i] = r.split('=');
26
- t[s] = i;
24
+ r.map(t => {
25
+ let [s, n] = t.split('=');
26
+ o[s] = n;
27
27
  }),
28
- t
28
+ o
29
29
  );
30
30
  },
31
31
  F = {
@@ -42,67 +42,67 @@ var c = (e = new Date()) => e.toLocaleString('zh-CN', {timeZone: 'Asia/Shanghai'
42
42
  JWT_SECRET: 'secret',
43
43
  AUTH_TOKEN: 'authToken',
44
44
  },
45
- V = (e, o, t) => {
46
- let [r, s] = e.split('.');
47
- r && s ? (t[r] || (t[r] = {}), (t[r][s] = o)) : (t[r] = o);
45
+ V = (e, r, o) => {
46
+ let [t, s] = e.split('.');
47
+ t && s ? (o[t] || (o[t] = {}), (o[t][s] = r)) : (o[t] = r);
48
48
  },
49
- v = (e = {}, o = F) => {
50
- let {env: t} = process;
51
- Object.keys(o).map(s => {
52
- let i = t[s] ?? e[s];
53
- i && V(o[s], i, e);
49
+ v = (e = {}, r = F) => {
50
+ let {env: o} = process;
51
+ Object.keys(r).map(s => {
52
+ let n = o[s] ?? e[s];
53
+ n && V(r[s], n, e);
54
54
  });
55
- let r = {...e, ...y()};
56
- return ((r.port = r.staticPort || r.port), (r.isDev = r.nodeEnv === 'development'), (r.protocol = 'http'), r);
55
+ let t = {...e, ...y()};
56
+ return ((t.port = t.staticPort || t.port), (t.isDev = t.nodeEnv === 'development'), (t.protocol = 'http'), t);
57
57
  },
58
- x = (e, o = '127.0.0.1') =>
59
- new Promise(t => {
60
- let r = G.createServer();
61
- (r.once('error', s => {
62
- (r.close(), t((s.code === 'EADDRINUSE', !1)));
58
+ x = (e, r = '127.0.0.1') =>
59
+ new Promise(o => {
60
+ let t = G.createServer();
61
+ (t.once('error', s => {
62
+ (t.close(), o((s.code === 'EADDRINUSE', !1)));
63
63
  }),
64
- r.once('listening', () => {
65
- (r.close(), t(!0));
64
+ t.once('listening', () => {
65
+ (t.close(), o(!0));
66
66
  }),
67
- r.listen(Number(e), o));
67
+ t.listen(Number(e), r));
68
68
  }),
69
- A = (e, o = {}, t) => {
70
- let r = s => {
71
- (t.warn(`\u6536\u5230 ${s} \u4FE1\u53F7, \u{1F6D1} \u6B63\u5728\u5173\u95ED\u670D\u52A1\u5668...`),
69
+ A = (e, r = {}, o) => {
70
+ let t = s => {
71
+ (o.warn(`\u6536\u5230 ${s} \u4FE1\u53F7, \u{1F6D1} \u6B63\u5728\u5173\u95ED\u670D\u52A1\u5668...`),
72
72
  e.close(async () => {
73
- (t.info('\u{1F44B} \u670D\u52A1\u5668\u5DF2\u5173\u95ED'), await o.shutdown?.(), process.exit(0));
73
+ (o.info('\u{1F44B} \u670D\u52A1\u5668\u5DF2\u5173\u95ED'), await r.shutdown?.(), process.exit(0));
74
74
  }),
75
75
  setTimeout(() => {
76
- (t.error('\u274C \u5F3A\u5236\u5173\u95ED\u670D\u52A1\u5668'), process.exit(1));
76
+ (o.error('\u274C \u5F3A\u5236\u5173\u95ED\u670D\u52A1\u5668'), process.exit(1));
77
77
  }, 5e3));
78
78
  };
79
- (process.on('SIGTERM', () => r('SIGTERM')),
80
- process.on('SIGINT', () => r('SIGINT')),
79
+ (process.on('SIGTERM', () => t('SIGTERM')),
80
+ process.on('SIGINT', () => t('SIGINT')),
81
81
  process.on('uncaughtException', s => {
82
- (t.fatal(s, `\u{1F4A5} \u672A\u6355\u83B7\u7684\u5F02\u5E38: ${s.message}`), process.exit(1));
82
+ (o.fatal(s, `\u{1F4A5} \u672A\u6355\u83B7\u7684\u5F02\u5E38: ${s.message}`), process.exit(1));
83
83
  }),
84
- process.on('unhandledRejection', (s, i) => {
85
- (t.fatal({reason: s, promise: i}, '\u26A0\uFE0F \u672A\u5904\u7406\u7684 Promise \u62D2\u7EDD'), process.exit(1));
84
+ process.on('unhandledRejection', (s, n) => {
85
+ (o.fatal({reason: s, promise: n}, '\u26A0\uFE0F \u672A\u5904\u7406\u7684 Promise \u62D2\u7EDD'), process.exit(1));
86
86
  }));
87
87
  },
88
- $ = (e, {port: o, host: t = '0.0.0.0'} = {}) =>
89
- new Promise((r, s) => {
90
- let i = m => {
91
- (a(), s(m));
88
+ $ = (e, {port: r, host: o = '0.0.0.0'} = {}) =>
89
+ new Promise((t, s) => {
90
+ let n = a => {
91
+ (p(), s(a));
92
92
  },
93
- n = () => {
94
- (a(), r(e));
93
+ i = () => {
94
+ (p(), t(e));
95
95
  },
96
- a = () => {
97
- (e.off('error', i), e.off('listening', n));
96
+ p = () => {
97
+ (e.off('error', n), e.off('listening', i));
98
98
  };
99
- (e.once('error', i), e.once('listening', n), e.listen(o, t));
99
+ (e.once('error', n), e.once('listening', i), e.listen(r, o));
100
100
  }),
101
- R = (e, o = 56) => {
102
- let t = e.length,
103
- r = o - t,
104
- s = ~~(r / 2);
105
- return `${'-'.repeat(s)}${e}${'-'.repeat(r - s)}`;
101
+ R = (e, r = 56) => {
102
+ let o = e.length,
103
+ t = r - o,
104
+ s = ~~(t / 2);
105
+ return `${'-'.repeat(s)}${e}${'-'.repeat(t - s)}`;
106
106
  };
107
107
  import 'dotenv';
108
108
  var W = {
@@ -125,138 +125,140 @@ var W = {
125
125
  logLevel: process.env.LOG_LEVEL || 30,
126
126
  },
127
127
  S = W;
128
- var f = (e, o) =>
128
+ var f = (e, {transportOpt: r, ...o} = {}) =>
129
129
  b({
130
130
  name: e,
131
131
  level: S.logLevel,
132
132
  formatters: {level: t => ({level: t})},
133
133
  timestamp: b.stdTimeFunctions.isoTime,
134
134
  base: null,
135
- transport: {target: 'pino-pretty', options: {colorize: !0, sync: !0, levelFirst: !0}, ignore: 'pid,hostname,level,time', translateTime: 'SYS:yyyy-mm-dd HH:MM:ss'},
135
+ transport: {target: 'pino-pretty', options: {colorize: !0, levelFirst: !0, ...r}, ignore: 'pid,hostname,level,time', translateTime: 'SYS:yyyy-mm-dd HH:MM:ss'},
136
136
  ...o,
137
137
  });
138
- var p = f('huxy');
138
+ var h = f;
139
139
  var O = f('error-handler'),
140
- _ = e => (o, t, r) => {
141
- (O.error({message: 'Not Found', timestamp: c(), url: o.originalUrl, method: o.method, ip: o.ip, userAgent: o.get('User-Agent')}, '\u627E\u4E0D\u5230\u8DEF\u5F84'),
142
- t.status(404).json({success: !1, status: 404, url: o.originalUrl, message: `\u8DEF\u7531 [${o.method} ${o.originalUrl}] \u4E0D\u5B58\u5728`, timestamp: c()}));
140
+ N = e => (r, o, t) => {
141
+ (O.error({message: 'Not Found', timestamp: c(), url: r.originalUrl, method: r.method, ip: r.ip, userAgent: r.get('User-Agent')}, '\u627E\u4E0D\u5230\u8DEF\u5F84'),
142
+ o.status(404).json({success: !1, status: 404, url: r.originalUrl, message: `\u8DEF\u7531 [${r.method} ${r.originalUrl}] \u4E0D\u5B58\u5728`, timestamp: c()}));
143
143
  },
144
- N = e => (o, t, r, s) => {
145
- let i = o.status || 500,
146
- n = o.message;
147
- (O.error({message: n, timestamp: c(), stack: o.stack, url: t.originalUrl, method: t.method, ip: t.ip, userAgent: t.get('User-Agent')}, '\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF'),
148
- r.status(i).json({success: !1, message: (e.isDev, n), stack: e.isDev ? o.stack : void 0, timestamp: c()}));
144
+ _ = e => (r, o, t, s) => {
145
+ let n = r.status || 500,
146
+ i = r.message;
147
+ (O.error({message: i, timestamp: c(), stack: r.stack, url: o.originalUrl, method: o.method, ip: o.ip, userAgent: o.get('User-Agent')}, '\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF'),
148
+ t.status(n).json({success: !1, message: (e.isDev, i), stack: e.isDev ? r.stack : void 0, timestamp: c()}));
149
149
  };
150
150
  import {Router as K} from 'express';
151
151
  var z = e => {
152
- let o = K();
152
+ let r = K();
153
153
  return (
154
- o.use('/health', (t, r) => {
155
- r.status(200).json({status: 'OK', timestamp: c(), environment: e.nodeEnv, uptime: process.uptime(), memoryUsage: process.memoryUsage(), pid: process.pid});
154
+ r.use('/health', (o, t) => {
155
+ t.status(200).json({status: 'OK', timestamp: c(), environment: e.nodeEnv, uptime: process.uptime(), memoryUsage: process.memoryUsage(), pid: process.pid});
156
156
  }),
157
- o.get('/', (t, r) => {
158
- r.status(200).json({message: 'Node.js \u670D\u52A1\u5668\u8FD0\u884C\u4E2D', timestamp: c(), environment: e.nodeEnv});
157
+ r.get('/', (o, t) => {
158
+ t.status(200).json({message: 'Node.js \u670D\u52A1\u5668\u8FD0\u884C\u4E2D', timestamp: c(), environment: e.nodeEnv});
159
159
  }),
160
- o
160
+ r
161
161
  );
162
162
  },
163
163
  M = z;
164
- var ee = (e, o = {}) => {
164
+ var ee = (e, r = {}, o) => {
165
165
  (e.disable('x-powered-by'),
166
- e.set('trust proxy', o.trustProxy ?? 1),
167
- e.use(Z({logger: p, quietReqLogger: !0, autoLogging: !1, genReqId: !1})),
166
+ e.set('trust proxy', r.trustProxy ?? 1),
167
+ e.use(Z({logger: o, quietReqLogger: !0, autoLogging: !1, genReqId: !1})),
168
168
  e.use(Y()),
169
- e.use(B(o.helmet)),
170
- e.use(X(o.cors)),
171
- e.use(o.apiPrefix, Q({keyGenerator: t => J(t.ip) || t.headers['x-huxy-auth'] || t.headers['x-api-key'] || t.headers.authorization, ...o.rateLimit})),
172
- e.use(P.json({limit: '20mb'})),
173
- e.use(P.urlencoded({extended: !0, limit: '20mb'})));
169
+ e.use(B(r.helmet)),
170
+ e.use(X(r.cors)),
171
+ e.use(r.apiPrefix, Q({keyGenerator: t => J(t.ip) || t.headers['x-huxy-auth'] || t.headers['x-api-key'] || t.headers.authorization, ...r.rateLimit})),
172
+ e.use(L.json({limit: '20mb'})),
173
+ e.use(L.urlencoded({extended: !0, limit: '20mb'})));
174
174
  },
175
- te = (e, o = {}) => {
176
- (e.use(M(o)), e.use(_(o)), e.use(N(o)));
175
+ te = (e, r = {}) => {
176
+ (e.use(M(r)), e.use(N(r)), e.use(_(r)));
177
177
  },
178
- oe = async (e, o) => {
179
- let t = v(e),
180
- {port: r, ssl: s} = t;
181
- (await x(r, t.host)) || ((t.port = Number(r) + 1), p.warn(`\u7AEF\u53E3 ${r} \u5DF2\u88AB\u5360\u7528\uFF0C\u73B0\u5728\u4F7F\u7528\u7AEF\u53E3 ${t.port}`));
182
- let n = P();
183
- ee(n, t);
184
- let a;
185
- (s
186
- ? (w(s) === 'object' ||
187
- (p.error({ssl: {key: '/path/to/name.key', cert: '/path/to/name.pem'}}, '\u26A0\uFE0F \u8BF7\u8BBE\u7F6E\u6709\u6548 SSL \u6216\u8BBE\u7F6E {ssl: false}'), process.exit(1)),
188
- (t.protocol = 'https'),
189
- (a = q.createServer(s, n)),
190
- D((d, l) => {
191
- (l.writeHead(301, {Location: `${t.protocol}://${d.headers.host}${d.url}`}), l.end());
178
+ oe = async (e = {}, r) => {
179
+ let o = h(e.loggerName || 'huxy', e.loggerConfig),
180
+ t = h('http-request', e.loggerConfig),
181
+ s = v(e),
182
+ {port: n, ssl: i} = s;
183
+ (await x(n, s.host)) || ((s.port = Number(n) + 1), o.warn(`\u7AEF\u53E3 ${n} \u5DF2\u88AB\u5360\u7528\uFF0C\u73B0\u5728\u4F7F\u7528\u7AEF\u53E3 ${s.port}`));
184
+ let a = L();
185
+ ee(a, s, t);
186
+ let l;
187
+ (i
188
+ ? (w(i) === 'object' ||
189
+ (o.error({ssl: {key: '/path/to/name.key', cert: '/path/to/name.pem'}}, '\u26A0\uFE0F \u8BF7\u8BBE\u7F6E\u6709\u6548 SSL \u6216\u8BBE\u7F6E {ssl: false}'), process.exit(1)),
190
+ (s.protocol = 'https'),
191
+ (l = q.createServer(i, a)),
192
+ C((d, u) => {
193
+ (u.writeHead(301, {Location: `${s.protocol}://${d.headers.host}${d.url}`}), u.end());
192
194
  }).listen(80))
193
- : (a = D(n)),
194
- A(a, t, p));
195
+ : (l = C(a)),
196
+ A(l, s, o));
195
197
  try {
196
- await $(a, t);
198
+ await $(l, s);
197
199
  } catch (m) {
198
- (p.error({err: m}, '\u26A0\uFE0F \u670D\u52A1\u5668\u542F\u52A8\u5931\u8D25'), process.exit(1));
200
+ (o.error({err: m}, '\u26A0\uFE0F \u670D\u52A1\u5668\u542F\u52A8\u5931\u8D25'), process.exit(1));
199
201
  }
200
202
  try {
201
- await o?.(t, n, a, p);
203
+ await r?.(s, a, l, o);
202
204
  } catch (m) {
203
- (p.error({err: m}, `\u274C \u56DE\u8C03\u51FD\u6570\u9519\u8BEF\uFF1A${m.message}`), process.exit(1));
205
+ (o.error({err: m}, `\u274C \u56DE\u8C03\u51FD\u6570\u9519\u8BEF\uFF1A${m.message}`), process.exit(1));
204
206
  }
205
- return (te(n, t), {app: n, httpServer: a, config: t, logger: p});
207
+ return (te(a, s), {app: a, httpServer: l, config: s, logger: o});
206
208
  },
207
- H = oe;
208
- var re = (e, o, t) =>
209
- H({...S, ...e}, async (r, s, i, n) => {
210
- let {port: a, host: m, nodeEnv: d, basepath: l, appName: u = 'HuxyServer', protocol: h} = r;
211
- if (!t) {
209
+ D = oe;
210
+ var re = (e, r, o) =>
211
+ D({...S, ...e}, async (t, s, n, i) => {
212
+ let {port: p, host: a, nodeEnv: l, basepath: m, appName: d = 'HuxyServer', protocol: u} = t;
213
+ if (!o) {
212
214
  let U = g()
213
- .filter(E => E !== m)
214
- .map(E => `${h}://${E}:${a}${l}`);
215
- (n.info(R(u)),
216
- n.info(`\u{1F680} \u670D\u52A1\u8FD0\u884C\u5728\u3010${d}\u3011\u73AF\u5883: ${h}://${m}:${a}${l}`),
217
- n.info(`-----------------[${c()}]------------------`),
218
- n.info({ips: U}, '\u672C\u5730\u5730\u5740\uFF1A'));
215
+ .filter(E => E !== a)
216
+ .map(E => `${u}://${E}:${p}${m}`);
217
+ (i.info(R(d)),
218
+ i.info(`\u{1F680} \u670D\u52A1\u8FD0\u884C\u5728\u3010${l}\u3011\u73AF\u5883: ${u}://${a}:${p}${m}`),
219
+ i.info(`-----------------[${c()}]------------------`),
220
+ i.info({ips: U}, '\u672C\u5730\u5730\u5740\uFF1A'));
219
221
  }
220
- await o?.(r, s, i, n);
222
+ await r?.(t, s, n, i);
221
223
  }),
222
224
  T = re;
223
225
  import ae from 'express';
224
226
  import {fileURLToPath as se} from 'node:url';
225
227
  import {dirname as ne, resolve as ie} from 'node:path';
226
- var I = (e = import.meta.url) => ne(se(e)),
227
- L = (...e) => ie(I(), ...e),
228
- k = L;
228
+ var P = (e = import.meta.url) => ne(se(e)),
229
+ I = (...e) => ie(P(), ...e),
230
+ H = I;
229
231
  var ce = {port: 9e3, host: 'localhost', basepath: '/', buildPath: './build'},
230
232
  me = e => (e ? (e.endsWith('/') ? e : `${e}/`) : '/'),
231
- pe = (e, o) =>
232
- T({...ce, ...e}, async (t, r, s, i) => {
233
- await o?.(t, r, s, i);
234
- let {basepath: n, buildPath: a} = t;
235
- (n !== '/' &&
236
- r.get('/', (l, u, h) => {
237
- if (l.path === '/') return u.redirect(n);
238
- h();
233
+ pe = (e, r) =>
234
+ T({...ce, ...e}, async (o, t, s, n) => {
235
+ await r?.(o, t, s, n);
236
+ let {basepath: i, buildPath: p} = o;
237
+ (i !== '/' &&
238
+ t.get('/', (m, d, u) => {
239
+ if (m.path === '/') return d.redirect(i);
240
+ u();
239
241
  }),
240
- r.use(n, ae.static(a, {...t.staticCache})));
241
- let m = me(n),
242
- d = new RegExp(`^${m.replace(/\//g, '\\/')}(.*)$`);
243
- r.get(d, (l, u) => {
244
- u.sendFile(k(a, 'index.html'));
242
+ t.use(i, ae.static(p, {...o.staticCache})));
243
+ let a = me(i),
244
+ l = new RegExp(`^${a.replace(/\//g, '\\/')}(.*)$`);
245
+ t.get(l, (m, d) => {
246
+ d.sendFile(H(p, 'index.html'));
245
247
  });
246
248
  }),
247
- C = pe;
248
- var ot = {startServer: T, startStatic: C, logger: p, createLogger: f, dateTime: c, localIPs: g, nodeArgs: y, getEnvConfig: v, checkPort: x, getDirName: I, resolvePath: L};
249
+ k = pe;
250
+ var ot = {startServer: T, startStatic: k, logger: h, createLogger: f, dateTime: c, localIPs: g, nodeArgs: y, getEnvConfig: v, checkPort: x, getDirName: P, resolvePath: I};
249
251
  export {
250
252
  x as checkPort,
251
253
  f as createLogger,
252
254
  c as dateTime,
253
255
  ot as default,
254
- I as getDirName,
256
+ P as getDirName,
255
257
  v as getEnvConfig,
256
258
  g as localIPs,
257
- p as logger,
259
+ h as logger,
258
260
  y as nodeArgs,
259
- L as resolvePath,
261
+ I as resolvePath,
260
262
  T as startServer,
261
- C as startStatic,
263
+ k as startStatic,
262
264
  };