integration-websocket-rest-api
Version:
A JavaScript library for easy integration of REST API and WebSocket communication with state management in JS applications.
88 lines (73 loc) • 1.89 kB
JavaScript
const {
store,
wsOpened,
wsMessageReceived,
wsError,
wsClosed,
} = require("./state-management");
const WebSocket = require("websocket").w3cwebsocket;
class WebSocketClient {
constructor(wsUrl) {
this.wsUrl = wsUrl;
this.socket = null;
this.isReconnecting = false;
this.reconnectInterval = null;
}
openConnection() {
this.connect();
}
connect() {
this.socket = new WebSocket(this.wsUrl);
this.socket.onopen = () => {
this.isReconnecting = false;
store.dispatch(wsOpened());
};
this.socket.onmessage = (event) => {
const message = event.data;
store.dispatch(wsMessageReceived(message));
};
this.socket.onerror = (error) => {
store.dispatch(wsError(error));
};
this.socket.onclose = () => {
store.dispatch(wsClosed());
if (!this.isReconnecting) {
this.reconnect();
}
};
}
reconnect() {
this.isReconnecting = true;
const maxRetries = 3;
let retries = 0;
const delay = 1000;
this.reconnectInterval = setInterval(() => {
if (retries < maxRetries) {
console.log(
`Attempting to reconnect. Remaining retries: ${maxRetries - retries}`
);
this.connect();
retries++;
} else {
clearInterval(this.reconnectInterval);
console.error("Max retries reached. Unable to reconnect.");
}
}, delay);
}
sendMessage(message) {
if (this.socket && this.socket.readyState === WebSocket.OPEN) {
this.socket.send(message);
} else {
console.error("WebSocket connection is not open.");
}
}
closeConnection() {
if (this.reconnectInterval) {
clearInterval(this.reconnectInterval);
}
if (this.socket && this.socket.readyState === WebSocket.OPEN) {
this.socket.close();
}
}
}
module.exports = WebSocketClient;