websocket-as-promised
Version:
A WebSocket client library providing Promise-based API for connecting, disconnecting and messaging with server
59 lines (50 loc) • 1.58 kB
JavaScript
/**
* Class for manage pending requests.
* @private
*/
const PromiseController = require('promise-controller');
module.exports = class Requests {
constructor() {
this._items = new Map();
}
/**
* Creates new request and stores it in the list.
*
* @param {String|Number} requestId
* @param {Function} fn
* @param {Number} timeout
* @returns {Promise}
*/
create(requestId, fn, timeout) {
this._rejectExistingRequest(requestId);
return this._createNewRequest(requestId, fn, timeout);
}
resolve(requestId, data) {
if (requestId && this._items.has(requestId)) {
this._items.get(requestId).resolve(data);
}
}
rejectAll(error) {
this._items.forEach(request => request.isPending ? request.reject(error) : null);
}
_rejectExistingRequest(requestId) {
const existingRequest = this._items.get(requestId);
if (existingRequest && existingRequest.isPending) {
existingRequest.reject(new Error(`WebSocket request is replaced, id: ${requestId}`));
}
}
_createNewRequest(requestId, fn, timeout) {
const request = new PromiseController({
timeout,
timeoutReason: `WebSocket request was rejected by timeout (${timeout} ms). RequestId: ${requestId}`
});
this._items.set(requestId, request);
return request.call(fn).finally(() => this._deleteRequest(requestId, request));
}
_deleteRequest(requestId, request) {
// this check is important when request was replaced
if (this._items.get(requestId) === request) {
this._items.delete(requestId);
}
}
};