@trpc/server 10.28.2 → 10.29.1

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 (56) 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 +51 -15
  8. package/dist/adapters/fastify/index.mjs +51 -15
  9. package/dist/adapters/fetch/fetchRequestHandler.d.ts.map +1 -1
  10. package/dist/adapters/fetch/index.js +67 -20
  11. package/dist/adapters/fetch/index.mjs +67 -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/node-http/types.d.ts +11 -1
  22. package/dist/adapters/node-http/types.d.ts.map +1 -1
  23. package/dist/adapters/standalone.js +5 -4
  24. package/dist/adapters/standalone.mjs +5 -4
  25. package/dist/batchStreamFormatter-2c1405a1.js +31 -0
  26. package/dist/batchStreamFormatter-93cdcdd4.js +32 -0
  27. package/dist/batchStreamFormatter-fc1ffb26.mjs +30 -0
  28. package/dist/http/batchStreamFormatter.d.ts +24 -0
  29. package/dist/http/batchStreamFormatter.d.ts.map +1 -0
  30. package/dist/http/index.d.ts +1 -0
  31. package/dist/http/index.d.ts.map +1 -1
  32. package/dist/http/index.js +3 -1
  33. package/dist/http/index.mjs +2 -1
  34. package/dist/http/internals/types.d.ts +7 -0
  35. package/dist/http/internals/types.d.ts.map +1 -1
  36. package/dist/http/resolveHTTPResponse.d.ts +37 -2
  37. package/dist/http/resolveHTTPResponse.d.ts.map +1 -1
  38. package/dist/{nodeHTTPRequestHandler-5bbf93f1.js → nodeHTTPRequestHandler-071d36b5.js} +44 -13
  39. package/dist/{nodeHTTPRequestHandler-bd47641d.js → nodeHTTPRequestHandler-51d58a23.js} +47 -12
  40. package/dist/{nodeHTTPRequestHandler-0f979796.mjs → nodeHTTPRequestHandler-bb12529f.mjs} +44 -13
  41. package/dist/resolveHTTPResponse-1f03fdfd.js +284 -0
  42. package/dist/resolveHTTPResponse-dd3677b3.mjs +282 -0
  43. package/dist/resolveHTTPResponse-e0047ea2.js +256 -0
  44. package/package.json +4 -4
  45. package/src/adapters/fastify/fastifyRequestHandler.ts +65 -17
  46. package/src/adapters/fetch/fetchRequestHandler.ts +73 -25
  47. package/src/adapters/node-http/content-type/form-data/streamSlice.ts +19 -21
  48. package/src/adapters/node-http/nodeHTTPRequestHandler.ts +53 -12
  49. package/src/adapters/node-http/types.ts +11 -1
  50. package/src/http/batchStreamFormatter.ts +29 -0
  51. package/src/http/index.ts +1 -0
  52. package/src/http/internals/types.ts +8 -0
  53. package/src/http/resolveHTTPResponse.ts +339 -124
  54. package/dist/resolveHTTPResponse-4e576698.mjs +0 -174
  55. package/dist/resolveHTTPResponse-9523b4e3.js +0 -176
  56. 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-071d36b5.js');
9
6
  require('../../index-4a823936.js');
10
7
  require('../../codes-0eeb600d.js');
