@trpc/server 10.28.1 → 10.29.0

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 (97) hide show
  1. package/dist/adapters/aws-lambda/index.d.ts +1 -1
  2. package/dist/adapters/aws-lambda/index.d.ts.map +1 -1
  3. package/dist/adapters/aws-lambda/index.js +1 -1
  4. package/dist/adapters/aws-lambda/index.mjs +1 -1
  5. package/dist/adapters/aws-lambda/utils.d.ts +1 -1
  6. package/dist/adapters/aws-lambda/utils.d.ts.map +1 -1
  7. package/dist/adapters/express.d.ts.map +1 -1
  8. package/dist/adapters/express.js +5 -4
  9. package/dist/adapters/express.mjs +5 -4
  10. package/dist/adapters/fastify/fastifyRequestHandler.d.ts +1 -1
  11. package/dist/adapters/fastify/fastifyRequestHandler.d.ts.map +1 -1
  12. package/dist/adapters/fastify/index.js +50 -15
  13. package/dist/adapters/fastify/index.mjs +50 -15
  14. package/dist/adapters/fetch/fetchRequestHandler.d.ts.map +1 -1
  15. package/dist/adapters/fetch/index.js +66 -20
  16. package/dist/adapters/fetch/index.mjs +66 -20
  17. package/dist/adapters/lambda/index.d.ts +1 -1
  18. package/dist/adapters/lambda/index.d.ts.map +1 -1
  19. package/dist/adapters/next.d.ts.map +1 -1
  20. package/dist/adapters/next.js +3 -2
  21. package/dist/adapters/next.mjs +3 -2
  22. package/dist/adapters/node-http/content-type/form-data/index.js +19 -46
  23. package/dist/adapters/node-http/content-type/form-data/index.mjs +19 -40
  24. package/dist/adapters/node-http/content-type/form-data/streamSlice.d.ts +7 -3
  25. package/dist/adapters/node-http/content-type/form-data/streamSlice.d.ts.map +1 -1
  26. package/dist/adapters/node-http/index.js +5 -4
  27. package/dist/adapters/node-http/index.mjs +5 -4
  28. package/dist/adapters/node-http/nodeHTTPRequestHandler.d.ts.map +1 -1
  29. package/dist/adapters/standalone.js +5 -4
  30. package/dist/adapters/standalone.mjs +5 -4
  31. package/dist/batchStreamFormatter-2c1405a1.js +31 -0
  32. package/dist/batchStreamFormatter-93cdcdd4.js +32 -0
  33. package/dist/batchStreamFormatter-fc1ffb26.mjs +30 -0
  34. package/dist/core/initTRPC.d.ts.map +1 -1
  35. package/dist/core/internals/mergeRouters.d.ts.map +1 -1
  36. package/dist/core/internals/procedureBuilder.d.ts +1 -1
  37. package/dist/core/internals/procedureBuilder.d.ts.map +1 -1
  38. package/dist/core/router.d.ts +1 -1
  39. package/dist/core/router.d.ts.map +1 -1
  40. package/dist/deprecated/interop.d.ts.map +1 -1
  41. package/dist/deprecated/router.d.ts +3 -3
  42. package/dist/deprecated/router.d.ts.map +1 -1
  43. package/dist/error/formatter.d.ts +1 -1
  44. package/dist/error/formatter.d.ts.map +1 -1
  45. package/dist/http/batchStreamFormatter.d.ts +24 -0
  46. package/dist/http/batchStreamFormatter.d.ts.map +1 -0
  47. package/dist/http/getHTTPStatusCode.d.ts +1 -1
  48. package/dist/http/getHTTPStatusCode.d.ts.map +1 -1
  49. package/dist/http/index.d.ts +1 -0
  50. package/dist/http/index.d.ts.map +1 -1
  51. package/dist/http/index.js +3 -1
  52. package/dist/http/index.mjs +2 -1
  53. package/dist/http/internals/types.d.ts +8 -1
  54. package/dist/http/internals/types.d.ts.map +1 -1
  55. package/dist/http/resolveHTTPResponse.d.ts +36 -2
  56. package/dist/http/resolveHTTPResponse.d.ts.map +1 -1
  57. package/dist/internals/types.d.ts +1 -1
  58. package/dist/internals/types.d.ts.map +1 -1
  59. package/dist/{nodeHTTPRequestHandler-bd47641d.js → nodeHTTPRequestHandler-53b9fc2d.js} +44 -12
  60. package/dist/{nodeHTTPRequestHandler-0f979796.mjs → nodeHTTPRequestHandler-bdad2781.mjs} +42 -13
  61. package/dist/{nodeHTTPRequestHandler-5bbf93f1.js → nodeHTTPRequestHandler-e637755a.js} +42 -13
  62. package/dist/resolveHTTPResponse-2bdf2cd7.js +256 -0
  63. package/dist/resolveHTTPResponse-2c307e04.js +284 -0
  64. package/dist/resolveHTTPResponse-a9be3d96.mjs +282 -0
  65. package/dist/subscription.d.ts.map +1 -1
  66. package/package.json +4 -4
  67. package/src/adapters/aws-lambda/index.ts +2 -2
  68. package/src/adapters/aws-lambda/utils.ts +1 -1
  69. package/src/adapters/express.ts +1 -1
  70. package/src/adapters/fastify/fastifyRequestHandler.ts +64 -17
  71. package/src/adapters/fastify/fastifyTRPCPlugin.ts +1 -1
  72. package/src/adapters/fetch/fetchRequestHandler.ts +72 -25
  73. package/src/adapters/lambda/index.ts +1 -1
  74. package/src/adapters/next.ts +1 -1
  75. package/src/adapters/node-http/content-type/form-data/fileUploadHandler.ts +1 -1
  76. package/src/adapters/node-http/content-type/form-data/index.ts +1 -1
  77. package/src/adapters/node-http/content-type/form-data/streamSlice.ts +19 -21
  78. package/src/adapters/node-http/nodeHTTPRequestHandler.ts +51 -12
  79. package/src/adapters/ws.ts +3 -3
  80. package/src/core/initTRPC.ts +2 -2
  81. package/src/core/internals/mergeRouters.ts +1 -1
  82. package/src/core/internals/procedureBuilder.ts +5 -5
  83. package/src/core/router.ts +2 -2
  84. package/src/deprecated/internals/procedure.ts +2 -2
  85. package/src/deprecated/interop.ts +1 -1
  86. package/src/deprecated/router.ts +6 -6
  87. package/src/error/formatter.ts +1 -1
  88. package/src/http/batchStreamFormatter.ts +29 -0
  89. package/src/http/getHTTPStatusCode.ts +1 -1
  90. package/src/http/index.ts +1 -0
  91. package/src/http/internals/types.ts +9 -1
  92. package/src/http/resolveHTTPResponse.ts +337 -126
  93. package/src/internals/types.ts +1 -1
  94. package/src/subscription.ts +1 -1
  95. package/dist/resolveHTTPResponse-4e576698.mjs +0 -174
  96. package/dist/resolveHTTPResponse-9523b4e3.js +0 -176
  97. package/dist/resolveHTTPResponse-ba557d3e.js +0 -166
