@simplito/privmx-webendpoint
Version:
PrivMX Web Endpoint library
206 lines (205 loc) • 7.79 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.UserEventsManager = exports.ConnectionEventsManager = exports.ConnectionChannels = exports.CustomEventsManager = exports.KvdbEventsManager = exports.InboxEventsManager = exports.StoreEventsManager = exports.ThreadEventsManager = exports.BaseEventDispatcherManager = void 0;
const subscriptions_1 = require("./subscriptions");
class BaseEventDispatcherManager {
_listenersSymbols = new Map();
_listeners = new Map();
get listeners() {
return this._listeners;
}
dispatchEvent(event) {
const callbacks = event.subscriptions.flatMap((s) => {
const listeners = this._listeners.get(s);
return listeners ?? [];
});
for (const listener of callbacks) {
listener.callback(event);
}
}
unregisterCallback(symbol) {
this._listenersSymbols.delete(symbol);
for (const keys of this._listeners.keys()) {
const listeners = this._listeners.get(keys);
if (listeners) {
this._listeners.set(keys, listeners.filter((x) => x.symbol !== symbol));
if (this._listeners.get(keys).length === 0) {
this._listeners.delete(keys);
}
}
}
}
async prepareSubscription(channelList, subscriptions) {
const subscriptionIds = await this.apiSubscribeFor(channelList);
subscriptionIds.forEach((id, i) => {
const subscription = subscriptions[i];
this._listeners.set(id, subscription.callbacks);
for (const cb of subscription.callbacks) {
this._listenersSymbols.set(cb.symbol, id);
}
return subscription;
});
return subscriptionIds;
}
async unsubscribeFrom(subscriptionsId) {
const knownIds = [];
for (const subscriptionId of subscriptionsId) {
for (const [key, callbackSubscription] of this._listenersSymbols.entries()) {
if (callbackSubscription === subscriptionId) {
knownIds.push(subscriptionId);
this.unregisterCallback(key);
}
}
}
if (knownIds.length === 0) {
return Promise.resolve();
}
return this.apiUnsubscribeFrom(knownIds);
}
}
exports.BaseEventDispatcherManager = BaseEventDispatcherManager;
class ThreadEventsManager extends BaseEventDispatcherManager {
threadApi;
constructor(threadApi) {
super();
this.threadApi = threadApi;
}
apiSubscribeFor(channels) {
return this.threadApi.subscribeFor(channels);
}
apiUnsubscribeFrom(subscriptionId) {
return this.threadApi.unsubscribeFrom(subscriptionId);
}
async subscribeFor(subscriptions) {
const subscriptionChannels = await Promise.all(subscriptions.map((s) => {
return this.threadApi.buildSubscriptionQuery(s.type, s.selector, s.id);
}));
return this.prepareSubscription(subscriptionChannels, subscriptions);
}
}
exports.ThreadEventsManager = ThreadEventsManager;
class StoreEventsManager extends BaseEventDispatcherManager {
storeApi;
constructor(storeApi) {
super();
this.storeApi = storeApi;
}
apiSubscribeFor(channels) {
return this.storeApi.subscribeFor(channels);
}
apiUnsubscribeFrom(subscriptionId) {
return this.storeApi.unsubscribeFrom(subscriptionId);
}
async subscribeFor(subscriptions) {
const subscriptionChannels = await Promise.all(subscriptions.map((s) => {
return this.storeApi.buildSubscriptionQuery(s.type, s.selector, s.id);
}));
return this.prepareSubscription(subscriptionChannels, subscriptions);
}
}
exports.StoreEventsManager = StoreEventsManager;
class InboxEventsManager extends BaseEventDispatcherManager {
inboxApi;
constructor(inboxApi) {
super();
this.inboxApi = inboxApi;
}
apiSubscribeFor(channels) {
return this.inboxApi.subscribeFor(channels);
}
apiUnsubscribeFrom(subscriptionId) {
return this.inboxApi.unsubscribeFrom(subscriptionId);
}
async subscribeFor(subscriptions) {
const subscriptionChannels = await Promise.all(subscriptions.map((s) => {
return this.inboxApi.buildSubscriptionQuery(s.type, s.selector, s.id);
}));
return this.prepareSubscription(subscriptionChannels, subscriptions);
}
}
exports.InboxEventsManager = InboxEventsManager;
class KvdbEventsManager extends BaseEventDispatcherManager {
kvdbApi;
constructor(kvdbApi) {
super();
this.kvdbApi = kvdbApi;
}
apiSubscribeFor(channels) {
return this.kvdbApi.subscribeFor(channels);
}
apiUnsubscribeFrom(subscriptionId) {
return this.kvdbApi.unsubscribeFrom(subscriptionId);
}
async subscribeFor(subscriptions) {
const subscriptionChannels = await Promise.all(subscriptions.map((s) => {
return this.kvdbApi.buildSubscriptionQuery(s.type, s.selector, s.id);
}));
return this.prepareSubscription(subscriptionChannels, subscriptions);
}
}
exports.KvdbEventsManager = KvdbEventsManager;
class CustomEventsManager extends BaseEventDispatcherManager {
eventsApi;
constructor(eventsApi) {
super();
this.eventsApi = eventsApi;
}
apiSubscribeFor(channels) {
return this.eventsApi.subscribeFor(channels);
}
apiUnsubscribeFrom(subscriptionId) {
return this.eventsApi.unsubscribeFrom(subscriptionId);
}
async subscribeFor(subscriptions) {
const subscriptionChannels = await Promise.all(subscriptions.map((s) => {
return this.eventsApi.buildSubscriptionQuery(s.type, s.selector, s.id);
}));
return this.prepareSubscription(subscriptionChannels, subscriptions);
}
}
exports.CustomEventsManager = CustomEventsManager;
exports.ConnectionChannels = {
[subscriptions_1.ConnectionStatusEventType.LIB_CONNECTED]: "channel/lib_connected",
[subscriptions_1.ConnectionStatusEventType.LIB_DISCONNECTED]: "channel/lib_disconnected",
[subscriptions_1.ConnectionStatusEventType.LIB_PLATFORM_DISCONNECTED]: "channel/lib_platform_disconnected",
};
class ConnectionEventsManager extends BaseEventDispatcherManager {
connectionId;
constructor(connectionId) {
super();
this.connectionId = connectionId;
}
apiSubscribeFor(channels) {
return Promise.resolve(channels);
}
apiUnsubscribeFrom() {
return Promise.resolve();
}
async subscribeFor(subscriptions) {
const subscriptionChannels = subscriptions.map((x) => {
return `${this.connectionId}/${exports.ConnectionChannels[x.type]}`;
});
return this.prepareSubscription(subscriptionChannels, subscriptions);
}
}
exports.ConnectionEventsManager = ConnectionEventsManager;
class UserEventsManager extends BaseEventDispatcherManager {
userEventsApi;
constructor(userEventsApi) {
super();
this.userEventsApi = userEventsApi;
}
apiSubscribeFor(channels) {
return this.userEventsApi.subscribeFor(channels);
}
apiUnsubscribeFrom(subscriptionId) {
return this.userEventsApi.unsubscribeFrom(subscriptionId);
}
async subscribeFor(subscriptions) {
const subscriptionChannels = await Promise.all(subscriptions.map((s) => {
return this.userEventsApi.buildSubscriptionQuery(s.type, s.selector, s.id);
}));
return this.prepareSubscription(subscriptionChannels, subscriptions);
}
}
exports.UserEventsManager = UserEventsManager;