@trpc/server 11.0.0-rc.630 → 11.0.0-rc.632

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 (101) hide show
  1. package/dist/@trpc/server/http.d.ts +1 -1
  2. package/dist/@trpc/server/http.d.ts.map +1 -1
  3. package/dist/adapters/aws-lambda/index.js +1 -0
  4. package/dist/adapters/aws-lambda/index.mjs +1 -0
  5. package/dist/adapters/express.js +1 -0
  6. package/dist/adapters/express.mjs +1 -0
  7. package/dist/adapters/fastify/fastifyRequestHandler.js +2 -1
  8. package/dist/adapters/fastify/fastifyRequestHandler.mjs +2 -1
  9. package/dist/adapters/fetch/fetchRequestHandler.js +1 -0
  10. package/dist/adapters/fetch/fetchRequestHandler.mjs +1 -0
  11. package/dist/adapters/next-app-dir/nextAppDirCaller.js +1 -0
  12. package/dist/adapters/next-app-dir/nextAppDirCaller.mjs +1 -0
  13. package/dist/adapters/next-app-dir/notFound.js +1 -0
  14. package/dist/adapters/next-app-dir/notFound.mjs +1 -0
  15. package/dist/adapters/next-app-dir/redirect.js +1 -0
  16. package/dist/adapters/next-app-dir/redirect.mjs +1 -0
  17. package/dist/adapters/next.js +1 -0
  18. package/dist/adapters/next.mjs +1 -0
  19. package/dist/adapters/node-http/incomingMessageToRequest.d.ts +1 -1
  20. package/dist/adapters/node-http/incomingMessageToRequest.d.ts.map +1 -1
  21. package/dist/adapters/node-http/incomingMessageToRequest.js +7 -5
  22. package/dist/adapters/node-http/incomingMessageToRequest.mjs +7 -5
  23. package/dist/adapters/node-http/nodeHTTPRequestHandler.d.ts.map +1 -1
  24. package/dist/adapters/node-http/nodeHTTPRequestHandler.js +9 -42
  25. package/dist/adapters/node-http/nodeHTTPRequestHandler.mjs +9 -42
  26. package/dist/adapters/node-http/writeResponse.d.ts +18 -0
  27. package/dist/adapters/node-http/writeResponse.d.ts.map +1 -0
  28. package/dist/adapters/node-http/writeResponse.js +85 -0
  29. package/dist/adapters/node-http/writeResponse.mjs +82 -0
  30. package/dist/adapters/standalone.js +1 -0
  31. package/dist/adapters/standalone.mjs +1 -0
  32. package/dist/adapters/ws.js +2 -1
  33. package/dist/adapters/ws.mjs +2 -1
  34. package/dist/bundle-analysis.json +146 -119
  35. package/dist/http.js +1 -2
  36. package/dist/http.mjs +1 -1
  37. package/dist/index.js +2 -1
  38. package/dist/index.mjs +2 -1
  39. package/dist/rpc.js +1 -0
  40. package/dist/rpc.mjs +1 -0
  41. package/dist/shared.js +1 -0
  42. package/dist/shared.mjs +1 -0
  43. package/dist/unstable-core-do-not-import/http/isAbortError.d.ts +4 -0
  44. package/dist/unstable-core-do-not-import/http/isAbortError.d.ts.map +1 -0
  45. package/dist/unstable-core-do-not-import/http/isAbortError.js +9 -0
  46. package/dist/unstable-core-do-not-import/http/isAbortError.mjs +7 -0
  47. package/dist/unstable-core-do-not-import/stream/jsonl.d.ts +6 -9
  48. package/dist/unstable-core-do-not-import/stream/jsonl.d.ts.map +1 -1
  49. package/dist/unstable-core-do-not-import/stream/jsonl.js +75 -124
  50. package/dist/unstable-core-do-not-import/stream/jsonl.mjs +76 -125
  51. package/dist/unstable-core-do-not-import/stream/sse.d.ts.map +1 -1
  52. package/dist/unstable-core-do-not-import/stream/sse.js +25 -21
  53. package/dist/unstable-core-do-not-import/stream/sse.mjs +26 -22
  54. package/dist/unstable-core-do-not-import/stream/utils/asyncIterable.d.ts +10 -10
  55. package/dist/unstable-core-do-not-import/stream/utils/asyncIterable.d.ts.map +1 -1
  56. package/dist/unstable-core-do-not-import/stream/utils/asyncIterable.js +47 -34
  57. package/dist/unstable-core-do-not-import/stream/utils/asyncIterable.mjs +47 -34
  58. package/dist/unstable-core-do-not-import/stream/utils/createReadableStream.d.ts +0 -4
  59. package/dist/unstable-core-do-not-import/stream/utils/createReadableStream.d.ts.map +1 -1
  60. package/dist/unstable-core-do-not-import/stream/utils/createReadableStream.js +0 -11
  61. package/dist/unstable-core-do-not-import/stream/utils/createReadableStream.mjs +1 -11
  62. package/dist/unstable-core-do-not-import/stream/utils/disposablePromiseTimer.d.ts +6 -0
  63. package/dist/unstable-core-do-not-import/stream/utils/disposablePromiseTimer.d.ts.map +1 -0
  64. package/dist/unstable-core-do-not-import/stream/utils/disposablePromiseTimer.js +28 -0
  65. package/dist/unstable-core-do-not-import/stream/utils/disposablePromiseTimer.mjs +25 -0
  66. package/dist/unstable-core-do-not-import/stream/utils/withPing.d.ts.map +1 -1
  67. package/dist/unstable-core-do-not-import/stream/utils/withPing.js +17 -17
  68. package/dist/unstable-core-do-not-import/stream/utils/withPing.mjs +17 -17
  69. package/dist/unstable-core-do-not-import/stream/utils/withRefCount.d.ts +17 -0
  70. package/dist/unstable-core-do-not-import/stream/utils/withRefCount.d.ts.map +1 -0
  71. package/dist/unstable-core-do-not-import/stream/utils/withRefCount.js +59 -0
  72. package/dist/unstable-core-do-not-import/stream/utils/withRefCount.mjs +57 -0
  73. package/dist/unstable-core-do-not-import.d.ts +2 -2
  74. package/dist/unstable-core-do-not-import.d.ts.map +1 -1
  75. package/dist/unstable-core-do-not-import.js +2 -2
  76. package/dist/unstable-core-do-not-import.mjs +1 -1
  77. package/package.json +3 -3
  78. package/src/@trpc/server/http.ts +0 -1
  79. package/src/adapters/fastify/fastifyRequestHandler.ts +1 -1
  80. package/src/adapters/node-http/incomingMessageToRequest.ts +8 -4
  81. package/src/adapters/node-http/nodeHTTPRequestHandler.ts +8 -46
  82. package/src/adapters/node-http/writeResponse.ts +96 -0
  83. package/src/unstable-core-do-not-import/http/isAbortError.ts +7 -0
  84. package/src/unstable-core-do-not-import/stream/jsonl.ts +85 -154
  85. package/src/unstable-core-do-not-import/stream/sse.ts +24 -25
  86. package/src/unstable-core-do-not-import/stream/utils/asyncIterable.ts +58 -37
  87. package/src/unstable-core-do-not-import/stream/utils/createReadableStream.ts +0 -13
  88. package/src/unstable-core-do-not-import/stream/utils/disposablePromiseTimer.ts +27 -0
  89. package/src/unstable-core-do-not-import/stream/utils/withPing.ts +31 -19
  90. package/src/unstable-core-do-not-import/stream/utils/withRefCount.ts +93 -0
  91. package/src/unstable-core-do-not-import.ts +2 -2
  92. package/dist/unstable-core-do-not-import/http/batchStreamFormatter.d.ts +0 -24
  93. package/dist/unstable-core-do-not-import/http/batchStreamFormatter.d.ts.map +0 -1
  94. package/dist/unstable-core-do-not-import/http/batchStreamFormatter.js +0 -32
  95. package/dist/unstable-core-do-not-import/http/batchStreamFormatter.mjs +0 -30
  96. package/dist/unstable-core-do-not-import/stream/utils/promiseTimer.d.ts +0 -8
  97. package/dist/unstable-core-do-not-import/stream/utils/promiseTimer.d.ts.map +0 -1
  98. package/dist/unstable-core-do-not-import/stream/utils/promiseTimer.js +0 -38
  99. package/dist/unstable-core-do-not-import/stream/utils/promiseTimer.mjs +0 -36
  100. package/src/unstable-core-do-not-import/http/batchStreamFormatter.ts +0 -29
  101. package/src/unstable-core-do-not-import/stream/utils/promiseTimer.ts +0 -40
