@trpc/server 11.0.0-rc.630 → 11.0.0-rc.632

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.
Files changed (101) hide show
  1. package/dist/@trpc/server/http.d.ts +1 -1
  2. package/dist/@trpc/server/http.d.ts.map +1 -1
  3. package/dist/adapters/aws-lambda/index.js +1 -0
  4. package/dist/adapters/aws-lambda/index.mjs +1 -0
  5. package/dist/adapters/express.js +1 -0
  6. package/dist/adapters/express.mjs +1 -0
  7. package/dist/adapters/fastify/fastifyRequestHandler.js +2 -1
  8. package/dist/adapters/fastify/fastifyRequestHandler.mjs +2 -1
  9. package/dist/adapters/fetch/fetchRequestHandler.js +1 -0
  10. package/dist/adapters/fetch/fetchRequestHandler.mjs +1 -0
  11. package/dist/adapters/next-app-dir/nextAppDirCaller.js +1 -0
  12. package/dist/adapters/next-app-dir/nextAppDirCaller.mjs +1 -0
  13. package/dist/adapters/next-app-dir/notFound.js +1 -0
  14. package/dist/adapters/next-app-dir/notFound.mjs +1 -0
  15. package/dist/adapters/next-app-dir/redirect.js +1 -0
  16. package/dist/adapters/next-app-dir/redirect.mjs +1 -0
  17. package/dist/adapters/next.js +1 -0
  18. package/dist/adapters/next.mjs +1 -0
  19. package/dist/adapters/node-http/incomingMessageToRequest.d.ts +1 -1
  20. package/dist/adapters/node-http/incomingMessageToRequest.d.ts.map +1 -1
  21. package/dist/adapters/node-http/incomingMessageToRequest.js +7 -5
  22. package/dist/adapters/node-http/incomingMessageToRequest.mjs +7 -5
  23. package/dist/adapters/node-http/nodeHTTPRequestHandler.d.ts.map +1 -1
  24. package/dist/adapters/node-http/nodeHTTPRequestHandler.js +9 -42
  25. package/dist/adapters/node-http/nodeHTTPRequestHandler.mjs +9 -42
  26. package/dist/adapters/node-http/writeResponse.d.ts +18 -0
  27. package/dist/adapters/node-http/writeResponse.d.ts.map +1 -0
  28. package/dist/adapters/node-http/writeResponse.js +85 -0
  29. package/dist/adapters/node-http/writeResponse.mjs +82 -0
  30. package/dist/adapters/standalone.js +1 -0
  31. package/dist/adapters/standalone.mjs +1 -0
  32. package/dist/adapters/ws.js +2 -1
  33. package/dist/adapters/ws.mjs +2 -1
  34. package/dist/bundle-analysis.json +146 -119
  35. package/dist/http.js +1 -2
  36. package/dist/http.mjs +1 -1
  37. package/dist/index.js +2 -1
  38. package/dist/index.mjs +2 -1
  39. package/dist/rpc.js +1 -0
  40. package/dist/rpc.mjs +1 -0
  41. package/dist/shared.js +1 -0
  42. package/dist/shared.mjs +1 -0
  43. package/dist/unstable-core-do-not-import/http/isAbortError.d.ts +4 -0
  44. package/dist/unstable-core-do-not-import/http/isAbortError.d.ts.map +1 -0
  45. package/dist/unstable-core-do-not-import/http/isAbortError.js +9 -0
  46. package/dist/unstable-core-do-not-import/http/isAbortError.mjs +7 -0
  47. package/dist/unstable-core-do-not-import/stream/jsonl.d.ts +6 -9
  48. package/dist/unstable-core-do-not-import/stream/jsonl.d.ts.map +1 -1
  49. package/dist/unstable-core-do-not-import/stream/jsonl.js +75 -124
  50. package/dist/unstable-core-do-not-import/stream/jsonl.mjs +76 -125
  51. package/dist/unstable-core-do-not-import/stream/sse.d.ts.map +1 -1
  52. package/dist/unstable-core-do-not-import/stream/sse.js +25 -21
  53. package/dist/unstable-core-do-not-import/stream/sse.mjs +26 -22
  54. package/dist/unstable-core-do-not-import/stream/utils/asyncIterable.d.ts +10 -10
  55. package/dist/unstable-core-do-not-import/stream/utils/asyncIterable.d.ts.map +1 -1
  56. package/dist/unstable-core-do-not-import/stream/utils/asyncIterable.js +47 -34
  57. package/dist/unstable-core-do-not-import/stream/utils/asyncIterable.mjs +47 -34
  58. package/dist/unstable-core-do-not-import/stream/utils/createReadableStream.d.ts +0 -4
  59. package/dist/unstable-core-do-not-import/stream/utils/createReadableStream.d.ts.map +1 -1
  60. package/dist/unstable-core-do-not-import/stream/utils/createReadableStream.js +0 -11
  61. package/dist/unstable-core-do-not-import/stream/utils/createReadableStream.mjs +1 -11
  62. package/dist/unstable-core-do-not-import/stream/utils/disposablePromiseTimer.d.ts +6 -0
  63. package/dist/unstable-core-do-not-import/stream/utils/disposablePromiseTimer.d.ts.map +1 -0
  64. package/dist/unstable-core-do-not-import/stream/utils/disposablePromiseTimer.js +28 -0
  65. package/dist/unstable-core-do-not-import/stream/utils/disposablePromiseTimer.mjs +25 -0
  66. package/dist/unstable-core-do-not-import/stream/utils/withPing.d.ts.map +1 -1
  67. package/dist/unstable-core-do-not-import/stream/utils/withPing.js +17 -17
  68. package/dist/unstable-core-do-not-import/stream/utils/withPing.mjs +17 -17
  69. package/dist/unstable-core-do-not-import/stream/utils/withRefCount.d.ts +17 -0
  70. package/dist/unstable-core-do-not-import/stream/utils/withRefCount.d.ts.map +1 -0
  71. package/dist/unstable-core-do-not-import/stream/utils/withRefCount.js +59 -0
  72. package/dist/unstable-core-do-not-import/stream/utils/withRefCount.mjs +57 -0
  73. package/dist/unstable-core-do-not-import.d.ts +2 -2
  74. package/dist/unstable-core-do-not-import.d.ts.map +1 -1
  75. package/dist/unstable-core-do-not-import.js +2 -2
  76. package/dist/unstable-core-do-not-import.mjs +1 -1
  77. package/package.json +3 -3
  78. package/src/@trpc/server/http.ts +0 -1
  79. package/src/adapters/fastify/fastifyRequestHandler.ts +1 -1
  80. package/src/adapters/node-http/incomingMessageToRequest.ts +8 -4
  81. package/src/adapters/node-http/nodeHTTPRequestHandler.ts +8 -46
  82. package/src/adapters/node-http/writeResponse.ts +96 -0
  83. package/src/unstable-core-do-not-import/http/isAbortError.ts +7 -0
  84. package/src/unstable-core-do-not-import/stream/jsonl.ts +85 -154
  85. package/src/unstable-core-do-not-import/stream/sse.ts +24 -25
  86. package/src/unstable-core-do-not-import/stream/utils/asyncIterable.ts +58 -37
  87. package/src/unstable-core-do-not-import/stream/utils/createReadableStream.ts +0 -13
  88. package/src/unstable-core-do-not-import/stream/utils/disposablePromiseTimer.ts +27 -0
  89. package/src/unstable-core-do-not-import/stream/utils/withPing.ts +31 -19
  90. package/src/unstable-core-do-not-import/stream/utils/withRefCount.ts +93 -0
  91. package/src/unstable-core-do-not-import.ts +2 -2
  92. package/dist/unstable-core-do-not-import/http/batchStreamFormatter.d.ts +0 -24
  93. package/dist/unstable-core-do-not-import/http/batchStreamFormatter.d.ts.map +0 -1
  94. package/dist/unstable-core-do-not-import/http/batchStreamFormatter.js +0 -32
  95. package/dist/unstable-core-do-not-import/http/batchStreamFormatter.mjs +0 -30
  96. package/dist/unstable-core-do-not-import/stream/utils/promiseTimer.d.ts +0 -8
  97. package/dist/unstable-core-do-not-import/stream/utils/promiseTimer.d.ts.map +0 -1
  98. package/dist/unstable-core-do-not-import/stream/utils/promiseTimer.js +0 -38
  99. package/dist/unstable-core-do-not-import/stream/utils/promiseTimer.mjs +0 -36
  100. package/src/unstable-core-do-not-import/http/batchStreamFormatter.ts +0 -29
  101. package/src/unstable-core-do-not-import/stream/utils/promiseTimer.ts +0 -40