8
+ require('../../resolveHTTPResponse-1f03fdfd.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-bb12529f.mjs';
5
2
  import '../../index-044a193b.mjs';
6
3
  import '../../codes-24aa1ce1.mjs';
4
+ import '../../resolveHTTPResponse-dd3677b3.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,iBAoHlE"}
@@ -11,7 +11,17 @@ export type NodeHTTPRequest = IncomingMessage & {
11
11
  query?: ParsedQs;
12
12
  body?: unknown;
13
13
  };
14
- export type NodeHTTPResponse = ServerResponse;
14
+ export type NodeHTTPResponse = ServerResponse & {
15
+ /**
16
+ * Force the partially-compressed response to be flushed to the client.
17
+ *
18
+ * Added by compression middleware
19
+ * (depending on the environment,
20
+ * e.g. Next <= 12,
21
+ * e.g. Express w/ `compression()`)
22
+ */
23
+ flush?: () => void;
24
+ };
15
25
  export type NodeHTTPCreateContextOption<TRouter extends AnyRouter, TRequest, TResponse> = object extends inferRouterContext<TRouter> ? {
16
26
  /**
17
27
  * @link https://trpc.io/docs/context
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/node-http/types.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE,UAAU,QAAQ;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,QAAQ,GAAG,QAAQ,EAAE,CAAC;CACtE;AAED,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG;IAC9C,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AACF,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAE9C,MAAM,MAAM,2BAA2B,CACrC,OAAO,SAAS,SAAS,EACzB,QAAQ,EACR,SAAS,IACP,MAAM,SAAS,kBAAkB,CAAC,OAAO,CAAC,GAC1C;IACE;;QAEI;IACJ,aAAa,CAAC,EAAE,uBAAuB,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;CACvE,GACD;IACE;;QAEI;IACJ,aAAa,EAAE,uBAAuB,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;CACtE,CAAC;AAEN;;GAEG;AACH,UAAU,iBAAiB,CACzB,QAAQ,SAAS,eAAe,GAAG,eAAe,EAClD,SAAS,SAAS,gBAAgB,GAAG,gBAAgB;IAErD,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,GAAG,GAAG,IAAI,CAAC;CACjE;AAED,MAAM,MAAM,sBAAsB,CAChC,OAAO,SAAS,SAAS,EACzB,QAAQ,SAAS,eAAe,EAChC,SAAS,SAAS,gBAAgB,IAChC,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG;IAC9C;;;;;;;;;;;;;;;OAeG;IACH,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gCAAgC,CAAC,EAAE,0BAA0B,CAC3D,QAAQ,EACR,SAAS,CACV,EAAE,CAAC;CACL,GAAG,2BAA2B,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAE9D,MAAM,MAAM,6BAA6B,CACvC,OAAO,SAAS,SAAS,EACzB,QAAQ,SAAS,eAAe,EAChC,SAAS,SAAS,gBAAgB,IAChC;IACF,GAAG,EAAE,QAAQ,CAAC;IACd,GAAG,EAAE,SAAS,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,sBAAsB,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAEzD,MAAM,MAAM,8BAA8B,CAAC,QAAQ,EAAE,SAAS,IAAI;IAChE,GAAG,EAAE,QAAQ,CAAC;IACd,GAAG,EAAE,SAAS,CAAC;CAChB,CAAC;AACF,MAAM,MAAM,uBAAuB,CACjC,OAAO,SAAS,SAAS,EACzB,QAAQ,EACR,SAAS,IACP,CACF,IAAI,EAAE,8BAA8B,CAAC,QAAQ,EAAE,SAAS,CAAC,KACtD,YAAY,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/node-http/types.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE,UAAU,QAAQ;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,QAAQ,GAAG,QAAQ,EAAE,CAAC;CACtE;AAED,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG;IAC9C,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AACF,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG;IAC9C;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,2BAA2B,CACrC,OAAO,SAAS,SAAS,EACzB,QAAQ,EACR,SAAS,IACP,MAAM,SAAS,kBAAkB,CAAC,OAAO,CAAC,GAC1C;IACE;;QAEI;IACJ,aAAa,CAAC,EAAE,uBAAuB,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;CACvE,GACD;IACE;;QAEI;IACJ,aAAa,EAAE,uBAAuB,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;CACtE,CAAC;AAEN;;GAEG;AACH,UAAU,iBAAiB,CACzB,QAAQ,SAAS,eAAe,GAAG,eAAe,EAClD,SAAS,SAAS,gBAAgB,GAAG,gBAAgB;IAErD,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,GAAG,GAAG,IAAI,CAAC;CACjE;AAED,MAAM,MAAM,sBAAsB,CAChC,OAAO,SAAS,SAAS,EACzB,QAAQ,SAAS,eAAe,EAChC,SAAS,SAAS,gBAAgB,IAChC,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG;IAC9C;;;;;;;;;;;;;;;OAeG;IACH,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gCAAgC,CAAC,EAAE,0BAA0B,CAC3D,QAAQ,EACR,SAAS,CACV,EAAE,CAAC;CACL,GAAG,2BAA2B,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAE9D,MAAM,MAAM,6BAA6B,CACvC,OAAO,SAAS,SAAS,EACzB,QAAQ,SAAS,eAAe,EAChC,SAAS,SAAS,gBAAgB,IAChC;IACF,GAAG,EAAE,QAAQ,CAAC;IACd,GAAG,EAAE,SAAS,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,sBAAsB,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAEzD,MAAM,MAAM,8BAA8B,CAAC,QAAQ,EAAE,SAAS,IAAI;IAChE,GAAG,EAAE,QAAQ,CAAC;IACd,GAAG,EAAE,SAAS,CAAC;CAChB,CAAC;AACF,MAAM,MAAM,uBAAuB,CACjC,OAAO,SAAS,SAAS,EACzB,QAAQ,EACR,SAAS,IACP,CACF,IAAI,EAAE,8BAA8B,CAAC,QAAQ,EAAE,SAAS,CAAC,KACtD,YAAY,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC"}
@@ -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-071d36b5.js');
10
7
  require('../index-4a823936.js');
11
8
  require('../codes-0eeb600d.js');
9
+ require('../resolveHTTPResponse-1f03fdfd.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-bb12529f.mjs';
6
3
  import '../index-044a193b.mjs';
7
4
  import '../codes-24aa1ce1.mjs';
5
+ import '../resolveHTTPResponse-dd3677b3.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-1f03fdfd.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-dd3677b3.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,CAAC,EAAE,OAAO,CAAC;CAC3B,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,42 @@ 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
+ * When streaming, headers will have been generated
17
+ * **without** knowing the response body.
18
+ *
19
+ * Without this callback, streaming is disabled.
20
+ */
21
+ unstable_onHead: (headResponse: Omit<HTTPResponse, 'body'>, isStreaming: boolean) => void;
22
+ /**
23
+ * Called for every procedure with `[index, result]`.
24
+ *
25
+ * Will be called a single time with `index = -1` if
26
+ * - response is an error
27
+ * - response is empty (HEAD request)
28
+ *
29
+ * Without this callback, streaming is disabled.
30
+ */
31
+ unstable_onChunk: (chunk: ResponseChunk) => void;
14
32
  }
15
- export declare function resolveHTTPResponse<TRouter extends AnyRouter, TRequest extends HTTPRequest>(opts: ResolveHTTPRequestOptions<TRouter, TRequest>): Promise<HTTPResponse>;
33
+ /**
34
+ * Since `resolveHTTPResponse` is a public API (community adapters),
35
+ * let's give it a strong type signature to increase discoverability.
36
+ */
37
+ /**
38
+ * Non-streaming signature for `resolveHTTPResponse`:
39
+ * @param opts.unstable_onHead `undefined`
40
+ * @param opts.unstable_onChunk `undefined`
41
+ * @returns `Promise<HTTPResponse>`
42
+ */
43
+ export declare function resolveHTTPResponse<TRouter extends AnyRouter, TRequest extends HTTPRequest>(opts: Omit<ResolveHTTPRequestOptions<TRouter, TRequest>, 'unstable_onHead' | 'unstable_onChunk'>): Promise<HTTPResponse>;
44
+ /**
45
+ * Streaming signature for `resolveHTTPResponse`:
46
+ * @param opts.unstable_onHead called as soon as the response head is known
47
+ * @param opts.unstable_onChunk called for every procedure with `[index, result]`
48
+ * @returns `Promise<void>` since the response is streamed
49
+ */
50
+ export declare function resolveHTTPResponse<TRouter extends AnyRouter, TRequest extends HTTPRequest>(opts: ResolveHTTPRequestOptions<TRouter, TRequest>): Promise<void>;
16
51
  export {};
17
52
  //# 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;;;;;;OAMG;IACH,eAAe,EAAE,CACf,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,EACxC,WAAW,EAAE,OAAO,KACjB,IAAI,CAAC;IACV;;;;;;;;OAQG;IACH,gBAAgB,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAClD;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,iBAAiB,GAAG,kBAAkB,CACvC,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,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-1f03fdfd.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,40 @@ async function nodeHTTPRequestHandler(opts) {
31
33
  query,
32
34
  body: bodyResult.ok ? bodyResult.data : undefined
33
35
  };
