@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.
Files changed (85) hide show
  1. package/dist/adapters/aws-lambda/index.js +1 -1
  2. package/dist/adapters/aws-lambda/index.mjs +1 -1
  3. package/dist/adapters/express.js +1 -1
  4. package/dist/adapters/express.mjs +1 -1
  5. package/dist/adapters/fastify/fastifyRequestHandler.js +1 -1
  6. package/dist/adapters/fastify/fastifyRequestHandler.mjs +1 -1
  7. package/dist/adapters/fetch/fetchRequestHandler.js +1 -1
  8. package/dist/adapters/fetch/fetchRequestHandler.mjs +1 -1
  9. package/dist/adapters/next-app-dir/nextAppDirCaller.js +1 -1
  10. package/dist/adapters/next-app-dir/nextAppDirCaller.mjs +1 -1
  11. package/dist/adapters/next-app-dir/notFound.js +1 -1
  12. package/dist/adapters/next-app-dir/notFound.mjs +1 -1
  13. package/dist/adapters/next-app-dir/redirect.js +15 -3
  14. package/dist/adapters/next-app-dir/redirect.mjs +14 -2
  15. package/dist/adapters/next.js +1 -1
  16. package/dist/adapters/next.mjs +1 -1
  17. package/dist/adapters/node-http/incomingMessageToRequest.js +1 -1
  18. package/dist/adapters/node-http/incomingMessageToRequest.mjs +1 -1
  19. package/dist/adapters/node-http/nodeHTTPRequestHandler.js +1 -1
  20. package/dist/adapters/node-http/nodeHTTPRequestHandler.mjs +1 -1
  21. package/dist/adapters/node-http/writeResponse.js +1 -1
  22. package/dist/adapters/node-http/writeResponse.mjs +1 -1
  23. package/dist/adapters/standalone.js +1 -1
  24. package/dist/adapters/standalone.mjs +1 -1
  25. package/dist/adapters/ws.d.ts.map +1 -1
  26. package/dist/adapters/ws.js +144 -65
  27. package/dist/adapters/ws.mjs +144 -65
  28. package/dist/bundle-analysis.json +190 -183
  29. package/dist/http.js +1 -1
  30. package/dist/http.mjs +1 -1
  31. package/dist/index.js +1 -1
  32. package/dist/index.mjs +1 -1
  33. 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
  34. package/dist/rpc.js +1 -1
  35. package/dist/rpc.mjs +1 -1
  36. package/dist/shared.js +1 -1
  37. package/dist/shared.mjs +1 -1
  38. package/dist/unstable-core-do-not-import/error/TRPCError.d.ts +1 -1
  39. package/dist/unstable-core-do-not-import/error/TRPCError.js +14 -2
  40. package/dist/unstable-core-do-not-import/error/TRPCError.mjs +13 -1
  41. package/dist/unstable-core-do-not-import/http/resolveResponse.d.ts.map +1 -1
  42. package/dist/unstable-core-do-not-import/http/resolveResponse.js +3 -9
  43. package/dist/unstable-core-do-not-import/http/resolveResponse.mjs +3 -9
  44. package/dist/unstable-core-do-not-import/middleware.d.ts.map +1 -1
  45. package/dist/unstable-core-do-not-import/stream/jsonl.d.ts +8 -34
  46. package/dist/unstable-core-do-not-import/stream/jsonl.d.ts.map +1 -1
  47. package/dist/unstable-core-do-not-import/stream/jsonl.js +338 -209
  48. package/dist/unstable-core-do-not-import/stream/jsonl.mjs +337 -208
  49. package/dist/unstable-core-do-not-import/stream/sse.d.ts.map +1 -1
  50. package/dist/unstable-core-do-not-import/stream/sse.js +143 -74
  51. package/dist/unstable-core-do-not-import/stream/sse.mjs +144 -75
  52. package/dist/unstable-core-do-not-import/stream/utils/asyncIterable.d.ts +1 -0
  53. package/dist/unstable-core-do-not-import/stream/utils/asyncIterable.d.ts.map +1 -1
  54. package/dist/unstable-core-do-not-import/stream/utils/asyncIterable.js +103 -10
  55. package/dist/unstable-core-do-not-import/stream/utils/asyncIterable.mjs +104 -12
  56. package/dist/unstable-core-do-not-import/stream/utils/disposable.d.ts +17 -0
  57. package/dist/unstable-core-do-not-import/stream/utils/disposable.d.ts.map +1 -0
  58. package/dist/unstable-core-do-not-import/stream/utils/disposable.js +44 -0
  59. package/dist/unstable-core-do-not-import/stream/utils/disposable.mjs +41 -0
  60. package/dist/unstable-core-do-not-import/stream/utils/timerResource.d.ts +1 -2
  61. package/dist/unstable-core-do-not-import/stream/utils/timerResource.d.ts.map +1 -1
  62. package/dist/unstable-core-do-not-import/stream/utils/timerResource.js +8 -10
  63. package/dist/unstable-core-do-not-import/stream/utils/timerResource.mjs +8 -10
  64. package/dist/unstable-core-do-not-import/stream/utils/withPing.d.ts.map +1 -1
  65. package/dist/unstable-core-do-not-import/stream/utils/withPing.js +113 -24
  66. package/dist/unstable-core-do-not-import/stream/utils/withPing.mjs +114 -25
  67. package/dist/unstable-core-do-not-import/transformer.d.ts +1 -1
  68. package/dist/unstable-core-do-not-import.d.ts +1 -0
  69. package/dist/unstable-core-do-not-import.d.ts.map +1 -1
  70. package/dist/unstable-core-do-not-import.js +3 -0
  71. package/dist/unstable-core-do-not-import.mjs +1 -0
  72. package/dist/vendor/unpromise/unpromise.js +17 -6
  73. package/dist/vendor/unpromise/unpromise.mjs +13 -2
  74. package/package.json +3 -4
  75. package/src/adapters/ws.ts +7 -8
  76. package/src/unstable-core-do-not-import/http/resolveResponse.ts +3 -9
  77. package/src/unstable-core-do-not-import/stream/jsonl.ts +128 -153
  78. package/src/unstable-core-do-not-import/stream/sse.ts +64 -79
  79. package/src/unstable-core-do-not-import/stream/utils/asyncIterable.ts +50 -48
  80. package/src/unstable-core-do-not-import/stream/utils/disposable.ts +52 -0
  81. package/src/unstable-core-do-not-import/stream/utils/timerResource.ts +17 -15
  82. package/src/unstable-core-do-not-import/stream/utils/withPing.ts +18 -19
  83. package/src/unstable-core-do-not-import.ts +1 -0
  84. package/dist/node_modules/.pnpm/@swc_helpers@0.5.13/node_modules/@swc/helpers/esm/_define_property.js +0 -11
  85. 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
