UNPKG

@data-client/core

Version:

Async State Management without the Management. REST, GraphQL, SSE, Websockets, Fetch

78 lines (72 loc) 9.35 kB
import { SUBSCRIBE, UNSUBSCRIBE } from '../actionTypes.js'; import Controller from '../controller/Controller.js'; /** Interface handling a single resource subscription */ /** The static class that constructs Subscription */ /** Handles subscription actions -> fetch or set actions * * Constructor takes a SubscriptionConstructable class to control how * subscriptions are handled. (e.g., polling, websockets) * * @see https://dataclient.io/docs/api/SubscriptionManager */ export default class SubscriptionManager { constructor(Subscription) { this.subscriptions = {}; this.controller = new Controller(); this.middleware = controller => { this.controller = controller; return next => action => { switch (action.type) { case SUBSCRIBE: try { this.handleSubscribe(action); } catch (e) { console.error(e); } return Promise.resolve(); case UNSUBSCRIBE: this.handleUnsubscribe(action); return Promise.resolve(); default: return next(action); } }; }; this.Subscription = Subscription; } /** Ensures all subscriptions are cleaned up. */ cleanup() { for (const key in this.subscriptions) { this.subscriptions[key].cleanup(); } } /** Called when middleware intercepts 'rdc/subscribe' action. * */ handleSubscribe(action) { const key = action.key; if (key in this.subscriptions) { const frequency = action.endpoint.pollFrequency; this.subscriptions[key].add(frequency); } else { this.subscriptions[key] = new this.Subscription(action, this.controller); } } /** Called when middleware intercepts 'rdc/unsubscribe' action. * */ handleUnsubscribe(action) { const key = action.key; /* istanbul ignore else */ if (key in this.subscriptions) { const frequency = action.endpoint.pollFrequency; const empty = this.subscriptions[key].remove(frequency); if (empty) { delete this.subscriptions[key]; } } else if (process.env.NODE_ENV !== 'production') { console.error(`Mismatched unsubscribe: ${key} is not subscribed`); } } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTVUJTQ1JJQkUiLCJVTlNVQlNDUklCRSIsIkNvbnRyb2xsZXIiLCJTdWJzY3JpcHRpb25NYW5hZ2VyIiwiY29uc3RydWN0b3IiLCJTdWJzY3JpcHRpb24iLCJzdWJzY3JpcHRpb25zIiwiY29udHJvbGxlciIsIm1pZGRsZXdhcmUiLCJuZXh0IiwiYWN0aW9uIiwidHlwZSIsImhhbmRsZVN1YnNjcmliZSIsImUiLCJjb25zb2xlIiwiZXJyb3IiLCJQcm9taXNlIiwicmVzb2x2ZSIsImhhbmRsZVVuc3Vic2NyaWJlIiwiY2xlYW51cCIsImtleSIsImZyZXF1ZW5jeSIsImVuZHBvaW50IiwicG9sbEZyZXF1ZW5jeSIsImFkZCIsImVtcHR5IiwicmVtb3ZlIiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21hbmFnZXIvU3Vic2NyaXB0aW9uTWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTVUJTQ1JJQkUsIFVOU1VCU0NSSUJFIH0gZnJvbSAnLi4vYWN0aW9uVHlwZXMuanMnO1xuaW1wb3J0IENvbnRyb2xsZXIgZnJvbSAnLi4vY29udHJvbGxlci9Db250cm9sbGVyLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgTWFuYWdlcixcbiAgTWlkZGxld2FyZSxcbiAgVW5zdWJzY3JpYmVBY3Rpb24sXG4gIFN1YnNjcmliZUFjdGlvbixcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG50eXBlIEFjdGlvbnMgPSBVbnN1YnNjcmliZUFjdGlvbiB8IFN1YnNjcmliZUFjdGlvbjtcblxuLyoqIEludGVyZmFjZSBoYW5kbGluZyBhIHNpbmdsZSByZXNvdXJjZSBzdWJzY3JpcHRpb24gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3Vic2NyaXB0aW9uIHtcbiAgYWRkKGZyZXF1ZW5jeT86IG51bWJlcik6IHZvaWQ7XG4gIHJlbW92ZShmcmVxdWVuY3k/OiBudW1iZXIpOiBib29sZWFuO1xuICBjbGVhbnVwKCk6IHZvaWQ7XG59XG5cbi8qKiBUaGUgc3RhdGljIGNsYXNzIHRoYXQgY29uc3RydWN0cyBTdWJzY3JpcHRpb24gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3Vic2NyaXB0aW9uQ29uc3RydWN0YWJsZSB7XG4gIG5ldyAoXG4gICAgYWN0aW9uOiBPbWl0PFN1YnNjcmliZUFjdGlvbiwgJ3R5cGUnPixcbiAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxuICApOiBTdWJzY3JpcHRpb247XG59XG5cbi8qKiBIYW5kbGVzIHN1YnNjcmlwdGlvbiBhY3Rpb25zIC0+IGZldGNoIG9yIHNldCBhY3Rpb25zXG4gKlxuICogQ29uc3RydWN0b3IgdGFrZXMgYSBTdWJzY3JpcHRpb25Db25zdHJ1Y3RhYmxlIGNsYXNzIHRvIGNvbnRyb2wgaG93XG4gKiBzdWJzY3JpcHRpb25zIGFyZSBoYW5kbGVkLiAoZS5nLiwgcG9sbGluZywgd2Vic29ja2V0cylcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9TdWJzY3JpcHRpb25NYW5hZ2VyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN1YnNjcmlwdGlvbk1hbmFnZXI8XG4gIFMgZXh0ZW5kcyBTdWJzY3JpcHRpb25Db25zdHJ1Y3RhYmxlID0gU3Vic2NyaXB0aW9uQ29uc3RydWN0YWJsZSxcbj4gaW1wbGVtZW50cyBNYW5hZ2VyPEFjdGlvbnM+IHtcbiAgcHJvdGVjdGVkIHN1YnNjcmlwdGlvbnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBJbnN0YW5jZVR5cGU8Uz47XG4gIH0gPSB7fTtcblxuICBkZWNsYXJlIHByb3RlY3RlZCByZWFkb25seSBTdWJzY3JpcHRpb246IFM7XG4gIHByb3RlY3RlZCBjb250cm9sbGVyOiBDb250cm9sbGVyID0gbmV3IENvbnRyb2xsZXIoKTtcblxuICBjb25zdHJ1Y3RvcihTdWJzY3JpcHRpb246IFMpIHtcbiAgICB0aGlzLlN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbjtcbiAgfVxuXG4gIG1pZGRsZXdhcmU6IE1pZGRsZXdhcmUgPSBjb250cm9sbGVyID0+IHtcbiAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgIHJldHVybiBuZXh0ID0+IGFjdGlvbiA9PiB7XG4gICAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgU1VCU0NSSUJFOlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVN1YnNjcmliZShhY3Rpb24pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgY2FzZSBVTlNVQlNDUklCRTpcbiAgICAgICAgICB0aGlzLmhhbmRsZVVuc3Vic2NyaWJlKGFjdGlvbik7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBuZXh0KGFjdGlvbik7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICAvKiogRW5zdXJlcyBhbGwgc3Vic2NyaXB0aW9ucyBhcmUgY2xlYW5lZCB1cC4gKi9cbiAgY2xlYW51cCgpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uc1trZXldLmNsZWFudXAoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gbWlkZGxld2FyZSBpbnRlcmNlcHRzICdyZGMvc3Vic2NyaWJlJyBhY3Rpb24uXG4gICAqXG4gICAqL1xuICBwcm90ZWN0ZWQgaGFuZGxlU3Vic2NyaWJlKGFjdGlvbjogU3Vic2NyaWJlQWN0aW9uKSB7XG4gICAgY29uc3Qga2V5ID0gYWN0aW9uLmtleTtcblxuICAgIGlmIChrZXkgaW4gdGhpcy5zdWJzY3JpcHRpb25zKSB7XG4gICAgICBjb25zdCBmcmVxdWVuY3kgPSBhY3Rpb24uZW5kcG9pbnQucG9sbEZyZXF1ZW5jeTtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uc1trZXldLmFkZChmcmVxdWVuY3kpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnNba2V5XSA9IG5ldyB0aGlzLlN1YnNjcmlwdGlvbihcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICApIGFzIEluc3RhbmNlVHlwZTxTPjtcbiAgICB9XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gbWlkZGxld2FyZSBpbnRlcmNlcHRzICdyZGMvdW5zdWJzY3JpYmUnIGFjdGlvbi5cbiAgICpcbiAgICovXG4gIHByb3RlY3RlZCBoYW5kbGVVbnN1YnNjcmliZShhY3Rpb246IFVuc3Vic2NyaWJlQWN0aW9uKSB7XG4gICAgY29uc3Qga2V5ID0gYWN0aW9uLmtleTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGtleSBpbiB0aGlzLnN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIGNvbnN0IGZyZXF1ZW5jeSA9IGFjdGlvbi5lbmRwb2ludC5wb2xsRnJlcXVlbmN5O1xuICAgICAgY29uc3QgZW1wdHkgPSB0aGlzLnN1YnNjcmlwdGlvbnNba2V5XS5yZW1vdmUoZnJlcXVlbmN5KTtcbiAgICAgIGlmIChlbXB0eSkge1xuICAgICAgICBkZWxldGUgdGhpcy5zdWJzY3JpcHRpb25zW2tleV07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBNaXNtYXRjaGVkIHVuc3Vic2NyaWJlOiAke2tleX0gaXMgbm90IHN1YnNjcmliZWRgKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsU0FBUyxFQUFFQyxXQUFXLFFBQVEsbUJBQW1CO0FBQzFELE9BQU9DLFVBQVUsTUFBTSw2QkFBNkI7O0FBVXBEOztBQU9B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