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

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 +236 -155
  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} +5 -5
  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} +148 -111
  82. package/dist/unstable-core-do-not-import/stream/{stream.mjs → jsonl.mjs} +147 -110
  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} +163 -110
  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 abortController = new AbortController();
323
325
  let source = createConsumerStream(opts.from);
324
326
  if (deserialize) {
325
327
  source = source.pipeThrough(new TransformStream({
@@ -328,12 +330,19 @@ 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
+ const deleteController = (idx)=>{
337
+ controllers.delete(idx);
338
+ if (controllers.size === 0 && chunkDeferred.size === 0) {
339
+ // nothing can be listening to the stream anymore
340
+ abortController.abort();
341
+ }
342
+ };
343
+ function hydrateChunkDefinition(value) {
335
344
  const [_path, type, chunkId] = value;
336
- const [stream, controller] = createReadableStream();
345
+ const { readable , controller } = createReadableStream.createReadableStream();
337
346
  controllers.set(chunkId, controller);
338
347
  // resolve chunk deferred if it exists
339
348
  const deferred = chunkDeferred.get(chunkId);
@@ -346,7 +355,7 @@ function createDeferred() {
346
355
  {
347
356
  return new Promise((resolve, reject)=>{
348
357
  // listen for next value in the stream
349
- const reader = stream.getReader();
358
+ const reader = readable.getReader();
350
359
  reader.read().then((it)=>{
351
360
  if (it.done) {
352
361
  reject(new Error('Promise chunk ended without value'));
@@ -360,7 +369,7 @@ function createDeferred() {
360
369
  const [_chunkId, status, data] = value;
361
370
  switch(status){
362
371
  case PROMISE_STATUS_FULFILLED:
363
- resolve(dehydrate(data));
372
+ resolve(hydrate(data));
364
373
  break;
365
374
  case PROMISE_STATUS_REJECTED:
366
375
  reject(opts.formatError?.({
@@ -377,45 +386,68 @@ function createDeferred() {
377
386
  case CHUNK_VALUE_TYPE_ASYNC_ITERABLE:
378
387
  {
379
388
  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:
399
- controllers.delete(chunkId);
400
- throw opts.formatError?.({
401
- error: data
402
- }) ?? new AsyncError(data);
389
+ [Symbol.asyncIterator]: ()=>{
390
+ const reader = readable.getReader();
391
+ const iterator = {
392
+ next: async ()=>{
393
+ const { done , value } = await reader.read();
394
+ if (value instanceof StreamInterruptedError) {
395
+ throw value;
396
+ }
397
+ if (done) {
398
+ deleteController(chunkId);
399
+ return {
400
+ done: true,
401
+ value: undefined
402
+ };
403
+ }
404
+ const [_chunkId, status, data] = value;
405
+ switch(status){
406
+ case ASYNC_ITERABLE_STATUS_VALUE:
407
+ return {
408
+ done: false,
409
+ value: hydrate(data)
410
+ };
411
+ case ASYNC_ITERABLE_STATUS_DONE:
412
+ deleteController(chunkId);
413
+ return {
414
+ done: true,
415
+ value: undefined
416
+ };
417
+ case ASYNC_ITERABLE_STATUS_ERROR:
418
+ deleteController(chunkId);
419
+ throw opts.formatError?.({
420
+ error: data
421
+ }) ?? new AsyncError(data);
422
+ }
423
+ },
424
+ return: async ()=>{
425
+ deleteController(chunkId);
426
+ if (controllers.size === 0) {
427
+ // nothing can be listening to the stream anymore
428
+ abortController.abort();
429
+ }
430
+ return {
431
+ done: true,
432
+ value: undefined
433
+ };
403
434
  }
404
- }
435
+ };
436
+ return iterator;
405
437
  }
406
438
  };
407
439
  }
408
440
  }
409
441
  }
410
- function dehydrate(value) {
442
+ function hydrate(value) {
411
443
  const [[data], ...asyncProps] = value;
412
444
  for (const value1 of asyncProps){
413
- const dehydrated = dehydrateChunkDefinition(value1);
445
+ const hydrated = hydrateChunkDefinition(value1);
414
446
  const [path] = value1;
415
447
  if (path === null) {
416
- return dehydrated;
448
+ return hydrated;
417
449
  }
418
- data[path] = dehydrated;
450
+ data[path] = hydrated;
419
451
  }
420
452
  return data;
421
453
  }
@@ -433,11 +465,16 @@ function createDeferred() {
433
465
  controllers.clear();
434
466
  };
435
467
  source.pipeTo(new WritableStream({
468
+ start (controller) {
469
+ abortController.signal.addEventListener('abort', ()=>{
470
+ controller.error(abortController.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);
441
478
  head[key] = parsed;
442
479
  }
443
480
  headDeferred.resolve(head);
@@ -450,7 +487,7 @@ function createDeferred() {
450
487
  if (!controller) {
451
488
  let deferred = chunkDeferred.get(idx);
452
489
  if (!deferred) {
453
- deferred = createDeferred();
490
+ deferred = createDeferred.createDeferred();
454
491
  chunkDeferred.set(idx, deferred);
455
492
  }
456
493
  controller = await deferred.promise;