@trpc/server 10.0.0-alpha.5 → 10.0.0-alpha.9

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 (48) hide show
  1. package/adapters/express/dist/trpc-server-adapters-express.cjs.dev.js +2 -1
  2. package/adapters/express/dist/trpc-server-adapters-express.cjs.prod.js +2 -1
  3. package/adapters/express/dist/trpc-server-adapters-express.esm.js +2 -1
  4. package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.d.ts +1 -0
  5. package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.dev.js +102 -0
  6. package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.js +7 -0
  7. package/adapters/fastify/dist/trpc-server-adapters-fastify.cjs.prod.js +102 -0
  8. package/adapters/fastify/dist/trpc-server-adapters-fastify.esm.js +97 -0
  9. package/adapters/fastify/index.d.ts +1 -0
  10. package/adapters/fastify/index.js +1 -0
  11. package/adapters/next/dist/trpc-server-adapters-next.cjs.dev.js +2 -1
  12. package/adapters/next/dist/trpc-server-adapters-next.cjs.prod.js +2 -1
  13. package/adapters/next/dist/trpc-server-adapters-next.esm.js +2 -1
  14. package/adapters/node-http/dist/trpc-server-adapters-node-http.cjs.dev.js +2 -1
  15. package/adapters/node-http/dist/trpc-server-adapters-node-http.cjs.prod.js +2 -1
  16. package/adapters/node-http/dist/trpc-server-adapters-node-http.esm.js +2 -1
  17. package/adapters/standalone/dist/trpc-server-adapters-standalone.cjs.dev.js +2 -1
  18. package/adapters/standalone/dist/trpc-server-adapters-standalone.cjs.prod.js +2 -1
  19. package/adapters/standalone/dist/trpc-server-adapters-standalone.esm.js +2 -1
  20. package/dist/adapters/express.js +3 -2
  21. package/dist/adapters/express.mjs +3 -2
  22. package/dist/adapters/fastify/fastifyRequestHandler.d.ts +13 -0
  23. package/dist/adapters/fastify/fastifyRequestHandler.d.ts.map +1 -0
  24. package/dist/adapters/fastify/fastifyTRPCPlugin.d.ts +12 -0
  25. package/dist/adapters/fastify/fastifyTRPCPlugin.d.ts.map +1 -0
  26. package/dist/adapters/fastify/index.d.ts +3 -0
  27. package/dist/adapters/fastify/index.d.ts.map +1 -0
  28. package/dist/adapters/fastify/index.js +102 -0
  29. package/dist/adapters/fastify/index.mjs +97 -0
  30. package/dist/adapters/fastify/index.ts.js +1 -0
  31. package/dist/adapters/next.js +2 -1
  32. package/dist/adapters/next.mjs +2 -1
  33. package/dist/adapters/node-http/index.js +2 -1
  34. package/dist/adapters/node-http/index.mjs +2 -1
  35. package/dist/adapters/standalone.js +3 -2
  36. package/dist/adapters/standalone.mjs +3 -2
  37. package/dist/index.js +9 -8
  38. package/dist/index.mjs +4 -3
  39. package/dist/nodeHTTPRequestHandler-17a5e0dd.mjs +106 -0
  40. package/dist/nodeHTTPRequestHandler-17b64c0e.js +108 -0
  41. package/dist/{nodeHTTPRequestHandler-d7c307d3.js → resolveHTTPResponse-087ce86a.js} +0 -103
  42. package/dist/{nodeHTTPRequestHandler-10e6d2f9.mjs → resolveHTTPResponse-9604d47d.mjs} +1 -103
  43. package/package.json +12 -3
  44. package/src/adapters/express.ts +1 -1
  45. package/src/adapters/fastify/fastifyRequestHandler.ts +79 -0
  46. package/src/adapters/fastify/fastifyTRPCPlugin.ts +48 -0
  47. package/src/adapters/fastify/index.ts +2 -0
  48. package/src/adapters/standalone.ts +1 -1
@@ -1,4 +1,3 @@
1
- import { URLSearchParams } from 'url';
2
1
  import { T as TRPCError, c as callProcedure, g as getErrorFromUnknown, t as transformTRPCResponse } from './transformTRPCResponse-76e0c91e.mjs';