- let timeoutId;
114
- const timeoutPromise = new Promise((resolve)=>{
115
- timeoutId = setTimeout(()=>{
116
- resolve(null);
117
- }, opts.timeoutMs);
118
- });
119
- let res;
180
+ const env = {
181
+ stack: [],
182
+ error: void 0,
183
+ hasError: false
184
+ };
120
185
  try {
121
- res = await unpromise.Unpromise.race([
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
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
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 getNewStreamAndReader = ()=>{
218
- const stream = createStream();
219
- const reader = stream.getReader();
220
- return {
221
- reader,
222
- cancel: ()=>{
223
- reader.releaseLock();
224
- return stream.cancel();
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
- [Symbol.asyncIterator] () {
230
- let stream = getNewStreamAndReader();
231
- const iterator = {
232
- async next () {
233
- let promise = stream.reader.read();
234
- const timeoutMs = clientOptions.reconnectAfterInactivityMs;
235
- if (timeoutMs) {
236
- promise = withTimeout({
237
- promise,
238
- timeoutMs,
239
- onTimeout: async ()=>{
240
- const res = {
241
- value: {
242
- type: 'timeout',
243
- ms: timeoutMs,
244
- eventSource: _es
245
- },
246
- done: false
247
- };
248
- // Close and release old reader
249
- await stream.cancel();
250
- // Create new reader
251
- stream = getNewStreamAndReader();
252
- return res;
253
- }
254
- });
255
- }
256
- const result = await promise;
257
- // console.debug('result', result, 'done', result.done);
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
- return iterator;
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
- let timeoutId;
112
- const timeoutPromise = new Promise((resolve)=>{
113
- timeoutId = setTimeout(()=>{
114
- resolve(null);
115
- }, opts.timeoutMs);
116
- });
117
- let res;
178
+ const env = {
179
+ stack: [],
180
+ error: void 0,
181
+ hasError: false
182
+ };
118
183
  try {
119
- res = await Unpromise.race([
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
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
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 getNewStreamAndReader = ()=>{
216
- const stream = createStream();
217
- const reader = stream.getReader();
218
- return {
219
- reader,
220
- cancel: ()=>{
221
- reader.releaseLock();
222
- return stream.cancel();
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
- [Symbol.asyncIterator] () {
228
- let stream = getNewStreamAndReader();
229
- const iterator = {
230
- async next () {
231
- let promise = stream.reader.read();
232
- const timeoutMs = clientOptions.reconnectAfterInactivityMs;
233
- if (timeoutMs) {
234
- promise = withTimeout({
235
- promise,
236
- timeoutMs,
237
- onTimeout: async ()=>{
238
- const res = {
239
- value: {
240
- type: 'timeout',
241
- ms: timeoutMs,
242
- eventSource: _es
243
- },
244
- done: false
245
- };
246
- // Close and release old reader
247
- await stream.cancel();
248
- // Create new reader
249
- stream = getNewStreamAndReader();
250
- return res;
251
- }
252
- });
253
- }
254
- const result = await promise;
255
- // console.debug('result', result, 'done', result.done);
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
- return iterator;
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":"AAGA;;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,CA8BnB;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,CAkCnB"}
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 iterator = iterable[Symbol.asyncIterator]();
10
- const timer = timerResource.timerResource(opts.maxDurationMs);
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
- // dispose timer
34
- // Shouldn't be needed, but build breaks with `using` keyword
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 iterator = iterable[Symbol.asyncIterator]();
44
- // declaration outside the loop for garbage collection reasons
45
- let result;
46
- const timer = timerResource.timerResource(opts.gracePeriodMs);
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
- timer[Symbol.dispose]();
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;