34
- const result = await resolveHTTPResponse.resolveHTTPResponse({
36
+ let isStream = false;
37
+ let formatter;
38
+ const unstable_onHead = (head, isStreaming)=>{
39
+ if ('status' in head && (!opts.res.statusCode || opts.res.statusCode === 200)) {
40
+ opts.res.statusCode = head.status;
41
+ }
42
+ for (const [key, value] of Object.entries(head.headers ?? {})){
43
+ /* istanbul ignore if -- @preserve */ if (typeof value === 'undefined') {
44
+ continue;
45
+ }
46
+ opts.res.setHeader(key, value);
47
+ }
48
+ if (isStreaming) {
49
+ opts.res.setHeader('Transfer-Encoding', 'chunked');
50
+ const vary = opts.res.getHeader('Vary');
51
+ opts.res.setHeader('Vary', vary ? 'trpc-batch-mode, ' + vary : 'trpc-batch-mode');
52
+ isStream = true;
53
+ formatter = batchStreamFormatter.getBatchStreamFormatter();
54
+ opts.res.flushHeaders();
55
+ }
56
+ };
57
+ const unstable_onChunk = ([index, string])=>{
58
+ if (index === -1) {
59
+ /**
60
+ * Full response, no streaming. This can happen
61
+ * - if the response is an error
62
+ * - if response is empty (HEAD request)
63
+ */ opts.res.end(string);
64
+ } else {
65
+ opts.res.write(formatter(index, string));
66
+ opts.res.flush?.();
67
+ }
68
+ };
69
+ await resolveHTTPResponse.resolveHTTPResponse({
35
70
  batching: opts.batching,
36
71
  responseMeta: opts.responseMeta,
37
72
  path: opts.path,
@@ -46,19 +81,15 @@ async function nodeHTTPRequestHandler(opts) {
46
81
  req: opts.req
47
82
  });
48
83
  },
49
- contentTypeHandler
84
+ contentTypeHandler,
85
+ unstable_onHead,
86
+ unstable_onChunk
50
87
  });
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);
88
+ if (isStream) {
89
+ opts.res.write(formatter.end());
90
+ opts.res.end();
60
91
  }
