1- import { Emitter } from 'strict-event-emitter'
2- import { Headers } from 'headers-polyfill'
3- import { RequestHandler as ExpressMiddleware } from 'express'
4- import { RequestHandler , handleRequest , MockedRequest } from 'msw'
51import { encodeBuffer } from '@mswjs/interceptors'
2+ import { Headers } from 'headers-polyfill'
3+ import { handleRequest } from 'msw'
4+ import { Emitter } from 'strict-event-emitter'
5+ import { Readable } from 'node:stream'
6+ import crypto from 'node:crypto'
7+ import { ReadableStream } from 'node:stream/web'
8+
9+ import type { RequestHandler as ExpressMiddleware } from 'express'
10+ import type { LifeCycleEventsMap , RequestHandler } from 'msw'
611
7- const emitter = new Emitter ( )
12+ const emitter = new Emitter < LifeCycleEventsMap > ( )
813
914export function createMiddleware (
1015 ...handlers : RequestHandler [ ]
1116) : ExpressMiddleware {
1217 return async ( req , res , next ) => {
1318 const serverOrigin = `${ req . protocol } ://${ req . get ( 'host' ) } `
19+ const method = req . method || 'GET'
1420
1521 // Ensure the request body input passed to the MockedRequest
1622 // is always a string. Custom middleware like "express.json()"
1723 // may coerce "req.body" to be an Object.
1824 const requestBody =
1925 typeof req . body === 'string' ? req . body : JSON . stringify ( req . body )
2026
21- const mockedRequest = new MockedRequest (
27+ const mockedRequest = new Request (
2228 // Treat all relative URLs as the ones coming from the server.
2329 new URL ( req . url , serverOrigin ) ,
2430 {
2531 method : req . method ,
2632 headers : new Headers ( req . headers as HeadersInit ) ,
2733 credentials : 'omit' ,
28- body : encodeBuffer ( requestBody ) ,
34+ // Request with GET/HEAD method cannot have body.
35+ body : [ 'GET' , 'HEAD' ] . includes ( method )
36+ ? undefined
37+ : encodeBuffer ( requestBody ) ,
2938 } ,
3039 )
3140
3241 await handleRequest (
3342 mockedRequest ,
43+ crypto . randomUUID ( ) ,
3444 handlers ,
3545 {
3646 onUnhandledRequest : ( ) => null ,
@@ -44,8 +54,8 @@ export function createMiddleware(
4454 */
4555 baseUrl : serverOrigin ,
4656 } ,
47- onMockedResponse ( mockedResponse ) {
48- const { status, statusText, headers, body , delay } = mockedResponse
57+ onMockedResponse : async ( mockedResponse ) => {
58+ const { status, statusText, headers } = mockedResponse
4959
5060 res . statusCode = status
5161 res . statusMessage = statusText
@@ -54,12 +64,12 @@ export function createMiddleware(
5464 res . setHeader ( name , value )
5565 } )
5666
57- if ( delay ) {
58- setTimeout ( ( ) => res . send ( body ) , delay )
59- return
67+ if ( mockedResponse . body ) {
68+ const stream = Readable . fromWeb (
69+ mockedResponse . body as ReadableStream ,
70+ )
71+ stream . pipe ( res )
6072 }
61-
62- res . send ( body )
6373 } ,
6474 onPassthroughResponse ( ) {
6575 next ( )
0 commit comments