@trpc/server 11.0.0-rc.359 → 11.0.0-rc.362
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 +7 -6
- package/dist/@trpc/server/http.d.ts.map +1 -1
- package/dist/@trpc/server/index.d.ts +1 -1
- package/dist/@trpc/server/index.d.ts.map +1 -1
- package/dist/adapters/aws-lambda/getPlanner.d.ts +13 -0
- package/dist/adapters/aws-lambda/getPlanner.d.ts.map +1 -0
- package/dist/adapters/aws-lambda/getPlanner.js +143 -0
- package/dist/adapters/aws-lambda/getPlanner.mjs +141 -0
- package/dist/adapters/aws-lambda/index.d.ts +12 -9
- package/dist/adapters/aws-lambda/index.d.ts.map +1 -1
- package/dist/adapters/aws-lambda/index.js +6 -65
- package/dist/adapters/aws-lambda/index.mjs +8 -61
- package/dist/adapters/express.d.ts.map +1 -1
- package/dist/adapters/express.js +1 -1
- package/dist/adapters/express.mjs +1 -1
- package/dist/adapters/fastify/fastifyRequestHandler.d.ts +10 -1
- package/dist/adapters/fastify/fastifyRequestHandler.d.ts.map +1 -1
- package/dist/adapters/fastify/fastifyRequestHandler.js +12 -55
- package/dist/adapters/fastify/fastifyRequestHandler.mjs +13 -56
- package/dist/adapters/fastify/fastifyTRPCPlugin.d.ts +1 -1
- package/dist/adapters/fastify/fastifyTRPCPlugin.d.ts.map +1 -1
- package/dist/adapters/fetch/fetchRequestHandler.d.ts +1 -5
- package/dist/adapters/fetch/fetchRequestHandler.d.ts.map +1 -1
- package/dist/adapters/fetch/fetchRequestHandler.js +28 -71
- package/dist/adapters/fetch/fetchRequestHandler.mjs +29 -72
- package/dist/adapters/fetch/types.d.ts +9 -12
- package/dist/adapters/fetch/types.d.ts.map +1 -1
- package/dist/adapters/next-app-dir/nextAppDirCaller.d.ts +2 -7
- package/dist/adapters/next-app-dir/nextAppDirCaller.d.ts.map +1 -1
- package/dist/adapters/next.d.ts.map +1 -1
- package/dist/adapters/next.js +1 -2
- package/dist/adapters/next.mjs +1 -2
- package/dist/adapters/node-http/incomingMessageToRequest.d.ts +18 -0
- package/dist/adapters/node-http/incomingMessageToRequest.d.ts.map +1 -0
- package/dist/adapters/node-http/incomingMessageToRequest.js +71 -0
- package/dist/adapters/node-http/incomingMessageToRequest.mjs +69 -0
- package/dist/adapters/node-http/index.d.ts +1 -0
- package/dist/adapters/node-http/index.d.ts.map +1 -1
- package/dist/adapters/node-http/index.js +2 -0
- package/dist/adapters/node-http/index.mjs +1 -0
- package/dist/adapters/node-http/nodeHTTPRequestHandler.d.ts +1 -1
- package/dist/adapters/node-http/nodeHTTPRequestHandler.d.ts.map +1 -1
- package/dist/adapters/node-http/nodeHTTPRequestHandler.js +27 -72
- package/dist/adapters/node-http/nodeHTTPRequestHandler.mjs +28 -73
- package/dist/adapters/node-http/types.d.ts +2 -14
- package/dist/adapters/node-http/types.d.ts.map +1 -1
- package/dist/adapters/standalone.d.ts.map +1 -1
- package/dist/adapters/standalone.js +0 -1
- package/dist/adapters/standalone.mjs +0 -1
- package/dist/adapters/ws.d.ts +2 -12
- package/dist/adapters/ws.d.ts.map +1 -1
- package/dist/adapters/ws.js +1 -1
- package/dist/adapters/ws.mjs +1 -1
- package/dist/bundle-analysis.json +173 -259
- package/dist/http.js +4 -4
- package/dist/http.mjs +2 -2
- package/dist/index.js +2 -2
- package/dist/index.mjs +1 -1
- package/dist/unstable-core-do-not-import/http/contentType.d.ts +8 -28
- package/dist/unstable-core-do-not-import/http/contentType.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/http/contentType.js +164 -38
- package/dist/unstable-core-do-not-import/http/contentType.mjs +164 -38
- package/dist/unstable-core-do-not-import/http/contentTypeParsers.d.ts +14 -0
- package/dist/unstable-core-do-not-import/http/contentTypeParsers.d.ts.map +1 -0
- package/dist/unstable-core-do-not-import/http/contentTypeParsers.js +14 -0
- package/dist/unstable-core-do-not-import/http/contentTypeParsers.mjs +12 -0
- package/dist/unstable-core-do-not-import/http/getHTTPStatusCode.d.ts +1 -1
- package/dist/unstable-core-do-not-import/http/getHTTPStatusCode.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/http/resolveHTTPResponse.d.ts +7 -43
- package/dist/unstable-core-do-not-import/http/resolveHTTPResponse.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/http/resolveHTTPResponse.js +115 -124
- package/dist/unstable-core-do-not-import/http/resolveHTTPResponse.mjs +116 -125
- package/dist/unstable-core-do-not-import/http/types.d.ts +25 -29
- package/dist/unstable-core-do-not-import/http/types.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/initTRPC.d.ts +1 -1
- package/dist/unstable-core-do-not-import/procedureBuilder.d.ts +1 -3
- package/dist/unstable-core-do-not-import/procedureBuilder.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/procedureBuilder.js +0 -2
- package/dist/unstable-core-do-not-import/procedureBuilder.mjs +1 -2
- package/dist/unstable-core-do-not-import/rootConfig.d.ts +12 -0
- package/dist/unstable-core-do-not-import/rootConfig.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/utils.d.ts +3 -0
- package/dist/unstable-core-do-not-import/utils.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/utils.js +2 -0
- package/dist/unstable-core-do-not-import/utils.mjs +2 -1
- package/dist/unstable-core-do-not-import.d.ts +9 -3
- package/dist/unstable-core-do-not-import.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import.js +11 -9
- package/dist/unstable-core-do-not-import.mjs +7 -6
- package/package.json +3 -14
- package/src/@trpc/server/http.ts +7 -13
- package/src/@trpc/server/index.ts +1 -0
- package/src/adapters/aws-lambda/getPlanner.ts +191 -0
- package/src/adapters/aws-lambda/index.ts +43 -92
- package/src/adapters/express.ts +1 -6
- package/src/adapters/fastify/fastifyRequestHandler.ts +22 -77
- package/src/adapters/fastify/fastifyTRPCPlugin.ts +1 -1
- package/src/adapters/fetch/fetchRequestHandler.ts +34 -98
- package/src/adapters/fetch/types.ts +24 -15
- package/src/adapters/next-app-dir/nextAppDirCaller.ts +2 -9
- package/src/adapters/next.ts +1 -6
- package/src/adapters/node-http/incomingMessageToRequest.ts +94 -0
- package/src/adapters/node-http/index.ts +1 -0
- package/src/adapters/node-http/nodeHTTPRequestHandler.ts +31 -110
- package/src/adapters/node-http/types.ts +9 -19
- package/src/adapters/standalone.ts +1 -2
- package/src/adapters/ws.ts +9 -14
- package/src/unstable-core-do-not-import/http/contentType.ts +199 -82
- package/src/unstable-core-do-not-import/http/contentTypeParsers.ts +29 -0
- package/src/unstable-core-do-not-import/http/getHTTPStatusCode.ts +2 -2
- package/src/unstable-core-do-not-import/http/resolveHTTPResponse.ts +133 -205
- package/src/unstable-core-do-not-import/http/types.ts +25 -32
- package/src/unstable-core-do-not-import/procedureBuilder.ts +2 -4
- package/src/unstable-core-do-not-import/rootConfig.ts +21 -0
- package/src/unstable-core-do-not-import/utils.ts +4 -0
- package/src/unstable-core-do-not-import.ts +9 -3
- package/adapters/node-http/content-type/form-data/index.d.ts +0 -1
- package/adapters/node-http/content-type/form-data/index.js +0 -1
- package/adapters/node-http/content-type/json/index.d.ts +0 -1
- package/adapters/node-http/content-type/json/index.js +0 -1
- package/dist/adapters/aws-lambda/utils.d.ts +0 -40
- package/dist/adapters/aws-lambda/utils.d.ts.map +0 -1
- package/dist/adapters/aws-lambda/utils.js +0 -100
- package/dist/adapters/aws-lambda/utils.mjs +0 -93
- package/dist/adapters/node-http/content-type/form-data/fileUploadHandler.d.ts +0 -73
- package/dist/adapters/node-http/content-type/form-data/fileUploadHandler.d.ts.map +0 -1
- package/dist/adapters/node-http/content-type/form-data/fileUploadHandler.js +0 -161
- package/dist/adapters/node-http/content-type/form-data/fileUploadHandler.mjs +0 -157
- package/dist/adapters/node-http/content-type/form-data/index.d.ts +0 -26
- package/dist/adapters/node-http/content-type/form-data/index.d.ts.map +0 -1
- package/dist/adapters/node-http/content-type/form-data/index.js +0 -135
- package/dist/adapters/node-http/content-type/form-data/index.mjs +0 -108
- package/dist/adapters/node-http/content-type/form-data/memoryUploadHandler.d.ts +0 -31
- package/dist/adapters/node-http/content-type/form-data/memoryUploadHandler.d.ts.map +0 -1
- package/dist/adapters/node-http/content-type/form-data/memoryUploadHandler.js +0 -29
- package/dist/adapters/node-http/content-type/form-data/memoryUploadHandler.mjs +0 -27
- package/dist/adapters/node-http/content-type/form-data/streamSlice.d.ts +0 -16
- package/dist/adapters/node-http/content-type/form-data/streamSlice.d.ts.map +0 -1
- package/dist/adapters/node-http/content-type/form-data/streamSlice.js +0 -46
- package/dist/adapters/node-http/content-type/form-data/streamSlice.mjs +0 -44
- package/dist/adapters/node-http/content-type/form-data/uploadHandler.d.ts +0 -45
- package/dist/adapters/node-http/content-type/form-data/uploadHandler.d.ts.map +0 -1
- package/dist/adapters/node-http/content-type/form-data/uploadHandler.js +0 -30
- package/dist/adapters/node-http/content-type/form-data/uploadHandler.mjs +0 -26
- package/dist/adapters/node-http/content-type/json/getPostBody.d.ts +0 -7
- package/dist/adapters/node-http/content-type/json/getPostBody.d.ts.map +0 -1
- package/dist/adapters/node-http/content-type/json/getPostBody.js +0 -53
- package/dist/adapters/node-http/content-type/json/getPostBody.mjs +0 -51
- package/dist/adapters/node-http/content-type/json/index.d.ts +0 -2
- package/dist/adapters/node-http/content-type/json/index.d.ts.map +0 -1
- package/dist/adapters/node-http/content-type/json/index.js +0 -16
- package/dist/adapters/node-http/content-type/json/index.mjs +0 -14
- package/dist/adapters/node-http/internals/contentType.d.ts +0 -9
- package/dist/adapters/node-http/internals/contentType.d.ts.map +0 -1
- package/dist/adapters/node-http/internals/contentType.js +0 -8
- package/dist/adapters/node-http/internals/contentType.mjs +0 -6
- package/dist/unstable-core-do-not-import/http/index.d.ts +0 -12
- package/dist/unstable-core-do-not-import/http/index.d.ts.map +0 -1
- package/src/adapters/aws-lambda/utils.ts +0 -164
- package/src/adapters/node-http/content-type/form-data/fileUploadHandler.ts +0 -277
- package/src/adapters/node-http/content-type/form-data/index.ts +0 -163
- package/src/adapters/node-http/content-type/form-data/memoryUploadHandler.ts +0 -56
- package/src/adapters/node-http/content-type/form-data/streamSlice.ts +0 -56
- package/src/adapters/node-http/content-type/form-data/uploadHandler.ts +0 -89
- package/src/adapters/node-http/content-type/json/getPostBody.ts +0 -58
- package/src/adapters/node-http/content-type/json/index.ts +0 -11
- package/src/adapters/node-http/internals/contentType.ts +0 -31
- package/src/unstable-core-do-not-import/http/index.ts +0 -29
|
@@ -1,99 +1,216 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
|
2
1
|
import { TRPCError } from '../error/TRPCError';
|
|
3
|
-
import type {
|
|
4
|
-
import
|
|
5
|
-
import type {
|
|
6
|
-
import type { HTTPRequest } from './types';
|
|
7
|
-
|
|
8
|
-
type GetInputs = (opts: {
|
|
9
|
-
req: HTTPRequest;
|
|
10
|
-
isBatchCall: boolean;
|
|
11
|
-
router: AnyRouter;
|
|
12
|
-
preprocessedBody: boolean;
|
|
13
|
-
}) => MaybePromise<Record<number, unknown>>;
|
|
14
|
-
|
|
15
|
-
export type BodyResult =
|
|
16
|
-
| {
|
|
17
|
-
ok: true;
|
|
18
|
-
data: unknown;
|
|
19
|
-
/**
|
|
20
|
-
* If the HTTP handler has already parsed the body
|
|
21
|
-
*/
|
|
22
|
-
preprocessed: boolean;
|
|
23
|
-
}
|
|
24
|
-
| { ok: false; error: TRPCError };
|
|
2
|
+
import type { RootConfig } from '../rootConfig';
|
|
3
|
+
import { isObject, unsetMarker } from '../utils';
|
|
4
|
+
import type { TRPCRequestInfo } from './types';
|
|
25
5
|
|
|
26
|
-
|
|
27
|
-
isMatch(opts:
|
|
28
|
-
|
|
29
|
-
|
|
6
|
+
type ContentTypeHandler = {
|
|
7
|
+
isMatch: (opts: Request) => boolean;
|
|
8
|
+
parse: (opts: {
|
|
9
|
+
path: string;
|
|
10
|
+
req: Request;
|
|
11
|
+
searchParams: URLSearchParams;
|
|
12
|
+
config: RootConfig<any>;
|
|
13
|
+
}) => TRPCRequestInfo;
|
|
30
14
|
};
|
|
31
15
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
16
|
+
/**
|
|
17
|
+
* Memoize a function that takes no arguments
|
|
18
|
+
* @internal
|
|
19
|
+
*/
|
|
20
|
+
function memo<TReturn>(fn: () => Promise<TReturn>) {
|
|
21
|
+
let promise: Promise<TReturn> | null = null;
|
|
22
|
+
let value: TReturn | typeof unsetMarker = unsetMarker;
|
|
23
|
+
return {
|
|
24
|
+
/**
|
|
25
|
+
* Lazily read the value
|
|
26
|
+
*/
|
|
27
|
+
read: async (): Promise<TReturn> => {
|
|
28
|
+
if (value !== unsetMarker) {
|
|
29
|
+
return value;
|
|
41
30
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
31
|
+
if (promise === null) {
|
|
32
|
+
// dedupes promises and catches errors
|
|
33
|
+
promise = fn().catch((cause) => {
|
|
34
|
+
if (cause instanceof TRPCError) {
|
|
35
|
+
throw cause;
|
|
36
|
+
}
|
|
37
|
+
throw new TRPCError({
|
|
38
|
+
code: 'BAD_REQUEST',
|
|
39
|
+
message: cause instanceof Error ? cause.message : 'Invalid input',
|
|
40
|
+
cause,
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
value = await promise;
|
|
46
|
+
promise = null;
|
|
47
|
+
|
|
48
|
+
return value;
|
|
49
|
+
},
|
|
50
|
+
/**
|
|
51
|
+
* Get an already stored result
|
|
52
|
+
*/
|
|
53
|
+
result: (): TReturn | undefined => {
|
|
54
|
+
return value !== unsetMarker ? value : undefined;
|
|
55
|
+
},
|
|
56
|
+
};
|
|
56
57
|
}
|
|
57
58
|
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
59
|
+
const jsonContentTypeHandler: ContentTypeHandler = {
|
|
60
|
+
isMatch(req) {
|
|
61
|
+
return !!req.headers.get('content-type')?.startsWith('application/json');
|
|
62
|
+
},
|
|
63
|
+
parse(opts) {
|
|
64
|
+
const { req } = opts;
|
|
65
|
+
const isBatchCall = opts.searchParams.get('batch') === '1';
|
|
66
|
+
const paths = isBatchCall ? opts.path.split(',') : [opts.path];
|
|
66
67
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
type InputRecord = Record<number, unknown>;
|
|
69
|
+
const getInputs = memo(async (): Promise<InputRecord> => {
|
|
70
|
+
let inputs: unknown = undefined;
|
|
71
|
+
if (req.method === 'GET') {
|
|
72
|
+
const queryInput = opts.searchParams.get('input');
|
|
73
|
+
if (queryInput) {
|
|
74
|
+
inputs = JSON.parse(queryInput);
|
|
75
|
+
}
|
|
76
|
+
} else {
|
|
77
|
+
inputs = await req.json();
|
|
78
|
+
}
|
|
79
|
+
if (inputs === undefined) {
|
|
80
|
+
return {};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (!isBatchCall) {
|
|
84
|
+
return {
|
|
85
|
+
0: opts.config.transformer.input.deserialize(inputs),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (!isObject(inputs)) {
|
|
90
|
+
throw new TRPCError({
|
|
91
|
+
code: 'BAD_REQUEST',
|
|
92
|
+
message: '"input" needs to be an object when doing a batch call',
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
const acc: InputRecord = {};
|
|
96
|
+
for (const index of paths.keys()) {
|
|
97
|
+
const input = inputs[index];
|
|
98
|
+
if (input !== undefined) {
|
|
99
|
+
acc[index] = opts.config.transformer.input.deserialize(input);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return acc;
|
|
104
|
+
});
|
|
70
105
|
|
|
71
|
-
if (!opts.isBatchCall) {
|
|
72
106
|
return {
|
|
73
|
-
|
|
107
|
+
isBatchCall,
|
|
108
|
+
calls: paths.map((path, index) => ({
|
|
109
|
+
path,
|
|
110
|
+
getRawInput: async () => {
|
|
111
|
+
const inputs = await getInputs.read();
|
|
112
|
+
return inputs[index];
|
|
113
|
+
},
|
|
114
|
+
result: () => {
|
|
115
|
+
return getInputs.result()?.[index];
|
|
116
|
+
},
|
|
117
|
+
})),
|
|
74
118
|
};
|
|
75
|
-
}
|
|
119
|
+
},
|
|
120
|
+
};
|
|
76
121
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
122
|
+
const formDataContentTypeHandler: ContentTypeHandler = {
|
|
123
|
+
isMatch(req) {
|
|
124
|
+
return !!req.headers.get('content-type')?.startsWith('multipart/form-data');
|
|
125
|
+
},
|
|
126
|
+
parse(opts) {
|
|
127
|
+
const { req } = opts;
|
|
128
|
+
if (req.method !== 'POST') {
|
|
129
|
+
throw new TRPCError({
|
|
130
|
+
code: 'METHOD_NOT_SUPPORTED',
|
|
131
|
+
message:
|
|
132
|
+
'Only POST requests are supported for multipart/form-data requests',
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
const getInputs = memo(async () => {
|
|
136
|
+
const fd = await req.formData();
|
|
137
|
+
return fd;
|
|
86
138
|
});
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
139
|
+
return {
|
|
140
|
+
calls: [
|
|
141
|
+
{
|
|
142
|
+
path: opts.path,
|
|
143
|
+
getRawInput: getInputs.read,
|
|
144
|
+
result: getInputs.result,
|
|
145
|
+
},
|
|
146
|
+
],
|
|
147
|
+
isBatchCall: false,
|
|
148
|
+
};
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
const octetStreamContentTypeHandler: ContentTypeHandler = {
|
|
153
|
+
isMatch(req) {
|
|
154
|
+
return !!req.headers
|
|
155
|
+
.get('content-type')
|
|
156
|
+
?.startsWith('application/octet-stream');
|
|
157
|
+
},
|
|
158
|
+
parse(opts) {
|
|
159
|
+
const { req } = opts;
|
|
160
|
+
if (req.method !== 'POST') {
|
|
161
|
+
throw new TRPCError({
|
|
162
|
+
code: 'METHOD_NOT_SUPPORTED',
|
|
163
|
+
message:
|
|
164
|
+
'Only POST requests are supported for application/octet-stream requests',
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
const getInputs = memo(async () => {
|
|
168
|
+
return req.body;
|
|
169
|
+
});
|
|
170
|
+
return {
|
|
171
|
+
calls: [
|
|
172
|
+
{
|
|
173
|
+
path: opts.path,
|
|
174
|
+
getRawInput: getInputs.read,
|
|
175
|
+
result: getInputs.result,
|
|
176
|
+
},
|
|
177
|
+
],
|
|
178
|
+
isBatchCall: false,
|
|
179
|
+
};
|
|
180
|
+
},
|
|
181
|
+
};
|
|
92
182
|
|
|
93
|
-
|
|
183
|
+
const handlers = [
|
|
184
|
+
jsonContentTypeHandler,
|
|
185
|
+
formDataContentTypeHandler,
|
|
186
|
+
octetStreamContentTypeHandler,
|
|
187
|
+
];
|
|
94
188
|
|
|
95
|
-
|
|
189
|
+
function getContentTypeHandler(req: Request): ContentTypeHandler {
|
|
190
|
+
const handler = handlers.find((handler) => handler.isMatch(req));
|
|
191
|
+
if (handler) {
|
|
192
|
+
return handler;
|
|
96
193
|
}
|
|
97
194
|
|
|
98
|
-
|
|
99
|
-
|
|
195
|
+
if (!handler && req.method === 'GET') {
|
|
196
|
+
// fallback to JSON for get requests so GET-requests can be opened in browser easily
|
|
197
|
+
return jsonContentTypeHandler;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
throw new TRPCError({
|
|
201
|
+
code: 'UNSUPPORTED_MEDIA_TYPE',
|
|
202
|
+
message: req.headers.has('content-type')
|
|
203
|
+
? `Unsupported content-type "${req.headers.get('content-type')}`
|
|
204
|
+
: 'Missing content-type header',
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export function getRequestInfo(opts: {
|
|
209
|
+
path: string;
|
|
210
|
+
req: Request;
|
|
211
|
+
searchParams: URLSearchParams;
|
|
212
|
+
config: RootConfig<any>;
|
|
213
|
+
}): TRPCRequestInfo {
|
|
214
|
+
const handler = getContentTypeHandler(opts.req);
|
|
215
|
+
return handler.parse(opts);
|
|
216
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ParserZodEsque } from '../parser';
|
|
2
|
+
|
|
3
|
+
type UtilityParser<TInput, TOutput> = ParserZodEsque<TInput, TOutput> & {
|
|
4
|
+
parse: (input: unknown) => TOutput;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
// Should be the same possible types as packages/client/src/links/internals/contentTypes.ts isOctetType
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* File is only available from Node19+ but it always extends Blob so we can use that as a type until we eventually drop Node18
|
|
11
|
+
*/
|
|
12
|
+
interface FileLike extends Blob {
|
|
13
|
+
readonly name: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
type OctetInput = Blob | Uint8Array | FileLike;
|
|
17
|
+
export const octetInputParser: UtilityParser<OctetInput, ReadableStream> = {
|
|
18
|
+
_input: null as any as OctetInput,
|
|
19
|
+
_output: null as any as ReadableStream,
|
|
20
|
+
parse(input) {
|
|
21
|
+
if (input instanceof ReadableStream) {
|
|
22
|
+
return input;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
throw new Error(
|
|
26
|
+
`Parsed input was expected to be a ReadableStream but was: ${typeof input}`,
|
|
27
|
+
);
|
|
28
|
+
},
|
|
29
|
+
};
|
|
@@ -29,9 +29,9 @@ function getStatusCodeFromKey(code: keyof typeof TRPC_ERROR_CODES_BY_KEY) {
|
|
|
29
29
|
return JSONRPC2_TO_HTTP_CODE[code] ?? 500;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
export function getHTTPStatusCode(json: TRPCResponse | TRPCResponse[]) {
|
|
32
|
+
export function getHTTPStatusCode(json: TRPCResponse | TRPCResponse[]): number {
|
|
33
33
|
const arr = Array.isArray(json) ? json : [json];
|
|
34
|
-
const httpStatuses = new Set(
|
|
34
|
+
const httpStatuses = new Set<number>(
|
|
35
35
|
arr.map((res) => {
|
|
36
36
|
if ('error' in res) {
|
|
37
37
|
const data = res.error.data as
|