@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.
- package/dist/@trpc/server/http.d.ts +1 -2
- package/dist/@trpc/server/http.d.ts.map +1 -1
- package/dist/@trpc/server/index.d.ts +1 -1
- package/dist/@trpc/server/index.d.ts.map +1 -1
- package/dist/@trpc/server/rpc.d.ts +1 -1
- package/dist/@trpc/server/rpc.d.ts.map +1 -1
- package/dist/adapters/aws-lambda/getPlanner.d.ts.map +1 -1
- package/dist/adapters/aws-lambda/getPlanner.js +19 -2
- package/dist/adapters/aws-lambda/getPlanner.mjs +19 -2
- package/dist/adapters/next-app-dir/nextAppDirCaller.d.ts.map +1 -1
- package/dist/adapters/next-app-dir/nextAppDirCaller.js +1 -1
- package/dist/adapters/next-app-dir/nextAppDirCaller.mjs +1 -1
- package/dist/adapters/next-app-dir/redirect.d.ts.map +1 -1
- package/dist/adapters/next.js +1 -1
- package/dist/adapters/next.mjs +1 -1
- package/dist/adapters/node-http/incomingMessageToRequest.d.ts +0 -1
- package/dist/adapters/node-http/incomingMessageToRequest.d.ts.map +1 -1
- package/dist/adapters/node-http/incomingMessageToRequest.js +3 -1
- package/dist/adapters/node-http/incomingMessageToRequest.mjs +3 -1
- package/dist/adapters/node-http/nodeHTTPRequestHandler.d.ts.map +1 -1
- package/dist/adapters/node-http/nodeHTTPRequestHandler.js +30 -7
- package/dist/adapters/node-http/nodeHTTPRequestHandler.mjs +30 -7
- package/dist/adapters/node-http/types.d.ts +0 -1
- package/dist/adapters/node-http/types.d.ts.map +1 -1
- package/dist/adapters/standalone.d.ts +0 -1
- package/dist/adapters/standalone.d.ts.map +1 -1
- package/dist/adapters/ws.d.ts +3 -4
- package/dist/adapters/ws.d.ts.map +1 -1
- package/dist/adapters/ws.js +172 -114
- package/dist/adapters/ws.mjs +172 -114
- package/dist/bundle-analysis.json +236 -155
- package/dist/http.js +3 -0
- package/dist/http.mjs +1 -0
- package/dist/index.js +7 -5
- package/dist/index.mjs +3 -2
- package/dist/observable/observable.d.ts +1 -0
- package/dist/observable/observable.d.ts.map +1 -1
- package/dist/observable/observable.js +55 -0
- package/dist/observable/observable.mjs +55 -1
- package/dist/unstable-core-do-not-import/createProxy.d.ts +3 -3
- package/dist/unstable-core-do-not-import/createProxy.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/createProxy.js +15 -6
- package/dist/unstable-core-do-not-import/createProxy.mjs +15 -6
- package/dist/unstable-core-do-not-import/http/contentType.d.ts +7 -4
- package/dist/unstable-core-do-not-import/http/contentType.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/http/contentType.js +60 -17
- package/dist/unstable-core-do-not-import/http/contentType.mjs +61 -18
- package/dist/unstable-core-do-not-import/http/formDataToObject.d.ts.map +1 -0
- package/dist/unstable-core-do-not-import/http/formDataToObject.js +40 -0
- package/dist/unstable-core-do-not-import/http/formDataToObject.mjs +38 -0
- package/dist/unstable-core-do-not-import/http/getHTTPStatusCode.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/http/getHTTPStatusCode.js +4 -4
- package/dist/unstable-core-do-not-import/http/getHTTPStatusCode.mjs +4 -4
- package/dist/unstable-core-do-not-import/http/parseConnectionParams.d.ts +4 -0
- package/dist/unstable-core-do-not-import/http/parseConnectionParams.d.ts.map +1 -0
- package/dist/unstable-core-do-not-import/http/parseConnectionParams.js +42 -0
- package/dist/unstable-core-do-not-import/http/parseConnectionParams.mjs +39 -0
- package/dist/unstable-core-do-not-import/http/resolveResponse.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/http/resolveResponse.js +302 -149
- package/dist/unstable-core-do-not-import/http/resolveResponse.mjs +301 -148
- package/dist/unstable-core-do-not-import/http/types.d.ts +26 -2
- package/dist/unstable-core-do-not-import/http/types.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/initTRPC.d.ts +12 -12
- package/dist/unstable-core-do-not-import/initTRPC.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/middleware.d.ts +3 -3
- package/dist/unstable-core-do-not-import/middleware.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/procedureBuilder.d.ts +3 -1
- package/dist/unstable-core-do-not-import/procedureBuilder.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/rootConfig.d.ts +12 -0
- package/dist/unstable-core-do-not-import/rootConfig.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/router.d.ts +2 -2
- package/dist/unstable-core-do-not-import/router.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/router.js +7 -2
- package/dist/unstable-core-do-not-import/router.mjs +7 -2
- package/dist/unstable-core-do-not-import/rpc/envelopes.d.ts +7 -0
- package/dist/unstable-core-do-not-import/rpc/envelopes.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/rpc/index.d.ts +1 -1
- package/dist/unstable-core-do-not-import/rpc/index.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/stream/{stream.d.ts → jsonl.d.ts} +5 -5
- package/dist/unstable-core-do-not-import/stream/jsonl.d.ts.map +1 -0
- package/dist/unstable-core-do-not-import/stream/{stream.js → jsonl.js} +148 -111
- package/dist/unstable-core-do-not-import/stream/{stream.mjs → jsonl.mjs} +147 -110
- package/dist/unstable-core-do-not-import/stream/sse.d.ts +86 -0
- package/dist/unstable-core-do-not-import/stream/sse.d.ts.map +1 -0
- package/dist/unstable-core-do-not-import/stream/sse.js +178 -0
- package/dist/unstable-core-do-not-import/stream/sse.mjs +172 -0
- package/dist/unstable-core-do-not-import/stream/utils/createDeferred.d.ts +18 -0
- package/dist/unstable-core-do-not-import/stream/utils/createDeferred.d.ts.map +1 -0
- package/dist/unstable-core-do-not-import/stream/utils/createDeferred.js +46 -0
- package/dist/unstable-core-do-not-import/stream/utils/createDeferred.mjs +43 -0
- package/dist/unstable-core-do-not-import/stream/utils/createReadableStream.d.ts +10 -0
- package/dist/unstable-core-do-not-import/stream/utils/createReadableStream.d.ts.map +1 -0
- package/dist/unstable-core-do-not-import/stream/utils/createReadableStream.js +31 -0
- package/dist/unstable-core-do-not-import/stream/utils/createReadableStream.mjs +29 -0
- package/dist/unstable-core-do-not-import/stream/utils/createServer.d.ts +7 -0
- package/dist/unstable-core-do-not-import/stream/utils/createServer.d.ts.map +1 -0
- package/dist/unstable-core-do-not-import/transformer.d.ts +5 -5
- package/dist/unstable-core-do-not-import/utils.d.ts +4 -0
- package/dist/unstable-core-do-not-import/utils.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/utils.js +4 -0
- package/dist/unstable-core-do-not-import/utils.mjs +4 -1
- package/dist/unstable-core-do-not-import.d.ts +5 -2
- package/dist/unstable-core-do-not-import.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import.js +19 -7
- package/dist/unstable-core-do-not-import.mjs +6 -3
- package/package.json +6 -6
- package/src/@trpc/server/http.ts +7 -2
- package/src/@trpc/server/index.ts +1 -0
- package/src/@trpc/server/rpc.ts +1 -0
- package/src/adapters/aws-lambda/getPlanner.ts +21 -2
- package/src/adapters/next-app-dir/nextAppDirCaller.ts +2 -1
- package/src/adapters/node-http/incomingMessageToRequest.ts +3 -2
- package/src/adapters/node-http/nodeHTTPRequestHandler.ts +32 -7
- package/src/adapters/ws.ts +193 -107
- package/src/observable/observable.ts +63 -0
- package/src/unstable-core-do-not-import/createProxy.ts +23 -8
- package/src/unstable-core-do-not-import/http/contentType.ts +83 -21
- package/src/{adapters/next-app-dir → unstable-core-do-not-import/http}/formDataToObject.ts +18 -10
- package/src/unstable-core-do-not-import/http/getHTTPStatusCode.ts +4 -7
- package/src/unstable-core-do-not-import/http/parseConnectionParams.ts +49 -0
- package/src/unstable-core-do-not-import/http/resolveResponse.ts +333 -164
- package/src/unstable-core-do-not-import/http/types.ts +31 -2
- package/src/unstable-core-do-not-import/procedureBuilder.ts +8 -1
- package/src/unstable-core-do-not-import/rootConfig.ts +12 -0
- package/src/unstable-core-do-not-import/router.ts +47 -35
- package/src/unstable-core-do-not-import/rpc/envelopes.ts +9 -0
- package/src/unstable-core-do-not-import/rpc/index.ts +1 -0
- package/src/unstable-core-do-not-import/stream/{stream.ts → jsonl.ts} +163 -110
- package/src/unstable-core-do-not-import/stream/sse.ts +288 -0
- package/src/unstable-core-do-not-import/stream/utils/createDeferred.ts +48 -0
- package/src/unstable-core-do-not-import/stream/utils/createReadableStream.ts +31 -0
- package/src/unstable-core-do-not-import/stream/utils/createServer.ts +44 -0
- package/src/unstable-core-do-not-import/utils.ts +5 -0
- package/src/unstable-core-do-not-import.ts +5 -2
- package/dist/adapters/next-app-dir/formDataToObject.d.ts.map +0 -1
- package/dist/adapters/next-app-dir/formDataToObject.js +0 -34
- package/dist/adapters/next-app-dir/formDataToObject.mjs +0 -32
- package/dist/unstable-core-do-not-import/stream/stream.d.ts.map +0 -1
- /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
|
|
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
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
57
|
+
dehydrate(it, path)
|
|
65
58
|
]);
|
|
66
|
-
}).catch((
|
|
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
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
-
|
|
102
|
-
|
|
103
|
+
ASYNC_ITERABLE_STATUS_ERROR,
|
|
104
|
+
opts.formatError?.({
|
|
105
|
+
error: next,
|
|
106
|
+
path
|
|
107
|
+
})
|
|
103
108
|
]);
|
|
109
|
+
return;
|
|
104
110
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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
|
-
|
|
117
|
-
|
|
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
|
|
149
|
+
function dehydrateChunk(value, path) {
|
|
136
150
|
if (isPromise(value)) {
|
|
137
151
|
return [
|
|
138
152
|
CHUNK_VALUE_TYPE_PROMISE,
|
|
139
|
-
|
|
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
|
-
|
|
162
|
+
dehydrateAsyncIterable(value, path)
|
|
149
163
|
];
|
|
150
164
|
}
|
|
151
165
|
return null;
|
|
152
166
|
}
|
|
153
|
-
function
|
|
154
|
-
const reg =
|
|
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 =
|
|
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] =
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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(
|
|
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]:
|
|
381
|
-
const reader =
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
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
|
|
442
|
+
function hydrate(value) {
|
|
411
443
|
const [[data], ...asyncProps] = value;
|
|
412
444
|
for (const value1 of asyncProps){
|
|
413
|
-
const
|
|
445
|
+
const hydrated = hydrateChunkDefinition(value1);
|
|
414
446
|
const [path] = value1;
|
|
415
447
|
if (path === null) {
|
|
416
|
-
return
|
|
448
|
+
return hydrated;
|
|
417
449
|
}
|
|
418
|
-
data[path] =
|
|
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 =
|
|
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;
|