@@ -15,11 +15,11 @@ export * from './unstable-core-do-not-import/createProxy';
15
15
  export * from './unstable-core-do-not-import/error/formatter';
16
16
  export * from './unstable-core-do-not-import/error/getErrorShape';
17
17
  export * from './unstable-core-do-not-import/error/TRPCError';
18
- export * from './unstable-core-do-not-import/http/batchStreamFormatter';
19
18
  export * from './unstable-core-do-not-import/http/contentType';
20
19
  export * from './unstable-core-do-not-import/http/contentTypeParsers';
21
20
  export * from './unstable-core-do-not-import/http/formDataToObject';
22
21
  export * from './unstable-core-do-not-import/http/getHTTPStatusCode';
22
+ export * from './unstable-core-do-not-import/http/isAbortError';
23
23
  export * from './unstable-core-do-not-import/http/parseConnectionParams';
24
24
  export * from './unstable-core-do-not-import/http/resolveResponse';
25
25
  export * from './unstable-core-do-not-import/http/types';
@@ -32,8 +32,8 @@ export * from './unstable-core-do-not-import/rootConfig';
32
32
  export * from './unstable-core-do-not-import/router';
33
33
  export * from './unstable-core-do-not-import/rpc';
34
34
  export * from './unstable-core-do-not-import/stream/jsonl';
