pool.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. "use strict";
  2. var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
  3. function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  4. return new (P || (P = Promise))(function (resolve, reject) {
  5. function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  6. function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  7. function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
  8. step((generator = generator.apply(thisArg, _arguments || [])).next());
  9. });
  10. };
  11. Object.defineProperty(exports, "__esModule", { value: true });
  12. exports.createPool = void 0;
  13. const abort_error_1 = require("./abort-error");
  14. function createPool(size) {
  15. let pendingPromises = [];
  16. const pool = {
  17. submit(task, signal) {
  18. return __awaiter(this, void 0, void 0, function* () {
  19. while (pendingPromises.length >= pool.size) {
  20. abort_error_1.AbortError.throwIfAborted(signal);
  21. yield Promise.race(pendingPromises).catch(() => undefined);
  22. }
  23. abort_error_1.AbortError.throwIfAborted(signal);
  24. const taskPromise = task(signal).finally(() => {
  25. pendingPromises = pendingPromises.filter((pendingPromise) => pendingPromise !== taskPromise);
  26. });
  27. pendingPromises.push(taskPromise);
  28. return taskPromise;
  29. });
  30. },
  31. size,
  32. get pending() {
  33. return pendingPromises.length;
  34. },
  35. get drained() {
  36. // eslint-disable-next-line no-async-promise-executor
  37. return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
  38. while (pendingPromises.length > 0) {
  39. yield Promise.race(pendingPromises).catch(() => undefined);
  40. }
  41. resolve(undefined);
  42. }));
  43. },
  44. };
  45. return pool;
  46. }
  47. exports.createPool = createPool;