feat(node-ws): Add WebSocketServer instance return to createNodeWebSocket (#1213)

* Add WebSocketServer instance return to createNodeWebSocket

This change introduces the return of the WebSocketServer instance from the createNodeWebSocket function, enhancing its usability by allowing consumers access to the WebSocketServer instance for additional operations.

- Updated tests to verify the returned WebSocketServer instance
- Added wss property to NodeWebSocket interface for type safety

* style
pull/1249/head
Palmer McCutcheon 2025-06-21 21:07:24 -07:00 committed by GitHub
parent aee369e728
commit 5178967931
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 30 additions and 1 deletions

View File

@ -0,0 +1,5 @@
---
'@hono/node-ws': minor
---
Return the WebSocketServer instance used for createNodeWebSocket

View File

@ -13,10 +13,11 @@ describe('WebSocket helper', () => {
let server: ServerType
let injectWebSocket: ReturnType<typeof createNodeWebSocket>['injectWebSocket']
let upgradeWebSocket: ReturnType<typeof createNodeWebSocket>['upgradeWebSocket']
let wss: ReturnType<typeof createNodeWebSocket>['wss']
beforeEach(async () => {
app = new Hono()
;({ injectWebSocket, upgradeWebSocket } = createNodeWebSocket({ app }))
;({ injectWebSocket, upgradeWebSocket, wss } = createNodeWebSocket({ app }))
server = await new Promise<ServerType>((resolve) => {
const server = serve({ fetch: app.fetch, port: 3030 }, () => resolve(server))
@ -286,4 +287,25 @@ describe('WebSocket helper', () => {
expect(await mainPromise).toBe(true)
})
it('Should return the wss used for the websocket helper', async () => {
let clientWs: WebSocket | null = null
const mainPromise = new Promise<void>((resolve) =>
wss.on('connection', (ws) => {
clientWs = ws
resolve()
})
)
app.get(
'/',
upgradeWebSocket(() => ({}))
)
new WebSocket('ws://localhost:3030/')
await mainPromise
expect(clientWs).toBeTruthy()
expect(wss.clients.size).toBe(1)
})
})

View File

@ -17,6 +17,7 @@ export interface NodeWebSocket {
}
>
injectWebSocket(server: Server | Http2Server | Http2SecureServer): void
wss: WebSocketServer
}
export interface NodeWebSocketInit {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
@ -56,6 +57,7 @@ export const createNodeWebSocket = (init: NodeWebSocketInit): NodeWebSocket => {
}
return {
wss,
injectWebSocket(server) {
server.on('upgrade', async (request, socket: Duplex, head) => {
const url = new URL(request.url ?? '/', init.baseUrl ?? 'http://localhost')