json-crdt-server
Version:
JSON CRDT server and syncing local-first browser client
44 lines (43 loc) • 1.45 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.PubsubService = void 0;
const rxjs_1 = require("rxjs");
class PubsubService {
constructor() {
this.observers = new Map();
}
listen$(channel) {
return new rxjs_1.Observable((observer) => {
if (!this.observers.has(channel))
this.observers.set(channel, []);
const observers = this.observers.get(channel);
observers.push(observer);
return () => {
const observers = this.observers.get(channel);
if (!observers)
return;
const index = observers.findIndex((o) => o === observer);
if (index > -1)
observers.splice(index, 1);
if (!observers.length) {
this.observers.delete(channel);
}
};
});
}
async publish(channel, message) {
await new Promise((resolve) => setImmediate(resolve));
const observers = this.observers.get(channel);
if (!observers)
return;
for (const observer of observers)
observer.next(message);
}
stats() {
return {
channels: this.observers.size,
observers: [...this.observers.values()].reduce((acc, v) => acc + v.length, 0),
};
}
}
exports.PubsubService = PubsubService;
;