I'm using an Observable to provide event subscription interface for clients from a global resource, and I need to manage that resource according to the number of active subscriptions:
- Allocate global resource when the number of subscriptions becomes greater than 0
- Release global resource when the number of subscriptions becomes 0
- Adjust the resource usage strategy based on the number of subscriptions
What is the proper way in RXJS to monitor the number of active subscriptions?
How to implement the following within RXJS syntax? -
const myEvent: Observable<any> = new Observable(); myEvent.onSubscription((newCount: number, prevCount: number) => { if(newCount === 0) { // release global resource } else { // allocate global resource, if not yet allocated } // for a scalable resource usage / load, // re-configure it, based on newCount }); I wouldn't expect a guaranteed notification on each change, hence newCount + prevCount params.
UPDATE-1
This is not a duplicate to this, because I need to be notified when the number of subscriptions changes, and not just to get the counter at some point.
UPDATE-2
Without any answer so far, I quickly came up with a very ugly and limited work-around, through complete incapsulation, and specifically for type Subject. Hoping very much to find a proper solution.
UPDATE-3
After a few answers, I'm still not sure how to implement what I'm trying, which is the following:
class CustomType { } class CountedObservable<T> extends Observable<T> { private message: string; // random property public onCount; // magical Observable that needs to be implemented constructor(message: string) { // super(); ??? this.message = message; } // random method public getMessage() { return this.message; } } const a = new CountedObservable<CustomType>('hello'); // can create directly const msg = a.getMessage(); // can call methods a.subscribe((data: CustomType) => { // handle subscriptions here; }); // need that magic onCount implemented, so I can do this: a.onCount.subscribe((newCount: number, prevCont: number) => { // manage some external resources }); How to implement such class CountedObservable above, which would let me subscribe to itself, as well as its onCount property to monitor the number of its clients/subscriptions?
UPDATE-4
All suggested solutions seemed overly complex, and even though I accepted one of the answers, I ended up with a completely custom solution one of my own.
according to the number of active subscriptions, i thought it could be a possible duplicate.usingobservable creator and then use theshareoperator to perform the reference counting.