1.0.1 • Published 5 years ago

rxjs-subscription-count v1.0.1

Weekly downloads
14
License
MIT
Repository
github
Last release
5 years ago

subscriptionCount operator for RxJS

rxjs-subscription-count

Count subscriptions to observables. Useful for testing Observable flattening strategies.

Installation

Install using NPM CLI

npm install --save rxjs-subscription-count

or using Yarn CLI

yarn add rxjs-subscription-count

Use cases

Test that the subscriptions are switched (switchMap or switchAll) correctly to prevent memory leaks and race conditions.

Usage

import { BehaviorSubject, empty } from 'rxjs';
import { subscriptionCount } from 'rxjs-subscription-count';

const counter: BehaviorSubject<number> = new BehaviorSubject(0);
const source: Observable<never> = empty().pipe(
  subscriptionCount(counter),
);

switchMap test case

import {
  BehaviorSubject,
  interval,
  Observable,
  range,
  Subscription,
} from 'rxjs';
import { switchMap } from 'rxjs/operators';

import { subscriptionCount } from './subscription-count';

describe('switchMap', () => {
  it('keeps a single subscription', () => {
    const threeValues: Observable<number> = range(1, 3);
    const subscriptionCounter: BehaviorSubject<number> = new BehaviorSubject(0);
    const infiniteValues: Observable<number> = interval(0).pipe(
      subscriptionCount(subscriptionCounter),
    );

    const subscription: Subscription = threeValues.pipe(
      switchMap(() => infiniteValues),
    ).subscribe();

    expect(subscriptionCounter.value).toBe(1);
    subscription.unsubscribe();
  });
});

mergeMap test case

import {
  BehaviorSubject,
  interval,
  Observable,
  range,
  Subscription,
} from 'rxjs';
import { mergeMap } from 'rxjs/operators';

import { subscriptionCount } from './subscription-count';

describe('mergeMap', () => {
  it('results in a subscription per emitted value', () => {
    const threeValues: Observable<number> = range(1, 3);
    const subscriptionCounter: BehaviorSubject<number> = new BehaviorSubject(0);
    const infiniteValues: Observable<number> = interval(0).pipe(
      subscriptionCount(subscriptionCounter),
    );

    const subscription: Subscription = threeValues.pipe(
      mergeMap(() => infiniteValues),
    ).subscribe();

    expect(subscriptionCounter.value).toBe(3);
    subscription.unsubscribe();
  });
});