@jsenv/server 15.4.1 → 15.5.1

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.1",
3
+ "version": "15.5.1",
4
4
  "description": "Write your Node.js server using pure functions",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -32,7 +32,7 @@
32
32
  "dependencies": {
33
33
  "@jsenv/abort": "4.3.0",
34
34
  "@jsenv/humanize": "1.2.8",
35
- "@jsenv/url-meta": "8.5.2",
35
+ "@jsenv/url-meta": "8.5.3",
36
36
  "@jsenv/utils": "2.1.2",
37
37
  "ws": "8.18.0"
38
38
  },
@@ -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(