@@ -1,11 +1,10 @@
1
1
  'use strict';
2
2
 
3
3
  var _define_property = require('../../node_modules/.pnpm/@swc_helpers@0.5.13/node_modules/@swc/helpers/esm/_define_property.js');
4
- var unpromise = require('../../vendor/unpromise/unpromise.js');
5
- var TRPCError = require('../error/TRPCError.js');
6
4
  var utils = require('../utils.js');
7
5
  var createDeferred = require('./utils/createDeferred.js');
8
6
  var createReadableStream = require('./utils/createReadableStream.js');
7
+ var withRefCount = require('./utils/withRefCount.js');
9
8
 
10
9
  // ---------- types
11
10
  const CHUNK_VALUE_TYPE_PROMISE = 0;
@@ -28,41 +27,43 @@ function createBatchStreamProducer(opts) {
28
27
  let counter = 0;
29
28
  const placeholder = 0;
30
29
  const stream = createReadableStream.createReadableStream();
31
- const pending = new Set();
32
- function maybeClose() {
33
- if (pending.size === 0 && !stream.cancelled()) {
30
+ const pending = withRefCount.withRefCount(new Set(), ()=>{
31
+ if (!stream.cancelled()) {
34
32
  stream.controller.close();
35
33
  }
36
- }
37
- function dehydratePromise(promise, path) {
38
- //
34
+ });
35
+ const maybeEnqueue = (chunk)=>{
36
+ if (!stream.cancelled()) {
37
+ stream.controller.enqueue(chunk);
38
+ }
39
+ };
40
+ function encodePromise(promise, path) {
39
41
  const error = checkMaxDepth(path);
40
42
  if (error) {
41
- promise.catch(()=>{
42
- // ignore
43
+ // Catch any errors from the original promise to ensure they're reported
44
+ promise.catch((cause)=>{
45
+ opts.onError?.({
46
+ error: cause,
47
+ path
48
+ });
43
49
  });
50
+ // Replace the promise with a rejected one containing the max depth error
44
51
  promise = Promise.reject(error);
45
52
  }
46
53
  const idx = counter++;
47
54
  pending.add(idx);
48
- unpromise.Unpromise.race([
49
- promise,
50
- stream.cancelledPromise
51
- ]).then((it)=>{
52
- if (createReadableStream.isCancelledStreamResult(it)) {
53
- return;
54
- }
55
- stream.controller.enqueue([
55
+ promise.then((it)=>{
56
+ maybeEnqueue([
56
57
  idx,
57
58
  PROMISE_STATUS_FULFILLED,
58
- dehydrate(it, path)
59
+ encode(it, path)
59
60
  ]);
60
61
  }).catch((cause)=>{
61
62
  opts.onError?.({
62
63
  error: cause,
63
64
  path
64
65
  });
65
- stream.controller.enqueue([
66
+ maybeEnqueue([
66
67
  idx,
67
68
  PROMISE_STATUS_REJECTED,
68
69
  opts.formatError?.({
@@ -72,73 +73,53 @@ function createBatchStreamProducer(opts) {
72
73
  ]);
73
74
  }).finally(()=>{
74
75
  pending.delete(idx);
75
- maybeClose();
76
76
  });
77
77
  return idx;
78
78
  }
79
- function dehydrateAsyncIterable(iterable, path) {
80
- const error = checkMaxDepth(path);
81
- if (error) {
82
- iterable = {
83
- [Symbol.asyncIterator] () {
84
- throw error;
85
- }
86
- };
87
- }
79
+ function encodeAsyncIterable(iterable, path) {
88
80
  const idx = counter++;
89
81
  pending.add(idx);
90
82
  utils.run(async ()=>{
83
+ const error = checkMaxDepth(path);
84
+ if (error) {
85
+ throw error;
86
+ }
91
87
  const iterator = iterable[Symbol.asyncIterator]();
92
88
  while(true){
93
- const next = await unpromise.Unpromise.race([
94
- iterator.next().catch(TRPCError.getTRPCErrorFromUnknown),
95
- stream.cancelledPromise
96
- ]);
97
- if (next instanceof Error) {
98
- opts.onError?.({
99
- error: next,
100
- path
101
- });
102
- stream.controller.enqueue([
103
- idx,
104
- ASYNC_ITERABLE_STATUS_ERROR,
105
- opts.formatError?.({
106
- error: next,
107
- path
108
- })
109
- ]);
110
- return;
111
- }
112
- if (createReadableStream.isCancelledStreamResult(next)) {
113
- await iterator.return?.();
114
- break;
89
+ if (stream.cancelled()) {
90
+ const res = await iterator.return?.();
91
+ return res?.value;
115
92
  }
93
+ const next = await iterator.next();
116
94
  if (next.done) {
117
- stream.controller.enqueue([
95
+ maybeEnqueue([
118
96
  idx,
119
97
  ASYNC_ITERABLE_STATUS_RETURN,
120
- dehydrate(next.value, path)
98
+ encode(next.value, path)
121
99
  ]);
122
100
  break;
123
101
  }
124
- stream.controller.enqueue([
102
+ maybeEnqueue([
125
103
  idx,
126
104
  ASYNC_ITERABLE_STATUS_VALUE,
127
- dehydrate(next.value, path)
105
+ encode(next.value, path)
128
106
  ]);
129
107
  }
130
- pending.delete(idx);
131
- maybeClose();
132
108
  }).catch((cause)=>{
133
- // this shouldn't happen, but node crashes if we don't catch it
134
109
  opts.onError?.({
135
- error: new Error('You found a bug - please report it on https://github.com/trpc/trpc', // eslint-disable-next-line @typescript-eslint/ban-ts-comment
136
- // @ts-ignore https://github.com/tc39/proposal-error-cause
137
- {
138
- cause
139
- }),
110
+ error: cause,
140
111
  path
141
112
  });
113
+ maybeEnqueue([
114
+ idx,
115
+ ASYNC_ITERABLE_STATUS_ERROR,
116
+ opts.formatError?.({
117
+ error: cause,
118
+ path
119
+ })
120
+ ]);
121
+ }).finally(()=>{
122
+ pending.delete(idx);
142
123
  });
143
124
  return idx;
144
125
  }
@@ -148,11 +129,11 @@ function createBatchStreamProducer(opts) {
148
129
  }
149
130
  return null;
150
131
  }
151
- function dehydrateAsync(value, path) {
132
+ function encodeAsync(value, path) {
152
133
  if (isPromise(value)) {
153
134
  return [
154
135
  CHUNK_VALUE_TYPE_PROMISE,
155
- dehydratePromise(value, path)
136
+ encodePromise(value, path)
156
137
  ];
157
138
  }
158
139
  if (utils.isAsyncIterable(value)) {
@@ -161,12 +142,12 @@ function createBatchStreamProducer(opts) {
161
142
  }
162
143
  return [
163
144
  CHUNK_VALUE_TYPE_ASYNC_ITERABLE,
164
- dehydrateAsyncIterable(value, path)
145
+ encodeAsyncIterable(value, path)
165
146
  ];
166
147
  }
167
148
  return null;
168
149
  }
169
- function dehydrate(value, path) {
150
+ function encode(value, path) {
170
151
  if (value === undefined) {
171
152
  return [
172
153
  []
@@ -179,7 +160,7 @@ function createBatchStreamProducer(opts) {
179
160
  ]
180
161
  ];
181
162
  }
182
- const reg = dehydrateAsync(value, path);
163
+ const reg = encodeAsync(value, path);
183
164
  if (reg) {
184
165
  return [
185
166
  [
@@ -194,7 +175,7 @@ function createBatchStreamProducer(opts) {
194
175
  const newObj = {};
195
176
  const asyncValues = [];
196
177
  for (const [key, item] of Object.entries(value)){
197
- const transformed = dehydrateAsync(item, [
178
+ const transformed = encodeAsync(item, [
198
179
  ...path,
199
180
  key
200
181
  ]);
@@ -217,10 +198,11 @@ function createBatchStreamProducer(opts) {
217
198
  }
218
199
  const newHead = {};
219
200
  for (const [key, item] of Object.entries(data)){
220
- newHead[key] = dehydrate(item, [
201
+ newHead[key] = encode(item, [
221
202
  key
222
203
  ]);
223
204
  }
205
+ pending.activate();
224
206
  return [
225
207
  newHead,
226
208
  stream.readable
@@ -336,34 +318,19 @@ function createConsumerStream(from) {
336
318
  }));
337
319
  }
338
320
  let headDeferred = createDeferred.createDeferred();
339
- const chunkDeferred = new Map();
340
- const controllers = new Map();
341
- const maybeAbort = ()=>{
342
- if (chunkDeferred.size === 0 && Array.from(controllers.values()).every((it)=>it.returned)) {
343
- // nothing is listening to the stream anymore
344
- opts.abortController?.abort();
345
- }
346
- };
347
- function hydrateChunkDefinition(value) {
321
+ const controllers = withRefCount.withRefCount(new Map(), ()=>{
322
+ opts.abortController?.abort();
323
+ });
324
+ function decodeChunkDefinition(value) {
348
325
  const [_path, type, chunkId] = value;
349
- const { readable, controller } = createReadableStream.createReadableStream();
350
- const wrapper = {
351
- controller,
352
- returned: false
353
- };
354
- controllers.set(chunkId, wrapper);
355
- // resolve chunk deferred if it exists
356
- const deferred = chunkDeferred.get(chunkId);
357
- if (deferred) {
358
- deferred.resolve(wrapper);
359
- chunkDeferred.delete(chunkId);
360
- }
326
+ const stream = createReadableStream.createReadableStream();
327
+ controllers.set(chunkId, stream.controller);
361
328
  switch(type){
362
329
  case CHUNK_VALUE_TYPE_PROMISE:
363
330
  {
364
331
  return new Promise((resolve, reject)=>{
365
332
  // listen for next value in the stream
366
- const reader = readable.getReader();
333
+ const reader = stream.readable.getReader();
367
334
  reader.read().then((it)=>{
368
335
  if (it.done) {
369
336
  reject(new Error('Promise chunk ended without value'));
@@ -377,7 +344,7 @@ function createConsumerStream(from) {
377
344
  const [_chunkId, status, data] = value;
378
345
  switch(status){
379
346
  case PROMISE_STATUS_FULFILLED:
380
- resolve(hydrate(data));
347
+ resolve(decode(data));
381
348
  break;
382
349
  case PROMISE_STATUS_REJECTED:
383
350
  reject(opts.formatError?.({
@@ -386,9 +353,7 @@ function createConsumerStream(from) {
386
353
  break;
387
354
  }
388
355
  }).catch(reject).finally(()=>{
389
- // reader.releaseLock();
390
356
  controllers.delete(chunkId);
391
- maybeAbort();
392
357
  });
393
358
  });
394
359
  }
@@ -396,7 +361,7 @@ function createConsumerStream(from) {
396
361
  {
397
362
  return {
398
363
  [Symbol.asyncIterator]: ()=>{
399
- const reader = readable.getReader();
364
+ const reader = stream.readable.getReader();
400
365
  const iterator = {
401
366
  next: async ()=>{
402
367
  const { done, value } = await reader.read();
@@ -405,7 +370,6 @@ function createConsumerStream(from) {
405
370
  }
406
371
  if (done) {
407
372
  controllers.delete(chunkId);
408
- maybeAbort();
409
373
  return {
410
374
  done: true,
411
375
  value: undefined
@@ -416,26 +380,23 @@ function createConsumerStream(from) {
416
380
  case ASYNC_ITERABLE_STATUS_VALUE:
417
381
  return {
418
382
  done: false,
419
- value: hydrate(data)
383
+ value: decode(data)
420
384
  };
421
385
  case ASYNC_ITERABLE_STATUS_RETURN:
422
386
  controllers.delete(chunkId);
423
- maybeAbort();
424
387
  return {
425
388
  done: true,
426
- value: hydrate(data)
389
+ value: decode(data)
427
390
  };
428
391
  case ASYNC_ITERABLE_STATUS_ERROR:
429
392
  controllers.delete(chunkId);
430
- maybeAbort();
431
393
  throw opts.formatError?.({
432
394
  error: data
433
395
  }) ?? new AsyncError(data);
434
396
  }
435
397
  },
436
398
  return: async ()=>{
437
- wrapper.returned = true;
438
- maybeAbort();
399
+ controllers.delete(chunkId);
439
400
  return {
440
401
  done: true,
441
402
  value: undefined
@@ -448,26 +409,22 @@ function createConsumerStream(from) {
448
409
  }
449
410
  }
450
411
  }
451
- function hydrate(value) {
412
+ function decode(value) {
452
413
  const [[data], ...asyncProps] = value;
453
414
  for (const value of asyncProps){
454
415
  const [key] = value;
455
- const hydrated = hydrateChunkDefinition(value);
416
+ const decoded = decodeChunkDefinition(value);
456
417
  if (key === null) {
457
- return hydrated;
418
+ return decoded;
458
419
  }
459
- data[key] = hydrated;
420
+ data[key] = decoded;
460
421
  }
461
422
  return data;
462
423
  }
463
424
  const closeOrAbort = (reason)=>{
464
425
  const error = new StreamInterruptedError(reason);
465
426
  headDeferred?.reject(error);
466
- for (const deferred of chunkDeferred.values()){
467
- deferred.reject(error);
468
- }
469
- chunkDeferred.clear();
470
- for (const { controller } of controllers.values()){
427
+ for (const controller of controllers.values()){
471
428
  controller.enqueue(error);
472
429
  controller.close();
473
430
  }
@@ -478,25 +435,19 @@ function createConsumerStream(from) {
478
435
  if (headDeferred) {
479
436
  const head = chunkOrHead;
480
437
  for (const [key, value] of Object.entries(chunkOrHead)){
481
- const parsed = hydrate(value);
438
+ const parsed = decode(value);
482
439
  head[key] = parsed;
483
440
  }
484
441
  headDeferred.resolve(head);
485
442
  headDeferred = null;
443
+ controllers.activate();
486
444
  return;
487
445
  }
488
446
  const chunk = chunkOrHead;
489
447
  const [idx] = chunk;
490
- let wrapper = controllers.get(idx);
491
- if (!wrapper) {
492
- let deferred = chunkDeferred.get(idx);
493
- if (!deferred) {
494
- deferred = createDeferred.createDeferred();
495
- chunkDeferred.set(idx, deferred);
496
- }
497
- wrapper = await deferred.promise;
498
- }
499
- wrapper.controller.enqueue(chunk);
448
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
449
+ const controller = controllers.get(idx);
450
+ controller.enqueue(chunk);
500
451
  },
501
452
  close: closeOrAbort,
502
453
  abort: closeOrAbort