@trpc/server 11.0.0-rc.584 → 11.0.0-rc.587
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/adapters/express.d.ts.map +1 -1
- package/dist/adapters/express.js +24 -6
- package/dist/adapters/express.mjs +24 -6
- package/dist/adapters/next.d.ts.map +1 -1
- package/dist/adapters/next.js +10 -13
- package/dist/adapters/next.mjs +10 -13
- package/dist/adapters/node-http/nodeHTTPRequestHandler.d.ts +4 -1
- package/dist/adapters/node-http/nodeHTTPRequestHandler.d.ts.map +1 -1
- package/dist/adapters/node-http/nodeHTTPRequestHandler.js +67 -60
- package/dist/adapters/node-http/nodeHTTPRequestHandler.mjs +67 -60
- package/dist/adapters/standalone.d.ts.map +1 -1
- package/dist/adapters/standalone.js +9 -10
- package/dist/adapters/standalone.mjs +9 -10
- package/dist/bundle-analysis.json +104 -102
- package/package.json +2 -2
- package/src/adapters/express.ts +20 -8
- package/src/adapters/next.ts +8 -11
- package/src/adapters/node-http/nodeHTTPRequestHandler.ts +78 -69
- package/src/adapters/standalone.ts +8 -10
|
@@ -65,86 +65,95 @@ export function internal_exceptionHandler<
|
|
|
65
65
|
};
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
/**
|
|
69
|
+
* @remark the promise never rejects
|
|
70
|
+
*/
|
|
71
|
+
export async function nodeHTTPRequestHandler<
|
|
69
72
|
TRouter extends AnyRouter,
|
|
70
73
|
TRequest extends NodeHTTPRequest,
|
|
71
74
|
TResponse extends NodeHTTPResponse,
|
|
72
75
|
>(opts: NodeHTTPRequestHandlerOptions<TRouter, TRequest, TResponse>) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
) => {
|
|
85
|
-
return await opts.createContext?.({
|
|
86
|
-
...opts,
|
|
87
|
-
...innerOpts,
|
|
76
|
+
return new Promise<void>((resolve) => {
|
|
77
|
+
const handleViaMiddleware =
|
|
78
|
+
opts.middleware ?? ((_req, _res, next) => next());
|
|
79
|
+
|
|
80
|
+
opts.res.once('finish', () => {
|
|
81
|
+
resolve();
|
|
82
|
+
});
|
|
83
|
+
return handleViaMiddleware(opts.req, opts.res, (err: unknown) => {
|
|
84
|
+
run(async () => {
|
|
85
|
+
const req = incomingMessageToRequest(opts.req, {
|
|
86
|
+
maxBodySize: opts.maxBodySize ?? null,
|
|
88
87
|
});
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
opts?.onError?.({
|
|
98
|
-
...o,
|
|
99
|
-
req: opts.req,
|
|
100
|
-
});
|
|
101
|
-
},
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
const { res } = opts;
|
|
105
|
-
if (res.statusCode === 200) {
|
|
106
|
-
// if the status code is set, we assume that it's been manually overridden
|
|
107
|
-
res.statusCode = response.status;
|
|
108
|
-
}
|
|
109
|
-
for (const [key, value] of response.headers) {
|
|
110
|
-
res.setHeader(key, value);
|
|
111
|
-
}
|
|
112
|
-
if (response.body) {
|
|
113
|
-
const reader = response.body.getReader();
|
|
114
|
-
const onAbort = () => {
|
|
115
|
-
// cancelling the reader will cause the whole stream to be cancelled
|
|
116
|
-
reader.cancel().catch(() => {
|
|
117
|
-
// console.error('reader.cancel() error', err);
|
|
88
|
+
|
|
89
|
+
// Build tRPC dependencies
|
|
90
|
+
const createContext: ResolveHTTPRequestOptionsContextFn<
|
|
91
|
+
TRouter
|
|
92
|
+
> = async (innerOpts) => {
|
|
93
|
+
return await opts.createContext?.({
|
|
94
|
+
...opts,
|
|
95
|
+
...innerOpts,
|
|
118
96
|
});
|
|
119
97
|
};
|
|
120
|
-
req.signal.addEventListener('abort', onAbort, {
|
|
121
|
-
once: true,
|
|
122
|
-
});
|
|
123
98
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
if (res.write(value) === false) {
|
|
134
|
-
await new Promise<void>((resolve) => {
|
|
135
|
-
res.once('drain', resolve);
|
|
99
|
+
const response = await resolveResponse({
|
|
100
|
+
...opts,
|
|
101
|
+
req,
|
|
102
|
+
error: err ? getTRPCErrorFromUnknown(err) : null,
|
|
103
|
+
createContext,
|
|
104
|
+
onError(o) {
|
|
105
|
+
opts?.onError?.({
|
|
106
|
+
...o,
|
|
107
|
+
req: opts.req,
|
|
136
108
|
});
|
|
137
|
-
}
|
|
109
|
+
},
|
|
110
|
+
});
|
|
138
111
|
|
|
139
|
-
|
|
140
|
-
|
|
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
|
+
});
|
|
141
131
|
|
|
142
|
-
|
|
143
|
-
|
|
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);
|
|
144
154
|
}
|
|
145
|
-
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
}).catch(internal_exceptionHandler(opts));
|
|
155
|
+
res.end();
|
|
156
|
+
}).catch(internal_exceptionHandler(opts));
|
|
157
|
+
});
|
|
149
158
|
});
|
|
150
159
|
}
|
|
@@ -12,6 +12,8 @@ import http from 'http';
|
|
|
12
12
|
// @trpc/server
|
|
13
13
|
import { type AnyRouter } from '../@trpc/server';
|
|
14
14
|
import { toURL } from '../@trpc/server/http';
|
|
15
|
+
// eslint-disable-next-line no-restricted-imports
|
|
16
|
+
import { run } from '../unstable-core-do-not-import';
|
|
15
17
|
import type {
|
|
16
18
|
NodeHTTPCreateContextFnOptions,
|
|
17
19
|
NodeHTTPHandlerOptions,
|
|
@@ -34,31 +36,27 @@ export function createHTTPHandler<TRouter extends AnyRouter>(
|
|
|
34
36
|
): http.RequestListener {
|
|
35
37
|
return (req, res) => {
|
|
36
38
|
let path = '';
|
|
37
|
-
|
|
39
|
+
run(async () => {
|
|
38
40
|
const url = toURL(req.url!);
|
|
39
41
|
|
|
40
42
|
// get procedure path and remove the leading slash
|
|
41
43
|
// /procedure -> procedure
|
|
42
44
|
path = url.pathname.slice(1);
|
|
43
45
|
|
|
44
|
-
nodeHTTPRequestHandler({
|
|
46
|
+
await nodeHTTPRequestHandler({
|
|
45
47
|
...(opts as any),
|
|
46
48
|
req,
|
|
47
49
|
res,
|
|
48
50
|
path,
|
|
49
51
|
});
|
|
50
|
-
}
|
|
51
|
-
internal_exceptionHandler
|
|
52
|
-
TRouter,
|
|
53
|
-
http.IncomingMessage,
|
|
54
|
-
http.ServerResponse
|
|
55
|
-
>({
|
|
52
|
+
}).catch(
|
|
53
|
+
internal_exceptionHandler({
|
|
56
54
|
req,
|
|
57
55
|
res,
|
|
58
56
|
path,
|
|
59
57
|
...opts,
|
|
60
|
-
})
|
|
61
|
-
|
|
58
|
+
}),
|
|
59
|
+
);
|
|
62
60
|
};
|
|
63
61
|
}
|
|
64
62
|
|