61
- res.end(result.body);
92
+ return opts.res;
62
93
  });
63
94
  }
64
95
 
@@ -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-e0047ea2.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,44 @@ async function nodeHTTPRequestHandler(opts) {
33
35
  query,
34
36
  body: bodyResult.ok ? bodyResult.data : undefined,
35
37
  };
36
- const result = await resolveHTTPResponse({
38
+ let isStream = false;
39
+ let formatter;
40
+ const unstable_onHead = (head, isStreaming) => {
41
+ if ('status' in head &&
42
+ (!opts.res.statusCode || opts.res.statusCode === 200)) {
43
+ opts.res.statusCode = head.status;
44
+ }
45
+ for (const [key, value] of Object.entries(head.headers ?? {})) {
46
+ /* istanbul ignore if -- @preserve */
47
+ if (typeof value === 'undefined') {
48
+ continue;
49
+ }
50
+ opts.res.setHeader(key, value);
51
+ }
52
+ if (isStreaming) {
53
+ opts.res.setHeader('Transfer-Encoding', 'chunked');
54
+ const vary = opts.res.getHeader('Vary');
55
+ opts.res.setHeader('Vary', vary ? 'trpc-batch-mode, ' + vary : 'trpc-batch-mode');
56
+ isStream = true;
57
+ formatter = getBatchStreamFormatter();
58
+ opts.res.flushHeaders();
59
+ }
60
+ };
61
+ const unstable_onChunk = ([index, string]) => {
62
+ if (index === -1) {
63
+ /**
64
+ * Full response, no streaming. This can happen
65
+ * - if the response is an error
66
+ * - if response is empty (HEAD request)
67
+ */
68
+ opts.res.end(string);
69
+ }
70
+ else {
71
+ opts.res.write(formatter(index, string));
72
+ opts.res.flush?.();
73
+ }
74
+ };
75
+ await resolveHTTPResponse({
37
76
  batching: opts.batching,
38
77
  responseMeta: opts.responseMeta,
39
78
  path: opts.path,
@@ -49,18 +88,14 @@ async function nodeHTTPRequestHandler(opts) {
49
88
  });
50
89
  },
51
90
  contentTypeHandler,
91
+ unstable_onHead,
92
+ unstable_onChunk,
52
93
  });
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);
94
+ if (isStream) {
95
+ opts.res.write(formatter.end());
96
+ opts.res.end();
62
97
  }
63
- res.end(result.body);
98
+ return opts.res;
64
99
  });
65
100
  }
66
101