@kevisual/router 0.0.45 → 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 +13 -1
- package/dist/router.js +23 -10
- package/package.json +1 -1
- package/src/index.ts +3 -1
- package/src/server/server-base.ts +12 -1
- package/src/server/server-bun.ts +1 -9
- package/src/server/server-type.ts +12 -1
- package/src/server/ws-server.ts +12 -1
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
|
}
|
|
@@ -6674,15 +6695,7 @@ class BunServer extends ServerBase {
|
|
|
6674
6695
|
},
|
|
6675
6696
|
close: (ws) => {
|
|
6676
6697
|
// WebSocket 连接关闭
|
|
6677
|
-
|
|
6678
|
-
if (id) {
|
|
6679
|
-
this.emitter.emit('close--' + id, { type: 'close', ws, id });
|
|
6680
|
-
setTimeout(() => {
|
|
6681
|
-
// 关闭后 5 秒清理监听器, 避免内存泄漏, 理论上原本的自己就应该被清理掉了,这里是保险起见
|
|
6682
|
-
this.emitter.removeAllListeners('close--' + id);
|
|
6683
|
-
this.emitter.removeAllListeners(id);
|
|
6684
|
-
}, 5000);
|
|
6685
|
-
}
|
|
6698
|
+
this.onWsClose(ws);
|
|
6686
6699
|
},
|
|
6687
6700
|
},
|
|
6688
6701
|
});
|
package/package.json
CHANGED
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 {
|
|
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
|
}
|
package/src/server/server-bun.ts
CHANGED
|
@@ -233,15 +233,7 @@ export class BunServer extends ServerBase implements ServerType {
|
|
|
233
233
|
},
|
|
234
234
|
close: (ws: any) => {
|
|
235
235
|
// WebSocket 连接关闭
|
|
236
|
-
|
|
237
|
-
if (id) {
|
|
238
|
-
this.emitter.emit('close--' + id, { type: 'close', ws, id });
|
|
239
|
-
setTimeout(() => {
|
|
240
|
-
// 关闭后 5 秒清理监听器, 避免内存泄漏, 理论上原本的自己就应该被清理掉了,这里是保险起见
|
|
241
|
-
this.emitter.removeAllListeners('close--' + id);
|
|
242
|
-
this.emitter.removeAllListeners(id);
|
|
243
|
-
}, 5000);
|
|
244
|
-
}
|
|
236
|
+
this.onWsClose(ws);
|
|
245
237
|
},
|
|
246
238
|
},
|
|
247
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;
|
package/src/server/ws-server.ts
CHANGED
|
@@ -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
|