@trpc/server 11.0.0-alpha-tmp-app-router-example.388 → 11.0.0-alpha-tmp-issues-5851-take-two.451

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 (139) hide show
  1. package/dist/@trpc/server/http.d.ts +1 -2
  2. package/dist/@trpc/server/http.d.ts.map +1 -1
  3. package/dist/@trpc/server/index.d.ts +1 -1
  4. package/dist/@trpc/server/index.d.ts.map +1 -1
  5. package/dist/@trpc/server/rpc.d.ts +1 -1
  6. package/dist/@trpc/server/rpc.d.ts.map +1 -1
  7. package/dist/adapters/aws-lambda/getPlanner.d.ts.map +1 -1
  8. package/dist/adapters/aws-lambda/getPlanner.js +19 -2
  9. package/dist/adapters/aws-lambda/getPlanner.mjs +19 -2
  10. package/dist/adapters/next-app-dir/nextAppDirCaller.d.ts.map +1 -1
  11. package/dist/adapters/next-app-dir/nextAppDirCaller.js +1 -1
  12. package/dist/adapters/next-app-dir/nextAppDirCaller.mjs +1 -1
  13. package/dist/adapters/next-app-dir/redirect.d.ts.map +1 -1
  14. package/dist/adapters/next.js +1 -1
  15. package/dist/adapters/next.mjs +1 -1
  16. package/dist/adapters/node-http/incomingMessageToRequest.d.ts +0 -1
  17. package/dist/adapters/node-http/incomingMessageToRequest.d.ts.map +1 -1
  18. package/dist/adapters/node-http/incomingMessageToRequest.js +3 -1
  19. package/dist/adapters/node-http/incomingMessageToRequest.mjs +3 -1
  20. package/dist/adapters/node-http/nodeHTTPRequestHandler.d.ts.map +1 -1
  21. package/dist/adapters/node-http/nodeHTTPRequestHandler.js +30 -7
  22. package/dist/adapters/node-http/nodeHTTPRequestHandler.mjs +30 -7
  23. package/dist/adapters/node-http/types.d.ts +0 -1
  24. package/dist/adapters/node-http/types.d.ts.map +1 -1
  25. package/dist/adapters/standalone.d.ts +0 -1
  26. package/dist/adapters/standalone.d.ts.map +1 -1
  27. package/dist/adapters/ws.d.ts +3 -4
  28. package/dist/adapters/ws.d.ts.map +1 -1
  29. package/dist/adapters/ws.js +172 -114
  30. package/dist/adapters/ws.mjs +172 -114
  31. package/dist/bundle-analysis.json +235 -154
  32. package/dist/http.js +3 -0
  33. package/dist/http.mjs +1 -0
  34. package/dist/index.js +7 -5
  35. package/dist/index.mjs +3 -2
  36. package/dist/observable/observable.d.ts +1 -0
  37. package/dist/observable/observable.d.ts.map +1 -1
  38. package/dist/observable/observable.js +55 -0
  39. package/dist/observable/observable.mjs +55 -1
  40. package/dist/unstable-core-do-not-import/createProxy.d.ts +3 -3
  41. package/dist/unstable-core-do-not-import/createProxy.d.ts.map +1 -1
  42. package/dist/unstable-core-do-not-import/createProxy.js +15 -6
  43. package/dist/unstable-core-do-not-import/createProxy.mjs +15 -6
  44. package/dist/unstable-core-do-not-import/http/contentType.d.ts +7 -4
  45. package/dist/unstable-core-do-not-import/http/contentType.d.ts.map +1 -1
  46. package/dist/unstable-core-do-not-import/http/contentType.js +60 -17
  47. package/dist/unstable-core-do-not-import/http/contentType.mjs +61 -18
  48. package/dist/unstable-core-do-not-import/http/formDataToObject.d.ts.map +1 -0
  49. package/dist/unstable-core-do-not-import/http/formDataToObject.js +40 -0
  50. package/dist/unstable-core-do-not-import/http/formDataToObject.mjs +38 -0
  51. package/dist/unstable-core-do-not-import/http/getHTTPStatusCode.d.ts.map +1 -1
  52. package/dist/unstable-core-do-not-import/http/getHTTPStatusCode.js +4 -4
  53. package/dist/unstable-core-do-not-import/http/getHTTPStatusCode.mjs +4 -4
  54. package/dist/unstable-core-do-not-import/http/parseConnectionParams.d.ts +4 -0
  55. package/dist/unstable-core-do-not-import/http/parseConnectionParams.d.ts.map +1 -0
  56. package/dist/unstable-core-do-not-import/http/parseConnectionParams.js +42 -0
  57. package/dist/unstable-core-do-not-import/http/parseConnectionParams.mjs +39 -0
  58. package/dist/unstable-core-do-not-import/http/resolveResponse.d.ts.map +1 -1
  59. package/dist/unstable-core-do-not-import/http/resolveResponse.js +302 -149
  60. package/dist/unstable-core-do-not-import/http/resolveResponse.mjs +301 -148
  61. package/dist/unstable-core-do-not-import/http/types.d.ts +26 -2
  62. package/dist/unstable-core-do-not-import/http/types.d.ts.map +1 -1
  63. package/dist/unstable-core-do-not-import/initTRPC.d.ts +12 -12
  64. package/dist/unstable-core-do-not-import/initTRPC.d.ts.map +1 -1
  65. package/dist/unstable-core-do-not-import/middleware.d.ts +3 -3
  66. package/dist/unstable-core-do-not-import/middleware.d.ts.map +1 -1
  67. package/dist/unstable-core-do-not-import/procedureBuilder.d.ts +3 -1
  68. package/dist/unstable-core-do-not-import/procedureBuilder.d.ts.map +1 -1
  69. package/dist/unstable-core-do-not-import/rootConfig.d.ts +12 -0
  70. package/dist/unstable-core-do-not-import/rootConfig.d.ts.map +1 -1
  71. package/dist/unstable-core-do-not-import/router.d.ts +2 -2
  72. package/dist/unstable-core-do-not-import/router.d.ts.map +1 -1
  73. package/dist/unstable-core-do-not-import/router.js +7 -2
  74. package/dist/unstable-core-do-not-import/router.mjs +7 -2
  75. package/dist/unstable-core-do-not-import/rpc/envelopes.d.ts +7 -0
  76. package/dist/unstable-core-do-not-import/rpc/envelopes.d.ts.map +1 -1
  77. package/dist/unstable-core-do-not-import/rpc/index.d.ts +1 -1
  78. package/dist/unstable-core-do-not-import/rpc/index.d.ts.map +1 -1
  79. package/dist/unstable-core-do-not-import/stream/{stream.d.ts → jsonl.d.ts} +12 -8
  80. package/dist/unstable-core-do-not-import/stream/jsonl.d.ts.map +1 -0
  81. package/dist/unstable-core-do-not-import/stream/{stream.js → jsonl.js} +158 -119
  82. package/dist/unstable-core-do-not-import/stream/{stream.mjs → jsonl.mjs} +157 -118
  83. package/dist/unstable-core-do-not-import/stream/sse.d.ts +86 -0
  84. package/dist/unstable-core-do-not-import/stream/sse.d.ts.map +1 -0
  85. package/dist/unstable-core-do-not-import/stream/sse.js +178 -0
  86. package/dist/unstable-core-do-not-import/stream/sse.mjs +172 -0
  87. package/dist/unstable-core-do-not-import/stream/utils/createDeferred.d.ts +18 -0
  88. package/dist/unstable-core-do-not-import/stream/utils/createDeferred.d.ts.map +1 -0
  89. package/dist/unstable-core-do-not-import/stream/utils/createDeferred.js +46 -0
  90. package/dist/unstable-core-do-not-import/stream/utils/createDeferred.mjs +43 -0
  91. package/dist/unstable-core-do-not-import/stream/utils/createReadableStream.d.ts +10 -0
  92. package/dist/unstable-core-do-not-import/stream/utils/createReadableStream.d.ts.map +1 -0
  93. package/dist/unstable-core-do-not-import/stream/utils/createReadableStream.js +31 -0
  94. package/dist/unstable-core-do-not-import/stream/utils/createReadableStream.mjs +29 -0
  95. package/dist/unstable-core-do-not-import/stream/utils/createServer.d.ts +7 -0
  96. package/dist/unstable-core-do-not-import/stream/utils/createServer.d.ts.map +1 -0
  97. package/dist/unstable-core-do-not-import/transformer.d.ts +5 -5
  98. package/dist/unstable-core-do-not-import/utils.d.ts +4 -0
  99. package/dist/unstable-core-do-not-import/utils.d.ts.map +1 -1
  100. package/dist/unstable-core-do-not-import/utils.js +4 -0
  101. package/dist/unstable-core-do-not-import/utils.mjs +4 -1
  102. package/dist/unstable-core-do-not-import.d.ts +5 -2
  103. package/dist/unstable-core-do-not-import.d.ts.map +1 -1
  104. package/dist/unstable-core-do-not-import.js +19 -7
  105. package/dist/unstable-core-do-not-import.mjs +6 -3
  106. package/package.json +6 -6
  107. package/src/@trpc/server/http.ts +7 -2
  108. package/src/@trpc/server/index.ts +1 -0
  109. package/src/@trpc/server/rpc.ts +1 -0
  110. package/src/adapters/aws-lambda/getPlanner.ts +21 -2
  111. package/src/adapters/next-app-dir/nextAppDirCaller.ts +2 -1
  112. package/src/adapters/node-http/incomingMessageToRequest.ts +3 -2
  113. package/src/adapters/node-http/nodeHTTPRequestHandler.ts +32 -7
  114. package/src/adapters/ws.ts +193 -107
  115. package/src/observable/observable.ts +63 -0
  116. package/src/unstable-core-do-not-import/createProxy.ts +23 -8
  117. package/src/unstable-core-do-not-import/http/contentType.ts +83 -21
  118. package/src/{adapters/next-app-dir → unstable-core-do-not-import/http}/formDataToObject.ts +18 -10
  119. package/src/unstable-core-do-not-import/http/getHTTPStatusCode.ts +4 -7
  120. package/src/unstable-core-do-not-import/http/parseConnectionParams.ts +49 -0
  121. package/src/unstable-core-do-not-import/http/resolveResponse.ts +333 -164
  122. package/src/unstable-core-do-not-import/http/types.ts +31 -2
  123. package/src/unstable-core-do-not-import/procedureBuilder.ts +8 -1
  124. package/src/unstable-core-do-not-import/rootConfig.ts +12 -0
  125. package/src/unstable-core-do-not-import/router.ts +47 -35
  126. package/src/unstable-core-do-not-import/rpc/envelopes.ts +9 -0
  127. package/src/unstable-core-do-not-import/rpc/index.ts +1 -0
  128. package/src/unstable-core-do-not-import/stream/{stream.ts → jsonl.ts} +186 -127
  129. package/src/unstable-core-do-not-import/stream/sse.ts +288 -0
  130. package/src/unstable-core-do-not-import/stream/utils/createDeferred.ts +48 -0
  131. package/src/unstable-core-do-not-import/stream/utils/createReadableStream.ts +31 -0
  132. package/src/unstable-core-do-not-import/stream/utils/createServer.ts +44 -0
  133. package/src/unstable-core-do-not-import/utils.ts +5 -0
  134. package/src/unstable-core-do-not-import.ts +5 -2
  135. package/dist/adapters/next-app-dir/formDataToObject.d.ts.map +0 -1
  136. package/dist/adapters/next-app-dir/formDataToObject.js +0 -34
  137. package/dist/adapters/next-app-dir/formDataToObject.mjs +0 -32
  138. package/dist/unstable-core-do-not-import/stream/stream.d.ts.map +0 -1
  139. /package/dist/{adapters/next-app-dir → unstable-core-do-not-import/http}/formDataToObject.d.ts +0 -0
