@trpc/server 10.28.2 → 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 (53) hide show
  1. package/dist/adapters/aws-lambda/index.js +1 -1
  2. package/dist/adapters/aws-lambda/index.mjs +1 -1
  3. package/dist/adapters/express.js +5 -4
  4. package/dist/adapters/express.mjs +5 -4
  5. package/dist/adapters/fastify/fastifyRequestHandler.d.ts +1 -1
  6. package/dist/adapters/fastify/fastifyRequestHandler.d.ts.map +1 -1
  7. package/dist/adapters/fastify/index.js +50 -15
  8. package/dist/adapters/fastify/index.mjs +50 -15
  9. package/dist/adapters/fetch/fetchRequestHandler.d.ts.map +1 -1
  10. package/dist/adapters/fetch/index.js +66 -20
  11. package/dist/adapters/fetch/index.mjs +66 -20
  12. package/dist/adapters/next.js +3 -2
  13. package/dist/adapters/next.mjs +3 -2
  14. package/dist/adapters/node-http/content-type/form-data/index.js +19 -46
  15. package/dist/adapters/node-http/content-type/form-data/index.mjs +19 -40
  16. package/dist/adapters/node-http/content-type/form-data/streamSlice.d.ts +7 -3
  17. package/dist/adapters/node-http/content-type/form-data/streamSlice.d.ts.map +1 -1
  18. package/dist/adapters/node-http/index.js +5 -4
  19. package/dist/adapters/node-http/index.mjs +5 -4
  20. package/dist/adapters/node-http/nodeHTTPRequestHandler.d.ts.map +1 -1
  21. package/dist/adapters/standalone.js +5 -4
  22. package/dist/adapters/standalone.mjs +5 -4
  23. package/dist/batchStreamFormatter-2c1405a1.js +31 -0
  24. package/dist/batchStreamFormatter-93cdcdd4.js +32 -0
  25. package/dist/batchStreamFormatter-fc1ffb26.mjs +30 -0
  26. package/dist/http/batchStreamFormatter.d.ts +24 -0
  27. package/dist/http/batchStreamFormatter.d.ts.map +1 -0
  28. package/dist/http/index.d.ts +1 -0
  29. package/dist/http/index.d.ts.map +1 -1
  30. package/dist/http/index.js +3 -1
  31. package/dist/http/index.mjs +2 -1
  32. package/dist/http/internals/types.d.ts +7 -0
  33. package/dist/http/internals/types.d.ts.map +1 -1
  34. package/dist/http/resolveHTTPResponse.d.ts +36 -2
  35. package/dist/http/resolveHTTPResponse.d.ts.map +1 -1
  36. package/dist/{nodeHTTPRequestHandler-bd47641d.js → nodeHTTPRequestHandler-53b9fc2d.js} +44 -12
  37. package/dist/{nodeHTTPRequestHandler-0f979796.mjs → nodeHTTPRequestHandler-bdad2781.mjs} +42 -13
  38. package/dist/{nodeHTTPRequestHandler-5bbf93f1.js → nodeHTTPRequestHandler-e637755a.js} +42 -13
  39. package/dist/resolveHTTPResponse-2bdf2cd7.js +256 -0
  40. package/dist/resolveHTTPResponse-2c307e04.js +284 -0
  41. package/dist/resolveHTTPResponse-a9be3d96.mjs +282 -0
  42. package/package.json +4 -4
  43. package/src/adapters/fastify/fastifyRequestHandler.ts +64 -17
  44. package/src/adapters/fetch/fetchRequestHandler.ts +72 -25
  45. package/src/adapters/node-http/content-type/form-data/streamSlice.ts +19 -21
  46. package/src/adapters/node-http/nodeHTTPRequestHandler.ts +51 -12
  47. package/src/http/batchStreamFormatter.ts +29 -0
  48. package/src/http/index.ts +1 -0
  49. package/src/http/internals/types.ts +8 -0
  50. package/src/http/resolveHTTPResponse.ts +335 -124
  51. package/dist/resolveHTTPResponse-4e576698.mjs +0 -174
  52. package/dist/resolveHTTPResponse-9523b4e3.js +0 -176
  53. package/dist/resolveHTTPResponse-ba557d3e.js +0 -166
