@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.
- 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 +235 -154
- 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} +12 -8
- 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} +158 -119
- package/dist/unstable-core-do-not-import/stream/{stream.mjs → jsonl.mjs} +157 -118
- 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} +186 -127
- 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 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
|
|
336
|
+
function hydrateChunkDefinition(value, path) {
|
|
335
337
|
const [_path, type, chunkId] = value;
|
|
336
|
-
const
|
|
337
|
-
|
|
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(
|
|
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 =
|
|
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(
|
|
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]:
|
|
381
|
-
const reader =
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
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
|
-
|
|
401
|
-
|
|
402
|
-
|
|
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
|
|
439
|
+
function hydrate(value, path) {
|
|
411
440
|
const [[data], ...asyncProps] = value;
|
|
412
441
|
for (const value1 of asyncProps){
|
|
413
|
-
const
|
|
414
|
-
const
|
|
415
|
-
|
|
416
|
-
|
|
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[
|
|
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 =
|
|
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
|
|
450
|
-
if (!
|
|
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
|
-
|
|
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
|