(handlerOrOptions, options)
| 18 | }; |
| 19 | |
| 20 | export const startHTTPServer = async (handlerOrOptions, options) => { |
| 21 | const certificate = await certificatePromise; |
| 22 | |
| 23 | const { |
| 24 | handler, |
| 25 | useBuffering = false, |
| 26 | rate = undefined, |
| 27 | class="cm">// Default to 0 so the OS assigns a free ephemeral port. Tests that need |
| 28 | class="cm">// a deterministic port can still pass one explicitly. Sharing a fixed |
| 29 | class="cm">// port across many tests creates TIME_WAIT / pool-reuse races that |
| 30 | class="cm">// surface as EPIPE on the client under CI runner load. |
| 31 | port = 0, |
| 32 | keepAlive = 1000, |
| 33 | useHTTP2, |
| 34 | key = certificate.private, |
| 35 | cert = certificate.cert, |
| 36 | } = Object.assign( |
| 37 | typeof handlerOrOptions === class="st">'function' |
| 38 | ? { |
| 39 | handler: handlerOrOptions, |
| 40 | } |
| 41 | : handlerOrOptions || {}, |
| 42 | options |
| 43 | ); |
| 44 | |
| 45 | return new Promise((resolve, reject) => { |
| 46 | const serverHandler = |
| 47 | handler || |
| 48 | async function (req, res) { |
| 49 | try { |
| 50 | req.headers[class="st">'content-length'] && |
| 51 | res.setHeader(class="st">'content-length', req.headers[class="st">'content-length']); |
| 52 | |
| 53 | let dataStream = req; |
| 54 | |
| 55 | if (useBuffering) { |
| 56 | dataStream = stream.Readable.from(await getStream(req)); |
| 57 | } |
| 58 | |
| 59 | const streams = [dataStream]; |
| 60 | |
| 61 | if (rate) { |
| 62 | streams.push(new Throttle({ rate })); |
| 63 | } |
| 64 | |
| 65 | streams.push(res); |
| 66 | |
| 67 | stream.pipeline(streams, (err) => { |
| 68 | err && console.log(class="st">'Server warning: ' + err.message); |
| 69 | }); |
| 70 | } catch (err) { |
| 71 | console.warn(class="st">'HTTP server error:', err); |
| 72 | } |
| 73 | }; |
| 74 | |
| 75 | const server = useHTTP2 |
| 76 | ? http2.createSecureServer({ key, cert }, serverHandler) |
| 77 | : http.createServer(serverHandler); |
no test coverage detected