@@ -6,9 +6,6 @@ import { mkdir, rm, unlink, stat } from 'node:fs/promises';
6
6
  import { tmpdir } from 'node:os';
7
7
  import { resolve, dirname, basename, extname } from 'node:path';
8
8
  import { promisify } from 'node:util';
9
- import _class_private_field_get from '@swc/helpers/src/_class_private_field_get.mjs';
10
- import _class_private_field_init from '@swc/helpers/src/_class_private_field_init.mjs';
11
- import _class_private_field_set from '@swc/helpers/src/_class_private_field_set.mjs';
12
9
 
13
10
  function stringToArray(s) {
14
11
  const utf8 = unescape(encodeURIComponent(s));
@@ -444,26 +441,25 @@ function createMemoryUploadHandler({ filter , maxPartSize =3000000 } = {}) {
444
441
  };
445
442
  }
446
443
 
447
- var _start = /*#__PURE__*/ new WeakMap(), _end = /*#__PURE__*/ new WeakMap(), _offset = /*#__PURE__*/ new WeakMap(), _emitUp = /*#__PURE__*/ new WeakMap(), _emitDown = /*#__PURE__*/ new WeakMap();
448
444
  class SliceStream extends Transform {
449
445
  _transform(chunk, _, done) {
450
- _class_private_field_set(this, _offset, _class_private_field_get(this, _offset) + chunk.length);
451
- if (!_class_private_field_get(this, _emitUp) && _class_private_field_get(this, _offset) >= _class_private_field_get(this, _start)) {
452
- _class_private_field_set(this, _emitUp, true);
453
- const start = chunk.length - (_class_private_field_get(this, _offset) - _class_private_field_get(this, _start));
454
- if (_class_private_field_get(this, _offset) > _class_private_field_get(this, _end)) {
455
- const end = chunk.length - (_class_private_field_get(this, _offset) - _class_private_field_get(this, _end));
456
- _class_private_field_set(this, _emitDown, true);
446
+ this.indexOffset += chunk.length;
447
+ if (!this.emitUp && this.indexOffset >= this.startIndex) {
448
+ this.emitUp = true;
449
+ const start = chunk.length - (this.indexOffset - this.startIndex);
450
+ if (this.indexOffset > this.endIndex) {
451
+ const end = chunk.length - (this.indexOffset - this.endIndex);
452
+ this.emitDown = true;
457
453
  this.push(chunk.slice(start, end));
458
454
  } else {
459
455
  this.push(chunk.slice(start, chunk.length));
460
456
  }
461
457
  return done();
462
458
  }
463
- if (_class_private_field_get(this, _emitUp) && !_class_private_field_get(this, _emitDown)) {
464
- if (_class_private_field_get(this, _offset) >= _class_private_field_get(this, _end)) {
465
- _class_private_field_set(this, _emitDown, true);
466
- this.push(chunk.slice(0, chunk.length - (_class_private_field_get(this, _offset) - _class_private_field_get(this, _end))));
459
+ if (this.emitUp && !this.emitDown) {
460
+ if (this.indexOffset >= this.endIndex) {
461
+ this.emitDown = true;
462
+ this.push(chunk.slice(0, chunk.length - (this.indexOffset - this.endIndex)));
467
463
  } else {
468
464
  this.push(chunk);
469
465
  }
@@ -471,34 +467,17 @@ class SliceStream extends Transform {
471
467
  }
472
468
  return done();
473
469
  }
474
- constructor(start = 0, end = Infinity){
470
+ constructor(startIndex = 0, endIndex = Infinity){
475
471
  super();
476
- _class_private_field_init(this, _start, {
477
- writable: true,
478
- value: void 0
479
- });
480
- _class_private_field_init(this, _end, {
481
- writable: true,
482
- value: void 0
483
- });
484
- _class_private_field_init(this, _offset, {
485
- writable: true,
486
- value: 0
487
- });
488
- _class_private_field_init(this, _emitUp, {
489
- writable: true,
490
- value: false
491
- });
492
- _class_private_field_init(this, _emitDown, {
493
- writable: true,
494
- value: false
495
- });
496
- _class_private_field_set(this, _start, start);
497
- _class_private_field_set(this, _end, end);
472
+ this.startIndex = startIndex;
473
+ this.endIndex = endIndex;
474
+ this.indexOffset = 0;
475
+ this.emitUp = false;
476
+ this.emitDown = false;
498
477
  }
499
478
  }
500
- function streamSlice(start = 0, end = Infinity) {
501
- return new SliceStream(start, end);
479
+ function streamSlice(startIndex = 0, endIndex = Infinity) {
480
+ return new SliceStream(startIndex, endIndex);
502
481
  }
503
482
 
504
483
  async function readableStreamToString(stream, encoding) {
@@ -2,10 +2,14 @@
2
2
  /// <reference types="node" />
3
3
  import { Transform, TransformCallback } from 'node:stream';
4
4
  declare class SliceStream extends Transform {
5
- #private;
6
- constructor(start?: number, end?: number);
5
+ private startIndex;
6
+ private endIndex;
7
+ private indexOffset;
8
+ private emitUp;
9
+ private emitDown;
10
+ constructor(startIndex?: number, endIndex?: number);
7
11
  _transform(chunk: any, _: BufferEncoding, done: TransformCallback): void;
8
12
  }
9
- export declare function streamSlice(start?: number, end?: number): SliceStream;
13
+ export declare function streamSlice(startIndex?: number, endIndex?: number): SliceStream;
10
14
  export {};
11
15
  //# sourceMappingURL=streamSlice.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"streamSlice.d.ts","sourceRoot":"","sources":["../../../../../src/adapters/node-http/content-type/form-data/streamSlice.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE3D,cAAM,WAAY,SAAQ,SAAS;;gBAOrB,KAAK,SAAI,EAAE,GAAG,SAAW;IAMrC,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI;CA+BzE;AAED,wBAAgB,WAAW,CAAC,KAAK,SAAI,EAAE,GAAG,SAAW,GAAG,WAAW,CAElE"}
1
+ {"version":3,"file":"streamSlice.d.ts","sourceRoot":"","sources":["../../../../../src/adapters/node-http/content-type/form-data/streamSlice.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE3D,cAAM,WAAY,SAAQ,SAAS;IAKrB,OAAO,CAAC,UAAU;IAAM,OAAO,CAAC,QAAQ;IAJpD,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAS;gBAEL,UAAU,SAAI,EAAU,QAAQ,SAAW;IAI/D,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI;CAiCzE;AAED,wBAAgB,WAAW,CAAC,UAAU,SAAI,EAAE,QAAQ,SAAW,GAAG,WAAW,CAE5E"}
@@ -2,14 +2,15 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var nodeHTTPRequestHandler = require('../../nodeHTTPRequestHandler-5bbf93f1.js');
6
- require('../../resolveHTTPResponse-9523b4e3.js');
7
- require('../../config-f3ce0144.js');
8
- require('../../TRPCError-16b2e52d.js');
5
+ var nodeHTTPRequestHandler = require('../../nodeHTTPRequestHandler-e637755a.js');
9
6
  require('../../index-4a823936.js');
10
7
  require('../../codes-0eeb600d.js');
8
+ require('../../resolveHTTPResponse-2c307e04.js');
9
+ require('../../config-f3ce0144.js');
10
+ require('../../TRPCError-16b2e52d.js');
11
11
  require('../../transformTRPCResponse-48d70ef6.js');
12
12
  require('../../contentType-8356d528.js');
13
+ require('../../batchStreamFormatter-93cdcdd4.js');
13
14
  require('./content-type/json/index.js');
14
15
  require('../../contentType-8c16408e.js');
15
16
 
@@ -1,10 +1,11 @@
1
- export { n as nodeHTTPRequestHandler } from '../../nodeHTTPRequestHandler-0f979796.mjs';
2
- import '../../resolveHTTPResponse-4e576698.mjs';
3
- import '../../config-65c5b6d1.mjs';
4
- import '../../TRPCError-2b10c8d2.mjs';
1
+ export { n as nodeHTTPRequestHandler } from '../../nodeHTTPRequestHandler-bdad2781.mjs';
5
2
  import '../../index-044a193b.mjs';
6
3
  import '../../codes-24aa1ce1.mjs';
4
+ import '../../resolveHTTPResponse-a9be3d96.mjs';
5
+ import '../../config-65c5b6d1.mjs';
6
+ import '../../TRPCError-2b10c8d2.mjs';
7
7
  import '../../transformTRPCResponse-3dca0b20.mjs';
8
8
  import '../../contentType-acc3be52.mjs';
9
+ import '../../batchStreamFormatter-fc1ffb26.mjs';
9
10
  import './content-type/json/index.mjs';
10
11
  import '../../contentType-3194ed5f.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"nodeHTTPRequestHandler.d.ts","sourceRoot":"","sources":["../../../src/adapters/node-http/nodeHTTPRequestHandler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAMvC,OAAO,EACL,eAAe,EACf,6BAA6B,EAC7B,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAIjB,wBAAsB,sBAAsB,CAC1C,OAAO,SAAS,SAAS,EACzB,QAAQ,SAAS,eAAe,EAChC,SAAS,SAAS,gBAAgB,EAClC,IAAI,EAAE,6BAA6B,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,iBA4ElE"}
1
+ {"version":3,"file":"nodeHTTPRequestHandler.d.ts","sourceRoot":"","sources":["../../../src/adapters/node-http/nodeHTTPRequestHandler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAOvC,OAAO,EACL,eAAe,EACf,6BAA6B,EAC7B,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAIjB,wBAAsB,sBAAsB,CAC1C,OAAO,SAAS,SAAS,EACzB,QAAQ,SAAS,eAAe,EAChC,SAAS,SAAS,gBAAgB,EAClC,IAAI,EAAE,6BAA6B,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,iBAkHlE"}
@@ -3,14 +3,15 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var http = require('node:http');
6
- var nodeHTTPRequestHandler = require('../nodeHTTPRequestHandler-5bbf93f1.js');
7
- require('../resolveHTTPResponse-9523b4e3.js');
8
- require('../config-f3ce0144.js');
9
- require('../TRPCError-16b2e52d.js');
6
+ var nodeHTTPRequestHandler = require('../nodeHTTPRequestHandler-e637755a.js');
10
7
  require('../index-4a823936.js');
11
8
  require('../codes-0eeb600d.js');
9
+ require('../resolveHTTPResponse-2c307e04.js');
10
+ require('../config-f3ce0144.js');
11
+ require('../TRPCError-16b2e52d.js');
12
12
  require('../transformTRPCResponse-48d70ef6.js');
13
13
  require('../contentType-8356d528.js');
14
+ require('../batchStreamFormatter-93cdcdd4.js');
14
15
  require('./node-http/content-type/json/index.js');
15
16
  require('../contentType-8c16408e.js');
16
17
 
@@ -1,12 +1,13 @@
1
1
  import http from 'node:http';
2
- import { n as nodeHTTPRequestHandler } from '../nodeHTTPRequestHandler-0f979796.mjs';
3
- import '../resolveHTTPResponse-4e576698.mjs';
4
- import '../config-65c5b6d1.mjs';
5
- import '../TRPCError-2b10c8d2.mjs';
2
+ import { n as nodeHTTPRequestHandler } from '../nodeHTTPRequestHandler-bdad2781.mjs';
6
3
  import '../index-044a193b.mjs';
7
4
  import '../codes-24aa1ce1.mjs';
5
+ import '../resolveHTTPResponse-a9be3d96.mjs';
6
+ import '../config-65c5b6d1.mjs';
7
+ import '../TRPCError-2b10c8d2.mjs';
8
8
  import '../transformTRPCResponse-3dca0b20.mjs';
9
9
  import '../contentType-acc3be52.mjs';
10
+ import '../batchStreamFormatter-fc1ffb26.mjs';
10
11
  import './node-http/content-type/json/index.mjs';
11
12
  import '../contentType-3194ed5f.mjs';
12
13
 
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Format a batch response as a line-delimited JSON stream
3
+ * that the `unstable_httpBatchStreamLink` can parse:
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * const formatter = getBatchStreamFormatter();
8
+ * res.send(formatter(1, 'response #2'));
9
+ * res.send(formatter(0, 'response #1'));
10
+ * res.send(formatter.end());
11
+ * ```
12
+ *
13
+ * Expected format:
14
+ * ```json
15
+ * {"1":"response #2"
16
+ * ,"0":"response #1"
17
+ * }
18
+ * ```
19
+ */
20
+ function getBatchStreamFormatter() {
21
+ let first = true;
22
+ function format(index, string) {
23
+ const prefix = first ? '{' : ',';
24
+ first = false;
25
+ return `${prefix}"${index}":${string}\n`;
26
+ }
27
+ format.end = () => '}';
28
+ return format;
29
+ }
30
+
31
+ export { getBatchStreamFormatter as g };
@@ -0,0 +1,32 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Format a batch response as a line-delimited JSON stream
5
+ * that the `unstable_httpBatchStreamLink` can parse:
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const formatter = getBatchStreamFormatter();
10
+ * res.send(formatter(1, 'response #2'));
11
+ * res.send(formatter(0, 'response #1'));
12
+ * res.send(formatter.end());
13
+ * ```
14
+ *
15
+ * Expected format:
16
+ * ```json
17
+ * {"1":"response #2"
18
+ * ,"0":"response #1"
19
+ * }
20
+ * ```
21
+ */ function getBatchStreamFormatter() {
22
+ let first = true;
23
+ function format(index, string) {
24
+ const prefix = first ? '{' : ',';
25
+ first = false;
26
+ return `${prefix}"${index}":${string}\n`;
27
+ }
28
+ format.end = ()=>'}';
29
+ return format;
30
+ }
31
+
32
+ exports.getBatchStreamFormatter = getBatchStreamFormatter;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Format a batch response as a line-delimited JSON stream
3
+ * that the `unstable_httpBatchStreamLink` can parse:
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * const formatter = getBatchStreamFormatter();
8
+ * res.send(formatter(1, 'response #2'));
9
+ * res.send(formatter(0, 'response #1'));
10
+ * res.send(formatter.end());
11
+ * ```
12
+ *
13
+ * Expected format:
14
+ * ```json
15
+ * {"1":"response #2"
16
+ * ,"0":"response #1"
17
+ * }
18
+ * ```
19
+ */ function getBatchStreamFormatter() {
20
+ let first = true;
21
+ function format(index, string) {
22
+ const prefix = first ? '{' : ',';
23
+ first = false;
24
+ return `${prefix}"${index}":${string}\n`;
25
+ }
26
+ format.end = ()=>'}';
27
+ return format;
28
+ }
29
+
30
+ export { getBatchStreamFormatter as g };
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Format a batch response as a line-delimited JSON stream
3
+ * that the `unstable_httpBatchStreamLink` can parse:
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * const formatter = getBatchStreamFormatter();
8
+ * res.send(formatter(1, 'response #2'));
9
+ * res.send(formatter(0, 'response #1'));
10
+ * res.send(formatter.end());
11
+ * ```
12
+ *
13
+ * Expected format:
14
+ * ```json
15
+ * {"1":"response #2"
16
+ * ,"0":"response #1"
17
+ * }
18
+ * ```
19
+ */
20
+ export declare function getBatchStreamFormatter(): {
21
+ (index: number, string: string): string;
22
+ end(): string;
23
+ };
24
+ //# sourceMappingURL=batchStreamFormatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batchStreamFormatter.d.ts","sourceRoot":"","sources":["../../src/http/batchStreamFormatter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,uBAAuB;YAEd,MAAM,UAAU,MAAM;;EAO9C"}
@@ -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';
@@ -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,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;;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,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,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,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