3
2
  import { i as invert, T as TRPC_ERROR_CODES_BY_KEY } from './codes-7a3d4f65.mjs';
4
3
 
@@ -290,105 +289,4 @@ async function resolveHTTPResponse(opts) {
290
289
  }
291
290
  }
292
291
 
293
- async function getPostBody({
294
- req,
295
- maxBodySize
296
- }) {
297
- return new Promise(resolve => {
298
- if ('body' in req) {
299
- resolve({
300
- ok: true,
301
- data: req.body
302
- });
303
- return;
304
- }
305
-
306
- let body = '';
307
- let hasBody = false;
308
- req.on('data', function (data) {
309
- body += data;
310
- hasBody = true;
311
-
312
- if (typeof maxBodySize === 'number' && body.length > maxBodySize) {
313
- resolve({
314
- ok: false,
315
- error: new TRPCError({
316
- code: 'PAYLOAD_TOO_LARGE'
317
- })
318
- });
319
- req.socket.destroy();
320
- }
321
- });
322
- req.on('end', () => {
323
- resolve({
324
- ok: true,
325
- data: hasBody ? body : undefined
326
- });
327
- });
328
- });
329
- }
330
-
331
- /* eslint-disable @typescript-eslint/no-non-null-assertion */
332
- assertNotBrowser();
333
- async function nodeHTTPRequestHandler(opts) {
334
- var _opts$teardown;
335
-
336
- const createContext = async function _createContext() {
337
- var _opts$createContext;
338
-
339
- return await ((_opts$createContext = opts.createContext) === null || _opts$createContext === void 0 ? void 0 : _opts$createContext.call(opts, opts));
340
- };
341
-
342
- const {
343
- path,
344
- router
345
- } = opts;
346
- const bodyResult = await getPostBody(opts);
347
- const query = opts.req.query ? new URLSearchParams(opts.req.query) : new URLSearchParams(opts.req.url.split('?')[1]);
348
- const req = {
349
- method: opts.req.method,
350
- headers: opts.req.headers,
351
- query,
352
- body: bodyResult.ok ? bodyResult.data : undefined
353
- };
354
- const result = await resolveHTTPResponse({
355
- batching: opts.batching,
356
- responseMeta: opts.responseMeta,
357
- path,
358
- createContext,
359
- router,
360
- req,
361
- error: bodyResult.ok ? null : bodyResult.error,
362
-
363
- onError(o) {
364
- var _opts$onError;
365
-
366
- opts === null || opts === void 0 ? void 0 : (_opts$onError = opts.onError) === null || _opts$onError === void 0 ? void 0 : _opts$onError.call(opts, { ...o,
367
- req: opts.req
368
- });
369
- }
370
-
371
- });
372
- const {
373
- res
374
- } = opts;
375
-
376
- if ('status' in result && (!res.statusCode || res.statusCode === 200)) {
377
- res.statusCode = result.status;
378
- }
379
-
380
- for (const [key, value] of Object.entries((_result$headers = result.headers) !== null && _result$headers !== void 0 ? _result$headers : {})) {
381
- var _result$headers;
382
-
383
- if (typeof value === 'undefined') {
384
- continue;
385
- }
386
-
387
- res.setHeader(key, value);
388
- }
389
-
390
- res.end(result.body);
391
- await ((_opts$teardown = opts.teardown) === null || _opts$teardown === void 0 ? void 0 : _opts$teardown.call(opts));
392
- }
393
-
394
- export { assertNotBrowser as a, getHTTPStatusCodeFromError as g, nodeHTTPRequestHandler as n, resolveHTTPResponse as r };
292
+ export { assertNotBrowser as a, getHTTPStatusCodeFromError as g, resolveHTTPResponse as r };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trpc/server",
3
- "version": "10.0.0-alpha.5",
3
+ "version": "10.0.0-alpha.9",
4
4
  "description": "tRPC Server",
5
5
  "author": "KATT",
6
6
  "license": "MIT",
@@ -48,6 +48,11 @@
48
48
  "require": "./dist/adapters/standalone.js",
