113 lines
3.1 KiB
JavaScript
113 lines
3.1 KiB
JavaScript
class WebSocketClient {
|
|
constructor(url) {
|
|
this.url = url;
|
|
this.socket = null;
|
|
this.messageHandlers = [];
|
|
this.openHandlers = [];
|
|
this.errorHandlers = [];
|
|
this.closeHandlers = [];
|
|
this.connected = false; // Add connected property
|
|
}
|
|
|
|
connect() {
|
|
// Reset connected status before attempting a new connection
|
|
this.connected = false;
|
|
console.log(`Connecting to WebSocket at ${this.url}`);
|
|
this.socket = new WebSocket(this.url);
|
|
|
|
this.socket.addEventListener('open', (event) => {
|
|
this.handleOpen(event);
|
|
});
|
|
|
|
this.socket.addEventListener('message', (event) => {
|
|
this.handleMessage(event);
|
|
});
|
|
|
|
this.socket.addEventListener('error', (event) => {
|
|
this.handleError(event);
|
|
});
|
|
|
|
this.socket.addEventListener('close', (event) => {
|
|
this.handleClose(event);
|
|
});
|
|
}
|
|
|
|
// Updated to set connected status
|
|
handleOpen(event) {
|
|
console.log('WebSocket is open now.');
|
|
this.connected = true;
|
|
this.openHandlers.forEach(handler => handler());
|
|
}
|
|
|
|
addOpenHandler(handler) {
|
|
this.openHandlers.push(handler);
|
|
}
|
|
|
|
handleMessage(event) {
|
|
if (event.data instanceof Blob) {
|
|
this.handleBlobMessage(event);
|
|
} else {
|
|
console.log('Message from server:', event.data);
|
|
}
|
|
}
|
|
|
|
handleBlobMessage = (event) => {
|
|
const reader = new FileReader();
|
|
reader.onload = () => {
|
|
const arrayBuffer = reader.result;
|
|
const buffer = new Uint8Array(arrayBuffer);
|
|
this.messageHandlers.forEach(handler => handler(buffer));
|
|
};
|
|
reader.readAsArrayBuffer(event.data);
|
|
}
|
|
|
|
addMessageHandler(handler) {
|
|
this.messageHandlers.push(handler);
|
|
}
|
|
|
|
handleError(event) {
|
|
console.error('WebSocket error observed:', event);
|
|
this.connected = false; // Update connected status on error
|
|
this.errorHandlers.forEach(handler => handler(event));
|
|
}
|
|
|
|
addErrorHandler(handler) {
|
|
this.errorHandlers.push(handler);
|
|
}
|
|
|
|
// Updated to set connected status
|
|
handleClose(event) {
|
|
console.log('WebSocket is closed now.');
|
|
this.connected = false;
|
|
this.closeHandlers.forEach(handler => handler());
|
|
}
|
|
|
|
addCloseHandler(handler) {
|
|
this.closeHandlers.push(handler);
|
|
}
|
|
|
|
write(buffer) {
|
|
if (this.isConnected() && this.socket) {
|
|
const binaryData = new Blob([new Uint8Array(buffer)]);
|
|
this.socket.send(binaryData);
|
|
return true;
|
|
} else {
|
|
console.error('WebSocket is not open. Ready state:', this.socket?.readyState);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Add a method to check if connected
|
|
isConnected() {
|
|
return this.connected && this.socket && this.socket.readyState === WebSocket.OPEN;
|
|
}
|
|
|
|
close() {
|
|
if (this.socket) {
|
|
this.socket.close();
|
|
this.connected = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
export default WebSocketClient; |