share.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. "use strict";
  2. var __read = (this && this.__read) || function (o, n) {
  3. var m = typeof Symbol === "function" && o[Symbol.iterator];
  4. if (!m) return o;
  5. var i = m.call(o), r, ar = [], e;
  6. try {
  7. while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
  8. }
  9. catch (error) { e = { error: error }; }
  10. finally {
  11. try {
  12. if (r && !r.done && (m = i["return"])) m.call(i);
  13. }
  14. finally { if (e) throw e.error; }
  15. }
  16. return ar;
  17. };
  18. var __spreadArray = (this && this.__spreadArray) || function (to, from) {
  19. for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
  20. to[j] = from[i];
  21. return to;
  22. };
  23. Object.defineProperty(exports, "__esModule", { value: true });
  24. exports.share = void 0;
  25. var innerFrom_1 = require("../observable/innerFrom");
  26. var Subject_1 = require("../Subject");
  27. var Subscriber_1 = require("../Subscriber");
  28. var lift_1 = require("../util/lift");
  29. function share(options) {
  30. if (options === void 0) { options = {}; }
  31. var _a = options.connector, connector = _a === void 0 ? function () { return new Subject_1.Subject(); } : _a, _b = options.resetOnError, resetOnError = _b === void 0 ? true : _b, _c = options.resetOnComplete, resetOnComplete = _c === void 0 ? true : _c, _d = options.resetOnRefCountZero, resetOnRefCountZero = _d === void 0 ? true : _d;
  32. return function (wrapperSource) {
  33. var connection;
  34. var resetConnection;
  35. var subject;
  36. var refCount = 0;
  37. var hasCompleted = false;
  38. var hasErrored = false;
  39. var cancelReset = function () {
  40. resetConnection === null || resetConnection === void 0 ? void 0 : resetConnection.unsubscribe();
  41. resetConnection = undefined;
  42. };
  43. var reset = function () {
  44. cancelReset();
  45. connection = subject = undefined;
  46. hasCompleted = hasErrored = false;
  47. };
  48. var resetAndUnsubscribe = function () {
  49. var conn = connection;
  50. reset();
  51. conn === null || conn === void 0 ? void 0 : conn.unsubscribe();
  52. };
  53. return lift_1.operate(function (source, subscriber) {
  54. refCount++;
  55. if (!hasErrored && !hasCompleted) {
  56. cancelReset();
  57. }
  58. var dest = (subject = subject !== null && subject !== void 0 ? subject : connector());
  59. subscriber.add(function () {
  60. refCount--;
  61. if (refCount === 0 && !hasErrored && !hasCompleted) {
  62. resetConnection = handleReset(resetAndUnsubscribe, resetOnRefCountZero);
  63. }
  64. });
  65. dest.subscribe(subscriber);
  66. if (!connection &&
  67. refCount > 0) {
  68. connection = new Subscriber_1.SafeSubscriber({
  69. next: function (value) { return dest.next(value); },
  70. error: function (err) {
  71. hasErrored = true;
  72. cancelReset();
  73. resetConnection = handleReset(reset, resetOnError, err);
  74. dest.error(err);
  75. },
  76. complete: function () {
  77. hasCompleted = true;
  78. cancelReset();
  79. resetConnection = handleReset(reset, resetOnComplete);
  80. dest.complete();
  81. },
  82. });
  83. innerFrom_1.innerFrom(source).subscribe(connection);
  84. }
  85. })(wrapperSource);
  86. };
  87. }
  88. exports.share = share;
  89. function handleReset(reset, on) {
  90. var args = [];
  91. for (var _i = 2; _i < arguments.length; _i++) {
  92. args[_i - 2] = arguments[_i];
  93. }
  94. if (on === true) {
  95. reset();
  96. return;
  97. }
  98. if (on === false) {
  99. return;
  100. }
  101. var onSubscriber = new Subscriber_1.SafeSubscriber({
  102. next: function () {
  103. onSubscriber.unsubscribe();
  104. reset();
  105. },
  106. });
  107. return innerFrom_1.innerFrom(on.apply(void 0, __spreadArray([], __read(args)))).subscribe(onSubscriber);
  108. }
  109. //# sourceMappingURL=share.js.map