ipfs-http-client
Version:
A client library for the IPFS HTTP API
36 lines • 1.1 kB
JavaScript
import { AbortController } from 'native-abort-controller';
export class SubscriptionTracker {
constructor() {
this._subs = new Map();
}
subscribe(topic, handler, signal) {
const topicSubs = this._subs.get(topic) || [];
if (topicSubs.find(s => s.handler === handler)) {
throw new Error(`Already subscribed to ${ topic } with this handler`);
}
const controller = new AbortController();
this._subs.set(topic, [{
handler,
controller
}].concat(topicSubs));
if (signal) {
signal.addEventListener('abort', () => this.unsubscribe(topic, handler));
}
return controller.signal;
}
unsubscribe(topic, handler) {
const subs = this._subs.get(topic) || [];
let unsubs;
if (handler) {
this._subs.set(topic, subs.filter(s => s.handler !== handler));
unsubs = subs.filter(s => s.handler === handler);
} else {
this._subs.set(topic, []);
unsubs = subs;
}
if (!(this._subs.get(topic) || []).length) {
this._subs.delete(topic);
}
unsubs.forEach(s => s.controller.abort());
}
}