@@ -1 +1 @@
1
- {"version":3,"file":"getHTTPStatusCode.d.ts","sourceRoot":"","sources":["../../src/http/getHTTPStatusCode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAC;AAE/D,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;CAAkC,CAAC;AAC1E,KAAK,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;AAEzC,MAAM,MAAM,sBAAsB,GAAG,OAAO,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAyB7E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,EAAE,OAuBpE;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,SAAS,UAI1D"}
1
+ {"version":3,"file":"getHTTPStatusCode.d.ts","sourceRoot":"","sources":["../../src/http/getHTTPStatusCode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAE/D,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;CAAkC,CAAC;AAC1E,KAAK,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;AAEzC,MAAM,MAAM,sBAAsB,GAAG,OAAO,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAyB7E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,EAAE,OAuBpE;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,SAAS,UAI1D"}
@@ -1,4 +1,5 @@
1
1
  export * from './getHTTPStatusCode';
2
2
  export * from './resolveHTTPResponse';
3
3
  export * from './types';
4
+ export * from './batchStreamFormatter';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC;AACxB,cAAc,wBAAwB,CAAC"}
@@ -3,7 +3,8 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var index = require('../index-4a823936.js');
6
- var resolveHTTPResponse = require('../resolveHTTPResponse-9523b4e3.js');
6
+ var resolveHTTPResponse = require('../resolveHTTPResponse-2c307e04.js');
7
+ var batchStreamFormatter = require('../batchStreamFormatter-93cdcdd4.js');
7
8
  require('../codes-0eeb600d.js');
8
9
  require('../config-f3ce0144.js');
9
10
  require('../TRPCError-16b2e52d.js');
@@ -16,3 +17,4 @@ exports.TRPC_ERROR_CODES_BY_NUMBER = index.TRPC_ERROR_CODES_BY_NUMBER;
16
17
  exports.getHTTPStatusCode = index.getHTTPStatusCode;
17
18
  exports.getHTTPStatusCodeFromError = index.getHTTPStatusCodeFromError;
18
19
  exports.resolveHTTPResponse = resolveHTTPResponse.resolveHTTPResponse;
20
+ exports.getBatchStreamFormatter = batchStreamFormatter.getBatchStreamFormatter;
@@ -1,5 +1,6 @@
1
1
  export { T as TRPC_ERROR_CODES_BY_NUMBER, b as getHTTPStatusCode, g as getHTTPStatusCodeFromError } from '../index-044a193b.mjs';
2
- export { r as resolveHTTPResponse } from '../resolveHTTPResponse-4e576698.mjs';
2
+ export { r as resolveHTTPResponse } from '../resolveHTTPResponse-a9be3d96.mjs';
3
+ export { g as getBatchStreamFormatter } from '../batchStreamFormatter-fc1ffb26.mjs';
3
4
  import '../codes-24aa1ce1.mjs';
4
5
  import '../config-65c5b6d1.mjs';
5
6
  import '../TRPCError-2b10c8d2.mjs';
@@ -1,4 +1,4 @@
1
- import { AnyRouter, ProcedureType, inferRouterContext, inferRouterError } from '../../core';
1
+ import { AnyRouter, inferRouterContext, inferRouterError, ProcedureType } from '../../core';
2
2
  import { TRPCError } from '../../error/TRPCError';
3
3
  import { TRPCResponse } from '../../rpc';
4
4
  import { Dict } from '../../types';
@@ -9,6 +9,7 @@ export interface HTTPResponse {
9
9
  headers?: HTTPHeaders;
10
10
  body?: string;
11
11
  }
12
+ export type ResponseChunk = [procedureIndex: number, responseBody: string];
12
13
  /**
13
14
  * @internal
14
15
  */
@@ -21,5 +22,11 @@ export type ResponseMetaFn<TRouter extends AnyRouter> = (opts: {
21
22
  paths?: string[];
22
23
  type: ProcedureType | 'unknown';
23
24
  errors: TRPCError[];
25
+ /**
26
+ * `true` if the `ResponseMeta` are being
27
+ * generated without knowing the response data
28
+ * (e.g. for streaming requests).
29
+ */
30
+ eagerGeneration: boolean;
24
31
  }) => ResponseMeta;
25
32
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/http/internals/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,OAAO,SAAS,SAAS,IAAI,CAAC,IAAI,EAAE;IAC7D,IAAI,EAAE,YAAY,CAAC,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;IACzD,GAAG,CAAC,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAClC;;QAEI;IACJ,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,aAAa,GAAG,SAAS,CAAC;IAChC,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB,KAAK,YAAY,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/http/internals/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;AAE3E;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,OAAO,SAAS,SAAS,IAAI,CAAC,IAAI,EAAE;IAC7D,IAAI,EAAE,YAAY,CAAC,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;IACzD,GAAG,CAAC,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAClC;;QAEI;IACJ,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,aAAa,GAAG,SAAS,CAAC;IAChC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB;;;;OAIG;IACH,eAAe,EAAE,OAAO,CAAC;CAC1B,KAAK,YAAY,CAAC"}
@@ -2,7 +2,7 @@ import { AnyRouter, inferRouterContext } from '../core';
2
2
  import { TRPCError } from '../error/TRPCError';
3
3
  import { Maybe } from '../types';
4
4
  import { BaseContentTypeHandler } from './contentType';
5
- import { HTTPResponse } from './internals/types';
5
+ import { HTTPResponse, ResponseChunk } from './internals/types';
6
6
  import { HTTPBaseHandlerOptions, HTTPRequest } from './types';
7
7
  interface ResolveHTTPRequestOptions<TRouter extends AnyRouter, TRequest extends HTTPRequest> extends HTTPBaseHandlerOptions<TRouter, TRequest> {
8
8
  createContext: () => Promise<inferRouterContext<TRouter>>;
@@ -11,7 +11,41 @@ interface ResolveHTTPRequestOptions<TRouter extends AnyRouter, TRequest extends
11
11
  error?: Maybe<TRPCError>;
12
12
  contentTypeHandler?: BaseContentTypeHandler<any>;
13
13
  preprocessedBody?: boolean;
14
+ /**
15
+ * Called as soon as the response head is known,
16
+ * with headers that were generated **without** knowing the response body.
17
+ *
18
+ * Without this callback, streaming is disabled.
19
+ */
20
+ onHead: (headResponse: Omit<HTTPResponse, 'body'>) => void;
21
+ /**
22
+ * Called for every procedure with `[index, result]`.
23
+ *
24
+ * Will be called a single time with `index = -1` if
25
+ * - response is an error
26
+ * - response is empty (HEAD request)
27
+ *
28
+ * Without this callback, streaming is disabled.
29
+ */
30
+ onChunk: (chunk: ResponseChunk) => void;
14
31
  }
15
- export declare function resolveHTTPResponse<TRouter extends AnyRouter, TRequest extends HTTPRequest>(opts: ResolveHTTPRequestOptions<TRouter, TRequest>): Promise<HTTPResponse>;
32
+ /**
33
+ * Since `resolveHTTPResponse` is a public API (community adapters),
34
+ * let's give it a strong type signature to increase discoverability.
35
+ */
36
+ /**
37
+ * Non-streaming signature for `resolveHTTPResponse`:
38
+ * @param opts.onHead `undefined`
39
+ * @param opts.onChunk `undefined`
40
+ * @returns `Promise<HTTPResponse>`
41
+ */
42
+ export declare function resolveHTTPResponse<TRouter extends AnyRouter, TRequest extends HTTPRequest>(opts: Omit<ResolveHTTPRequestOptions<TRouter, TRequest>, 'onHead' | 'onChunk'>): Promise<HTTPResponse>;
43
+ /**
44
+ * Streaming signature for `resolveHTTPResponse`:
45
+ * @param opts.onHead called as soon as the response head is known
46
+ * @param opts.onChunk called for every procedure with `[index, result]`
47
+ * @returns `Promise<void>` since the response is streamed
48
+ */
49
+ export declare function resolveHTTPResponse<TRouter extends AnyRouter, TRequest extends HTTPRequest>(opts: ResolveHTTPRequestOptions<TRouter, TRequest>): Promise<void>;
16
50
  export {};
17
51
  //# sourceMappingURL=resolveHTTPResponse.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolveHTTPResponse.d.ts","sourceRoot":"","sources":["../../src/http/resolveHTTPResponse.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EAGT,kBAAkB,EAEnB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,SAAS,EAA2B,MAAM,oBAAoB,CAAC;AAIxE,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EACL,sBAAsB,EAEvB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAe,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAc9D,UAAU,yBAAyB,CACjC,OAAO,SAAS,SAAS,EACzB,QAAQ,SAAS,WAAW,CAC5B,SAAQ,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC;IACjD,aAAa,EAAE,MAAM,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,GAAG,EAAE,QAAQ,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACzB,kBAAkB,CAAC,EAAE,sBAAsB,CAAC,GAAG,CAAC,CAAC;IACjD,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAsB,mBAAmB,CACvC,OAAO,SAAS,SAAS,EACzB,QAAQ,SAAS,WAAW,EAC5B,IAAI,EAAE,yBAAyB,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAmL3E"}
1
+ {"version":3,"file":"resolveHTTPResponse.d.ts","sourceRoot":"","sources":["../../src/http/resolveHTTPResponse.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAET,kBAAkB,EAGnB,MAAM,SAAS,CAAC;AACjB,OAAO,EAA2B,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAIxE,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EACL,sBAAsB,EAEvB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAe,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAoB9D,UAAU,yBAAyB,CACjC,OAAO,SAAS,SAAS,EACzB,QAAQ,SAAS,WAAW,CAC5B,SAAQ,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC;IACjD,aAAa,EAAE,MAAM,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,GAAG,EAAE,QAAQ,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACzB,kBAAkB,CAAC,EAAE,sBAAsB,CAAC,GAAG,CAAC,CAAC;IACjD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;OAKG;IACH,MAAM,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IAC3D;;;;;;;;OAQG;IACH,OAAO,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CACzC;AAyJD;;;GAGG;AAEH;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,SAAS,SAAS,EACzB,QAAQ,SAAS,WAAW,EAE5B,IAAI,EAAE,IAAI,CACR,yBAAyB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAC5C,QAAQ,GAAG,SAAS,CACrB,GACA,OAAO,CAAC,YAAY,CAAC,CAAC;AACzB;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,SAAS,SAAS,EACzB,QAAQ,SAAS,WAAW,EAC5B,IAAI,EAAE,yBAAyB,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { ProcedureType, inferRouterContext } from '../core';
1
+ import { inferRouterContext, ProcedureType } from '../core';
2
2
  import { AnyRouter } from '../core/router';
3
3
  import { TRPCError } from '../error/TRPCError';
4
4
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/internals/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C;;;GAGG;AACH,MAAM,WAAW,kBAAkB,CAAC,OAAO,SAAS,SAAS,EAAE,QAAQ;IACrE,OAAO,CAAC,EAAE,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC7C,QAAQ,CAAC,EAAE;QACT,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,CAAC,OAAO,SAAS,SAAS,EAAE,QAAQ,IAAI,CAAC,IAAI,EAAE;IACxE,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,aAAa,GAAG,SAAS,CAAC;IAChC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,GAAG,EAAE,QAAQ,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;CAC9C,KAAK,IAAI,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/internals/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C;;;GAGG;AACH,MAAM,WAAW,kBAAkB,CAAC,OAAO,SAAS,SAAS,EAAE,QAAQ;IACrE,OAAO,CAAC,EAAE,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC7C,QAAQ,CAAC,EAAE;QACT,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,CAAC,OAAO,SAAS,SAAS,EAAE,QAAQ,IAAI,CAAC,IAAI,EAAE;IACxE,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,aAAa,GAAG,SAAS,CAAC;IAChC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,GAAG,EAAE,QAAQ,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;CAC9C,KAAK,IAAI,CAAC"}
@@ -1,4 +1,6 @@
1
- import { r as resolveHTTPResponse } from './resolveHTTPResponse-ba557d3e.js';
1
+ import './index-ca9a128e.js';
2
+ import { r as resolveHTTPResponse } from './resolveHTTPResponse-2bdf2cd7.js';
3
+ import { g as getBatchStreamFormatter } from './batchStreamFormatter-2c1405a1.js';
2
4
  import { nodeHTTPJSONContentTypeHandler } from './adapters/node-http/content-type/json/index.js';
3
5
 
4
6
  const defaultJSONContentTypeHandler = nodeHTTPJSONContentTypeHandler();
@@ -33,7 +35,40 @@ async function nodeHTTPRequestHandler(opts) {
33
35
  query,
34
36
  body: bodyResult.ok ? bodyResult.data : undefined,
35
37
  };
36
- const result = await resolveHTTPResponse({
38
+ const onHead = (head) => {
39
+ if ('status' in head &&
40
+ (!opts.res.statusCode || opts.res.statusCode === 200)) {
41
+ opts.res.statusCode = head.status;
42
+ }
43
+ for (const [key, value] of Object.entries(head.headers ?? {})) {
44
+ /* istanbul ignore if -- @preserve */
45
+ if (typeof value === 'undefined') {
46
+ continue;
47
+ }
48
+ opts.res.setHeader(key, value);
49
+ }
50
+ };
51
+ const formatter = getBatchStreamFormatter();
52
+ let isStream = false;
53
+ const onChunk = ([index, string]) => {
54
+ if (index === -1) {
55
+ /**
56
+ * Full response, no streaming. This can happen
57
+ * - if the response is an error
58
+ * - if response is empty (HEAD request)
59
+ */
60
+ opts.res.end(string);
61
+ return;
62
+ }
63
+ if (!isStream) {
64
+ opts.res.setHeader('Transfer-Encoding', 'chunked');
65
+ const vary = opts.res.getHeader('Vary');
66
+ opts.res.setHeader('Vary', vary ? 'trpc-batch-mode, ' + vary : 'trpc-batch-mode');
67
+ isStream = true;
68
+ }
69
+ opts.res.write(formatter(index, string));
70
+ };
71
+ await resolveHTTPResponse({
37
72
  batching: opts.batching,
38
73
  responseMeta: opts.responseMeta,
39
74
  path: opts.path,
@@ -49,18 +84,15 @@ async function nodeHTTPRequestHandler(opts) {
49
84
  });
50
85
  },
51
86
  contentTypeHandler,
87
+ onHead,
88
+ onChunk,
52
89
  });
53
- const { res } = opts;
54
- if ('status' in result && (!res.statusCode || res.statusCode === 200)) {
55
- res.statusCode = result.status;
56
- }
57
- for (const [key, value] of Object.entries(result.headers ?? {})) {
58
- if (typeof value === 'undefined') {
59
- continue;
60
- }
61
- res.setHeader(key, value);
90
+ if (!isStream) {
91
+ return opts.res;
62
92
  }
63
- res.end(result.body);
93
+ opts.res.write(formatter.end());
94
+ opts.res.end();
95
+ return opts.res;
64
96
  });
65
97
  }
66
98
 
@@ -1,4 +1,6 @@
1
- import { r as resolveHTTPResponse } from './resolveHTTPResponse-4e576698.mjs';
1
+ import './index-044a193b.mjs';
2
+ import { r as resolveHTTPResponse } from './resolveHTTPResponse-a9be3d96.mjs';
3
+ import { g as getBatchStreamFormatter } from './batchStreamFormatter-fc1ffb26.mjs';
2
4
  import { nodeHTTPJSONContentTypeHandler } from './adapters/node-http/content-type/json/index.mjs';
3
5
 
4
6
  const defaultJSONContentTypeHandler = nodeHTTPJSONContentTypeHandler();
@@ -29,7 +31,37 @@ async function nodeHTTPRequestHandler(opts) {
29
31
  query,
30
32
  body: bodyResult.ok ? bodyResult.data : undefined
31
33
  };
32
- const result = await resolveHTTPResponse({
34
+ const onHead = (head)=>{
35
+ if ('status' in head && (!opts.res.statusCode || opts.res.statusCode === 200)) {
36
+ opts.res.statusCode = head.status;
37
+ }
38
+ for (const [key, value] of Object.entries(head.headers ?? {})){
39
+ /* istanbul ignore if -- @preserve */ if (typeof value === 'undefined') {
40
+ continue;
41
+ }
42
+ opts.res.setHeader(key, value);
43
+ }
44
+ };
45
+ const formatter = getBatchStreamFormatter();
46
+ let isStream = false;
47
+ const onChunk = ([index, string])=>{
48
+ if (index === -1) {
49
+ /**
50
+ * Full response, no streaming. This can happen
51
+ * - if the response is an error
52
+ * - if response is empty (HEAD request)
53
+ */ opts.res.end(string);
54
+ return;
55
+ }
56
+ if (!isStream) {
57
+ opts.res.setHeader('Transfer-Encoding', 'chunked');
58
+ const vary = opts.res.getHeader('Vary');
59
+ opts.res.setHeader('Vary', vary ? 'trpc-batch-mode, ' + vary : 'trpc-batch-mode');
60
+ isStream = true;
61
+ }
62
+ opts.res.write(formatter(index, string));
63
+ };
64
+ await resolveHTTPResponse({
33
65
  batching: opts.batching,
34
66
  responseMeta: opts.responseMeta,
35
67
  path: opts.path,
@@ -44,19 +76,16 @@ async function nodeHTTPRequestHandler(opts) {
44
76
  req: opts.req
45
77
  });
46
78
  },
47
- contentTypeHandler
79
+ contentTypeHandler,
80
+ onHead,
81
+ onChunk
48
82
  });
49
- const { res } = opts;
50
- if ('status' in result && (!res.statusCode || res.statusCode === 200)) {
51
- res.statusCode = result.status;
52
- }
53
- for (const [key, value] of Object.entries(result.headers ?? {})){
54
- if (typeof value === 'undefined') {
55
- continue;
56
- }
57
- res.setHeader(key, value);
83
+ if (!isStream) {
84
+ return opts.res;
58
85
  }
59
- res.end(result.body);
86
+ opts.res.write(formatter.end());
87
+ opts.res.end();
88
+ return opts.res;
60
89
  });
61
90
  }
