@@ -34,12 +34,15 @@ export const replaceTemplates = <T extends object>(
3434}
3535
3636/**
37- * Throw an error if not authorized.
37+ * Throw an error if not authorized. Call `next` if provided.
3838 */
39- export const ensureAuthenticated = ( req : express . Request ) : void => {
39+ export const ensureAuthenticated = ( req : express . Request , _ ?: express . Response , next ?: express . NextFunction ) : void => {
4040 if ( ! authenticated ( req ) ) {
4141 throw new HttpError ( "Unauthorized" , HttpCode . Unauthorized )
4242 }
43+ if ( next ) {
44+ next ( )
45+ }
4346}
4447
4548/**
@@ -136,20 +139,32 @@ export const getCookieDomain = (host: string, proxyDomains: string[]): string |
136139declare module "express" {
137140 function Router ( options ?: express . RouterOptions ) : express . Router & WithWebsocketMethod
138141
139- type WebsocketRequestHandler = (
140- socket : net . Socket ,
141- head : Buffer ,
142- req : express . Request ,
142+ type WebSocketRequestHandler = (
143+ req : express . Request & WithWebSocket ,
144+ res : express . Response ,
143145 next : express . NextFunction ,
144146 ) => void | Promise < void >
145147
146- type WebsocketMethod < T > = ( route : expressCore . PathParams , ...handlers : WebsocketRequestHandler [ ] ) => T
148+ type WebSocketMethod < T > = ( route : expressCore . PathParams , ...handlers : WebSocketRequestHandler [ ] ) => T
149+
150+ interface WithWebSocket {
151+ ws : net . Socket
152+ head : Buffer
153+ }
147154
148155 interface WithWebsocketMethod {
149- ws : WebsocketMethod < this>
156+ ws : WebSocketMethod < this>
150157 }
151158}
152159
160+ interface WebsocketRequest extends express . Request , express . WithWebSocket {
161+ _ws_handled : boolean
162+ }
163+
164+ function isWebSocketRequest ( req : express . Request ) : req is WebsocketRequest {
165+ return ! ! ( req as WebsocketRequest ) . ws
166+ }
167+
153168export const handleUpgrade = ( app : express . Express , server : http . Server ) : void => {
154169 server . on ( "upgrade" , ( req , socket , head ) => {
155170 socket . on ( "error" , ( ) => socket . destroy ( ) )
@@ -193,15 +208,15 @@ function patchRouter(): void {
193208 // Inject the `ws` method.
194209 ; ( express . Router as any ) . ws = function ws (
195210 route : expressCore . PathParams ,
196- ...handlers : express . WebsocketRequestHandler [ ]
211+ ...handlers : express . WebSocketRequestHandler [ ]
197212 ) {
198213 originalGet . apply ( this , [
199214 route ,
200215 ...handlers . map ( ( handler ) => {
201- const wrapped : express . Handler = ( req , _ , next ) => {
202- if ( ( req as any ) . ws ) {
203- ; ( req as any ) . _ws_handled = true
204- Promise . resolve ( handler ( ( req as any ) . ws , ( req as any ) . head , req , next ) ) . catch ( next )
216+ const wrapped : express . Handler = ( req , res , next ) => {
217+ if ( isWebSocketRequest ( req ) ) {
218+ req . _ws_handled = true
219+ Promise . resolve ( handler ( req , res , next ) ) . catch ( next )
205220 } else {
206221 next ( )
207222 }
@@ -218,7 +233,7 @@ function patchRouter(): void {
218233 route ,
219234 ...handlers . map ( ( handler ) => {
220235 const wrapped : express . Handler = ( req , res , next ) => {
221- if ( ! ( req as any ) . ws ) {
236+ if ( ! isWebSocketRequest ( req ) ) {
222237 Promise . resolve ( handler ( req , res , next ) ) . catch ( next )
223238 } else {
224239 next ( )
0 commit comments