@rest-vir/run-service 1.7.0 → 1.7.2

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.
@@ -1,5 +1,5 @@
1
1
  /* node:coverage disable: this file is just types */
2
- import { setResponseHeaders } from '../util/headers.js';
2
+ import { setRawResponseHeaders, setResponseHeaders } from '../util/headers.js';
3
3
  /**
4
4
  * Handle the output of a handler without sending the response. Similar to
5
5
  * {@link handleHandlerOutput} but this one does not send the response.
@@ -11,6 +11,11 @@ import { setResponseHeaders } from '../util/headers.js';
11
11
  export function handleHandlerOutputWithoutSending(result, response) {
12
12
  if (result?.headers) {
13
13
  setResponseHeaders(response, result.headers);
14
+ /**
15
+ * Also set headers on the raw Node response so they survive `response.hijack()`. Fastify
16
+ * headers set via `response.header()` are lost when the response is hijacked.
17
+ */
18
+ setRawResponseHeaders(response.raw, result.headers);
14
19
  }
15
20
  if (result?.statusCode) {
16
21
  response.statusCode = result.statusCode;
@@ -31,6 +36,11 @@ export function handleHandlerOutputWithoutSending(result, response) {
31
36
  export function handleHandlerOutput(result, response) {
32
37
  if (result?.headers) {
33
38
  setResponseHeaders(response, result.headers);
39
+ /**
40
+ * Also set headers on the raw Node response so they survive `response.hijack()`. Fastify
41
+ * headers set via `response.header()` are lost when the response is hijacked.
42
+ */
43
+ setRawResponseHeaders(response.raw, result.headers);
34
44
  }
35
45
  if (result?.statusCode) {
36
46
  response.statusCode = result.statusCode;
@@ -1,5 +1,5 @@
1
1
  import { type ServerResponse } from '@rest-vir/implement-service';
2
- import { type OutgoingHttpHeaders } from 'node:http';
2
+ import { type ServerResponse as NodeServerResponse, type OutgoingHttpHeaders } from 'node:http';
3
3
  /**
4
4
  * Easily apply an object of headers to a Response object. Setting a header to `undefined` removes
5
5
  * it.
@@ -9,3 +9,14 @@ import { type OutgoingHttpHeaders } from 'node:http';
9
9
  * @package [`@rest-vir/run-service`](https://www.npmjs.com/package/@rest-vir/run-service)
10
10
  */
11
11
  export declare function setResponseHeaders(response: Readonly<Pick<ServerResponse, 'removeHeader' | 'header'>>, headers: Readonly<OutgoingHttpHeaders>): void;
12
+ /**
13
+ * Sets headers directly on the raw Node.js `http.ServerResponse`. Unlike headers set via Fastify's
14
+ * `response.header()`, these survive `response.hijack()` because they are written to the underlying
15
+ * Node response. When an endpoint later calls `writeHead()`, these headers are merged in, with
16
+ * `writeHead()` headers taking precedence.
17
+ *
18
+ * @category Internal
19
+ * @category Package : @rest-vir/run-service
20
+ * @package [`@rest-vir/run-service`](https://www.npmjs.com/package/@rest-vir/run-service)
21
+ */
22
+ export declare function setRawResponseHeaders(rawResponse: Readonly<Pick<NodeServerResponse, 'setHeader' | 'removeHeader'>>, headers: Readonly<OutgoingHttpHeaders>): void;
@@ -17,3 +17,23 @@ export function setResponseHeaders(response, headers) {
17
17
  }
18
18
  });
19
19
  }
20
+ /**
21
+ * Sets headers directly on the raw Node.js `http.ServerResponse`. Unlike headers set via Fastify's
22
+ * `response.header()`, these survive `response.hijack()` because they are written to the underlying
23
+ * Node response. When an endpoint later calls `writeHead()`, these headers are merged in, with
24
+ * `writeHead()` headers taking precedence.
25
+ *
26
+ * @category Internal
27
+ * @category Package : @rest-vir/run-service
28
+ * @package [`@rest-vir/run-service`](https://www.npmjs.com/package/@rest-vir/run-service)
29
+ */
30
+ export function setRawResponseHeaders(rawResponse, headers) {
31
+ getObjectTypedEntries(headers).forEach(([name, value,]) => {
32
+ if (value == undefined) {
33
+ rawResponse.removeHeader(String(name));
34
+ }
35
+ else {
36
+ rawResponse.setHeader(String(name), value);
37
+ }
38
+ });
39
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rest-vir/run-service",
3
- "version": "1.7.0",
3
+ "version": "1.7.2",
4
4
  "description": "Run a service defined by @rest-vir/define-service and implemented by @rest-vir/implement-service.",
5
5
  "keywords": [
6
6
  "rest",
@@ -44,8 +44,8 @@
44
44
  "@augment-vir/node": "^31.68.2",
45
45
  "@fastify/compress": "^8.3.1",
46
46
  "@fastify/websocket": "^11.2.0",
47
- "@rest-vir/define-service": "^1.7.0",
48
- "@rest-vir/implement-service": "^1.7.0",
47
+ "@rest-vir/define-service": "^1.7.2",
48
+ "@rest-vir/implement-service": "^1.7.2",
49
49
  "cluster-vir": "^1.0.1",
50
50
  "date-vir": "^8.2.1",
51
51
  "fastify": "^5.8.4",