| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 | 'use strict';// https://github.com/tc39/proposal-observablevar $ = require('../internals/export');var call = require('../internals/function-call');var DESCRIPTORS = require('../internals/descriptors');var setSpecies = require('../internals/set-species');var aCallable = require('../internals/a-callable');var anObject = require('../internals/an-object');var anInstance = require('../internals/an-instance');var isCallable = require('../internals/is-callable');var isNullOrUndefined = require('../internals/is-null-or-undefined');var isObject = require('../internals/is-object');var getMethod = require('../internals/get-method');var defineBuiltIn = require('../internals/define-built-in');var defineBuiltIns = require('../internals/define-built-ins');var defineBuiltInAccessor = require('../internals/define-built-in-accessor');var hostReportErrors = require('../internals/host-report-errors');var wellKnownSymbol = require('../internals/well-known-symbol');var InternalStateModule = require('../internals/internal-state');var $$OBSERVABLE = wellKnownSymbol('observable');var OBSERVABLE = 'Observable';var SUBSCRIPTION = 'Subscription';var SUBSCRIPTION_OBSERVER = 'SubscriptionObserver';var getterFor = InternalStateModule.getterFor;var setInternalState = InternalStateModule.set;var getObservableInternalState = getterFor(OBSERVABLE);var getSubscriptionInternalState = getterFor(SUBSCRIPTION);var getSubscriptionObserverInternalState = getterFor(SUBSCRIPTION_OBSERVER);var SubscriptionState = function (observer) {  this.observer = anObject(observer);  this.cleanup = null;  this.subscriptionObserver = null;};SubscriptionState.prototype = {  type: SUBSCRIPTION,  clean: function () {    var cleanup = this.cleanup;    if (cleanup) {      this.cleanup = null;      try {        cleanup();      } catch (error) {        hostReportErrors(error);      }    }  },  close: function () {    if (!DESCRIPTORS) {      var subscription = this.facade;      var subscriptionObserver = this.subscriptionObserver;      subscription.closed = true;      if (subscriptionObserver) subscriptionObserver.closed = true;    } this.observer = null;  },  isClosed: function () {    return this.observer === null;  }};var Subscription = function (observer, subscriber) {  var subscriptionState = setInternalState(this, new SubscriptionState(observer));  var start;  if (!DESCRIPTORS) this.closed = false;  try {    if (start = getMethod(observer, 'start')) call(start, observer, this);  } catch (error) {    hostReportErrors(error);  }  if (subscriptionState.isClosed()) return;  var subscriptionObserver = subscriptionState.subscriptionObserver = new SubscriptionObserver(subscriptionState);  try {    var cleanup = subscriber(subscriptionObserver);    var subscription = cleanup;    if (!isNullOrUndefined(cleanup)) subscriptionState.cleanup = isCallable(cleanup.unsubscribe)      ? function () { subscription.unsubscribe(); }      : aCallable(cleanup);  } catch (error) {    subscriptionObserver.error(error);    return;  } if (subscriptionState.isClosed()) subscriptionState.clean();};Subscription.prototype = defineBuiltIns({}, {  unsubscribe: function unsubscribe() {    var subscriptionState = getSubscriptionInternalState(this);    if (!subscriptionState.isClosed()) {      subscriptionState.close();      subscriptionState.clean();    }  }});if (DESCRIPTORS) defineBuiltInAccessor(Subscription.prototype, 'closed', {  configurable: true,  get: function closed() {    return getSubscriptionInternalState(this).isClosed();  }});var SubscriptionObserver = function (subscriptionState) {  setInternalState(this, {    type: SUBSCRIPTION_OBSERVER,    subscriptionState: subscriptionState  });  if (!DESCRIPTORS) this.closed = false;};SubscriptionObserver.prototype = defineBuiltIns({}, {  next: function next(value) {    var subscriptionState = getSubscriptionObserverInternalState(this).subscriptionState;    if (!subscriptionState.isClosed()) {      var observer = subscriptionState.observer;      try {        var nextMethod = getMethod(observer, 'next');        if (nextMethod) call(nextMethod, observer, value);      } catch (error) {        hostReportErrors(error);      }    }  },  error: function error(value) {    var subscriptionState = getSubscriptionObserverInternalState(this).subscriptionState;    if (!subscriptionState.isClosed()) {      var observer = subscriptionState.observer;      subscriptionState.close();      try {        var errorMethod = getMethod(observer, 'error');        if (errorMethod) call(errorMethod, observer, value);        else hostReportErrors(value);      } catch (err) {        hostReportErrors(err);      } subscriptionState.clean();    }  },  complete: function complete() {    var subscriptionState = getSubscriptionObserverInternalState(this).subscriptionState;    if (!subscriptionState.isClosed()) {      var observer = subscriptionState.observer;      subscriptionState.close();      try {        var completeMethod = getMethod(observer, 'complete');        if (completeMethod) call(completeMethod, observer);      } catch (error) {        hostReportErrors(error);      } subscriptionState.clean();    }  }});if (DESCRIPTORS) defineBuiltInAccessor(SubscriptionObserver.prototype, 'closed', {  configurable: true,  get: function closed() {    return getSubscriptionObserverInternalState(this).subscriptionState.isClosed();  }});var $Observable = function Observable(subscriber) {  anInstance(this, ObservablePrototype);  setInternalState(this, {    type: OBSERVABLE,    subscriber: aCallable(subscriber)  });};var ObservablePrototype = $Observable.prototype;defineBuiltIns(ObservablePrototype, {  subscribe: function subscribe(observer) {    var length = arguments.length;    return new Subscription(isCallable(observer) ? {      next: observer,      error: length > 1 ? arguments[1] : undefined,      complete: length > 2 ? arguments[2] : undefined    } : isObject(observer) ? observer : {}, getObservableInternalState(this).subscriber);  }});defineBuiltIn(ObservablePrototype, $$OBSERVABLE, function () { return this; });$({ global: true, constructor: true, forced: true }, {  Observable: $Observable});setSpecies(OBSERVABLE);
 |