@kevisual/router 0.0.44 → 0.0.46

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
@@ -427,6 +427,7 @@ interface ServerType {
427
427
  */
428
428
  on(listener: OnListener): void;
429
429
  onWebSocket({ ws, message, pathname, token, id }: OnWebSocketOptions): void;
430
+ onWsClose(ws: WS): void;
430
431
  }
431
432
  type OnWebSocketOptions = {
432
433
  ws: WS;
@@ -439,6 +440,16 @@ type OnWebSocketFn = (options: OnWebSocketOptions) => Promise<void> | void;
439
440
  type WS = {
440
441
  send: (data: any) => void;
441
442
  close: (code?: number, reason?: string) => void;
443
+ data?: {
444
+ url: URL;
445
+ pathname: string;
446
+ token?: string;
447
+ id?: string;
448
+ /**
449
+ * 鉴权后的获取的信息
450
+ */
451
+ userApp?: string;
452
+ };
442
453
  };
443
454
  type Listener$1 = {
444
455
  id?: string;
@@ -632,6 +643,7 @@ declare class ServerBase implements ServerType {
632
643
  createCallback(): (req: IncomingMessage, res: ServerResponse) => Promise<void>;
633
644
  on(listener: OnListener): void;
634
645
  onWebSocket({ ws, message, pathname, token, id }: OnWebSocketOptions): Promise<void>;
646
+ onWsClose(ws: WS): Promise<void>;
635
647
  }
636
648
 
637
649
  type WsServerBaseOpts = {
@@ -924,4 +936,4 @@ declare class App<U = {}> {
924
936
  }
925
937
 
926
938
  export { App, Connect, CustomError, Mini, QueryConnect, QueryRouter, QueryRouterServer, QueryUtil, Route, ServerNode, createSchema, define, handleServer, util };
927
- export type { OnWebSocketFn, RouteArray, RouteContext, RouteMiddleware, RouteObject, RouteOpts, RouterReq, RouterRes, Rule, Run, Schema };
939
+ export type { Listener$1 as Listener, OnWebSocketFn, RouteArray, RouteContext, RouteMiddleware, RouteObject, RouteOpts, RouterReq, RouterRes, Rule, Run, Schema, WS, WebSocketReq, WebSocketRes };
package/dist/router.js CHANGED
@@ -1408,6 +1408,17 @@ class ServerBase {
1408
1408
  end({ code: 500, message: `${type} server is error` });
1409
1409
  }
1410
1410
  }
1411
+ async onWsClose(ws) {
1412
+ const id = ws?.data?.id || '';
1413
+ if (id) {
1414
+ this.emitter.emit('close--' + id, { type: 'close', ws, id });
1415
+ setTimeout(() => {
1416
+ // 关闭后 5 秒清理监听器, 避免内存泄漏, 理论上原本的自己就应该被清理掉了,这里是保险起见
1417
+ this.emitter.removeAllListeners('close--' + id);
1418
+ this.emitter.removeAllListeners(id);
1419
+ }, 5000);
1420
+ }
1421
+ }
1411
1422
  }
1412
1423
 
1413
1424
  function getDefaultExportFromCjs (x) {
@@ -6353,10 +6364,20 @@ class WsServerBase {
6353
6364
  const pathname = url.pathname;
6354
6365
  const token = url.searchParams.get('token') || '';
6355
6366
  const id = url.searchParams.get('id') || '';
6367
+ // @ts-ignore
6368
+ ws.data = {
6369
+ url: url,
6370
+ pathname,
6371
+ token,
6372
+ id,
6373
+ };
6356
6374
  ws.on('message', async (message) => {
6357
6375
  await this.server.onWebSocket({ ws, message, pathname, token, id });
6358
6376
  });
6359
- ws.send('connected');
6377
+ ws.send(JSON.stringify({ type: 'connected' }));
6378
+ this.wss.on('close', () => {
6379
+ this.server.onWsClose(ws);
6380
+ });
6360
6381
  });
6361
6382
  }
6362
6383
  }
@@ -6664,7 +6685,7 @@ class BunServer extends ServerBase {
6664
6685
  },
6665
6686
  websocket: {
6666
6687
  open: (ws) => {
6667
- ws.send({ type: 'connected' });
6688
+ ws.send(JSON.stringify({ type: 'connected' }));
6668
6689
  },
6669
6690
  message: async (ws, message) => {
6670
6691
  const pathname = ws.data.pathname || '';
@@ -6674,14 +6695,7 @@ class BunServer extends ServerBase {
6674
6695
  },
6675
6696
  close: (ws) => {
6676
6697
  // WebSocket 连接关闭
6677
- const id = ws?.data?.id || '';
6678
- if (id) {
6679
- this.emitter.emit(id, { type: 'close', ws, id });
6680
- setTimeout(() => {
6681
- // 关闭后 5 秒清理监听器, 避免内存泄漏, 理论上原本的自己就应该被清理掉了,这里是保险起见
6682
- this.emitter.removeAllListeners(id);
6683
- }, 5000);
6684
- }
6698
+ this.onWsClose(ws);
6685
6699
  },
6686
6700
  },
6687
6701
  });
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.44",
4
+ "version": "0.0.46",
5
5
  "description": "",
