I’m trying to make a component in Angular (18) to subscribe to messages from a vanilla websocket and send messages too.
I have a service that does most of the logic, and I’d like to add an event handler for websocket’s onOpen event.
So far I have this, it works but does not handle the onOpen event from websocket :
component :
import { Subject } from 'rxjs';
...
private messageSubject: Subject<any> = new Subject<any>();
// Connect to the WebSocket server
this.webSocketService.connect(this.device.ipAddress, this.messageSubject);
// Listen for incoming messages
this.messageSubject.asObservable()
.pipe(
takeUntilDestroyed(this.$destroyRef)
)
.subscribe(
{
next: (msg) => console.log('component next', msg),
error: (error) => console.error('component error', error),
complete: () => console.log('component complete'),
// open: () => console.log('component open') I'd like to do this
}
);
service :
private socket: WebSocket = null;
/** Connect to the WebSocket server */
public connect(host: string, messageSubject: Subject<any>): void {
if (!this.socket || this.socket.readyState === WebSocket.CLOSED) {
this.socket = new WebSocket(`ws://${host}:${WebSocketService.PORT}`);
this.socket.onmessage = (event) => {
console.log("service message :", event);
messageSubject.next(event.data);
};
this.socket.onclose = () => {
console.log("service close websocket");
messageSubject.complete();
};
this.socket.onerror = (error) => {
console.error('oops', error);
messageSubject.error(error);
};
this.socket.onopen = () => {
console.log('service open')
// messageSubject.open(); how ?
}
}
}
I tried to create subclasses of rxjs’ Subscriber/Subject/Observer/Observable but I couldn’t figure out how or where to put the ‘open’ callback…
How can I achieve this ?
Thank you very much !
Benjamin Danlos is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.