62
91
 
@@ -1,6 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var resolveHTTPResponse = require('./resolveHTTPResponse-9523b4e3.js');
3
+ require('./index-4a823936.js');
4
+ var resolveHTTPResponse = require('./resolveHTTPResponse-2c307e04.js');
5
+ var batchStreamFormatter = require('./batchStreamFormatter-93cdcdd4.js');
4
6
  var adapters_nodeHttp_contentType_json_index = require('./adapters/node-http/content-type/json/index.js');
5
7
 
6
8
  const defaultJSONContentTypeHandler = adapters_nodeHttp_contentType_json_index.nodeHTTPJSONContentTypeHandler();
@@ -31,7 +33,37 @@ async function nodeHTTPRequestHandler(opts) {
31
33
  query,
32
34
  body: bodyResult.ok ? bodyResult.data : undefined
33
35
  };
34
- const result = await resolveHTTPResponse.resolveHTTPResponse({
36
+ const onHead = (head)=>{
37
+ if ('status' in head && (!opts.res.statusCode || opts.res.statusCode === 200)) {
38
+ opts.res.statusCode = head.status;
39
+ }
40
+ for (const [key, value] of Object.entries(head.headers ?? {})){
41
+ /* istanbul ignore if -- @preserve */ if (typeof value === 'undefined') {
42
+ continue;
43
+ }
44
+ opts.res.setHeader(key, value);
45
+ }
46
+ };
47
+ const formatter = batchStreamFormatter.getBatchStreamFormatter();
48
+ let isStream = false;
49
+ const onChunk = ([index, string])=>{
50
+ if (index === -1) {
51
+ /**
52
+ * Full response, no streaming. This can happen
53
+ * - if the response is an error
54
+ * - if response is empty (HEAD request)
55
+ */ opts.res.end(string);
56
+ return;
57
+ }
58
+ if (!isStream) {
59
+ opts.res.setHeader('Transfer-Encoding', 'chunked');
60
+ const vary = opts.res.getHeader('Vary');
61
+ opts.res.setHeader('Vary', vary ? 'trpc-batch-mode, ' + vary : 'trpc-batch-mode');
62
+ isStream = true;
63
+ }
64
+ opts.res.write(formatter(index, string));
65
+ };
66
+ await resolveHTTPResponse.resolveHTTPResponse({
35
67
  batching: opts.batching,
36
68
  responseMeta: opts.responseMeta,
37
69
  path: opts.path,
@@ -46,19 +78,16 @@ async function nodeHTTPRequestHandler(opts) {
46
78
  req: opts.req
47
79
  });
48
80
  },
49
- contentTypeHandler
81
+ contentTypeHandler,
82
+ onHead,
83
+ onChunk
50
84
  });
