You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
2.6 KiB

3 months ago
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = _usingCtx;
  6. function _usingCtx() {
  7. var _disposeSuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed) {
  8. var err = new Error();
  9. err.name = "SuppressedError";
  10. err.error = error;
  11. err.suppressed = suppressed;
  12. return err;
  13. },
  14. empty = {},
  15. stack = [];
  16. function using(isAwait, value) {
  17. if (value != null) {
  18. if (Object(value) !== value) {
  19. throw new TypeError("using declarations can only be used with objects, functions, null, or undefined.");
  20. }
  21. if (isAwait) {
  22. var dispose = value[Symbol.asyncDispose || Symbol.for("Symbol.asyncDispose")];
  23. }
  24. if (dispose === undefined) {
  25. dispose = value[Symbol.dispose || Symbol.for("Symbol.dispose")];
  26. if (isAwait) {
  27. var inner = dispose;
  28. }
  29. }
  30. if (typeof dispose !== "function") {
  31. throw new TypeError("Object is not disposable.");
  32. }
  33. if (inner) {
  34. dispose = function () {
  35. try {
  36. inner.call(value);
  37. } catch (e) {
  38. return Promise.reject(e);
  39. }
  40. };
  41. }
  42. stack.push({
  43. v: value,
  44. d: dispose,
  45. a: isAwait
  46. });
  47. } else if (isAwait) {
  48. stack.push({
  49. d: value,
  50. a: isAwait
  51. });
  52. }
  53. return value;
  54. }
  55. return {
  56. e: empty,
  57. u: using.bind(null, false),
  58. a: using.bind(null, true),
  59. d: function () {
  60. var error = this.e,
  61. state = 0,
  62. resource;
  63. function next() {
  64. while (resource = stack.pop()) {
  65. try {
  66. if (!resource.a && state === 1) {
  67. state = 0;
  68. stack.push(resource);
  69. return Promise.resolve().then(next);
  70. }
  71. if (resource.d) {
  72. var disposalResult = resource.d.call(resource.v);
  73. if (resource.a) {
  74. state |= 2;
  75. return Promise.resolve(disposalResult).then(next, err);
  76. }
  77. } else {
  78. state |= 1;
  79. }
  80. } catch (e) {
  81. return err(e);
  82. }
  83. }
  84. if (state === 1) {
  85. if (error !== empty) {
  86. return Promise.reject(error);
  87. } else {
  88. return Promise.resolve();
  89. }
  90. }
  91. if (error !== empty) throw error;
  92. }
  93. function err(e) {
  94. error = error !== empty ? new _disposeSuppressedError(e, error) : e;
  95. return next();
  96. }
  97. return next();
  98. }
  99. };
  100. }
  101. //# sourceMappingURL=usingCtx.js.map