@kevisual/router 0.0.46 → 0.0.48

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/dist/router.d.ts CHANGED
@@ -4,7 +4,7 @@ import https from 'node:https';
4
4
  import http2 from 'node:http2';
5
5
  import EventEmitter from 'node:events';
6
6
  import { EventEmitter as EventEmitter$1 } from 'events';
7
- import { WebSocketServer, WebSocket } from 'ws';
7
+ import { WebSocketServer } from 'ws';
8
8
  import { z } from 'zod';
9
9
  import { IncomingMessage as IncomingMessage$1, ServerResponse as ServerResponse$1 } from 'http';
10
10
  import { RouteOpts as RouteOpts$1, QueryRouterServer as QueryRouterServer$1, RouteMiddleware as RouteMiddleware$1, Run as Run$1 } from '@kevisual/router';
@@ -405,13 +405,14 @@ type ServerOpts<T = {}> = {
405
405
  }) => any;
406
406
  cors?: Cors$2;
407
407
  io?: boolean;
408
+ showConnected?: boolean;
408
409
  } & T;
409
410
  interface ServerType {
410
411
  path?: string;
411
412
  server?: any;
412
413
  handle: ServerOpts['handle'];
413
414
  setHandle(handle?: any): void;
414
- listeners: Listener$1[];
415
+ listeners: Listener[];
415
416
  listen(port: number, hostname?: string, backlog?: number, listeningListener?: () => void): void;
416
417
  listen(port: number, hostname?: string, listeningListener?: () => void): void;
417
418
  listen(port: number, backlog?: number, listeningListener?: () => void): void;
@@ -428,6 +429,7 @@ interface ServerType {
428
429
  on(listener: OnListener): void;
429
430
  onWebSocket({ ws, message, pathname, token, id }: OnWebSocketOptions): void;
430
431
  onWsClose(ws: WS): void;
432
+ sendConnected(ws: WS): void;
431
433
  }
432
434
  type OnWebSocketOptions = {
433
435
  ws: WS;
@@ -437,7 +439,7 @@ type OnWebSocketOptions = {
437
439
  id?: string;
438
440
  };
439
441
  type OnWebSocketFn = (options: OnWebSocketOptions) => Promise<void> | void;
440
- type WS = {
442
+ type WS<T = {}> = {
441
443
  send: (data: any) => void;
442
444
  close: (code?: number, reason?: string) => void;
443
445
  data?: {
@@ -449,15 +451,15 @@ type WS = {
449
451
  * 鉴权后的获取的信息
450
452
  */
451
453
  userApp?: string;
452
- };
454
+ } & T;
453
455
  };
454
- type Listener$1 = {
456
+ type Listener = {
455
457
  id?: string;
456
458
  io?: boolean;
457
459
  path?: string;
458
- fun: WebScoketListenerFun | HttpListenerFun;
460
+ func: WebSocketListenerFun | HttpListenerFun;
459
461
  };
460
- type WebScoketListenerFun = (req: WebSocketReq, res: WebSocketRes) => Promise<void> | void;
462
+ type WebSocketListenerFun = (req: WebSocketReq, res: WebSocketRes) => Promise<void> | void;
461
463
  type HttpListenerFun = (req: RouterReq, res: RouterRes) => Promise<void> | void;
462
464
  type WebSocketReq = {
463
465
  emitter?: EventEmitter;
@@ -470,8 +472,8 @@ type WebSocketReq = {
470
472
  type WebSocketRes = {
471
473
  end: (data: any) => void;
472
474
  };
473
- type ListenerFun = WebScoketListenerFun | HttpListenerFun;
474
- type OnListener = Listener$1 | ListenerFun | (Listener$1 | ListenerFun)[];
475
+ type ListenerFun = WebSocketListenerFun | HttpListenerFun;
476
+ type OnListener = Listener | ListenerFun | (Listener | ListenerFun)[];
475
477
  type RouterReq<T = {}> = {
476
478
  url: string;
477
479
  method: string;
@@ -480,6 +482,7 @@ type RouterReq<T = {}> = {
480
482
  remoteAddress?: string;
481
483
  remotePort?: number;
482
484
  };
485
+ body?: string;
483
486
  cookies?: Record<string, string>;
484
487
  } & T;
485
488
  type RouterRes<T = {}> = {
@@ -615,8 +618,9 @@ declare class ServerBase implements ServerType {
615
618
  handle: ServerOpts['handle'];
616
619
  _callback: any;
617
620
  cors: Cors$1;
618
- listeners: Listener$1[];
621
+ listeners: Listener[];
619
622
  emitter: EventEmitter$1<any>;
623
+ showConnected: boolean;
620
624
  constructor(opts?: ServerOpts);
621
625
  listen(port: number, hostname?: string, backlog?: number, listeningListener?: () => void): void;
622
626
  listen(port: number, hostname?: string, listeningListener?: () => void): void;
@@ -644,25 +648,15 @@ declare class ServerBase implements ServerType {
644
648
  on(listener: OnListener): void;
645
649
  onWebSocket({ ws, message, pathname, token, id }: OnWebSocketOptions): Promise<void>;
646
650
  onWsClose(ws: WS): Promise<void>;
651
+ sendConnected(ws: WS): Promise<void>;
647
652
  }
648
653
 
649
654
  type WsServerBaseOpts = {
650
655
  wss?: WebSocketServer | null;
651
656
  path?: string;
652
657
  };
653
- type ListenerFn = (message: {
654
- data: Record<string, any>;
655
- ws: WebSocket;
656
- end: (data: any) => any;
657
- }) => Promise<any>;
658
- type Listener<T = 'router' | 'chat' | 'ai'> = {
659
- type: T;
660
- path?: string;
661
- listener: ListenerFn;
662
- };
663
658
  declare class WsServerBase {
664
659
  wss: WebSocketServer | null;
665
- listeners: Listener[];
666
660
  listening: boolean;
667
661
  server: ServerType;
668
662
  constructor(opts: WsServerBaseOpts);
@@ -689,7 +683,7 @@ declare class ServerNode extends ServerBase implements ServerType {
689
683
  _callback: any;
690
684
  cors: Cors;
691
685
  private httpType;
692
- listeners: Listener$1[];
686
+ listeners: Listener[];
693
687
  private options;
694
688
  io: WsServer | undefined;
695
689
  constructor(opts?: ServerNodeOpts);
@@ -936,4 +930,4 @@ declare class App<U = {}> {
936
930
  }
937
931
 
938
932
  export { App, Connect, CustomError, Mini, QueryConnect, QueryRouter, QueryRouterServer, QueryUtil, Route, ServerNode, createSchema, define, handleServer, util };
939
- export type { Listener$1 as Listener, OnWebSocketFn, RouteArray, RouteContext, RouteMiddleware, RouteObject, RouteOpts, RouterReq, RouterRes, Rule, Run, Schema, WS, WebSocketReq, WebSocketRes };
933
+ export type { HttpListenerFun, Listener, OnListener, OnWebSocketFn, RouteArray, RouteContext, RouteMiddleware, RouteObject, RouteOpts, RouterReq, RouterRes, Rule, Run, Schema, WS, WebSocketListenerFun, WebSocketReq, WebSocketRes };
package/dist/router.js CHANGED
@@ -1215,10 +1215,12 @@ class ServerBase {
1215
1215
  cors;
1216
1216
  listeners = [];
1217
1217
  emitter = new EventEmitter();
1218
+ showConnected = true;
1218
1219
  constructor(opts) {
1219
1220
  this.path = opts?.path || '/api/router';
1220
1221
  this.handle = opts?.handle;
1221
1222
  this.cors = opts?.cors;
1223
+ this.showConnected = opts?.showConnected !== false;
1222
1224
  }
1223
1225
  listen(...args) {
1224
1226
  this.customListen(...args);
@@ -1261,9 +1263,9 @@ class ServerBase {
1261
1263
  }
1262
1264
  const listeners = that.listeners || [];
1263
1265
  for (const item of listeners) {
1264
- const fun = item.fun;
1265
- if (typeof fun === 'function' && !item.io) {
1266
- await fun(req, res);
1266
+ const func = item.func;
1267
+ if (typeof func === 'function' && !item.io) {
1268
+ await func(req, res);
1267
1269
  }
1268
1270
  }
1269
1271
  if (res.headersSent) {
@@ -1324,13 +1326,13 @@ class ServerBase {
1324
1326
  on(listener) {
1325
1327
  this.listeners = [];
1326
1328
  if (typeof listener === 'function') {
1327
- this.listeners.push({ fun: listener });
1329
+ this.listeners.push({ func: listener });
1328
1330
  return;
1329
1331
  }
1330
1332
  if (Array.isArray(listener)) {
1331
1333
  for (const item of listener) {
1332
1334
  if (typeof item === 'function') {
1333
- this.listeners.push({ fun: item });
1335
+ this.listeners.push({ func: item });
1334
1336
  }
1335
1337
  else {
1336
1338
  this.listeners.push(item);
@@ -1348,7 +1350,7 @@ class ServerBase {
1348
1350
  const end = (data) => {
1349
1351
  ws.send(JSON.stringify(data));
1350
1352
  };
1351
- listener.fun({
1353
+ listener.func({
1352
1354
  emitter: this.emitter,
1353
1355
  data,
1354
1356
  token,
@@ -1419,6 +1421,10 @@ class ServerBase {
1419
1421
  }, 5000);
1420
1422
  }
1421
1423
  }
1424
+ async sendConnected(ws) {
1425
+ if (this.showConnected)
1426
+ ws.send(JSON.stringify({ type: 'connected' }));
1427
+ }
1422
1428
  }
1423
1429
 
1424
1430
  function getDefaultExportFromCjs (x) {
@@ -6340,7 +6346,6 @@ var WebSocketServer = /*@__PURE__*/getDefaultExportFromCjs(websocketServerExport
6340
6346
  // @ts-type=ws
6341
6347
  class WsServerBase {
6342
6348
  wss;
6343
- listeners = [];
6344
6349
  listening = false;
6345
6350
  server;
6346
6351
  constructor(opts) {
@@ -6374,7 +6379,7 @@ class WsServerBase {
6374
6379
  ws.on('message', async (message) => {
6375
6380
  await this.server.onWebSocket({ ws, message, pathname, token, id });
6376
6381
  });
6377
- ws.send(JSON.stringify({ type: 'connected' }));
6382
+ this.server.sendConnected(ws);
6378
6383
  this.wss.on('close', () => {
6379
6384
  this.server.onWsClose(ws);
6380
6385
  });
@@ -6539,7 +6544,7 @@ class BunServer extends ServerBase {
6539
6544
  return new Response('WebSocket upgrade failed', { status: 400 });
6540
6545
  }
6541
6546
  // 将 Bun 的 Request 转换为 Node.js 风格的 req/res
6542
- return new Promise((resolve) => {
6547
+ return new Promise(async (resolve) => {
6543
6548
  const req = {
6544
6549
  url: url.pathname + url.search,
6545
6550
  method: request.method,
@@ -6548,6 +6553,11 @@ class BunServer extends ServerBase {
6548
6553
  // @ts-ignore
6549
6554
  remoteAddress: request?.remoteAddress || request?.ip || clientInfo?.address || '',
6550
6555
  remotePort: clientInfo?.port || 0,
6556
+ },
6557
+ // @ts-ignore
6558
+ bun: {
6559
+ request, // 原始请求对象
6560
+ server, // 原始服务器对象
6551
6561
  }
6552
6562
  };
6553
6563
  const res = {
@@ -6673,10 +6683,27 @@ class BunServer extends ServerBase {
6673
6683
  };
6674
6684
  // 处理请求体
6675
6685
  if (request.method !== 'GET' && request.method !== 'HEAD') {
6676
- request.text().then((body) => {
6677
- req.body = body;
6686
+ const contentType = request.headers.get('content-type') || '';
6687
+ if (contentType.includes('application/json')) {
6688
+ const text = await request.text();
6689
+ req.body = text;
6678
6690
  requestCallback(req, res);
6679
- });
6691
+ return;
6692
+ }
6693
+ else if (contentType.includes('application/x-www-form-urlencoded')) {
6694
+ const formData = await request.formData();
6695
+ const body = {};
6696
+ for (const [key, value] of formData.entries()) {
6697
+ body[key] = value;
6698
+ }
6699
+ req.body = JSON.stringify(body);
6700
+ requestCallback(req, res);
6701
+ return;
6702
+ }
6703
+ else {
6704
+ requestCallback(req, res);
6705
+ return;
6706
+ }
6680
6707
  }
6681
6708
  else {
6682
6709
  requestCallback(req, res);
@@ -6685,7 +6712,7 @@ class BunServer extends ServerBase {
6685
6712
  },
6686
6713
  websocket: {
6687
6714
  open: (ws) => {
6688
- ws.send(JSON.stringify({ type: 'connected' }));
6715
+ this.sendConnected(ws);
6689
6716
  },
6690
6717
  message: async (ws, message) => {
6691
6718
  const pathname = ws.data.pathname || '';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package",
3
3
  "name": "@kevisual/router",
4
- "version": "0.0.46",
4
+ "version": "0.0.48",
5
5
  "description": "",
6
6
  "type": "module",
7
7
  "main": "./dist/router.js",
package/src/index.ts CHANGED
@@ -21,5 +21,14 @@ export * from './router-define.ts';
21
21
 
22
22
 
23
23
  export {
24
- RouterReq, RouterRes, OnWebSocketFn, WS, WebSocketReq, WebSocketRes, Listener,
24
+ RouterReq,
25
+ RouterRes,
26
+ OnWebSocketFn,
27
+ WS,
28
+ WebSocketReq,
29
+ WebSocketRes,
30
+ Listener,
31
+ WebSocketListenerFun,
32
+ HttpListenerFun,
33
+ OnListener,
25
34
  } from './server/server-type.ts';
@@ -1,7 +1,7 @@
1
1
  import type { IncomingMessage, ServerResponse } from 'node:http';
2
2
  import { handleServer } from './handle-server.ts';
3
3
  import * as cookie from './cookie.ts';
4
- import { ServerType, Listener, OnListener, ServerOpts, OnWebSocketOptions, OnWebSocketFn, WebScoketListenerFun, ListenerFun, HttpListenerFun, WS } from './server-type.ts';
4
+ import { ServerType, Listener, OnListener, ServerOpts, OnWebSocketOptions, OnWebSocketFn, WebSocketListenerFun, ListenerFun, HttpListenerFun, WS } from './server-type.ts';
5
5
  import { parseIfJson } from '../utils/parse.ts';
6
6
  import { EventEmitter } from 'events';
7
7
  type CookieFn = (name: string, value: string, options?: cookie.SerializeOptions, end?: boolean) => void;
@@ -64,11 +64,12 @@ export class ServerBase implements ServerType {
64
64
  cors: Cors;
65
65
  listeners: Listener[] = [];
66
66
  emitter = new EventEmitter();
67
+ showConnected = true;
67
68
  constructor(opts?: ServerOpts) {
68
69
  this.path = opts?.path || '/api/router';
69
70
  this.handle = opts?.handle;
70
71
  this.cors = opts?.cors;
71
-
72
+ this.showConnected = opts?.showConnected !== false;
72
73
  }
73
74
  listen(port: number, hostname?: string, backlog?: number, listeningListener?: () => void): void;
74
75
  listen(port: number, hostname?: string, listeningListener?: () => void): void;
@@ -119,9 +120,9 @@ export class ServerBase implements ServerType {
119
120
  }
120
121
  const listeners = that.listeners || [];
121
122
  for (const item of listeners) {
122
- const fun = item.fun as any;
123
- if (typeof fun === 'function' && !item.io) {
124
- await fun(req, res);
123
+ const func = item.func as any;
124
+ if (typeof func === 'function' && !item.io) {
125
+ await func(req, res);
125
126
  }
126
127
  }
127
128
  if (res.headersSent) {
@@ -179,13 +180,13 @@ export class ServerBase implements ServerType {
179
180
  on(listener: OnListener) {
180
181
  this.listeners = [];
181
182
  if (typeof listener === 'function') {
182
- this.listeners.push({ fun: listener });
183
+ this.listeners.push({ func: listener });
183
184
  return;
184
185
  }
185
186
  if (Array.isArray(listener)) {
186
187
  for (const item of listener) {
187
188
  if (typeof item === 'function') {
188
- this.listeners.push({ fun: item });
189
+ this.listeners.push({ func: item });
189
190
  } else {
190
191
  this.listeners.push(item);
191
192
  }
@@ -202,7 +203,7 @@ export class ServerBase implements ServerType {
202
203
  const end = (data: any) => {
203
204
  ws.send(JSON.stringify(data));
204
205
  }
205
- (listener.fun as WebScoketListenerFun)({
206
+ (listener.func as WebSocketListenerFun)({
206
207
  emitter: this.emitter,
207
208
  data,
208
209
  token,
@@ -275,4 +276,8 @@ export class ServerBase implements ServerType {
275
276
  }, 5000);
276
277
  }
277
278
  }
279
+ async sendConnected(ws: WS) {
280
+ if (this.showConnected)
281
+ ws.send(JSON.stringify({ type: 'connected' }));
282
+ }
278
283
  }
@@ -71,7 +71,7 @@ export class BunServer extends ServerBase implements ServerType {
71
71
  }
72
72
 
73
73
  // 将 Bun 的 Request 转换为 Node.js 风格的 req/res
74
- return new Promise((resolve) => {
74
+ return new Promise(async (resolve) => {
75
75
  const req: RouterReq = {
76
76
  url: url.pathname + url.search,
77
77
  method: request.method,
@@ -80,6 +80,11 @@ export class BunServer extends ServerBase implements ServerType {
80
80
  // @ts-ignore
81
81
  remoteAddress: request?.remoteAddress || request?.ip || clientInfo?.address || '',
82
82
  remotePort: clientInfo?.port || 0,
83
+ },
84
+ // @ts-ignore
85
+ bun: {
86
+ request, // 原始请求对象
87
+ server, // 原始服务器对象
83
88
  }
84
89
  };
85
90
 
@@ -212,10 +217,25 @@ export class BunServer extends ServerBase implements ServerType {
212
217
  };
213
218
  // 处理请求体
214
219
  if (request.method !== 'GET' && request.method !== 'HEAD') {
215
- request.text().then((body) => {
216
- (req as any).body = body;
220
+ const contentType = request.headers.get('content-type') || '';
221
+ if (contentType.includes('application/json')) {
222
+ const text = await request.text();
223
+ req.body = text;
217
224
  requestCallback(req, res);
218
- });
225
+ return;
226
+ } else if (contentType.includes('application/x-www-form-urlencoded')) {
227
+ const formData = await request.formData();
228
+ const body: Record<string, any> = {};
229
+ for (const [key, value] of formData.entries()) {
230
+ body[key] = value;
231
+ }
232
+ req.body = JSON.stringify(body);
233
+ requestCallback(req, res);
234
+ return;
235
+ } else {
236
+ requestCallback(req, res);
237
+ return;
238
+ }
219
239
  } else {
220
240
  requestCallback(req, res);
221
241
  }
@@ -223,7 +243,7 @@ export class BunServer extends ServerBase implements ServerType {
223
243
  },
224
244
  websocket: {
225
245
  open: (ws: any) => {
226
- ws.send(JSON.stringify({ type: 'connected' }));
246
+ this.sendConnected(ws);
227
247
  },
228
248
  message: async (ws: any, message: string | Buffer) => {
229
249
  const pathname = ws.data.pathname || '';
@@ -16,6 +16,7 @@ export type ServerOpts<T = {}> = {
16
16
  handle?: (msg?: { path: string; key?: string;[key: string]: any }, ctx?: { req: http.IncomingMessage; res: http.ServerResponse }) => any;
17
17
  cors?: Cors;
18
18
  io?: boolean;
19
+ showConnected?: boolean;
19
20
  } & T;
20
21
 
21
22
  export interface ServerType {
@@ -40,11 +41,12 @@ export interface ServerType {
40
41
  on(listener: OnListener): void;
41
42
  onWebSocket({ ws, message, pathname, token, id }: OnWebSocketOptions): void;
42
43
  onWsClose(ws: WS): void;
44
+ sendConnected(ws: WS): void;
43
45
  }
44
46
 
45
47
  export type OnWebSocketOptions = { ws: WS; message: string | Buffer; pathname: string, token?: string, id?: string }
46
48
  export type OnWebSocketFn = (options: OnWebSocketOptions) => Promise<void> | void;
47
- export type WS = {
49
+ export type WS<T = {}> = {
48
50
  send: (data: any) => void;
49
51
  close: (code?: number, reason?: string) => void;
50
52
  data?: {
@@ -56,16 +58,16 @@ export type WS = {
56
58
  * 鉴权后的获取的信息
57
59
  */
58
60
  userApp?: string;
59
- }
61
+ } & T;
60
62
  }
61
63
  export type Listener = {
62
64
  id?: string;
63
65
  io?: boolean;
64
66
  path?: string;
65
- fun: WebScoketListenerFun | HttpListenerFun;
67
+ func: WebSocketListenerFun | HttpListenerFun;
66
68
  }
67
69
 
68
- export type WebScoketListenerFun = (req: WebSocketReq, res: WebSocketRes) => Promise<void> | void;
70
+ export type WebSocketListenerFun = (req: WebSocketReq, res: WebSocketRes) => Promise<void> | void;
69
71
  export type HttpListenerFun = (req: RouterReq, res: RouterRes) => Promise<void> | void;
70
72
 
71
73
  export type WebSocketReq = {
@@ -79,7 +81,7 @@ export type WebSocketReq = {
79
81
  export type WebSocketRes = {
80
82
  end: (data: any) => void;
81
83
  }
82
- export type ListenerFun = WebScoketListenerFun | HttpListenerFun;;
84
+ export type ListenerFun = WebSocketListenerFun | HttpListenerFun;;
83
85
  export type OnListener = Listener | ListenerFun | (Listener | ListenerFun)[];
84
86
  export type RouterReq<T = {}> = {
85
87
  url: string;
@@ -89,6 +91,7 @@ export type RouterReq<T = {}> = {
89
91
  remoteAddress?: string;
90
92
  remotePort?: number;
91
93
  };
94
+ body?: string;
92
95
  cookies?: Record<string, string>;
93
96
  } & T;
94
97
 
@@ -24,7 +24,6 @@ export type Listener<T = 'router' | 'chat' | 'ai'> = {
24
24
 
25
25
  export class WsServerBase {
26
26
  wss: WebSocketServer | null;
27
- listeners: Listener[] = [];
28
27
  listening: boolean = false;
29
28
  server: ServerType;
30
29
 
@@ -61,7 +60,7 @@ export class WsServerBase {
61
60
  ws.on('message', async (message: string | Buffer) => {
62
61
  await this.server.onWebSocket({ ws, message, pathname, token, id });
63
62
  });
64
- ws.send(JSON.stringify({ type: 'connected' }));
63
+ this.server.sendConnected(ws);
65
64
  this.wss.on('close', () => {
66
65
  this.server.onWsClose(ws);
67
66
  });