@lifaon/rx-js-light
Version:
Blazing fast Observables
83 lines (82 loc) • 2.06 kB
JavaScript
export class SubscriptionManager {
constructor() {
this._subscriptionsMap = new Map();
}
get size() {
return this._subscriptionsMap.size;
}
has(key) {
return this._subscriptionsMap.has(key);
}
get(key, mode) {
switch (mode) {
case void 0:
return this._subscriptionsMap.get(key);
case 'throw':
{
if (this._subscriptionsMap.has(key)) {
return this._subscriptionsMap.get(key);
} else {
throw new Error(`Missing key: '${key}'`);
}
}
default:
throw new TypeError(`Unknown mode: '${mode}'`);
}
}
set(key, subscription, mode = 'throw') {
if (this._subscriptionsMap.has(key)) {
switch (mode) {
case 'skip':
break;
case 'replace':
this._subscriptionsMap.get(key).deactivate();
this._subscriptionsMap.set(key, subscription);
break;
case 'throw':
throw new Error(`Already subscribed to: '${key}'`);
default:
throw new TypeError(`Unknown mode: '${mode}'`);
}
} else {
this._subscriptionsMap.set(key, subscription);
}
return subscription;
}
delete(key) {
if (this._subscriptionsMap.has(key)) {
this._subscriptionsMap.get(key).deactivate();
}
this._subscriptionsMap.delete(key);
}
clear() {
this.deactivateAll();
this._subscriptionsMap.clear();
}
activateAll() {
const iterator = this._subscriptionsMap.values();
let result;
while (!(result = iterator.next()).done) {
result.value.activate();
}
}
deactivateAll() {
const iterator = this._subscriptionsMap.values();
let result;
while (!(result = iterator.next()).done) {
result.value.deactivate();
}
}
[Symbol.iterator]() {
return this._subscriptionsMap[Symbol.iterator]();
}
entries() {
return this._subscriptionsMap.entries();
}
keys() {
return this._subscriptionsMap.keys();
}
values() {
return this._subscriptionsMap.values();
}
}