@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.
Files changed (168) hide show
  1. package/dist/@trpc/server/http.d.ts +7 -6
  2. package/dist/@trpc/server/http.d.ts.map +1 -1
  3. package/dist/@trpc/server/index.d.ts +1 -1
  4. package/dist/@trpc/server/index.d.ts.map +1 -1
  5. package/dist/adapters/aws-lambda/getPlanner.d.ts +13 -0
  6. package/dist/adapters/aws-lambda/getPlanner.d.ts.map +1 -0
  7. package/dist/adapters/aws-lambda/getPlanner.js +143 -0
  8. package/dist/adapters/aws-lambda/getPlanner.mjs +141 -0
  9. package/dist/adapters/aws-lambda/index.d.ts +12 -9
  10. package/dist/adapters/aws-lambda/index.d.ts.map +1 -1
  11. package/dist/adapters/aws-lambda/index.js +6 -65
  12. package/dist/adapters/aws-lambda/index.mjs +8 -61
  13. package/dist/adapters/express.d.ts.map +1 -1
  14. package/dist/adapters/express.js +1 -1
  15. package/dist/adapters/express.mjs +1 -1
  16. package/dist/adapters/fastify/fastifyRequestHandler.d.ts +10 -1
  17. package/dist/adapters/fastify/fastifyRequestHandler.d.ts.map +1 -1
  18. package/dist/adapters/fastify/fastifyRequestHandler.js +12 -55
  19. package/dist/adapters/fastify/fastifyRequestHandler.mjs +13 -56
  20. package/dist/adapters/fastify/fastifyTRPCPlugin.d.ts +1 -1
  21. package/dist/adapters/fastify/fastifyTRPCPlugin.d.ts.map +1 -1
  22. package/dist/adapters/fetch/fetchRequestHandler.d.ts +1 -5
  23. package/dist/adapters/fetch/fetchRequestHandler.d.ts.map +1 -1
  24. package/dist/adapters/fetch/fetchRequestHandler.js +28 -71
  25. package/dist/adapters/fetch/fetchRequestHandler.mjs +29 -72
  26. package/dist/adapters/fetch/types.d.ts +9 -12
  27. package/dist/adapters/fetch/types.d.ts.map +1 -1
  28. package/dist/adapters/next-app-dir/nextAppDirCaller.d.ts +2 -7
  29. package/dist/adapters/next-app-dir/nextAppDirCaller.d.ts.map +1 -1
  30. package/dist/adapters/next.d.ts.map +1 -1
  31. package/dist/adapters/next.js +1 -2
  32. package/dist/adapters/next.mjs +1 -2
  33. package/dist/adapters/node-http/incomingMessageToRequest.d.ts +18 -0
  34. package/dist/adapters/node-http/incomingMessageToRequest.d.ts.map +1 -0
  35. package/dist/adapters/node-http/incomingMessageToRequest.js +71 -0
  36. package/dist/adapters/node-http/incomingMessageToRequest.mjs +69 -0
  37. package/dist/adapters/node-http/index.d.ts +1 -0
  38. package/dist/adapters/node-http/index.d.ts.map +1 -1
  39. package/dist/adapters/node-http/index.js +2 -0
  40. package/dist/adapters/node-http/index.mjs +1 -0
  41. package/dist/adapters/node-http/nodeHTTPRequestHandler.d.ts +1 -1
  42. package/dist/adapters/node-http/nodeHTTPRequestHandler.d.ts.map +1 -1
  43. package/dist/adapters/node-http/nodeHTTPRequestHandler.js +27 -72
  44. package/dist/adapters/node-http/nodeHTTPRequestHandler.mjs +28 -73
  45. package/dist/adapters/node-http/types.d.ts +2 -14
  46. package/dist/adapters/node-http/types.d.ts.map +1 -1
  47. package/dist/adapters/standalone.d.ts.map +1 -1
  48. package/dist/adapters/standalone.js +0 -1
  49. package/dist/adapters/standalone.mjs +0 -1
  50. package/dist/adapters/ws.d.ts +2 -12
  51. package/dist/adapters/ws.d.ts.map +1 -1
  52. package/dist/adapters/ws.js +1 -1
  53. package/dist/adapters/ws.mjs +1 -1
  54. package/dist/bundle-analysis.json +173 -259
  55. package/dist/http.js +4 -4
  56. package/dist/http.mjs +2 -2
  57. package/dist/index.js +2 -2
  58. package/dist/index.mjs +1 -1
  59. package/dist/unstable-core-do-not-import/http/contentType.d.ts +8 -28
  60. package/dist/unstable-core-do-not-import/http/contentType.d.ts.map +1 -1
  61. package/dist/unstable-core-do-not-import/http/contentType.js +164 -38
  62. package/dist/unstable-core-do-not-import/http/contentType.mjs +164 -38
  63. package/dist/unstable-core-do-not-import/http/contentTypeParsers.d.ts +14 -0
  64. package/dist/unstable-core-do-not-import/http/contentTypeParsers.d.ts.map +1 -0
  65. package/dist/unstable-core-do-not-import/http/contentTypeParsers.js +14 -0
  66. package/dist/unstable-core-do-not-import/http/contentTypeParsers.mjs +12 -0
  67. package/dist/unstable-core-do-not-import/http/getHTTPStatusCode.d.ts +1 -1
  68. package/dist/unstable-core-do-not-import/http/getHTTPStatusCode.d.ts.map +1 -1
  69. package/dist/unstable-core-do-not-import/http/resolveHTTPResponse.d.ts +7 -43
  70. package/dist/unstable-core-do-not-import/http/resolveHTTPResponse.d.ts.map +1 -1
  71. package/dist/unstable-core-do-not-import/http/resolveHTTPResponse.js +115 -124
  72. package/dist/unstable-core-do-not-import/http/resolveHTTPResponse.mjs +116 -125
  73. package/dist/unstable-core-do-not-import/http/types.d.ts +25 -29
  74. package/dist/unstable-core-do-not-import/http/types.d.ts.map +1 -1
  75. package/dist/unstable-core-do-not-import/initTRPC.d.ts +1 -1
  76. package/dist/unstable-core-do-not-import/procedureBuilder.d.ts +1 -3
  77. package/dist/unstable-core-do-not-import/procedureBuilder.d.ts.map +1 -1
  78. package/dist/unstable-core-do-not-import/procedureBuilder.js +0 -2
  79. package/dist/unstable-core-do-not-import/procedureBuilder.mjs +1 -2
  80. package/dist/unstable-core-do-not-import/rootConfig.d.ts +12 -0
  81. package/dist/unstable-core-do-not-import/rootConfig.d.ts.map +1 -1
  82. package/dist/unstable-core-do-not-import/utils.d.ts +3 -0
  83. package/dist/unstable-core-do-not-import/utils.d.ts.map +1 -1
  84. package/dist/unstable-core-do-not-import/utils.js +2 -0
  85. package/dist/unstable-core-do-not-import/utils.mjs +2 -1
  86. package/dist/unstable-core-do-not-import.d.ts +9 -3
  87. package/dist/unstable-core-do-not-import.d.ts.map +1 -1
  88. package/dist/unstable-core-do-not-import.js +11 -9
  89. package/dist/unstable-core-do-not-import.mjs +7 -6
  90. package/package.json +3 -14
  91. package/src/@trpc/server/http.ts +7 -13
  92. package/src/@trpc/server/index.ts +1 -0
  93. package/src/adapters/aws-lambda/getPlanner.ts +191 -0
  94. package/src/adapters/aws-lambda/index.ts +43 -92
  95. package/src/adapters/express.ts +1 -6
  96. package/src/adapters/fastify/fastifyRequestHandler.ts +22 -77
  97. package/src/adapters/fastify/fastifyTRPCPlugin.ts +1 -1
  98. package/src/adapters/fetch/fetchRequestHandler.ts +34 -98
  99. package/src/adapters/fetch/types.ts +24 -15
  100. package/src/adapters/next-app-dir/nextAppDirCaller.ts +2 -9
  101. package/src/adapters/next.ts +1 -6
  102. package/src/adapters/node-http/incomingMessageToRequest.ts +94 -0
  103. package/src/adapters/node-http/index.ts +1 -0
  104. package/src/adapters/node-http/nodeHTTPRequestHandler.ts +31 -110
  105. package/src/adapters/node-http/types.ts +9 -19
  106. package/src/adapters/standalone.ts +1 -2
  107. package/src/adapters/ws.ts +9 -14
  108. package/src/unstable-core-do-not-import/http/contentType.ts +199 -82
  109. package/src/unstable-core-do-not-import/http/contentTypeParsers.ts +29 -0
  110. package/src/unstable-core-do-not-import/http/getHTTPStatusCode.ts +2 -2
  111. package/src/unstable-core-do-not-import/http/resolveHTTPResponse.ts +133 -205
  112. package/src/unstable-core-do-not-import/http/types.ts +25 -32
  113. package/src/unstable-core-do-not-import/procedureBuilder.ts +2 -4
  114. package/src/unstable-core-do-not-import/rootConfig.ts +21 -0
  115. package/src/unstable-core-do-not-import/utils.ts +4 -0
  116. package/src/unstable-core-do-not-import.ts +9 -3
  117. package/adapters/node-http/content-type/form-data/index.d.ts +0 -1
  118. package/adapters/node-http/content-type/form-data/index.js +0 -1
  119. package/adapters/node-http/content-type/json/index.d.ts +0 -1
  120. package/adapters/node-http/content-type/json/index.js +0 -1
  121. package/dist/adapters/aws-lambda/utils.d.ts +0 -40
  122. package/dist/adapters/aws-lambda/utils.d.ts.map +0 -1
  123. package/dist/adapters/aws-lambda/utils.js +0 -100
  124. package/dist/adapters/aws-lambda/utils.mjs +0 -93
  125. package/dist/adapters/node-http/content-type/form-data/fileUploadHandler.d.ts +0 -73
  126. package/dist/adapters/node-http/content-type/form-data/fileUploadHandler.d.ts.map +0 -1
  127. package/dist/adapters/node-http/content-type/form-data/fileUploadHandler.js +0 -161
  128. package/dist/adapters/node-http/content-type/form-data/fileUploadHandler.mjs +0 -157
  129. package/dist/adapters/node-http/content-type/form-data/index.d.ts +0 -26
  130. package/dist/adapters/node-http/content-type/form-data/index.d.ts.map +0 -1
  131. package/dist/adapters/node-http/content-type/form-data/index.js +0 -135
  132. package/dist/adapters/node-http/content-type/form-data/index.mjs +0 -108
  133. package/dist/adapters/node-http/content-type/form-data/memoryUploadHandler.d.ts +0 -31
  134. package/dist/adapters/node-http/content-type/form-data/memoryUploadHandler.d.ts.map +0 -1
  135. package/dist/adapters/node-http/content-type/form-data/memoryUploadHandler.js +0 -29
  136. package/dist/adapters/node-http/content-type/form-data/memoryUploadHandler.mjs +0 -27
  137. package/dist/adapters/node-http/content-type/form-data/streamSlice.d.ts +0 -16
  138. package/dist/adapters/node-http/content-type/form-data/streamSlice.d.ts.map +0 -1
  139. package/dist/adapters/node-http/content-type/form-data/streamSlice.js +0 -46
  140. package/dist/adapters/node-http/content-type/form-data/streamSlice.mjs +0 -44
  141. package/dist/adapters/node-http/content-type/form-data/uploadHandler.d.ts +0 -45
  142. package/dist/adapters/node-http/content-type/form-data/uploadHandler.d.ts.map +0 -1
  143. package/dist/adapters/node-http/content-type/form-data/uploadHandler.js +0 -30
  144. package/dist/adapters/node-http/content-type/form-data/uploadHandler.mjs +0 -26
  145. package/dist/adapters/node-http/content-type/json/getPostBody.d.ts +0 -7
  146. package/dist/adapters/node-http/content-type/json/getPostBody.d.ts.map +0 -1
  147. package/dist/adapters/node-http/content-type/json/getPostBody.js +0 -53
  148. package/dist/adapters/node-http/content-type/json/getPostBody.mjs +0 -51
  149. package/dist/adapters/node-http/content-type/json/index.d.ts +0 -2
  150. package/dist/adapters/node-http/content-type/json/index.d.ts.map +0 -1
  151. package/dist/adapters/node-http/content-type/json/index.js +0 -16
  152. package/dist/adapters/node-http/content-type/json/index.mjs +0 -14
  153. package/dist/adapters/node-http/internals/contentType.d.ts +0 -9
  154. package/dist/adapters/node-http/internals/contentType.d.ts.map +0 -1
  155. package/dist/adapters/node-http/internals/contentType.js +0 -8
  156. package/dist/adapters/node-http/internals/contentType.mjs +0 -6
  157. package/dist/unstable-core-do-not-import/http/index.d.ts +0 -12
  158. package/dist/unstable-core-do-not-import/http/index.d.ts.map +0 -1
  159. package/src/adapters/aws-lambda/utils.ts +0 -164
  160. package/src/adapters/node-http/content-type/form-data/fileUploadHandler.ts +0 -277
  161. package/src/adapters/node-http/content-type/form-data/index.ts +0 -163
  162. package/src/adapters/node-http/content-type/form-data/memoryUploadHandler.ts +0 -56
  163. package/src/adapters/node-http/content-type/form-data/streamSlice.ts +0 -56
  164. package/src/adapters/node-http/content-type/form-data/uploadHandler.ts +0 -89
  165. package/src/adapters/node-http/content-type/json/getPostBody.ts +0 -58
  166. package/src/adapters/node-http/content-type/json/index.ts +0 -11
  167. package/src/adapters/node-http/internals/contentType.ts +0 -31
  168. 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 { AnyRouter } from '../router';
