@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.
- package/dist/@trpc/server/http.d.ts +1 -1
- package/dist/@trpc/server/http.d.ts.map +1 -1
- package/dist/adapters/aws-lambda/index.js +1 -0
- package/dist/adapters/aws-lambda/index.mjs +1 -0
- package/dist/adapters/express.js +1 -0
- package/dist/adapters/express.mjs +1 -0
- package/dist/adapters/fastify/fastifyRequestHandler.js +2 -1
- package/dist/adapters/fastify/fastifyRequestHandler.mjs +2 -1
- package/dist/adapters/fetch/fetchRequestHandler.js +1 -0
- package/dist/adapters/fetch/fetchRequestHandler.mjs +1 -0
- package/dist/adapters/next-app-dir/nextAppDirCaller.js +1 -0
- package/dist/adapters/next-app-dir/nextAppDirCaller.mjs +1 -0
- package/dist/adapters/next-app-dir/notFound.js +1 -0
- package/dist/adapters/next-app-dir/notFound.mjs +1 -0
- package/dist/adapters/next-app-dir/redirect.js +1 -0
- package/dist/adapters/next-app-dir/redirect.mjs +1 -0
- package/dist/adapters/next.js +1 -0
- package/dist/adapters/next.mjs +1 -0
- package/dist/adapters/node-http/incomingMessageToRequest.d.ts +1 -1
- package/dist/adapters/node-http/incomingMessageToRequest.d.ts.map +1 -1
- package/dist/adapters/node-http/incomingMessageToRequest.js +7 -5
- package/dist/adapters/node-http/incomingMessageToRequest.mjs +7 -5
- package/dist/adapters/node-http/nodeHTTPRequestHandler.d.ts.map +1 -1
- package/dist/adapters/node-http/nodeHTTPRequestHandler.js +9 -42
- package/dist/adapters/node-http/nodeHTTPRequestHandler.mjs +9 -42
- package/dist/adapters/node-http/writeResponse.d.ts +18 -0
- package/dist/adapters/node-http/writeResponse.d.ts.map +1 -0
- package/dist/adapters/node-http/writeResponse.js +85 -0
- package/dist/adapters/node-http/writeResponse.mjs +82 -0
- package/dist/adapters/standalone.js +1 -0
- package/dist/adapters/standalone.mjs +1 -0
- package/dist/adapters/ws.js +2 -1
- package/dist/adapters/ws.mjs +2 -1
- package/dist/bundle-analysis.json +146 -119
- package/dist/http.js +1 -2
- package/dist/http.mjs +1 -1
- package/dist/index.js +2 -1
- package/dist/index.mjs +2 -1
- package/dist/rpc.js +1 -0
- package/dist/rpc.mjs +1 -0
- package/dist/shared.js +1 -0
- package/dist/shared.mjs +1 -0
- package/dist/unstable-core-do-not-import/http/isAbortError.d.ts +4 -0
- package/dist/unstable-core-do-not-import/http/isAbortError.d.ts.map +1 -0
- package/dist/unstable-core-do-not-import/http/isAbortError.js +9 -0
- package/dist/unstable-core-do-not-import/http/isAbortError.mjs +7 -0
- package/dist/unstable-core-do-not-import/stream/jsonl.d.ts +6 -9
- package/dist/unstable-core-do-not-import/stream/jsonl.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/stream/jsonl.js +75 -124
- package/dist/unstable-core-do-not-import/stream/jsonl.mjs +76 -125
- package/dist/unstable-core-do-not-import/stream/sse.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/stream/sse.js +25 -21
- package/dist/unstable-core-do-not-import/stream/sse.mjs +26 -22
- package/dist/unstable-core-do-not-import/stream/utils/asyncIterable.d.ts +10 -10
- package/dist/unstable-core-do-not-import/stream/utils/asyncIterable.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/stream/utils/asyncIterable.js +47 -34
- package/dist/unstable-core-do-not-import/stream/utils/asyncIterable.mjs +47 -34
- package/dist/unstable-core-do-not-import/stream/utils/createReadableStream.d.ts +0 -4
- package/dist/unstable-core-do-not-import/stream/utils/createReadableStream.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/stream/utils/createReadableStream.js +0 -11
- package/dist/unstable-core-do-not-import/stream/utils/createReadableStream.mjs +1 -11
- package/dist/unstable-core-do-not-import/stream/utils/disposablePromiseTimer.d.ts +6 -0
- package/dist/unstable-core-do-not-import/stream/utils/disposablePromiseTimer.d.ts.map +1 -0
- package/dist/unstable-core-do-not-import/stream/utils/disposablePromiseTimer.js +28 -0
- package/dist/unstable-core-do-not-import/stream/utils/disposablePromiseTimer.mjs +25 -0
- package/dist/unstable-core-do-not-import/stream/utils/withPing.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/stream/utils/withPing.js +17 -17
- package/dist/unstable-core-do-not-import/stream/utils/withPing.mjs +17 -17
- package/dist/unstable-core-do-not-import/stream/utils/withRefCount.d.ts +17 -0
- package/dist/unstable-core-do-not-import/stream/utils/withRefCount.d.ts.map +1 -0
- package/dist/unstable-core-do-not-import/stream/utils/withRefCount.js +59 -0
- package/dist/unstable-core-do-not-import/stream/utils/withRefCount.mjs +57 -0
- package/dist/unstable-core-do-not-import.d.ts +2 -2
- package/dist/unstable-core-do-not-import.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import.js +2 -2
- package/dist/unstable-core-do-not-import.mjs +1 -1
- package/package.json +3 -3
- package/src/@trpc/server/http.ts +0 -1
- package/src/adapters/fastify/fastifyRequestHandler.ts +1 -1
- package/src/adapters/node-http/incomingMessageToRequest.ts +8 -4
- package/src/adapters/node-http/nodeHTTPRequestHandler.ts +8 -46
- package/src/adapters/node-http/writeResponse.ts +96 -0
- package/src/unstable-core-do-not-import/http/isAbortError.ts +7 -0
- package/src/unstable-core-do-not-import/stream/jsonl.ts +85 -154
- package/src/unstable-core-do-not-import/stream/sse.ts +24 -25
- package/src/unstable-core-do-not-import/stream/utils/asyncIterable.ts +58 -37
- package/src/unstable-core-do-not-import/stream/utils/createReadableStream.ts +0 -13
- package/src/unstable-core-do-not-import/stream/utils/disposablePromiseTimer.ts +27 -0
- package/src/unstable-core-do-not-import/stream/utils/withPing.ts +31 -19
- package/src/unstable-core-do-not-import/stream/utils/withRefCount.ts +93 -0
- package/src/unstable-core-do-not-import.ts +2 -2
- package/dist/unstable-core-do-not-import/http/batchStreamFormatter.d.ts +0 -24
- package/dist/unstable-core-do-not-import/http/batchStreamFormatter.d.ts.map +0 -1
- package/dist/unstable-core-do-not-import/http/batchStreamFormatter.js +0 -32
- package/dist/unstable-core-do-not-import/http/batchStreamFormatter.mjs +0 -30
- package/dist/unstable-core-do-not-import/stream/utils/promiseTimer.d.ts +0 -8
- package/dist/unstable-core-do-not-import/stream/utils/promiseTimer.d.ts.map +0 -1
- package/dist/unstable-core-do-not-import/stream/utils/promiseTimer.js +0 -38
- package/dist/unstable-core-do-not-import/stream/utils/promiseTimer.mjs +0 -36
- package/src/unstable-core-do-not-import/http/batchStreamFormatter.ts +0 -29
- 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,
|
|
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.
|
|
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.
|
|
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": "
|
|
159
|
+
"gitHead": "3df8b21beb4925cf73194fc776d1a88603a3c420"
|
|
160
160
|
}
|
package/src/@trpc/server/http.ts
CHANGED
|
@@ -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
|
-
|
|
136
|
-
|
|
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
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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
|
+
}
|