51
- const { res } = opts;
52
- if ('status' in result && (!res.statusCode || res.statusCode === 200)) {
53
- res.statusCode = result.status;
54
- }
55
- for (const [key, value] of Object.entries(result.headers ?? {})){
56
- if (typeof value === 'undefined') {
57
- continue;
58
- }
59
- res.setHeader(key, value);
85
+ if (!isStream) {
86
+ return opts.res;
60
87
  }
61
- res.end(result.body);
88
+ opts.res.write(formatter.end());
89
+ opts.res.end();
90
+ return opts.res;
62
91
  });
63
92
  }
64
93
 
@@ -0,0 +1,256 @@
1
+ import { b as callProcedure } from './config-54786004.js';
2
+ import { T as TRPCError, a as getTRPCErrorFromUnknown } from './TRPCError-7c3909ea.js';
3
+ import { t as transformTRPCResponse, g as getErrorShape } from './transformTRPCResponse-7fcbe472.js';
4
+ import { g as getJsonContentTypeInputs } from './contentType-7354963c.js';
5
+ import { b as getHTTPStatusCode } from './index-ca9a128e.js';
6
+
7
+ const HTTP_METHOD_PROCEDURE_TYPE_MAP = {
8
+ GET: 'query',
9
+ POST: 'mutation',
10
+ };
11
+ const fallbackContentTypeHandler = {
12
+ getInputs: getJsonContentTypeInputs,
13
+ };
14
+ function initResponse(initOpts) {
15
+ const { ctx, paths, type, responseMeta, untransformedJSON, errors = [], } = initOpts;
16
+ let status = untransformedJSON ? getHTTPStatusCode(untransformedJSON) : 200;
17
+ const headers = {
18
+ 'Content-Type': 'application/json',
19
+ };
20
+ const eagerGeneration = !untransformedJSON;
21
+ const data = eagerGeneration
22
+ ? []
23
+ : Array.isArray(untransformedJSON)
24
+ ? untransformedJSON
25
+ : [untransformedJSON];
26
+ const meta = responseMeta?.({
27
+ ctx,
28
+ paths,
29
+ type,
30
+ data,
31
+ errors,
32
+ eagerGeneration,
33
+ }) ?? {};
34
+ for (const [key, value] of Object.entries(meta.headers ?? {})) {
35
+ headers[key] = value;
36
+ }
37
+ if (meta.status) {
38
+ status = meta.status;
39
+ }
40
+ return {
41
+ status,
42
+ headers,
43
+ };
44
+ }
45
+ async function inputToProcedureCall(procedureOpts) {
46
+ const { opts, ctx, type, input, path } = procedureOpts;
47
+ try {
48
+ const data = await callProcedure({
49
+ procedures: opts.router._def.procedures,
50
+ path,
51
+ rawInput: input,
52
+ ctx,
53
+ type,
54
+ });
55
+ return {
56
+ result: {
57
+ data,
58
+ },
59
+ };
60
+ }
61
+ catch (cause) {
62
+ const error = getTRPCErrorFromUnknown(cause);
63
+ opts.onError?.({ error, path, input, ctx, type: type, req: opts.req });
64
+ return {
65
+ error: getErrorShape({
66
+ config: opts.router._def._config,
67
+ error,
68
+ type,
69
+ path,
70
+ input,
71
+ ctx,
72
+ }),
73
+ };
74
+ }
75
+ }
76
+ function caughtErrorToData(cause, errorOpts) {
77
+ const { router, req, onError } = errorOpts.opts;
78
+ const error = getTRPCErrorFromUnknown(cause);
79
+ onError?.({
80
+ error,
81
+ path: errorOpts.path,
82
+ input: errorOpts.input,
83
+ ctx: errorOpts.ctx,
84
+ type: errorOpts.type,
85
+ req,
86
+ });
87
+ const untransformedJSON = {
88
+ error: getErrorShape({
89
+ config: router._def._config,
90
+ error,
91
+ type: errorOpts.type,
92
+ path: errorOpts.path,
93
+ input: errorOpts.input,
94
+ ctx: errorOpts.ctx,
95
+ }),
96
+ };
97
+ const transformedJSON = transformTRPCResponse(router._def._config, untransformedJSON);
98
+ const body = JSON.stringify(transformedJSON);
99
+ return {
100
+ error,
101
+ untransformedJSON,
102
+ body,
103
+ };
104
+ }
105
+ // implementation
106
+ async function resolveHTTPResponse(opts) {
107
+ const { router, req, onHead, onChunk } = opts;
108
+ if (req.method === 'HEAD') {
109
+ // can be used for lambda warmup
110
+ const headResponse = {
111
+ status: 204,
112
+ };
113
+ onHead?.(headResponse);
114
+ onChunk?.([-1, '']);
115
+ return headResponse;
116
+ }
117
+ const contentTypeHandler = opts.contentTypeHandler ?? fallbackContentTypeHandler;
118
+ const batchingEnabled = opts.batching?.enabled ?? true;
119
+ const type = HTTP_METHOD_PROCEDURE_TYPE_MAP[req.method] ?? 'unknown';
120
+ let ctx = undefined;
121
+ let paths;
122
+ const isBatchCall = !!req.query.get('batch');
123
+ const isStreamCall = isBatchCall &&
124
+ onHead &&
125
+ onChunk &&
126
+ req.headers['trpc-batch-mode'] === 'stream';
127
+ try {
128
+ if (opts.error) {
129
+ throw opts.error;
130
+ }
131
+ if (isBatchCall && !batchingEnabled) {
132
+ throw new Error(`Batching is not enabled on the server`);
133
+ }
134
+ /* istanbul ignore if -- @preserve */
135
+ if (type === 'subscription') {
136
+ throw new TRPCError({
137
+ message: 'Subscriptions should use wsLink',
138
+ code: 'METHOD_NOT_SUPPORTED',
139
+ });
140
+ }
141
+ if (type === 'unknown') {
142
+ throw new TRPCError({
143
+ message: `Unexpected request method ${req.method}`,
144
+ code: 'METHOD_NOT_SUPPORTED',
145
+ });
146
+ }
147
+ const inputs = await contentTypeHandler.getInputs({
148
+ isBatchCall,
149
+ req,
150
+ router,
151
+ preprocessedBody: opts.preprocessedBody ?? false,
152
+ });
153
+ paths = isBatchCall ? opts.path.split(',') : [opts.path];
154
+ ctx = await opts.createContext();
155
+ const promises = paths.map((path, index) => inputToProcedureCall({ opts, ctx, type, input: inputs[index], path }));
156
+ if (!isStreamCall) {
157
+ /**
158
+ * Non-streaming response:
159
+ * - await all responses in parallel, blocking on the slowest one
160
+ * - create headers with known response body
161
+ * - return a complete HTTPResponse
162
+ */
163
+ const untransformedJSON = await Promise.all(promises);
164
+ const errors = untransformedJSON.flatMap((response) => 'error' in response ? [response.error] : []);
165
+ const headResponse = initResponse({
166
+ ctx,
167
+ paths,
168
+ type,
169
+ responseMeta: opts.responseMeta,
170
+ untransformedJSON,
171
+ errors,
172
+ });
173
+ onHead?.(headResponse);
174
+ // return body stuff
175
+ const result = isBatchCall ? untransformedJSON : untransformedJSON[0]; // eslint-disable-line @typescript-eslint/no-non-null-assertion -- `untransformedJSON` should be the length of `paths` which should be at least 1 otherwise there wouldn't be a request at all
176
+ const transformedJSON = transformTRPCResponse(router._def._config, result);
177
+ const body = JSON.stringify(transformedJSON);
178
+ onChunk?.([-1, body]);
179
+ return {
180
+ status: headResponse.status,
181
+ headers: headResponse.headers,
182
+ body,
183
+ };
184
+ }
185
+ /**
186
+ * Streaming response:
187
+ * - block on none, call `onChunk` as soon as each response is ready
188
+ * - create headers with minimal data (cannot know the response body in advance)
189
+ * - return void
190
+ */
191
+ const headResponse = initResponse({
192
+ ctx,
193
+ paths,
194
+ type,
195
+ responseMeta: opts.responseMeta,
196
+ });
197
+ onHead(headResponse);
198
+ const indexedPromises = new Map(promises.map((promise, index) => [
199
+ index,
200
+ promise.then((r) => [index, r]),
201
+ ]));
202
+ for (let i = 0; i < paths.length; i++) {
203
+ const [index, untransformedJSON] = await Promise.race(indexedPromises.values());
204
+ indexedPromises.delete(index);
205
+ try {
206
+ const transformedJSON = transformTRPCResponse(router._def._config, untransformedJSON);
207
+ const body = JSON.stringify(transformedJSON);
208
+ onChunk([index, body]);
209
+ }
210
+ catch (cause) {
211
+ const path = paths[index];
212
+ const input = inputs[index];
213
+ const { body } = caughtErrorToData(cause, {
214
+ opts,
215
+ ctx,
216
+ type,
217
+ path,
218
+ input,
219
+ });
220
+ onChunk([index, body]);
221
+ }
222
+ }
223
+ return;
224
+ }
225
+ catch (cause) {
226
+ // we get here if
227
+ // - batching is called when it's not enabled
228
+ // - `createContext()` throws
229
+ // - `router._def._config.transformer.output.serialize()` throws
230
+ // - post body is too large
231
+ // - input deserialization fails
232
+ // - `errorFormatter` return value is malformed
233
+ const { error, untransformedJSON, body } = caughtErrorToData(cause, {
234
+ opts,
235
+ ctx,
236
+ type,
237
+ });
238
+ const headResponse = initResponse({
239
+ ctx,
240
+ paths,
241
+ type,
242
+ responseMeta: opts.responseMeta,
243
+ untransformedJSON,
244
+ errors: [error],
245
+ });
246
+ onHead?.(headResponse);
247
+ onChunk?.([-1, body]);
248
+ return {
249
+ status: headResponse.status,
250
+ headers: headResponse.headers,
251
+ body,
252
+ };
253
+ }
254
+ }
255
+
256
+ export { resolveHTTPResponse as r };