35
- export * from './unstable-core-do-not-import/stream/sse';
36
35
  export * from './unstable-core-do-not-import/stream/sse.types';
36
+ export * from './unstable-core-do-not-import/stream/sse';
37
37
  export * from './unstable-core-do-not-import/stream/tracked';
38
38
  export * from './unstable-core-do-not-import/stream/utils/createDeferred';
39
39
  export * from './unstable-core-do-not-import/transformer';
@@ -1 +1 @@
1
- {"version":3,"file":"unstable-core-do-not-import.d.ts","sourceRoot":"","sources":["../src/unstable-core-do-not-import.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,cAAc,mDAAmD,CAAC;AAClE,cAAc,oDAAoD,CAAC;AACnE,cAAc,mDAAmD,CAAC;AAClE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,mDAAmD,CAAC;AAClE,cAAc,+CAA+C,CAAC;AAC9D,cAAc,yDAAyD,CAAC;AACxE,cAAc,gDAAgD,CAAC;AAC/D,cAAc,uDAAuD,CAAC;AACtE,cAAc,qDAAqD,CAAC;AACpE,cAAc,sDAAsD,CAAC;AACrE,cAAc,0DAA0D,CAAC;AACzE,cAAc,oDAAoD,CAAC;AACnE,cAAc,0CAA0C,CAAC;AACzD,cAAc,wCAAwC,CAAC;AACvD,cAAc,0CAA0C,CAAC;AACzD,cAAc,sCAAsC,CAAC;AACrD,cAAc,yCAAyC,CAAC;AACxD,cAAc,gDAAgD,CAAC;AAC/D,cAAc,0CAA0C,CAAC;AACzD,cAAc,sCAAsC,CAAC;AACrD,cAAc,mCAAmC,CAAC;AAClD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,0CAA0C,CAAC;AACzD,cAAc,gDAAgD,CAAC;AAC/D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,2DAA2D,CAAC;AAC1E,cAAc,2CAA2C,CAAC;AAC1D,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC"}
1
+ {"version":3,"file":"unstable-core-do-not-import.d.ts","sourceRoot":"","sources":["../src/unstable-core-do-not-import.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,cAAc,mDAAmD,CAAC;AAClE,cAAc,oDAAoD,CAAC;AACnE,cAAc,mDAAmD,CAAC;AAClE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,mDAAmD,CAAC;AAClE,cAAc,+CAA+C,CAAC;AAC9D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,uDAAuD,CAAC;AACtE,cAAc,qDAAqD,CAAC;AACpE,cAAc,sDAAsD,CAAC;AACrE,cAAc,iDAAiD,CAAC;AAChE,cAAc,0DAA0D,CAAC;AACzE,cAAc,oDAAoD,CAAC;AACnE,cAAc,0CAA0C,CAAC;AACzD,cAAc,wCAAwC,CAAC;AACvD,cAAc,0CAA0C,CAAC;AACzD,cAAc,sCAAsC,CAAC;AACrD,cAAc,yCAAyC,CAAC;AACxD,cAAc,gDAAgD,CAAC;AAC/D,cAAc,0CAA0C,CAAC;AACzD,cAAc,sCAAsC,CAAC;AACrD,cAAc,mCAAmC,CAAC;AAClD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,0CAA0C,CAAC;AACzD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,2DAA2D,CAAC;AAC1E,cAAc,2CAA2C,CAAC;AAC1D,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC"}
@@ -4,11 +4,11 @@ var createProxy = require('./unstable-core-do-not-import/createProxy.js');
4
4
  var formatter = require('./unstable-core-do-not-import/error/formatter.js');
5
5
  var getErrorShape = require('./unstable-core-do-not-import/error/getErrorShape.js');
6
6
  var TRPCError = require('./unstable-core-do-not-import/error/TRPCError.js');
7
- var batchStreamFormatter = require('./unstable-core-do-not-import/http/batchStreamFormatter.js');
8
7
  var contentType = require('./unstable-core-do-not-import/http/contentType.js');
9
8
  var contentTypeParsers = require('./unstable-core-do-not-import/http/contentTypeParsers.js');
10
9
  var formDataToObject = require('./unstable-core-do-not-import/http/formDataToObject.js');
11
10
  var getHTTPStatusCode = require('./unstable-core-do-not-import/http/getHTTPStatusCode.js');
11
+ var isAbortError = require('./unstable-core-do-not-import/http/isAbortError.js');
12
12
  var parseConnectionParams = require('./unstable-core-do-not-import/http/parseConnectionParams.js');
13
13
  var resolveResponse = require('./unstable-core-do-not-import/http/resolveResponse.js');
14
14
  var initTRPC = require('./unstable-core-do-not-import/initTRPC.js');
@@ -36,7 +36,6 @@ exports.getErrorShape = getErrorShape.getErrorShape;
36
36
  exports.TRPCError = TRPCError.TRPCError;
37
37
  exports.getCauseFromUnknown = TRPCError.getCauseFromUnknown;
38
38
  exports.getTRPCErrorFromUnknown = TRPCError.getTRPCErrorFromUnknown;
39
- exports.getBatchStreamFormatter = batchStreamFormatter.getBatchStreamFormatter;
40
39
  exports.getRequestInfo = contentType.getRequestInfo;
41
40
  exports.octetInputParser = contentTypeParsers.octetInputParser;
42
41
  exports.formDataToObject = formDataToObject.formDataToObject;
@@ -46,6 +45,7 @@ exports.getHTTPStatusCode = getHTTPStatusCode.getHTTPStatusCode;
46
45
  exports.getHTTPStatusCodeFromError = getHTTPStatusCode.getHTTPStatusCodeFromError;
47
46
  exports.getStatusCodeFromKey = getHTTPStatusCode.getStatusCodeFromKey;
48
47
  exports.getStatusKeyFromCode = getHTTPStatusCode.getStatusKeyFromCode;
48
+ exports.isAbortError = isAbortError.isAbortError;
49
49
  exports.parseConnectionParamsFromString = parseConnectionParams.parseConnectionParamsFromString;
50
50
  exports.parseConnectionParamsFromUnknown = parseConnectionParams.parseConnectionParamsFromUnknown;
51
51
  exports.resolveResponse = resolveResponse.resolveResponse;
@@ -2,11 +2,11 @@ export { createFlatProxy, createRecursiveProxy } from './unstable-core-do-not-im
2
2
  export { defaultFormatter } from './unstable-core-do-not-import/error/formatter.mjs';
3
3
  export { getErrorShape } from './unstable-core-do-not-import/error/getErrorShape.mjs';
4
4
  export { TRPCError, getCauseFromUnknown, getTRPCErrorFromUnknown } from './unstable-core-do-not-import/error/TRPCError.mjs';
5
- export { getBatchStreamFormatter } from './unstable-core-do-not-import/http/batchStreamFormatter.mjs';
6
5
  export { getRequestInfo } from './unstable-core-do-not-import/http/contentType.mjs';
7
6
  export { octetInputParser } from './unstable-core-do-not-import/http/contentTypeParsers.mjs';
8
7
  export { formDataToObject } from './unstable-core-do-not-import/http/formDataToObject.mjs';
9
8
  export { HTTP_CODE_TO_JSONRPC2, JSONRPC2_TO_HTTP_CODE, getHTTPStatusCode, getHTTPStatusCodeFromError, getStatusCodeFromKey, getStatusKeyFromCode } from './unstable-core-do-not-import/http/getHTTPStatusCode.mjs';
9
+ export { isAbortError } from './unstable-core-do-not-import/http/isAbortError.mjs';
10
10
  export { parseConnectionParamsFromString, parseConnectionParamsFromUnknown } from './unstable-core-do-not-import/http/parseConnectionParams.mjs';
11
11
  export { resolveResponse } from './unstable-core-do-not-import/http/resolveResponse.mjs';
12
12
  export { initTRPC } from './unstable-core-do-not-import/initTRPC.mjs';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trpc/server",
3
- "version": "11.0.0-rc.630+73639524c",
3
+ "version": "11.0.0-rc.632+3df8b21be",
4
4
  "description": "The tRPC server library",
5
5
  "author": "KATT",
6
6
  "license": "MIT",
@@ -138,7 +138,7 @@
138
138
  "rollup": "^4.24.4",
139
139
  "superjson": "^1.12.4",
140
140
  "superstruct": "^2.0.0",
141
- "tslib": "^2.5.0",
141
+ "tslib": "^2.8.1",
142
142
  "tsx": "^4.0.0",
143
143
  "typescript": "^5.6.2",
144
144
  "valibot": "^0.42.0",
@@ -156,5 +156,5 @@
156
156
  "next": "*",
157
157
  "ws": "*"
158
158
  },
159
- "gitHead": "73639524cd2d8071e4818435a76f7234685ac2af"
159
+ "gitHead": "3df8b21beb4925cf73194fc776d1a88603a3c420"
160
160
  }
