@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 +17 -23
- package/dist/router.js +40 -13
- package/package.json +1 -1
- package/src/index.ts +10 -1
- package/src/server/server-base.ts +13 -8
- package/src/server/server-bun.ts +25 -5
- package/src/server/server-type.ts +8 -5
- package/src/server/ws-server.ts +1 -2
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
|
|
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
|
|
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
|
|
456
|
+
type Listener = {
|
|
455
457
|
id?: string;
|
|
456
458
|
io?: boolean;
|
|
457
459
|
path?: string;
|
|
458
|
-
|
|
460
|
+
func: WebSocketListenerFun | HttpListenerFun;
|
|
459
461
|
};
|
|
460
|
-
type
|
|
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 =
|
|
474
|
-
type OnListener = Listener
|
|
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
|
|
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
|
|
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 {
|
|
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
|
|
1265
|
-
if (typeof
|
|
1266
|
-
await
|
|
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({
|
|
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({
|
|
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.
|
|
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
|
-
|
|
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.
|
|
6677
|
-
|
|
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
|
-
|
|
6715
|
+
this.sendConnected(ws);
|
|
6689
6716
|
},
|
|
6690
6717
|
message: async (ws, message) => {
|
|
6691
6718
|
const pathname = ws.data.pathname || '';
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -21,5 +21,14 @@ export * from './router-define.ts';
|
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
export {
|
|
24
|
-
RouterReq,
|
|
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,
|
|
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
|
|
123
|
-
if (typeof
|
|
124
|
-
await
|
|
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({
|
|
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({
|
|
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.
|
|
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
|
}
|
package/src/server/server-bun.ts
CHANGED
|
@@ -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.
|
|
216
|
-
|
|
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
|
-
|
|
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
|
-
|
|
67
|
+
func: WebSocketListenerFun | HttpListenerFun;
|
|
66
68
|
}
|
|
67
69
|
|
|
68
|
-
export type
|
|
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 =
|
|
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
|
|
package/src/server/ws-server.ts
CHANGED
|
@@ -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
|
-
|
|
63
|
+
this.server.sendConnected(ws);
|
|
65
64
|
this.wss.on('close', () => {
|
|
66
65
|
this.server.onWsClose(ws);
|
|
67
66
|
});
|