4
- import type { CombinedDataTransformer } from '../transformer';
5
- import type { MaybePromise } from '../types';
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
- export type BaseContentTypeHandler<TOptions> = {
27
- isMatch(opts: TOptions): boolean;
28
- getBody: (opts: TOptions) => MaybePromise<BodyResult>;
29
- getInputs: GetInputs;
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
- function getRawProcedureInputOrThrow(opts: {
33
- req: HTTPRequest;
34
- preprocessedBody: boolean;
35
- }) {
36
- const { req } = opts;
37
- try {
38
- if (req.method === 'GET') {
39
- if (!req.query.has('input')) {
40
- return undefined;
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
- const raw = req.query.get('input');
43
- return JSON.parse(raw!);
44
- }
45
- if (!opts.preprocessedBody && typeof req.body === 'string') {
46
- // A mutation with no inputs will have req.body === ''
47
- return req.body.length === 0 ? undefined : JSON.parse(req.body);
48
- }
49
- return req.body;
50
- } catch (cause) {
51
- throw new TRPCError({
52
- code: 'PARSE_ERROR',
53
- cause,
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 deserializeInputValue = (
59
- rawValue: unknown,
60
- transformer: CombinedDataTransformer,
61
- ) => {
62
- return typeof rawValue !== 'undefined'
63
- ? transformer.input.deserialize(rawValue)
64
- : rawValue;
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
- export const getJsonContentTypeInputs: GetInputs = (opts) => {
68
- const rawInput = getRawProcedureInputOrThrow(opts);
69
- const transformer = opts.router._def._config.transformer;
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
- 0: deserializeInputValue(rawInput, transformer),
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
- /* istanbul ignore if */
78
- if (
79
- rawInput == null ||
80
- typeof rawInput !== 'object' ||
81
- Array.isArray(rawInput)
82
- ) {
83
- throw new TRPCError({
84
- code: 'BAD_REQUEST',
85
- message: '"input" needs to be an object when doing a batch call',
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
- const input: Record<number, unknown> = {};
89
- for (const key in rawInput) {
90
- const k = key as any as number;
91
- const rawValue = rawInput[k];
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
- const value = deserializeInputValue(rawValue, transformer);
183
+ const handlers = [
184
+ jsonContentTypeHandler,
185
+ formDataContentTypeHandler,
186
+ octetStreamContentTypeHandler,
187
+ ];
94
188
 
95
- input[k] = value;
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
- return input;
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