@jsenv/server 15.4.0 → 15.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/server",
3
- "version": "15.4.0",
3
+ "version": "15.5.0",
4
4
  "description": "Write your Node.js server using pure functions",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -372,6 +372,10 @@ const getMtimeResponse = async ({ headers, fileStat }) => {
372
372
  };
373
373
 
374
374
  const getCompressedResponse = async ({ fileUrl, headers }) => {
375
+ const contentType = CONTENT_TYPE.fromUrlExtension(fileUrl);
376
+ if (CONTENT_TYPE.isBinary(contentType)) {
377
+ return null;
378
+ }
375
379
  const acceptedCompressionFormat = pickContentEncoding(
376
380
  { headers },
377
381
  Object.keys(availableCompressionFormats),
@@ -389,7 +393,7 @@ const getCompressedResponse = async ({ fileUrl, headers }) => {
389
393
  return {
390
394
  status: 200,
391
395
  headers: {
392
- "content-type": CONTENT_TYPE.fromUrlExtension(fileUrl),
396
+ "content-type": contentType,
393
397
  "content-encoding": acceptedCompressionFormat,
394
398
  "vary": "accept-encoding",
395
399
  },
@@ -1,3 +1,4 @@
1
+ import { Abort } from "@jsenv/abort";
1
2
  import { headersFromObject } from "../internal/headersFromObject.js";
2
3
  import { observableFromNodeStream } from "./observable_from_node_stream.js";
3
4
 
@@ -5,6 +6,17 @@ export const fromNodeRequest = (
5
6
  nodeRequest,
6
7
  { serverOrigin, signal, requestBodyLifetime },
7
8
  ) => {
9
+ const handleRequestOperation = Abort.startOperation();
10
+ if (signal) {
11
+ handleRequestOperation.addAbortSignal(signal);
12
+ }
13
+ handleRequestOperation.addAbortSource((abort) => {
14
+ nodeRequest.once("close", abort);
15
+ return () => {
16
+ nodeRequest.removeListener("close", abort);
17
+ };
18
+ });
19
+
8
20
  const headers = headersFromObject(nodeRequest.headers);
9
21
  const body = observableFromNodeStream(nodeRequest, {
10
22
  readableStreamLifetime: requestBodyLifetime,
@@ -26,7 +38,7 @@ export const fromNodeRequest = (
26
38
  }
27
39
 
28
40
  return Object.freeze({
29
- signal,
41
+ signal: handleRequestOperation.signal,
30
42
  http2: Boolean(nodeRequest.stream),
31
43
  origin: requestOrigin,
32
44
  ...getPropertiesFromResource({
@@ -298,6 +298,15 @@ export const startServer = async ({
298
298
  status = "stopped";
299
299
  stoppedResolve(reason);
300
300
  });
301
+ let stopAbortSignal;
302
+ stop_signal: {
303
+ let stopAbortController = new AbortController();
304
+ stopCallbackSet.add(() => {
305
+ stopAbortController.abort();
306
+ stopAbortController = undefined;
307
+ });
308
+ stopAbortSignal = stopAbortController.signal;
309
+ }
301
310
 
302
311
  const cancelProcessTeardownRace = raceProcessTeardownEvents(
303
312
  processTeardownEvents,
@@ -365,6 +374,9 @@ export const startServer = async ({
365
374
  }
366
375
 
367
376
  const receiveRequestOperation = Abort.startOperation();
377
+ receiveRequestOperation.addAbortSignal(stopAbortSignal);
378
+ const sendResponseOperation = Abort.startOperation();
379
+ sendResponseOperation.addAbortSignal(stopAbortSignal);
368
380
  receiveRequestOperation.addAbortSource((abort) => {
369
381
  const closeEventCallback = () => {
370
382
  if (nodeRequest.complete) {
@@ -379,19 +391,11 @@ export const startServer = async ({
379
391
  nodeRequest.removeListener("close", closeEventCallback);
380
392
  };
381
393
  });
382
- receiveRequestOperation.addAbortSource((abort) => {
383
- return stopCallbackSet.add(abort);
384
- });
385
-
386
- const sendResponseOperation = Abort.startOperation();
387
394
  sendResponseOperation.addAbortSignal(receiveRequestOperation.signal);
388
- sendResponseOperation.addAbortSource((abort) => {
389
- return stopCallbackSet.add(abort);
390
- });
391
395
 
392
396
  const request = fromNodeRequest(nodeRequest, {
397
+ signal: stopAbortSignal,
393
398
  serverOrigin,
394
- signal: receiveRequestOperation.signal,
395
399
  });
396
400
 
397
401
  // Handling request is asynchronous, we buffer logs for that request
@@ -965,13 +969,16 @@ export const startServer = async ({
965
969
  socket,
966
970
  head,
967
971
  async (websocket) => {
972
+ const websocketAbortController = new AbortController();
968
973
  websocketClients.add(websocket);
974
+ websocket.signal = websocketAbortController.signal;
969
975
  websocket.once("close", () => {
970
976
  websocketClients.delete(websocket);
977
+ websocketAbortController.abort();
971
978
  });
972
979
  const request = fromNodeRequest(nodeRequest, {
980
+ signal: stopAbortSignal,
973
981
  serverOrigin: websocketOrigin,
974
- signal: new AbortController().signal,
975
982
  requestBodyLifetime,
976
983
  });
977
984
  serviceController.callAsyncHooksUntil(