From b6c613d601cc8c1f4eaeab0d369e639b89c0c0c3 Mon Sep 17 00:00:00 2001 From: abearxiong Date: Sun, 21 Dec 2025 04:13:38 +0800 Subject: [PATCH] feat: add showConnected option and refactor WebSocket connection handling --- src/server/server-base.ts | 11 ++++++++--- src/server/server-bun.ts | 2 +- src/server/server-type.ts | 6 ++++-- src/server/ws-server.ts | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/server/server-base.ts b/src/server/server-base.ts index a70ad5e..9d89a94 100644 --- a/src/server/server-base.ts +++ b/src/server/server-base.ts @@ -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' })); + } } diff --git a/src/server/server-bun.ts b/src/server/server-bun.ts index dcf8b8f..f37f266 100644 --- a/src/server/server-bun.ts +++ b/src/server/server-bun.ts @@ -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 || ''; diff --git a/src/server/server-type.ts b/src/server/server-type.ts index 4a660de..a6b23a3 100644 --- a/src/server/server-type.ts +++ b/src/server/server-type.ts @@ -16,6 +16,7 @@ export type ServerOpts = { 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; -export type WS = { +export type WS = { 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; diff --git a/src/server/ws-server.ts b/src/server/ws-server.ts index be41f5e..ebc42ea 100644 --- a/src/server/ws-server.ts +++ b/src/server/ws-server.ts @@ -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); });