UNPKG

@activejs/core

Version:

Pragmatic, Reactive State Management for JavaScript Apps

78 lines 7.67 kB
import { Observable } from 'rxjs'; import { makeNonEnumerable } from '../utils/funcs'; /** * A wrapper on RxJS Subscription. * * Stream is a simple construct that adds the ability to re-subscribe to the provided Observable. * Given an Observable, it immediately gets subscribed, and the subscription instance is saved as Stream's property. * The Stream keeps the reference to the provided Observable, and uses it for re-subscription when asked. * * See {@link https://docs.activejs.dev/utilities/stream} for more details. * * @category 4. Utility */ export class Stream { /** * Given an Observable, subscribes to it immediately, and saves the Subscription instance. * * @param observable The Observable to be used for subscription. */ constructor(observable) { this.observable = observable; if (!(observable instanceof Observable)) { throw new TypeError('Expected an Observable, got ' + observable); } this.subscribe(); makeNonEnumerable(this); } /** * The current Subscription instance. * It can be `undefined` if there's no active Subscription. */ get subscription() { return this._subscription; } /** * Indicates whether the Stream is active or not. \ * i.e.: Whether the provided Observable is subscribed or not. */ get isSubscribed() { return !!this._subscription; } /** * Subscribe to the provided Observable, and save the Subscription instance. * * @returns Subscription instance returned by {@link Observable.subscribe}. * * @category Common */ subscribe() { this._subscription = this.observable.subscribe({ error: () => this.unsubscribe() }); return this.subscription; } /** * Unsubscribes from current subscription instance using {@link Subscription.unsubscribe}. \ * It also deletes the Subscription instance. * * @category Custom Stream */ unsubscribe() { if (this.subscription) { this.subscription.unsubscribe(); delete this._subscription; } } /** * Unsubscribes and then immediately subscribes again, * also, replaces the {@link subscription} instance with the new Subscription instance. * * @returns Subscription instance returned by subscribing to the provided Observable {@link Observable.subscribe}. * * @category Custom Stream */ resubscribe() { this.unsubscribe(); return this.subscribe(); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3J1bm5lci93b3JrL2FjdGl2ZWpzL2FjdGl2ZWpzL3BhY2thZ2VzL2NvcmUvc3JjLyIsInNvdXJjZXMiOlsibGliL3N0cmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWpEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLE9BQU8sTUFBTTtJQW9CakI7Ozs7T0FJRztJQUNILFlBQW9CLFVBQTJCO1FBQTNCLGVBQVUsR0FBVixVQUFVLENBQWlCO1FBQzdDLElBQUksQ0FBQyxDQUFDLFVBQVUsWUFBWSxVQUFVLENBQUMsRUFBRTtZQUN2QyxNQUFNLElBQUksU0FBUyxDQUFDLDhCQUE4QixHQUFHLFVBQVUsQ0FBQyxDQUFDO1NBQ2xFO1FBRUQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUE1QkQ7OztPQUdHO0lBQ0gsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJLFlBQVk7UUFDZCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzlCLENBQUM7SUFnQkQ7Ozs7OztPQU1HO0lBQ0ssU0FBUztRQUNmLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFDLENBQUMsQ0FBQztRQUNsRixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztTQUMzQjtJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsV0FBVztRQUNULElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMxQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge09ic2VydmFibGUsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21ha2VOb25FbnVtZXJhYmxlfSBmcm9tICcuLi91dGlscy9mdW5jcyc7XG5cbi8qKlxuICogQSB3cmFwcGVyIG9uIFJ4SlMgU3Vic2NyaXB0aW9uLlxuICpcbiAqIFN0cmVhbSBpcyBhIHNpbXBsZSBjb25zdHJ1Y3QgdGhhdCBhZGRzIHRoZSBhYmlsaXR5IHRvIHJlLXN1YnNjcmliZSB0byB0aGUgcHJvdmlkZWQgT2JzZXJ2YWJsZS5cbiAqIEdpdmVuIGFuIE9ic2VydmFibGUsIGl0IGltbWVkaWF0ZWx5IGdldHMgc3Vic2NyaWJlZCwgYW5kIHRoZSBzdWJzY3JpcHRpb24gaW5zdGFuY2UgaXMgc2F2ZWQgYXMgU3RyZWFtJ3MgcHJvcGVydHkuXG4gKiBUaGUgU3RyZWFtIGtlZXBzIHRoZSByZWZlcmVuY2UgdG8gdGhlIHByb3ZpZGVkIE9ic2VydmFibGUsIGFuZCB1c2VzIGl0IGZvciByZS1zdWJzY3JpcHRpb24gd2hlbiBhc2tlZC5cbiAqXG4gKiBTZWUge0BsaW5rIGh0dHBzOi8vZG9jcy5hY3RpdmVqcy5kZXYvdXRpbGl0aWVzL3N0cmVhbX0gZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAY2F0ZWdvcnkgNC4gVXRpbGl0eVxuICovXG5leHBvcnQgY2xhc3MgU3RyZWFtIHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IFN1YnNjcmlwdGlvbiBpbnN0YW5jZS5cbiAgICogSXQgY2FuIGJlIGB1bmRlZmluZWRgIGlmIHRoZXJlJ3Mgbm8gYWN0aXZlIFN1YnNjcmlwdGlvbi5cbiAgICovXG4gIGdldCBzdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fc3Vic2NyaXB0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBTdHJlYW0gaXMgYWN0aXZlIG9yIG5vdC4gXFxcbiAgICogaS5lLjogV2hldGhlciB0aGUgcHJvdmlkZWQgT2JzZXJ2YWJsZSBpcyBzdWJzY3JpYmVkIG9yIG5vdC5cbiAgICovXG4gIGdldCBpc1N1YnNjcmliZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5fc3Vic2NyaXB0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGFuIE9ic2VydmFibGUsIHN1YnNjcmliZXMgdG8gaXQgaW1tZWRpYXRlbHksIGFuZCBzYXZlcyB0aGUgU3Vic2NyaXB0aW9uIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gb2JzZXJ2YWJsZSBUaGUgT2JzZXJ2YWJsZSB0byBiZSB1c2VkIGZvciBzdWJzY3JpcHRpb24uXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG9ic2VydmFibGU6IE9ic2VydmFibGU8YW55Pikge1xuICAgIGlmICghKG9ic2VydmFibGUgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYW4gT2JzZXJ2YWJsZSwgZ290ICcgKyBvYnNlcnZhYmxlKTtcbiAgICB9XG5cbiAgICB0aGlzLnN1YnNjcmliZSgpO1xuICAgIG1ha2VOb25FbnVtZXJhYmxlKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byB0aGUgcHJvdmlkZWQgT2JzZXJ2YWJsZSwgYW5kIHNhdmUgdGhlIFN1YnNjcmlwdGlvbiBpbnN0YW5jZS5cbiAgICpcbiAgICogQHJldHVybnMgU3Vic2NyaXB0aW9uIGluc3RhbmNlIHJldHVybmVkIGJ5IHtAbGluayBPYnNlcnZhYmxlLnN1YnNjcmliZX0uXG4gICAqXG4gICAqIEBjYXRlZ29yeSBDb21tb25cbiAgICovXG4gIHByaXZhdGUgc3Vic2NyaWJlKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gdGhpcy5vYnNlcnZhYmxlLnN1YnNjcmliZSh7ZXJyb3I6ICgpID0+IHRoaXMudW5zdWJzY3JpYmUoKX0pO1xuICAgIHJldHVybiB0aGlzLnN1YnNjcmlwdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgZnJvbSBjdXJyZW50IHN1YnNjcmlwdGlvbiBpbnN0YW5jZSB1c2luZyB7QGxpbmsgU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlfS4gXFxcbiAgICogSXQgYWxzbyBkZWxldGVzIHRoZSBTdWJzY3JpcHRpb24gaW5zdGFuY2UuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBDdXN0b20gU3RyZWFtXG4gICAqL1xuICB1bnN1YnNjcmliZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICBkZWxldGUgdGhpcy5fc3Vic2NyaXB0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgYW5kIHRoZW4gaW1tZWRpYXRlbHkgc3Vic2NyaWJlcyBhZ2FpbixcbiAgICogYWxzbywgcmVwbGFjZXMgdGhlIHtAbGluayBzdWJzY3JpcHRpb259IGluc3RhbmNlIHdpdGggdGhlIG5ldyBTdWJzY3JpcHRpb24gaW5zdGFuY2UuXG4gICAqXG4gICAqIEByZXR1cm5zIFN1YnNjcmlwdGlvbiBpbnN0YW5jZSByZXR1cm5lZCBieSBzdWJzY3JpYmluZyB0byB0aGUgcHJvdmlkZWQgT2JzZXJ2YWJsZSB7QGxpbmsgT2JzZXJ2YWJsZS5zdWJzY3JpYmV9LlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQ3VzdG9tIFN0cmVhbVxuICAgKi9cbiAgcmVzdWJzY3JpYmUoKTogU3Vic2NyaXB0aW9uIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiJdfQ==