rxjs-websockets
Version:
rxjs 7 websockets library
73 lines • 2.69 kB
JavaScript
import { Observable, Subject } from 'rxjs';
var defaultProtocols = [];
var defaultWebsocketFactory = function (url, protocols) { return new WebSocket(url, protocols); };
export var normalClosureMessage = 'Normal closure';
export default function makeWebSocketObservable(url, _a) {
var _b = _a === void 0 ? {
protocols: defaultProtocols,
makeWebSocket: defaultWebsocketFactory,
} : _a, _c = _b.protocols, protocols = _c === void 0 ? defaultProtocols : _c, _d = _b.makeWebSocket, makeWebSocket = _d === void 0 ? defaultWebsocketFactory : _d;
return new Observable(function (observer) {
var inputSubscription;
var messages = new Subject();
var socket = makeWebSocket(url, protocols);
var isSocketClosed = false;
var forcedClose = false;
var setClosedStatus = function () {
isSocketClosed = true;
};
var getWebSocketResponses = function (input) {
if (inputSubscription) {
setClosedStatus();
var error = new Error('Web socket message factory function called more than once');
observer.error(error);
throw error;
}
else {
inputSubscription = input.subscribe(function (data) {
socket.send(data);
});
return messages;
}
};
socket.onopen = function () {
if (forcedClose) {
isSocketClosed = true;
socket.close();
}
else {
observer.next(getWebSocketResponses);
}
};
socket.onmessage = function (message) {
messages.next(message.data);
};
socket.onerror = function (error) {
setClosedStatus();
observer.error(new Error(error.message));
};
socket.onclose = function (event) {
// prevent observer.complete() being called after observer.error(...)
if (isSocketClosed)
return;
setClosedStatus();
if (forcedClose) {
observer.complete();
messages.complete();
}
else {
observer.error(new Error(event.code === 1000 ? normalClosureMessage : event.reason));
}
};
return function () {
forcedClose = true;
if (inputSubscription)
inputSubscription.unsubscribe();
if (!isSocketClosed) {
setClosedStatus();
socket.close();
}
};
});
}
//# sourceMappingURL=index.js.map