huxy-node-server 1.0.7 → 1.0.9

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 +139 -134
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.9",
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,29 +1,29 @@
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';
11
11
  import G from 'node:net';
12
- var c = (e = new Date()) => e.toLocaleString('zh-CN', {timeZone: 'Asia/Shanghai', hour12: !1}),
12
+ var m = (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
- g = e => {
15
- let o = e ? 'https' : 'http',
14
+ h = e => {
15
+ let r = e ? 'https' : 'http',
16
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));
17
+ o = [];
18
+ return (Object.keys(t).map(n => o.push(...t[n])), o.filter(n => n.family === 'IPv4').map(n => n.address));
19
19
  },
20
20
  y = e => {
21
- let o = e ?? process.argv.slice(2) ?? [],
21
+ let r = e ?? process.argv.slice(2) ?? [],
22
22
  t = {};
23
23
  return (
24
- o.map(r => {
25
- let [s, i] = r.split('=');
26
- t[s] = i;
24
+ r.map(o => {
25
+ let [s, n] = o.split('=');
26
+ t[s] = n;
27
27
  }),
28
28
  t
29
29
  );
@@ -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, t) => {
46
+ let [o, s] = e.split('.');
47
+ o && s ? (t[o] || (t[o] = {}), (t[o][s] = r)) : (t[o] = r);
48
48
  },
49
- v = (e = {}, o = F) => {
49
+ v = (e = {}, r = F) => {
50
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);
51
+ Object.keys(r).map(s => {
52
+ let n = t[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 o = {...e, ...y()};
56
+ return ((o.port = o.staticPort || o.port), (o.isDev = o.nodeEnv === 'development'), (o.protocol = 'http'), o);
57
57
  },
58
- x = (e, o = '127.0.0.1') =>
58
+ x = (e, r = '127.0.0.1') =>
59
59
  new Promise(t => {
60
- let r = G.createServer();
61
- (r.once('error', s => {
62
- (r.close(), t((s.code === 'EADDRINUSE', !1)));
60
+ let o = G.createServer();
61
+ (o.once('error', s => {
62
+ (o.close(), t((s.code === 'EADDRINUSE', !1)));
63
63
  }),
64
- r.once('listening', () => {
65
- (r.close(), t(!0));
64
+ o.once('listening', () => {
65
+ (o.close(), t(!0));
66
66
  }),
67
- r.listen(Number(e), o));
67
+ o.listen(Number(e), r));
68
68
  }),
69
- A = (e, o = {}, t) => {
70
- let r = s => {
69
+ A = (e, r = {}, t) => {
70
+ let o = s => {
71
71
  (t.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
+ (t.info('\u{1F44B} \u670D\u52A1\u5668\u5DF2\u5173\u95ED'), await r.shutdown?.(), process.exit(0));
74
74
  }),
75
75
  setTimeout(() => {
76
76
  (t.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', () => o('SIGTERM')),
80
+ process.on('SIGINT', () => o('SIGINT')),
81
81
  process.on('uncaughtException', s => {
82
82
  (t.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
+ (t.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: t = '0.0.0.0'} = {}) =>
89
+ new Promise((o, s) => {
90
+ let n = c => {
91
+ (a(), s(c));
92
92
  },
93
- n = () => {
94
- (a(), r(e));
93
+ i = () => {
94
+ (a(), o(e));
95
95
  },
96
96
  a = () => {
97
- (e.off('error', i), e.off('listening', n));
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, t));
100
100
  }),
101
- R = (e, o = 56) => {
101
+ R = (e, r = 56) => {
102
102
  let t = e.length,
103
- r = o - t,
104
- s = ~~(r / 2);
105
- return `${'-'.repeat(s)}${e}${'-'.repeat(r - s)}`;
103
+ o = r - t,
104
+ s = ~~(o / 2);
105
+ return `${'-'.repeat(s)}${e}${'-'.repeat(o - s)}`;
106
106
  };
107
107
  import 'dotenv';
108
108
  var W = {
@@ -125,138 +125,143 @@ var W = {
125
125
  logLevel: process.env.LOG_LEVEL || 30,
126
126
  },
127
127
  S = W;
128
- var f = (e, o) =>
128
+ var u = (e, {transportOpt: r, ...t} = {}) =>
129
129
  b({
130
130
  name: e,
131
131
  level: S.logLevel,
132
- formatters: {level: t => ({level: t})},
132
+ formatters: {level: o => ({level: o})},
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'},
136
- ...o,
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
+ ...t,
137
137
  });
138
- var p = f('huxy');
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()}));
138
+ var f = u;
139
+ var O = u('error-handler'),
140
+ N = e => (r, t, o) => {
141
+ (O.error({message: 'Not Found', timestamp: m(), url: r.originalUrl, method: r.method, ip: r.ip, userAgent: r.get('User-Agent')}, '\u627E\u4E0D\u5230\u8DEF\u5F84'),
142
+ t.status(404).json({success: !1, status: 404, url: r.originalUrl, message: `\u8DEF\u7531 [${r.method} ${r.originalUrl}] \u4E0D\u5B58\u5728`, timestamp: m()}));
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, t, o, s) => {
145
+ let n = r.status || 500,
146
+ i = r.message;
147
+ (O.error({message: i, timestamp: m(), stack: r.stack, url: t.originalUrl, method: t.method, ip: t.ip, userAgent: t.get('User-Agent')}, '\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF'),
148
+ o.status(n).json({success: !1, message: (e.isDev, i), stack: e.isDev ? r.stack : void 0, timestamp: m()}));
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', (t, o) => {
155
+ o.status(200).json({status: 'OK', timestamp: m(), 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('/', (t, o) => {
158
+ o.status(200).json({message: 'Node.js \u670D\u52A1\u5668\u8FD0\u884C\u4E2D', timestamp: m(), 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 = {}) => {
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
+ r.httpLogger
168
+ ? e.use((t, o, s) => {
169
+ t.log = r.httpLogger;
170
+ })
171
+ : e.use(Z({logger: f('http-request', r.loggerConfig), quietReqLogger: !0, autoLogging: !1, genReqId: !1})),
168
172
  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'})));
173
+ e.use(B(r.helmet)),
174
+ e.use(X(r.cors)),
175
+ 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})),
176
+ e.use(L.json({limit: '20mb'})),
177
+ e.use(L.urlencoded({extended: !0, limit: '20mb'})));
174
178
  },
175
- te = (e, o = {}) => {
176
- (e.use(M(o)), e.use(_(o)), e.use(N(o)));
179
+ te = (e, r = {}) => {
180
+ (e.use(M(r)), e.use(N(r)), e.use(_(r)));
177
181
  },
178
- oe = async (e, o) => {
182
+ oe = async (e = {}, r) => {
179
183
  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)),
184
+ o = t.logger ?? f(t.loggerName || 'huxy', t.loggerConfig),
185
+ {port: s, ssl: n} = t;
186
+ (await x(s, t.host)) || ((t.port = Number(s) + 1), o.warn(`\u7AEF\u53E3 ${s} \u5DF2\u88AB\u5360\u7528\uFF0C\u73B0\u5728\u4F7F\u7528\u7AEF\u53E3 ${t.port}`));
187
+ let a = L();
188
+ ee(a, t);
189
+ let c;
190
+ (n
191
+ ? (w(n) === 'object' ||
192
+ (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)),
188
193
  (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());
194
+ (c = q.createServer(n, a)),
195
+ C((l, d) => {
196
+ (d.writeHead(301, {Location: `${t.protocol}://${l.headers.host}${l.url}`}), d.end());
192
197
  }).listen(80))
193
- : (a = D(n)),
194
- A(a, t, p));
198
+ : (c = C(a)),
199
+ A(c, t, o));
195
200
  try {
196
- await $(a, t);
197
- } catch (m) {
198
- (p.error({err: m}, '\u26A0\uFE0F \u670D\u52A1\u5668\u542F\u52A8\u5931\u8D25'), process.exit(1));
201
+ await $(c, t);
202
+ } catch (p) {
203
+ (o.error({err: p}, '\u26A0\uFE0F \u670D\u52A1\u5668\u542F\u52A8\u5931\u8D25'), process.exit(1));
199
204
  }
200
205
  try {
201
- await o?.(t, n, a, p);
202
- } catch (m) {
203
- (p.error({err: m}, `\u274C \u56DE\u8C03\u51FD\u6570\u9519\u8BEF\uFF1A${m.message}`), process.exit(1));
206
+ await r?.(t, a, c, o);
207
+ } catch (p) {
208
+ (o.error({err: p}, `\u274C \u56DE\u8C03\u51FD\u6570\u9519\u8BEF\uFF1A${p.message}`), process.exit(1));
204
209
  }
205
- return (te(n, t), {app: n, httpServer: a, config: t, logger: p});
210
+ return (te(a, t), {app: a, httpServer: c, config: t, logger: o});
206
211
  },
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;
212
+ D = oe;
213
+ var re = (e, r, t) =>
214
+ D({...S, ...e}, async (o, s, n, i) => {
215
+ let {port: a, host: c, nodeEnv: p, basepath: l, appName: d = 'HuxyServer', protocol: g} = o;
211
216
  if (!t) {
212
- 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'));
217
+ let U = h()
218
+ .filter(E => E !== c)
219
+ .map(E => `${g}://${E}:${a}${l}`);
220
+ (i.info(R(d)),
221
+ i.info(`\u{1F680} \u670D\u52A1\u8FD0\u884C\u5728\u3010${p}\u3011\u73AF\u5883: ${g}://${c}:${a}${l}`),
222
+ i.info(`-----------------[${m()}]------------------`),
223
+ i.info({ips: U}, '\u672C\u5730\u5730\u5740\uFF1A'));
219
224
  }
220
- await o?.(r, s, i, n);
225
+ await r?.(o, s, n, i);
221
226
  }),
222
227
  T = re;
223
228
  import ae from 'express';
224
229
  import {fileURLToPath as se} from 'node:url';
225
230
  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;
231
+ var P = (e = import.meta.url) => ne(se(e)),
232
+ I = (...e) => ie(P(), ...e),
233
+ H = I;
229
234
  var ce = {port: 9e3, host: 'localhost', basepath: '/', buildPath: './build'},
230
235
  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();
236
+ pe = (e, r) =>
237
+ T({...ce, ...e}, async (t, o, s, n) => {
238
+ await r?.(t, o, s, n);
239
+ let {basepath: i, buildPath: a} = t;
240
+ (i !== '/' &&
241
+ o.get('/', (l, d, g) => {
242
+ if (l.path === '/') return d.redirect(i);
243
+ g();
239
244
  }),
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'));
245
+ o.use(i, ae.static(a, {...t.staticCache})));
246
+ let c = me(i),
247
+ p = new RegExp(`^${c.replace(/\//g, '\\/')}(.*)$`);
248
+ o.get(p, (l, d) => {
249
+ d.sendFile(H(a, 'index.html'));
245
250
  });
246
251
  }),
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};
252
+ k = pe;
253
+ var ot = {startServer: T, startStatic: k, logger: f, createLogger: u, dateTime: m, localIPs: h, nodeArgs: y, getEnvConfig: v, checkPort: x, getDirName: P, resolvePath: I};
249
254
  export {
250
255
  x as checkPort,
251
- f as createLogger,
252
- c as dateTime,
256
+ u as createLogger,
257
+ m as dateTime,
253
258
  ot as default,
254
- I as getDirName,
259
+ P as getDirName,
255
260
  v as getEnvConfig,
256
- g as localIPs,
257
- p as logger,
261
+ h as localIPs,
262
+ f as logger,
258
263
  y as nodeArgs,
259
- L as resolvePath,
264
+ I as resolvePath,
260
265
  T as startServer,
261
- C as startStatic,
266
+ k as startStatic,
262
267
  };