6
6
  "type": "module",
7
7
  "main": "./dist/router.js",
package/src/index.ts CHANGED
@@ -20,4 +20,6 @@ export { App } from './app.ts';
20
20
  export * from './router-define.ts';
21
21
 
22
22
 
23
- export { RouterReq, RouterRes, OnWebSocketFn } from './server/server-type.ts';
23
+ export {
24
+ RouterReq, RouterRes, OnWebSocketFn, WS, WebSocketReq, WebSocketRes, Listener,
25
+ } 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 } from './server-type.ts';
4
+ import { ServerType, Listener, OnListener, ServerOpts, OnWebSocketOptions, OnWebSocketFn, WebScoketListenerFun, 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;
@@ -264,4 +264,15 @@ export class ServerBase implements ServerType {
264
264
  end({ code: 500, message: `${type} server is error` });
265
265
  }
266
266
  }
267
+ async onWsClose(ws: WS) {
268
+ const id = ws?.data?.id || '';
269
+ if (id) {
270
+ this.emitter.emit('close--' + id, { type: 'close', ws, id });
271
+ setTimeout(() => {
272
+ // 关闭后 5 秒清理监听器, 避免内存泄漏, 理论上原本的自己就应该被清理掉了,这里是保险起见
273
+ this.emitter.removeAllListeners('close--' + id);
274
+ this.emitter.removeAllListeners(id);
275
+ }, 5000);
276
+ }
277
+ }
267
278
  }
@@ -223,7 +223,7 @@ export class BunServer extends ServerBase implements ServerType {
223
223
  },
224
224
  websocket: {
225
225
  open: (ws: any) => {
226
- ws.send({ type: 'connected' });
226
+ ws.send(JSON.stringify({ type: 'connected' }));
227
227
  },
228
228
  message: async (ws: any, message: string | Buffer) => {
229
229
  const pathname = ws.data.pathname || '';
@@ -233,14 +233,7 @@ export class BunServer extends ServerBase implements ServerType {
233
233
  },
234
234
  close: (ws: any) => {
235
235
  // WebSocket 连接关闭
236
- const id = ws?.data?.id || '';
237
- if (id) {
238
- this.emitter.emit(id, { type: 'close', ws, id });
239
- setTimeout(() => {
240
- // 关闭后 5 秒清理监听器, 避免内存泄漏, 理论上原本的自己就应该被清理掉了,这里是保险起见
241
- this.emitter.removeAllListeners(id);
242
- }, 5000);
243
- }
236
+ this.onWsClose(ws);
244
237
  },
245
238
  },
246
239
  });
@@ -39,13 +39,24 @@ export interface ServerType {
39
39
  */
40
40
  on(listener: OnListener): void;
41
41
  onWebSocket({ ws, message, pathname, token, id }: OnWebSocketOptions): void;
42
+ onWsClose(ws: WS): void;
42
43
  }
43
44
 
44
45
  export type OnWebSocketOptions = { ws: WS; message: string | Buffer; pathname: string, token?: string, id?: string }
45
46
  export type OnWebSocketFn = (options: OnWebSocketOptions) => Promise<void> | void;
46
- type WS = {
47
+ export type WS = {
47
48
  send: (data: any) => void;
48
49
  close: (code?: number, reason?: string) => void;
50
+ data?: {
51
+ url: URL;
52
+ pathname: string;
53
+ token?: string;
54
+ id?: string;
55
+ /**
56
+ * 鉴权后的获取的信息
57
+ */
58
+ userApp?: string;
59
+ }
49
60
  }
50
61
  export type Listener = {
51
62
  id?: string;
@@ -51,11 +51,22 @@ export class WsServerBase {
51
51
  const pathname = url.pathname;
52
52
  const token = url.searchParams.get('token') || '';
53
53
  const id = url.searchParams.get('id') || '';
54
+ // @ts-ignore
55
+ ws.data = {
56
+ url: url,
57
+ pathname,
58
+ token,
59
+ id,
60
+ }
54
61
  ws.on('message', async (message: string | Buffer) => {
55
62
  await this.server.onWebSocket({ ws, message, pathname, token, id });
56
63
  });
57
- ws.send('connected');
64
+ ws.send(JSON.stringify({ type: 'connected' }));
65
+ this.wss.on('close', () => {
66
+ this.server.onWsClose(ws);
67
+ });
58
68
  });
69
+
59
70
  }
60
71
  }
61
72
  // TODO: ws handle and path and routerContext