@@ -18,7 +18,6 @@ export type {
18
18
  } from '../../unstable-core-do-not-import';
19
19
 
20
20
  export {
21
- getBatchStreamFormatter,
22
21
  octetInputParser,
23
22
  parseConnectionParamsFromUnknown,
24
23
  parseConnectionParamsFromString,
@@ -60,7 +60,7 @@ export async function fastifyRequestHandler<
60
60
  if ('body' in opts.req) {
61
61
  incomingMessage.body = opts.req.body;
62
62
  }
63
- const req = incomingMessageToRequest(incomingMessage, {
63
+ const req = incomingMessageToRequest(incomingMessage, opts.res.raw, {
64
64
  maxBodySize: null,
65
65
  });
66
66
 
@@ -118,6 +118,7 @@ function createHeaders(incoming: http.IncomingHttpHeaders): Headers {
118
118
  */
119
119
  export function incomingMessageToRequest(
120
120
  req: http.IncomingMessage,
121
+ res: http.ServerResponse,
121
122
  opts: {
122
123
  /**
123
124
  * Max body size in bytes. If the body is larger than this, the request will be aborted
@@ -128,12 +129,15 @@ export function incomingMessageToRequest(
128
129
  const ac = new AbortController();
129
130
 
130
131
  const onAbort = () => {
132
+ res.off('close', onAbort);
133
+ req.socket.off('end', onAbort);
134
+
135
+ // abort the request
131
136
  ac.abort();
132
- req.off('aborted', onAbort);
133
- req.off('close', onAbort);
134
137
  };
135
- req.once('aborted', onAbort);
136
- req.socket?.once('close', onAbort);
138
+
139
+ res.once('close', onAbort);
140
+ req.socket.once('end', onAbort);
137
141
 
138
142
  // Get host from either regular header or HTTP/2 pseudo-header
139
143
  const url = createURL(req);
@@ -25,6 +25,7 @@ import type {
25
25
  NodeHTTPRequestHandlerOptions,
26
26
  NodeHTTPResponse,
27
27
  } from './types';
28
+ import { writeResponse } from './writeResponse';
28
29
 
29
30
  /**
30
31
  * @internal
@@ -82,7 +83,7 @@ export async function nodeHTTPRequestHandler<
82
83
  });
83
84
  return handleViaMiddleware(opts.req, opts.res, (err: unknown) => {
84
85
  run(async () => {
85
- const req = incomingMessageToRequest(opts.req, {
86
+ const request = incomingMessageToRequest(opts.req, opts.res, {
86
87
  maxBodySize: opts.maxBodySize ?? null,
87
88
  });
88
89
 
@@ -98,7 +99,7 @@ export async function nodeHTTPRequestHandler<
98
99
 
99
100
  const response = await resolveResponse({
100
101
  ...opts,
101
- req,
102
+ req: request,
102
103
  error: err ? getTRPCErrorFromUnknown(err) : null,
103
104
  createContext,
104
105
  onError(o) {
@@ -109,50 +110,11 @@ export async function nodeHTTPRequestHandler<
109
110
  },
110
111
  });
111
112
 
112
- const { res } = opts;
113
- if (res.statusCode === 200) {
114
- // if the status code is set, we assume that it's been manually overridden
115
- res.statusCode = response.status;
116
- }
117
- for (const [key, value] of response.headers) {
118
- res.setHeader(key, value);
119
- }
120
- if (response.body) {
121
- const reader = response.body.getReader();
122
- const onAbort = () => {
123
- // cancelling the reader will cause the whole stream to be cancelled
124
- reader.cancel().catch(() => {
125
- // console.error('reader.cancel() error', err);
126
- });
127
- };
128
- req.signal.addEventListener('abort', onAbort, {
129
- once: true,
130
- });
131
-
132
- while (true) {
133
- const { done, value } = await reader.read();
134
-
135
- if (done) {
136
- break;
137
- }
138
- if (!res.writable) {
139
- break;
140
- }
141
- if (res.write(value) === false) {
142
- await new Promise<void>((resolve) => {
143
- res.once('drain', resolve);
144
- });
145
- }
146
-
147
- // useful for debugging chunked responses:
148
- // console.log('wrote', Buffer.from(value).toString());
149
-
150
- // IMPORTANT - flush the response buffer, otherwise the client will not receive the data until `.end()`
151
- res.flush?.();
152
- }
153
- req.signal.removeEventListener('abort', onAbort);
154
- }
155
- res.end();
113
+ await writeResponse({
114
+ request,
115
+ response,
116
+ rawResponse: opts.res,
117
+ });
156
118
  }).catch(internal_exceptionHandler(opts));
157
119
  });
158
120
  });
@@ -0,0 +1,96 @@
1
+ // eslint-disable-next-line no-restricted-imports
2
+ import { isAbortError } from '../../unstable-core-do-not-import';
3
+ import type { NodeHTTPResponse } from './types';
4
+
5
+ async function writeResponseBodyChunk(
6
+ res: NodeHTTPResponse,
7
+ chunk: Uint8Array,
8
+ ) {
9
+ if (res.write(chunk) === false) {
10
+ await new Promise<void>((resolve, reject) => {
11
+ const onError = (err: unknown) => {
12
+ reject(err);
13
+ cleanup();
14
+ };
15
+ const onDrain = () => {
16
+ resolve();
17
+ cleanup();
18
+ };
19
+ const cleanup = () => {
20
+ res.off('error', onError);
21
+ res.off('drain', onDrain);
22
+ };
23
+ res.once('error', onError);
24
+ res.once('drain', onDrain);
25
+ });
26
+ }
27
+ }
28
+ /**
29
+ * @internal
30
+ */
31
+
32
+ export async function writeResponseBody(opts: {
33
+ res: NodeHTTPResponse;
34
+ signal: AbortSignal;
35
+ body: NonNullable<Response['body']>;
36
+ }) {
37
+ const { res } = opts;
38
+
39
+ try {
40
+ const writableStream = new WritableStream({
41
+ async write(chunk) {
42
+ await writeResponseBodyChunk(res, chunk);
43
+ res.flush?.();
44
+ },
45
+ abort() {
46
+ if (!res.headersSent) {
47
+ res.statusCode = 500;
48
+ }
49
+ },
50
+ });
51
+
52
+ await opts.body.pipeTo(writableStream, {
53
+ signal: opts.signal,
54
+ });
55
+ } catch (err) {
56
+ if (isAbortError(err)) {
57
+ return;
58
+ }
59
+ throw err;
60
+ }
61
+ }
62
+ /**
63
+ * @internal
64
+ */
65
+
66
+ export async function writeResponse(opts: {
67
+ request: Request;
68
+ response: Response;
69
+ rawResponse: NodeHTTPResponse;
70
+ }) {
71
+ const { response, rawResponse } = opts;
72
+
73
+ // Only override status code if it hasn't been explicitly set in a procedure etc
74
+ if (rawResponse.statusCode === 200) {
75
+ rawResponse.statusCode = response.status;
76
+ }
77
+ for (const [key, value] of response.headers) {
78
+ rawResponse.setHeader(key, value);
79
+ }
80
+ try {
81
+ if (response.body) {
82
+ await writeResponseBody({
83
+ res: rawResponse,
84
+ signal: opts.request.signal,
85
+ body: response.body,
86
+ });
87
+ }
88
+ } catch (err) {
89
+ if (!rawResponse.headersSent) {
90
+ rawResponse.statusCode = 500;
91
+ }
92
+ throw err;
93
+ } finally {
94
+ rawResponse.end();
95
+ }
96
+ }
@@ -0,0 +1,7 @@
1
+ import { isObject } from '../utils';
2
+
3
+ export function isAbortError(
4
+ error: unknown,
5
+ ): error is DOMException | Error | { name: 'AbortError' } {
6
+ return isObject(error) && error['name'] === 'AbortError';
7
+ }