landstrasse
Version:
Strongly typed WAMP Client for browsers
96 lines • 3.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const deferred_1 = require("./deferred");
const MessageTypes_1 = require("../types/messages/MessageTypes");
class PendingMap {
constructor(initMsg, successMsg, emptyRequest) {
Object.defineProperty(this, "initMsg", {
enumerable: true,
configurable: true,
writable: true,
value: initMsg
});
Object.defineProperty(this, "successMsg", {
enumerable: true,
configurable: true,
writable: true,
value: successMsg
});
Object.defineProperty(this, "emptyRequest", {
enumerable: true,
configurable: true,
writable: true,
value: emptyRequest
});
Object.defineProperty(this, "_pendings", {
enumerable: true,
configurable: true,
writable: true,
value: new Map()
});
Object.defineProperty(this, "_closed", {
enumerable: true,
configurable: true,
writable: true,
value: false
});
}
add(id) {
const deferred = new deferred_1.default();
this._pendings.set(id, deferred);
return deferred.promise;
}
reject(pendingId, err) {
const deferred = this._pendings.get(pendingId);
if (!deferred) {
return;
}
this._pendings.delete(pendingId);
deferred.reject(err);
}
close() {
this._closed = true;
this._pendings.forEach((pending) => {
pending.reject('closing');
});
this._pendings.clear();
}
//
// - Handlers.
//
handle(msg) {
if (this._closed) {
return [false, true, ''];
}
if (msg[0] === this.successMsg) {
const requestId = msg[1];
if (requestId === 0 && !!this.emptyRequest) {
const [success, error] = this.emptyRequest(msg);
return [true, success, error];
}
const pendingRequest = this.getAndDelete(requestId);
if (!pendingRequest) {
return [true, false, `Unexpected ${MessageTypes_1.EWampMessageID[this.successMsg]}.`];
}
pendingRequest.resolve(msg);
return [true, true, ''];
}
if (msg[0] === MessageTypes_1.EWampMessageID.ERROR && msg[1] === this.initMsg) {
const requestId = msg[2];
const pendingRequest = this.getAndDelete(requestId);
if (!pendingRequest) {
return [true, false, `Unexpected ${MessageTypes_1.EWampMessageID[this.initMsg]} error.`];
}
pendingRequest.reject(new Error(msg[4]));
return [true, true, ''];
}
return [false, true, ''];
}
getAndDelete(id) {
const val = this._pendings.get(id);
this._pendings.delete(id);
return val || null;
}
}
exports.default = PendingMap;
//# sourceMappingURL=map.js.map