feat: add showConnected option and refactor WebSocket connection handling
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import type { IncomingMessage, ServerResponse } from 'node:http';
|
||||
import { handleServer } from './handle-server.ts';
|
||||
import * as cookie from './cookie.ts';
|
||||
import { ServerType, Listener, OnListener, ServerOpts, OnWebSocketOptions, OnWebSocketFn, WebScoketListenerFun, ListenerFun, HttpListenerFun, WS } from './server-type.ts';
|
||||
import { ServerType, Listener, OnListener, ServerOpts, OnWebSocketOptions, OnWebSocketFn, WebSocketListenerFun, ListenerFun, HttpListenerFun, WS } from './server-type.ts';
|
||||
import { parseIfJson } from '../utils/parse.ts';
|
||||
import { EventEmitter } from 'events';
|
||||
type CookieFn = (name: string, value: string, options?: cookie.SerializeOptions, end?: boolean) => void;
|
||||
@@ -64,11 +64,12 @@ export class ServerBase implements ServerType {
|
||||
cors: Cors;
|
||||
listeners: Listener[] = [];
|
||||
emitter = new EventEmitter();
|
||||
showConnected = true;
|
||||
constructor(opts?: ServerOpts) {
|
||||
this.path = opts?.path || '/api/router';
|
||||
this.handle = opts?.handle;
|
||||
this.cors = opts?.cors;
|
||||
|
||||
this.showConnected = opts?.showConnected !== false;
|
||||
}
|
||||
listen(port: number, hostname?: string, backlog?: number, listeningListener?: () => void): void;
|
||||
listen(port: number, hostname?: string, listeningListener?: () => void): void;
|
||||
@@ -202,7 +203,7 @@ export class ServerBase implements ServerType {
|
||||
const end = (data: any) => {
|
||||
ws.send(JSON.stringify(data));
|
||||
}
|
||||
(listener.func as WebScoketListenerFun)({
|
||||
(listener.func as WebSocketListenerFun)({
|
||||
emitter: this.emitter,
|
||||
data,
|
||||
token,
|
||||
@@ -275,4 +276,8 @@ export class ServerBase implements ServerType {
|
||||
}, 5000);
|
||||
}
|
||||
}
|
||||
async sendConnected(ws: WS) {
|
||||
if (this.showConnected)
|
||||
ws.send(JSON.stringify({ type: 'connected' }));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -223,7 +223,7 @@ export class BunServer extends ServerBase implements ServerType {
|
||||
},
|
||||
websocket: {
|
||||
open: (ws: any) => {
|
||||
ws.send(JSON.stringify({ type: 'connected' }));
|
||||
this.sendConnected(ws);
|
||||
},
|
||||
message: async (ws: any, message: string | Buffer) => {
|
||||
const pathname = ws.data.pathname || '';
|
||||
|
||||
@@ -16,6 +16,7 @@ export type ServerOpts<T = {}> = {
|
||||
handle?: (msg?: { path: string; key?: string;[key: string]: any }, ctx?: { req: http.IncomingMessage; res: http.ServerResponse }) => any;
|
||||
cors?: Cors;
|
||||
io?: boolean;
|
||||
showConnected?: boolean;
|
||||
} & T;
|
||||
|
||||
export interface ServerType {
|
||||
@@ -40,11 +41,12 @@ export interface ServerType {
|
||||
on(listener: OnListener): void;
|
||||
onWebSocket({ ws, message, pathname, token, id }: OnWebSocketOptions): void;
|
||||
onWsClose(ws: WS): void;
|
||||
sendConnected(ws: WS): void;
|
||||
}
|
||||
|
||||
export type OnWebSocketOptions = { ws: WS; message: string | Buffer; pathname: string, token?: string, id?: string }
|
||||
export type OnWebSocketFn = (options: OnWebSocketOptions) => Promise<void> | void;
|
||||
export type WS = {
|
||||
export type WS<T = {}> = {
|
||||
send: (data: any) => void;
|
||||
close: (code?: number, reason?: string) => void;
|
||||
data?: {
|
||||
@@ -56,7 +58,7 @@ export type WS = {
|
||||
* 鉴权后的获取的信息
|
||||
*/
|
||||
userApp?: string;
|
||||
}
|
||||
} & T;
|
||||
}
|
||||
export type Listener = {
|
||||
id?: string;
|
||||
|
||||
@@ -60,7 +60,7 @@ export class WsServerBase {
|
||||
ws.on('message', async (message: string | Buffer) => {
|
||||
await this.server.onWebSocket({ ws, message, pathname, token, id });
|
||||
});
|
||||
ws.send(JSON.stringify({ type: 'connected' }));
|
||||
this.server.sendConnected(ws);
|
||||
this.wss.on('close', () => {
|
||||
this.server.onWsClose(ws);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user