@trpc/server 11.0.0-rc.645 → 11.0.0-rc.657
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/adapters/aws-lambda/index.js +1 -1
- package/dist/adapters/aws-lambda/index.mjs +1 -1
- package/dist/adapters/express.js +1 -1
- package/dist/adapters/express.mjs +1 -1
- package/dist/adapters/fastify/fastifyRequestHandler.js +1 -1
- package/dist/adapters/fastify/fastifyRequestHandler.mjs +1 -1
- package/dist/adapters/fetch/fetchRequestHandler.js +1 -1
- package/dist/adapters/fetch/fetchRequestHandler.mjs +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/notFound.js +1 -1
- package/dist/adapters/next-app-dir/notFound.mjs +1 -1
- package/dist/adapters/next-app-dir/redirect.js +15 -3
- package/dist/adapters/next-app-dir/redirect.mjs +14 -2
- package/dist/adapters/next.js +1 -1
- package/dist/adapters/next.mjs +1 -1
- package/dist/adapters/node-http/incomingMessageToRequest.js +1 -1
- package/dist/adapters/node-http/incomingMessageToRequest.mjs +1 -1
- package/dist/adapters/node-http/nodeHTTPRequestHandler.js +1 -1
- package/dist/adapters/node-http/nodeHTTPRequestHandler.mjs +1 -1
- package/dist/adapters/node-http/writeResponse.js +1 -1
- package/dist/adapters/node-http/writeResponse.mjs +1 -1
- package/dist/adapters/standalone.js +1 -1
- package/dist/adapters/standalone.mjs +1 -1
- package/dist/adapters/ws.d.ts.map +1 -1
- package/dist/adapters/ws.js +144 -65
- package/dist/adapters/ws.mjs +144 -65
- package/dist/bundle-analysis.json +190 -183
- package/dist/http.js +1 -1
- package/dist/http.mjs +1 -1
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/dist/node_modules/.pnpm/@rollup_plugin-typescript@12.1.1_rollup@4.27.4_tslib@2.8.1_typescript@5.7.2/node_modules/tslib/tslib.es6.js +73 -0
- package/dist/rpc.js +1 -1
- package/dist/rpc.mjs +1 -1
- package/dist/shared.js +1 -1
- package/dist/shared.mjs +1 -1
- package/dist/unstable-core-do-not-import/error/TRPCError.d.ts +1 -1
- package/dist/unstable-core-do-not-import/error/TRPCError.js +14 -2
- package/dist/unstable-core-do-not-import/error/TRPCError.mjs +13 -1
- package/dist/unstable-core-do-not-import/http/resolveResponse.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/http/resolveResponse.js +3 -9
- package/dist/unstable-core-do-not-import/http/resolveResponse.mjs +3 -9
- package/dist/unstable-core-do-not-import/middleware.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/stream/jsonl.d.ts +8 -34
- package/dist/unstable-core-do-not-import/stream/jsonl.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/stream/jsonl.js +338 -209
- package/dist/unstable-core-do-not-import/stream/jsonl.mjs +337 -208
- package/dist/unstable-core-do-not-import/stream/sse.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/stream/sse.js +143 -74
- package/dist/unstable-core-do-not-import/stream/sse.mjs +144 -75
- package/dist/unstable-core-do-not-import/stream/utils/asyncIterable.d.ts +1 -0
- package/dist/unstable-core-do-not-import/stream/utils/asyncIterable.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/stream/utils/asyncIterable.js +103 -10
- package/dist/unstable-core-do-not-import/stream/utils/asyncIterable.mjs +104 -12
- package/dist/unstable-core-do-not-import/stream/utils/disposable.d.ts +17 -0
- package/dist/unstable-core-do-not-import/stream/utils/disposable.d.ts.map +1 -0
- package/dist/unstable-core-do-not-import/stream/utils/disposable.js +44 -0
- package/dist/unstable-core-do-not-import/stream/utils/disposable.mjs +41 -0
- package/dist/unstable-core-do-not-import/stream/utils/timerResource.d.ts +1 -2
- package/dist/unstable-core-do-not-import/stream/utils/timerResource.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/stream/utils/timerResource.js +8 -10
- package/dist/unstable-core-do-not-import/stream/utils/timerResource.mjs +8 -10
- package/dist/unstable-core-do-not-import/stream/utils/withPing.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import/stream/utils/withPing.js +113 -24
- package/dist/unstable-core-do-not-import/stream/utils/withPing.mjs +114 -25
- package/dist/unstable-core-do-not-import/transformer.d.ts +1 -1
- package/dist/unstable-core-do-not-import.d.ts +1 -0
- package/dist/unstable-core-do-not-import.d.ts.map +1 -1
- package/dist/unstable-core-do-not-import.js +3 -0
- package/dist/unstable-core-do-not-import.mjs +1 -0
- package/dist/vendor/unpromise/unpromise.js +17 -6
- package/dist/vendor/unpromise/unpromise.mjs +13 -2
- package/package.json +3 -4
- package/src/adapters/ws.ts +7 -8
- package/src/unstable-core-do-not-import/http/resolveResponse.ts +3 -9
- package/src/unstable-core-do-not-import/stream/jsonl.ts +128 -153
- package/src/unstable-core-do-not-import/stream/sse.ts +64 -79
- package/src/unstable-core-do-not-import/stream/utils/asyncIterable.ts +50 -48
- package/src/unstable-core-do-not-import/stream/utils/disposable.ts +52 -0
- package/src/unstable-core-do-not-import/stream/utils/timerResource.ts +17 -15
- package/src/unstable-core-do-not-import/stream/utils/withPing.ts +18 -19
- package/src/unstable-core-do-not-import.ts +1 -0
- package/dist/node_modules/.pnpm/@swc_helpers@0.5.13/node_modules/@swc/helpers/esm/_define_property.js +0 -11
- package/dist/node_modules/.pnpm/@swc_helpers@0.5.13/node_modules/@swc/helpers/esm/_define_property.mjs +0 -9
|
@@ -6,9 +6,76 @@ var isAbortError = require('../http/isAbortError.js');
|
|
|
6
6
|
var utils = require('../utils.js');
|
|
7
7
|
var tracked = require('./tracked.js');
|
|
8
8
|
var asyncIterable = require('./utils/asyncIterable.js');
|
|
9
|
+
var disposable = require('./utils/disposable.js');
|
|
9
10
|
var readableStreamFrom = require('./utils/readableStreamFrom.js');
|
|
11
|
+
var timerResource = require('./utils/timerResource.js');
|
|
10
12
|
var withPing = require('./utils/withPing.js');
|
|
11
13
|
|
|
14
|
+
function _ts_add_disposable_resource(env, value, async) {
|
|
15
|
+
if (value !== null && value !== void 0) {
|
|
16
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
17
|
+
var dispose, inner;
|
|
18
|
+
if (async) {
|
|
19
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
20
|
+
dispose = value[Symbol.asyncDispose];
|
|
21
|
+
}
|
|
22
|
+
if (dispose === void 0) {
|
|
23
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
24
|
+
dispose = value[Symbol.dispose];
|
|
25
|
+
if (async) inner = dispose;
|
|
26
|
+
}
|
|
27
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
28
|
+
if (inner) dispose = function() {
|
|
29
|
+
try {
|
|
30
|
+
inner.call(this);
|
|
31
|
+
} catch (e) {
|
|
32
|
+
return Promise.reject(e);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
env.stack.push({
|
|
36
|
+
value: value,
|
|
37
|
+
dispose: dispose,
|
|
38
|
+
async: async
|
|
39
|
+
});
|
|
40
|
+
} else if (async) {
|
|
41
|
+
env.stack.push({
|
|
42
|
+
async: true
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
function _ts_dispose_resources(env) {
|
|
48
|
+
var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
|
|
49
|
+
var e = new Error(message);
|
|
50
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
51
|
+
};
|
|
52
|
+
return (_ts_dispose_resources = function _ts_dispose_resources(env) {
|
|
53
|
+
function fail(e) {
|
|
54
|
+
env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
55
|
+
env.hasError = true;
|
|
56
|
+
}
|
|
57
|
+
var r, s = 0;
|
|
58
|
+
function next() {
|
|
59
|
+
while(r = env.stack.pop()){
|
|
60
|
+
try {
|
|
61
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
62
|
+
if (r.dispose) {
|
|
63
|
+
var result = r.dispose.call(r.value);
|
|
64
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
|
|
65
|
+
fail(e);
|
|
66
|
+
return next();
|
|
67
|
+
});
|
|
68
|
+
} else s |= 1;
|
|
69
|
+
} catch (e) {
|
|
70
|
+
fail(e);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
74
|
+
if (env.hasError) throw env.error;
|
|
75
|
+
}
|
|
76
|
+
return next();
|
|
77
|
+
})(env);
|
|
78
|
+
}
|
|
12
79
|
const PING_EVENT = 'ping';
|
|
13
80
|
const SERIALIZED_ERROR_EVENT = 'serialized-error';
|
|
14
81
|
const CONNECTED_EVENT = 'connected';
|
|
@@ -110,26 +177,28 @@ const CONNECTED_EVENT = 'connected';
|
|
|
110
177
|
}));
|
|
111
178
|
}
|
|
112
179
|
async function withTimeout(opts) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
});
|
|
119
|
-
let res;
|
|
180
|
+
const env = {
|
|
181
|
+
stack: [],
|
|
182
|
+
error: void 0,
|
|
183
|
+
hasError: false
|
|
184
|
+
};
|
|
120
185
|
try {
|
|
121
|
-
|
|
186
|
+
const timeoutPromise = _ts_add_disposable_resource(env, timerResource.timerResource(opts.timeoutMs), false);
|
|
187
|
+
;
|
|
188
|
+
const res = await unpromise.Unpromise.race([
|
|
122
189
|
opts.promise,
|
|
123
|
-
timeoutPromise
|
|
190
|
+
timeoutPromise.start()
|
|
124
191
|
]);
|
|
192
|
+
if (res === timerResource.disposablePromiseTimerResult) {
|
|
193
|
+
return await opts.onTimeout();
|
|
194
|
+
}
|
|
195
|
+
return res;
|
|
196
|
+
} catch (e) {
|
|
197
|
+
env.error = e;
|
|
198
|
+
env.hasError = true;
|
|
125
199
|
} finally{
|
|
126
|
-
|
|
127
|
-
clearTimeout(timeoutId);
|
|
200
|
+
_ts_dispose_resources(env);
|
|
128
201
|
}
|
|
129
|
-
if (res === null) {
|
|
130
|
-
return await opts.onTimeout();
|
|
131
|
-
}
|
|
132
|
-
return res;
|
|
133
202
|
}
|
|
134
203
|
/**
|
|
135
204
|
* @see https://html.spec.whatwg.org/multipage/server-sent-events.html
|
|
@@ -214,69 +283,69 @@ async function withTimeout(opts) {
|
|
|
214
283
|
_es?.close();
|
|
215
284
|
}
|
|
216
285
|
});
|
|
217
|
-
const
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
reader
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
286
|
+
const getStreamResource = ()=>{
|
|
287
|
+
let stream = createStream();
|
|
288
|
+
let reader = stream.getReader();
|
|
289
|
+
async function dispose() {
|
|
290
|
+
await reader.cancel();
|
|
291
|
+
_es = null;
|
|
292
|
+
}
|
|
293
|
+
return disposable.makeAsyncResource({
|
|
294
|
+
read () {
|
|
295
|
+
return reader.read();
|
|
296
|
+
},
|
|
297
|
+
async recreate () {
|
|
298
|
+
await dispose();
|
|
299
|
+
stream = createStream();
|
|
300
|
+
reader = stream.getReader();
|
|
225
301
|
}
|
|
226
|
-
};
|
|
302
|
+
}, dispose);
|
|
227
303
|
};
|
|
228
|
-
return {
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
if (result.done) {
|
|
259
|
-
return {
|
|
260
|
-
value: result.value,
|
|
261
|
-
done: true
|
|
262
|
-
};
|
|
263
|
-
}
|
|
264
|
-
return {
|
|
265
|
-
value: result.value,
|
|
266
|
-
done: false
|
|
267
|
-
};
|
|
268
|
-
},
|
|
269
|
-
async return () {
|
|
270
|
-
await stream.cancel();
|
|
271
|
-
return {
|
|
272
|
-
value: undefined,
|
|
273
|
-
done: true
|
|
274
|
-
};
|
|
304
|
+
return utils.run(async function*() {
|
|
305
|
+
const env = {
|
|
306
|
+
stack: [],
|
|
307
|
+
error: void 0,
|
|
308
|
+
hasError: false
|
|
309
|
+
};
|
|
310
|
+
try {
|
|
311
|
+
const stream = _ts_add_disposable_resource(env, getStreamResource(), true);
|
|
312
|
+
;
|
|
313
|
+
while(true){
|
|
314
|
+
let promise = stream.read();
|
|
315
|
+
const timeoutMs = clientOptions.reconnectAfterInactivityMs;
|
|
316
|
+
if (timeoutMs) {
|
|
317
|
+
promise = withTimeout({
|
|
318
|
+
promise,
|
|
319
|
+
timeoutMs,
|
|
320
|
+
onTimeout: async ()=>{
|
|
321
|
+
const res = {
|
|
322
|
+
value: {
|
|
323
|
+
type: 'timeout',
|
|
324
|
+
ms: timeoutMs,
|
|
325
|
+
eventSource: _es
|
|
326
|
+
},
|
|
327
|
+
done: false
|
|
328
|
+
};
|
|
329
|
+
// Close and release old reader
|
|
330
|
+
await stream.recreate();
|
|
331
|
+
return res;
|
|
332
|
+
}
|
|
333
|
+
});
|
|
275
334
|
}
|
|
276
|
-
|
|
277
|
-
|
|
335
|
+
const result = await promise;
|
|
336
|
+
if (result.done) {
|
|
337
|
+
return result.value;
|
|
338
|
+
}
|
|
339
|
+
yield result.value;
|
|
340
|
+
}
|
|
341
|
+
} catch (e) {
|
|
342
|
+
env.error = e;
|
|
343
|
+
env.hasError = true;
|
|
344
|
+
} finally{
|
|
345
|
+
const result = _ts_dispose_resources(env);
|
|
346
|
+
if (result) await result;
|
|
278
347
|
}
|
|
279
|
-
};
|
|
348
|
+
});
|
|
280
349
|
}
|
|
281
350
|
const sseHeaders = {
|
|
282
351
|
'Content-Type': 'text/event-stream',
|
|
@@ -1,12 +1,79 @@
|
|
|
1
1
|
import { Unpromise } from '../../vendor/unpromise/unpromise.mjs';
|
|
2
2
|
import { getTRPCErrorFromUnknown } from '../error/TRPCError.mjs';
|
|
3
3
|
import { isAbortError } from '../http/isAbortError.mjs';
|
|
4
|
-
import { identity } from '../utils.mjs';
|
|
4
|
+
import { run, identity } from '../utils.mjs';
|
|
5
5
|
import { isTrackedEnvelope } from './tracked.mjs';
|
|
6
6
|
import { takeWithGrace, withMaxDuration } from './utils/asyncIterable.mjs';
|
|
7
|
+
import { makeAsyncResource } from './utils/disposable.mjs';
|
|
7
8
|
import { readableStreamFrom } from './utils/readableStreamFrom.mjs';
|
|
9
|
+
import { timerResource, disposablePromiseTimerResult } from './utils/timerResource.mjs';
|
|
8
10
|
import { withPing, PING_SYM } from './utils/withPing.mjs';
|
|
9
11
|
|
|
12
|
+
function _ts_add_disposable_resource(env, value, async) {
|
|
13
|
+
if (value !== null && value !== void 0) {
|
|
14
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
15
|
+
var dispose, inner;
|
|
16
|
+
if (async) {
|
|
17
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
18
|
+
dispose = value[Symbol.asyncDispose];
|
|
19
|
+
}
|
|
20
|
+
if (dispose === void 0) {
|
|
21
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
22
|
+
dispose = value[Symbol.dispose];
|
|
23
|
+
if (async) inner = dispose;
|
|
24
|
+
}
|
|
25
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
26
|
+
if (inner) dispose = function() {
|
|
27
|
+
try {
|
|
28
|
+
inner.call(this);
|
|
29
|
+
} catch (e) {
|
|
30
|
+
return Promise.reject(e);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
env.stack.push({
|
|
34
|
+
value: value,
|
|
35
|
+
dispose: dispose,
|
|
36
|
+
async: async
|
|
37
|
+
});
|
|
38
|
+
} else if (async) {
|
|
39
|
+
env.stack.push({
|
|
40
|
+
async: true
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
function _ts_dispose_resources(env) {
|
|
46
|
+
var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
|
|
47
|
+
var e = new Error(message);
|
|
48
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
49
|
+
};
|
|
50
|
+
return (_ts_dispose_resources = function _ts_dispose_resources(env) {
|
|
51
|
+
function fail(e) {
|
|
52
|
+
env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
53
|
+
env.hasError = true;
|
|
54
|
+
}
|
|
55
|
+
var r, s = 0;
|
|
56
|
+
function next() {
|
|
57
|
+
while(r = env.stack.pop()){
|
|
58
|
+
try {
|
|
59
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
60
|
+
if (r.dispose) {
|
|
61
|
+
var result = r.dispose.call(r.value);
|
|
62
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
|
|
63
|
+
fail(e);
|
|
64
|
+
return next();
|
|
65
|
+
});
|
|
66
|
+
} else s |= 1;
|
|
67
|
+
} catch (e) {
|
|
68
|
+
fail(e);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
72
|
+
if (env.hasError) throw env.error;
|
|
73
|
+
}
|
|
74
|
+
return next();
|
|
75
|
+
})(env);
|
|
76
|
+
}
|
|
10
77
|
const PING_EVENT = 'ping';
|
|
11
78
|
const SERIALIZED_ERROR_EVENT = 'serialized-error';
|
|
12
79
|
const CONNECTED_EVENT = 'connected';
|
|
@@ -108,26 +175,28 @@ const CONNECTED_EVENT = 'connected';
|
|
|
108
175
|
}));
|
|
109
176
|
}
|
|
110
177
|
async function withTimeout(opts) {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
});
|
|
117
|
-
let res;
|
|
178
|
+
const env = {
|
|
179
|
+
stack: [],
|
|
180
|
+
error: void 0,
|
|
181
|
+
hasError: false
|
|
182
|
+
};
|
|
118
183
|
try {
|
|
119
|
-
|
|
184
|
+
const timeoutPromise = _ts_add_disposable_resource(env, timerResource(opts.timeoutMs), false);
|
|
185
|
+
;
|
|
186
|
+
const res = await Unpromise.race([
|
|
120
187
|
opts.promise,
|
|
121
|
-
timeoutPromise
|
|
188
|
+
timeoutPromise.start()
|
|
122
189
|
]);
|
|
190
|
+
if (res === disposablePromiseTimerResult) {
|
|
191
|
+
return await opts.onTimeout();
|
|
192
|
+
}
|
|
193
|
+
return res;
|
|
194
|
+
} catch (e) {
|
|
195
|
+
env.error = e;
|
|
196
|
+
env.hasError = true;
|
|
123
197
|
} finally{
|
|
124
|
-
|
|
125
|
-
clearTimeout(timeoutId);
|
|
198
|
+
_ts_dispose_resources(env);
|
|
126
199
|
}
|
|
127
|
-
if (res === null) {
|
|
128
|
-
return await opts.onTimeout();
|
|
129
|
-
}
|
|
130
|
-
return res;
|
|
131
200
|
}
|
|
132
201
|
/**
|
|
133
202
|
* @see https://html.spec.whatwg.org/multipage/server-sent-events.html
|
|
@@ -212,69 +281,69 @@ async function withTimeout(opts) {
|
|
|
212
281
|
_es?.close();
|
|
213
282
|
}
|
|
214
283
|
});
|
|
215
|
-
const
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
reader
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
284
|
+
const getStreamResource = ()=>{
|
|
285
|
+
let stream = createStream();
|
|
286
|
+
let reader = stream.getReader();
|
|
287
|
+
async function dispose() {
|
|
288
|
+
await reader.cancel();
|
|
289
|
+
_es = null;
|
|
290
|
+
}
|
|
291
|
+
return makeAsyncResource({
|
|
292
|
+
read () {
|
|
293
|
+
return reader.read();
|
|
294
|
+
},
|
|
295
|
+
async recreate () {
|
|
296
|
+
await dispose();
|
|
297
|
+
stream = createStream();
|
|
298
|
+
reader = stream.getReader();
|
|
223
299
|
}
|
|
224
|
-
};
|
|
300
|
+
}, dispose);
|
|
225
301
|
};
|
|
226
|
-
return {
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
if (result.done) {
|
|
257
|
-
return {
|
|
258
|
-
value: result.value,
|
|
259
|
-
done: true
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
|
-
return {
|
|
263
|
-
value: result.value,
|
|
264
|
-
done: false
|
|
265
|
-
};
|
|
266
|
-
},
|
|
267
|
-
async return () {
|
|
268
|
-
await stream.cancel();
|
|
269
|
-
return {
|
|
270
|
-
value: undefined,
|
|
271
|
-
done: true
|
|
272
|
-
};
|
|
302
|
+
return run(async function*() {
|
|
303
|
+
const env = {
|
|
304
|
+
stack: [],
|
|
305
|
+
error: void 0,
|
|
306
|
+
hasError: false
|
|
307
|
+
};
|
|
308
|
+
try {
|
|
309
|
+
const stream = _ts_add_disposable_resource(env, getStreamResource(), true);
|
|
310
|
+
;
|
|
311
|
+
while(true){
|
|
312
|
+
let promise = stream.read();
|
|
313
|
+
const timeoutMs = clientOptions.reconnectAfterInactivityMs;
|
|
314
|
+
if (timeoutMs) {
|
|
315
|
+
promise = withTimeout({
|
|
316
|
+
promise,
|
|
317
|
+
timeoutMs,
|
|
318
|
+
onTimeout: async ()=>{
|
|
319
|
+
const res = {
|
|
320
|
+
value: {
|
|
321
|
+
type: 'timeout',
|
|
322
|
+
ms: timeoutMs,
|
|
323
|
+
eventSource: _es
|
|
324
|
+
},
|
|
325
|
+
done: false
|
|
326
|
+
};
|
|
327
|
+
// Close and release old reader
|
|
328
|
+
await stream.recreate();
|
|
329
|
+
return res;
|
|
330
|
+
}
|
|
331
|
+
});
|
|
273
332
|
}
|
|
274
|
-
|
|
275
|
-
|
|
333
|
+
const result = await promise;
|
|
334
|
+
if (result.done) {
|
|
335
|
+
return result.value;
|
|
336
|
+
}
|
|
337
|
+
yield result.value;
|
|
338
|
+
}
|
|
339
|
+
} catch (e) {
|
|
340
|
+
env.error = e;
|
|
341
|
+
env.hasError = true;
|
|
342
|
+
} finally{
|
|
343
|
+
const result = _ts_dispose_resources(env);
|
|
344
|
+
if (result) await result;
|
|
276
345
|
}
|
|
277
|
-
};
|
|
346
|
+
});
|
|
278
347
|
}
|
|
279
348
|
const sseHeaders = {
|
|
280
349
|
'Content-Type': 'text/event-stream',
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export declare function iteratorResource<TYield, TReturn, TNext>(iterable: AsyncIterable<TYield, TReturn, TNext>): AsyncIterator<TYield, TReturn, TNext> & AsyncDisposable;
|
|
1
2
|
/**
|
|
2
3
|
* Derives a new {@link AsyncGenerator} based on {@link iterable}, that automatically stops after the specified duration.
|
|
3
4
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asyncIterable.d.ts","sourceRoot":"","sources":["../../../../src/unstable-core-do-not-import/stream/utils/asyncIterable.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"asyncIterable.d.ts","sourceRoot":"","sources":["../../../../src/unstable-core-do-not-import/stream/utils/asyncIterable.ts"],"names":[],"mappings":"AAIA,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EACrD,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,GAC9C,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,eAAe,CAMzD;AACD;;GAEG;AACH,wBAAuB,eAAe,CAAC,CAAC,EACtC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAC1B,IAAI,EAAE;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,GAC9B,cAAc,CAAC,CAAC,CAAC,CAyBnB;AAED;;;;GAIG;AACH,wBAAuB,aAAa,CAAC,CAAC,EACpC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAC1B,IAAI,EAAE;IACJ,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;CACvB,GACA,cAAc,CAAC,CAAC,CAAC,CA+BnB"}
|
|
@@ -1,14 +1,93 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var unpromise = require('../../../vendor/unpromise/unpromise.js');
|
|
4
|
+
var disposable = require('./disposable.js');
|
|
4
5
|
var timerResource = require('./timerResource.js');
|
|
5
6
|
|
|
7
|
+
function _ts_add_disposable_resource(env, value, async) {
|
|
8
|
+
if (value !== null && value !== void 0) {
|
|
9
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
10
|
+
var dispose, inner;
|
|
11
|
+
if (async) {
|
|
12
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
13
|
+
dispose = value[Symbol.asyncDispose];
|
|
14
|
+
}
|
|
15
|
+
if (dispose === void 0) {
|
|
16
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
17
|
+
dispose = value[Symbol.dispose];
|
|
18
|
+
if (async) inner = dispose;
|
|
19
|
+
}
|
|
20
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
21
|
+
if (inner) dispose = function() {
|
|
22
|
+
try {
|
|
23
|
+
inner.call(this);
|
|
24
|
+
} catch (e) {
|
|
25
|
+
return Promise.reject(e);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
env.stack.push({
|
|
29
|
+
value: value,
|
|
30
|
+
dispose: dispose,
|
|
31
|
+
async: async
|
|
32
|
+
});
|
|
33
|
+
} else if (async) {
|
|
34
|
+
env.stack.push({
|
|
35
|
+
async: true
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
function _ts_dispose_resources(env) {
|
|
41
|
+
var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
|
|
42
|
+
var e = new Error(message);
|
|
43
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
44
|
+
};
|
|
45
|
+
return (_ts_dispose_resources = function _ts_dispose_resources(env) {
|
|
46
|
+
function fail(e) {
|
|
47
|
+
env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
48
|
+
env.hasError = true;
|
|
49
|
+
}
|
|
50
|
+
var r, s = 0;
|
|
51
|
+
function next() {
|
|
52
|
+
while(r = env.stack.pop()){
|
|
53
|
+
try {
|
|
54
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
55
|
+
if (r.dispose) {
|
|
56
|
+
var result = r.dispose.call(r.value);
|
|
57
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
|
|
58
|
+
fail(e);
|
|
59
|
+
return next();
|
|
60
|
+
});
|
|
61
|
+
} else s |= 1;
|
|
62
|
+
} catch (e) {
|
|
63
|
+
fail(e);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
67
|
+
if (env.hasError) throw env.error;
|
|
68
|
+
}
|
|
69
|
+
return next();
|
|
70
|
+
})(env);
|
|
71
|
+
}
|
|
72
|
+
function iteratorResource(iterable) {
|
|
73
|
+
const iterator = iterable[Symbol.asyncIterator]();
|
|
74
|
+
return disposable.makeAsyncResource(iterator, async ()=>{
|
|
75
|
+
await iterator.return?.();
|
|
76
|
+
});
|
|
77
|
+
}
|
|
6
78
|
/**
|
|
7
79
|
* Derives a new {@link AsyncGenerator} based on {@link iterable}, that automatically stops after the specified duration.
|
|
8
80
|
*/ async function* withMaxDuration(iterable, opts) {
|
|
9
|
-
const
|
|
10
|
-
|
|
81
|
+
const env = {
|
|
82
|
+
stack: [],
|
|
83
|
+
error: void 0,
|
|
84
|
+
hasError: false
|
|
85
|
+
};
|
|
11
86
|
try {
|
|
87
|
+
const iterator = _ts_add_disposable_resource(env, iteratorResource(iterable), true);
|
|
88
|
+
;
|
|
89
|
+
const timer = _ts_add_disposable_resource(env, timerResource.timerResource(opts.maxDurationMs), false);
|
|
90
|
+
;
|
|
12
91
|
const timerPromise = timer.start();
|
|
13
92
|
// declaration outside the loop for garbage collection reasons
|
|
14
93
|
let result;
|
|
@@ -29,10 +108,12 @@ var timerResource = require('./timerResource.js');
|
|
|
29
108
|
// free up reference for garbage collection
|
|
30
109
|
result = null;
|
|
31
110
|
}
|
|
111
|
+
} catch (e) {
|
|
112
|
+
env.error = e;
|
|
113
|
+
env.hasError = true;
|
|
32
114
|
} finally{
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
timer[Symbol.dispose]();
|
|
115
|
+
const result = _ts_dispose_resources(env);
|
|
116
|
+
if (result) await result;
|
|
36
117
|
}
|
|
37
118
|
}
|
|
38
119
|
/**
|
|
@@ -40,11 +121,18 @@ var timerResource = require('./timerResource.js');
|
|
|
40
121
|
* {@link count} values. Then, a grace period of {@link gracePeriodMs} is started in which further
|
|
41
122
|
* values may still come through. After this period, the generator stops.
|
|
42
123
|
*/ async function* takeWithGrace(iterable, opts) {
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
124
|
+
const env = {
|
|
125
|
+
stack: [],
|
|
126
|
+
error: void 0,
|
|
127
|
+
hasError: false
|
|
128
|
+
};
|
|
47
129
|
try {
|
|
130
|
+
const iterator = _ts_add_disposable_resource(env, iteratorResource(iterable), true);
|
|
131
|
+
;
|
|
132
|
+
// declaration outside the loop for garbage collection reasons
|
|
133
|
+
let result;
|
|
134
|
+
const timer = _ts_add_disposable_resource(env, timerResource.timerResource(opts.gracePeriodMs), false);
|
|
135
|
+
;
|
|
48
136
|
let count = opts.count;
|
|
49
137
|
let timerPromise = new Promise(()=>{
|
|
50
138
|
// never resolves
|
|
@@ -69,10 +157,15 @@ var timerResource = require('./timerResource.js');
|
|
|
69
157
|
// free up reference for garbage collection
|
|
70
158
|
result = null;
|
|
71
159
|
}
|
|
160
|
+
} catch (e) {
|
|
161
|
+
env.error = e;
|
|
162
|
+
env.hasError = true;
|
|
72
163
|
} finally{
|
|
73
|
-
|
|
164
|
+
const result = _ts_dispose_resources(env);
|
|
165
|
+
if (result) await result;
|
|
74
166
|
}
|
|
75
167
|
}
|
|
76
168
|
|
|
169
|
+
exports.iteratorResource = iteratorResource;
|
|
77
170
|
exports.takeWithGrace = takeWithGrace;
|
|
78
171
|
exports.withMaxDuration = withMaxDuration;
|