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 server: ServerType
let injectWebSocket: ReturnType<typeof createNodeWebSocket>['injectWebSocket'] let injectWebSocket: ReturnType<typeof createNodeWebSocket>['injectWebSocket']
let upgradeWebSocket: ReturnType<typeof createNodeWebSocket>['upgradeWebSocket'] let upgradeWebSocket: ReturnType<typeof createNodeWebSocket>['upgradeWebSocket']
let wss: ReturnType<typeof createNodeWebSocket>['wss']
beforeEach(async () => { beforeEach(async () => {
app = new Hono() app = new Hono()
;({ injectWebSocket, upgradeWebSocket } = createNodeWebSocket({ app })) ;({ injectWebSocket, upgradeWebSocket, wss } = createNodeWebSocket({ app }))
server = await new Promise<ServerType>((resolve) => { server = await new Promise<ServerType>((resolve) => {
const server = serve({ fetch: app.fetch, port: 3030 }, () => resolve(server)) const server = serve({ fetch: app.fetch, port: 3030 }, () => resolve(server))
@ -286,4 +287,25 @@ describe('WebSocket helper', () => {
expect(await mainPromise).toBe(true) 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 injectWebSocket(server: Server | Http2Server | Http2SecureServer): void
wss: WebSocketServer
} }
export interface NodeWebSocketInit { export interface NodeWebSocketInit {
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
@ -56,6 +57,7 @@ export const createNodeWebSocket = (init: NodeWebSocketInit): NodeWebSocket => {
} }
return { return {
wss,
injectWebSocket(server) { injectWebSocket(server) {
server.on('upgrade', async (request, socket: Duplex, head) => { server.on('upgrade', async (request, socket: Duplex, head) => {
const url = new URL(request.url ?? '/', init.baseUrl ?? 'http://localhost') const url = new URL(request.url ?? '/', init.baseUrl ?? 'http://localhost')