UNPKG

landstrasse

Version:

Strongly typed WAMP Client for browsers

154 lines 6.57 kB
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import AbstractProcessor from '../AbstractProcessor'; import Subscription from './generic/subscription'; import Subscriptions from './generic/subscriptions'; import PendingMap from '../../util/map'; import { LogLevel } from '../../util/logger'; import { EWampMessageID } from '../../types/messages/MessageTypes'; class Subscriber extends AbstractProcessor { constructor() { super(...arguments); Object.defineProperty(this, "_subscriptions", { enumerable: true, configurable: true, writable: true, value: new Map() }); Object.defineProperty(this, "_subscriptionRequests", { enumerable: true, configurable: true, writable: true, value: new PendingMap(EWampMessageID.SUBSCRIBE, EWampMessageID.SUBSCRIBED) }); Object.defineProperty(this, "_unsubscriptionRequests", { enumerable: true, configurable: true, writable: true, value: new PendingMap(EWampMessageID.UNSUBSCRIBE, EWampMessageID.UNSUBSCRIBED, ([, , details]) => { if (!details) { return [false, 'Invalid unsubscription (missing subscription details).']; } const id = details.subscription; const subscriptions = this._subscriptions.get(id); if (!subscriptions) { return [false, `Unexpected unsubscription (unknown subscription id ${id}).`]; } this._subscriptions.delete(id); subscriptions.unsubscribedDeferred.resolve(); return [true, '']; }) }); } static getFeatures() { return { subscriber: { features: { publisher_identification: true, publication_trustlevels: true, pattern_based_subscription: true, sharded_subscription: true, event_history: true, }, }, }; } subscribe(topic, handler, options) { return __awaiter(this, void 0, void 0, function* () { if (this._closed) { throw new Error('Subscriber closed.'); } const requestId = this.idGenerators.session.id(); const message = [EWampMessageID.SUBSCRIBE, requestId, options || {}, topic]; const request = this._subscriptionRequests.add(requestId); this.logger.log(LogLevel.DEBUG, `Subscribing to \`${topic}\` (request id: ${requestId}).`, options); try { yield this.sender(message); } catch (err) { this._subscriptionRequests.reject(requestId, err); throw err; } const [, , subscriptionId] = yield request; let subscriptions = this._subscriptions.get(subscriptionId); if (!subscriptions) { subscriptions = new Subscriptions(subscriptionId, topic, (subscriptions) => __awaiter(this, void 0, void 0, function* () { return yield this.unsubscribe(subscriptions); }), this.logger); this._subscriptions.set(subscriptionId, subscriptions); } return new Subscription(handler, requestId, subscriptions); }); } unsubscribe(subscriptions) { return __awaiter(this, void 0, void 0, function* () { if (this._closed) { throw new Error('Subscriber closed.'); } const requestId = this.idGenerators.session.id(); const message = [EWampMessageID.UNSUBSCRIBE, requestId, subscriptions.id]; const request = this._unsubscriptionRequests.add(requestId); try { try { yield this.sender(message); } catch (err) { this._unsubscriptionRequests.reject(requestId, err); throw err; } yield request; this._subscriptions.delete(subscriptions.id); subscriptions.unsubscribedDeferred.resolve(); } catch (e) { subscriptions.unsubscribedDeferred.reject(e); } }); } // // - Handlers. // onMessage(msg) { const handled = [this._subscriptionRequests, this._unsubscriptionRequests].some((pendingRequests) => { const [handled, success, error] = pendingRequests.handle(msg); if (handled && !success) { this.violator(error); } return handled; }); if (handled) { return true; } if (msg[0] === EWampMessageID.EVENT) { const [, subscriptionId, publicationId, details, args, kwArgs] = msg; const subscriptions = this._subscriptions.get(subscriptionId); if (!subscriptions) { this.violator('Unexpected event (unable to find the related subscriptions).'); return true; } const actualDetails = Object.assign({}, (details || {})); actualDetails.publicationId = publicationId; if (!details.topic) { actualDetails.topic = subscriptions.uri; } subscriptions.trigger(args || [], kwArgs || {}, details); return true; } return handled; } onClose() { this._subscriptionRequests.close(); this._unsubscriptionRequests.close(); this._subscriptions.forEach((subscriptions) => { subscriptions.unsubscribedDeferred.reject('Subscriber closing.'); }); this._subscriptions.clear(); } } export default Subscriber; //# sourceMappingURL=index.js.map