Software zum Installieren eines Smart-Mirror Frameworks , zum Nutzen von hochschulrelevanten Informationen, auf einem Raspberry-Pi.
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.

esnext.observable.js 6.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. 'use strict';
  2. // https://github.com/tc39/proposal-observable
  3. var $ = require('../internals/export');
  4. var DESCRIPTORS = require('../internals/descriptors');
  5. var setSpecies = require('../internals/set-species');
  6. var aFunction = require('../internals/a-function');
  7. var anObject = require('../internals/an-object');
  8. var isObject = require('../internals/is-object');
  9. var anInstance = require('../internals/an-instance');
  10. var defineProperty = require('../internals/object-define-property').f;
  11. var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
  12. var redefineAll = require('../internals/redefine-all');
  13. var getIterator = require('../internals/get-iterator');
  14. var iterate = require('../internals/iterate');
  15. var hostReportErrors = require('../internals/host-report-errors');
  16. var wellKnownSymbol = require('../internals/well-known-symbol');
  17. var InternalStateModule = require('../internals/internal-state');
  18. var OBSERVABLE = wellKnownSymbol('observable');
  19. var getInternalState = InternalStateModule.get;
  20. var setInternalState = InternalStateModule.set;
  21. var getMethod = function (fn) {
  22. return fn == null ? undefined : aFunction(fn);
  23. };
  24. var cleanupSubscription = function (subscriptionState) {
  25. var cleanup = subscriptionState.cleanup;
  26. if (cleanup) {
  27. subscriptionState.cleanup = undefined;
  28. try {
  29. cleanup();
  30. } catch (error) {
  31. hostReportErrors(error);
  32. }
  33. }
  34. };
  35. var subscriptionClosed = function (subscriptionState) {
  36. return subscriptionState.observer === undefined;
  37. };
  38. var close = function (subscriptionState) {
  39. var subscription = subscriptionState.facade;
  40. if (!DESCRIPTORS) {
  41. subscription.closed = true;
  42. var subscriptionObserver = subscriptionState.subscriptionObserver;
  43. if (subscriptionObserver) subscriptionObserver.closed = true;
  44. } subscriptionState.observer = undefined;
  45. };
  46. var Subscription = function (observer, subscriber) {
  47. var subscriptionState = setInternalState(this, {
  48. cleanup: undefined,
  49. observer: anObject(observer),
  50. subscriptionObserver: undefined
  51. });
  52. var start;
  53. if (!DESCRIPTORS) this.closed = false;
  54. try {
  55. if (start = getMethod(observer.start)) start.call(observer, this);
  56. } catch (error) {
  57. hostReportErrors(error);
  58. }
  59. if (subscriptionClosed(subscriptionState)) return;
  60. var subscriptionObserver = subscriptionState.subscriptionObserver = new SubscriptionObserver(this);
  61. try {
  62. var cleanup = subscriber(subscriptionObserver);
  63. var subscription = cleanup;
  64. if (cleanup != null) subscriptionState.cleanup = typeof cleanup.unsubscribe === 'function'
  65. ? function () { subscription.unsubscribe(); }
  66. : aFunction(cleanup);
  67. } catch (error) {
  68. subscriptionObserver.error(error);
  69. return;
  70. } if (subscriptionClosed(subscriptionState)) cleanupSubscription(subscriptionState);
  71. };
  72. Subscription.prototype = redefineAll({}, {
  73. unsubscribe: function unsubscribe() {
  74. var subscriptionState = getInternalState(this);
  75. if (!subscriptionClosed(subscriptionState)) {
  76. close(subscriptionState);
  77. cleanupSubscription(subscriptionState);
  78. }
  79. }
  80. });
  81. if (DESCRIPTORS) defineProperty(Subscription.prototype, 'closed', {
  82. configurable: true,
  83. get: function () {
  84. return subscriptionClosed(getInternalState(this));
  85. }
  86. });
  87. var SubscriptionObserver = function (subscription) {
  88. setInternalState(this, { subscription: subscription });
  89. if (!DESCRIPTORS) this.closed = false;
  90. };
  91. SubscriptionObserver.prototype = redefineAll({}, {
  92. next: function next(value) {
  93. var subscriptionState = getInternalState(getInternalState(this).subscription);
  94. if (!subscriptionClosed(subscriptionState)) {
  95. var observer = subscriptionState.observer;
  96. try {
  97. var nextMethod = getMethod(observer.next);
  98. if (nextMethod) nextMethod.call(observer, value);
  99. } catch (error) {
  100. hostReportErrors(error);
  101. }
  102. }
  103. },
  104. error: function error(value) {
  105. var subscriptionState = getInternalState(getInternalState(this).subscription);
  106. if (!subscriptionClosed(subscriptionState)) {
  107. var observer = subscriptionState.observer;
  108. close(subscriptionState);
  109. try {
  110. var errorMethod = getMethod(observer.error);
  111. if (errorMethod) errorMethod.call(observer, value);
  112. else hostReportErrors(value);
  113. } catch (err) {
  114. hostReportErrors(err);
  115. } cleanupSubscription(subscriptionState);
  116. }
  117. },
  118. complete: function complete() {
  119. var subscriptionState = getInternalState(getInternalState(this).subscription);
  120. if (!subscriptionClosed(subscriptionState)) {
  121. var observer = subscriptionState.observer;
  122. close(subscriptionState);
  123. try {
  124. var completeMethod = getMethod(observer.complete);
  125. if (completeMethod) completeMethod.call(observer);
  126. } catch (error) {
  127. hostReportErrors(error);
  128. } cleanupSubscription(subscriptionState);
  129. }
  130. }
  131. });
  132. if (DESCRIPTORS) defineProperty(SubscriptionObserver.prototype, 'closed', {
  133. configurable: true,
  134. get: function () {
  135. return subscriptionClosed(getInternalState(getInternalState(this).subscription));
  136. }
  137. });
  138. var $Observable = function Observable(subscriber) {
  139. anInstance(this, $Observable, 'Observable');
  140. setInternalState(this, { subscriber: aFunction(subscriber) });
  141. };
  142. redefineAll($Observable.prototype, {
  143. subscribe: function subscribe(observer) {
  144. var length = arguments.length;
  145. return new Subscription(typeof observer === 'function' ? {
  146. next: observer,
  147. error: length > 1 ? arguments[1] : undefined,
  148. complete: length > 2 ? arguments[2] : undefined
  149. } : isObject(observer) ? observer : {}, getInternalState(this).subscriber);
  150. }
  151. });
  152. redefineAll($Observable, {
  153. from: function from(x) {
  154. var C = typeof this === 'function' ? this : $Observable;
  155. var observableMethod = getMethod(anObject(x)[OBSERVABLE]);
  156. if (observableMethod) {
  157. var observable = anObject(observableMethod.call(x));
  158. return observable.constructor === C ? observable : new C(function (observer) {
  159. return observable.subscribe(observer);
  160. });
  161. }
  162. var iterator = getIterator(x);
  163. return new C(function (observer) {
  164. iterate(iterator, function (it, stop) {
  165. observer.next(it);
  166. if (observer.closed) return stop();
  167. }, { IS_ITERATOR: true, INTERRUPTED: true });
  168. observer.complete();
  169. });
  170. },
  171. of: function of() {
  172. var C = typeof this === 'function' ? this : $Observable;
  173. var length = arguments.length;
  174. var items = new Array(length);
  175. var index = 0;
  176. while (index < length) items[index] = arguments[index++];
  177. return new C(function (observer) {
  178. for (var i = 0; i < length; i++) {
  179. observer.next(items[i]);
  180. if (observer.closed) return;
  181. } observer.complete();
  182. });
  183. }
  184. });
  185. createNonEnumerableProperty($Observable.prototype, OBSERVABLE, function () { return this; });
  186. $({ global: true }, {
  187. Observable: $Observable
  188. });
  189. setSpecies('Observable');