async.js 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835
  1. /*---------------------------------------------------------------------------------------------
  2. * Copyright (c) Microsoft Corporation. All rights reserved.
  3. * Licensed under the MIT License. See License.txt in the project root for license information.
  4. *--------------------------------------------------------------------------------------------*/
  5. var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
  6. function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  7. return new (P || (P = Promise))(function (resolve, reject) {
  8. function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  9. function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  10. function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
  11. step((generator = generator.apply(thisArg, _arguments || [])).next());
  12. });
  13. };
  14. var __asyncValues = (this && this.__asyncValues) || function (o) {
  15. if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
  16. var m = o[Symbol.asyncIterator], i;
  17. return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
  18. function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
  19. function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
  20. };
  21. import { CancellationTokenSource } from './cancellation.js';
  22. import { CancellationError } from './errors.js';
  23. import { Emitter, Event } from './event.js';
  24. import { toDisposable } from './lifecycle.js';
  25. import { setTimeout0 } from './platform.js';
  26. export function isThenable(obj) {
  27. return !!obj && typeof obj.then === 'function';
  28. }
  29. export function createCancelablePromise(callback) {
  30. const source = new CancellationTokenSource();
  31. const thenable = callback(source.token);
  32. const promise = new Promise((resolve, reject) => {
  33. const subscription = source.token.onCancellationRequested(() => {
  34. subscription.dispose();
  35. source.dispose();
  36. reject(new CancellationError());
  37. });
  38. Promise.resolve(thenable).then(value => {
  39. subscription.dispose();
  40. source.dispose();
  41. resolve(value);
  42. }, err => {
  43. subscription.dispose();
  44. source.dispose();
  45. reject(err);
  46. });
  47. });
  48. return new class {
  49. cancel() {
  50. source.cancel();
  51. }
  52. then(resolve, reject) {
  53. return promise.then(resolve, reject);
  54. }
  55. catch(reject) {
  56. return this.then(undefined, reject);
  57. }
  58. finally(onfinally) {
  59. return promise.finally(onfinally);
  60. }
  61. };
  62. }
  63. export function raceCancellation(promise, token, defaultValue) {
  64. return new Promise((resolve, reject) => {
  65. const ref = token.onCancellationRequested(() => {
  66. ref.dispose();
  67. resolve(defaultValue);
  68. });
  69. promise.then(resolve, reject).finally(() => ref.dispose());
  70. });
  71. }
  72. /**
  73. * A helper to prevent accumulation of sequential async tasks.
  74. *
  75. * Imagine a mail man with the sole task of delivering letters. As soon as
  76. * a letter submitted for delivery, he drives to the destination, delivers it
  77. * and returns to his base. Imagine that during the trip, N more letters were submitted.
  78. * When the mail man returns, he picks those N letters and delivers them all in a
  79. * single trip. Even though N+1 submissions occurred, only 2 deliveries were made.
  80. *
  81. * The throttler implements this via the queue() method, by providing it a task
  82. * factory. Following the example:
  83. *
  84. * const throttler = new Throttler();
  85. * const letters = [];
  86. *
  87. * function deliver() {
  88. * const lettersToDeliver = letters;
  89. * letters = [];
  90. * return makeTheTrip(lettersToDeliver);
  91. * }
  92. *
  93. * function onLetterReceived(l) {
  94. * letters.push(l);
  95. * throttler.queue(deliver);
  96. * }
  97. */
  98. export class Throttler {
  99. constructor() {
  100. this.activePromise = null;
  101. this.queuedPromise = null;
  102. this.queuedPromiseFactory = null;
  103. }
  104. queue(promiseFactory) {
  105. if (this.activePromise) {
  106. this.queuedPromiseFactory = promiseFactory;
  107. if (!this.queuedPromise) {
  108. const onComplete = () => {
  109. this.queuedPromise = null;
  110. const result = this.queue(this.queuedPromiseFactory);
  111. this.queuedPromiseFactory = null;
  112. return result;
  113. };
  114. this.queuedPromise = new Promise(resolve => {
  115. this.activePromise.then(onComplete, onComplete).then(resolve);
  116. });
  117. }
  118. return new Promise((resolve, reject) => {
  119. this.queuedPromise.then(resolve, reject);
  120. });
  121. }
  122. this.activePromise = promiseFactory();
  123. return new Promise((resolve, reject) => {
  124. this.activePromise.then((result) => {
  125. this.activePromise = null;
  126. resolve(result);
  127. }, (err) => {
  128. this.activePromise = null;
  129. reject(err);
  130. });
  131. });
  132. }
  133. }
  134. const timeoutDeferred = (timeout, fn) => {
  135. let scheduled = true;
  136. const handle = setTimeout(() => {
  137. scheduled = false;
  138. fn();
  139. }, timeout);
  140. return {
  141. isTriggered: () => scheduled,
  142. dispose: () => {
  143. clearTimeout(handle);
  144. scheduled = false;
  145. },
  146. };
  147. };
  148. const microtaskDeferred = (fn) => {
  149. let scheduled = true;
  150. queueMicrotask(() => {
  151. if (scheduled) {
  152. scheduled = false;
  153. fn();
  154. }
  155. });
  156. return {
  157. isTriggered: () => scheduled,
  158. dispose: () => { scheduled = false; },
  159. };
  160. };
  161. /** Can be passed into the Delayed to defer using a microtask */
  162. export const MicrotaskDelay = Symbol('MicrotaskDelay');
  163. /**
  164. * A helper to delay (debounce) execution of a task that is being requested often.
  165. *
  166. * Following the throttler, now imagine the mail man wants to optimize the number of
  167. * trips proactively. The trip itself can be long, so he decides not to make the trip
  168. * as soon as a letter is submitted. Instead he waits a while, in case more
  169. * letters are submitted. After said waiting period, if no letters were submitted, he
  170. * decides to make the trip. Imagine that N more letters were submitted after the first
  171. * one, all within a short period of time between each other. Even though N+1
  172. * submissions occurred, only 1 delivery was made.
  173. *
  174. * The delayer offers this behavior via the trigger() method, into which both the task
  175. * to be executed and the waiting period (delay) must be passed in as arguments. Following
  176. * the example:
  177. *
  178. * const delayer = new Delayer(WAITING_PERIOD);
  179. * const letters = [];
  180. *
  181. * function letterReceived(l) {
  182. * letters.push(l);
  183. * delayer.trigger(() => { return makeTheTrip(); });
  184. * }
  185. */
  186. export class Delayer {
  187. constructor(defaultDelay) {
  188. this.defaultDelay = defaultDelay;
  189. this.deferred = null;
  190. this.completionPromise = null;
  191. this.doResolve = null;
  192. this.doReject = null;
  193. this.task = null;
  194. }
  195. trigger(task, delay = this.defaultDelay) {
  196. this.task = task;
  197. this.cancelTimeout();
  198. if (!this.completionPromise) {
  199. this.completionPromise = new Promise((resolve, reject) => {
  200. this.doResolve = resolve;
  201. this.doReject = reject;
  202. }).then(() => {
  203. this.completionPromise = null;
  204. this.doResolve = null;
  205. if (this.task) {
  206. const task = this.task;
  207. this.task = null;
  208. return task();
  209. }
  210. return undefined;
  211. });
  212. }
  213. const fn = () => {
  214. var _a;
  215. this.deferred = null;
  216. (_a = this.doResolve) === null || _a === void 0 ? void 0 : _a.call(this, null);
  217. };
  218. this.deferred = delay === MicrotaskDelay ? microtaskDeferred(fn) : timeoutDeferred(delay, fn);
  219. return this.completionPromise;
  220. }
  221. isTriggered() {
  222. var _a;
  223. return !!((_a = this.deferred) === null || _a === void 0 ? void 0 : _a.isTriggered());
  224. }
  225. cancel() {
  226. var _a;
  227. this.cancelTimeout();
  228. if (this.completionPromise) {
  229. (_a = this.doReject) === null || _a === void 0 ? void 0 : _a.call(this, new CancellationError());
  230. this.completionPromise = null;
  231. }
  232. }
  233. cancelTimeout() {
  234. var _a;
  235. (_a = this.deferred) === null || _a === void 0 ? void 0 : _a.dispose();
  236. this.deferred = null;
  237. }
  238. dispose() {
  239. this.cancel();
  240. }
  241. }
  242. /**
  243. * A helper to delay execution of a task that is being requested often, while
  244. * preventing accumulation of consecutive executions, while the task runs.
  245. *
  246. * The mail man is clever and waits for a certain amount of time, before going
  247. * out to deliver letters. While the mail man is going out, more letters arrive
  248. * and can only be delivered once he is back. Once he is back the mail man will
  249. * do one more trip to deliver the letters that have accumulated while he was out.
  250. */
  251. export class ThrottledDelayer {
  252. constructor(defaultDelay) {
  253. this.delayer = new Delayer(defaultDelay);
  254. this.throttler = new Throttler();
  255. }
  256. trigger(promiseFactory, delay) {
  257. return this.delayer.trigger(() => this.throttler.queue(promiseFactory), delay);
  258. }
  259. dispose() {
  260. this.delayer.dispose();
  261. }
  262. }
  263. export function timeout(millis, token) {
  264. if (!token) {
  265. return createCancelablePromise(token => timeout(millis, token));
  266. }
  267. return new Promise((resolve, reject) => {
  268. const handle = setTimeout(() => {
  269. disposable.dispose();
  270. resolve();
  271. }, millis);
  272. const disposable = token.onCancellationRequested(() => {
  273. clearTimeout(handle);
  274. disposable.dispose();
  275. reject(new CancellationError());
  276. });
  277. });
  278. }
  279. export function disposableTimeout(handler, timeout = 0) {
  280. const timer = setTimeout(handler, timeout);
  281. return toDisposable(() => clearTimeout(timer));
  282. }
  283. export function first(promiseFactories, shouldStop = t => !!t, defaultValue = null) {
  284. let index = 0;
  285. const len = promiseFactories.length;
  286. const loop = () => {
  287. if (index >= len) {
  288. return Promise.resolve(defaultValue);
  289. }
  290. const factory = promiseFactories[index++];
  291. const promise = Promise.resolve(factory());
  292. return promise.then(result => {
  293. if (shouldStop(result)) {
  294. return Promise.resolve(result);
  295. }
  296. return loop();
  297. });
  298. };
  299. return loop();
  300. }
  301. export class TimeoutTimer {
  302. constructor(runner, timeout) {
  303. this._token = -1;
  304. if (typeof runner === 'function' && typeof timeout === 'number') {
  305. this.setIfNotSet(runner, timeout);
  306. }
  307. }
  308. dispose() {
  309. this.cancel();
  310. }
  311. cancel() {
  312. if (this._token !== -1) {
  313. clearTimeout(this._token);
  314. this._token = -1;
  315. }
  316. }
  317. cancelAndSet(runner, timeout) {
  318. this.cancel();
  319. this._token = setTimeout(() => {
  320. this._token = -1;
  321. runner();
  322. }, timeout);
  323. }
  324. setIfNotSet(runner, timeout) {
  325. if (this._token !== -1) {
  326. // timer is already set
  327. return;
  328. }
  329. this._token = setTimeout(() => {
  330. this._token = -1;
  331. runner();
  332. }, timeout);
  333. }
  334. }
  335. export class IntervalTimer {
  336. constructor() {
  337. this._token = -1;
  338. }
  339. dispose() {
  340. this.cancel();
  341. }
  342. cancel() {
  343. if (this._token !== -1) {
  344. clearInterval(this._token);
  345. this._token = -1;
  346. }
  347. }
  348. cancelAndSet(runner, interval) {
  349. this.cancel();
  350. this._token = setInterval(() => {
  351. runner();
  352. }, interval);
  353. }
  354. }
  355. export class RunOnceScheduler {
  356. constructor(runner, delay) {
  357. this.timeoutToken = -1;
  358. this.runner = runner;
  359. this.timeout = delay;
  360. this.timeoutHandler = this.onTimeout.bind(this);
  361. }
  362. /**
  363. * Dispose RunOnceScheduler
  364. */
  365. dispose() {
  366. this.cancel();
  367. this.runner = null;
  368. }
  369. /**
  370. * Cancel current scheduled runner (if any).
  371. */
  372. cancel() {
  373. if (this.isScheduled()) {
  374. clearTimeout(this.timeoutToken);
  375. this.timeoutToken = -1;
  376. }
  377. }
  378. /**
  379. * Cancel previous runner (if any) & schedule a new runner.
  380. */
  381. schedule(delay = this.timeout) {
  382. this.cancel();
  383. this.timeoutToken = setTimeout(this.timeoutHandler, delay);
  384. }
  385. get delay() {
  386. return this.timeout;
  387. }
  388. set delay(value) {
  389. this.timeout = value;
  390. }
  391. /**
  392. * Returns true if scheduled.
  393. */
  394. isScheduled() {
  395. return this.timeoutToken !== -1;
  396. }
  397. onTimeout() {
  398. this.timeoutToken = -1;
  399. if (this.runner) {
  400. this.doRun();
  401. }
  402. }
  403. doRun() {
  404. var _a;
  405. (_a = this.runner) === null || _a === void 0 ? void 0 : _a.call(this);
  406. }
  407. }
  408. /**
  409. * Execute the callback the next time the browser is idle
  410. */
  411. export let runWhenIdle;
  412. (function () {
  413. if (typeof requestIdleCallback !== 'function' || typeof cancelIdleCallback !== 'function') {
  414. runWhenIdle = (runner) => {
  415. setTimeout0(() => {
  416. if (disposed) {
  417. return;
  418. }
  419. const end = Date.now() + 15; // one frame at 64fps
  420. runner(Object.freeze({
  421. didTimeout: true,
  422. timeRemaining() {
  423. return Math.max(0, end - Date.now());
  424. }
  425. }));
  426. });
  427. let disposed = false;
  428. return {
  429. dispose() {
  430. if (disposed) {
  431. return;
  432. }
  433. disposed = true;
  434. }
  435. };
  436. };
  437. }
  438. else {
  439. runWhenIdle = (runner, timeout) => {
  440. const handle = requestIdleCallback(runner, typeof timeout === 'number' ? { timeout } : undefined);
  441. let disposed = false;
  442. return {
  443. dispose() {
  444. if (disposed) {
  445. return;
  446. }
  447. disposed = true;
  448. cancelIdleCallback(handle);
  449. }
  450. };
  451. };
  452. }
  453. })();
  454. /**
  455. * An implementation of the "idle-until-urgent"-strategy as introduced
  456. * here: https://philipwalton.com/articles/idle-until-urgent/
  457. */
  458. export class IdleValue {
  459. constructor(executor) {
  460. this._didRun = false;
  461. this._executor = () => {
  462. try {
  463. this._value = executor();
  464. }
  465. catch (err) {
  466. this._error = err;
  467. }
  468. finally {
  469. this._didRun = true;
  470. }
  471. };
  472. this._handle = runWhenIdle(() => this._executor());
  473. }
  474. dispose() {
  475. this._handle.dispose();
  476. }
  477. get value() {
  478. if (!this._didRun) {
  479. this._handle.dispose();
  480. this._executor();
  481. }
  482. if (this._error) {
  483. throw this._error;
  484. }
  485. return this._value;
  486. }
  487. get isInitialized() {
  488. return this._didRun;
  489. }
  490. }
  491. /**
  492. * Creates a promise whose resolution or rejection can be controlled imperatively.
  493. */
  494. export class DeferredPromise {
  495. constructor() {
  496. this.rejected = false;
  497. this.resolved = false;
  498. this.p = new Promise((c, e) => {
  499. this.completeCallback = c;
  500. this.errorCallback = e;
  501. });
  502. }
  503. get isRejected() {
  504. return this.rejected;
  505. }
  506. get isSettled() {
  507. return this.rejected || this.resolved;
  508. }
  509. complete(value) {
  510. return new Promise(resolve => {
  511. this.completeCallback(value);
  512. this.resolved = true;
  513. resolve();
  514. });
  515. }
  516. cancel() {
  517. new Promise(resolve => {
  518. this.errorCallback(new CancellationError());
  519. this.rejected = true;
  520. resolve();
  521. });
  522. }
  523. }
  524. //#endregion
  525. //#region Promises
  526. export var Promises;
  527. (function (Promises) {
  528. /**
  529. * A drop-in replacement for `Promise.all` with the only difference
  530. * that the method awaits every promise to either fulfill or reject.
  531. *
  532. * Similar to `Promise.all`, only the first error will be returned
  533. * if any.
  534. */
  535. function settled(promises) {
  536. return __awaiter(this, void 0, void 0, function* () {
  537. let firstError = undefined;
  538. const result = yield Promise.all(promises.map(promise => promise.then(value => value, error => {
  539. if (!firstError) {
  540. firstError = error;
  541. }
  542. return undefined; // do not rethrow so that other promises can settle
  543. })));
  544. if (typeof firstError !== 'undefined') {
  545. throw firstError;
  546. }
  547. return result; // cast is needed and protected by the `throw` above
  548. });
  549. }
  550. Promises.settled = settled;
  551. /**
  552. * A helper to create a new `Promise<T>` with a body that is a promise
  553. * itself. By default, an error that raises from the async body will
  554. * end up as a unhandled rejection, so this utility properly awaits the
  555. * body and rejects the promise as a normal promise does without async
  556. * body.
  557. *
  558. * This method should only be used in rare cases where otherwise `async`
  559. * cannot be used (e.g. when callbacks are involved that require this).
  560. */
  561. function withAsyncBody(bodyFn) {
  562. // eslint-disable-next-line no-async-promise-executor
  563. return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
  564. try {
  565. yield bodyFn(resolve, reject);
  566. }
  567. catch (error) {
  568. reject(error);
  569. }
  570. }));
  571. }
  572. Promises.withAsyncBody = withAsyncBody;
  573. })(Promises || (Promises = {}));
  574. /**
  575. * A rich implementation for an `AsyncIterable<T>`.
  576. */
  577. export class AsyncIterableObject {
  578. constructor(executor) {
  579. this._state = 0 /* AsyncIterableSourceState.Initial */;
  580. this._results = [];
  581. this._error = null;
  582. this._onStateChanged = new Emitter();
  583. queueMicrotask(() => __awaiter(this, void 0, void 0, function* () {
  584. const writer = {
  585. emitOne: (item) => this.emitOne(item),
  586. emitMany: (items) => this.emitMany(items),
  587. reject: (error) => this.reject(error)
  588. };
  589. try {
  590. yield Promise.resolve(executor(writer));
  591. this.resolve();
  592. }
  593. catch (err) {
  594. this.reject(err);
  595. }
  596. finally {
  597. writer.emitOne = undefined;
  598. writer.emitMany = undefined;
  599. writer.reject = undefined;
  600. }
  601. }));
  602. }
  603. static fromArray(items) {
  604. return new AsyncIterableObject((writer) => {
  605. writer.emitMany(items);
  606. });
  607. }
  608. static fromPromise(promise) {
  609. return new AsyncIterableObject((emitter) => __awaiter(this, void 0, void 0, function* () {
  610. emitter.emitMany(yield promise);
  611. }));
  612. }
  613. static fromPromises(promises) {
  614. return new AsyncIterableObject((emitter) => __awaiter(this, void 0, void 0, function* () {
  615. yield Promise.all(promises.map((p) => __awaiter(this, void 0, void 0, function* () { return emitter.emitOne(yield p); })));
  616. }));
  617. }
  618. static merge(iterables) {
  619. return new AsyncIterableObject((emitter) => __awaiter(this, void 0, void 0, function* () {
  620. yield Promise.all(iterables.map((iterable) => { var iterable_1, iterable_1_1; return __awaiter(this, void 0, void 0, function* () {
  621. var e_1, _a;
  622. try {
  623. for (iterable_1 = __asyncValues(iterable); iterable_1_1 = yield iterable_1.next(), !iterable_1_1.done;) {
  624. const item = iterable_1_1.value;
  625. emitter.emitOne(item);
  626. }
  627. }
  628. catch (e_1_1) { e_1 = { error: e_1_1 }; }
  629. finally {
  630. try {
  631. if (iterable_1_1 && !iterable_1_1.done && (_a = iterable_1.return)) yield _a.call(iterable_1);
  632. }
  633. finally { if (e_1) throw e_1.error; }
  634. }
  635. }); }));
  636. }));
  637. }
  638. [Symbol.asyncIterator]() {
  639. let i = 0;
  640. return {
  641. next: () => __awaiter(this, void 0, void 0, function* () {
  642. do {
  643. if (this._state === 2 /* AsyncIterableSourceState.DoneError */) {
  644. throw this._error;
  645. }
  646. if (i < this._results.length) {
  647. return { done: false, value: this._results[i++] };
  648. }
  649. if (this._state === 1 /* AsyncIterableSourceState.DoneOK */) {
  650. return { done: true, value: undefined };
  651. }
  652. yield Event.toPromise(this._onStateChanged.event);
  653. } while (true);
  654. })
  655. };
  656. }
  657. static map(iterable, mapFn) {
  658. return new AsyncIterableObject((emitter) => __awaiter(this, void 0, void 0, function* () {
  659. var e_2, _a;
  660. try {
  661. for (var iterable_2 = __asyncValues(iterable), iterable_2_1; iterable_2_1 = yield iterable_2.next(), !iterable_2_1.done;) {
  662. const item = iterable_2_1.value;
  663. emitter.emitOne(mapFn(item));
  664. }
  665. }
  666. catch (e_2_1) { e_2 = { error: e_2_1 }; }
  667. finally {
  668. try {
  669. if (iterable_2_1 && !iterable_2_1.done && (_a = iterable_2.return)) yield _a.call(iterable_2);
  670. }
  671. finally { if (e_2) throw e_2.error; }
  672. }
  673. }));
  674. }
  675. map(mapFn) {
  676. return AsyncIterableObject.map(this, mapFn);
  677. }
  678. static filter(iterable, filterFn) {
  679. return new AsyncIterableObject((emitter) => __awaiter(this, void 0, void 0, function* () {
  680. var e_3, _a;
  681. try {
  682. for (var iterable_3 = __asyncValues(iterable), iterable_3_1; iterable_3_1 = yield iterable_3.next(), !iterable_3_1.done;) {
  683. const item = iterable_3_1.value;
  684. if (filterFn(item)) {
  685. emitter.emitOne(item);
  686. }
  687. }
  688. }
  689. catch (e_3_1) { e_3 = { error: e_3_1 }; }
  690. finally {
  691. try {
  692. if (iterable_3_1 && !iterable_3_1.done && (_a = iterable_3.return)) yield _a.call(iterable_3);
  693. }
  694. finally { if (e_3) throw e_3.error; }
  695. }
  696. }));
  697. }
  698. filter(filterFn) {
  699. return AsyncIterableObject.filter(this, filterFn);
  700. }
  701. static coalesce(iterable) {
  702. return AsyncIterableObject.filter(iterable, item => !!item);
  703. }
  704. coalesce() {
  705. return AsyncIterableObject.coalesce(this);
  706. }
  707. static toPromise(iterable) {
  708. var iterable_4, iterable_4_1;
  709. var e_4, _a;
  710. return __awaiter(this, void 0, void 0, function* () {
  711. const result = [];
  712. try {
  713. for (iterable_4 = __asyncValues(iterable); iterable_4_1 = yield iterable_4.next(), !iterable_4_1.done;) {
  714. const item = iterable_4_1.value;
  715. result.push(item);
  716. }
  717. }
  718. catch (e_4_1) { e_4 = { error: e_4_1 }; }
  719. finally {
  720. try {
  721. if (iterable_4_1 && !iterable_4_1.done && (_a = iterable_4.return)) yield _a.call(iterable_4);
  722. }
  723. finally { if (e_4) throw e_4.error; }
  724. }
  725. return result;
  726. });
  727. }
  728. toPromise() {
  729. return AsyncIterableObject.toPromise(this);
  730. }
  731. /**
  732. * The value will be appended at the end.
  733. *
  734. * **NOTE** If `resolve()` or `reject()` have already been called, this method has no effect.
  735. */
  736. emitOne(value) {
  737. if (this._state !== 0 /* AsyncIterableSourceState.Initial */) {
  738. return;
  739. }
  740. // it is important to add new values at the end,
  741. // as we may have iterators already running on the array
  742. this._results.push(value);
  743. this._onStateChanged.fire();
  744. }
  745. /**
  746. * The values will be appended at the end.
  747. *
  748. * **NOTE** If `resolve()` or `reject()` have already been called, this method has no effect.
  749. */
  750. emitMany(values) {
  751. if (this._state !== 0 /* AsyncIterableSourceState.Initial */) {
  752. return;
  753. }
  754. // it is important to add new values at the end,
  755. // as we may have iterators already running on the array
  756. this._results = this._results.concat(values);
  757. this._onStateChanged.fire();
  758. }
  759. /**
  760. * Calling `resolve()` will mark the result array as complete.
  761. *
  762. * **NOTE** `resolve()` must be called, otherwise all consumers of this iterable will hang indefinitely, similar to a non-resolved promise.
  763. * **NOTE** If `resolve()` or `reject()` have already been called, this method has no effect.
  764. */
  765. resolve() {
  766. if (this._state !== 0 /* AsyncIterableSourceState.Initial */) {
  767. return;
  768. }
  769. this._state = 1 /* AsyncIterableSourceState.DoneOK */;
  770. this._onStateChanged.fire();
  771. }
  772. /**
  773. * Writing an error will permanently invalidate this iterable.
  774. * The current users will receive an error thrown, as will all future users.
  775. *
  776. * **NOTE** If `resolve()` or `reject()` have already been called, this method has no effect.
  777. */
  778. reject(error) {
  779. if (this._state !== 0 /* AsyncIterableSourceState.Initial */) {
  780. return;
  781. }
  782. this._state = 2 /* AsyncIterableSourceState.DoneError */;
  783. this._error = error;
  784. this._onStateChanged.fire();
  785. }
  786. }
  787. AsyncIterableObject.EMPTY = AsyncIterableObject.fromArray([]);
  788. export class CancelableAsyncIterableObject extends AsyncIterableObject {
  789. constructor(_source, executor) {
  790. super(executor);
  791. this._source = _source;
  792. }
  793. cancel() {
  794. this._source.cancel();
  795. }
  796. }
  797. export function createCancelableAsyncIterable(callback) {
  798. const source = new CancellationTokenSource();
  799. const innerIterable = callback(source.token);
  800. return new CancelableAsyncIterableObject(source, (emitter) => __awaiter(this, void 0, void 0, function* () {
  801. var e_5, _a;
  802. const subscription = source.token.onCancellationRequested(() => {
  803. subscription.dispose();
  804. source.dispose();
  805. emitter.reject(new CancellationError());
  806. });
  807. try {
  808. try {
  809. for (var innerIterable_1 = __asyncValues(innerIterable), innerIterable_1_1; innerIterable_1_1 = yield innerIterable_1.next(), !innerIterable_1_1.done;) {
  810. const item = innerIterable_1_1.value;
  811. if (source.token.isCancellationRequested) {
  812. // canceled in the meantime
  813. return;
  814. }
  815. emitter.emitOne(item);
  816. }
  817. }
  818. catch (e_5_1) { e_5 = { error: e_5_1 }; }
  819. finally {
  820. try {
  821. if (innerIterable_1_1 && !innerIterable_1_1.done && (_a = innerIterable_1.return)) yield _a.call(innerIterable_1);
  822. }
  823. finally { if (e_5) throw e_5.error; }
  824. }
  825. subscription.dispose();
  826. source.dispose();
  827. }
  828. catch (err) {
  829. subscription.dispose();
  830. source.dispose();
  831. emitter.reject(err);
  832. }
  833. }));
  834. }
  835. //#endregion