@@ -1,20 +1,10 @@
1
1
  'use strict';
2
2
 
3
+ var TRPCError = require('../error/TRPCError.js');
3
4
  var utils = require('../utils.js');
5
+ var createDeferred = require('./utils/createDeferred.js');
6
+ var createReadableStream = require('./utils/createReadableStream.js');
4
7
 
5
- // ---------- utils
6
- function createReadableStream() {
7
- let controller = null;
8
- const stream = new ReadableStream({
9
- start (c) {
10
- controller = c;
11
- }
12
- });
13
- return [
14
- stream,
15
- controller
16
- ];
17
- }
18
8
  // ---------- types
19
9
  const CHUNK_VALUE_TYPE_PROMISE = 0;
20
10
  const CHUNK_VALUE_TYPE_ASYNC_ITERABLE = 1;
@@ -36,14 +26,14 @@ function createBatchStreamProducer(opts) {
36
26
  const { data } = opts;
37
27
  let counter = 0;
38
28
  const placeholder = 0;
39
- const [stream, controller] = createReadableStream();
29
+ const stream = createReadableStream.createReadableStream();
40
30
  const pending = new Set();
41
31
  function maybeClose() {
42
- if (pending.size === 0) {
43
- controller.close();
32
+ if (pending.size === 0 && !stream.cancelled()) {
33
+ stream.controller.close();
44
34
  }
45
35
  }
46
- function hydratePromise(promise, path) {
36
+ function dehydratePromise(promise, path) {
47
37
  //
48
38
  const error = checkMaxDepth(path);
49
39
  if (error) {
@@ -54,25 +44,28 @@ function createBatchStreamProducer(opts) {
54
44
  }
55
45
  const idx = counter++;
56
46
  pending.add(idx);
57
- const enqueue = (value)=>{
58
- controller.enqueue(value);
59
- };
60
- promise.then((it)=>{
61
- enqueue([
47
+ Promise.race([
48
+ promise,
49
+ stream.cancelledPromise
50
+ ]).then((it)=>{
51
+ if (it === null) {
52
+ return;
53
+ }
54
+ stream.controller.enqueue([
62
55
  idx,
63
56
  PROMISE_STATUS_FULFILLED,
64
- hydrate(it, path)
57
+ dehydrate(it, path)
65
58
  ]);
66
- }).catch((error)=>{
59
+ }).catch((cause)=>{
67
60
  opts.onError?.({
68
- error,
61
+ error: cause,
69
62
  path
70
63
  });
71
- enqueue([
64
+ stream.controller.enqueue([
72
65
  idx,
73
66
  PROMISE_STATUS_REJECTED,
74
67
  opts.formatError?.({
75
- error,
68
+ error: cause,
76
69
  path
77
70
  })
78
71
  ]);
@@ -82,7 +75,7 @@ function createBatchStreamProducer(opts) {
82
75
  });
83
76
  return idx;
84
77
  }
85
- function hydrateAsyncIterable(iterable, path) {
78
+ function dehydrateAsyncIterable(iterable, path) {
86
79
  const error = checkMaxDepth(path);
87
80
  if (error) {
88
81
  iterable = {
@@ -93,37 +86,58 @@ function createBatchStreamProducer(opts) {
93
86
  }
94
87
  const idx = counter++;
95
88
  pending.add(idx);
96
- void (async ()=>{
97
- try {
98
- for await (const item of iterable){
99
- controller.enqueue([
89
+ utils.run(async ()=>{
90
+ const iterator = iterable[Symbol.asyncIterator]();
91
+ while(true){
92
+ const next = await Promise.race([
93
+ iterator.next().catch(TRPCError.getTRPCErrorFromUnknown),
94
+ stream.cancelledPromise
95
+ ]);
96
+ if (next instanceof Error) {
97
+ opts.onError?.({
98
+ error: next,
99
+ path
100
+ });
101
+ stream.controller.enqueue([
100
102
  idx,
101
- ASYNC_ITERABLE_STATUS_VALUE,
102
- hydrate(item, path)
103
+ ASYNC_ITERABLE_STATUS_ERROR,
104
+ opts.formatError?.({
105
+ error: next,
106
+ path
107
+ })
103
108
  ]);
109
+ return;
104
110
  }
105
- controller.enqueue([
106
- idx,
107
- ASYNC_ITERABLE_STATUS_DONE
108
- ]);
109
- } catch (error) {
110
- opts.onError?.({
111
- error,
112
- path
113
- });
114
- controller.enqueue([
111
+ if (next === 'cancelled') {
112
+ await iterator.return?.();
113
+ break;
114
+ }
115
+ if (next.done) {
116
+ stream.controller.enqueue([
117
+ idx,
118
+ ASYNC_ITERABLE_STATUS_DONE
119
+ ]);
120
+ break;
121
+ }
122
+ stream.controller.enqueue([
115
123
  idx,
116
- ASYNC_ITERABLE_STATUS_ERROR,
117
- opts.formatError?.({
118
- error,
119
- path
120
- })
124
+ ASYNC_ITERABLE_STATUS_VALUE,
125
+ dehydrate(next.value, path)
121
126
  ]);
122
- } finally{
123
- pending.delete(idx);
124
- maybeClose();
125
127
  }
126
- })();
128
+ pending.delete(idx);
129
+ maybeClose();
130
+ }).catch((cause)=>{
131
+ // this shouldn't happen, but node crashes if we don't catch it
132
+ opts.onError?.({
133
+ 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
134
+ // @ts-ignore https://github.com/tc39/proposal-error-cause
135
+ {
136
+ cause
137
+ }),
138
+ path
139
+ });
140
+ });
127
141
  return idx;
128
142
  }
129
143
  function checkMaxDepth(path) {
@@ -132,11 +146,11 @@ function createBatchStreamProducer(opts) {
132
146
  }
133
147
  return null;
134
148
  }
135
- function hydrateChunk(value, path) {
149
+ function dehydrateChunk(value, path) {
136
150
  if (isPromise(value)) {
137
151
  return [
138
152
  CHUNK_VALUE_TYPE_PROMISE,
139
- hydratePromise(value, path)
153
+ dehydratePromise(value, path)
140
154
  ];
141
155
  }
142
156
  if (utils.isAsyncIterable(value)) {
@@ -145,13 +159,13 @@ function createBatchStreamProducer(opts) {
145
159
  }
146
160
  return [
147
161
  CHUNK_VALUE_TYPE_ASYNC_ITERABLE,
148
- hydrateAsyncIterable(value, path)
162
+ dehydrateAsyncIterable(value, path)
149
163
  ];
150
164
  }
151
165
  return null;
152
166
  }
153
- function hydrate(value, path) {
154
- const reg = hydrateChunk(value, path);
167
+ function dehydrate(value, path) {
168
+ const reg = dehydrateChunk(value, path);
155
169
  if (reg) {
156
170
  return [
157
171
  [
@@ -173,7 +187,7 @@ function createBatchStreamProducer(opts) {
173
187
  const newObj = {};
174
188
  const asyncValues = [];
175
189
  for (const [key, item] of Object.entries(value)){
176
- const transformed = hydrateChunk(item, [
190
+ const transformed = dehydrateChunk(item, [
177
191
  ...path,
178
192
  key
179
193
  ]);
@@ -196,13 +210,13 @@ function createBatchStreamProducer(opts) {
196
210
  }
197
211
  const newHead = {};
198
212
  for (const [key, item] of Object.entries(data)){
199
- newHead[key] = hydrate(item, [
213
+ newHead[key] = dehydrate(item, [
200
214
  key
201
215
  ]);
202
216
  }
203
217
  return [
204
218
  newHead,
205
- stream
219
+ stream.readable
206
220
  ];
207
221
  }
208
222
  /**
@@ -246,7 +260,7 @@ class AsyncError extends Error {
246
260
  const nodeJsStreamToReaderEsque = (source)=>{
247
261
  return {
248
262
  getReader () {
249
- const [stream, controller] = createReadableStream();
263
+ const { readable , controller } = createReadableStream.createReadableStream();
250
264
  source.on('data', (chunk)=>{
251
265
  controller.enqueue(chunk);
252
266
  });
@@ -256,7 +270,7 @@ const nodeJsStreamToReaderEsque = (source)=>{
256
270
  source.on('error', (error)=>{
257
271
  controller.error(error);
258
272
  });
259
- return stream.getReader();
273
+ return readable.getReader();
260
274
  }
261
275
  };
262
276
  };
@@ -302,24 +316,12 @@ function createConsumerStream(from) {
302
316
  }
303
317
  }));
304
318
  }
305
- function createDeferred() {
306
- let resolve;
307
- let reject;
308
- const promise = new Promise((res, rej)=>{
309
- resolve = res;
310
- reject = rej;
311
- });
312
- return {
313
- promise,
314
- resolve: resolve,
315
- reject: reject
316
- };
317
- }
318
319
  /**
319
320
  * JSON Lines stream consumer
320
321
  * @see https://jsonlines.org/
321
322
  */ async function jsonlStreamConsumer(opts) {
322
323
  const { deserialize =(v)=>v } = opts;
324
+ const streamAbortController = new AbortController();
323
325
  let source = createConsumerStream(opts.from);
324
326
  if (deserialize) {
325
327
  source = source.pipeThrough(new TransformStream({
@@ -328,17 +330,21 @@ function createDeferred() {
328
330
  }
329
331
  }));
330
332
  }
331
- let headDeferred = createDeferred();
333
+ let headDeferred = createDeferred.createDeferred();
332
334
  const chunkDeferred = new Map();
333
335
  const controllers = new Map();
334
- function dehydrateChunkDefinition(value) {
336
+ function hydrateChunkDefinition(value, path) {
335
337
  const [_path, type, chunkId] = value;
336
- const [stream, controller] = createReadableStream();
337
- controllers.set(chunkId, controller);
338
+ const { readable , controller } = createReadableStream.createReadableStream();
339
+ const wrapper = {
340
+ controller,
341
+ abortController: new AbortController()
342
+ };
343
+ controllers.set(chunkId, wrapper);
338
344
  // resolve chunk deferred if it exists
339
345
  const deferred = chunkDeferred.get(chunkId);
340
346
  if (deferred) {
341
- deferred.resolve(controller);
347
+ deferred.resolve(wrapper);
342
348
  chunkDeferred.delete(chunkId);
343
349
  }
344
350
  switch(type){
@@ -346,7 +352,7 @@ function createDeferred() {
346
352
  {
347
353
  return new Promise((resolve, reject)=>{
348
354
  // listen for next value in the stream
349
- const reader = stream.getReader();
355
+ const reader = readable.getReader();
350
356
  reader.read().then((it)=>{
351
357
  if (it.done) {
352
358
  reject(new Error('Promise chunk ended without value'));
@@ -360,7 +366,7 @@ function createDeferred() {
360
366
  const [_chunkId, status, data] = value;
361
367
  switch(status){
362
368
  case PROMISE_STATUS_FULFILLED:
363
- resolve(dehydrate(data));
369
+ resolve(hydrate(data, path));
364
370
  break;
365
371
  case PROMISE_STATUS_REJECTED:
366
372
  reject(opts.formatError?.({
@@ -377,45 +383,71 @@ function createDeferred() {
377
383
  case CHUNK_VALUE_TYPE_ASYNC_ITERABLE:
378
384
  {
379
385
  return {
380
- [Symbol.asyncIterator]: async function*() {
381
- const reader = stream.getReader();
382
- while(true){
383
- const { done , value } = await reader.read();
384
- if (done) {
385
- break;
386
- }
387
- if (value instanceof StreamInterruptedError) {
388
- throw value;
389
- }
390
- const [_chunkId, status, data] = value;
391
- switch(status){
392
- case ASYNC_ITERABLE_STATUS_VALUE:
393
- yield dehydrate(data);
394
- break;
395
- case ASYNC_ITERABLE_STATUS_DONE:
396
- controllers.delete(chunkId);
397
- return;
398
- case ASYNC_ITERABLE_STATUS_ERROR:
386
+ [Symbol.asyncIterator]: ()=>{
387
+ const reader = readable.getReader();
388
+ const iterator = {
389
+ next: async ()=>{
390
+ const { done , value } = await reader.read();
391
+ if (value instanceof StreamInterruptedError) {
392
+ throw value;
393
+ }
394
+ if (done) {
399
395
  controllers.delete(chunkId);
400
- throw opts.formatError?.({
401
- error: data
402
- }) ?? new AsyncError(data);
396
+ return {
397
+ done: true,
398
+ value: undefined
399
+ };
400
+ }
401
+ const [_chunkId, status, data] = value;
402
+ switch(status){
403
+ case ASYNC_ITERABLE_STATUS_VALUE:
404
+ return {
405
+ done: false,
406
+ value: hydrate(data, path)
407
+ };
408
+ case ASYNC_ITERABLE_STATUS_DONE:
409
+ controllers.delete(chunkId);
410
+ return {
411
+ done: true,
412
+ value: undefined
413
+ };
414
+ case ASYNC_ITERABLE_STATUS_ERROR:
415
+ controllers.delete(chunkId);
416
+ throw opts.formatError?.({
417
+ error: data
418
+ }) ?? new AsyncError(data);
419
+ }
420
+ },
421
+ return: async ()=>{
422
+ wrapper.abortController.abort();
423
+ if (chunkDeferred.size === 0 && Array.from(controllers.values()).every((it)=>it.abortController.signal.aborted)) {
424
+ // nothing is listening to the stream anymore
425
+ streamAbortController.abort();
426
+ }
427
+ return {
428
+ done: true,
429
+ value: undefined
430
+ };
403
431
  }
404
- }
432
+ };
433
+ return iterator;
405
434
  }
406
435
  };
407
436
  }
408
437
  }
409
438
  }
410
- function dehydrate(value) {
439
+ function hydrate(value, path) {
411
440
  const [[data], ...asyncProps] = value;
412
441
  for (const value1 of asyncProps){
413
- const dehydrated = dehydrateChunkDefinition(value1);
414
- const [path] = value1;
415
- if (path === null) {
416
- return dehydrated;
442
+ const [key] = value1;
443
+ const hydrated = hydrateChunkDefinition(value1, key === null ? path : [
444
+ ...path,
445
+ key
446
+ ]);
447
+ if (key === null) {
448
+ return hydrated;
417
449
  }
418
- data[path] = dehydrated;
450
+ data[key] = hydrated;
419
451
  }
420
452
  return data;
421
453
  }
@@ -426,18 +458,25 @@ function createDeferred() {
426
458
  deferred.reject(error);
427
459
  }
428
460
  chunkDeferred.clear();
429
- for (const controller of controllers.values()){
461
+ for (const { controller } of controllers.values()){
430
462
  controller.enqueue(error);
431
463
  controller.close();
432
464
  }
433
465
  controllers.clear();
434
466
  };
435
467
  source.pipeTo(new WritableStream({
468
+ start (controller) {
469
+ streamAbortController.signal.addEventListener('abort', ()=>{
470
+ controller.error(streamAbortController.signal.reason);
471
+ });
472
+ },
436
473
  async write (chunkOrHead) {
437
474
  if (headDeferred) {
438
475
  const head = chunkOrHead;
439
476
  for (const [key, value] of Object.entries(chunkOrHead)){
440
- const parsed = dehydrate(value);
477
+ const parsed = hydrate(value, [
478
+ key
479
+ ]);
441
480
  head[key] = parsed;
442
481
  }
443
482
  headDeferred.resolve(head);
@@ -446,16 +485,16 @@ function createDeferred() {
446
485
  }
447
486
  const chunk = chunkOrHead;
448
487
  const [idx] = chunk;
449
- let controller = controllers.get(idx);
450
- if (!controller) {
488
+ let wrapper = controllers.get(idx);
489
+ if (!wrapper) {
451
490
  let deferred = chunkDeferred.get(idx);
452
491
  if (!deferred) {
453
- deferred = createDeferred();
492
+ deferred = createDeferred.createDeferred();
454
493
  chunkDeferred.set(idx, deferred);
455
494
  }
456
- controller = await deferred.promise;
495
+ wrapper = await deferred.promise;
457
496
  }
458
- controller.enqueue(chunk);
497
+ wrapper.controller.enqueue(chunk);
459
498
  },
460
499
  close: closeOrAbort,
461
500
  abort: closeOrAbort