49
49
  "default": "./dist/adapters/standalone.js"
50
50
  },
51
+ "./adapters/fastify": {
52
+ "import": "./dist/adapters/fastify/index.mjs",
53
+ "require": "./dist/adapters/fastify/index.js",
54
+ "default": "./dist/adapters/fastify/index.js"
55
+ },
51
56
  "./adapters/ws": {
52
57
  "import": "./dist/adapters/ws.mjs",
53
58
  "require": "./dist/adapters/ws.js",
@@ -82,21 +87,25 @@
82
87
  "@types/express": "^4.17.12",
83
88
  "@types/hash-sum": "^1.0.0",
84
89
  "@types/ws": "^8.2.0",
90
+ "abort-controller": "^3.0.0",
85
91
  "devalue": "^2.0.1",
86
92
  "express": "^4.17.1",
87
- "fastify": "^3.17.0",
93
+ "fastify": "^3.27.1",
94
+ "fastify-plugin": "^3.0.1",
95
+ "fastify-websocket": "^4.0.0",
88
96
  "hash-sum": "^2.0.0",
89
97
  "jest": "^27.1.0",
90
98
  "konn": "^0.7.0",
91
99
  "myzod": "^1.3.1",
92
100
  "next": "^12.0.1",
101
+ "node-fetch": "^2.6.1",
93
102
  "superstruct": "^0.15.2",
94
103
  "typescript": "4.4.4",
95
104
  "ws": "^8.0.0",
96
105
  "yup": "^0.32.8",
97
106
  "zod": "^3.0.0"
98
107
  },
99
- "gitHead": "0e6a2445f0678e4886dee4896a70c2639fa6b55e",
108
+ "gitHead": "4d4ac63ab25a2b684ac61e905f9067aa201f8b0c",
100
109
  "dependencies": {
101
110
  "tslib": "^2.1.0"
102
111
  }
