landstrasse
Version:
Strongly typed WAMP Client for browsers
154 lines • 6.57 kB
JavaScript
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