| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- import {Observable, Subscriber, Subscription} from 'rxjs';
- (Zone as any).__load_patch('rxjs', (global: any, Zone: ZoneType, api: _ZonePrivate) => {
- const symbol: (symbolString: string) => string = (Zone as any).__symbol__;
- const nextSource = 'rxjs.Subscriber.next';
- const errorSource = 'rxjs.Subscriber.error';
- const completeSource = 'rxjs.Subscriber.complete';
- const ObjectDefineProperties = Object.defineProperties;
- const patchObservable = function() {
- const ObservablePrototype: any = Observable.prototype;
- const _symbolSubscribe = symbol('_subscribe');
- const _subscribe = ObservablePrototype[_symbolSubscribe] = ObservablePrototype._subscribe;
- ObjectDefineProperties(Observable.prototype, {
- _zone: {value: null, writable: true, configurable: true},
- _zoneSource: {value: null, writable: true, configurable: true},
- _zoneSubscribe: {value: null, writable: true, configurable: true},
- source: {
- configurable: true,
- get: function(this: Observable<any>) {
- return (this as any)._zoneSource;
- },
- set: function(this: Observable<any>, source: any) {
- (this as any)._zone = Zone.current;
- (this as any)._zoneSource = source;
- }
- },
- _subscribe: {
- configurable: true,
- get: function(this: Observable<any>) {
- if ((this as any)._zoneSubscribe) {
- return (this as any)._zoneSubscribe;
- } else if (this.constructor === Observable) {
- return _subscribe;
- }
- const proto = Object.getPrototypeOf(this);
- return proto && proto._subscribe;
- },
- set: function(this: Observable<any>, subscribe: any) {
- (this as any)._zone = Zone.current;
- (this as any)._zoneSubscribe = function() {
- if (this._zone && this._zone !== Zone.current) {
- const tearDown = this._zone.run(subscribe, this, arguments);
- if (tearDown && typeof tearDown === 'function') {
- const zone = this._zone;
- return function() {
- if (zone !== Zone.current) {
- return zone.run(tearDown, this, arguments);
- }
- return tearDown.apply(this, arguments);
- };
- }
- return tearDown;
- }
- return subscribe.apply(this, arguments);
- };
- }
- },
- subjectFactory: {
- get: function() {
- return (this as any)._zoneSubjectFactory;
- },
- set: function(factory: any) {
- const zone = this._zone;
- this._zoneSubjectFactory = function() {
- if (zone && zone !== Zone.current) {
- return zone.run(factory, this, arguments);
- }
- return factory.apply(this, arguments);
- };
- }
- }
- });
- };
- api.patchMethod(Observable.prototype, 'lift', (delegate: any) => (self: any, args: any[]) => {
- const observable: any = delegate.apply(self, args);
- if (observable.operator) {
- observable.operator._zone = Zone.current;
- api.patchMethod(
- observable.operator, 'call',
- (operatorDelegate: any) => (operatorSelf: any, operatorArgs: any[]) => {
- if (operatorSelf._zone && operatorSelf._zone !== Zone.current) {
- return operatorSelf._zone.run(operatorDelegate, operatorSelf, operatorArgs);
- }
- return operatorDelegate.apply(operatorSelf, operatorArgs);
- });
- }
- return observable;
- });
- const patchSubscription = function() {
- ObjectDefineProperties(Subscription.prototype, {
- _zone: {value: null, writable: true, configurable: true},
- _zoneUnsubscribe: {value: null, writable: true, configurable: true},
- _unsubscribe: {
- get: function(this: Subscription) {
- if ((this as any)._zoneUnsubscribe) {
- return (this as any)._zoneUnsubscribe;
- }
- const proto = Object.getPrototypeOf(this);
- return proto && proto._unsubscribe;
- },
- set: function(this: Subscription, unsubscribe: any) {
- (this as any)._zone = Zone.current;
- (this as any)._zoneUnsubscribe = function() {
- if (this._zone && this._zone !== Zone.current) {
- return this._zone.run(unsubscribe, this, arguments);
- }
- return unsubscribe.apply(this, arguments);
- };
- }
- }
- });
- };
- const patchSubscriber = function() {
- const next = Subscriber.prototype.next;
- const error = Subscriber.prototype.error;
- const complete = Subscriber.prototype.complete;
- Object.defineProperty(Subscriber.prototype, 'destination', {
- configurable: true,
- get: function(this: Subscriber<any>) {
- return (this as any)._zoneDestination;
- },
- set: function(this: Subscriber<any>, destination: any) {
- (this as any)._zone = Zone.current;
- (this as any)._zoneDestination = destination;
- }
- });
- // patch Subscriber.next to make sure it run
- // into SubscriptionZone
- Subscriber.prototype.next = function() {
- const currentZone = Zone.current;
- const subscriptionZone = this._zone;
- // for performance concern, check Zone.current
- // equal with this._zone(SubscriptionZone) or not
- if (subscriptionZone && subscriptionZone !== currentZone) {
- return subscriptionZone.run(next, this, arguments, nextSource);
- } else {
- return next.apply(this, arguments as any);
- }
- };
- Subscriber.prototype.error = function() {
- const currentZone = Zone.current;
- const subscriptionZone = this._zone;
- // for performance concern, check Zone.current
- // equal with this._zone(SubscriptionZone) or not
- if (subscriptionZone && subscriptionZone !== currentZone) {
- return subscriptionZone.run(error, this, arguments, errorSource);
- } else {
- return error.apply(this, arguments as any);
- }
- };
- Subscriber.prototype.complete = function() {
- const currentZone = Zone.current;
- const subscriptionZone = this._zone;
- // for performance concern, check Zone.current
- // equal with this._zone(SubscriptionZone) or not
- if (subscriptionZone && subscriptionZone !== currentZone) {
- return subscriptionZone.run(complete, this, arguments, completeSource);
- } else {
- return complete.call(this);
- }
- };
- };
- patchObservable();
- patchSubscription();
- patchSubscriber();
- });
|