@@ -16,7 +16,7 @@ export function createExpressMiddleware<TRouter extends AnyRouter>(
16
16
  opts: NodeHTTPHandlerOptions<TRouter, express.Request, express.Response>,
17
17
  ): express.Handler {
18
18
  return (req, res) => {
19
- const endpoint = req.path.substr(1);
19
+ const endpoint = req.path.slice(1);
20
20
 
21
21
  nodeHTTPRequestHandler({
22
22
  ...opts,
@@ -0,0 +1,79 @@
1
+ import { URLSearchParams } from 'url';
2
+ import { FastifyReply, FastifyRequest } from 'fastify';
3
+ import { assertNotBrowser } from '../../assertNotBrowser';
4
+ import { NodeHTTPCreateContextOption } from '../node-http';
5
+ import { AnyRouter, inferRouterContext } from '../../router';
6
+ import { resolveHTTPResponse } from '../../http/resolveHTTPResponse';
7
+ import {
8
+ HTTPBaseHandlerOptions,
9
+ HTTPRequest,
10
+ } from '../../http/internals/types';
11
+
12
+ assertNotBrowser();
13
+
14
+ export type FastifyHandlerOptions<
15
+ TRouter extends AnyRouter,
16
+ TRequest extends FastifyRequest,
17
+ TResponse extends FastifyReply,
18
+ > = HTTPBaseHandlerOptions<TRouter, TRequest> &
19
+ NodeHTTPCreateContextOption<TRouter, TRequest, TResponse>;
20
+
21
+ type FastifyRequestHandlerOptions<
22
+ TRouter extends AnyRouter,
23
+ TRequest extends FastifyRequest,
24
+ TResponse extends FastifyReply,
25
+ > = {
26
+ req: TRequest;
27
+ res: TResponse;
28
+ path: string;
29
+ } & FastifyHandlerOptions<TRouter, TRequest, TResponse>;
30
+
31
+ export async function fastifyRequestHandler<
32
+ TRouter extends AnyRouter,
33
+ TRequest extends FastifyRequest,
34
+ TResponse extends FastifyReply,
35
+ >(opts: FastifyRequestHandlerOptions<TRouter, TRequest, TResponse>) {
36
+ const createContext = async function _createContext(): Promise<
37
+ inferRouterContext<TRouter>
38
+ > {
39
+ return opts.createContext?.(opts);
40
+ };
41
+
42
+ const query = opts.req.query
43
+ ? new URLSearchParams(opts.req.query as any)
44
+ : new URLSearchParams(opts.req.url.split('?')[1]);
45
+
46
+ const req: HTTPRequest = {
47
+ query,
48
+ method: opts.req.method,
49
+ headers: opts.req.headers,
50
+ body: opts.req.body ?? 'null',
51
+ };
52
+
53
+ const result = await resolveHTTPResponse({
54
+ req,
55
+ createContext,
56
+ path: opts.path,
57
+ router: opts.router,
58
+ batching: opts.batching,
59
+ responseMeta: opts.responseMeta,
60
+ onError(o) {
61
+ opts?.onError?.({ ...o, req: opts.req });
62
+ },
63
+ });
64
+
65
+ const { res } = opts;
66
+
67
+ if ('status' in result && (!res.statusCode || res.statusCode === 200)) {
68
+ res.statusCode = result.status;
69
+ }
70
+
71
+ for (const [key, value] of Object.entries(result.headers ?? {})) {
72
+ if (typeof value === 'undefined') {
73
+ continue;
74
+ }
75
+ res.header(key, value);
76
+ }
77
+
78
+ res.send(result.body);
79
+ }
@@ -0,0 +1,48 @@
1
+ /// <reference types="fastify-websocket" />
2
+ import { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify';
3
+ import { fastifyRequestHandler } from './fastifyRequestHandler';
4
+ import { NodeHTTPCreateContextFnOptions } from '../node-http';
5
+ import { applyWSSHandler, WSSHandlerOptions } from '../ws';
6
+ import { FastifyHandlerOptions } from '.';
7
+ import { AnyRouter } from '../..';
8
+
9
+ export interface FastifyTRPCPluginOptions<TRouter extends AnyRouter> {
10
+ prefix?: string;
11
+ useWSS?: boolean;
12
+ trpcOptions: FastifyHandlerOptions<TRouter, FastifyRequest, FastifyReply>;
13
+ }
14
+
15
+ export type CreateFastifyContextOptions = NodeHTTPCreateContextFnOptions<
16
+ FastifyRequest,
17
+ FastifyReply
18
+ >;
19
+
20
+ export function fastifyTRPCPlugin<TRouter extends AnyRouter>(
21
+ fastify: FastifyInstance,
22
+ opts: FastifyTRPCPluginOptions<TRouter>,
23
+ done: (err?: Error) => void,
24
+ ) {
25
+ fastify.addContentTypeParser(
26
+ 'application/json',
27
+ { parseAs: 'string' },
28
+ function (_, body, _done) {
29
+ _done(null, body);
30
+ },
31
+ );
32
+
33
+ fastify.all(`${opts.prefix ?? ''}/:path`, (req, res) => {
34
+ const path = (req.params as any).path;
35
+ fastifyRequestHandler({ ...opts.trpcOptions, req, res, path });
36
+ });
37
+
38
+ if (opts.useWSS) {
39
+ applyWSSHandler<TRouter>({
40
+ ...(opts.trpcOptions as WSSHandlerOptions<TRouter>),
41
+ wss: fastify.websocketServer,
42
+ });
43
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
44
+ fastify.get(opts.prefix ?? '/', { websocket: true }, () => {});
45
+ }
46
+
47
+ done();
48
+ }
@@ -0,0 +1,2 @@
1
+ export * from './fastifyRequestHandler';
2
+ export * from './fastifyTRPCPlugin';
@@ -21,7 +21,7 @@ export function createHTTPHandler<TRouter extends AnyRouter>(
21
21
  opts: CreateHTTPHandlerOptions<TRouter>,
22
22
  ) {
23
23
  return async (req: http.IncomingMessage, res: http.ServerResponse) => {
24
- const endpoint = url.parse(req.url!).pathname!.substr(1);
24
+ const endpoint = url.parse(req.url!).pathname!.slice(1);
25
25
  await nodeHTTPRequestHandler({
26
26
  ...opts,
27
27
  req,